You're Invited:Meet the Socket Team at RSAC and BSidesSF 2026, March 23–26.RSVP
Socket
Book a DemoSign in
Socket

@getforma/core

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@getforma/core - npm Package Compare versions

Comparing version
0.3.1
to
0.6.1
+26
dist/chunk-DPSAVBCP.js
import { signal, computed, pauseTracking, resumeTracking } from 'alien-signals';
// src/reactive/signal.ts
function applySignalSet(s, v) {
if (typeof v !== "function") {
s(v);
return;
}
pauseTracking();
const prev = s();
resumeTracking();
s(v(prev));
}
function createSignal(initialValue) {
const s = signal(initialValue);
const getter = s;
const setter = (v) => applySignalSet(s, v);
return [getter, setter];
}
function createComputed(fn) {
return computed(fn);
}
export { createComputed, createSignal };
//# sourceMappingURL=chunk-DPSAVBCP.js.map
//# sourceMappingURL=chunk-DPSAVBCP.js.map
{"version":3,"sources":["../src/reactive/signal.ts","../src/reactive/computed.ts"],"names":["createRawSignal","rawComputed"],"mappings":";;;AAmDA,SAAS,cAAA,CACP,GACA,CAAA,EACM;AACN,EAAA,IAAI,OAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,CAAA,CAAE,CAAC,CAAA;AACH,IAAA;AAAA,EACF;AAEA,EAAA,aAAA,EAAc;AACd,EAAA,MAAM,OAAO,CAAA,EAAE;AACf,EAAA,cAAA,EAAe;AACf,EAAA,CAAA,CAAG,CAAA,CAAqB,IAAI,CAAC,CAAA;AAC/B;AAYO,SAAS,aAAgB,YAAA,EAA+D;AAC7F,EAAA,MAAM,CAAA,GAAIA,OAAmB,YAAY,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,KAA4B,cAAA,CAAe,GAAG,CAAC,CAAA;AAEhF,EAAA,OAAO,CAAC,QAAQ,MAAM,CAAA;AACxB;ACtDO,SAAS,eAAkB,EAAA,EAAsB;AACtD,EAAA,OAAOC,SAAY,EAAE,CAAA;AACvB","file":"chunk-DPSAVBCP.js","sourcesContent":["/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, pauseTracking, resumeTracking } from 'alien-signals';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type SignalGetter<T> = () => T;\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /** Custom equality check. Default: Object.is (via alien-signals). */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n): void {\n if (typeof v !== 'function') {\n s(v);\n return;\n }\n\n pauseTracking();\n const prev = s();\n resumeTracking();\n s((v as (prev: T) => T)(prev));\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n */\nexport function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v);\n\n return [getter, setter];\n}\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\n\n/**\n * Create a lazy, cached computed value.\n *\n * Note: Unlike SolidJS's createComputed (which is an eager synchronous\n * side effect), this is a lazy cached derivation — equivalent to\n * SolidJS's createMemo. Both createComputed and createMemo in FormaJS\n * are identical.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n */\nexport function createComputed<T>(fn: () => T): () => T {\n return rawComputed(fn);\n}\n"]}
'use strict';
var alienSignals = require('alien-signals');
// src/reactive/signal.ts
function applySignalSet(s, v) {
if (typeof v !== "function") {
s(v);
return;
}
alienSignals.pauseTracking();
const prev = s();
alienSignals.resumeTracking();
s(v(prev));
}
function createSignal(initialValue) {
const s = alienSignals.signal(initialValue);
const getter = s;
const setter = (v) => applySignalSet(s, v);
return [getter, setter];
}
function createComputed(fn) {
return alienSignals.computed(fn);
}
exports.createComputed = createComputed;
exports.createSignal = createSignal;
//# sourceMappingURL=chunk-KH3F5NRU.cjs.map
//# sourceMappingURL=chunk-KH3F5NRU.cjs.map
{"version":3,"sources":["../src/reactive/signal.ts","../src/reactive/computed.ts"],"names":["pauseTracking","resumeTracking","createRawSignal","rawComputed"],"mappings":";;;;;AAmDA,SAAS,cAAA,CACP,GACA,CAAA,EACM;AACN,EAAA,IAAI,OAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,CAAA,CAAE,CAAC,CAAA;AACH,IAAA;AAAA,EACF;AAEA,EAAAA,0BAAA,EAAc;AACd,EAAA,MAAM,OAAO,CAAA,EAAE;AACf,EAAAC,2BAAA,EAAe;AACf,EAAA,CAAA,CAAG,CAAA,CAAqB,IAAI,CAAC,CAAA;AAC/B;AAYO,SAAS,aAAgB,YAAA,EAA+D;AAC7F,EAAA,MAAM,CAAA,GAAIC,oBAAmB,YAAY,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,KAA4B,cAAA,CAAe,GAAG,CAAC,CAAA;AAEhF,EAAA,OAAO,CAAC,QAAQ,MAAM,CAAA;AACxB;ACtDO,SAAS,eAAkB,EAAA,EAAsB;AACtD,EAAA,OAAOC,sBAAY,EAAE,CAAA;AACvB","file":"chunk-KH3F5NRU.cjs","sourcesContent":["/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, pauseTracking, resumeTracking } from 'alien-signals';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type SignalGetter<T> = () => T;\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /** Custom equality check. Default: Object.is (via alien-signals). */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n): void {\n if (typeof v !== 'function') {\n s(v);\n return;\n }\n\n pauseTracking();\n const prev = s();\n resumeTracking();\n s((v as (prev: T) => T)(prev));\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n */\nexport function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v);\n\n return [getter, setter];\n}\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\n\n/**\n * Create a lazy, cached computed value.\n *\n * Note: Unlike SolidJS's createComputed (which is an eager synchronous\n * side effect), this is a lazy cached derivation — equivalent to\n * SolidJS's createMemo. Both createComputed and createMemo in FormaJS\n * are identical.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n */\nexport function createComputed<T>(fn: () => T): () => T {\n return rawComputed(fn);\n}\n"]}
import { createComputed, createSignal } from './chunk-DPSAVBCP.js';
import { effect, startBatch, endBatch, pauseTracking, resumeTracking } from 'alien-signals';
// src/reactive/root.ts
var currentRoot = null;
var rootStack = [];
function createRoot(fn) {
const scope = { disposers: [] };
rootStack.push(currentRoot);
currentRoot = scope;
const dispose = () => {
for (const d of scope.disposers) {
try {
d();
} catch {
}
}
scope.disposers.length = 0;
};
try {
return fn(dispose);
} finally {
currentRoot = rootStack.pop() ?? null;
if (rootStack.length === 0) {
rootStack.length = 0;
}
}
}
function registerDisposer(dispose) {
if (currentRoot) {
currentRoot.disposers.push(dispose);
}
}
function hasActiveRoot() {
return currentRoot !== null;
}
// src/reactive/cleanup.ts
var currentCleanupCollector = null;
function onCleanup(fn) {
currentCleanupCollector?.(fn);
}
function setCleanupCollector(collector) {
const prev = currentCleanupCollector;
currentCleanupCollector = collector;
return prev;
}
// src/reactive/dev.ts
var __DEV__ = typeof process !== "undefined" ? process.env?.NODE_ENV !== "production" : true;
var _errorHandler = null;
function onError(handler) {
_errorHandler = handler;
}
function reportError(error, source) {
if (_errorHandler) {
try {
_errorHandler(error, source ? { source } : {});
} catch {
}
}
if (__DEV__) {
console.error(`[forma] ${source ?? "Unknown"} error:`, error);
}
}
var POOL_SIZE = 32;
var MAX_REENTRANT_RUNS = 100;
var pool = [];
for (let i = 0; i < POOL_SIZE; i++) pool.push([]);
var poolIdx = POOL_SIZE;
function acquireArray() {
if (poolIdx > 0) {
const arr = pool[--poolIdx];
arr.length = 0;
return arr;
}
return [];
}
function releaseArray(arr) {
arr.length = 0;
if (poolIdx < POOL_SIZE) {
pool[poolIdx++] = arr;
}
}
function runCleanup(fn) {
if (fn === void 0) return;
try {
fn();
} catch (e) {
reportError(e, "effect cleanup");
}
}
function runCleanups(bag) {
if (bag === void 0) return;
for (let i = 0; i < bag.length; i++) {
try {
bag[i]();
} catch (e) {
reportError(e, "effect cleanup");
}
}
}
function internalEffect(fn) {
const dispose = effect(fn);
if (hasActiveRoot()) {
registerDisposer(dispose);
}
return dispose;
}
function createEffect(fn) {
const shouldRegister = hasActiveRoot();
let cleanup2;
let cleanupBag;
let nextCleanup;
let nextCleanupBag;
const addCleanup = (cb) => {
if (nextCleanupBag !== void 0) {
nextCleanupBag.push(cb);
return;
}
if (nextCleanup !== void 0) {
const bag = acquireArray();
bag.push(nextCleanup, cb);
nextCleanup = void 0;
nextCleanupBag = bag;
return;
}
nextCleanup = cb;
};
let skipCleanupInfra = false;
let firstRun = true;
let running = false;
let rerunRequested = false;
const runOnce = () => {
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
if (skipCleanupInfra) {
try {
fn();
} catch (e) {
reportError(e, "effect");
}
return;
}
nextCleanup = void 0;
nextCleanupBag = void 0;
const prevCollector = setCleanupCollector(addCleanup);
try {
const result = fn();
if (typeof result === "function") {
addCleanup(result);
}
if (nextCleanup === void 0 && nextCleanupBag === void 0) {
if (firstRun) skipCleanupInfra = true;
return;
}
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} catch (e) {
reportError(e, "effect");
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} finally {
setCleanupCollector(prevCollector);
firstRun = false;
}
};
const safeFn = () => {
if (running) {
rerunRequested = true;
return;
}
running = true;
try {
let reentrantRuns = 0;
do {
rerunRequested = false;
runOnce();
if (rerunRequested) {
reentrantRuns++;
if (reentrantRuns >= MAX_REENTRANT_RUNS) {
reportError(
new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} re-entrant runs`),
"effect"
);
rerunRequested = false;
}
}
} while (rerunRequested);
} finally {
running = false;
}
};
const dispose = effect(safeFn);
let disposed = false;
const wrappedDispose = () => {
if (disposed) return;
disposed = true;
dispose();
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
};
if (shouldRegister) {
registerDisposer(wrappedDispose);
}
return wrappedDispose;
}
// src/reactive/memo.ts
var createMemo = createComputed;
function batch(fn) {
startBatch();
try {
fn();
} finally {
endBatch();
}
}
function untrack(fn) {
pauseTracking();
try {
return fn();
} finally {
resumeTracking();
}
}
// src/reactive/on.ts
function on(deps, fn, options) {
let prev;
let isFirst = true;
return () => {
const value2 = deps();
if (options?.defer && isFirst) {
isFirst = false;
prev = value2;
return void 0;
}
const result = untrack(() => fn(value2, prev));
prev = value2;
return result;
};
}
// src/reactive/ref.ts
function createRef(initialValue) {
return { current: initialValue };
}
// src/reactive/reducer.ts
function createReducer(reducer, initialState) {
const [state, setState] = createSignal(initialState);
const dispatch = (action) => {
setState((prev) => reducer(prev, action));
};
return [state, dispatch];
}
// src/reactive/suspense-context.ts
var currentSuspenseContext = null;
var suspenseStack = [];
function pushSuspenseContext(ctx) {
suspenseStack.push(currentSuspenseContext);
currentSuspenseContext = ctx;
}
function popSuspenseContext() {
currentSuspenseContext = suspenseStack.pop() ?? null;
}
function getSuspenseContext() {
return currentSuspenseContext;
}
// src/reactive/resource.ts
function createResource(source, fetcher, options) {
const [data, setData] = createSignal(options?.initialValue);
const [loading, setLoading] = createSignal(false);
const [error, setError] = createSignal(void 0);
const suspenseCtx = getSuspenseContext();
let abortController = null;
let fetchVersion = 0;
const doFetch = () => {
const sourceValue = untrack(source);
if (abortController) {
abortController.abort();
}
const controller = new AbortController();
abortController = controller;
const version = ++fetchVersion;
const isLatest = () => version === fetchVersion;
let suspensePending = false;
if (suspenseCtx) {
suspenseCtx.increment();
suspensePending = true;
}
setLoading(true);
setError(void 0);
Promise.resolve(fetcher(sourceValue)).then((result) => {
if (isLatest() && !controller.signal.aborted) {
setData(() => result);
}
}).catch((err) => {
if (isLatest() && !controller.signal.aborted) {
if (err?.name !== "AbortError") {
setError(err);
}
}
}).finally(() => {
if (suspensePending) suspenseCtx?.decrement();
if (isLatest()) {
setLoading(false);
if (abortController === controller) {
abortController = null;
}
}
});
};
internalEffect(() => {
source();
doFetch();
});
const resource = (() => data());
resource.loading = loading;
resource.error = error;
resource.refetch = doFetch;
resource.mutate = (value2) => setData(() => value2);
return resource;
}
// src/dom/element.ts
var Fragment = /* @__PURE__ */ Symbol.for("forma.fragment");
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK_NS = "http://www.w3.org/1999/xlink";
var SVG_TAGS = /* @__PURE__ */ new Set([
"svg",
"path",
"circle",
"rect",
"line",
"polyline",
"polygon",
"ellipse",
"g",
"text",
"tspan",
"textPath",
"defs",
"use",
"symbol",
"clipPath",
"mask",
"pattern",
"marker",
"linearGradient",
"radialGradient",
"stop",
"filter",
"feGaussianBlur",
"feColorMatrix",
"feOffset",
"feBlend",
"feMerge",
"feMergeNode",
"feComposite",
"feFlood",
"feMorphology",
"feTurbulence",
"feDisplacementMap",
"feImage",
"foreignObject",
"animate",
"animateTransform",
"animateMotion",
"set",
"image",
"switch",
"desc",
"title",
"metadata"
]);
var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
"disabled",
"checked",
"readonly",
"required",
"autofocus",
"autoplay",
"controls",
"default",
"defer",
"formnovalidate",
"hidden",
"ismap",
"loop",
"multiple",
"muted",
"nomodule",
"novalidate",
"open",
"playsinline",
"reversed",
"selected",
"async"
]);
var ELEMENT_PROTOS = null;
function getProto(tag) {
if (!ELEMENT_PROTOS) {
ELEMENT_PROTOS = /* @__PURE__ */ Object.create(null);
for (const t of [
"div",
"span",
"p",
"a",
"li",
"ul",
"ol",
"button",
"input",
"label",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"section",
"header",
"footer",
"main",
"nav",
"table",
"tr",
"td",
"th",
"tbody",
"img",
"form",
"select",
"option",
"textarea",
"i",
"b",
"strong",
"em",
"small",
"article",
"aside",
"details",
"summary"
]) {
ELEMENT_PROTOS[t] = document.createElement(t);
}
}
return ELEMENT_PROTOS[tag] ?? (ELEMENT_PROTOS[tag] = document.createElement(tag));
}
var EVENT_NAMES = /* @__PURE__ */ Object.create(null);
function eventName(key) {
return EVENT_NAMES[key] ?? (EVENT_NAMES[key] = key.slice(2).toLowerCase());
}
var ABORT_SYM = /* @__PURE__ */ Symbol.for("forma-abort");
function getAbortController(el) {
let controller = el[ABORT_SYM];
if (!controller) {
controller = new AbortController();
el[ABORT_SYM] = controller;
}
return controller;
}
function cleanup(el) {
const controller = el[ABORT_SYM];
if (controller) {
controller.abort();
delete el[ABORT_SYM];
}
}
var CACHE_SYM = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function getCache(el) {
return el[CACHE_SYM] ?? (el[CACHE_SYM] = /* @__PURE__ */ Object.create(null));
}
function handleClass(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache["class"] === v) return;
cache["class"] = v;
if (el instanceof HTMLElement) {
el.className = v;
} else {
el.setAttribute("class", v);
}
});
} else {
const cache = getCache(el);
if (cache["class"] === value2) return;
cache["class"] = value2;
if (el instanceof HTMLElement) {
el.className = value2;
} else {
el.setAttribute("class", value2);
}
}
}
function handleStyle(el, _key, value2) {
if (typeof value2 === "function") {
let prevKeys = [];
internalEffect(() => {
const v = value2();
if (typeof v === "string") {
const cache = getCache(el);
if (cache["style"] === v) return;
cache["style"] = v;
prevKeys = [];
el.style.cssText = v;
} else if (v && typeof v === "object") {
const style = el.style;
const nextKeys = Object.keys(v);
for (const k of prevKeys) {
if (!(k in v)) {
style.removeProperty(k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()));
}
}
Object.assign(style, v);
prevKeys = nextKeys;
}
});
} else if (typeof value2 === "string") {
const cache = getCache(el);
if (cache["style"] === value2) return;
cache["style"] = value2;
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
}
function handleEvent(el, key, value2) {
const controller = getAbortController(el);
el.addEventListener(
eventName(key),
value2,
{ signal: controller.signal }
);
}
function handleInnerHTML(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const resolved = value2();
if (resolved == null) {
el.innerHTML = "";
return;
}
if (typeof resolved !== "object" || !("__html" in resolved)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof resolved
);
}
const html = resolved.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
const cache = getCache(el);
if (cache["innerHTML"] === html) return;
cache["innerHTML"] = html;
el.innerHTML = html;
});
} else {
if (value2 == null) {
el.innerHTML = "";
return;
}
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
}
}
function handleXLink(el, key, value2) {
const localName = key.slice(6);
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(v));
}
});
} else {
if (value2 == null || value2 === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(value2));
}
}
}
function handleBooleanAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache[key] === v) return;
cache[key] = v;
if (v) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
});
} else {
const cache = getCache(el);
if (cache[key] === value2) return;
cache[key] = value2;
if (value2) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
}
}
function handleGenericAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(v);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
});
} else {
if (value2 == null || value2 === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(value2);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
}
}
var PROP_HANDLERS = /* @__PURE__ */ new Map();
PROP_HANDLERS.set("class", handleClass);
PROP_HANDLERS.set("className", handleClass);
PROP_HANDLERS.set("style", handleStyle);
PROP_HANDLERS.set("ref", () => {
});
PROP_HANDLERS.set("dangerouslySetInnerHTML", handleInnerHTML);
for (const attr of BOOLEAN_ATTRS) {
PROP_HANDLERS.set(attr, handleBooleanAttr);
}
function applyProp(el, key, value2) {
if (key === "class") {
handleClass(el, key, value2);
return;
}
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
return;
}
const handler = PROP_HANDLERS.get(key);
if (handler) {
handler(el, key, value2);
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
handleXLink(el, key, value2);
return;
}
handleGenericAttr(el, key, value2);
}
function applyStaticProp(el, key, value2) {
if (value2 == null || value2 === false) return;
if (key === "class" || key === "className") {
el.className = value2;
return;
}
if (key === "style") {
if (typeof value2 === "string") {
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
return;
}
if (key === "dangerouslySetInnerHTML") {
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
el.setAttributeNS(XLINK_NS, key, String(value2));
return;
}
if (BOOLEAN_ATTRS.has(key)) {
if (value2) el.setAttribute(key, "");
return;
}
if (value2 === true) {
el.setAttribute(key, "");
} else {
el.setAttribute(key, String(value2));
}
}
function appendChild(parent, child) {
if (child instanceof Node) {
parent.appendChild(child);
return;
}
if (typeof child === "string") {
parent.appendChild(new Text(child));
return;
}
if (child == null || child === false || child === true) {
return;
}
if (typeof child === "number") {
parent.appendChild(new Text(String(child)));
return;
}
if (typeof child === "function") {
if (parent instanceof Element) {
parent[DYNAMIC_CHILD_SYM] = true;
}
let currentNode = null;
internalEffect(() => {
const v = child();
if (v instanceof Node) {
if (currentNode) {
parent.replaceChild(v, currentNode);
} else {
parent.appendChild(v);
}
currentNode = v;
} else {
const text = typeof v === "symbol" ? String(v) : String(v ?? "");
if (!currentNode) {
currentNode = new Text(text);
parent.appendChild(currentNode);
} else if (currentNode.nodeType === 3) {
currentNode.data = text;
} else {
const tn = new Text(text);
parent.replaceChild(tn, currentNode);
currentNode = tn;
}
}
});
return;
}
if (Array.isArray(child)) {
for (const item of child) {
appendChild(parent, item);
}
return;
}
}
function h(tag, props, ...children) {
if (typeof tag === "function" && tag !== Fragment) {
const mergedProps = { ...props ?? {}, children };
return tag(mergedProps);
}
if (tag === Fragment) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
const tagName = tag;
if (hydrating) {
return { type: "element", tag: tagName, props: props ?? null, children };
}
let el;
if (ELEMENT_PROTOS && ELEMENT_PROTOS[tagName]) {
el = ELEMENT_PROTOS[tagName].cloneNode(false);
} else if (SVG_TAGS.has(tagName)) {
el = document.createElementNS(SVG_NS, tagName);
} else {
el = getProto(tagName).cloneNode(false);
}
if (props) {
let hasDynamic = false;
for (const key in props) {
if (key === "ref") continue;
const value2 = props[key];
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
continue;
}
if (typeof value2 === "function") {
if (!hasDynamic) {
el[CACHE_SYM] = /* @__PURE__ */ Object.create(null);
hasDynamic = true;
}
applyProp(el, key, value2);
continue;
}
applyStaticProp(el, key, value2);
}
}
const childLen = children.length;
if (childLen === 1) {
const only = children[0];
if (typeof only === "string") {
el.textContent = only;
} else if (typeof only === "number") {
el.textContent = String(only);
} else {
appendChild(el, only);
}
} else if (childLen > 1) {
for (const child of children) {
appendChild(el, child);
}
}
if (props && typeof props["ref"] === "function") {
props["ref"](el);
}
return el;
}
function fragment(...children) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
// src/dom/show.ts
function createShow(when, thenFn, elseFn) {
if (hydrating) {
const branch = when() ? thenFn() : elseFn?.() ?? null;
return {
type: "show",
condition: when,
whenTrue: thenFn,
whenFalse: elseFn,
initialBranch: branch
};
}
const startMarker = document.createComment("forma-show");
const endMarker = document.createComment("/forma-show");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let currentNode = null;
let lastTruthy = null;
let currentDispose = null;
const showDispose = internalEffect(() => {
const truthy = !!when();
const DEBUG = typeof globalThis.__FORMA_DEBUG__ !== "undefined";
const DEBUG_LABEL = DEBUG ? thenFn.toString().slice(0, 60) : "";
if (truthy === lastTruthy) {
if (DEBUG) console.log("[forma:show] skip (same)", truthy, DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show]", lastTruthy, "\u2192", truthy, DEBUG_LABEL);
lastTruthy = truthy;
const parent = startMarker.parentNode;
if (!parent) {
if (DEBUG) console.warn("[forma:show] parentNode is null! skipping.", DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show] parent:", parent.nodeName, "inDoc:", document.contains(parent));
if (currentDispose) {
currentDispose();
currentDispose = null;
}
if (currentNode) {
if (currentNode.parentNode === parent) {
parent.removeChild(currentNode);
} else {
while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {
parent.removeChild(startMarker.nextSibling);
}
}
}
const branchFn = truthy ? thenFn : elseFn;
if (branchFn) {
let branchDispose;
currentNode = createRoot((dispose) => {
branchDispose = dispose;
return untrack(() => branchFn());
});
currentDispose = branchDispose;
} else {
currentNode = null;
}
if (currentNode) {
parent.insertBefore(currentNode, endMarker);
}
});
fragment2.__showDispose = () => {
showDispose();
if (currentDispose) {
currentDispose();
currentDispose = null;
}
};
return fragment2;
}
// src/dom/hydrate.ts
var ABORT_SYM2 = /* @__PURE__ */ Symbol.for("forma-abort");
var hydrating = false;
function setHydrating(value2) {
hydrating = value2;
}
function isDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "element";
}
function isShowDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "show";
}
function isListDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "list";
}
function applyDynamicProps(el, props) {
if (!props) return;
for (const key in props) {
const value2 = props[key];
if (typeof value2 !== "function") continue;
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
let ac = el[ABORT_SYM2];
if (!ac) {
ac = new AbortController();
el[ABORT_SYM2] = ac;
}
el.addEventListener(key.slice(2).toLowerCase(), value2, { signal: ac.signal });
continue;
}
const fn = value2;
const attrKey = key;
internalEffect(() => {
const v = fn();
if (v === false || v == null) {
el.removeAttribute(attrKey);
} else if (v === true) {
el.setAttribute(attrKey, "");
} else {
el.setAttribute(attrKey, String(v));
}
});
}
}
function ensureNode(value2) {
if (value2 instanceof Node) return value2;
if (value2 == null || value2 === false || value2 === true) return null;
if (typeof value2 === "string") return new Text(value2);
if (typeof value2 === "number") return new Text(String(value2));
if (isDescriptor(value2)) return descriptorToElement(value2);
if (isShowDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createShow(
value2.condition,
() => ensureNode(value2.whenTrue()) ?? document.createComment("empty"),
value2.whenFalse ? () => ensureNode(value2.whenFalse()) ?? document.createComment("empty") : void 0
);
} finally {
hydrating = prevH;
}
}
if (isListDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createList(value2.items, value2.keyFn, value2.renderFn, value2.options);
} finally {
hydrating = prevH;
}
}
return null;
}
function descriptorToElement(desc) {
const prevHydrating = hydrating;
hydrating = false;
try {
const children = desc.children.map((child) => {
if (isDescriptor(child)) return descriptorToElement(child);
if (isShowDescriptor(child)) return ensureNode(child);
if (isListDescriptor(child)) return ensureNode(child);
return child;
});
return h(desc.tag, desc.props, ...children);
} finally {
hydrating = prevHydrating;
}
}
function isIslandStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 105;
}
function isShowStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 115;
}
function isTextStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 116;
}
function isListStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 108;
}
function findClosingMarker(start) {
const closing = "/" + start.data;
let node = start.nextSibling;
while (node) {
if (node.nodeType === 8 && node.data === closing) {
return node;
}
node = node.nextSibling;
}
return null;
}
function findTextBetween(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 3) return node;
node = node.nextSibling;
}
return null;
}
function nextElementBetweenMarkers(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) return node;
node = node.nextSibling;
}
return void 0;
}
function extractContentBetweenMarkers(start, end) {
const frag = document.createDocumentFragment();
let node = start.nextSibling;
while (node && node !== end) {
const next = node.nextSibling;
frag.appendChild(node);
node = next;
}
return frag;
}
function setupShowEffect(desc, marker) {
let currentCondition = !!desc.condition();
let thenFragment = null;
let elseFragment = null;
const hasSSRContent = marker.start.nextSibling !== marker.end;
if (!hasSSRContent && currentCondition) {
if (__DEV__) console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");
const trueBranch = desc.whenTrue();
if (trueBranch instanceof Node) {
marker.start.parentNode.insertBefore(trueBranch, marker.end);
}
}
internalEffect(() => {
const next = !!desc.condition();
if (next === currentCondition) return;
currentCondition = next;
const parent = marker.start.parentNode;
if (!parent) return;
const current = extractContentBetweenMarkers(marker.start, marker.end);
if (!next) {
thenFragment = current;
} else {
elseFragment = current;
}
let branch = next ? thenFragment ?? desc.whenTrue() : desc.whenFalse ? elseFragment ?? desc.whenFalse() : null;
if (next && thenFragment) thenFragment = null;
if (!next && elseFragment) elseFragment = null;
if (branch != null && !(branch instanceof Node)) {
branch = ensureNode(branch);
}
if (branch instanceof Node) {
parent.insertBefore(branch, marker.end);
}
});
}
function adoptBranchContent(desc, regionStart, regionEnd) {
if (isDescriptor(desc)) {
const el = nextElementBetweenMarkers(regionStart, regionEnd);
if (el) adoptNode(desc, el);
} else if (isShowDescriptor(desc)) {
let node = regionStart.nextSibling;
while (node && node !== regionEnd) {
if (node.nodeType === 8 && isShowStart(node.data)) {
const innerStart = node;
const innerEnd = findClosingMarker(innerStart);
if (innerEnd) {
if (desc.initialBranch) {
adoptBranchContent(desc.initialBranch, innerStart, innerEnd);
}
setupShowEffect(desc, { start: innerStart, end: innerEnd});
}
break;
}
node = node.nextSibling;
}
}
}
function adoptNode(desc, ssrEl) {
if (!ssrEl || ssrEl.tagName !== desc.tag.toUpperCase()) {
if (__DEV__) console.warn(`Hydration mismatch: expected <${desc.tag}>, got <${ssrEl?.tagName?.toLowerCase() ?? "nothing"}>`);
const fresh = descriptorToElement(desc);
if (ssrEl) ssrEl.replaceWith(fresh);
return;
}
applyDynamicProps(ssrEl, desc.props);
let cursor = ssrEl.firstChild;
for (const child of desc.children) {
if (child === false || child == null) continue;
if (isDescriptor(child)) {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
while (cursor && cursor.nodeType === 1 && cursor.hasAttribute("data-forma-island")) {
cursor = cursor.nextSibling;
}
if (!cursor) {
ssrEl.appendChild(descriptorToElement(child));
continue;
}
if (cursor.nodeType === 1) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(child, el);
} else if (cursor.nodeType === 8 && isIslandStart(cursor.data)) {
const end = findClosingMarker(cursor);
const fresh = descriptorToElement(child);
if (end) {
end.parentNode.insertBefore(fresh, end);
cursor = end.nextSibling;
} else {
ssrEl.appendChild(fresh);
cursor = null;
}
} else {
ssrEl.appendChild(descriptorToElement(child));
}
} else if (isShowDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isShowStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
if (child.initialBranch) {
adoptBranchContent(child.initialBranch, start, end);
}
setupShowEffect(child, { start, end});
cursor = end.nextSibling;
}
}
} else if (isListDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isListStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
const ssrKeyMap = /* @__PURE__ */ new Map();
const ssrElements = [];
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) {
const el = node;
ssrElements.push(el);
const key = el.getAttribute("data-forma-key");
if (key != null) {
ssrKeyMap.set(key, el);
}
}
node = node.nextSibling;
}
const currentItems = untrack(() => child.items());
const listKeyFn = child.keyFn;
const listRenderFn = child.renderFn;
const useIndexFallback = ssrKeyMap.size === 0 && ssrElements.length > 0;
const adoptedNodes = [];
const adoptedItems = [];
const usedIndices = /* @__PURE__ */ new Set();
for (let i = 0; i < currentItems.length; i++) {
const item = currentItems[i];
const key = listKeyFn(item);
let ssrNode;
if (useIndexFallback) {
if (i < ssrElements.length) {
ssrNode = ssrElements[i];
usedIndices.add(i);
}
} else {
ssrNode = ssrKeyMap.get(String(key));
if (ssrNode) ssrKeyMap.delete(String(key));
}
if (ssrNode) {
adoptedNodes.push(ssrNode);
adoptedItems.push(item);
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: list item key "${key}" not found in SSR \u2014 rendering fresh`);
const prevHydrating = hydrating;
hydrating = false;
try {
const [getIndex] = createSignal(i);
const fresh = listRenderFn(item, getIndex);
end.parentNode.insertBefore(fresh, end);
adoptedNodes.push(fresh);
adoptedItems.push(item);
} finally {
hydrating = prevHydrating;
}
}
}
if (useIndexFallback) {
for (let i = 0; i < ssrElements.length; i++) {
if (!usedIndices.has(i) && ssrElements[i].parentNode) {
ssrElements[i].parentNode.removeChild(ssrElements[i]);
}
}
} else {
for (const [unusedKey, unusedNode] of ssrKeyMap) {
if (__DEV__) console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${unusedKey}"`);
if (unusedNode.parentNode) {
unusedNode.parentNode.removeChild(unusedNode);
}
}
}
const parent = start.parentNode;
for (const adoptedNode of adoptedNodes) {
parent.insertBefore(adoptedNode, end);
}
let cache = /* @__PURE__ */ new Map();
for (let i = 0; i < adoptedItems.length; i++) {
const item = adoptedItems[i];
const key = listKeyFn(item);
const [getIndex, setIndex] = createSignal(i);
cache.set(key, {
element: adoptedNodes[i],
item,
getIndex,
setIndex
});
}
let reconcileNodes = adoptedNodes.slice();
let reconcileItems = adoptedItems.slice();
internalEffect(() => {
const newItems = child.items();
const parent2 = start.parentNode;
if (!parent2) return;
const result = reconcileList(
parent2,
reconcileItems,
newItems,
reconcileNodes,
listKeyFn,
(item) => {
const prevHydrating = hydrating;
hydrating = false;
try {
const key = listKeyFn(item);
const [getIndex, setIndex] = createSignal(0);
const element = untrack(() => listRenderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
} finally {
hydrating = prevHydrating;
}
},
(_node, item) => {
const key = listKeyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
},
end
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < newItems.length; i++) {
const key = listKeyFn(newItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
reconcileNodes = result.nodes;
reconcileItems = result.items;
});
cursor = end.nextSibling;
}
}
} else if (typeof child === "function") {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
if (cursor && cursor.nodeType === 1) {
const initial = child();
if (isDescriptor(initial)) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(initial, el);
continue;
}
}
if (cursor && cursor.nodeType === 8) {
const data = cursor.data;
if (isTextStart(data)) {
const endMarker = findClosingMarker(cursor);
let textNode = cursor.nextSibling;
if (!textNode || textNode.nodeType !== 3) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for marker ${data} \u2014 SSR walker should emit content between markers`);
const created = document.createTextNode("");
cursor.parentNode.insertBefore(created, endMarker || cursor.nextSibling);
textNode = created;
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = endMarker ? endMarker.nextSibling : textNode.nextSibling;
} else if (isShowStart(data)) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
let textNode = findTextBetween(start, end);
if (!textNode) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for show marker ${start.data} \u2014 SSR walker should emit content between markers`);
textNode = document.createTextNode("");
start.parentNode.insertBefore(textNode, end);
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = end.nextSibling;
} else {
cursor = cursor.nextSibling;
}
} else {
cursor = cursor.nextSibling;
}
} else if (cursor && cursor.nodeType === 3) {
const textNode = cursor;
cursor = cursor.nextSibling;
internalEffect(() => {
textNode.data = String(child());
});
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node in empty <${ssrEl.tagName.toLowerCase()}> \u2014 IR may not cover this component`);
const textNode = document.createTextNode("");
ssrEl.appendChild(textNode);
internalEffect(() => {
textNode.data = String(child());
});
}
} else if (typeof child === "string" || typeof child === "number") {
if (cursor && cursor.nodeType === 3) {
cursor = cursor.nextSibling;
}
}
}
}
function hydrateIsland(component, target) {
const hasSSRContent = target.childElementCount > 0 || target.childNodes.length > 0 && Array.from(target.childNodes).some((n) => n.nodeType === 1 || n.nodeType === 3 && n.data.trim());
if (!hasSSRContent) {
if (__DEV__) {
const name = target.getAttribute("data-forma-component") || "unknown";
console.warn(
`[forma] Island "${name}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`
);
}
const result = component();
if (result instanceof Element) {
for (const attr of Array.from(target.attributes)) {
if (attr.name.startsWith("data-forma-")) {
result.setAttribute(attr.name, attr.value);
}
}
target.replaceWith(result);
return result;
} else if (result instanceof Node) {
target.appendChild(result);
}
return target;
}
setHydrating(true);
let descriptor;
try {
descriptor = component();
} finally {
setHydrating(false);
}
if (!descriptor || !isDescriptor(descriptor)) {
target.removeAttribute("data-forma-ssr");
return target;
}
if (target.hasAttribute("data-forma-island")) {
adoptNode(descriptor, target);
} else {
adoptNode(descriptor, target.children[0]);
}
target.removeAttribute("data-forma-ssr");
return target;
}
// src/dom/list.ts
function longestIncreasingSubsequence(arr) {
const n = arr.length;
if (n === 0) return [];
const tails = new Int32Array(n);
const tailIndices = new Int32Array(n);
const predecessor = new Int32Array(n).fill(-1);
let tailsLen = 0;
for (let i = 0; i < n; i++) {
const val = arr[i];
let lo = 0, hi = tailsLen;
while (lo < hi) {
const mid = lo + hi >> 1;
if (tails[mid] < val) lo = mid + 1;
else hi = mid;
}
tails[lo] = val;
tailIndices[lo] = i;
if (lo > 0) predecessor[i] = tailIndices[lo - 1];
if (lo >= tailsLen) tailsLen++;
}
const result = new Array(tailsLen);
let idx = tailIndices[tailsLen - 1];
for (let i = tailsLen - 1; i >= 0; i--) {
result[i] = idx;
idx = predecessor[idx];
}
return result;
}
var SMALL_LIST_THRESHOLD = 32;
var ABORT_SYM3 = /* @__PURE__ */ Symbol.for("forma-abort");
var CACHE_SYM2 = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM2 = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function canPatchStaticElement(target, source) {
return target instanceof HTMLElement && source instanceof HTMLElement && target.tagName === source.tagName && !target[ABORT_SYM3] && !target[CACHE_SYM2] && !target[DYNAMIC_CHILD_SYM2] && !source[ABORT_SYM3] && !source[CACHE_SYM2] && !source[DYNAMIC_CHILD_SYM2];
}
function patchStaticElement(target, source) {
const sourceAttrNames = /* @__PURE__ */ new Set();
for (const attr of Array.from(source.attributes)) {
sourceAttrNames.add(attr.name);
if (target.getAttribute(attr.name) !== attr.value) {
target.setAttribute(attr.name, attr.value);
}
}
for (const attr of Array.from(target.attributes)) {
if (!sourceAttrNames.has(attr.name)) {
target.removeAttribute(attr.name);
}
}
target.replaceChildren(...Array.from(source.childNodes));
}
function reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
const oldKeys = new Array(oldLen);
for (let i = 0; i < oldLen; i++) {
oldKeys[i] = keyFn(oldItems[i]);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
let found = -1;
for (let j = 0; j < oldLen; j++) {
if (!oldUsed[j] && oldKeys[j] === key) {
found = j;
oldUsed[j] = 1;
break;
}
}
oldIndices[i] = found;
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function reconcileList(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
if (newLen === 0) {
for (let i = 0; i < oldLen; i++) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
return { nodes: [], items: [] };
}
if (oldLen === 0) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = createFn(newItems[i]);
if (beforeNode) {
parent.insertBefore(node, beforeNode);
} else {
parent.appendChild(node);
}
hooks?.onInsert?.(node);
nodes[i] = node;
}
return { nodes, items: newItems };
}
if (oldLen < SMALL_LIST_THRESHOLD) {
return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);
}
const oldKeyMap = /* @__PURE__ */ new Map();
for (let i = 0; i < oldLen; i++) {
oldKeyMap.set(keyFn(oldItems[i]), i);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
const oldIdx = oldKeyMap.get(key);
if (oldIdx !== void 0) {
oldIndices[i] = oldIdx;
oldUsed[oldIdx] = 1;
} else {
oldIndices[i] = -1;
}
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function createList(items, keyFn, renderFn, options) {
if (hydrating) {
return { type: "list", items, keyFn, renderFn, options };
}
const startMarker = document.createComment("forma-list-start");
const endMarker = document.createComment("forma-list-end");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let cache = /* @__PURE__ */ new Map();
let currentNodes = [];
let currentItems = [];
const updateOnItemChange = options?.updateOnItemChange ?? "none";
internalEffect(() => {
const newItems = items();
const parent = startMarker.parentNode;
if (!parent) {
return;
}
if (!Array.isArray(newItems)) {
if (__DEV__) {
console.warn("[forma] createList: value is not an array, treating as empty");
}
for (const node of currentNodes) {
if (node.parentNode === parent) parent.removeChild(node);
}
cache = /* @__PURE__ */ new Map();
currentNodes = [];
currentItems = [];
return;
}
let cleanItems = newItems;
for (let i = 0; i < newItems.length; i++) {
if (newItems[i] == null) {
cleanItems = newItems.filter((item) => item != null);
break;
}
}
if (__DEV__) {
const seen = /* @__PURE__ */ new Set();
for (const item of cleanItems) {
const key = keyFn(item);
if (seen.has(key)) {
console.warn("[forma] createList: duplicate key detected:", key);
}
seen.add(key);
}
}
const updateRow = updateOnItemChange === "rerender" ? (node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (!cached) return;
if (cached.item === item) return;
cached.item = item;
if (!(node instanceof HTMLElement)) return;
if (node[ABORT_SYM3] || node[CACHE_SYM2] || node[DYNAMIC_CHILD_SYM2]) {
return;
}
const next = untrack(() => renderFn(item, cached.getIndex));
if (canPatchStaticElement(node, next)) {
patchStaticElement(node, next);
cached.element = node;
}
} : (_node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
};
const result = reconcileList(
parent,
currentItems,
cleanItems,
currentNodes,
keyFn,
// createFn: create element + cache entry
(item) => {
const key = keyFn(item);
const [getIndex, setIndex] = createSignal(0);
const element = untrack(() => renderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
},
updateRow,
// beforeNode: insert items before the end marker
endMarker
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < cleanItems.length; i++) {
const key = keyFn(cleanItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
currentNodes = result.nodes;
currentItems = result.items;
});
return fragment2;
}
export { Fragment, __DEV__, batch, cleanup, createEffect, createList, createMemo, createReducer, createRef, createResource, createRoot, createShow, fragment, h, hydrateIsland, internalEffect, on, onCleanup, onError, popSuspenseContext, pushSuspenseContext, reconcileList, reportError, untrack };
//# sourceMappingURL=chunk-TKGUHASG.js.map
//# sourceMappingURL=chunk-TKGUHASG.js.map

Sorry, the diff of this file is too big to display

'use strict';
var chunkKH3F5NRU_cjs = require('./chunk-KH3F5NRU.cjs');
var alienSignals = require('alien-signals');
// src/reactive/root.ts
var currentRoot = null;
var rootStack = [];
function createRoot(fn) {
const scope = { disposers: [] };
rootStack.push(currentRoot);
currentRoot = scope;
const dispose = () => {
for (const d of scope.disposers) {
try {
d();
} catch {
}
}
scope.disposers.length = 0;
};
try {
return fn(dispose);
} finally {
currentRoot = rootStack.pop() ?? null;
if (rootStack.length === 0) {
rootStack.length = 0;
}
}
}
function registerDisposer(dispose) {
if (currentRoot) {
currentRoot.disposers.push(dispose);
}
}
function hasActiveRoot() {
return currentRoot !== null;
}
// src/reactive/cleanup.ts
var currentCleanupCollector = null;
function onCleanup(fn) {
currentCleanupCollector?.(fn);
}
function setCleanupCollector(collector) {
const prev = currentCleanupCollector;
currentCleanupCollector = collector;
return prev;
}
// src/reactive/dev.ts
var __DEV__ = typeof process !== "undefined" ? process.env?.NODE_ENV !== "production" : true;
var _errorHandler = null;
function onError(handler) {
_errorHandler = handler;
}
function reportError(error, source) {
if (_errorHandler) {
try {
_errorHandler(error, source ? { source } : {});
} catch {
}
}
if (__DEV__) {
console.error(`[forma] ${source ?? "Unknown"} error:`, error);
}
}
var POOL_SIZE = 32;
var MAX_REENTRANT_RUNS = 100;
var pool = [];
for (let i = 0; i < POOL_SIZE; i++) pool.push([]);
var poolIdx = POOL_SIZE;
function acquireArray() {
if (poolIdx > 0) {
const arr = pool[--poolIdx];
arr.length = 0;
return arr;
}
return [];
}
function releaseArray(arr) {
arr.length = 0;
if (poolIdx < POOL_SIZE) {
pool[poolIdx++] = arr;
}
}
function runCleanup(fn) {
if (fn === void 0) return;
try {
fn();
} catch (e) {
reportError(e, "effect cleanup");
}
}
function runCleanups(bag) {
if (bag === void 0) return;
for (let i = 0; i < bag.length; i++) {
try {
bag[i]();
} catch (e) {
reportError(e, "effect cleanup");
}
}
}
function internalEffect(fn) {
const dispose = alienSignals.effect(fn);
if (hasActiveRoot()) {
registerDisposer(dispose);
}
return dispose;
}
function createEffect(fn) {
const shouldRegister = hasActiveRoot();
let cleanup2;
let cleanupBag;
let nextCleanup;
let nextCleanupBag;
const addCleanup = (cb) => {
if (nextCleanupBag !== void 0) {
nextCleanupBag.push(cb);
return;
}
if (nextCleanup !== void 0) {
const bag = acquireArray();
bag.push(nextCleanup, cb);
nextCleanup = void 0;
nextCleanupBag = bag;
return;
}
nextCleanup = cb;
};
let skipCleanupInfra = false;
let firstRun = true;
let running = false;
let rerunRequested = false;
const runOnce = () => {
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
if (skipCleanupInfra) {
try {
fn();
} catch (e) {
reportError(e, "effect");
}
return;
}
nextCleanup = void 0;
nextCleanupBag = void 0;
const prevCollector = setCleanupCollector(addCleanup);
try {
const result = fn();
if (typeof result === "function") {
addCleanup(result);
}
if (nextCleanup === void 0 && nextCleanupBag === void 0) {
if (firstRun) skipCleanupInfra = true;
return;
}
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} catch (e) {
reportError(e, "effect");
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} finally {
setCleanupCollector(prevCollector);
firstRun = false;
}
};
const safeFn = () => {
if (running) {
rerunRequested = true;
return;
}
running = true;
try {
let reentrantRuns = 0;
do {
rerunRequested = false;
runOnce();
if (rerunRequested) {
reentrantRuns++;
if (reentrantRuns >= MAX_REENTRANT_RUNS) {
reportError(
new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} re-entrant runs`),
"effect"
);
rerunRequested = false;
}
}
} while (rerunRequested);
} finally {
running = false;
}
};
const dispose = alienSignals.effect(safeFn);
let disposed = false;
const wrappedDispose = () => {
if (disposed) return;
disposed = true;
dispose();
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
};
if (shouldRegister) {
registerDisposer(wrappedDispose);
}
return wrappedDispose;
}
// src/reactive/memo.ts
var createMemo = chunkKH3F5NRU_cjs.createComputed;
function batch(fn) {
alienSignals.startBatch();
try {
fn();
} finally {
alienSignals.endBatch();
}
}
function untrack(fn) {
alienSignals.pauseTracking();
try {
return fn();
} finally {
alienSignals.resumeTracking();
}
}
// src/reactive/on.ts
function on(deps, fn, options) {
let prev;
let isFirst = true;
return () => {
const value2 = deps();
if (options?.defer && isFirst) {
isFirst = false;
prev = value2;
return void 0;
}
const result = untrack(() => fn(value2, prev));
prev = value2;
return result;
};
}
// src/reactive/ref.ts
function createRef(initialValue) {
return { current: initialValue };
}
// src/reactive/reducer.ts
function createReducer(reducer, initialState) {
const [state, setState] = chunkKH3F5NRU_cjs.createSignal(initialState);
const dispatch = (action) => {
setState((prev) => reducer(prev, action));
};
return [state, dispatch];
}
// src/reactive/suspense-context.ts
var currentSuspenseContext = null;
var suspenseStack = [];
function pushSuspenseContext(ctx) {
suspenseStack.push(currentSuspenseContext);
currentSuspenseContext = ctx;
}
function popSuspenseContext() {
currentSuspenseContext = suspenseStack.pop() ?? null;
}
function getSuspenseContext() {
return currentSuspenseContext;
}
// src/reactive/resource.ts
function createResource(source, fetcher, options) {
const [data, setData] = chunkKH3F5NRU_cjs.createSignal(options?.initialValue);
const [loading, setLoading] = chunkKH3F5NRU_cjs.createSignal(false);
const [error, setError] = chunkKH3F5NRU_cjs.createSignal(void 0);
const suspenseCtx = getSuspenseContext();
let abortController = null;
let fetchVersion = 0;
const doFetch = () => {
const sourceValue = untrack(source);
if (abortController) {
abortController.abort();
}
const controller = new AbortController();
abortController = controller;
const version = ++fetchVersion;
const isLatest = () => version === fetchVersion;
let suspensePending = false;
if (suspenseCtx) {
suspenseCtx.increment();
suspensePending = true;
}
setLoading(true);
setError(void 0);
Promise.resolve(fetcher(sourceValue)).then((result) => {
if (isLatest() && !controller.signal.aborted) {
setData(() => result);
}
}).catch((err) => {
if (isLatest() && !controller.signal.aborted) {
if (err?.name !== "AbortError") {
setError(err);
}
}
}).finally(() => {
if (suspensePending) suspenseCtx?.decrement();
if (isLatest()) {
setLoading(false);
if (abortController === controller) {
abortController = null;
}
}
});
};
internalEffect(() => {
source();
doFetch();
});
const resource = (() => data());
resource.loading = loading;
resource.error = error;
resource.refetch = doFetch;
resource.mutate = (value2) => setData(() => value2);
return resource;
}
// src/dom/element.ts
var Fragment = /* @__PURE__ */ Symbol.for("forma.fragment");
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK_NS = "http://www.w3.org/1999/xlink";
var SVG_TAGS = /* @__PURE__ */ new Set([
"svg",
"path",
"circle",
"rect",
"line",
"polyline",
"polygon",
"ellipse",
"g",
"text",
"tspan",
"textPath",
"defs",
"use",
"symbol",
"clipPath",
"mask",
"pattern",
"marker",
"linearGradient",
"radialGradient",
"stop",
"filter",
"feGaussianBlur",
"feColorMatrix",
"feOffset",
"feBlend",
"feMerge",
"feMergeNode",
"feComposite",
"feFlood",
"feMorphology",
"feTurbulence",
"feDisplacementMap",
"feImage",
"foreignObject",
"animate",
"animateTransform",
"animateMotion",
"set",
"image",
"switch",
"desc",
"title",
"metadata"
]);
var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
"disabled",
"checked",
"readonly",
"required",
"autofocus",
"autoplay",
"controls",
"default",
"defer",
"formnovalidate",
"hidden",
"ismap",
"loop",
"multiple",
"muted",
"nomodule",
"novalidate",
"open",
"playsinline",
"reversed",
"selected",
"async"
]);
var ELEMENT_PROTOS = null;
function getProto(tag) {
if (!ELEMENT_PROTOS) {
ELEMENT_PROTOS = /* @__PURE__ */ Object.create(null);
for (const t of [
"div",
"span",
"p",
"a",
"li",
"ul",
"ol",
"button",
"input",
"label",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"section",
"header",
"footer",
"main",
"nav",
"table",
"tr",
"td",
"th",
"tbody",
"img",
"form",
"select",
"option",
"textarea",
"i",
"b",
"strong",
"em",
"small",
"article",
"aside",
"details",
"summary"
]) {
ELEMENT_PROTOS[t] = document.createElement(t);
}
}
return ELEMENT_PROTOS[tag] ?? (ELEMENT_PROTOS[tag] = document.createElement(tag));
}
var EVENT_NAMES = /* @__PURE__ */ Object.create(null);
function eventName(key) {
return EVENT_NAMES[key] ?? (EVENT_NAMES[key] = key.slice(2).toLowerCase());
}
var ABORT_SYM = /* @__PURE__ */ Symbol.for("forma-abort");
function getAbortController(el) {
let controller = el[ABORT_SYM];
if (!controller) {
controller = new AbortController();
el[ABORT_SYM] = controller;
}
return controller;
}
function cleanup(el) {
const controller = el[ABORT_SYM];
if (controller) {
controller.abort();
delete el[ABORT_SYM];
}
}
var CACHE_SYM = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function getCache(el) {
return el[CACHE_SYM] ?? (el[CACHE_SYM] = /* @__PURE__ */ Object.create(null));
}
function handleClass(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache["class"] === v) return;
cache["class"] = v;
if (el instanceof HTMLElement) {
el.className = v;
} else {
el.setAttribute("class", v);
}
});
} else {
const cache = getCache(el);
if (cache["class"] === value2) return;
cache["class"] = value2;
if (el instanceof HTMLElement) {
el.className = value2;
} else {
el.setAttribute("class", value2);
}
}
}
function handleStyle(el, _key, value2) {
if (typeof value2 === "function") {
let prevKeys = [];
internalEffect(() => {
const v = value2();
if (typeof v === "string") {
const cache = getCache(el);
if (cache["style"] === v) return;
cache["style"] = v;
prevKeys = [];
el.style.cssText = v;
} else if (v && typeof v === "object") {
const style = el.style;
const nextKeys = Object.keys(v);
for (const k of prevKeys) {
if (!(k in v)) {
style.removeProperty(k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()));
}
}
Object.assign(style, v);
prevKeys = nextKeys;
}
});
} else if (typeof value2 === "string") {
const cache = getCache(el);
if (cache["style"] === value2) return;
cache["style"] = value2;
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
}
function handleEvent(el, key, value2) {
const controller = getAbortController(el);
el.addEventListener(
eventName(key),
value2,
{ signal: controller.signal }
);
}
function handleInnerHTML(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const resolved = value2();
if (resolved == null) {
el.innerHTML = "";
return;
}
if (typeof resolved !== "object" || !("__html" in resolved)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof resolved
);
}
const html = resolved.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
const cache = getCache(el);
if (cache["innerHTML"] === html) return;
cache["innerHTML"] = html;
el.innerHTML = html;
});
} else {
if (value2 == null) {
el.innerHTML = "";
return;
}
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
}
}
function handleXLink(el, key, value2) {
const localName = key.slice(6);
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(v));
}
});
} else {
if (value2 == null || value2 === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(value2));
}
}
}
function handleBooleanAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache[key] === v) return;
cache[key] = v;
if (v) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
});
} else {
const cache = getCache(el);
if (cache[key] === value2) return;
cache[key] = value2;
if (value2) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
}
}
function handleGenericAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(v);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
});
} else {
if (value2 == null || value2 === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(value2);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
}
}
var PROP_HANDLERS = /* @__PURE__ */ new Map();
PROP_HANDLERS.set("class", handleClass);
PROP_HANDLERS.set("className", handleClass);
PROP_HANDLERS.set("style", handleStyle);
PROP_HANDLERS.set("ref", () => {
});
PROP_HANDLERS.set("dangerouslySetInnerHTML", handleInnerHTML);
for (const attr of BOOLEAN_ATTRS) {
PROP_HANDLERS.set(attr, handleBooleanAttr);
}
function applyProp(el, key, value2) {
if (key === "class") {
handleClass(el, key, value2);
return;
}
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
return;
}
const handler = PROP_HANDLERS.get(key);
if (handler) {
handler(el, key, value2);
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
handleXLink(el, key, value2);
return;
}
handleGenericAttr(el, key, value2);
}
function applyStaticProp(el, key, value2) {
if (value2 == null || value2 === false) return;
if (key === "class" || key === "className") {
el.className = value2;
return;
}
if (key === "style") {
if (typeof value2 === "string") {
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
return;
}
if (key === "dangerouslySetInnerHTML") {
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
el.setAttributeNS(XLINK_NS, key, String(value2));
return;
}
if (BOOLEAN_ATTRS.has(key)) {
if (value2) el.setAttribute(key, "");
return;
}
if (value2 === true) {
el.setAttribute(key, "");
} else {
el.setAttribute(key, String(value2));
}
}
function appendChild(parent, child) {
if (child instanceof Node) {
parent.appendChild(child);
return;
}
if (typeof child === "string") {
parent.appendChild(new Text(child));
return;
}
if (child == null || child === false || child === true) {
return;
}
if (typeof child === "number") {
parent.appendChild(new Text(String(child)));
return;
}
if (typeof child === "function") {
if (parent instanceof Element) {
parent[DYNAMIC_CHILD_SYM] = true;
}
let currentNode = null;
internalEffect(() => {
const v = child();
if (v instanceof Node) {
if (currentNode) {
parent.replaceChild(v, currentNode);
} else {
parent.appendChild(v);
}
currentNode = v;
} else {
const text = typeof v === "symbol" ? String(v) : String(v ?? "");
if (!currentNode) {
currentNode = new Text(text);
parent.appendChild(currentNode);
} else if (currentNode.nodeType === 3) {
currentNode.data = text;
} else {
const tn = new Text(text);
parent.replaceChild(tn, currentNode);
currentNode = tn;
}
}
});
return;
}
if (Array.isArray(child)) {
for (const item of child) {
appendChild(parent, item);
}
return;
}
}
function h(tag, props, ...children) {
if (typeof tag === "function" && tag !== Fragment) {
const mergedProps = { ...props ?? {}, children };
return tag(mergedProps);
}
if (tag === Fragment) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
const tagName = tag;
if (hydrating) {
return { type: "element", tag: tagName, props: props ?? null, children };
}
let el;
if (ELEMENT_PROTOS && ELEMENT_PROTOS[tagName]) {
el = ELEMENT_PROTOS[tagName].cloneNode(false);
} else if (SVG_TAGS.has(tagName)) {
el = document.createElementNS(SVG_NS, tagName);
} else {
el = getProto(tagName).cloneNode(false);
}
if (props) {
let hasDynamic = false;
for (const key in props) {
if (key === "ref") continue;
const value2 = props[key];
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
continue;
}
if (typeof value2 === "function") {
if (!hasDynamic) {
el[CACHE_SYM] = /* @__PURE__ */ Object.create(null);
hasDynamic = true;
}
applyProp(el, key, value2);
continue;
}
applyStaticProp(el, key, value2);
}
}
const childLen = children.length;
if (childLen === 1) {
const only = children[0];
if (typeof only === "string") {
el.textContent = only;
} else if (typeof only === "number") {
el.textContent = String(only);
} else {
appendChild(el, only);
}
} else if (childLen > 1) {
for (const child of children) {
appendChild(el, child);
}
}
if (props && typeof props["ref"] === "function") {
props["ref"](el);
}
return el;
}
function fragment(...children) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
// src/dom/show.ts
function createShow(when, thenFn, elseFn) {
if (hydrating) {
const branch = when() ? thenFn() : elseFn?.() ?? null;
return {
type: "show",
condition: when,
whenTrue: thenFn,
whenFalse: elseFn,
initialBranch: branch
};
}
const startMarker = document.createComment("forma-show");
const endMarker = document.createComment("/forma-show");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let currentNode = null;
let lastTruthy = null;
let currentDispose = null;
const showDispose = internalEffect(() => {
const truthy = !!when();
const DEBUG = typeof globalThis.__FORMA_DEBUG__ !== "undefined";
const DEBUG_LABEL = DEBUG ? thenFn.toString().slice(0, 60) : "";
if (truthy === lastTruthy) {
if (DEBUG) console.log("[forma:show] skip (same)", truthy, DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show]", lastTruthy, "\u2192", truthy, DEBUG_LABEL);
lastTruthy = truthy;
const parent = startMarker.parentNode;
if (!parent) {
if (DEBUG) console.warn("[forma:show] parentNode is null! skipping.", DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show] parent:", parent.nodeName, "inDoc:", document.contains(parent));
if (currentDispose) {
currentDispose();
currentDispose = null;
}
if (currentNode) {
if (currentNode.parentNode === parent) {
parent.removeChild(currentNode);
} else {
while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {
parent.removeChild(startMarker.nextSibling);
}
}
}
const branchFn = truthy ? thenFn : elseFn;
if (branchFn) {
let branchDispose;
currentNode = createRoot((dispose) => {
branchDispose = dispose;
return untrack(() => branchFn());
});
currentDispose = branchDispose;
} else {
currentNode = null;
}
if (currentNode) {
parent.insertBefore(currentNode, endMarker);
}
});
fragment2.__showDispose = () => {
showDispose();
if (currentDispose) {
currentDispose();
currentDispose = null;
}
};
return fragment2;
}
// src/dom/hydrate.ts
var ABORT_SYM2 = /* @__PURE__ */ Symbol.for("forma-abort");
var hydrating = false;
function setHydrating(value2) {
hydrating = value2;
}
function isDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "element";
}
function isShowDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "show";
}
function isListDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "list";
}
function applyDynamicProps(el, props) {
if (!props) return;
for (const key in props) {
const value2 = props[key];
if (typeof value2 !== "function") continue;
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
let ac = el[ABORT_SYM2];
if (!ac) {
ac = new AbortController();
el[ABORT_SYM2] = ac;
}
el.addEventListener(key.slice(2).toLowerCase(), value2, { signal: ac.signal });
continue;
}
const fn = value2;
const attrKey = key;
internalEffect(() => {
const v = fn();
if (v === false || v == null) {
el.removeAttribute(attrKey);
} else if (v === true) {
el.setAttribute(attrKey, "");
} else {
el.setAttribute(attrKey, String(v));
}
});
}
}
function ensureNode(value2) {
if (value2 instanceof Node) return value2;
if (value2 == null || value2 === false || value2 === true) return null;
if (typeof value2 === "string") return new Text(value2);
if (typeof value2 === "number") return new Text(String(value2));
if (isDescriptor(value2)) return descriptorToElement(value2);
if (isShowDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createShow(
value2.condition,
() => ensureNode(value2.whenTrue()) ?? document.createComment("empty"),
value2.whenFalse ? () => ensureNode(value2.whenFalse()) ?? document.createComment("empty") : void 0
);
} finally {
hydrating = prevH;
}
}
if (isListDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createList(value2.items, value2.keyFn, value2.renderFn, value2.options);
} finally {
hydrating = prevH;
}
}
return null;
}
function descriptorToElement(desc) {
const prevHydrating = hydrating;
hydrating = false;
try {
const children = desc.children.map((child) => {
if (isDescriptor(child)) return descriptorToElement(child);
if (isShowDescriptor(child)) return ensureNode(child);
if (isListDescriptor(child)) return ensureNode(child);
return child;
});
return h(desc.tag, desc.props, ...children);
} finally {
hydrating = prevHydrating;
}
}
function isIslandStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 105;
}
function isShowStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 115;
}
function isTextStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 116;
}
function isListStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 108;
}
function findClosingMarker(start) {
const closing = "/" + start.data;
let node = start.nextSibling;
while (node) {
if (node.nodeType === 8 && node.data === closing) {
return node;
}
node = node.nextSibling;
}
return null;
}
function findTextBetween(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 3) return node;
node = node.nextSibling;
}
return null;
}
function nextElementBetweenMarkers(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) return node;
node = node.nextSibling;
}
return void 0;
}
function extractContentBetweenMarkers(start, end) {
const frag = document.createDocumentFragment();
let node = start.nextSibling;
while (node && node !== end) {
const next = node.nextSibling;
frag.appendChild(node);
node = next;
}
return frag;
}
function setupShowEffect(desc, marker) {
let currentCondition = !!desc.condition();
let thenFragment = null;
let elseFragment = null;
const hasSSRContent = marker.start.nextSibling !== marker.end;
if (!hasSSRContent && currentCondition) {
if (__DEV__) console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");
const trueBranch = desc.whenTrue();
if (trueBranch instanceof Node) {
marker.start.parentNode.insertBefore(trueBranch, marker.end);
}
}
internalEffect(() => {
const next = !!desc.condition();
if (next === currentCondition) return;
currentCondition = next;
const parent = marker.start.parentNode;
if (!parent) return;
const current = extractContentBetweenMarkers(marker.start, marker.end);
if (!next) {
thenFragment = current;
} else {
elseFragment = current;
}
let branch = next ? thenFragment ?? desc.whenTrue() : desc.whenFalse ? elseFragment ?? desc.whenFalse() : null;
if (next && thenFragment) thenFragment = null;
if (!next && elseFragment) elseFragment = null;
if (branch != null && !(branch instanceof Node)) {
branch = ensureNode(branch);
}
if (branch instanceof Node) {
parent.insertBefore(branch, marker.end);
}
});
}
function adoptBranchContent(desc, regionStart, regionEnd) {
if (isDescriptor(desc)) {
const el = nextElementBetweenMarkers(regionStart, regionEnd);
if (el) adoptNode(desc, el);
} else if (isShowDescriptor(desc)) {
let node = regionStart.nextSibling;
while (node && node !== regionEnd) {
if (node.nodeType === 8 && isShowStart(node.data)) {
const innerStart = node;
const innerEnd = findClosingMarker(innerStart);
if (innerEnd) {
if (desc.initialBranch) {
adoptBranchContent(desc.initialBranch, innerStart, innerEnd);
}
setupShowEffect(desc, { start: innerStart, end: innerEnd});
}
break;
}
node = node.nextSibling;
}
}
}
function adoptNode(desc, ssrEl) {
if (!ssrEl || ssrEl.tagName !== desc.tag.toUpperCase()) {
if (__DEV__) console.warn(`Hydration mismatch: expected <${desc.tag}>, got <${ssrEl?.tagName?.toLowerCase() ?? "nothing"}>`);
const fresh = descriptorToElement(desc);
if (ssrEl) ssrEl.replaceWith(fresh);
return;
}
applyDynamicProps(ssrEl, desc.props);
let cursor = ssrEl.firstChild;
for (const child of desc.children) {
if (child === false || child == null) continue;
if (isDescriptor(child)) {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
while (cursor && cursor.nodeType === 1 && cursor.hasAttribute("data-forma-island")) {
cursor = cursor.nextSibling;
}
if (!cursor) {
ssrEl.appendChild(descriptorToElement(child));
continue;
}
if (cursor.nodeType === 1) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(child, el);
} else if (cursor.nodeType === 8 && isIslandStart(cursor.data)) {
const end = findClosingMarker(cursor);
const fresh = descriptorToElement(child);
if (end) {
end.parentNode.insertBefore(fresh, end);
cursor = end.nextSibling;
} else {
ssrEl.appendChild(fresh);
cursor = null;
}
} else {
ssrEl.appendChild(descriptorToElement(child));
}
} else if (isShowDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isShowStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
if (child.initialBranch) {
adoptBranchContent(child.initialBranch, start, end);
}
setupShowEffect(child, { start, end});
cursor = end.nextSibling;
}
}
} else if (isListDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isListStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
const ssrKeyMap = /* @__PURE__ */ new Map();
const ssrElements = [];
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) {
const el = node;
ssrElements.push(el);
const key = el.getAttribute("data-forma-key");
if (key != null) {
ssrKeyMap.set(key, el);
}
}
node = node.nextSibling;
}
const currentItems = untrack(() => child.items());
const listKeyFn = child.keyFn;
const listRenderFn = child.renderFn;
const useIndexFallback = ssrKeyMap.size === 0 && ssrElements.length > 0;
const adoptedNodes = [];
const adoptedItems = [];
const usedIndices = /* @__PURE__ */ new Set();
for (let i = 0; i < currentItems.length; i++) {
const item = currentItems[i];
const key = listKeyFn(item);
let ssrNode;
if (useIndexFallback) {
if (i < ssrElements.length) {
ssrNode = ssrElements[i];
usedIndices.add(i);
}
} else {
ssrNode = ssrKeyMap.get(String(key));
if (ssrNode) ssrKeyMap.delete(String(key));
}
if (ssrNode) {
adoptedNodes.push(ssrNode);
adoptedItems.push(item);
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: list item key "${key}" not found in SSR \u2014 rendering fresh`);
const prevHydrating = hydrating;
hydrating = false;
try {
const [getIndex] = chunkKH3F5NRU_cjs.createSignal(i);
const fresh = listRenderFn(item, getIndex);
end.parentNode.insertBefore(fresh, end);
adoptedNodes.push(fresh);
adoptedItems.push(item);
} finally {
hydrating = prevHydrating;
}
}
}
if (useIndexFallback) {
for (let i = 0; i < ssrElements.length; i++) {
if (!usedIndices.has(i) && ssrElements[i].parentNode) {
ssrElements[i].parentNode.removeChild(ssrElements[i]);
}
}
} else {
for (const [unusedKey, unusedNode] of ssrKeyMap) {
if (__DEV__) console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${unusedKey}"`);
if (unusedNode.parentNode) {
unusedNode.parentNode.removeChild(unusedNode);
}
}
}
const parent = start.parentNode;
for (const adoptedNode of adoptedNodes) {
parent.insertBefore(adoptedNode, end);
}
let cache = /* @__PURE__ */ new Map();
for (let i = 0; i < adoptedItems.length; i++) {
const item = adoptedItems[i];
const key = listKeyFn(item);
const [getIndex, setIndex] = chunkKH3F5NRU_cjs.createSignal(i);
cache.set(key, {
element: adoptedNodes[i],
item,
getIndex,
setIndex
});
}
let reconcileNodes = adoptedNodes.slice();
let reconcileItems = adoptedItems.slice();
internalEffect(() => {
const newItems = child.items();
const parent2 = start.parentNode;
if (!parent2) return;
const result = reconcileList(
parent2,
reconcileItems,
newItems,
reconcileNodes,
listKeyFn,
(item) => {
const prevHydrating = hydrating;
hydrating = false;
try {
const key = listKeyFn(item);
const [getIndex, setIndex] = chunkKH3F5NRU_cjs.createSignal(0);
const element = untrack(() => listRenderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
} finally {
hydrating = prevHydrating;
}
},
(_node, item) => {
const key = listKeyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
},
end
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < newItems.length; i++) {
const key = listKeyFn(newItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
reconcileNodes = result.nodes;
reconcileItems = result.items;
});
cursor = end.nextSibling;
}
}
} else if (typeof child === "function") {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
if (cursor && cursor.nodeType === 1) {
const initial = child();
if (isDescriptor(initial)) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(initial, el);
continue;
}
}
if (cursor && cursor.nodeType === 8) {
const data = cursor.data;
if (isTextStart(data)) {
const endMarker = findClosingMarker(cursor);
let textNode = cursor.nextSibling;
if (!textNode || textNode.nodeType !== 3) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for marker ${data} \u2014 SSR walker should emit content between markers`);
const created = document.createTextNode("");
cursor.parentNode.insertBefore(created, endMarker || cursor.nextSibling);
textNode = created;
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = endMarker ? endMarker.nextSibling : textNode.nextSibling;
} else if (isShowStart(data)) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
let textNode = findTextBetween(start, end);
if (!textNode) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for show marker ${start.data} \u2014 SSR walker should emit content between markers`);
textNode = document.createTextNode("");
start.parentNode.insertBefore(textNode, end);
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = end.nextSibling;
} else {
cursor = cursor.nextSibling;
}
} else {
cursor = cursor.nextSibling;
}
} else if (cursor && cursor.nodeType === 3) {
const textNode = cursor;
cursor = cursor.nextSibling;
internalEffect(() => {
textNode.data = String(child());
});
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node in empty <${ssrEl.tagName.toLowerCase()}> \u2014 IR may not cover this component`);
const textNode = document.createTextNode("");
ssrEl.appendChild(textNode);
internalEffect(() => {
textNode.data = String(child());
});
}
} else if (typeof child === "string" || typeof child === "number") {
if (cursor && cursor.nodeType === 3) {
cursor = cursor.nextSibling;
}
}
}
}
function hydrateIsland(component, target) {
const hasSSRContent = target.childElementCount > 0 || target.childNodes.length > 0 && Array.from(target.childNodes).some((n) => n.nodeType === 1 || n.nodeType === 3 && n.data.trim());
if (!hasSSRContent) {
if (__DEV__) {
const name = target.getAttribute("data-forma-component") || "unknown";
console.warn(
`[forma] Island "${name}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`
);
}
const result = component();
if (result instanceof Element) {
for (const attr of Array.from(target.attributes)) {
if (attr.name.startsWith("data-forma-")) {
result.setAttribute(attr.name, attr.value);
}
}
target.replaceWith(result);
return result;
} else if (result instanceof Node) {
target.appendChild(result);
}
return target;
}
setHydrating(true);
let descriptor;
try {
descriptor = component();
} finally {
setHydrating(false);
}
if (!descriptor || !isDescriptor(descriptor)) {
target.removeAttribute("data-forma-ssr");
return target;
}
if (target.hasAttribute("data-forma-island")) {
adoptNode(descriptor, target);
} else {
adoptNode(descriptor, target.children[0]);
}
target.removeAttribute("data-forma-ssr");
return target;
}
// src/dom/list.ts
function longestIncreasingSubsequence(arr) {
const n = arr.length;
if (n === 0) return [];
const tails = new Int32Array(n);
const tailIndices = new Int32Array(n);
const predecessor = new Int32Array(n).fill(-1);
let tailsLen = 0;
for (let i = 0; i < n; i++) {
const val = arr[i];
let lo = 0, hi = tailsLen;
while (lo < hi) {
const mid = lo + hi >> 1;
if (tails[mid] < val) lo = mid + 1;
else hi = mid;
}
tails[lo] = val;
tailIndices[lo] = i;
if (lo > 0) predecessor[i] = tailIndices[lo - 1];
if (lo >= tailsLen) tailsLen++;
}
const result = new Array(tailsLen);
let idx = tailIndices[tailsLen - 1];
for (let i = tailsLen - 1; i >= 0; i--) {
result[i] = idx;
idx = predecessor[idx];
}
return result;
}
var SMALL_LIST_THRESHOLD = 32;
var ABORT_SYM3 = /* @__PURE__ */ Symbol.for("forma-abort");
var CACHE_SYM2 = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM2 = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function canPatchStaticElement(target, source) {
return target instanceof HTMLElement && source instanceof HTMLElement && target.tagName === source.tagName && !target[ABORT_SYM3] && !target[CACHE_SYM2] && !target[DYNAMIC_CHILD_SYM2] && !source[ABORT_SYM3] && !source[CACHE_SYM2] && !source[DYNAMIC_CHILD_SYM2];
}
function patchStaticElement(target, source) {
const sourceAttrNames = /* @__PURE__ */ new Set();
for (const attr of Array.from(source.attributes)) {
sourceAttrNames.add(attr.name);
if (target.getAttribute(attr.name) !== attr.value) {
target.setAttribute(attr.name, attr.value);
}
}
for (const attr of Array.from(target.attributes)) {
if (!sourceAttrNames.has(attr.name)) {
target.removeAttribute(attr.name);
}
}
target.replaceChildren(...Array.from(source.childNodes));
}
function reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
const oldKeys = new Array(oldLen);
for (let i = 0; i < oldLen; i++) {
oldKeys[i] = keyFn(oldItems[i]);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
let found = -1;
for (let j = 0; j < oldLen; j++) {
if (!oldUsed[j] && oldKeys[j] === key) {
found = j;
oldUsed[j] = 1;
break;
}
}
oldIndices[i] = found;
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function reconcileList(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
if (newLen === 0) {
for (let i = 0; i < oldLen; i++) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
return { nodes: [], items: [] };
}
if (oldLen === 0) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = createFn(newItems[i]);
if (beforeNode) {
parent.insertBefore(node, beforeNode);
} else {
parent.appendChild(node);
}
hooks?.onInsert?.(node);
nodes[i] = node;
}
return { nodes, items: newItems };
}
if (oldLen < SMALL_LIST_THRESHOLD) {
return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);
}
const oldKeyMap = /* @__PURE__ */ new Map();
for (let i = 0; i < oldLen; i++) {
oldKeyMap.set(keyFn(oldItems[i]), i);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
const oldIdx = oldKeyMap.get(key);
if (oldIdx !== void 0) {
oldIndices[i] = oldIdx;
oldUsed[oldIdx] = 1;
} else {
oldIndices[i] = -1;
}
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function createList(items, keyFn, renderFn, options) {
if (hydrating) {
return { type: "list", items, keyFn, renderFn, options };
}
const startMarker = document.createComment("forma-list-start");
const endMarker = document.createComment("forma-list-end");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let cache = /* @__PURE__ */ new Map();
let currentNodes = [];
let currentItems = [];
const updateOnItemChange = options?.updateOnItemChange ?? "none";
internalEffect(() => {
const newItems = items();
const parent = startMarker.parentNode;
if (!parent) {
return;
}
if (!Array.isArray(newItems)) {
if (__DEV__) {
console.warn("[forma] createList: value is not an array, treating as empty");
}
for (const node of currentNodes) {
if (node.parentNode === parent) parent.removeChild(node);
}
cache = /* @__PURE__ */ new Map();
currentNodes = [];
currentItems = [];
return;
}
let cleanItems = newItems;
for (let i = 0; i < newItems.length; i++) {
if (newItems[i] == null) {
cleanItems = newItems.filter((item) => item != null);
break;
}
}
if (__DEV__) {
const seen = /* @__PURE__ */ new Set();
for (const item of cleanItems) {
const key = keyFn(item);
if (seen.has(key)) {
console.warn("[forma] createList: duplicate key detected:", key);
}
seen.add(key);
}
}
const updateRow = updateOnItemChange === "rerender" ? (node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (!cached) return;
if (cached.item === item) return;
cached.item = item;
if (!(node instanceof HTMLElement)) return;
if (node[ABORT_SYM3] || node[CACHE_SYM2] || node[DYNAMIC_CHILD_SYM2]) {
return;
}
const next = untrack(() => renderFn(item, cached.getIndex));
if (canPatchStaticElement(node, next)) {
patchStaticElement(node, next);
cached.element = node;
}
} : (_node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
};
const result = reconcileList(
parent,
currentItems,
cleanItems,
currentNodes,
keyFn,
// createFn: create element + cache entry
(item) => {
const key = keyFn(item);
const [getIndex, setIndex] = chunkKH3F5NRU_cjs.createSignal(0);
const element = untrack(() => renderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
},
updateRow,
// beforeNode: insert items before the end marker
endMarker
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < cleanItems.length; i++) {
const key = keyFn(cleanItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
currentNodes = result.nodes;
currentItems = result.items;
});
return fragment2;
}
exports.Fragment = Fragment;
exports.__DEV__ = __DEV__;
exports.batch = batch;
exports.cleanup = cleanup;
exports.createEffect = createEffect;
exports.createList = createList;
exports.createMemo = createMemo;
exports.createReducer = createReducer;
exports.createRef = createRef;
exports.createResource = createResource;
exports.createRoot = createRoot;
exports.createShow = createShow;
exports.fragment = fragment;
exports.h = h;
exports.hydrateIsland = hydrateIsland;
exports.internalEffect = internalEffect;
exports.on = on;
exports.onCleanup = onCleanup;
exports.onError = onError;
exports.popSuspenseContext = popSuspenseContext;
exports.pushSuspenseContext = pushSuspenseContext;
exports.reconcileList = reconcileList;
exports.reportError = reportError;
exports.untrack = untrack;
//# sourceMappingURL=chunk-YSKF3VRA.cjs.map
//# sourceMappingURL=chunk-YSKF3VRA.cjs.map

Sorry, the diff of this file is too big to display

+1
-1

@@ -1,2 +0,2 @@

"use strict";var FormaRuntime=(()=>{var Se=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)Se(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xt(t))!Nt.call(e,i)&&i!==n&&Se(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(Se({},"__esModule",{value:!0}),e);var Co={};Dt(Co,{applyContainmentHints:()=>vt,clearDiagnostics:()=>Ao,destroyRuntime:()=>po,getDiagnostics:()=>To,getScopes:()=>_o,getUnsafeEvalMode:()=>yo,initRuntime:()=>Ue,mount:()=>go,reconcile:()=>Mo,resetScope:()=>ko,setDebug:()=>vo,setDiagnostics:()=>So,setDirectiveMap:()=>io,setScopeValue:()=>wo,setUnsafeEval:()=>Eo,setUnsafeEvalMode:()=>bo,unmount:()=>ho,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:s,updateDirtyFlag:u,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(l,p){let r=p.depsTail;if(r!==void 0&&r.dep===l)return;let f=r!==void 0?r.nextDep:p.deps;if(f!==void 0&&f.dep===l){p.depsTail=f;return}let h=l.subsTail;if(!(h!==void 0&&h.sub===p&&A(h,p)))return g(l,p,f,r)}function s(l){let p=l.nextSub,r,f=0,h=32;e:do{let y=l.sub,T=y.flags,C=!1;if(T&244?T&16&&!(T&4)?(y.flags=T&-17|h|8,C=!0):!(T&224)&&A(l,y)&&(y.flags=T|16|h|8,C=y.subs!==void 0):(y.flags=T|h|8,C=!0),C){let P=y.subs;if(P!==void 0){l=P,P.nextSub!==void 0?(r={target:p,linked:r},++f,p=l.nextSub,h=64):h=T&2?128:64;continue}T&2&&(n[i++]=y)}else T&(4|h)?!(T&h)&&T&224&&A(l,y)&&(y.flags=T|h):(y.flags=T|h|8,(T&10)===2&&(n[i++]=y));if((l=p)!==void 0){p=l.nextSub,h=f?64:32;continue}for(;f--;)if(l=r.target,r=r.linked,l!==void 0){p=l.nextSub,h=f?64:32;continue e}break}while(!0)}function c(l){l.depsTail=void 0,l.flags=l.flags&-249|4}function m(l){let p=l.depsTail;if(p!==void 0){let r=p.nextDep;r!==void 0&&(S(r),p.nextDep=void 0)}else l.deps!==void 0&&(S(l.deps),l.deps=void 0);l.flags&=-5}function u(l,p){return E(l.deps)?(l.flags=p|32,!0):(l.flags=p&-65,!1)}function d(l,p){if(p&32||E(l.deps)){if(e(l)){let r=l.subs;r!==void 0&&_(r)}}else l.flags=p&-65}function b(l,p){if(p&128){l.flags=p&-129;let r=l.deps;do{let f=r.dep;"flags"in f&&f.flags&2&&f.flags&224&&t(f),r=r.nextDep}while(r!==void 0)}}function v(){for(;o<i;){let l=n[o];n[o++]=void 0,t(l)||(l.flags&=-9)}o=0,i=0}function g(l,p,r,f){let h={dep:l,sub:p,nextDep:r,prevSub:void 0,nextSub:void 0};if(f===void 0?p.deps=h:f.nextDep=h,l.subs===void 0)l.subs=h;else{let y=l.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,l.subsTail=h,h}function E(l){let p,r=0,f;e:do{f=!1;let h=l.dep;if(l.sub.flags&32)f=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let T=h.subs;T.nextSub!==void 0&&_(T),f=!0}}else if((y&65)===65){(l.nextSub!==void 0||l.prevSub!==void 0)&&(p={target:l,linked:p}),l=h.deps,++r;continue}}if(!f&&l.nextDep!==void 0){l=l.nextDep;continue}for(;r;){--r;let y=l.sub,T=y.subs;if(f){if(e(y)){T.nextSub!==void 0?(l=p.target,p=p.linked,_(T)):l=T;continue}}else y.flags&=-65;if(T.nextSub!==void 0?(l=p.target,p=p.linked):l=T,l.nextDep!==void 0){l=l.nextDep;continue e}f=!1}return f}while(!0)}function _(l){do{let p=l.sub,r=p.flags;(r&96)===64&&(p.flags=r|32|8,(r&10)===2&&(n[i++]=p)),l=l.nextSub}while(l!==void 0)}function A(l,p){let r=p.depsTail;if(r!==void 0){let f=p.deps;do{if(f===l)return!0;if(f===r)break;f=f.nextDep}while(f!==void 0)}return!1}function S(l){do{let p=l.dep,r=l.nextDep,f=l.nextSub,h=l.prevSub;if(f!==void 0?f.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=f:p.subs=f,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let T=p.deps;if(T!==void 0){l=T,p.depsTail.nextDep=r,p.deps=void 0,p.depsTail=void 0;continue}}l=r}while(l!==void 0)}}var{link:oe,propagate:Ht,updateDirtyFlag:Ut,startTracking:Te,endTracking:Ae,processEffectNotifications:qe,processComputedUpdate:Pt,processPendingInnerEffects:Ge}=$t({updateComputed(e){let t=I;I=e,Te(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{I=t,Ae(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),je=[],_e=0,I,me;function ze(){++_e}function Je(){--_e||qe()}function Ke(){je.push(I),I=void 0}function Xe(){I=je.pop()}function Ye(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function Ze(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Qe(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};I!==void 0?oe(t,I):me!==void 0&&oe(t,me);let n=I;I=t;try{t.fn()}finally{I=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Ut(e,t)){let n=I;I=e,Te(e);try{e.fn()}finally{I=n,Ae(e)}}else Ge(e,e.flags);return!0}function Ft(e){return e.flags&128?(Ge(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Pt(this,e),I!==void 0?oe(this,I):me!==void 0&&oe(this,me),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),_e||qe())}}else return I!==void 0&&oe(this,I),this.currentValue}function qt(){Te(this),Ae(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ke();let n=e();Xe(),e(t(n))}function et(e){let t=Ye(e);return[t,i=>Gt(t,i)]}var Y=et;var we=null;function tt(e){we&&we.disposers.push(e)}function nt(){return we!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=Qe(e);return nt()&&tt(t),t}function ke(e){return Ze(e)}function $(e){ze();try{e()}finally{Je()}}function ot(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let u=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<u?d=v+1:b=v}n[d]=u,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let s=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)s[m]=c,c=i[c];return s}var Jt=32;function Kt(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length,b=new Array(u);for(let r=0;r<u;r++)b[r]=i(t[r]);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=-1;for(let y=0;y<u;y++)if(!g[y]&&b[y]===f){h=y,g[y]=1;break}v[r]=h}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Re(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length;if(d===0){for(let r=0;r<u;r++)if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);return{nodes:[],items:[]}}if(u===0){let r=new Array(d);for(let f=0;f<d;f++){let h=a(n[f]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),r[f]=h}return{nodes:r,items:n}}if(u<Jt)return Kt(e,t,n,o,i,a,s,c,m);let b=new Map;for(let r=0;r<u;r++)b.set(i(t[r]),r);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=b.get(f);h!==void 0?(v[r]=h,g[h]=1):v[r]=-1}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function it(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",s=t.getAttribute("data-forma-state")??"{}",c=it(a),m=it(s);return Zt(c,m)?"PRESERVE":"RESET"}var pe=null;function en(e){return pe||(pe=document.createElement("template")),pe.innerHTML=e,pe.content}function Me(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,s=e.attributes;for(let m=0;m<s.length;m++)if(s[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let u=c[m];if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.getAttribute(u.name)!==u.value&&e.setAttribute(u.name,u.value)}for(let m=s.length-1;m>=0;m--){let u=s[m];if(!t.hasAttribute(u.name)){if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.removeAttribute(u.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let s of Array.from(e.childNodes))s.nodeType===Node.TEXT_NODE&&n.push(s);for(let s=0;s<t.childNodes.length;s++){let c=t.childNodes[s];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:s})}if(n.length===o.length){for(let s=0;s<n.length;s++)n[s].textContent!==o[s].node.textContent&&(n[s].textContent=o[s].node.textContent);return}let i=new Set,a=0;for(let{node:s,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==s.textContent&&(m.textContent=s.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(s.textContent??""),m)}for(let s of n)!i.has(s)&&s.parentNode===e&&e.removeChild(s)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}}return null}function Ce(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,s=[];for(let u of o){if(u.hasAttribute("data-forma-leaving"))continue;let d=u.getAttribute("data-forma-id");d?a.set(d,u):s.push(u)}let c=0,m=new Set;for(let u of i){let d=u.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<s.length;){let v=s[c];if(c++,v.tagName===u.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&u.hasAttribute("data-forma-state"))switch(Qt(b,u)){case"PRESERVE":Me(b,u),Ce(b,u,n);break;case"RESET":n.unmountScope(b),Me(b,u),on(b,u),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=u.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else Me(b,u),Ce(b,u,n);rn(e,b,u,i)}else{let v=u.cloneNode(!0),g=sn(e,u,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let _ of Array.from(E))n.mountScope(_)}}for(let u of o)if(!m.has(u)){if(u.parentElement!==e||u.hasAttribute("data-forma-leaving"))continue;u.hasAttribute("data-forma-state")&&n.unmountScope(u);let d=u.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(u)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let u=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(u&&u.parentElement===e){e.insertBefore(t,u);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}return null}function rt(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let s=en(a),c=document.createElement("div");c.appendChild(s);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let u=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){u=!0;break}}if(m.size>0&&!u){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{Ce(o,c,e)})}finally{e.reconnectObserver()}}}}var Ie=new Map;function gt(e){let t=Ie.get(e);t?t():L&&N(`$refetch: no data-fetch with id "${e}" found`)}function st(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var L=!1,H="mutable",U=!1,Pe=!0;function N(...e){(L||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var le=new Map;function ge(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Oe(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Oe(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=ge(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Oe(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=ge(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=ge(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let s=ge(t.getAttribute("data-forma-auto-containment"));s!==void 0&&(e.autoContainment=s)}}return e}function Z(e,t,n){if(!Pe)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=le.get(o);a?(a.count+=1,a.lastSeenAt=i):(le.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let s={kind:e,expr:t,reason:n,count:le.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:s}))}}catch{}}var at=Oe("locked-off");at&&(H=at,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0),H==="mutable"&&(U=!0));var X=an(),lt=X.lockUnsafeEval?"locked-off":X.unsafeEvalMode;lt&&(H=lt,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0));H==="mutable"&&typeof X.allowUnsafeEval=="boolean"&&(U=X.allowUnsafeEval);typeof X.diagnostics=="boolean"&&(Pe=X.diagnostics);var ln=X.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let s=o[a];if(!s?.style)continue;let c=s.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=s.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",u=s.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=s.style.getPropertyValue("contain"),g=s.style.getPropertyValue("content-visibility"),E=s.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(s.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(s.style.setProperty("content-visibility",m),b=!0),u!=="off"&&(!d||!E)&&(s.style.setProperty("contain-intrinsic-size",u),b=!0),b&&i++}return L&&i>0&&N("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,$e=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,_n=/^(\+\+|--)(\w+)$/,wn=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/(\w+)\s*:/g,xn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,Dn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Ln=/^\{item\.?|\}$/g,In=/\bevent\b|\$event\b/,On=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Ee=Symbol.for("forma-transition-state"),$n=2048,re=new Map;function ie(e,t){if(re.size>=$n){let n=re.keys().next().value;n!==void 0&&re.delete(n)}re.set(e,t)}var Be=new WeakMap,Fe=new WeakMap,ct=new Map,We=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval"]),Hn=(()=>{let e=[];for(let t of We){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Hn)if(o.test(t)||i.test(t))return n;return null}var ft=Symbol.for("forma-text-binding-cache");function Un(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Pn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function He(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,s=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(s,c).trim()),s=c+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}function Q(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,s=!1,c=!1,m=!1;for(let u=t;u<e.length;u++){let d=e[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,u),end:u}}return null}function Bn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,s=!1,c=!1,m=!1,u=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(u){u=!1;continue}if(g==="\\"&&(s||c||m)){u=!0;continue}if(s){g==="'"&&(s=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){s=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let u=Q(t,0,"{","}");if(!u)return null;let d=u.inner.trim(),b=t.slice(u.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,s=!1,c=!1,m=!1;for(let u=0;u<t.length;u++){let d=t[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,u).trim(),rest:t.slice(u+1).trim()}}return{body:t,rest:""}}function Fn(e,t){let n=e.trim();if(!Mn.test(n)||In.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=Q(n,o,"(",")");if(!i)return null;let a=M(i.inner.trim(),t);if(!a)return null;let s=n.slice(i.end+1).trim(),c=ut(s);if(!c||!c.body)return null;let m=ye(c.body,t);if(!m)return null;s=c.rest.trim();let u=null;if(s.startsWith("else")){s=s.slice(4).trim();let d=ut(s);if(!d||!d.body||(u=ye(d.body,t),!u))return null;s=d.rest.trim()}return s.length>0?null:d=>{$(()=>{a()?m(d):u?.(d)})}}function Wn(e){let t=e.trim();for(;t.startsWith("(");){let n=Q(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=ct.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,s;for(;(s=a.exec(e))!==null;)n.push(e.slice(i,s.index)),o.push(s[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return ct.set(e,c),c}var _t=new WeakMap;function Ve(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Vn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let s=At(a);_t.set(i,s),i.textContent=Ve(s,t)}}return Yn(n,t),n}function qn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=_t.get(o);i&&(o.textContent=Ve(i,t))}}var Gn=new WeakMap,jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function zn(e){for(let t of jn)if(e===t||e.startsWith(t))return!0;return!1}function se(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function ce(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function xe(e){let t=[],n;for(let o of se(e)){let i=ce(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function G(e){return Array.from(new Set(e.filter(Boolean)))}function he(e){return e?e.split(",").map(t=>ce(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,s=t[i%t.length]??0;a+s>o&&(o=a+s)}return o}function Jn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(he(n.transitionDuration),he(n.transitionDelay)),i=dt(he(n.animationDuration),he(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Ee];if(t)return t;let n={token:0,cancel:null};return e[Ee]=n,n}function ve(e){let t=e[Ee];t?.cancel&&t.cancel(),delete e[Ee]}function Ne(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=xe(e.getAttribute("data-transition")).classes,o=xe(e.getAttribute("data-transition:enter")),i=xe(e.getAttribute("data-transition:leave")),a=se(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),s=se(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=se(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=se(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),u=ce(e.getAttribute("data-transition:duration")??""),d=ce(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??u??void 0,b=ce(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??u??void 0;return{enter:G([...n,...o.classes]),enterFrom:G(a),enterTo:G(s),leave:G([...n,...i.classes]),leaveFrom:G(c),leaveTo:G(m),enterDurationMs:d,leaveDurationMs:b}}function be(e,t){for(let n of t)e.classList.remove(n)}function De(e,t){for(let n of t)e.classList.add(n)}function ue(e,t,n){let o=G([...t.base,...t.from,...t.to]),i=!1,a=null,s=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),s!=null&&cancelAnimationFrame(s),c!=null&&cancelAnimationFrame(c),be(e,o),n())};return De(e,t.base),De(e,t.from),be(e,t.to),s=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;be(e,t.from),De(e,t.to);let u=Jn(e,t.durationMs);if(u<=0){m();return}a=window.setTimeout(m,u+25)})}),m}function Kn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=ue(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=ue(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Xn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&be(e,G([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=ue(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)});return}i.cancel=ue(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let s=q(e);s.token===a&&(e.style.display="none",s.cancel=null)})}function Yn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!zn(a.name)&&a.value.includes("{item")){let s=At(a.value);i.push({attr:a.name,compiled:s}),o.setAttribute(a.name,Ve(s,t))}i.length>0&&Gn.set(o,i)}}function Zn(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let u=m[0];if(n+=u.length,We.has(u))return()=>{};if(n<e.length&&e[n]==="("){let d=Q(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of He(b)){let E=M(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:u,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:u,optional:c})}if(n!==e.length||a.length===0)return null;let s=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=s();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let u=c[m.name];if(typeof u!="function")return;let d=m.argFns.map(b=>b());c=u.apply(c,d)}}return c}}function M(e,t){let n=re.get(e);if(n)return n(t);let o=Qn(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;ie(e,()=>()=>i)}else if(St.test(e))ie(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);ie(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);ie(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],s=i[2];ie(e,c=>()=>c.getters[a]?.()?.[s])}}return o}function Qn(e,t){e=e.trim();let n=Wn(e);if(n!==e)return M(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=Zn(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],_=o[3].trim();if(We.has(E))return()=>{};let A=M(g,t);if(!A)return null;let S=[];for(let l of He(_)){let p=M(l,t);if(!p)return null;S.push(p)}return()=>{let l=A(),p=l?.[E];if(typeof p!="function")return;let r=S.map(f=>f());return p.apply(l,r)}}if(e.startsWith("!")){let g=M(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=M(i[1],t),E,_=i[2];if(Tn.test(_)?E=Number(_):E=_.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=Q(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let _=He(E),A=[],S=!0;for(let l of _){let p=M(l.trim(),t);if(!p){S=!1;break}A.push(p)}if(S)return()=>A.map(l=>l())}}let a=e.match(dn);if(a){let g=M(a[1].trim(),t),E=M(a[2].trim(),t),_=M(a[3].trim(),t);if(g&&E&&_)return()=>g()?E():_()}let s=e.match(mn);if(s){let g=M(s[1].trim(),t),E=M(s[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=M(c[1].trim(),t),E=M(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=M(m[1].trim(),t),E=M(m[2].trim(),t);if(g&&E)return()=>g()||E()}let u=e.match(hn);if(u){let g=M(u[1].trim(),t),E=M(u[3].trim(),t);if(g&&E){let _=u[2];return()=>{let A=g(),S=E();switch(_){case"===":return A===S;case"!==":return A!==S;case"==":return A==S;case"!=":return A!=S;case">":return A>S;case"<":return A<S;case">=":return A>=S;case"<=":return A<=S}}}}let d=e.match(vn);if(d){let g=M(d[1].trim(),t),E=M(d[3].trim(),t);if(g&&E){let _=d[2];return()=>{let A=g(),S=E();switch(_){case"*":return A*S;case"/":return A/S;case"%":return A%S}}}}let b=e.match(bn);if(b){let g=M(b[1].trim(),t),E=M(b[3].trim(),t);if(g&&E){let _=b[2];return()=>{let A=g(),S=E();return _==="+"?A+S:A-S}}}let v=e.match(En);if(v){let g=v[1],E=[],_=[],A=0,S=new RegExp(yn.source,"g"),l;for(;(l=S.exec(g))!==null;){E.push(g.slice(A,l.index));let p=M(l[1].trim(),t);if(!p)return null;_.push(p),A=S.lastIndex}return E.push(g.slice(A)),()=>{let p=E[0];for(let r=0;r<_.length;r++)p+=String(_[r]()??""),p+=E[r+1]??"";return p}}return null}function wt(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function j(e,t){let n=e.replace($e,"").trim(),o=wt(Be,t),i=o.get(n);if(i)return i;let a=M(n,t);if(a)return o.set(n,a),a;if(!U){N("buildEvaluator: blocked unsafe eval fallback for expression:",n),Z("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in expression`;throw Z("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){let v=t.getters[b];return v?v():void 0}}),u=()=>c(m);return o.set(n,u),u}catch{Z("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function ye(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Fn(n,t);if(o)return o;let i=Bn(n);if(i.length>1){let v=i.map(g=>ye(g,t));return v.every(g=>g!==null)?g=>{$(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,s=a.match(An);if(s){let v=s[1],g=s[2];return()=>{$(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(_n);if(c){let v=c[1],g=c[2];return()=>{$(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(wn);if(m&&m[1]===m[2]){let v=m[1];return()=>{$(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let u=a.match(kn);if(u){let v=u[1],g=M(u[2].trim(),t);if(g)return L&&N(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{$(()=>{let E=g();L&&N(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=M(d[3].trim(),t);if(E)return()=>{$(()=>{let _=t.getters[v]?.()??0,A=E();switch(g){case"+=":t.setters[v]?.(_+A);break;case"-=":t.setters[v]?.(_-A);break;case"*=":t.setters[v]?.(_*A);break;case"/=":t.setters[v]?.(_/A);break}})}}let b=a.match(On);if(b){let v=b[1];return()=>gt(v)}return null}function eo(e,t){let n=e.trim();if(n.startsWith("{")){let c=Q(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=wt(Fe,t),i=o.get(n);if(i)return i;let a=ye(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){N("buildHandler: blocked unsafe eval fallback for expression:",n),Z("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in handler`;throw Z("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{$(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Z("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var to=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{try{t=JSON.parse(e.replace(Cn,'"$1":'))}catch{return{}}}for(let n of to)n in t&&delete t[n];return t}function no(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);L&&(N("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&N("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[s,c]of Object.entries(n)){let[m,u]=Y(c);i[s]=m,a[s]=u}return i.$refetch=()=>gt,{getters:i,setters:a}}function z(e,t,n){let o=so(e),i=!o||o.has("data-computed")?e.getAttribute("data-computed"):null;if(i){let S=i.split(/;\s*(?=\w+\s*=[^=])/);for(let l of S){let p=l.trim();if(!p)continue;let r=p.match(xn);if(r){let f=r[1],h=r[2],y=t.getters[f];delete t.getters[f];let T=j(`{${h}}`,t),C=ke(T);t.getters[f]=C,y||delete t.setters[f]}}}let a=!o||o.has("data-text")?e.getAttribute("data-text"):null;if(a){let S=j(a,t),l=F(()=>{Pn(e,Un(S()))});n.push(l)}let s=!o||o.has("data-show")?e.getAttribute("data-show"):null;if(s){let S=j(s,t),l=Ne(e);if(L){let f=e.tagName.toLowerCase(),h=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-show="${s}" on <${f}${h}>`)}let p=!1,r=F(()=>{let f=!!S();L&&N(`data-show effect: "${s}" \u2192 ${f}`),Xn(e,f,l,!p),p=!0});n.push(r),l&&n.push(()=>ve(e))}let c=!o||o.has("data-if")?e.getAttribute("data-if"):null;if(c){let S=j(c,t),l=Ne(e),p=document.createComment("forma-if"),r=e.parentNode,f=!0,h=!1,y=F(()=>{let T=!!S();T&&!f?(ve(e),e.removeAttribute("data-forma-leaving"),h&&l?Kn(e,r,p,l):r?.insertBefore(e,p),f=!0):!T&&f&&(h&&l?mt(e,l,()=>{e.parentNode&&(r?.insertBefore(p,e),e.remove())}):(r?.insertBefore(p,e),e.remove()),f=!1),h=!0});n.push(y),l&&n.push(()=>ve(e))}let m=!o||o.has("data-model")?e.getAttribute("data-model"):null;if(m){let S=m.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r=e,f=F(()=>{let T=l();r.type==="checkbox"?r.checked=!!T:r.value=String(T??"")});n.push(f);let h=r.type==="checkbox"?"change":"input",y=()=>{r.type==="checkbox"?p(r.checked):r.type==="number"||r.type==="range"?p(Number(r.value)):p(r.value)};r.addEventListener(h,y),n.push(()=>{r.removeEventListener(h,y)})}}let u=!o||ao(o,"data-on:","data-class:","data-bind:"),d=e.attributes;if(u)for(let S=0;S<d.length;S++){let l=d[S],p=l.name;if(p.startsWith("data-on:")){let r=p.slice(8),f=eo(l.value,t),h=f.handler;if(L){let y=e.tagName.toLowerCase(),T=e.id?`#${e.id}`:"",C=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-on:${r}="${l.value}" on <${y}${T}${C}>`)}if(f.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),L){let y=l.value,T=C=>{N(`HANDLER FIRED: data-on:${r}="${y}"`,"isTrusted:",C.isTrusted),h(C)};e.addEventListener(r,T),n.push(()=>{e.removeEventListener(r,T)})}else e.addEventListener(r,h),n.push(()=>{e.removeEventListener(r,h)})}else if(p.startsWith("data-class:")){let r=p.slice(11),f=j(l.value,t),h=F(()=>{e.classList.toggle(r,!!f())});n.push(h)}else if(p.startsWith("data-bind:")){let r=p.slice(10),f=j(l.value,t),h=F(()=>{let y=f();y==null||y===!1?e.removeAttribute(r):e.setAttribute(r,String(y))});n.push(h)}}let b=!o||o.has("data-persist")?e.getAttribute("data-persist"):null;if(b){let S=b.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r="forma:"+S;try{let h=localStorage.getItem(r);h!==null&&p(JSON.parse(h))}catch{}let f=F(()=>{try{localStorage.setItem(r,JSON.stringify(l()))}catch{}});n.push(f)}}let v=!o||o.has("data-list")?e.getAttribute("data-list"):null;if(v){let S=j(v,t),l=e.children[0];if(l){let C=function(x){let k=x;if(Array.isArray(k.__formaDisposers)){for(let w of k.__formaDisposers)try{w()}catch{}delete k.__formaDisposers}},P=function(x,k){let w=Vn(p,x),D=st(t,{item:x,index:k}),R=[];z(w,D,R);for(let B of Array.from(w.querySelectorAll("*")))z(B,D,R);return w.__formaDisposers=R,w},ee=function(x,k,w){C(x),qn(x,k);let D=st(t,{item:k,index:w}),R=[];z(x,D,R);for(let B of Array.from(x.querySelectorAll("*")))z(B,D,R);x.__formaDisposers=R};var E=C,_=P,A=ee;let p=l.cloneNode(!0);e.removeChild(l);let r=p.getAttribute("data-key"),f=r?r.replace(Ln,"").trim():null,h=Ne(e),y=[],T=[],te=h?{onInsert:x=>{let k=x;if(!k.setAttribute)return;let w=q(k);w.token+=1;let D=w.token;w.cancel&&w.cancel(),w.cancel=ue(k,{base:h.enter,from:h.enterFrom,to:h.enterTo,durationMs:h.enterDurationMs},()=>{let R=q(k);R.token===D&&(R.cancel=null)})},onBeforeRemove:(x,k)=>{let w=x;if(!w.setAttribute){k();return}C(x),mt(w,h,()=>{k()})}}:void 0,ne=F(()=>{let x=S();if(!Array.isArray(x)){for(let w of T)C(w),e.removeChild(w);y=[],T=[];return}if(h){let w=e.querySelectorAll("[data-forma-leaving]");for(let D of Array.from(w))ve(D),D.removeAttribute("data-forma-leaving"),D.parentNode&&D.parentNode.removeChild(D)}let k=new Set(T);if(f){let w=Re(e,y,x,T,R=>String(R?.[f]??""),R=>{let B=x.indexOf(R);return P(R,B)},(R,B)=>{let O=x.indexOf(B);ee(R,B,O)},void 0,te),D=new Set(w.nodes);for(let R of k)if(!D.has(R)){if(R.hasAttribute?.("data-forma-leaving"))continue;C(R)}y=w.items,T=w.nodes}else{let w=x.map((O,de)=>({__idx:de,__item:O})),R=Re(e,y,w,T,O=>O.__idx,O=>P(O.__item,O.__idx),(O,de)=>ee(O,de.__item,de.__idx),void 0,te),B=new Set(R.nodes);for(let O of k)if(!B.has(O)){if(O.hasAttribute?.("data-forma-leaving"))continue;C(O)}y=R.items,T=R.nodes}});n.push(ne)}}let g=!o||o.has("data-fetch")?e.getAttribute("data-fetch"):null;if(g){let S=g.match(Nn);if(S){let l=S[1].trim(),p=S[2].trim(),r=S[3]?.trim()??"",f="GET",h=l,y=l.match(Dn);y&&(f=y[1].toUpperCase(),h=y[2].trim());let T,C,P;for(let k of r.split("|").filter(Boolean)){let[w,D]=k.split(":").map(R=>R.trim());w==="loading"?T=D:w==="error"?C=D:w==="poll"&&(P=parseInt(D??"0",10))}let[ee,te]=Y(null);if(t.getters[p]=ee,t.setters[p]=te,T){let[k,w]=Y(!1);t.getters[T]=k,t.setters[T]=w}if(C){let[k,w]=Y(null);t.getters[C]=k,t.setters[C]=w}let ne=()=>{T&&t.setters[T](!0),fetch(h,{method:f}).then(k=>k.json()).then(k=>{te(k),T&&t.setters[T](!1)}).catch(k=>{C&&t.setters[C](k.message),T&&t.setters[T](!1)})},x=e.getAttribute("data-fetch-id");if(x&&(Ie.set(x,ne),n.push(()=>Ie.delete(x))),ne(),P&&P>0){let k=setInterval(ne,P);n.push(()=>clearInterval(k))}}}}var ei=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function oo(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function io(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ro(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function so(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function ao(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function J(e){if(e.__formaDisposers){L&&N("mountScope: SKIPPED (already mounted)");return}let t=no(e),n=[];z(e,t,n);let o=0,i=ro();if(i){let a=e.querySelectorAll(i);for(let s=0;s<a.length;s++)z(a[s],t,n),o++}else{let a=e.querySelectorAll("*");for(let s=0;s<a.length;s++){let c=a[s];oo(c)&&(z(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",L&&N("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function K(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,lo=40,ae=[],fe=!1;function co(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: REMOVED scope"),K(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)K(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: ADDED scope via mutation"),J(o));let i=o.querySelectorAll("[data-forma-state]");L&&i.length>0&&N("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let s=i[a];s.closest("[data-forma-leaving]")||J(s)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;K(t),t.hasAttribute("data-forma-state")&&J(t)}}async function Mt(){try{for(;ae.length>0;){let e=ae.splice(0,lo);for(let t=0;t<e.length;t++)co(e[t]);ae.length>0&&await ht()}}finally{fe=!1,ae.length>0&&!fe&&(fe=!0,Mt())}}function fo(e){L&&N("MutationObserver: queued",e.length,"mutation(s)"),ae.push(...e),!fe&&(fe=!0,Mt())}function uo(){if(W)return;W=new MutationObserver(fo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function mo(){W&&(W.disconnect(),W=null)}function Ue(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");L&&N("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))J(t);uo(),L&&N("initRuntime: MutationObserver started")}function po(){mo();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))K(t)}function go(e){e.hasAttribute("data-forma-state")&&J(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))J(n)}function ho(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Ue):Ue());function vo(e){L=e}function bo(e){H!==e&&(H=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),Be=new WeakMap,Fe=new WeakMap)}function Eo(e){if(H!=="mutable"){N(`setUnsafeEval ignored (mode=${H}); unsafe fallback is locked`);return}U!==e&&(U=e,Be=new WeakMap,Fe=new WeakMap)}function yo(){return H}function So(e){Pe=e}function To(){return Array.from(le.values()).map(e=>({...e}))}function Ao(){le.clear()}function _o(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let s of Object.keys(o.getters)){let c=o.getters[s]();a[s]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function wo(e,t,n){let o=e.__formaScope;o?.setters[t]&&$(()=>{o.setters[t](n)})}function ko(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);$(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var Le=null;function Ro(){return Le||(Le=rt({mountScope:J,unmountScope:K,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:$})),Le}function Mo(e,t){Ro()(e,t)}return It(Co);})();
"use strict";var FormaRuntime=(()=>{var we=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var xt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)we(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Nt(t))!xt.call(e,i)&&i!==n&&we(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(we({},"__esModule",{value:!0}),e);var xo={};Dt(xo,{applyContainmentHints:()=>vt,clearDiagnostics:()=>_o,destroyRuntime:()=>ho,getDiagnostics:()=>wo,getScopes:()=>ko,getUnsafeEvalMode:()=>To,initRuntime:()=>We,mount:()=>vo,reconcile:()=>No,resetScope:()=>Mo,setDebug:()=>Eo,setDiagnostics:()=>Ao,setDirectiveMap:()=>so,setScopeValue:()=>Ro,setUnsafeEval:()=>So,setUnsafeEvalMode:()=>yo,unmount:()=>bo,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:r,updateDirtyFlag:f,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(u,p){let s=p.depsTail;if(s!==void 0&&s.dep===u)return;let l=s!==void 0?s.nextDep:p.deps;if(l!==void 0&&l.dep===u){p.depsTail=l;return}let h=u.subsTail;if(!(h!==void 0&&h.sub===p&&T(h,p)))return g(u,p,l,s)}function r(u){let p=u.nextSub,s,l=0,h=32;e:do{let y=u.sub,S=y.flags,w=!1;if(S&244?S&16&&!(S&4)?(y.flags=S&-17|h|8,w=!0):!(S&224)&&T(u,y)&&(y.flags=S|16|h|8,w=y.subs!==void 0):(y.flags=S|h|8,w=!0),w){let x=y.subs;if(x!==void 0){u=x,x.nextSub!==void 0?(s={target:p,linked:s},++l,p=u.nextSub,h=64):h=S&2?128:64;continue}S&2&&(n[i++]=y)}else S&(4|h)?!(S&h)&&S&224&&T(u,y)&&(y.flags=S|h):(y.flags=S|h|8,(S&10)===2&&(n[i++]=y));if((u=p)!==void 0){p=u.nextSub,h=l?64:32;continue}for(;l--;)if(u=s.target,s=s.linked,u!==void 0){p=u.nextSub,h=l?64:32;continue e}break}while(!0)}function c(u){u.depsTail=void 0,u.flags=u.flags&-249|4}function m(u){let p=u.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(k(s),p.nextDep=void 0)}else u.deps!==void 0&&(k(u.deps),u.deps=void 0);u.flags&=-5}function f(u,p){return E(u.deps)?(u.flags=p|32,!0):(u.flags=p&-65,!1)}function d(u,p){if(p&32||E(u.deps)){if(e(u)){let s=u.subs;s!==void 0&&A(s)}}else u.flags=p&-65}function b(u,p){if(p&128){u.flags=p&-129;let s=u.deps;do{let l=s.dep;"flags"in l&&l.flags&2&&l.flags&224&&t(l),s=s.nextDep}while(s!==void 0)}}function v(){for(;o<i;){let u=n[o];n[o++]=void 0,t(u)||(u.flags&=-9)}o=0,i=0}function g(u,p,s,l){let h={dep:u,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(l===void 0?p.deps=h:l.nextDep=h,u.subs===void 0)u.subs=h;else{let y=u.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,u.subsTail=h,h}function E(u){let p,s=0,l;e:do{l=!1;let h=u.dep;if(u.sub.flags&32)l=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let S=h.subs;S.nextSub!==void 0&&A(S),l=!0}}else if((y&65)===65){(u.nextSub!==void 0||u.prevSub!==void 0)&&(p={target:u,linked:p}),u=h.deps,++s;continue}}if(!l&&u.nextDep!==void 0){u=u.nextDep;continue}for(;s;){--s;let y=u.sub,S=y.subs;if(l){if(e(y)){S.nextSub!==void 0?(u=p.target,p=p.linked,A(S)):u=S;continue}}else y.flags&=-65;if(S.nextSub!==void 0?(u=p.target,p=p.linked):u=S,u.nextDep!==void 0){u=u.nextDep;continue e}l=!1}return l}while(!0)}function A(u){do{let p=u.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[i++]=p)),u=u.nextSub}while(u!==void 0)}function T(u,p){let s=p.depsTail;if(s!==void 0){let l=p.deps;do{if(l===u)return!0;if(l===s)break;l=l.nextDep}while(l!==void 0)}return!1}function k(u){do{let p=u.dep,s=u.nextDep,l=u.nextSub,h=u.prevSub;if(l!==void 0?l.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=l:p.subs=l,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let S=p.deps;if(S!==void 0){u=S,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}u=s}while(u!==void 0)}}var{link:re,propagate:Ht,updateDirtyFlag:Pt,startTracking:_e,endTracking:ke,processEffectNotifications:ze,processComputedUpdate:Ut,processPendingInnerEffects:Je}=$t({updateComputed(e){let t=O;O=e,_e(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{O=t,ke(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),Ke=[],Re=0,O,he;function Xe(){++Re}function Ye(){--Re||ze()}function Ze(){Ke.push(O),O=void 0}function Qe(){O=Ke.pop()}function et(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function tt(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function nt(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};O!==void 0?re(t,O):he!==void 0&&re(t,he);let n=O;O=t;try{t.fn()}finally{O=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Pt(e,t)){let n=O;O=e,_e(e);try{e.fn()}finally{O=n,ke(e)}}else Je(e,e.flags);return!0}function Ft(e){return e.flags&128?(Je(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Ut(this,e),O!==void 0?re(this,O):he!==void 0&&re(this,he),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),Re||ze())}}else return O!==void 0&&re(this,O),this.currentValue}function qt(){_e(this),ke(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ze();let n=e();Qe(),e(t(n))}function Z(e){let t=et(e);return[t,i=>Gt(t,i)]}var Me=null;function ot(e){Me&&Me.disposers.push(e)}function it(){return Me!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=nt(e);return it()&&ot(t),t}function Ce(e){return tt(e)}function H(e){Xe();try{e()}finally{Ye()}}function rt(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let f=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<f?d=v+1:b=v}n[d]=f,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let r=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)r[m]=c,c=i[c];return r}var Jt=32;function Kt(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length,b=new Array(f);for(let s=0;s<f;s++)b[s]=i(t[s]);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=-1;for(let y=0;y<f;y++)if(!g[y]&&b[y]===l){h=y,g[y]=1;break}v[s]=h}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Ne(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length;if(d===0){for(let s=0;s<f;s++)if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(f===0){let s=new Array(d);for(let l=0;l<d;l++){let h=a(n[l]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),s[l]=h}return{nodes:s,items:n}}if(f<Jt)return Kt(e,t,n,o,i,a,r,c,m);let b=new Map;for(let s=0;s<f;s++)b.set(i(t[s]),s);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=b.get(l);h!==void 0?(v[s]=h,g[h]=1):v[s]=-1}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function st(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",r=t.getAttribute("data-forma-state")??"{}",c=st(a),m=st(r);return Zt(c,m)?"PRESERVE":"RESET"}var ve=null;function en(e){return ve||(ve=document.createElement("template")),ve.innerHTML=e,ve.content}function xe(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,r=e.attributes;for(let m=0;m<r.length;m++)if(r[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let f=c[m];if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.getAttribute(f.name)!==f.value&&e.setAttribute(f.name,f.value)}for(let m=r.length-1;m>=0;m--){let f=r[m];if(!t.hasAttribute(f.name)){if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.removeAttribute(f.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let r of Array.from(e.childNodes))r.nodeType===Node.TEXT_NODE&&n.push(r);for(let r=0;r<t.childNodes.length;r++){let c=t.childNodes[r];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:r})}if(n.length===o.length){for(let r=0;r<n.length;r++)n[r].textContent!==o[r].node.textContent&&(n[r].textContent=o[r].node.textContent);return}let i=new Set,a=0;for(let{node:r,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==r.textContent&&(m.textContent=r.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(r.textContent??""),m)}for(let r of n)!i.has(r)&&r.parentNode===e&&e.removeChild(r)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}}return null}function De(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,r=[];for(let f of o){if(f.hasAttribute("data-forma-leaving"))continue;let d=f.getAttribute("data-forma-id");d?a.set(d,f):r.push(f)}let c=0,m=new Set;for(let f of i){let d=f.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<r.length;){let v=r[c];if(c++,v.tagName===f.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&f.hasAttribute("data-forma-state"))switch(Qt(b,f)){case"PRESERVE":xe(b,f),De(b,f,n);break;case"RESET":n.unmountScope(b),xe(b,f),on(b,f),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=f.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else xe(b,f),De(b,f,n);rn(e,b,f,i)}else{let v=f.cloneNode(!0),g=sn(e,f,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let A of Array.from(E))n.mountScope(A)}}for(let f of o)if(!m.has(f)){if(f.parentElement!==e||f.hasAttribute("data-forma-leaving"))continue;f.hasAttribute("data-forma-state")&&n.unmountScope(f);let d=f.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(f)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let f=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(f&&f.parentElement===e){e.insertBefore(t,f);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}return null}function at(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let r=en(a),c=document.createElement("div");c.appendChild(r);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let f=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){f=!0;break}}if(m.size>0&&!f){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{De(o,c,e)})}finally{e.reconnectObserver()}}}}var Pe=new Map;function gt(e){let t=Pe.get(e);t?t():I&&D(`$refetch: no data-fetch with id "${e}" found`)}function Le(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var I=!1,P="mutable",U=!1,Ve=!0;function D(...e){(I||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var ue=new Map;function be(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Ue(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Ue(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=be(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Ue(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=be(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=be(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let r=be(t.getAttribute("data-forma-auto-containment"));r!==void 0&&(e.autoContainment=r)}}return e}function Q(e,t,n){if(!Ve)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=ue.get(o);a?(a.count+=1,a.lastSeenAt=i):(ue.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let r={kind:e,expr:t,reason:n,count:ue.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:r}))}}catch{}}var lt=Ue("locked-off");lt&&(P=lt,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0),P==="mutable"&&(U=!0));var Y=an(),ct=Y.lockUnsafeEval?"locked-off":Y.unsafeEvalMode;ct&&(P=ct,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0));P==="mutable"&&typeof Y.allowUnsafeEval=="boolean"&&(U=Y.allowUnsafeEval);typeof Y.diagnostics=="boolean"&&(Ve=Y.diagnostics);var ln=Y.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let r=o[a];if(!r?.style)continue;let c=r.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=r.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",f=r.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=r.style.getPropertyValue("contain"),g=r.style.getPropertyValue("content-visibility"),E=r.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(r.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(r.style.setProperty("content-visibility",m),b=!0),f!=="off"&&(!d||!E)&&(r.style.setProperty("contain-intrinsic-size",f),b=!0),b&&i++}return I&&i>0&&D("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,Be=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,wn=/^(\+\+|--)(\w+)$/,_n=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,xn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Dn=/^\{item\.?|\}$/g,Ln=/\bevent\s*[.([]|\$event\b/,In=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Te=Symbol.for("forma-transition-state"),On=2048,ae=new Map;function se(e,t){if(ae.size>=On){let n=ae.keys().next().value;n!==void 0&&ae.delete(n)}ae.set(e,t)}var qe=new WeakMap,Ge=new WeakMap,le=new Map,$n=2048;function Hn(e,t){if(le.size>=$n){let n=le.keys().next().value;n!==void 0&&le.delete(n)}le.set(e,t)}var ee=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval","Function"]),Pn=(()=>{let e=[];for(let t of ee){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Pn)if(o.test(t)||i.test(t))return n;if(t.includes("[")){let n=Un(t);for(let o of n){if(!o.includes("+"))continue;let i=o.match(/['"`]([^'"`]*?)['"`]/g);if(!i)continue;let a=i.map(r=>r.slice(1,-1)).join("");if(ee.has(a))return a}}return null}function Un(e){let t=[],n=0,o=-1;for(let i=0;i<e.length;i++)e[i]==="["?(n===0&&(o=i+1),n++):e[i]==="]"&&(n--,n===0&&o>=0&&(t.push(e.slice(o,i)),o=-1));return t}var ft=Symbol.for("forma-text-binding-cache");function Bn(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Fn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function Fe(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,r=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(r,c).trim()),r=c+1)}return t.push(e.slice(r).trim()),t.filter(Boolean)}function te(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,r=!1,c=!1,m=!1;for(let f=t;f<e.length;f++){let d=e[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,f),end:f}}return null}function Wn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,r=!1,c=!1,m=!1,f=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(f){f=!1;continue}if(g==="\\"&&(r||c||m)){f=!0;continue}if(r){g==="'"&&(r=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){r=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let f=te(t,0,"{","}");if(!f)return null;let d=f.inner.trim(),b=t.slice(f.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,r=!1,c=!1,m=!1;for(let f=0;f<t.length;f++){let d=t[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,f).trim(),rest:t.slice(f+1).trim()}}return{body:t,rest:""}}function Vn(e,t){let n=e.trim();if(!Mn.test(n)||Ln.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=te(n,o,"(",")");if(!i)return null;let a=C(i.inner.trim(),t);if(!a)return null;let r=n.slice(i.end+1).trim(),c=ut(r);if(!c||!c.body)return null;let m=Ae(c.body,t);if(!m)return null;r=c.rest.trim();let f=null;if(r.startsWith("else")){r=r.slice(4).trim();let d=ut(r);if(!d||!d.body||(f=Ae(d.body,t),!f))return null;r=d.rest.trim()}return r.length>0?null:d=>{H(()=>{a()?m(d):f?.(d)})}}function qn(e){let t=e.trim();for(;t.startsWith("(");){let n=te(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=le.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,r;for(;(r=a.exec(e))!==null;)n.push(e.slice(i,r.index)),o.push(r[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return Hn(e,c),c}var wt=new WeakMap;function je(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Gn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let r=At(a);wt.set(i,r),i.textContent=je(r,t)}}return Qn(n,t),n}function jn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=wt.get(o);i&&(o.textContent=je(i,t))}}var zn=new WeakMap,Jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function Kn(e){for(let t of Jn)if(e===t||e.startsWith(t))return!0;return!1}function ce(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function de(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function Ie(e){let t=[],n;for(let o of ce(e)){let i=de(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function j(e){return Array.from(new Set(e.filter(Boolean)))}function Ee(e){return e?e.split(",").map(t=>de(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,r=t[i%t.length]??0;a+r>o&&(o=a+r)}return o}function Xn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(Ee(n.transitionDuration),Ee(n.transitionDelay)),i=dt(Ee(n.animationDuration),Ee(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Te];if(t)return t;let n={token:0,cancel:null};return e[Te]=n,n}function ye(e){let t=e[Te];t?.cancel&&t.cancel(),delete e[Te]}function Oe(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=Ie(e.getAttribute("data-transition")).classes,o=Ie(e.getAttribute("data-transition:enter")),i=Ie(e.getAttribute("data-transition:leave")),a=ce(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),r=ce(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=ce(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=ce(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),f=de(e.getAttribute("data-transition:duration")??""),d=de(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??f??void 0,b=de(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??f??void 0;return{enter:j([...n,...o.classes]),enterFrom:j(a),enterTo:j(r),leave:j([...n,...i.classes]),leaveFrom:j(c),leaveTo:j(m),enterDurationMs:d,leaveDurationMs:b}}function Se(e,t){for(let n of t)e.classList.remove(n)}function $e(e,t){for(let n of t)e.classList.add(n)}function pe(e,t,n){let o=j([...t.base,...t.from,...t.to]),i=!1,a=null,r=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),r!=null&&cancelAnimationFrame(r),c!=null&&cancelAnimationFrame(c),Se(e,o),n())};return $e(e,t.base),$e(e,t.from),Se(e,t.to),r=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;Se(e,t.from),$e(e,t.to);let f=Xn(e,t.durationMs);if(f<=0){m();return}a=window.setTimeout(m,f+25)})}),m}function Yn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=pe(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=pe(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Zn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&Se(e,j([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=pe(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)});return}i.cancel=pe(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let r=q(e);r.token===a&&(e.style.display="none",r.cancel=null)})}function Qn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!Kn(a.name)&&a.value.includes("{item")){let r=At(a.value);i.push({attr:a.name,compiled:r}),o.setAttribute(a.name,je(r,t))}i.length>0&&zn.set(o,i)}}function eo(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let f=m[0];if(n+=f.length,ee.has(f))return()=>{};if(n<e.length&&e[n]==="("){let d=te(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of Fe(b)){let E=C(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:f,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:f,optional:c})}if(n!==e.length||a.length===0)return null;let r=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=r();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let f=c[m.name];if(typeof f!="function")return;let d=m.argFns.map(b=>b());c=f.apply(c,d)}}return c}}function C(e,t){let n=ae.get(e);if(n)return n(t);let o=to(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;se(e,()=>()=>i)}else if(St.test(e))se(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);se(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);se(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],r=i[2];se(e,c=>()=>c.getters[a]?.()?.[r])}}return o}function to(e,t){e=e.trim();let n=qn(e);if(n!==e)return C(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=eo(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],A=o[3].trim();if(ee.has(E))return()=>{};let T=C(g,t);if(!T)return null;let k=[];for(let u of Fe(A)){let p=C(u,t);if(!p)return null;k.push(p)}return()=>{let u=T(),p=u?.[E];if(typeof p!="function")return;let s=k.map(l=>l());return p.apply(u,s)}}if(e.startsWith("!")){let g=C(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=C(i[1],t),E,A=i[2];if(Tn.test(A)?E=Number(A):E=A.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=te(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let A=Fe(E),T=[],k=!0;for(let u of A){let p=C(u.trim(),t);if(!p){k=!1;break}T.push(p)}if(k)return()=>T.map(u=>u())}}let a=e.match(dn);if(a){let g=C(a[1].trim(),t),E=C(a[2].trim(),t),A=C(a[3].trim(),t);if(g&&E&&A)return()=>g()?E():A()}let r=e.match(mn);if(r){let g=C(r[1].trim(),t),E=C(r[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=C(c[1].trim(),t),E=C(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=C(m[1].trim(),t),E=C(m[2].trim(),t);if(g&&E)return()=>g()||E()}let f=e.match(hn);if(f){let g=C(f[1].trim(),t),E=C(f[3].trim(),t);if(g&&E){let A=f[2];return()=>{let T=g(),k=E();switch(A){case"===":return T===k;case"!==":return T!==k;case"==":return T==k;case"!=":return T!=k;case">":return T>k;case"<":return T<k;case">=":return T>=k;case"<=":return T<=k}}}}let d=e.match(vn);if(d){let g=C(d[1].trim(),t),E=C(d[3].trim(),t);if(g&&E){let A=d[2];return()=>{let T=g(),k=E();switch(A){case"*":return T*k;case"/":return T/k;case"%":return T%k}}}}let b=e.match(bn);if(b){let g=C(b[1].trim(),t),E=C(b[3].trim(),t);if(g&&E){let A=b[2];return()=>{let T=g(),k=E();return A==="+"?T+k:T-k}}}let v=e.match(En);if(v){let g=v[1],E=[],A=[],T=0,k=new RegExp(yn.source,"g"),u;for(;(u=k.exec(g))!==null;){E.push(g.slice(T,u.index));let p=C(u[1].trim(),t);if(!p)return null;A.push(p),T=k.lastIndex}return E.push(g.slice(T)),()=>{let p=E[0];for(let s=0;s<A.length;s++)p+=String(A[s]()??""),p+=E[s+1]??"";return p}}return null}function _t(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function z(e,t){let n=e.replace(Be,"").trim(),o=_t(qe,t),i=o.get(n);if(i)return i;let a=C(n,t);if(a)return o.set(n,a),a;if(!U){D("buildEvaluator: blocked unsafe eval fallback for expression:",n),Q("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in expression`;throw Q("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){if(ee.has(b))return;let v=t.getters[b];return v?v():void 0}}),f=()=>c(m);return o.set(n,f),f}catch{Q("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function Ae(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Vn(n,t);if(o)return o;let i=Wn(n);if(i.length>1){let v=i.map(g=>Ae(g,t));return v.every(g=>g!==null)?g=>{H(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,r=a.match(An);if(r){let v=r[1],g=r[2];return()=>{H(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(wn);if(c){let v=c[1],g=c[2];return()=>{H(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(_n);if(m&&m[1]===m[2]){let v=m[1];return()=>{H(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let f=a.match(kn);if(f){let v=f[1],g=C(f[2].trim(),t);if(g)return I&&D(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{H(()=>{let E=g();I&&D(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=C(d[3].trim(),t);if(E)return()=>{H(()=>{let A=t.getters[v]?.()??0,T=E();switch(g){case"+=":t.setters[v]?.(A+T);break;case"-=":t.setters[v]?.(A-T);break;case"*=":t.setters[v]?.(A*T);break;case"/=":t.setters[v]?.(A/T);break}})}}let b=a.match(In);if(b){let v=b[1];return()=>gt(v)}return null}function no(e,t){let n=e.trim();if(n.startsWith("{")){let c=te(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=_t(Ge,t),i=o.get(n);if(i)return i;let a=Ae(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){D("buildHandler: blocked unsafe eval fallback for expression:",n),Q("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in handler`;throw Q("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){if(ee.has(v))return;let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{H(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Q("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var oo=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{return I&&D("parseState: Invalid JSON in data-forma-state \u2014 use valid JSON with quoted keys. Got:",e.slice(0,200)),{}}for(let n of oo)n in t&&delete t[n];return t}function io(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);I&&(D("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&D("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[r,c]of Object.entries(n)){let[m,f]=Z(c);i[r]=m,a[r]=f}return i.$refetch=()=>gt,{getters:i,setters:a}}function J(e,t,n){t=Le(t,{$el:e,$dispatch:(u,p)=>{e.dispatchEvent(new CustomEvent(u,{bubbles:!0,composed:!0,detail:p}))}});let i=lo(e),a=!i||i.has("data-computed")?e.getAttribute("data-computed"):null;if(a){let u=a.split(/;\s*(?=\w+\s*=[^=])/);for(let p of u){let s=p.trim();if(!s)continue;let l=s.match(Cn);if(l){let h=l[1],y=l[2],S=t.getters[h];delete t.getters[h];let w=z(`{${y}}`,t),x=Ce(w);t.getters[h]=x,S||delete t.setters[h]}}}let r=!i||i.has("data-text")?e.getAttribute("data-text"):null;if(r){let u=z(r,t),p=F(()=>{Fn(e,Bn(u()))});n.push(p)}let c=!i||i.has("data-show")?e.getAttribute("data-show"):null;if(c){let u=z(c,t),p=Oe(e);if(I){let h=e.tagName.toLowerCase(),y=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-show="${c}" on <${h}${y}>`)}let s=!1,l=F(()=>{let h=!!u();I&&D(`data-show effect: "${c}" \u2192 ${h}`),Zn(e,h,p,!s),s=!0});n.push(l),p&&n.push(()=>ye(e))}let m=!i||i.has("data-if")?e.getAttribute("data-if"):null;if(m){let u=z(m,t),p=Oe(e),s=document.createComment("forma-if"),l=e.parentNode,h=!0,y=!1,S=F(()=>{let w=!!u();w&&!h?(ye(e),e.removeAttribute("data-forma-leaving"),y&&p?Yn(e,l,s,p):l?.insertBefore(e,s),h=!0):!w&&h&&(y&&p?mt(e,p,()=>{e.parentNode&&(l?.insertBefore(s,e),e.remove())}):(l?.insertBefore(s,e),e.remove()),h=!1),y=!0});n.push(S),p&&n.push(()=>ye(e))}let f=!i||i.has("data-model")?e.getAttribute("data-model"):null;if(f){let u=f.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l=e,h=F(()=>{let w=p();l.type==="checkbox"?l.checked=!!w:l.value=String(w??"")});n.push(h);let y=l.type==="checkbox"?"change":"input",S=()=>{l.type==="checkbox"?s(l.checked):l.type==="number"||l.type==="range"?s(Number(l.value)):s(l.value)};l.addEventListener(y,S),n.push(()=>{l.removeEventListener(y,S)})}}let d=!i||co(i,"data-on:","data-class:","data-bind:"),b=e.attributes;if(d)for(let u=0;u<b.length;u++){let p=b[u],s=p.name;if(s.startsWith("data-on:")){let l=s.slice(8),h=no(p.value,t),y=h.handler;if(I){let S=e.tagName.toLowerCase(),w=e.id?`#${e.id}`:"",x=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-on:${l}="${p.value}" on <${S}${w}${x}>`)}if(h.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),I){let S=p.value,w=x=>{D(`HANDLER FIRED: data-on:${l}="${S}"`,"isTrusted:",x.isTrusted),y(x)};e.addEventListener(l,w),n.push(()=>{e.removeEventListener(l,w)})}else e.addEventListener(l,y),n.push(()=>{e.removeEventListener(l,y)})}else if(s.startsWith("data-class:")){let l=s.slice(11),h=z(p.value,t),y=F(()=>{e.classList.toggle(l,!!h())});n.push(y)}else if(s.startsWith("data-bind:")){let l=s.slice(10),h=z(p.value,t),y=F(()=>{let S=h();S==null||S===!1?e.removeAttribute(l):e.setAttribute(l,String(S))});n.push(y)}}let v=!i||i.has("data-persist")?e.getAttribute("data-persist"):null;if(v){let u=v.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l="forma:"+u;try{let y=localStorage.getItem(l);y!==null&&s(JSON.parse(y))}catch{}let h=F(()=>{try{localStorage.setItem(l,JSON.stringify(p()))}catch{}});n.push(h)}}let g=!i||i.has("data-list")?e.getAttribute("data-list"):null;if(g){let u=z(g,t),p=e.children[0];if(p){let x=function(N){let R=N;if(Array.isArray(R.__formaDisposers)){for(let _ of R.__formaDisposers)try{_()}catch{}delete R.__formaDisposers}},G=function(N,R){let _=Gn(s,N),L=Le(t,{item:N,index:R}),M=[];J(_,L,M);for(let B of Array.from(_.querySelectorAll("*")))J(B,L,M);return _.__formaDisposers=M,_},ne=function(N,R,_){x(N),jn(N,R);let L=Le(t,{item:R,index:_}),M=[];J(N,L,M);for(let B of Array.from(N.querySelectorAll("*")))J(B,L,M);N.__formaDisposers=M};var A=x,T=G,k=ne;let s=p.cloneNode(!0);e.removeChild(p);let l=s.getAttribute("data-key"),h=l?l.replace(Dn,"").trim():null,y=Oe(e),S=[],w=[],oe=y?{onInsert:N=>{let R=N;if(!R.setAttribute)return;let _=q(R);_.token+=1;let L=_.token;_.cancel&&_.cancel(),_.cancel=pe(R,{base:y.enter,from:y.enterFrom,to:y.enterTo,durationMs:y.enterDurationMs},()=>{let M=q(R);M.token===L&&(M.cancel=null)})},onBeforeRemove:(N,R)=>{let _=N;if(!_.setAttribute){R();return}x(N),mt(_,y,()=>{R()})}}:void 0,ie=F(()=>{let N=u();if(!Array.isArray(N)){for(let _ of w)x(_),e.removeChild(_);S=[],w=[];return}if(y){let _=e.querySelectorAll("[data-forma-leaving]");for(let L of Array.from(_))ye(L),L.removeAttribute("data-forma-leaving"),L.parentNode&&L.parentNode.removeChild(L)}let R=new Set(w);if(h){let _=Ne(e,S,N,w,M=>String(M?.[h]??""),M=>{let B=N.indexOf(M);return G(M,B)},(M,B)=>{let $=N.indexOf(B);ne(M,B,$)},void 0,oe),L=new Set(_.nodes);for(let M of R)if(!L.has(M)){if(M.hasAttribute?.("data-forma-leaving"))continue;x(M)}S=_.items,w=_.nodes}else{let _=N.map(($,ge)=>({__idx:ge,__item:$})),M=Ne(e,S,_,w,$=>$.__idx,$=>G($.__item,$.__idx),($,ge)=>ne($,ge.__item,ge.__idx),void 0,oe),B=new Set(M.nodes);for(let $ of R)if(!B.has($)){if($.hasAttribute?.("data-forma-leaving"))continue;x($)}S=M.items,w=M.nodes}});n.push(ie)}}let E=!i||i.has("data-fetch")?e.getAttribute("data-fetch"):null;if(E){let u=E.match(Nn);if(u){let p=u[1].trim(),s=u[2].trim(),l=u[3]?.trim()??"",h="GET",y=p,S=p.match(xn);S&&(h=S[1].toUpperCase(),y=S[2].trim());let w,x,G;for(let R of l.split("|").filter(Boolean)){let[_,L]=R.split(":").map(M=>M.trim());_==="loading"?w=L:_==="error"?x=L:_==="poll"&&(G=parseInt(L??"0",10))}let[ne,oe]=Z(null);if(t.getters[s]=ne,t.setters[s]=oe,w){let[R,_]=Z(!1);t.getters[w]=R,t.setters[w]=_}if(x){let[R,_]=Z(null);t.getters[x]=R,t.setters[x]=_}let ie=()=>{w&&t.setters[w](!0),fetch(y,{method:h}).then(R=>R.json()).then(R=>{oe(R),w&&t.setters[w](!1)}).catch(R=>{x&&t.setters[x](R.message),w&&t.setters[w](!1)})},N=e.getAttribute("data-fetch-id");if(N&&(Pe.set(N,ie),n.push(()=>Pe.delete(N))),ie(),G&&G>0){let R=setInterval(ie,G);n.push(()=>clearInterval(R))}}}}var ni=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function ro(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function so(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ao(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function lo(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function co(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function K(e){if(e.__formaDisposers){I&&D("mountScope: SKIPPED (already mounted)");return}let t=io(e),n=[];J(e,t,n);let o=0,i=ao();if(i){let a=e.querySelectorAll(i);for(let r=0;r<a.length;r++)J(a[r],t,n),o++}else{let a=e.querySelectorAll("*");for(let r=0;r<a.length;r++){let c=a[r];ro(c)&&(J(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",I&&D("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function X(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,fo=40,fe=[],me=!1;function uo(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: REMOVED scope"),X(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)X(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: ADDED scope via mutation"),K(o));let i=o.querySelectorAll("[data-forma-state]");I&&i.length>0&&D("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let r=i[a];r.closest("[data-forma-leaving]")||K(r)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;X(t),t.hasAttribute("data-forma-state")&&K(t)}}async function Mt(){try{for(;fe.length>0;){let e=fe.splice(0,fo);for(let t=0;t<e.length;t++)uo(e[t]);fe.length>0&&await ht()}}finally{me=!1,fe.length>0&&!me&&(me=!0,Mt())}}function mo(e){I&&D("MutationObserver: queued",e.length,"mutation(s)"),fe.push(...e),!me&&(me=!0,Mt())}function po(){if(W)return;W=new MutationObserver(mo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function go(){W&&(W.disconnect(),W=null)}function We(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");I&&D("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))K(t);po(),I&&D("initRuntime: MutationObserver started")}function ho(){go();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))X(t)}function vo(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}function bo(e){e.hasAttribute("data-forma-state")&&X(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))X(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",We):We());function Eo(e){I=e}function yo(e){P!==e&&(P=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),qe=new WeakMap,Ge=new WeakMap)}function So(e){if(P!=="mutable"){D(`setUnsafeEval ignored (mode=${P}); unsafe fallback is locked`);return}U!==e&&(U=e,qe=new WeakMap,Ge=new WeakMap)}function To(){return P}function Ao(e){Ve=e}function wo(){return Array.from(ue.values()).map(e=>({...e}))}function _o(){ue.clear()}function ko(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let r of Object.keys(o.getters)){let c=o.getters[r]();a[r]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function Ro(e,t,n){let o=e.__formaScope;o?.setters[t]&&H(()=>{o.setters[t](n)})}function Mo(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);H(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var He=null;function Co(){return He||(He=at({mountScope:K,unmountScope:X,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:H})),He}function No(e,t){Co()(e,t)}return It(xo);})();
//# sourceMappingURL=formajs-runtime-hardened.global.js.map

@@ -1,2 +0,2 @@

"use strict";var FormaRuntime=(()=>{var Se=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)Se(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xt(t))!Nt.call(e,i)&&i!==n&&Se(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(Se({},"__esModule",{value:!0}),e);var Co={};Dt(Co,{applyContainmentHints:()=>vt,clearDiagnostics:()=>Ao,destroyRuntime:()=>po,getDiagnostics:()=>To,getScopes:()=>_o,getUnsafeEvalMode:()=>yo,initRuntime:()=>Ue,mount:()=>go,reconcile:()=>Mo,resetScope:()=>ko,setDebug:()=>vo,setDiagnostics:()=>So,setDirectiveMap:()=>io,setScopeValue:()=>wo,setUnsafeEval:()=>Eo,setUnsafeEvalMode:()=>bo,unmount:()=>ho,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:s,updateDirtyFlag:u,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(l,p){let r=p.depsTail;if(r!==void 0&&r.dep===l)return;let f=r!==void 0?r.nextDep:p.deps;if(f!==void 0&&f.dep===l){p.depsTail=f;return}let h=l.subsTail;if(!(h!==void 0&&h.sub===p&&A(h,p)))return g(l,p,f,r)}function s(l){let p=l.nextSub,r,f=0,h=32;e:do{let y=l.sub,T=y.flags,C=!1;if(T&244?T&16&&!(T&4)?(y.flags=T&-17|h|8,C=!0):!(T&224)&&A(l,y)&&(y.flags=T|16|h|8,C=y.subs!==void 0):(y.flags=T|h|8,C=!0),C){let P=y.subs;if(P!==void 0){l=P,P.nextSub!==void 0?(r={target:p,linked:r},++f,p=l.nextSub,h=64):h=T&2?128:64;continue}T&2&&(n[i++]=y)}else T&(4|h)?!(T&h)&&T&224&&A(l,y)&&(y.flags=T|h):(y.flags=T|h|8,(T&10)===2&&(n[i++]=y));if((l=p)!==void 0){p=l.nextSub,h=f?64:32;continue}for(;f--;)if(l=r.target,r=r.linked,l!==void 0){p=l.nextSub,h=f?64:32;continue e}break}while(!0)}function c(l){l.depsTail=void 0,l.flags=l.flags&-249|4}function m(l){let p=l.depsTail;if(p!==void 0){let r=p.nextDep;r!==void 0&&(S(r),p.nextDep=void 0)}else l.deps!==void 0&&(S(l.deps),l.deps=void 0);l.flags&=-5}function u(l,p){return E(l.deps)?(l.flags=p|32,!0):(l.flags=p&-65,!1)}function d(l,p){if(p&32||E(l.deps)){if(e(l)){let r=l.subs;r!==void 0&&_(r)}}else l.flags=p&-65}function b(l,p){if(p&128){l.flags=p&-129;let r=l.deps;do{let f=r.dep;"flags"in f&&f.flags&2&&f.flags&224&&t(f),r=r.nextDep}while(r!==void 0)}}function v(){for(;o<i;){let l=n[o];n[o++]=void 0,t(l)||(l.flags&=-9)}o=0,i=0}function g(l,p,r,f){let h={dep:l,sub:p,nextDep:r,prevSub:void 0,nextSub:void 0};if(f===void 0?p.deps=h:f.nextDep=h,l.subs===void 0)l.subs=h;else{let y=l.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,l.subsTail=h,h}function E(l){let p,r=0,f;e:do{f=!1;let h=l.dep;if(l.sub.flags&32)f=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let T=h.subs;T.nextSub!==void 0&&_(T),f=!0}}else if((y&65)===65){(l.nextSub!==void 0||l.prevSub!==void 0)&&(p={target:l,linked:p}),l=h.deps,++r;continue}}if(!f&&l.nextDep!==void 0){l=l.nextDep;continue}for(;r;){--r;let y=l.sub,T=y.subs;if(f){if(e(y)){T.nextSub!==void 0?(l=p.target,p=p.linked,_(T)):l=T;continue}}else y.flags&=-65;if(T.nextSub!==void 0?(l=p.target,p=p.linked):l=T,l.nextDep!==void 0){l=l.nextDep;continue e}f=!1}return f}while(!0)}function _(l){do{let p=l.sub,r=p.flags;(r&96)===64&&(p.flags=r|32|8,(r&10)===2&&(n[i++]=p)),l=l.nextSub}while(l!==void 0)}function A(l,p){let r=p.depsTail;if(r!==void 0){let f=p.deps;do{if(f===l)return!0;if(f===r)break;f=f.nextDep}while(f!==void 0)}return!1}function S(l){do{let p=l.dep,r=l.nextDep,f=l.nextSub,h=l.prevSub;if(f!==void 0?f.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=f:p.subs=f,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let T=p.deps;if(T!==void 0){l=T,p.depsTail.nextDep=r,p.deps=void 0,p.depsTail=void 0;continue}}l=r}while(l!==void 0)}}var{link:oe,propagate:Ht,updateDirtyFlag:Ut,startTracking:Te,endTracking:Ae,processEffectNotifications:qe,processComputedUpdate:Pt,processPendingInnerEffects:Ge}=$t({updateComputed(e){let t=I;I=e,Te(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{I=t,Ae(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),je=[],_e=0,I,me;function ze(){++_e}function Je(){--_e||qe()}function Ke(){je.push(I),I=void 0}function Xe(){I=je.pop()}function Ye(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function Ze(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Qe(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};I!==void 0?oe(t,I):me!==void 0&&oe(t,me);let n=I;I=t;try{t.fn()}finally{I=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Ut(e,t)){let n=I;I=e,Te(e);try{e.fn()}finally{I=n,Ae(e)}}else Ge(e,e.flags);return!0}function Ft(e){return e.flags&128?(Ge(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Pt(this,e),I!==void 0?oe(this,I):me!==void 0&&oe(this,me),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),_e||qe())}}else return I!==void 0&&oe(this,I),this.currentValue}function qt(){Te(this),Ae(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ke();let n=e();Xe(),e(t(n))}function et(e){let t=Ye(e);return[t,i=>Gt(t,i)]}var Y=et;var we=null;function tt(e){we&&we.disposers.push(e)}function nt(){return we!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=Qe(e);return nt()&&tt(t),t}function ke(e){return Ze(e)}function $(e){ze();try{e()}finally{Je()}}function ot(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let u=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<u?d=v+1:b=v}n[d]=u,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let s=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)s[m]=c,c=i[c];return s}var Jt=32;function Kt(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length,b=new Array(u);for(let r=0;r<u;r++)b[r]=i(t[r]);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=-1;for(let y=0;y<u;y++)if(!g[y]&&b[y]===f){h=y,g[y]=1;break}v[r]=h}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Re(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length;if(d===0){for(let r=0;r<u;r++)if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);return{nodes:[],items:[]}}if(u===0){let r=new Array(d);for(let f=0;f<d;f++){let h=a(n[f]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),r[f]=h}return{nodes:r,items:n}}if(u<Jt)return Kt(e,t,n,o,i,a,s,c,m);let b=new Map;for(let r=0;r<u;r++)b.set(i(t[r]),r);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=b.get(f);h!==void 0?(v[r]=h,g[h]=1):v[r]=-1}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function it(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",s=t.getAttribute("data-forma-state")??"{}",c=it(a),m=it(s);return Zt(c,m)?"PRESERVE":"RESET"}var pe=null;function en(e){return pe||(pe=document.createElement("template")),pe.innerHTML=e,pe.content}function Me(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,s=e.attributes;for(let m=0;m<s.length;m++)if(s[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let u=c[m];if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.getAttribute(u.name)!==u.value&&e.setAttribute(u.name,u.value)}for(let m=s.length-1;m>=0;m--){let u=s[m];if(!t.hasAttribute(u.name)){if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.removeAttribute(u.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let s of Array.from(e.childNodes))s.nodeType===Node.TEXT_NODE&&n.push(s);for(let s=0;s<t.childNodes.length;s++){let c=t.childNodes[s];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:s})}if(n.length===o.length){for(let s=0;s<n.length;s++)n[s].textContent!==o[s].node.textContent&&(n[s].textContent=o[s].node.textContent);return}let i=new Set,a=0;for(let{node:s,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==s.textContent&&(m.textContent=s.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(s.textContent??""),m)}for(let s of n)!i.has(s)&&s.parentNode===e&&e.removeChild(s)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}}return null}function Ce(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,s=[];for(let u of o){if(u.hasAttribute("data-forma-leaving"))continue;let d=u.getAttribute("data-forma-id");d?a.set(d,u):s.push(u)}let c=0,m=new Set;for(let u of i){let d=u.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<s.length;){let v=s[c];if(c++,v.tagName===u.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&u.hasAttribute("data-forma-state"))switch(Qt(b,u)){case"PRESERVE":Me(b,u),Ce(b,u,n);break;case"RESET":n.unmountScope(b),Me(b,u),on(b,u),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=u.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else Me(b,u),Ce(b,u,n);rn(e,b,u,i)}else{let v=u.cloneNode(!0),g=sn(e,u,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let _ of Array.from(E))n.mountScope(_)}}for(let u of o)if(!m.has(u)){if(u.parentElement!==e||u.hasAttribute("data-forma-leaving"))continue;u.hasAttribute("data-forma-state")&&n.unmountScope(u);let d=u.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(u)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let u=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(u&&u.parentElement===e){e.insertBefore(t,u);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}return null}function rt(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let s=en(a),c=document.createElement("div");c.appendChild(s);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let u=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){u=!0;break}}if(m.size>0&&!u){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{Ce(o,c,e)})}finally{e.reconnectObserver()}}}}var Ie=new Map;function gt(e){let t=Ie.get(e);t?t():L&&N(`$refetch: no data-fetch with id "${e}" found`)}function st(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var L=!1,H="mutable",U=!1,Pe=!0;function N(...e){(L||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var le=new Map;function ge(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Oe(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Oe(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=ge(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Oe(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=ge(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=ge(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let s=ge(t.getAttribute("data-forma-auto-containment"));s!==void 0&&(e.autoContainment=s)}}return e}function Z(e,t,n){if(!Pe)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=le.get(o);a?(a.count+=1,a.lastSeenAt=i):(le.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let s={kind:e,expr:t,reason:n,count:le.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:s}))}}catch{}}var at=Oe("mutable");at&&(H=at,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0),H==="mutable"&&(U=!0));var X=an(),lt=X.lockUnsafeEval?"locked-off":X.unsafeEvalMode;lt&&(H=lt,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0));H==="mutable"&&typeof X.allowUnsafeEval=="boolean"&&(U=X.allowUnsafeEval);typeof X.diagnostics=="boolean"&&(Pe=X.diagnostics);var ln=X.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let s=o[a];if(!s?.style)continue;let c=s.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=s.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",u=s.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=s.style.getPropertyValue("contain"),g=s.style.getPropertyValue("content-visibility"),E=s.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(s.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(s.style.setProperty("content-visibility",m),b=!0),u!=="off"&&(!d||!E)&&(s.style.setProperty("contain-intrinsic-size",u),b=!0),b&&i++}return L&&i>0&&N("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,$e=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,_n=/^(\+\+|--)(\w+)$/,wn=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/(\w+)\s*:/g,xn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,Dn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Ln=/^\{item\.?|\}$/g,In=/\bevent\b|\$event\b/,On=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Ee=Symbol.for("forma-transition-state"),$n=2048,re=new Map;function ie(e,t){if(re.size>=$n){let n=re.keys().next().value;n!==void 0&&re.delete(n)}re.set(e,t)}var Be=new WeakMap,Fe=new WeakMap,ct=new Map,We=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval"]),Hn=(()=>{let e=[];for(let t of We){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Hn)if(o.test(t)||i.test(t))return n;return null}var ft=Symbol.for("forma-text-binding-cache");function Un(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Pn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function He(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,s=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(s,c).trim()),s=c+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}function Q(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,s=!1,c=!1,m=!1;for(let u=t;u<e.length;u++){let d=e[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,u),end:u}}return null}function Bn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,s=!1,c=!1,m=!1,u=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(u){u=!1;continue}if(g==="\\"&&(s||c||m)){u=!0;continue}if(s){g==="'"&&(s=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){s=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let u=Q(t,0,"{","}");if(!u)return null;let d=u.inner.trim(),b=t.slice(u.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,s=!1,c=!1,m=!1;for(let u=0;u<t.length;u++){let d=t[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,u).trim(),rest:t.slice(u+1).trim()}}return{body:t,rest:""}}function Fn(e,t){let n=e.trim();if(!Mn.test(n)||In.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=Q(n,o,"(",")");if(!i)return null;let a=M(i.inner.trim(),t);if(!a)return null;let s=n.slice(i.end+1).trim(),c=ut(s);if(!c||!c.body)return null;let m=ye(c.body,t);if(!m)return null;s=c.rest.trim();let u=null;if(s.startsWith("else")){s=s.slice(4).trim();let d=ut(s);if(!d||!d.body||(u=ye(d.body,t),!u))return null;s=d.rest.trim()}return s.length>0?null:d=>{$(()=>{a()?m(d):u?.(d)})}}function Wn(e){let t=e.trim();for(;t.startsWith("(");){let n=Q(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=ct.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,s;for(;(s=a.exec(e))!==null;)n.push(e.slice(i,s.index)),o.push(s[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return ct.set(e,c),c}var _t=new WeakMap;function Ve(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Vn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let s=At(a);_t.set(i,s),i.textContent=Ve(s,t)}}return Yn(n,t),n}function qn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=_t.get(o);i&&(o.textContent=Ve(i,t))}}var Gn=new WeakMap,jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function zn(e){for(let t of jn)if(e===t||e.startsWith(t))return!0;return!1}function se(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function ce(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function xe(e){let t=[],n;for(let o of se(e)){let i=ce(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function G(e){return Array.from(new Set(e.filter(Boolean)))}function he(e){return e?e.split(",").map(t=>ce(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,s=t[i%t.length]??0;a+s>o&&(o=a+s)}return o}function Jn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(he(n.transitionDuration),he(n.transitionDelay)),i=dt(he(n.animationDuration),he(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Ee];if(t)return t;let n={token:0,cancel:null};return e[Ee]=n,n}function ve(e){let t=e[Ee];t?.cancel&&t.cancel(),delete e[Ee]}function Ne(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=xe(e.getAttribute("data-transition")).classes,o=xe(e.getAttribute("data-transition:enter")),i=xe(e.getAttribute("data-transition:leave")),a=se(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),s=se(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=se(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=se(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),u=ce(e.getAttribute("data-transition:duration")??""),d=ce(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??u??void 0,b=ce(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??u??void 0;return{enter:G([...n,...o.classes]),enterFrom:G(a),enterTo:G(s),leave:G([...n,...i.classes]),leaveFrom:G(c),leaveTo:G(m),enterDurationMs:d,leaveDurationMs:b}}function be(e,t){for(let n of t)e.classList.remove(n)}function De(e,t){for(let n of t)e.classList.add(n)}function ue(e,t,n){let o=G([...t.base,...t.from,...t.to]),i=!1,a=null,s=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),s!=null&&cancelAnimationFrame(s),c!=null&&cancelAnimationFrame(c),be(e,o),n())};return De(e,t.base),De(e,t.from),be(e,t.to),s=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;be(e,t.from),De(e,t.to);let u=Jn(e,t.durationMs);if(u<=0){m();return}a=window.setTimeout(m,u+25)})}),m}function Kn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=ue(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=ue(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Xn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&be(e,G([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=ue(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)});return}i.cancel=ue(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let s=q(e);s.token===a&&(e.style.display="none",s.cancel=null)})}function Yn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!zn(a.name)&&a.value.includes("{item")){let s=At(a.value);i.push({attr:a.name,compiled:s}),o.setAttribute(a.name,Ve(s,t))}i.length>0&&Gn.set(o,i)}}function Zn(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let u=m[0];if(n+=u.length,We.has(u))return()=>{};if(n<e.length&&e[n]==="("){let d=Q(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of He(b)){let E=M(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:u,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:u,optional:c})}if(n!==e.length||a.length===0)return null;let s=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=s();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let u=c[m.name];if(typeof u!="function")return;let d=m.argFns.map(b=>b());c=u.apply(c,d)}}return c}}function M(e,t){let n=re.get(e);if(n)return n(t);let o=Qn(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;ie(e,()=>()=>i)}else if(St.test(e))ie(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);ie(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);ie(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],s=i[2];ie(e,c=>()=>c.getters[a]?.()?.[s])}}return o}function Qn(e,t){e=e.trim();let n=Wn(e);if(n!==e)return M(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=Zn(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],_=o[3].trim();if(We.has(E))return()=>{};let A=M(g,t);if(!A)return null;let S=[];for(let l of He(_)){let p=M(l,t);if(!p)return null;S.push(p)}return()=>{let l=A(),p=l?.[E];if(typeof p!="function")return;let r=S.map(f=>f());return p.apply(l,r)}}if(e.startsWith("!")){let g=M(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=M(i[1],t),E,_=i[2];if(Tn.test(_)?E=Number(_):E=_.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=Q(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let _=He(E),A=[],S=!0;for(let l of _){let p=M(l.trim(),t);if(!p){S=!1;break}A.push(p)}if(S)return()=>A.map(l=>l())}}let a=e.match(dn);if(a){let g=M(a[1].trim(),t),E=M(a[2].trim(),t),_=M(a[3].trim(),t);if(g&&E&&_)return()=>g()?E():_()}let s=e.match(mn);if(s){let g=M(s[1].trim(),t),E=M(s[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=M(c[1].trim(),t),E=M(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=M(m[1].trim(),t),E=M(m[2].trim(),t);if(g&&E)return()=>g()||E()}let u=e.match(hn);if(u){let g=M(u[1].trim(),t),E=M(u[3].trim(),t);if(g&&E){let _=u[2];return()=>{let A=g(),S=E();switch(_){case"===":return A===S;case"!==":return A!==S;case"==":return A==S;case"!=":return A!=S;case">":return A>S;case"<":return A<S;case">=":return A>=S;case"<=":return A<=S}}}}let d=e.match(vn);if(d){let g=M(d[1].trim(),t),E=M(d[3].trim(),t);if(g&&E){let _=d[2];return()=>{let A=g(),S=E();switch(_){case"*":return A*S;case"/":return A/S;case"%":return A%S}}}}let b=e.match(bn);if(b){let g=M(b[1].trim(),t),E=M(b[3].trim(),t);if(g&&E){let _=b[2];return()=>{let A=g(),S=E();return _==="+"?A+S:A-S}}}let v=e.match(En);if(v){let g=v[1],E=[],_=[],A=0,S=new RegExp(yn.source,"g"),l;for(;(l=S.exec(g))!==null;){E.push(g.slice(A,l.index));let p=M(l[1].trim(),t);if(!p)return null;_.push(p),A=S.lastIndex}return E.push(g.slice(A)),()=>{let p=E[0];for(let r=0;r<_.length;r++)p+=String(_[r]()??""),p+=E[r+1]??"";return p}}return null}function wt(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function j(e,t){let n=e.replace($e,"").trim(),o=wt(Be,t),i=o.get(n);if(i)return i;let a=M(n,t);if(a)return o.set(n,a),a;if(!U){N("buildEvaluator: blocked unsafe eval fallback for expression:",n),Z("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in expression`;throw Z("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){let v=t.getters[b];return v?v():void 0}}),u=()=>c(m);return o.set(n,u),u}catch{Z("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function ye(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Fn(n,t);if(o)return o;let i=Bn(n);if(i.length>1){let v=i.map(g=>ye(g,t));return v.every(g=>g!==null)?g=>{$(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,s=a.match(An);if(s){let v=s[1],g=s[2];return()=>{$(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(_n);if(c){let v=c[1],g=c[2];return()=>{$(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(wn);if(m&&m[1]===m[2]){let v=m[1];return()=>{$(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let u=a.match(kn);if(u){let v=u[1],g=M(u[2].trim(),t);if(g)return L&&N(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{$(()=>{let E=g();L&&N(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=M(d[3].trim(),t);if(E)return()=>{$(()=>{let _=t.getters[v]?.()??0,A=E();switch(g){case"+=":t.setters[v]?.(_+A);break;case"-=":t.setters[v]?.(_-A);break;case"*=":t.setters[v]?.(_*A);break;case"/=":t.setters[v]?.(_/A);break}})}}let b=a.match(On);if(b){let v=b[1];return()=>gt(v)}return null}function eo(e,t){let n=e.trim();if(n.startsWith("{")){let c=Q(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=wt(Fe,t),i=o.get(n);if(i)return i;let a=ye(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){N("buildHandler: blocked unsafe eval fallback for expression:",n),Z("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in handler`;throw Z("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{$(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Z("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var to=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{try{t=JSON.parse(e.replace(Cn,'"$1":'))}catch{return{}}}for(let n of to)n in t&&delete t[n];return t}function no(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);L&&(N("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&N("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[s,c]of Object.entries(n)){let[m,u]=Y(c);i[s]=m,a[s]=u}return i.$refetch=()=>gt,{getters:i,setters:a}}function z(e,t,n){let o=so(e),i=!o||o.has("data-computed")?e.getAttribute("data-computed"):null;if(i){let S=i.split(/;\s*(?=\w+\s*=[^=])/);for(let l of S){let p=l.trim();if(!p)continue;let r=p.match(xn);if(r){let f=r[1],h=r[2],y=t.getters[f];delete t.getters[f];let T=j(`{${h}}`,t),C=ke(T);t.getters[f]=C,y||delete t.setters[f]}}}let a=!o||o.has("data-text")?e.getAttribute("data-text"):null;if(a){let S=j(a,t),l=F(()=>{Pn(e,Un(S()))});n.push(l)}let s=!o||o.has("data-show")?e.getAttribute("data-show"):null;if(s){let S=j(s,t),l=Ne(e);if(L){let f=e.tagName.toLowerCase(),h=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-show="${s}" on <${f}${h}>`)}let p=!1,r=F(()=>{let f=!!S();L&&N(`data-show effect: "${s}" \u2192 ${f}`),Xn(e,f,l,!p),p=!0});n.push(r),l&&n.push(()=>ve(e))}let c=!o||o.has("data-if")?e.getAttribute("data-if"):null;if(c){let S=j(c,t),l=Ne(e),p=document.createComment("forma-if"),r=e.parentNode,f=!0,h=!1,y=F(()=>{let T=!!S();T&&!f?(ve(e),e.removeAttribute("data-forma-leaving"),h&&l?Kn(e,r,p,l):r?.insertBefore(e,p),f=!0):!T&&f&&(h&&l?mt(e,l,()=>{e.parentNode&&(r?.insertBefore(p,e),e.remove())}):(r?.insertBefore(p,e),e.remove()),f=!1),h=!0});n.push(y),l&&n.push(()=>ve(e))}let m=!o||o.has("data-model")?e.getAttribute("data-model"):null;if(m){let S=m.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r=e,f=F(()=>{let T=l();r.type==="checkbox"?r.checked=!!T:r.value=String(T??"")});n.push(f);let h=r.type==="checkbox"?"change":"input",y=()=>{r.type==="checkbox"?p(r.checked):r.type==="number"||r.type==="range"?p(Number(r.value)):p(r.value)};r.addEventListener(h,y),n.push(()=>{r.removeEventListener(h,y)})}}let u=!o||ao(o,"data-on:","data-class:","data-bind:"),d=e.attributes;if(u)for(let S=0;S<d.length;S++){let l=d[S],p=l.name;if(p.startsWith("data-on:")){let r=p.slice(8),f=eo(l.value,t),h=f.handler;if(L){let y=e.tagName.toLowerCase(),T=e.id?`#${e.id}`:"",C=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-on:${r}="${l.value}" on <${y}${T}${C}>`)}if(f.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),L){let y=l.value,T=C=>{N(`HANDLER FIRED: data-on:${r}="${y}"`,"isTrusted:",C.isTrusted),h(C)};e.addEventListener(r,T),n.push(()=>{e.removeEventListener(r,T)})}else e.addEventListener(r,h),n.push(()=>{e.removeEventListener(r,h)})}else if(p.startsWith("data-class:")){let r=p.slice(11),f=j(l.value,t),h=F(()=>{e.classList.toggle(r,!!f())});n.push(h)}else if(p.startsWith("data-bind:")){let r=p.slice(10),f=j(l.value,t),h=F(()=>{let y=f();y==null||y===!1?e.removeAttribute(r):e.setAttribute(r,String(y))});n.push(h)}}let b=!o||o.has("data-persist")?e.getAttribute("data-persist"):null;if(b){let S=b.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r="forma:"+S;try{let h=localStorage.getItem(r);h!==null&&p(JSON.parse(h))}catch{}let f=F(()=>{try{localStorage.setItem(r,JSON.stringify(l()))}catch{}});n.push(f)}}let v=!o||o.has("data-list")?e.getAttribute("data-list"):null;if(v){let S=j(v,t),l=e.children[0];if(l){let C=function(x){let k=x;if(Array.isArray(k.__formaDisposers)){for(let w of k.__formaDisposers)try{w()}catch{}delete k.__formaDisposers}},P=function(x,k){let w=Vn(p,x),D=st(t,{item:x,index:k}),R=[];z(w,D,R);for(let B of Array.from(w.querySelectorAll("*")))z(B,D,R);return w.__formaDisposers=R,w},ee=function(x,k,w){C(x),qn(x,k);let D=st(t,{item:k,index:w}),R=[];z(x,D,R);for(let B of Array.from(x.querySelectorAll("*")))z(B,D,R);x.__formaDisposers=R};var E=C,_=P,A=ee;let p=l.cloneNode(!0);e.removeChild(l);let r=p.getAttribute("data-key"),f=r?r.replace(Ln,"").trim():null,h=Ne(e),y=[],T=[],te=h?{onInsert:x=>{let k=x;if(!k.setAttribute)return;let w=q(k);w.token+=1;let D=w.token;w.cancel&&w.cancel(),w.cancel=ue(k,{base:h.enter,from:h.enterFrom,to:h.enterTo,durationMs:h.enterDurationMs},()=>{let R=q(k);R.token===D&&(R.cancel=null)})},onBeforeRemove:(x,k)=>{let w=x;if(!w.setAttribute){k();return}C(x),mt(w,h,()=>{k()})}}:void 0,ne=F(()=>{let x=S();if(!Array.isArray(x)){for(let w of T)C(w),e.removeChild(w);y=[],T=[];return}if(h){let w=e.querySelectorAll("[data-forma-leaving]");for(let D of Array.from(w))ve(D),D.removeAttribute("data-forma-leaving"),D.parentNode&&D.parentNode.removeChild(D)}let k=new Set(T);if(f){let w=Re(e,y,x,T,R=>String(R?.[f]??""),R=>{let B=x.indexOf(R);return P(R,B)},(R,B)=>{let O=x.indexOf(B);ee(R,B,O)},void 0,te),D=new Set(w.nodes);for(let R of k)if(!D.has(R)){if(R.hasAttribute?.("data-forma-leaving"))continue;C(R)}y=w.items,T=w.nodes}else{let w=x.map((O,de)=>({__idx:de,__item:O})),R=Re(e,y,w,T,O=>O.__idx,O=>P(O.__item,O.__idx),(O,de)=>ee(O,de.__item,de.__idx),void 0,te),B=new Set(R.nodes);for(let O of k)if(!B.has(O)){if(O.hasAttribute?.("data-forma-leaving"))continue;C(O)}y=R.items,T=R.nodes}});n.push(ne)}}let g=!o||o.has("data-fetch")?e.getAttribute("data-fetch"):null;if(g){let S=g.match(Nn);if(S){let l=S[1].trim(),p=S[2].trim(),r=S[3]?.trim()??"",f="GET",h=l,y=l.match(Dn);y&&(f=y[1].toUpperCase(),h=y[2].trim());let T,C,P;for(let k of r.split("|").filter(Boolean)){let[w,D]=k.split(":").map(R=>R.trim());w==="loading"?T=D:w==="error"?C=D:w==="poll"&&(P=parseInt(D??"0",10))}let[ee,te]=Y(null);if(t.getters[p]=ee,t.setters[p]=te,T){let[k,w]=Y(!1);t.getters[T]=k,t.setters[T]=w}if(C){let[k,w]=Y(null);t.getters[C]=k,t.setters[C]=w}let ne=()=>{T&&t.setters[T](!0),fetch(h,{method:f}).then(k=>k.json()).then(k=>{te(k),T&&t.setters[T](!1)}).catch(k=>{C&&t.setters[C](k.message),T&&t.setters[T](!1)})},x=e.getAttribute("data-fetch-id");if(x&&(Ie.set(x,ne),n.push(()=>Ie.delete(x))),ne(),P&&P>0){let k=setInterval(ne,P);n.push(()=>clearInterval(k))}}}}var ei=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function oo(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function io(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ro(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function so(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function ao(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function J(e){if(e.__formaDisposers){L&&N("mountScope: SKIPPED (already mounted)");return}let t=no(e),n=[];z(e,t,n);let o=0,i=ro();if(i){let a=e.querySelectorAll(i);for(let s=0;s<a.length;s++)z(a[s],t,n),o++}else{let a=e.querySelectorAll("*");for(let s=0;s<a.length;s++){let c=a[s];oo(c)&&(z(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",L&&N("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function K(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,lo=40,ae=[],fe=!1;function co(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: REMOVED scope"),K(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)K(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: ADDED scope via mutation"),J(o));let i=o.querySelectorAll("[data-forma-state]");L&&i.length>0&&N("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let s=i[a];s.closest("[data-forma-leaving]")||J(s)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;K(t),t.hasAttribute("data-forma-state")&&J(t)}}async function Mt(){try{for(;ae.length>0;){let e=ae.splice(0,lo);for(let t=0;t<e.length;t++)co(e[t]);ae.length>0&&await ht()}}finally{fe=!1,ae.length>0&&!fe&&(fe=!0,Mt())}}function fo(e){L&&N("MutationObserver: queued",e.length,"mutation(s)"),ae.push(...e),!fe&&(fe=!0,Mt())}function uo(){if(W)return;W=new MutationObserver(fo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function mo(){W&&(W.disconnect(),W=null)}function Ue(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");L&&N("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))J(t);uo(),L&&N("initRuntime: MutationObserver started")}function po(){mo();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))K(t)}function go(e){e.hasAttribute("data-forma-state")&&J(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))J(n)}function ho(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Ue):Ue());function vo(e){L=e}function bo(e){H!==e&&(H=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),Be=new WeakMap,Fe=new WeakMap)}function Eo(e){if(H!=="mutable"){N(`setUnsafeEval ignored (mode=${H}); unsafe fallback is locked`);return}U!==e&&(U=e,Be=new WeakMap,Fe=new WeakMap)}function yo(){return H}function So(e){Pe=e}function To(){return Array.from(le.values()).map(e=>({...e}))}function Ao(){le.clear()}function _o(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let s of Object.keys(o.getters)){let c=o.getters[s]();a[s]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function wo(e,t,n){let o=e.__formaScope;o?.setters[t]&&$(()=>{o.setters[t](n)})}function ko(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);$(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var Le=null;function Ro(){return Le||(Le=rt({mountScope:J,unmountScope:K,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:$})),Le}function Mo(e,t){Ro()(e,t)}return It(Co);})();
"use strict";var FormaRuntime=(()=>{var we=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var xt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)we(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Nt(t))!xt.call(e,i)&&i!==n&&we(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(we({},"__esModule",{value:!0}),e);var xo={};Dt(xo,{applyContainmentHints:()=>vt,clearDiagnostics:()=>_o,destroyRuntime:()=>ho,getDiagnostics:()=>wo,getScopes:()=>ko,getUnsafeEvalMode:()=>To,initRuntime:()=>We,mount:()=>vo,reconcile:()=>No,resetScope:()=>Mo,setDebug:()=>Eo,setDiagnostics:()=>Ao,setDirectiveMap:()=>so,setScopeValue:()=>Ro,setUnsafeEval:()=>So,setUnsafeEvalMode:()=>yo,unmount:()=>bo,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:r,updateDirtyFlag:f,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(u,p){let s=p.depsTail;if(s!==void 0&&s.dep===u)return;let l=s!==void 0?s.nextDep:p.deps;if(l!==void 0&&l.dep===u){p.depsTail=l;return}let h=u.subsTail;if(!(h!==void 0&&h.sub===p&&T(h,p)))return g(u,p,l,s)}function r(u){let p=u.nextSub,s,l=0,h=32;e:do{let y=u.sub,S=y.flags,w=!1;if(S&244?S&16&&!(S&4)?(y.flags=S&-17|h|8,w=!0):!(S&224)&&T(u,y)&&(y.flags=S|16|h|8,w=y.subs!==void 0):(y.flags=S|h|8,w=!0),w){let x=y.subs;if(x!==void 0){u=x,x.nextSub!==void 0?(s={target:p,linked:s},++l,p=u.nextSub,h=64):h=S&2?128:64;continue}S&2&&(n[i++]=y)}else S&(4|h)?!(S&h)&&S&224&&T(u,y)&&(y.flags=S|h):(y.flags=S|h|8,(S&10)===2&&(n[i++]=y));if((u=p)!==void 0){p=u.nextSub,h=l?64:32;continue}for(;l--;)if(u=s.target,s=s.linked,u!==void 0){p=u.nextSub,h=l?64:32;continue e}break}while(!0)}function c(u){u.depsTail=void 0,u.flags=u.flags&-249|4}function m(u){let p=u.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(k(s),p.nextDep=void 0)}else u.deps!==void 0&&(k(u.deps),u.deps=void 0);u.flags&=-5}function f(u,p){return E(u.deps)?(u.flags=p|32,!0):(u.flags=p&-65,!1)}function d(u,p){if(p&32||E(u.deps)){if(e(u)){let s=u.subs;s!==void 0&&A(s)}}else u.flags=p&-65}function b(u,p){if(p&128){u.flags=p&-129;let s=u.deps;do{let l=s.dep;"flags"in l&&l.flags&2&&l.flags&224&&t(l),s=s.nextDep}while(s!==void 0)}}function v(){for(;o<i;){let u=n[o];n[o++]=void 0,t(u)||(u.flags&=-9)}o=0,i=0}function g(u,p,s,l){let h={dep:u,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(l===void 0?p.deps=h:l.nextDep=h,u.subs===void 0)u.subs=h;else{let y=u.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,u.subsTail=h,h}function E(u){let p,s=0,l;e:do{l=!1;let h=u.dep;if(u.sub.flags&32)l=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let S=h.subs;S.nextSub!==void 0&&A(S),l=!0}}else if((y&65)===65){(u.nextSub!==void 0||u.prevSub!==void 0)&&(p={target:u,linked:p}),u=h.deps,++s;continue}}if(!l&&u.nextDep!==void 0){u=u.nextDep;continue}for(;s;){--s;let y=u.sub,S=y.subs;if(l){if(e(y)){S.nextSub!==void 0?(u=p.target,p=p.linked,A(S)):u=S;continue}}else y.flags&=-65;if(S.nextSub!==void 0?(u=p.target,p=p.linked):u=S,u.nextDep!==void 0){u=u.nextDep;continue e}l=!1}return l}while(!0)}function A(u){do{let p=u.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[i++]=p)),u=u.nextSub}while(u!==void 0)}function T(u,p){let s=p.depsTail;if(s!==void 0){let l=p.deps;do{if(l===u)return!0;if(l===s)break;l=l.nextDep}while(l!==void 0)}return!1}function k(u){do{let p=u.dep,s=u.nextDep,l=u.nextSub,h=u.prevSub;if(l!==void 0?l.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=l:p.subs=l,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let S=p.deps;if(S!==void 0){u=S,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}u=s}while(u!==void 0)}}var{link:re,propagate:Ht,updateDirtyFlag:Pt,startTracking:_e,endTracking:ke,processEffectNotifications:ze,processComputedUpdate:Ut,processPendingInnerEffects:Je}=$t({updateComputed(e){let t=O;O=e,_e(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{O=t,ke(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),Ke=[],Re=0,O,he;function Xe(){++Re}function Ye(){--Re||ze()}function Ze(){Ke.push(O),O=void 0}function Qe(){O=Ke.pop()}function et(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function tt(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function nt(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};O!==void 0?re(t,O):he!==void 0&&re(t,he);let n=O;O=t;try{t.fn()}finally{O=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Pt(e,t)){let n=O;O=e,_e(e);try{e.fn()}finally{O=n,ke(e)}}else Je(e,e.flags);return!0}function Ft(e){return e.flags&128?(Je(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Ut(this,e),O!==void 0?re(this,O):he!==void 0&&re(this,he),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),Re||ze())}}else return O!==void 0&&re(this,O),this.currentValue}function qt(){_e(this),ke(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ze();let n=e();Qe(),e(t(n))}function Z(e){let t=et(e);return[t,i=>Gt(t,i)]}var Me=null;function ot(e){Me&&Me.disposers.push(e)}function it(){return Me!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=nt(e);return it()&&ot(t),t}function Ce(e){return tt(e)}function H(e){Xe();try{e()}finally{Ye()}}function rt(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let f=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<f?d=v+1:b=v}n[d]=f,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let r=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)r[m]=c,c=i[c];return r}var Jt=32;function Kt(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length,b=new Array(f);for(let s=0;s<f;s++)b[s]=i(t[s]);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=-1;for(let y=0;y<f;y++)if(!g[y]&&b[y]===l){h=y,g[y]=1;break}v[s]=h}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Ne(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length;if(d===0){for(let s=0;s<f;s++)if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(f===0){let s=new Array(d);for(let l=0;l<d;l++){let h=a(n[l]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),s[l]=h}return{nodes:s,items:n}}if(f<Jt)return Kt(e,t,n,o,i,a,r,c,m);let b=new Map;for(let s=0;s<f;s++)b.set(i(t[s]),s);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=b.get(l);h!==void 0?(v[s]=h,g[h]=1):v[s]=-1}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function st(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",r=t.getAttribute("data-forma-state")??"{}",c=st(a),m=st(r);return Zt(c,m)?"PRESERVE":"RESET"}var ve=null;function en(e){return ve||(ve=document.createElement("template")),ve.innerHTML=e,ve.content}function xe(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,r=e.attributes;for(let m=0;m<r.length;m++)if(r[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let f=c[m];if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.getAttribute(f.name)!==f.value&&e.setAttribute(f.name,f.value)}for(let m=r.length-1;m>=0;m--){let f=r[m];if(!t.hasAttribute(f.name)){if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.removeAttribute(f.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let r of Array.from(e.childNodes))r.nodeType===Node.TEXT_NODE&&n.push(r);for(let r=0;r<t.childNodes.length;r++){let c=t.childNodes[r];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:r})}if(n.length===o.length){for(let r=0;r<n.length;r++)n[r].textContent!==o[r].node.textContent&&(n[r].textContent=o[r].node.textContent);return}let i=new Set,a=0;for(let{node:r,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==r.textContent&&(m.textContent=r.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(r.textContent??""),m)}for(let r of n)!i.has(r)&&r.parentNode===e&&e.removeChild(r)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}}return null}function De(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,r=[];for(let f of o){if(f.hasAttribute("data-forma-leaving"))continue;let d=f.getAttribute("data-forma-id");d?a.set(d,f):r.push(f)}let c=0,m=new Set;for(let f of i){let d=f.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<r.length;){let v=r[c];if(c++,v.tagName===f.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&f.hasAttribute("data-forma-state"))switch(Qt(b,f)){case"PRESERVE":xe(b,f),De(b,f,n);break;case"RESET":n.unmountScope(b),xe(b,f),on(b,f),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=f.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else xe(b,f),De(b,f,n);rn(e,b,f,i)}else{let v=f.cloneNode(!0),g=sn(e,f,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let A of Array.from(E))n.mountScope(A)}}for(let f of o)if(!m.has(f)){if(f.parentElement!==e||f.hasAttribute("data-forma-leaving"))continue;f.hasAttribute("data-forma-state")&&n.unmountScope(f);let d=f.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(f)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let f=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(f&&f.parentElement===e){e.insertBefore(t,f);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}return null}function at(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let r=en(a),c=document.createElement("div");c.appendChild(r);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let f=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){f=!0;break}}if(m.size>0&&!f){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{De(o,c,e)})}finally{e.reconnectObserver()}}}}var Pe=new Map;function gt(e){let t=Pe.get(e);t?t():I&&D(`$refetch: no data-fetch with id "${e}" found`)}function Le(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var I=!1,P="mutable",U=!1,Ve=!0;function D(...e){(I||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var ue=new Map;function be(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Ue(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Ue(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=be(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Ue(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=be(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=be(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let r=be(t.getAttribute("data-forma-auto-containment"));r!==void 0&&(e.autoContainment=r)}}return e}function Q(e,t,n){if(!Ve)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=ue.get(o);a?(a.count+=1,a.lastSeenAt=i):(ue.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let r={kind:e,expr:t,reason:n,count:ue.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:r}))}}catch{}}var lt=Ue("mutable");lt&&(P=lt,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0),P==="mutable"&&(U=!0));var Y=an(),ct=Y.lockUnsafeEval?"locked-off":Y.unsafeEvalMode;ct&&(P=ct,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0));P==="mutable"&&typeof Y.allowUnsafeEval=="boolean"&&(U=Y.allowUnsafeEval);typeof Y.diagnostics=="boolean"&&(Ve=Y.diagnostics);var ln=Y.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let r=o[a];if(!r?.style)continue;let c=r.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=r.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",f=r.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=r.style.getPropertyValue("contain"),g=r.style.getPropertyValue("content-visibility"),E=r.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(r.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(r.style.setProperty("content-visibility",m),b=!0),f!=="off"&&(!d||!E)&&(r.style.setProperty("contain-intrinsic-size",f),b=!0),b&&i++}return I&&i>0&&D("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,Be=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,wn=/^(\+\+|--)(\w+)$/,_n=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,xn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Dn=/^\{item\.?|\}$/g,Ln=/\bevent\s*[.([]|\$event\b/,In=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Te=Symbol.for("forma-transition-state"),On=2048,ae=new Map;function se(e,t){if(ae.size>=On){let n=ae.keys().next().value;n!==void 0&&ae.delete(n)}ae.set(e,t)}var qe=new WeakMap,Ge=new WeakMap,le=new Map,$n=2048;function Hn(e,t){if(le.size>=$n){let n=le.keys().next().value;n!==void 0&&le.delete(n)}le.set(e,t)}var ee=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval","Function"]),Pn=(()=>{let e=[];for(let t of ee){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Pn)if(o.test(t)||i.test(t))return n;if(t.includes("[")){let n=Un(t);for(let o of n){if(!o.includes("+"))continue;let i=o.match(/['"`]([^'"`]*?)['"`]/g);if(!i)continue;let a=i.map(r=>r.slice(1,-1)).join("");if(ee.has(a))return a}}return null}function Un(e){let t=[],n=0,o=-1;for(let i=0;i<e.length;i++)e[i]==="["?(n===0&&(o=i+1),n++):e[i]==="]"&&(n--,n===0&&o>=0&&(t.push(e.slice(o,i)),o=-1));return t}var ft=Symbol.for("forma-text-binding-cache");function Bn(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Fn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function Fe(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,r=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(r,c).trim()),r=c+1)}return t.push(e.slice(r).trim()),t.filter(Boolean)}function te(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,r=!1,c=!1,m=!1;for(let f=t;f<e.length;f++){let d=e[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,f),end:f}}return null}function Wn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,r=!1,c=!1,m=!1,f=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(f){f=!1;continue}if(g==="\\"&&(r||c||m)){f=!0;continue}if(r){g==="'"&&(r=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){r=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let f=te(t,0,"{","}");if(!f)return null;let d=f.inner.trim(),b=t.slice(f.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,r=!1,c=!1,m=!1;for(let f=0;f<t.length;f++){let d=t[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,f).trim(),rest:t.slice(f+1).trim()}}return{body:t,rest:""}}function Vn(e,t){let n=e.trim();if(!Mn.test(n)||Ln.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=te(n,o,"(",")");if(!i)return null;let a=C(i.inner.trim(),t);if(!a)return null;let r=n.slice(i.end+1).trim(),c=ut(r);if(!c||!c.body)return null;let m=Ae(c.body,t);if(!m)return null;r=c.rest.trim();let f=null;if(r.startsWith("else")){r=r.slice(4).trim();let d=ut(r);if(!d||!d.body||(f=Ae(d.body,t),!f))return null;r=d.rest.trim()}return r.length>0?null:d=>{H(()=>{a()?m(d):f?.(d)})}}function qn(e){let t=e.trim();for(;t.startsWith("(");){let n=te(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=le.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,r;for(;(r=a.exec(e))!==null;)n.push(e.slice(i,r.index)),o.push(r[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return Hn(e,c),c}var wt=new WeakMap;function je(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Gn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let r=At(a);wt.set(i,r),i.textContent=je(r,t)}}return Qn(n,t),n}function jn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=wt.get(o);i&&(o.textContent=je(i,t))}}var zn=new WeakMap,Jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function Kn(e){for(let t of Jn)if(e===t||e.startsWith(t))return!0;return!1}function ce(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function de(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function Ie(e){let t=[],n;for(let o of ce(e)){let i=de(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function j(e){return Array.from(new Set(e.filter(Boolean)))}function Ee(e){return e?e.split(",").map(t=>de(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,r=t[i%t.length]??0;a+r>o&&(o=a+r)}return o}function Xn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(Ee(n.transitionDuration),Ee(n.transitionDelay)),i=dt(Ee(n.animationDuration),Ee(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Te];if(t)return t;let n={token:0,cancel:null};return e[Te]=n,n}function ye(e){let t=e[Te];t?.cancel&&t.cancel(),delete e[Te]}function Oe(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=Ie(e.getAttribute("data-transition")).classes,o=Ie(e.getAttribute("data-transition:enter")),i=Ie(e.getAttribute("data-transition:leave")),a=ce(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),r=ce(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=ce(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=ce(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),f=de(e.getAttribute("data-transition:duration")??""),d=de(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??f??void 0,b=de(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??f??void 0;return{enter:j([...n,...o.classes]),enterFrom:j(a),enterTo:j(r),leave:j([...n,...i.classes]),leaveFrom:j(c),leaveTo:j(m),enterDurationMs:d,leaveDurationMs:b}}function Se(e,t){for(let n of t)e.classList.remove(n)}function $e(e,t){for(let n of t)e.classList.add(n)}function pe(e,t,n){let o=j([...t.base,...t.from,...t.to]),i=!1,a=null,r=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),r!=null&&cancelAnimationFrame(r),c!=null&&cancelAnimationFrame(c),Se(e,o),n())};return $e(e,t.base),$e(e,t.from),Se(e,t.to),r=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;Se(e,t.from),$e(e,t.to);let f=Xn(e,t.durationMs);if(f<=0){m();return}a=window.setTimeout(m,f+25)})}),m}function Yn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=pe(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=pe(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Zn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&Se(e,j([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=pe(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)});return}i.cancel=pe(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let r=q(e);r.token===a&&(e.style.display="none",r.cancel=null)})}function Qn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!Kn(a.name)&&a.value.includes("{item")){let r=At(a.value);i.push({attr:a.name,compiled:r}),o.setAttribute(a.name,je(r,t))}i.length>0&&zn.set(o,i)}}function eo(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let f=m[0];if(n+=f.length,ee.has(f))return()=>{};if(n<e.length&&e[n]==="("){let d=te(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of Fe(b)){let E=C(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:f,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:f,optional:c})}if(n!==e.length||a.length===0)return null;let r=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=r();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let f=c[m.name];if(typeof f!="function")return;let d=m.argFns.map(b=>b());c=f.apply(c,d)}}return c}}function C(e,t){let n=ae.get(e);if(n)return n(t);let o=to(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;se(e,()=>()=>i)}else if(St.test(e))se(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);se(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);se(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],r=i[2];se(e,c=>()=>c.getters[a]?.()?.[r])}}return o}function to(e,t){e=e.trim();let n=qn(e);if(n!==e)return C(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=eo(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],A=o[3].trim();if(ee.has(E))return()=>{};let T=C(g,t);if(!T)return null;let k=[];for(let u of Fe(A)){let p=C(u,t);if(!p)return null;k.push(p)}return()=>{let u=T(),p=u?.[E];if(typeof p!="function")return;let s=k.map(l=>l());return p.apply(u,s)}}if(e.startsWith("!")){let g=C(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=C(i[1],t),E,A=i[2];if(Tn.test(A)?E=Number(A):E=A.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=te(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let A=Fe(E),T=[],k=!0;for(let u of A){let p=C(u.trim(),t);if(!p){k=!1;break}T.push(p)}if(k)return()=>T.map(u=>u())}}let a=e.match(dn);if(a){let g=C(a[1].trim(),t),E=C(a[2].trim(),t),A=C(a[3].trim(),t);if(g&&E&&A)return()=>g()?E():A()}let r=e.match(mn);if(r){let g=C(r[1].trim(),t),E=C(r[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=C(c[1].trim(),t),E=C(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=C(m[1].trim(),t),E=C(m[2].trim(),t);if(g&&E)return()=>g()||E()}let f=e.match(hn);if(f){let g=C(f[1].trim(),t),E=C(f[3].trim(),t);if(g&&E){let A=f[2];return()=>{let T=g(),k=E();switch(A){case"===":return T===k;case"!==":return T!==k;case"==":return T==k;case"!=":return T!=k;case">":return T>k;case"<":return T<k;case">=":return T>=k;case"<=":return T<=k}}}}let d=e.match(vn);if(d){let g=C(d[1].trim(),t),E=C(d[3].trim(),t);if(g&&E){let A=d[2];return()=>{let T=g(),k=E();switch(A){case"*":return T*k;case"/":return T/k;case"%":return T%k}}}}let b=e.match(bn);if(b){let g=C(b[1].trim(),t),E=C(b[3].trim(),t);if(g&&E){let A=b[2];return()=>{let T=g(),k=E();return A==="+"?T+k:T-k}}}let v=e.match(En);if(v){let g=v[1],E=[],A=[],T=0,k=new RegExp(yn.source,"g"),u;for(;(u=k.exec(g))!==null;){E.push(g.slice(T,u.index));let p=C(u[1].trim(),t);if(!p)return null;A.push(p),T=k.lastIndex}return E.push(g.slice(T)),()=>{let p=E[0];for(let s=0;s<A.length;s++)p+=String(A[s]()??""),p+=E[s+1]??"";return p}}return null}function _t(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function z(e,t){let n=e.replace(Be,"").trim(),o=_t(qe,t),i=o.get(n);if(i)return i;let a=C(n,t);if(a)return o.set(n,a),a;if(!U){D("buildEvaluator: blocked unsafe eval fallback for expression:",n),Q("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in expression`;throw Q("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){if(ee.has(b))return;let v=t.getters[b];return v?v():void 0}}),f=()=>c(m);return o.set(n,f),f}catch{Q("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function Ae(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Vn(n,t);if(o)return o;let i=Wn(n);if(i.length>1){let v=i.map(g=>Ae(g,t));return v.every(g=>g!==null)?g=>{H(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,r=a.match(An);if(r){let v=r[1],g=r[2];return()=>{H(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(wn);if(c){let v=c[1],g=c[2];return()=>{H(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(_n);if(m&&m[1]===m[2]){let v=m[1];return()=>{H(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let f=a.match(kn);if(f){let v=f[1],g=C(f[2].trim(),t);if(g)return I&&D(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{H(()=>{let E=g();I&&D(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=C(d[3].trim(),t);if(E)return()=>{H(()=>{let A=t.getters[v]?.()??0,T=E();switch(g){case"+=":t.setters[v]?.(A+T);break;case"-=":t.setters[v]?.(A-T);break;case"*=":t.setters[v]?.(A*T);break;case"/=":t.setters[v]?.(A/T);break}})}}let b=a.match(In);if(b){let v=b[1];return()=>gt(v)}return null}function no(e,t){let n=e.trim();if(n.startsWith("{")){let c=te(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=_t(Ge,t),i=o.get(n);if(i)return i;let a=Ae(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){D("buildHandler: blocked unsafe eval fallback for expression:",n),Q("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in handler`;throw Q("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){if(ee.has(v))return;let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{H(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Q("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var oo=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{return I&&D("parseState: Invalid JSON in data-forma-state \u2014 use valid JSON with quoted keys. Got:",e.slice(0,200)),{}}for(let n of oo)n in t&&delete t[n];return t}function io(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);I&&(D("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&D("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[r,c]of Object.entries(n)){let[m,f]=Z(c);i[r]=m,a[r]=f}return i.$refetch=()=>gt,{getters:i,setters:a}}function J(e,t,n){t=Le(t,{$el:e,$dispatch:(u,p)=>{e.dispatchEvent(new CustomEvent(u,{bubbles:!0,composed:!0,detail:p}))}});let i=lo(e),a=!i||i.has("data-computed")?e.getAttribute("data-computed"):null;if(a){let u=a.split(/;\s*(?=\w+\s*=[^=])/);for(let p of u){let s=p.trim();if(!s)continue;let l=s.match(Cn);if(l){let h=l[1],y=l[2],S=t.getters[h];delete t.getters[h];let w=z(`{${y}}`,t),x=Ce(w);t.getters[h]=x,S||delete t.setters[h]}}}let r=!i||i.has("data-text")?e.getAttribute("data-text"):null;if(r){let u=z(r,t),p=F(()=>{Fn(e,Bn(u()))});n.push(p)}let c=!i||i.has("data-show")?e.getAttribute("data-show"):null;if(c){let u=z(c,t),p=Oe(e);if(I){let h=e.tagName.toLowerCase(),y=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-show="${c}" on <${h}${y}>`)}let s=!1,l=F(()=>{let h=!!u();I&&D(`data-show effect: "${c}" \u2192 ${h}`),Zn(e,h,p,!s),s=!0});n.push(l),p&&n.push(()=>ye(e))}let m=!i||i.has("data-if")?e.getAttribute("data-if"):null;if(m){let u=z(m,t),p=Oe(e),s=document.createComment("forma-if"),l=e.parentNode,h=!0,y=!1,S=F(()=>{let w=!!u();w&&!h?(ye(e),e.removeAttribute("data-forma-leaving"),y&&p?Yn(e,l,s,p):l?.insertBefore(e,s),h=!0):!w&&h&&(y&&p?mt(e,p,()=>{e.parentNode&&(l?.insertBefore(s,e),e.remove())}):(l?.insertBefore(s,e),e.remove()),h=!1),y=!0});n.push(S),p&&n.push(()=>ye(e))}let f=!i||i.has("data-model")?e.getAttribute("data-model"):null;if(f){let u=f.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l=e,h=F(()=>{let w=p();l.type==="checkbox"?l.checked=!!w:l.value=String(w??"")});n.push(h);let y=l.type==="checkbox"?"change":"input",S=()=>{l.type==="checkbox"?s(l.checked):l.type==="number"||l.type==="range"?s(Number(l.value)):s(l.value)};l.addEventListener(y,S),n.push(()=>{l.removeEventListener(y,S)})}}let d=!i||co(i,"data-on:","data-class:","data-bind:"),b=e.attributes;if(d)for(let u=0;u<b.length;u++){let p=b[u],s=p.name;if(s.startsWith("data-on:")){let l=s.slice(8),h=no(p.value,t),y=h.handler;if(I){let S=e.tagName.toLowerCase(),w=e.id?`#${e.id}`:"",x=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-on:${l}="${p.value}" on <${S}${w}${x}>`)}if(h.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),I){let S=p.value,w=x=>{D(`HANDLER FIRED: data-on:${l}="${S}"`,"isTrusted:",x.isTrusted),y(x)};e.addEventListener(l,w),n.push(()=>{e.removeEventListener(l,w)})}else e.addEventListener(l,y),n.push(()=>{e.removeEventListener(l,y)})}else if(s.startsWith("data-class:")){let l=s.slice(11),h=z(p.value,t),y=F(()=>{e.classList.toggle(l,!!h())});n.push(y)}else if(s.startsWith("data-bind:")){let l=s.slice(10),h=z(p.value,t),y=F(()=>{let S=h();S==null||S===!1?e.removeAttribute(l):e.setAttribute(l,String(S))});n.push(y)}}let v=!i||i.has("data-persist")?e.getAttribute("data-persist"):null;if(v){let u=v.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l="forma:"+u;try{let y=localStorage.getItem(l);y!==null&&s(JSON.parse(y))}catch{}let h=F(()=>{try{localStorage.setItem(l,JSON.stringify(p()))}catch{}});n.push(h)}}let g=!i||i.has("data-list")?e.getAttribute("data-list"):null;if(g){let u=z(g,t),p=e.children[0];if(p){let x=function(N){let R=N;if(Array.isArray(R.__formaDisposers)){for(let _ of R.__formaDisposers)try{_()}catch{}delete R.__formaDisposers}},G=function(N,R){let _=Gn(s,N),L=Le(t,{item:N,index:R}),M=[];J(_,L,M);for(let B of Array.from(_.querySelectorAll("*")))J(B,L,M);return _.__formaDisposers=M,_},ne=function(N,R,_){x(N),jn(N,R);let L=Le(t,{item:R,index:_}),M=[];J(N,L,M);for(let B of Array.from(N.querySelectorAll("*")))J(B,L,M);N.__formaDisposers=M};var A=x,T=G,k=ne;let s=p.cloneNode(!0);e.removeChild(p);let l=s.getAttribute("data-key"),h=l?l.replace(Dn,"").trim():null,y=Oe(e),S=[],w=[],oe=y?{onInsert:N=>{let R=N;if(!R.setAttribute)return;let _=q(R);_.token+=1;let L=_.token;_.cancel&&_.cancel(),_.cancel=pe(R,{base:y.enter,from:y.enterFrom,to:y.enterTo,durationMs:y.enterDurationMs},()=>{let M=q(R);M.token===L&&(M.cancel=null)})},onBeforeRemove:(N,R)=>{let _=N;if(!_.setAttribute){R();return}x(N),mt(_,y,()=>{R()})}}:void 0,ie=F(()=>{let N=u();if(!Array.isArray(N)){for(let _ of w)x(_),e.removeChild(_);S=[],w=[];return}if(y){let _=e.querySelectorAll("[data-forma-leaving]");for(let L of Array.from(_))ye(L),L.removeAttribute("data-forma-leaving"),L.parentNode&&L.parentNode.removeChild(L)}let R=new Set(w);if(h){let _=Ne(e,S,N,w,M=>String(M?.[h]??""),M=>{let B=N.indexOf(M);return G(M,B)},(M,B)=>{let $=N.indexOf(B);ne(M,B,$)},void 0,oe),L=new Set(_.nodes);for(let M of R)if(!L.has(M)){if(M.hasAttribute?.("data-forma-leaving"))continue;x(M)}S=_.items,w=_.nodes}else{let _=N.map(($,ge)=>({__idx:ge,__item:$})),M=Ne(e,S,_,w,$=>$.__idx,$=>G($.__item,$.__idx),($,ge)=>ne($,ge.__item,ge.__idx),void 0,oe),B=new Set(M.nodes);for(let $ of R)if(!B.has($)){if($.hasAttribute?.("data-forma-leaving"))continue;x($)}S=M.items,w=M.nodes}});n.push(ie)}}let E=!i||i.has("data-fetch")?e.getAttribute("data-fetch"):null;if(E){let u=E.match(Nn);if(u){let p=u[1].trim(),s=u[2].trim(),l=u[3]?.trim()??"",h="GET",y=p,S=p.match(xn);S&&(h=S[1].toUpperCase(),y=S[2].trim());let w,x,G;for(let R of l.split("|").filter(Boolean)){let[_,L]=R.split(":").map(M=>M.trim());_==="loading"?w=L:_==="error"?x=L:_==="poll"&&(G=parseInt(L??"0",10))}let[ne,oe]=Z(null);if(t.getters[s]=ne,t.setters[s]=oe,w){let[R,_]=Z(!1);t.getters[w]=R,t.setters[w]=_}if(x){let[R,_]=Z(null);t.getters[x]=R,t.setters[x]=_}let ie=()=>{w&&t.setters[w](!0),fetch(y,{method:h}).then(R=>R.json()).then(R=>{oe(R),w&&t.setters[w](!1)}).catch(R=>{x&&t.setters[x](R.message),w&&t.setters[w](!1)})},N=e.getAttribute("data-fetch-id");if(N&&(Pe.set(N,ie),n.push(()=>Pe.delete(N))),ie(),G&&G>0){let R=setInterval(ie,G);n.push(()=>clearInterval(R))}}}}var ni=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function ro(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function so(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ao(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function lo(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function co(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function K(e){if(e.__formaDisposers){I&&D("mountScope: SKIPPED (already mounted)");return}let t=io(e),n=[];J(e,t,n);let o=0,i=ao();if(i){let a=e.querySelectorAll(i);for(let r=0;r<a.length;r++)J(a[r],t,n),o++}else{let a=e.querySelectorAll("*");for(let r=0;r<a.length;r++){let c=a[r];ro(c)&&(J(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",I&&D("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function X(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,fo=40,fe=[],me=!1;function uo(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: REMOVED scope"),X(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)X(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: ADDED scope via mutation"),K(o));let i=o.querySelectorAll("[data-forma-state]");I&&i.length>0&&D("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let r=i[a];r.closest("[data-forma-leaving]")||K(r)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;X(t),t.hasAttribute("data-forma-state")&&K(t)}}async function Mt(){try{for(;fe.length>0;){let e=fe.splice(0,fo);for(let t=0;t<e.length;t++)uo(e[t]);fe.length>0&&await ht()}}finally{me=!1,fe.length>0&&!me&&(me=!0,Mt())}}function mo(e){I&&D("MutationObserver: queued",e.length,"mutation(s)"),fe.push(...e),!me&&(me=!0,Mt())}function po(){if(W)return;W=new MutationObserver(mo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function go(){W&&(W.disconnect(),W=null)}function We(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");I&&D("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))K(t);po(),I&&D("initRuntime: MutationObserver started")}function ho(){go();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))X(t)}function vo(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}function bo(e){e.hasAttribute("data-forma-state")&&X(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))X(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",We):We());function Eo(e){I=e}function yo(e){P!==e&&(P=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),qe=new WeakMap,Ge=new WeakMap)}function So(e){if(P!=="mutable"){D(`setUnsafeEval ignored (mode=${P}); unsafe fallback is locked`);return}U!==e&&(U=e,qe=new WeakMap,Ge=new WeakMap)}function To(){return P}function Ao(e){Ve=e}function wo(){return Array.from(ue.values()).map(e=>({...e}))}function _o(){ue.clear()}function ko(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let r of Object.keys(o.getters)){let c=o.getters[r]();a[r]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function Ro(e,t,n){let o=e.__formaScope;o?.setters[t]&&H(()=>{o.setters[t](n)})}function Mo(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);H(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var He=null;function Co(){return He||(He=at({mountScope:K,unmountScope:X,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:H})),He}function No(e,t){Co()(e,t)}return It(xo);})();
//# sourceMappingURL=formajs-runtime.global.js.map

@@ -1,2 +0,2 @@

"use strict";var FormaRuntime=(()=>{var Se=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)Se(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xt(t))!Nt.call(e,i)&&i!==n&&Se(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(Se({},"__esModule",{value:!0}),e);var Co={};Dt(Co,{applyContainmentHints:()=>vt,clearDiagnostics:()=>Ao,destroyRuntime:()=>po,getDiagnostics:()=>To,getScopes:()=>_o,getUnsafeEvalMode:()=>yo,initRuntime:()=>Ue,mount:()=>go,reconcile:()=>Mo,resetScope:()=>ko,setDebug:()=>vo,setDiagnostics:()=>So,setDirectiveMap:()=>io,setScopeValue:()=>wo,setUnsafeEval:()=>Eo,setUnsafeEvalMode:()=>bo,unmount:()=>ho,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:s,updateDirtyFlag:u,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(l,p){let r=p.depsTail;if(r!==void 0&&r.dep===l)return;let f=r!==void 0?r.nextDep:p.deps;if(f!==void 0&&f.dep===l){p.depsTail=f;return}let h=l.subsTail;if(!(h!==void 0&&h.sub===p&&A(h,p)))return g(l,p,f,r)}function s(l){let p=l.nextSub,r,f=0,h=32;e:do{let y=l.sub,T=y.flags,C=!1;if(T&244?T&16&&!(T&4)?(y.flags=T&-17|h|8,C=!0):!(T&224)&&A(l,y)&&(y.flags=T|16|h|8,C=y.subs!==void 0):(y.flags=T|h|8,C=!0),C){let P=y.subs;if(P!==void 0){l=P,P.nextSub!==void 0?(r={target:p,linked:r},++f,p=l.nextSub,h=64):h=T&2?128:64;continue}T&2&&(n[i++]=y)}else T&(4|h)?!(T&h)&&T&224&&A(l,y)&&(y.flags=T|h):(y.flags=T|h|8,(T&10)===2&&(n[i++]=y));if((l=p)!==void 0){p=l.nextSub,h=f?64:32;continue}for(;f--;)if(l=r.target,r=r.linked,l!==void 0){p=l.nextSub,h=f?64:32;continue e}break}while(!0)}function c(l){l.depsTail=void 0,l.flags=l.flags&-249|4}function m(l){let p=l.depsTail;if(p!==void 0){let r=p.nextDep;r!==void 0&&(S(r),p.nextDep=void 0)}else l.deps!==void 0&&(S(l.deps),l.deps=void 0);l.flags&=-5}function u(l,p){return E(l.deps)?(l.flags=p|32,!0):(l.flags=p&-65,!1)}function d(l,p){if(p&32||E(l.deps)){if(e(l)){let r=l.subs;r!==void 0&&_(r)}}else l.flags=p&-65}function b(l,p){if(p&128){l.flags=p&-129;let r=l.deps;do{let f=r.dep;"flags"in f&&f.flags&2&&f.flags&224&&t(f),r=r.nextDep}while(r!==void 0)}}function v(){for(;o<i;){let l=n[o];n[o++]=void 0,t(l)||(l.flags&=-9)}o=0,i=0}function g(l,p,r,f){let h={dep:l,sub:p,nextDep:r,prevSub:void 0,nextSub:void 0};if(f===void 0?p.deps=h:f.nextDep=h,l.subs===void 0)l.subs=h;else{let y=l.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,l.subsTail=h,h}function E(l){let p,r=0,f;e:do{f=!1;let h=l.dep;if(l.sub.flags&32)f=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let T=h.subs;T.nextSub!==void 0&&_(T),f=!0}}else if((y&65)===65){(l.nextSub!==void 0||l.prevSub!==void 0)&&(p={target:l,linked:p}),l=h.deps,++r;continue}}if(!f&&l.nextDep!==void 0){l=l.nextDep;continue}for(;r;){--r;let y=l.sub,T=y.subs;if(f){if(e(y)){T.nextSub!==void 0?(l=p.target,p=p.linked,_(T)):l=T;continue}}else y.flags&=-65;if(T.nextSub!==void 0?(l=p.target,p=p.linked):l=T,l.nextDep!==void 0){l=l.nextDep;continue e}f=!1}return f}while(!0)}function _(l){do{let p=l.sub,r=p.flags;(r&96)===64&&(p.flags=r|32|8,(r&10)===2&&(n[i++]=p)),l=l.nextSub}while(l!==void 0)}function A(l,p){let r=p.depsTail;if(r!==void 0){let f=p.deps;do{if(f===l)return!0;if(f===r)break;f=f.nextDep}while(f!==void 0)}return!1}function S(l){do{let p=l.dep,r=l.nextDep,f=l.nextSub,h=l.prevSub;if(f!==void 0?f.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=f:p.subs=f,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let T=p.deps;if(T!==void 0){l=T,p.depsTail.nextDep=r,p.deps=void 0,p.depsTail=void 0;continue}}l=r}while(l!==void 0)}}var{link:oe,propagate:Ht,updateDirtyFlag:Ut,startTracking:Te,endTracking:Ae,processEffectNotifications:qe,processComputedUpdate:Pt,processPendingInnerEffects:Ge}=$t({updateComputed(e){let t=I;I=e,Te(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{I=t,Ae(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),je=[],_e=0,I,me;function ze(){++_e}function Je(){--_e||qe()}function Ke(){je.push(I),I=void 0}function Xe(){I=je.pop()}function Ye(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function Ze(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Qe(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};I!==void 0?oe(t,I):me!==void 0&&oe(t,me);let n=I;I=t;try{t.fn()}finally{I=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Ut(e,t)){let n=I;I=e,Te(e);try{e.fn()}finally{I=n,Ae(e)}}else Ge(e,e.flags);return!0}function Ft(e){return e.flags&128?(Ge(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Pt(this,e),I!==void 0?oe(this,I):me!==void 0&&oe(this,me),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),_e||qe())}}else return I!==void 0&&oe(this,I),this.currentValue}function qt(){Te(this),Ae(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ke();let n=e();Xe(),e(t(n))}function et(e){let t=Ye(e);return[t,i=>Gt(t,i)]}var Y=et;var we=null;function tt(e){we&&we.disposers.push(e)}function nt(){return we!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=Qe(e);return nt()&&tt(t),t}function ke(e){return Ze(e)}function $(e){ze();try{e()}finally{Je()}}function ot(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let u=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<u?d=v+1:b=v}n[d]=u,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let s=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)s[m]=c,c=i[c];return s}var Jt=32;function Kt(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length,b=new Array(u);for(let r=0;r<u;r++)b[r]=i(t[r]);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=-1;for(let y=0;y<u;y++)if(!g[y]&&b[y]===f){h=y,g[y]=1;break}v[r]=h}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Re(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length;if(d===0){for(let r=0;r<u;r++)if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);return{nodes:[],items:[]}}if(u===0){let r=new Array(d);for(let f=0;f<d;f++){let h=a(n[f]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),r[f]=h}return{nodes:r,items:n}}if(u<Jt)return Kt(e,t,n,o,i,a,s,c,m);let b=new Map;for(let r=0;r<u;r++)b.set(i(t[r]),r);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=b.get(f);h!==void 0?(v[r]=h,g[h]=1):v[r]=-1}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function it(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",s=t.getAttribute("data-forma-state")??"{}",c=it(a),m=it(s);return Zt(c,m)?"PRESERVE":"RESET"}var pe=null;function en(e){return pe||(pe=document.createElement("template")),pe.innerHTML=e,pe.content}function Me(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,s=e.attributes;for(let m=0;m<s.length;m++)if(s[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let u=c[m];if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.getAttribute(u.name)!==u.value&&e.setAttribute(u.name,u.value)}for(let m=s.length-1;m>=0;m--){let u=s[m];if(!t.hasAttribute(u.name)){if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.removeAttribute(u.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let s of Array.from(e.childNodes))s.nodeType===Node.TEXT_NODE&&n.push(s);for(let s=0;s<t.childNodes.length;s++){let c=t.childNodes[s];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:s})}if(n.length===o.length){for(let s=0;s<n.length;s++)n[s].textContent!==o[s].node.textContent&&(n[s].textContent=o[s].node.textContent);return}let i=new Set,a=0;for(let{node:s,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==s.textContent&&(m.textContent=s.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(s.textContent??""),m)}for(let s of n)!i.has(s)&&s.parentNode===e&&e.removeChild(s)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}}return null}function Ce(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,s=[];for(let u of o){if(u.hasAttribute("data-forma-leaving"))continue;let d=u.getAttribute("data-forma-id");d?a.set(d,u):s.push(u)}let c=0,m=new Set;for(let u of i){let d=u.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<s.length;){let v=s[c];if(c++,v.tagName===u.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&u.hasAttribute("data-forma-state"))switch(Qt(b,u)){case"PRESERVE":Me(b,u),Ce(b,u,n);break;case"RESET":n.unmountScope(b),Me(b,u),on(b,u),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=u.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else Me(b,u),Ce(b,u,n);rn(e,b,u,i)}else{let v=u.cloneNode(!0),g=sn(e,u,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let _ of Array.from(E))n.mountScope(_)}}for(let u of o)if(!m.has(u)){if(u.parentElement!==e||u.hasAttribute("data-forma-leaving"))continue;u.hasAttribute("data-forma-state")&&n.unmountScope(u);let d=u.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(u)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let u=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(u&&u.parentElement===e){e.insertBefore(t,u);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}return null}function rt(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let s=en(a),c=document.createElement("div");c.appendChild(s);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let u=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){u=!0;break}}if(m.size>0&&!u){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{Ce(o,c,e)})}finally{e.reconnectObserver()}}}}var Ie=new Map;function gt(e){let t=Ie.get(e);t?t():L&&N(`$refetch: no data-fetch with id "${e}" found`)}function st(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var L=!1,H="mutable",U=!1,Pe=!0;function N(...e){(L||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var le=new Map;function ge(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Oe(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Oe(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=ge(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Oe(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=ge(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=ge(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let s=ge(t.getAttribute("data-forma-auto-containment"));s!==void 0&&(e.autoContainment=s)}}return e}function Z(e,t,n){if(!Pe)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=le.get(o);a?(a.count+=1,a.lastSeenAt=i):(le.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let s={kind:e,expr:t,reason:n,count:le.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:s}))}}catch{}}var at=Oe("locked-off");at&&(H=at,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0),H==="mutable"&&(U=!0));var X=an(),lt=X.lockUnsafeEval?"locked-off":X.unsafeEvalMode;lt&&(H=lt,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0));H==="mutable"&&typeof X.allowUnsafeEval=="boolean"&&(U=X.allowUnsafeEval);typeof X.diagnostics=="boolean"&&(Pe=X.diagnostics);var ln=X.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let s=o[a];if(!s?.style)continue;let c=s.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=s.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",u=s.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=s.style.getPropertyValue("contain"),g=s.style.getPropertyValue("content-visibility"),E=s.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(s.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(s.style.setProperty("content-visibility",m),b=!0),u!=="off"&&(!d||!E)&&(s.style.setProperty("contain-intrinsic-size",u),b=!0),b&&i++}return L&&i>0&&N("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,$e=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,_n=/^(\+\+|--)(\w+)$/,wn=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/(\w+)\s*:/g,xn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,Dn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Ln=/^\{item\.?|\}$/g,In=/\bevent\b|\$event\b/,On=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Ee=Symbol.for("forma-transition-state"),$n=2048,re=new Map;function ie(e,t){if(re.size>=$n){let n=re.keys().next().value;n!==void 0&&re.delete(n)}re.set(e,t)}var Be=new WeakMap,Fe=new WeakMap,ct=new Map,We=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval"]),Hn=(()=>{let e=[];for(let t of We){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Hn)if(o.test(t)||i.test(t))return n;return null}var ft=Symbol.for("forma-text-binding-cache");function Un(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Pn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function He(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,s=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(s,c).trim()),s=c+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}function Q(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,s=!1,c=!1,m=!1;for(let u=t;u<e.length;u++){let d=e[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,u),end:u}}return null}function Bn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,s=!1,c=!1,m=!1,u=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(u){u=!1;continue}if(g==="\\"&&(s||c||m)){u=!0;continue}if(s){g==="'"&&(s=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){s=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let u=Q(t,0,"{","}");if(!u)return null;let d=u.inner.trim(),b=t.slice(u.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,s=!1,c=!1,m=!1;for(let u=0;u<t.length;u++){let d=t[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,u).trim(),rest:t.slice(u+1).trim()}}return{body:t,rest:""}}function Fn(e,t){let n=e.trim();if(!Mn.test(n)||In.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=Q(n,o,"(",")");if(!i)return null;let a=M(i.inner.trim(),t);if(!a)return null;let s=n.slice(i.end+1).trim(),c=ut(s);if(!c||!c.body)return null;let m=ye(c.body,t);if(!m)return null;s=c.rest.trim();let u=null;if(s.startsWith("else")){s=s.slice(4).trim();let d=ut(s);if(!d||!d.body||(u=ye(d.body,t),!u))return null;s=d.rest.trim()}return s.length>0?null:d=>{$(()=>{a()?m(d):u?.(d)})}}function Wn(e){let t=e.trim();for(;t.startsWith("(");){let n=Q(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=ct.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,s;for(;(s=a.exec(e))!==null;)n.push(e.slice(i,s.index)),o.push(s[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return ct.set(e,c),c}var _t=new WeakMap;function Ve(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Vn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let s=At(a);_t.set(i,s),i.textContent=Ve(s,t)}}return Yn(n,t),n}function qn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=_t.get(o);i&&(o.textContent=Ve(i,t))}}var Gn=new WeakMap,jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function zn(e){for(let t of jn)if(e===t||e.startsWith(t))return!0;return!1}function se(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function ce(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function xe(e){let t=[],n;for(let o of se(e)){let i=ce(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function G(e){return Array.from(new Set(e.filter(Boolean)))}function he(e){return e?e.split(",").map(t=>ce(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,s=t[i%t.length]??0;a+s>o&&(o=a+s)}return o}function Jn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(he(n.transitionDuration),he(n.transitionDelay)),i=dt(he(n.animationDuration),he(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Ee];if(t)return t;let n={token:0,cancel:null};return e[Ee]=n,n}function ve(e){let t=e[Ee];t?.cancel&&t.cancel(),delete e[Ee]}function Ne(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=xe(e.getAttribute("data-transition")).classes,o=xe(e.getAttribute("data-transition:enter")),i=xe(e.getAttribute("data-transition:leave")),a=se(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),s=se(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=se(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=se(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),u=ce(e.getAttribute("data-transition:duration")??""),d=ce(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??u??void 0,b=ce(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??u??void 0;return{enter:G([...n,...o.classes]),enterFrom:G(a),enterTo:G(s),leave:G([...n,...i.classes]),leaveFrom:G(c),leaveTo:G(m),enterDurationMs:d,leaveDurationMs:b}}function be(e,t){for(let n of t)e.classList.remove(n)}function De(e,t){for(let n of t)e.classList.add(n)}function ue(e,t,n){let o=G([...t.base,...t.from,...t.to]),i=!1,a=null,s=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),s!=null&&cancelAnimationFrame(s),c!=null&&cancelAnimationFrame(c),be(e,o),n())};return De(e,t.base),De(e,t.from),be(e,t.to),s=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;be(e,t.from),De(e,t.to);let u=Jn(e,t.durationMs);if(u<=0){m();return}a=window.setTimeout(m,u+25)})}),m}function Kn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=ue(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=ue(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Xn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&be(e,G([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=ue(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)});return}i.cancel=ue(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let s=q(e);s.token===a&&(e.style.display="none",s.cancel=null)})}function Yn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!zn(a.name)&&a.value.includes("{item")){let s=At(a.value);i.push({attr:a.name,compiled:s}),o.setAttribute(a.name,Ve(s,t))}i.length>0&&Gn.set(o,i)}}function Zn(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let u=m[0];if(n+=u.length,We.has(u))return()=>{};if(n<e.length&&e[n]==="("){let d=Q(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of He(b)){let E=M(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:u,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:u,optional:c})}if(n!==e.length||a.length===0)return null;let s=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=s();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let u=c[m.name];if(typeof u!="function")return;let d=m.argFns.map(b=>b());c=u.apply(c,d)}}return c}}function M(e,t){let n=re.get(e);if(n)return n(t);let o=Qn(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;ie(e,()=>()=>i)}else if(St.test(e))ie(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);ie(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);ie(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],s=i[2];ie(e,c=>()=>c.getters[a]?.()?.[s])}}return o}function Qn(e,t){e=e.trim();let n=Wn(e);if(n!==e)return M(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=Zn(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],_=o[3].trim();if(We.has(E))return()=>{};let A=M(g,t);if(!A)return null;let S=[];for(let l of He(_)){let p=M(l,t);if(!p)return null;S.push(p)}return()=>{let l=A(),p=l?.[E];if(typeof p!="function")return;let r=S.map(f=>f());return p.apply(l,r)}}if(e.startsWith("!")){let g=M(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=M(i[1],t),E,_=i[2];if(Tn.test(_)?E=Number(_):E=_.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=Q(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let _=He(E),A=[],S=!0;for(let l of _){let p=M(l.trim(),t);if(!p){S=!1;break}A.push(p)}if(S)return()=>A.map(l=>l())}}let a=e.match(dn);if(a){let g=M(a[1].trim(),t),E=M(a[2].trim(),t),_=M(a[3].trim(),t);if(g&&E&&_)return()=>g()?E():_()}let s=e.match(mn);if(s){let g=M(s[1].trim(),t),E=M(s[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=M(c[1].trim(),t),E=M(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=M(m[1].trim(),t),E=M(m[2].trim(),t);if(g&&E)return()=>g()||E()}let u=e.match(hn);if(u){let g=M(u[1].trim(),t),E=M(u[3].trim(),t);if(g&&E){let _=u[2];return()=>{let A=g(),S=E();switch(_){case"===":return A===S;case"!==":return A!==S;case"==":return A==S;case"!=":return A!=S;case">":return A>S;case"<":return A<S;case">=":return A>=S;case"<=":return A<=S}}}}let d=e.match(vn);if(d){let g=M(d[1].trim(),t),E=M(d[3].trim(),t);if(g&&E){let _=d[2];return()=>{let A=g(),S=E();switch(_){case"*":return A*S;case"/":return A/S;case"%":return A%S}}}}let b=e.match(bn);if(b){let g=M(b[1].trim(),t),E=M(b[3].trim(),t);if(g&&E){let _=b[2];return()=>{let A=g(),S=E();return _==="+"?A+S:A-S}}}let v=e.match(En);if(v){let g=v[1],E=[],_=[],A=0,S=new RegExp(yn.source,"g"),l;for(;(l=S.exec(g))!==null;){E.push(g.slice(A,l.index));let p=M(l[1].trim(),t);if(!p)return null;_.push(p),A=S.lastIndex}return E.push(g.slice(A)),()=>{let p=E[0];for(let r=0;r<_.length;r++)p+=String(_[r]()??""),p+=E[r+1]??"";return p}}return null}function wt(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function j(e,t){let n=e.replace($e,"").trim(),o=wt(Be,t),i=o.get(n);if(i)return i;let a=M(n,t);if(a)return o.set(n,a),a;if(!U){N("buildEvaluator: blocked unsafe eval fallback for expression:",n),Z("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in expression`;throw Z("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){let v=t.getters[b];return v?v():void 0}}),u=()=>c(m);return o.set(n,u),u}catch{Z("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function ye(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Fn(n,t);if(o)return o;let i=Bn(n);if(i.length>1){let v=i.map(g=>ye(g,t));return v.every(g=>g!==null)?g=>{$(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,s=a.match(An);if(s){let v=s[1],g=s[2];return()=>{$(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(_n);if(c){let v=c[1],g=c[2];return()=>{$(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(wn);if(m&&m[1]===m[2]){let v=m[1];return()=>{$(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let u=a.match(kn);if(u){let v=u[1],g=M(u[2].trim(),t);if(g)return L&&N(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{$(()=>{let E=g();L&&N(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=M(d[3].trim(),t);if(E)return()=>{$(()=>{let _=t.getters[v]?.()??0,A=E();switch(g){case"+=":t.setters[v]?.(_+A);break;case"-=":t.setters[v]?.(_-A);break;case"*=":t.setters[v]?.(_*A);break;case"/=":t.setters[v]?.(_/A);break}})}}let b=a.match(On);if(b){let v=b[1];return()=>gt(v)}return null}function eo(e,t){let n=e.trim();if(n.startsWith("{")){let c=Q(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=wt(Fe,t),i=o.get(n);if(i)return i;let a=ye(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){N("buildHandler: blocked unsafe eval fallback for expression:",n),Z("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in handler`;throw Z("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{$(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Z("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var to=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{try{t=JSON.parse(e.replace(Cn,'"$1":'))}catch{return{}}}for(let n of to)n in t&&delete t[n];return t}function no(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);L&&(N("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&N("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[s,c]of Object.entries(n)){let[m,u]=Y(c);i[s]=m,a[s]=u}return i.$refetch=()=>gt,{getters:i,setters:a}}function z(e,t,n){let o=so(e),i=!o||o.has("data-computed")?e.getAttribute("data-computed"):null;if(i){let S=i.split(/;\s*(?=\w+\s*=[^=])/);for(let l of S){let p=l.trim();if(!p)continue;let r=p.match(xn);if(r){let f=r[1],h=r[2],y=t.getters[f];delete t.getters[f];let T=j(`{${h}}`,t),C=ke(T);t.getters[f]=C,y||delete t.setters[f]}}}let a=!o||o.has("data-text")?e.getAttribute("data-text"):null;if(a){let S=j(a,t),l=F(()=>{Pn(e,Un(S()))});n.push(l)}let s=!o||o.has("data-show")?e.getAttribute("data-show"):null;if(s){let S=j(s,t),l=Ne(e);if(L){let f=e.tagName.toLowerCase(),h=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-show="${s}" on <${f}${h}>`)}let p=!1,r=F(()=>{let f=!!S();L&&N(`data-show effect: "${s}" \u2192 ${f}`),Xn(e,f,l,!p),p=!0});n.push(r),l&&n.push(()=>ve(e))}let c=!o||o.has("data-if")?e.getAttribute("data-if"):null;if(c){let S=j(c,t),l=Ne(e),p=document.createComment("forma-if"),r=e.parentNode,f=!0,h=!1,y=F(()=>{let T=!!S();T&&!f?(ve(e),e.removeAttribute("data-forma-leaving"),h&&l?Kn(e,r,p,l):r?.insertBefore(e,p),f=!0):!T&&f&&(h&&l?mt(e,l,()=>{e.parentNode&&(r?.insertBefore(p,e),e.remove())}):(r?.insertBefore(p,e),e.remove()),f=!1),h=!0});n.push(y),l&&n.push(()=>ve(e))}let m=!o||o.has("data-model")?e.getAttribute("data-model"):null;if(m){let S=m.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r=e,f=F(()=>{let T=l();r.type==="checkbox"?r.checked=!!T:r.value=String(T??"")});n.push(f);let h=r.type==="checkbox"?"change":"input",y=()=>{r.type==="checkbox"?p(r.checked):r.type==="number"||r.type==="range"?p(Number(r.value)):p(r.value)};r.addEventListener(h,y),n.push(()=>{r.removeEventListener(h,y)})}}let u=!o||ao(o,"data-on:","data-class:","data-bind:"),d=e.attributes;if(u)for(let S=0;S<d.length;S++){let l=d[S],p=l.name;if(p.startsWith("data-on:")){let r=p.slice(8),f=eo(l.value,t),h=f.handler;if(L){let y=e.tagName.toLowerCase(),T=e.id?`#${e.id}`:"",C=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-on:${r}="${l.value}" on <${y}${T}${C}>`)}if(f.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),L){let y=l.value,T=C=>{N(`HANDLER FIRED: data-on:${r}="${y}"`,"isTrusted:",C.isTrusted),h(C)};e.addEventListener(r,T),n.push(()=>{e.removeEventListener(r,T)})}else e.addEventListener(r,h),n.push(()=>{e.removeEventListener(r,h)})}else if(p.startsWith("data-class:")){let r=p.slice(11),f=j(l.value,t),h=F(()=>{e.classList.toggle(r,!!f())});n.push(h)}else if(p.startsWith("data-bind:")){let r=p.slice(10),f=j(l.value,t),h=F(()=>{let y=f();y==null||y===!1?e.removeAttribute(r):e.setAttribute(r,String(y))});n.push(h)}}let b=!o||o.has("data-persist")?e.getAttribute("data-persist"):null;if(b){let S=b.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r="forma:"+S;try{let h=localStorage.getItem(r);h!==null&&p(JSON.parse(h))}catch{}let f=F(()=>{try{localStorage.setItem(r,JSON.stringify(l()))}catch{}});n.push(f)}}let v=!o||o.has("data-list")?e.getAttribute("data-list"):null;if(v){let S=j(v,t),l=e.children[0];if(l){let C=function(x){let k=x;if(Array.isArray(k.__formaDisposers)){for(let w of k.__formaDisposers)try{w()}catch{}delete k.__formaDisposers}},P=function(x,k){let w=Vn(p,x),D=st(t,{item:x,index:k}),R=[];z(w,D,R);for(let B of Array.from(w.querySelectorAll("*")))z(B,D,R);return w.__formaDisposers=R,w},ee=function(x,k,w){C(x),qn(x,k);let D=st(t,{item:k,index:w}),R=[];z(x,D,R);for(let B of Array.from(x.querySelectorAll("*")))z(B,D,R);x.__formaDisposers=R};var E=C,_=P,A=ee;let p=l.cloneNode(!0);e.removeChild(l);let r=p.getAttribute("data-key"),f=r?r.replace(Ln,"").trim():null,h=Ne(e),y=[],T=[],te=h?{onInsert:x=>{let k=x;if(!k.setAttribute)return;let w=q(k);w.token+=1;let D=w.token;w.cancel&&w.cancel(),w.cancel=ue(k,{base:h.enter,from:h.enterFrom,to:h.enterTo,durationMs:h.enterDurationMs},()=>{let R=q(k);R.token===D&&(R.cancel=null)})},onBeforeRemove:(x,k)=>{let w=x;if(!w.setAttribute){k();return}C(x),mt(w,h,()=>{k()})}}:void 0,ne=F(()=>{let x=S();if(!Array.isArray(x)){for(let w of T)C(w),e.removeChild(w);y=[],T=[];return}if(h){let w=e.querySelectorAll("[data-forma-leaving]");for(let D of Array.from(w))ve(D),D.removeAttribute("data-forma-leaving"),D.parentNode&&D.parentNode.removeChild(D)}let k=new Set(T);if(f){let w=Re(e,y,x,T,R=>String(R?.[f]??""),R=>{let B=x.indexOf(R);return P(R,B)},(R,B)=>{let O=x.indexOf(B);ee(R,B,O)},void 0,te),D=new Set(w.nodes);for(let R of k)if(!D.has(R)){if(R.hasAttribute?.("data-forma-leaving"))continue;C(R)}y=w.items,T=w.nodes}else{let w=x.map((O,de)=>({__idx:de,__item:O})),R=Re(e,y,w,T,O=>O.__idx,O=>P(O.__item,O.__idx),(O,de)=>ee(O,de.__item,de.__idx),void 0,te),B=new Set(R.nodes);for(let O of k)if(!B.has(O)){if(O.hasAttribute?.("data-forma-leaving"))continue;C(O)}y=R.items,T=R.nodes}});n.push(ne)}}let g=!o||o.has("data-fetch")?e.getAttribute("data-fetch"):null;if(g){let S=g.match(Nn);if(S){let l=S[1].trim(),p=S[2].trim(),r=S[3]?.trim()??"",f="GET",h=l,y=l.match(Dn);y&&(f=y[1].toUpperCase(),h=y[2].trim());let T,C,P;for(let k of r.split("|").filter(Boolean)){let[w,D]=k.split(":").map(R=>R.trim());w==="loading"?T=D:w==="error"?C=D:w==="poll"&&(P=parseInt(D??"0",10))}let[ee,te]=Y(null);if(t.getters[p]=ee,t.setters[p]=te,T){let[k,w]=Y(!1);t.getters[T]=k,t.setters[T]=w}if(C){let[k,w]=Y(null);t.getters[C]=k,t.setters[C]=w}let ne=()=>{T&&t.setters[T](!0),fetch(h,{method:f}).then(k=>k.json()).then(k=>{te(k),T&&t.setters[T](!1)}).catch(k=>{C&&t.setters[C](k.message),T&&t.setters[T](!1)})},x=e.getAttribute("data-fetch-id");if(x&&(Ie.set(x,ne),n.push(()=>Ie.delete(x))),ne(),P&&P>0){let k=setInterval(ne,P);n.push(()=>clearInterval(k))}}}}var ei=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function oo(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function io(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ro(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function so(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function ao(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function J(e){if(e.__formaDisposers){L&&N("mountScope: SKIPPED (already mounted)");return}let t=no(e),n=[];z(e,t,n);let o=0,i=ro();if(i){let a=e.querySelectorAll(i);for(let s=0;s<a.length;s++)z(a[s],t,n),o++}else{let a=e.querySelectorAll("*");for(let s=0;s<a.length;s++){let c=a[s];oo(c)&&(z(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",L&&N("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function K(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,lo=40,ae=[],fe=!1;function co(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: REMOVED scope"),K(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)K(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: ADDED scope via mutation"),J(o));let i=o.querySelectorAll("[data-forma-state]");L&&i.length>0&&N("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let s=i[a];s.closest("[data-forma-leaving]")||J(s)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;K(t),t.hasAttribute("data-forma-state")&&J(t)}}async function Mt(){try{for(;ae.length>0;){let e=ae.splice(0,lo);for(let t=0;t<e.length;t++)co(e[t]);ae.length>0&&await ht()}}finally{fe=!1,ae.length>0&&!fe&&(fe=!0,Mt())}}function fo(e){L&&N("MutationObserver: queued",e.length,"mutation(s)"),ae.push(...e),!fe&&(fe=!0,Mt())}function uo(){if(W)return;W=new MutationObserver(fo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function mo(){W&&(W.disconnect(),W=null)}function Ue(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");L&&N("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))J(t);uo(),L&&N("initRuntime: MutationObserver started")}function po(){mo();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))K(t)}function go(e){e.hasAttribute("data-forma-state")&&J(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))J(n)}function ho(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Ue):Ue());function vo(e){L=e}function bo(e){H!==e&&(H=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),Be=new WeakMap,Fe=new WeakMap)}function Eo(e){if(H!=="mutable"){N(`setUnsafeEval ignored (mode=${H}); unsafe fallback is locked`);return}U!==e&&(U=e,Be=new WeakMap,Fe=new WeakMap)}function yo(){return H}function So(e){Pe=e}function To(){return Array.from(le.values()).map(e=>({...e}))}function Ao(){le.clear()}function _o(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let s of Object.keys(o.getters)){let c=o.getters[s]();a[s]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function wo(e,t,n){let o=e.__formaScope;o?.setters[t]&&$(()=>{o.setters[t](n)})}function ko(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);$(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var Le=null;function Ro(){return Le||(Le=rt({mountScope:J,unmountScope:K,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:$})),Le}function Mo(e,t){Ro()(e,t)}return It(Co);})();
"use strict";var FormaRuntime=(()=>{var we=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var xt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)we(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Nt(t))!xt.call(e,i)&&i!==n&&we(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(we({},"__esModule",{value:!0}),e);var xo={};Dt(xo,{applyContainmentHints:()=>vt,clearDiagnostics:()=>_o,destroyRuntime:()=>ho,getDiagnostics:()=>wo,getScopes:()=>ko,getUnsafeEvalMode:()=>To,initRuntime:()=>We,mount:()=>vo,reconcile:()=>No,resetScope:()=>Mo,setDebug:()=>Eo,setDiagnostics:()=>Ao,setDirectiveMap:()=>so,setScopeValue:()=>Ro,setUnsafeEval:()=>So,setUnsafeEvalMode:()=>yo,unmount:()=>bo,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:r,updateDirtyFlag:f,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(u,p){let s=p.depsTail;if(s!==void 0&&s.dep===u)return;let l=s!==void 0?s.nextDep:p.deps;if(l!==void 0&&l.dep===u){p.depsTail=l;return}let h=u.subsTail;if(!(h!==void 0&&h.sub===p&&T(h,p)))return g(u,p,l,s)}function r(u){let p=u.nextSub,s,l=0,h=32;e:do{let y=u.sub,S=y.flags,w=!1;if(S&244?S&16&&!(S&4)?(y.flags=S&-17|h|8,w=!0):!(S&224)&&T(u,y)&&(y.flags=S|16|h|8,w=y.subs!==void 0):(y.flags=S|h|8,w=!0),w){let x=y.subs;if(x!==void 0){u=x,x.nextSub!==void 0?(s={target:p,linked:s},++l,p=u.nextSub,h=64):h=S&2?128:64;continue}S&2&&(n[i++]=y)}else S&(4|h)?!(S&h)&&S&224&&T(u,y)&&(y.flags=S|h):(y.flags=S|h|8,(S&10)===2&&(n[i++]=y));if((u=p)!==void 0){p=u.nextSub,h=l?64:32;continue}for(;l--;)if(u=s.target,s=s.linked,u!==void 0){p=u.nextSub,h=l?64:32;continue e}break}while(!0)}function c(u){u.depsTail=void 0,u.flags=u.flags&-249|4}function m(u){let p=u.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(k(s),p.nextDep=void 0)}else u.deps!==void 0&&(k(u.deps),u.deps=void 0);u.flags&=-5}function f(u,p){return E(u.deps)?(u.flags=p|32,!0):(u.flags=p&-65,!1)}function d(u,p){if(p&32||E(u.deps)){if(e(u)){let s=u.subs;s!==void 0&&A(s)}}else u.flags=p&-65}function b(u,p){if(p&128){u.flags=p&-129;let s=u.deps;do{let l=s.dep;"flags"in l&&l.flags&2&&l.flags&224&&t(l),s=s.nextDep}while(s!==void 0)}}function v(){for(;o<i;){let u=n[o];n[o++]=void 0,t(u)||(u.flags&=-9)}o=0,i=0}function g(u,p,s,l){let h={dep:u,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(l===void 0?p.deps=h:l.nextDep=h,u.subs===void 0)u.subs=h;else{let y=u.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,u.subsTail=h,h}function E(u){let p,s=0,l;e:do{l=!1;let h=u.dep;if(u.sub.flags&32)l=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let S=h.subs;S.nextSub!==void 0&&A(S),l=!0}}else if((y&65)===65){(u.nextSub!==void 0||u.prevSub!==void 0)&&(p={target:u,linked:p}),u=h.deps,++s;continue}}if(!l&&u.nextDep!==void 0){u=u.nextDep;continue}for(;s;){--s;let y=u.sub,S=y.subs;if(l){if(e(y)){S.nextSub!==void 0?(u=p.target,p=p.linked,A(S)):u=S;continue}}else y.flags&=-65;if(S.nextSub!==void 0?(u=p.target,p=p.linked):u=S,u.nextDep!==void 0){u=u.nextDep;continue e}l=!1}return l}while(!0)}function A(u){do{let p=u.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[i++]=p)),u=u.nextSub}while(u!==void 0)}function T(u,p){let s=p.depsTail;if(s!==void 0){let l=p.deps;do{if(l===u)return!0;if(l===s)break;l=l.nextDep}while(l!==void 0)}return!1}function k(u){do{let p=u.dep,s=u.nextDep,l=u.nextSub,h=u.prevSub;if(l!==void 0?l.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=l:p.subs=l,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let S=p.deps;if(S!==void 0){u=S,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}u=s}while(u!==void 0)}}var{link:re,propagate:Ht,updateDirtyFlag:Pt,startTracking:_e,endTracking:ke,processEffectNotifications:ze,processComputedUpdate:Ut,processPendingInnerEffects:Je}=$t({updateComputed(e){let t=O;O=e,_e(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{O=t,ke(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),Ke=[],Re=0,O,he;function Xe(){++Re}function Ye(){--Re||ze()}function Ze(){Ke.push(O),O=void 0}function Qe(){O=Ke.pop()}function et(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function tt(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function nt(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};O!==void 0?re(t,O):he!==void 0&&re(t,he);let n=O;O=t;try{t.fn()}finally{O=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Pt(e,t)){let n=O;O=e,_e(e);try{e.fn()}finally{O=n,ke(e)}}else Je(e,e.flags);return!0}function Ft(e){return e.flags&128?(Je(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Ut(this,e),O!==void 0?re(this,O):he!==void 0&&re(this,he),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),Re||ze())}}else return O!==void 0&&re(this,O),this.currentValue}function qt(){_e(this),ke(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ze();let n=e();Qe(),e(t(n))}function Z(e){let t=et(e);return[t,i=>Gt(t,i)]}var Me=null;function ot(e){Me&&Me.disposers.push(e)}function it(){return Me!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=nt(e);return it()&&ot(t),t}function Ce(e){return tt(e)}function H(e){Xe();try{e()}finally{Ye()}}function rt(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let f=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<f?d=v+1:b=v}n[d]=f,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let r=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)r[m]=c,c=i[c];return r}var Jt=32;function Kt(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length,b=new Array(f);for(let s=0;s<f;s++)b[s]=i(t[s]);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=-1;for(let y=0;y<f;y++)if(!g[y]&&b[y]===l){h=y,g[y]=1;break}v[s]=h}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Ne(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length;if(d===0){for(let s=0;s<f;s++)if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(f===0){let s=new Array(d);for(let l=0;l<d;l++){let h=a(n[l]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),s[l]=h}return{nodes:s,items:n}}if(f<Jt)return Kt(e,t,n,o,i,a,r,c,m);let b=new Map;for(let s=0;s<f;s++)b.set(i(t[s]),s);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=b.get(l);h!==void 0?(v[s]=h,g[h]=1):v[s]=-1}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function st(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",r=t.getAttribute("data-forma-state")??"{}",c=st(a),m=st(r);return Zt(c,m)?"PRESERVE":"RESET"}var ve=null;function en(e){return ve||(ve=document.createElement("template")),ve.innerHTML=e,ve.content}function xe(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,r=e.attributes;for(let m=0;m<r.length;m++)if(r[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let f=c[m];if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.getAttribute(f.name)!==f.value&&e.setAttribute(f.name,f.value)}for(let m=r.length-1;m>=0;m--){let f=r[m];if(!t.hasAttribute(f.name)){if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.removeAttribute(f.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let r of Array.from(e.childNodes))r.nodeType===Node.TEXT_NODE&&n.push(r);for(let r=0;r<t.childNodes.length;r++){let c=t.childNodes[r];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:r})}if(n.length===o.length){for(let r=0;r<n.length;r++)n[r].textContent!==o[r].node.textContent&&(n[r].textContent=o[r].node.textContent);return}let i=new Set,a=0;for(let{node:r,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==r.textContent&&(m.textContent=r.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(r.textContent??""),m)}for(let r of n)!i.has(r)&&r.parentNode===e&&e.removeChild(r)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}}return null}function De(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,r=[];for(let f of o){if(f.hasAttribute("data-forma-leaving"))continue;let d=f.getAttribute("data-forma-id");d?a.set(d,f):r.push(f)}let c=0,m=new Set;for(let f of i){let d=f.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<r.length;){let v=r[c];if(c++,v.tagName===f.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&f.hasAttribute("data-forma-state"))switch(Qt(b,f)){case"PRESERVE":xe(b,f),De(b,f,n);break;case"RESET":n.unmountScope(b),xe(b,f),on(b,f),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=f.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else xe(b,f),De(b,f,n);rn(e,b,f,i)}else{let v=f.cloneNode(!0),g=sn(e,f,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let A of Array.from(E))n.mountScope(A)}}for(let f of o)if(!m.has(f)){if(f.parentElement!==e||f.hasAttribute("data-forma-leaving"))continue;f.hasAttribute("data-forma-state")&&n.unmountScope(f);let d=f.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(f)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let f=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(f&&f.parentElement===e){e.insertBefore(t,f);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}return null}function at(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let r=en(a),c=document.createElement("div");c.appendChild(r);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let f=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){f=!0;break}}if(m.size>0&&!f){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{De(o,c,e)})}finally{e.reconnectObserver()}}}}var Pe=new Map;function gt(e){let t=Pe.get(e);t?t():I&&D(`$refetch: no data-fetch with id "${e}" found`)}function Le(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var I=!1,P="mutable",U=!1,Ve=!0;function D(...e){(I||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var ue=new Map;function be(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Ue(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Ue(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=be(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Ue(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=be(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=be(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let r=be(t.getAttribute("data-forma-auto-containment"));r!==void 0&&(e.autoContainment=r)}}return e}function Q(e,t,n){if(!Ve)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=ue.get(o);a?(a.count+=1,a.lastSeenAt=i):(ue.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let r={kind:e,expr:t,reason:n,count:ue.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:r}))}}catch{}}var lt=Ue("locked-off");lt&&(P=lt,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0),P==="mutable"&&(U=!0));var Y=an(),ct=Y.lockUnsafeEval?"locked-off":Y.unsafeEvalMode;ct&&(P=ct,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0));P==="mutable"&&typeof Y.allowUnsafeEval=="boolean"&&(U=Y.allowUnsafeEval);typeof Y.diagnostics=="boolean"&&(Ve=Y.diagnostics);var ln=Y.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let r=o[a];if(!r?.style)continue;let c=r.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=r.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",f=r.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=r.style.getPropertyValue("contain"),g=r.style.getPropertyValue("content-visibility"),E=r.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(r.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(r.style.setProperty("content-visibility",m),b=!0),f!=="off"&&(!d||!E)&&(r.style.setProperty("contain-intrinsic-size",f),b=!0),b&&i++}return I&&i>0&&D("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,Be=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,wn=/^(\+\+|--)(\w+)$/,_n=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,xn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Dn=/^\{item\.?|\}$/g,Ln=/\bevent\s*[.([]|\$event\b/,In=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Te=Symbol.for("forma-transition-state"),On=2048,ae=new Map;function se(e,t){if(ae.size>=On){let n=ae.keys().next().value;n!==void 0&&ae.delete(n)}ae.set(e,t)}var qe=new WeakMap,Ge=new WeakMap,le=new Map,$n=2048;function Hn(e,t){if(le.size>=$n){let n=le.keys().next().value;n!==void 0&&le.delete(n)}le.set(e,t)}var ee=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval","Function"]),Pn=(()=>{let e=[];for(let t of ee){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Pn)if(o.test(t)||i.test(t))return n;if(t.includes("[")){let n=Un(t);for(let o of n){if(!o.includes("+"))continue;let i=o.match(/['"`]([^'"`]*?)['"`]/g);if(!i)continue;let a=i.map(r=>r.slice(1,-1)).join("");if(ee.has(a))return a}}return null}function Un(e){let t=[],n=0,o=-1;for(let i=0;i<e.length;i++)e[i]==="["?(n===0&&(o=i+1),n++):e[i]==="]"&&(n--,n===0&&o>=0&&(t.push(e.slice(o,i)),o=-1));return t}var ft=Symbol.for("forma-text-binding-cache");function Bn(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Fn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function Fe(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,r=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(r,c).trim()),r=c+1)}return t.push(e.slice(r).trim()),t.filter(Boolean)}function te(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,r=!1,c=!1,m=!1;for(let f=t;f<e.length;f++){let d=e[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,f),end:f}}return null}function Wn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,r=!1,c=!1,m=!1,f=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(f){f=!1;continue}if(g==="\\"&&(r||c||m)){f=!0;continue}if(r){g==="'"&&(r=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){r=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let f=te(t,0,"{","}");if(!f)return null;let d=f.inner.trim(),b=t.slice(f.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,r=!1,c=!1,m=!1;for(let f=0;f<t.length;f++){let d=t[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,f).trim(),rest:t.slice(f+1).trim()}}return{body:t,rest:""}}function Vn(e,t){let n=e.trim();if(!Mn.test(n)||Ln.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=te(n,o,"(",")");if(!i)return null;let a=C(i.inner.trim(),t);if(!a)return null;let r=n.slice(i.end+1).trim(),c=ut(r);if(!c||!c.body)return null;let m=Ae(c.body,t);if(!m)return null;r=c.rest.trim();let f=null;if(r.startsWith("else")){r=r.slice(4).trim();let d=ut(r);if(!d||!d.body||(f=Ae(d.body,t),!f))return null;r=d.rest.trim()}return r.length>0?null:d=>{H(()=>{a()?m(d):f?.(d)})}}function qn(e){let t=e.trim();for(;t.startsWith("(");){let n=te(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=le.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,r;for(;(r=a.exec(e))!==null;)n.push(e.slice(i,r.index)),o.push(r[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return Hn(e,c),c}var wt=new WeakMap;function je(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Gn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let r=At(a);wt.set(i,r),i.textContent=je(r,t)}}return Qn(n,t),n}function jn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=wt.get(o);i&&(o.textContent=je(i,t))}}var zn=new WeakMap,Jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function Kn(e){for(let t of Jn)if(e===t||e.startsWith(t))return!0;return!1}function ce(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function de(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function Ie(e){let t=[],n;for(let o of ce(e)){let i=de(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function j(e){return Array.from(new Set(e.filter(Boolean)))}function Ee(e){return e?e.split(",").map(t=>de(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,r=t[i%t.length]??0;a+r>o&&(o=a+r)}return o}function Xn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(Ee(n.transitionDuration),Ee(n.transitionDelay)),i=dt(Ee(n.animationDuration),Ee(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Te];if(t)return t;let n={token:0,cancel:null};return e[Te]=n,n}function ye(e){let t=e[Te];t?.cancel&&t.cancel(),delete e[Te]}function Oe(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=Ie(e.getAttribute("data-transition")).classes,o=Ie(e.getAttribute("data-transition:enter")),i=Ie(e.getAttribute("data-transition:leave")),a=ce(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),r=ce(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=ce(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=ce(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),f=de(e.getAttribute("data-transition:duration")??""),d=de(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??f??void 0,b=de(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??f??void 0;return{enter:j([...n,...o.classes]),enterFrom:j(a),enterTo:j(r),leave:j([...n,...i.classes]),leaveFrom:j(c),leaveTo:j(m),enterDurationMs:d,leaveDurationMs:b}}function Se(e,t){for(let n of t)e.classList.remove(n)}function $e(e,t){for(let n of t)e.classList.add(n)}function pe(e,t,n){let o=j([...t.base,...t.from,...t.to]),i=!1,a=null,r=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),r!=null&&cancelAnimationFrame(r),c!=null&&cancelAnimationFrame(c),Se(e,o),n())};return $e(e,t.base),$e(e,t.from),Se(e,t.to),r=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;Se(e,t.from),$e(e,t.to);let f=Xn(e,t.durationMs);if(f<=0){m();return}a=window.setTimeout(m,f+25)})}),m}function Yn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=pe(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=pe(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Zn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&Se(e,j([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=pe(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)});return}i.cancel=pe(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let r=q(e);r.token===a&&(e.style.display="none",r.cancel=null)})}function Qn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!Kn(a.name)&&a.value.includes("{item")){let r=At(a.value);i.push({attr:a.name,compiled:r}),o.setAttribute(a.name,je(r,t))}i.length>0&&zn.set(o,i)}}function eo(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let f=m[0];if(n+=f.length,ee.has(f))return()=>{};if(n<e.length&&e[n]==="("){let d=te(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of Fe(b)){let E=C(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:f,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:f,optional:c})}if(n!==e.length||a.length===0)return null;let r=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=r();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let f=c[m.name];if(typeof f!="function")return;let d=m.argFns.map(b=>b());c=f.apply(c,d)}}return c}}function C(e,t){let n=ae.get(e);if(n)return n(t);let o=to(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;se(e,()=>()=>i)}else if(St.test(e))se(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);se(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);se(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],r=i[2];se(e,c=>()=>c.getters[a]?.()?.[r])}}return o}function to(e,t){e=e.trim();let n=qn(e);if(n!==e)return C(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=eo(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],A=o[3].trim();if(ee.has(E))return()=>{};let T=C(g,t);if(!T)return null;let k=[];for(let u of Fe(A)){let p=C(u,t);if(!p)return null;k.push(p)}return()=>{let u=T(),p=u?.[E];if(typeof p!="function")return;let s=k.map(l=>l());return p.apply(u,s)}}if(e.startsWith("!")){let g=C(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=C(i[1],t),E,A=i[2];if(Tn.test(A)?E=Number(A):E=A.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=te(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let A=Fe(E),T=[],k=!0;for(let u of A){let p=C(u.trim(),t);if(!p){k=!1;break}T.push(p)}if(k)return()=>T.map(u=>u())}}let a=e.match(dn);if(a){let g=C(a[1].trim(),t),E=C(a[2].trim(),t),A=C(a[3].trim(),t);if(g&&E&&A)return()=>g()?E():A()}let r=e.match(mn);if(r){let g=C(r[1].trim(),t),E=C(r[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=C(c[1].trim(),t),E=C(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=C(m[1].trim(),t),E=C(m[2].trim(),t);if(g&&E)return()=>g()||E()}let f=e.match(hn);if(f){let g=C(f[1].trim(),t),E=C(f[3].trim(),t);if(g&&E){let A=f[2];return()=>{let T=g(),k=E();switch(A){case"===":return T===k;case"!==":return T!==k;case"==":return T==k;case"!=":return T!=k;case">":return T>k;case"<":return T<k;case">=":return T>=k;case"<=":return T<=k}}}}let d=e.match(vn);if(d){let g=C(d[1].trim(),t),E=C(d[3].trim(),t);if(g&&E){let A=d[2];return()=>{let T=g(),k=E();switch(A){case"*":return T*k;case"/":return T/k;case"%":return T%k}}}}let b=e.match(bn);if(b){let g=C(b[1].trim(),t),E=C(b[3].trim(),t);if(g&&E){let A=b[2];return()=>{let T=g(),k=E();return A==="+"?T+k:T-k}}}let v=e.match(En);if(v){let g=v[1],E=[],A=[],T=0,k=new RegExp(yn.source,"g"),u;for(;(u=k.exec(g))!==null;){E.push(g.slice(T,u.index));let p=C(u[1].trim(),t);if(!p)return null;A.push(p),T=k.lastIndex}return E.push(g.slice(T)),()=>{let p=E[0];for(let s=0;s<A.length;s++)p+=String(A[s]()??""),p+=E[s+1]??"";return p}}return null}function _t(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function z(e,t){let n=e.replace(Be,"").trim(),o=_t(qe,t),i=o.get(n);if(i)return i;let a=C(n,t);if(a)return o.set(n,a),a;if(!U){D("buildEvaluator: blocked unsafe eval fallback for expression:",n),Q("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in expression`;throw Q("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){if(ee.has(b))return;let v=t.getters[b];return v?v():void 0}}),f=()=>c(m);return o.set(n,f),f}catch{Q("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function Ae(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Vn(n,t);if(o)return o;let i=Wn(n);if(i.length>1){let v=i.map(g=>Ae(g,t));return v.every(g=>g!==null)?g=>{H(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,r=a.match(An);if(r){let v=r[1],g=r[2];return()=>{H(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(wn);if(c){let v=c[1],g=c[2];return()=>{H(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(_n);if(m&&m[1]===m[2]){let v=m[1];return()=>{H(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let f=a.match(kn);if(f){let v=f[1],g=C(f[2].trim(),t);if(g)return I&&D(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{H(()=>{let E=g();I&&D(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=C(d[3].trim(),t);if(E)return()=>{H(()=>{let A=t.getters[v]?.()??0,T=E();switch(g){case"+=":t.setters[v]?.(A+T);break;case"-=":t.setters[v]?.(A-T);break;case"*=":t.setters[v]?.(A*T);break;case"/=":t.setters[v]?.(A/T);break}})}}let b=a.match(In);if(b){let v=b[1];return()=>gt(v)}return null}function no(e,t){let n=e.trim();if(n.startsWith("{")){let c=te(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=_t(Ge,t),i=o.get(n);if(i)return i;let a=Ae(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){D("buildHandler: blocked unsafe eval fallback for expression:",n),Q("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in handler`;throw Q("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){if(ee.has(v))return;let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{H(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Q("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var oo=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{return I&&D("parseState: Invalid JSON in data-forma-state \u2014 use valid JSON with quoted keys. Got:",e.slice(0,200)),{}}for(let n of oo)n in t&&delete t[n];return t}function io(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);I&&(D("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&D("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[r,c]of Object.entries(n)){let[m,f]=Z(c);i[r]=m,a[r]=f}return i.$refetch=()=>gt,{getters:i,setters:a}}function J(e,t,n){t=Le(t,{$el:e,$dispatch:(u,p)=>{e.dispatchEvent(new CustomEvent(u,{bubbles:!0,composed:!0,detail:p}))}});let i=lo(e),a=!i||i.has("data-computed")?e.getAttribute("data-computed"):null;if(a){let u=a.split(/;\s*(?=\w+\s*=[^=])/);for(let p of u){let s=p.trim();if(!s)continue;let l=s.match(Cn);if(l){let h=l[1],y=l[2],S=t.getters[h];delete t.getters[h];let w=z(`{${y}}`,t),x=Ce(w);t.getters[h]=x,S||delete t.setters[h]}}}let r=!i||i.has("data-text")?e.getAttribute("data-text"):null;if(r){let u=z(r,t),p=F(()=>{Fn(e,Bn(u()))});n.push(p)}let c=!i||i.has("data-show")?e.getAttribute("data-show"):null;if(c){let u=z(c,t),p=Oe(e);if(I){let h=e.tagName.toLowerCase(),y=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-show="${c}" on <${h}${y}>`)}let s=!1,l=F(()=>{let h=!!u();I&&D(`data-show effect: "${c}" \u2192 ${h}`),Zn(e,h,p,!s),s=!0});n.push(l),p&&n.push(()=>ye(e))}let m=!i||i.has("data-if")?e.getAttribute("data-if"):null;if(m){let u=z(m,t),p=Oe(e),s=document.createComment("forma-if"),l=e.parentNode,h=!0,y=!1,S=F(()=>{let w=!!u();w&&!h?(ye(e),e.removeAttribute("data-forma-leaving"),y&&p?Yn(e,l,s,p):l?.insertBefore(e,s),h=!0):!w&&h&&(y&&p?mt(e,p,()=>{e.parentNode&&(l?.insertBefore(s,e),e.remove())}):(l?.insertBefore(s,e),e.remove()),h=!1),y=!0});n.push(S),p&&n.push(()=>ye(e))}let f=!i||i.has("data-model")?e.getAttribute("data-model"):null;if(f){let u=f.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l=e,h=F(()=>{let w=p();l.type==="checkbox"?l.checked=!!w:l.value=String(w??"")});n.push(h);let y=l.type==="checkbox"?"change":"input",S=()=>{l.type==="checkbox"?s(l.checked):l.type==="number"||l.type==="range"?s(Number(l.value)):s(l.value)};l.addEventListener(y,S),n.push(()=>{l.removeEventListener(y,S)})}}let d=!i||co(i,"data-on:","data-class:","data-bind:"),b=e.attributes;if(d)for(let u=0;u<b.length;u++){let p=b[u],s=p.name;if(s.startsWith("data-on:")){let l=s.slice(8),h=no(p.value,t),y=h.handler;if(I){let S=e.tagName.toLowerCase(),w=e.id?`#${e.id}`:"",x=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-on:${l}="${p.value}" on <${S}${w}${x}>`)}if(h.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),I){let S=p.value,w=x=>{D(`HANDLER FIRED: data-on:${l}="${S}"`,"isTrusted:",x.isTrusted),y(x)};e.addEventListener(l,w),n.push(()=>{e.removeEventListener(l,w)})}else e.addEventListener(l,y),n.push(()=>{e.removeEventListener(l,y)})}else if(s.startsWith("data-class:")){let l=s.slice(11),h=z(p.value,t),y=F(()=>{e.classList.toggle(l,!!h())});n.push(y)}else if(s.startsWith("data-bind:")){let l=s.slice(10),h=z(p.value,t),y=F(()=>{let S=h();S==null||S===!1?e.removeAttribute(l):e.setAttribute(l,String(S))});n.push(y)}}let v=!i||i.has("data-persist")?e.getAttribute("data-persist"):null;if(v){let u=v.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l="forma:"+u;try{let y=localStorage.getItem(l);y!==null&&s(JSON.parse(y))}catch{}let h=F(()=>{try{localStorage.setItem(l,JSON.stringify(p()))}catch{}});n.push(h)}}let g=!i||i.has("data-list")?e.getAttribute("data-list"):null;if(g){let u=z(g,t),p=e.children[0];if(p){let x=function(N){let R=N;if(Array.isArray(R.__formaDisposers)){for(let _ of R.__formaDisposers)try{_()}catch{}delete R.__formaDisposers}},G=function(N,R){let _=Gn(s,N),L=Le(t,{item:N,index:R}),M=[];J(_,L,M);for(let B of Array.from(_.querySelectorAll("*")))J(B,L,M);return _.__formaDisposers=M,_},ne=function(N,R,_){x(N),jn(N,R);let L=Le(t,{item:R,index:_}),M=[];J(N,L,M);for(let B of Array.from(N.querySelectorAll("*")))J(B,L,M);N.__formaDisposers=M};var A=x,T=G,k=ne;let s=p.cloneNode(!0);e.removeChild(p);let l=s.getAttribute("data-key"),h=l?l.replace(Dn,"").trim():null,y=Oe(e),S=[],w=[],oe=y?{onInsert:N=>{let R=N;if(!R.setAttribute)return;let _=q(R);_.token+=1;let L=_.token;_.cancel&&_.cancel(),_.cancel=pe(R,{base:y.enter,from:y.enterFrom,to:y.enterTo,durationMs:y.enterDurationMs},()=>{let M=q(R);M.token===L&&(M.cancel=null)})},onBeforeRemove:(N,R)=>{let _=N;if(!_.setAttribute){R();return}x(N),mt(_,y,()=>{R()})}}:void 0,ie=F(()=>{let N=u();if(!Array.isArray(N)){for(let _ of w)x(_),e.removeChild(_);S=[],w=[];return}if(y){let _=e.querySelectorAll("[data-forma-leaving]");for(let L of Array.from(_))ye(L),L.removeAttribute("data-forma-leaving"),L.parentNode&&L.parentNode.removeChild(L)}let R=new Set(w);if(h){let _=Ne(e,S,N,w,M=>String(M?.[h]??""),M=>{let B=N.indexOf(M);return G(M,B)},(M,B)=>{let $=N.indexOf(B);ne(M,B,$)},void 0,oe),L=new Set(_.nodes);for(let M of R)if(!L.has(M)){if(M.hasAttribute?.("data-forma-leaving"))continue;x(M)}S=_.items,w=_.nodes}else{let _=N.map(($,ge)=>({__idx:ge,__item:$})),M=Ne(e,S,_,w,$=>$.__idx,$=>G($.__item,$.__idx),($,ge)=>ne($,ge.__item,ge.__idx),void 0,oe),B=new Set(M.nodes);for(let $ of R)if(!B.has($)){if($.hasAttribute?.("data-forma-leaving"))continue;x($)}S=M.items,w=M.nodes}});n.push(ie)}}let E=!i||i.has("data-fetch")?e.getAttribute("data-fetch"):null;if(E){let u=E.match(Nn);if(u){let p=u[1].trim(),s=u[2].trim(),l=u[3]?.trim()??"",h="GET",y=p,S=p.match(xn);S&&(h=S[1].toUpperCase(),y=S[2].trim());let w,x,G;for(let R of l.split("|").filter(Boolean)){let[_,L]=R.split(":").map(M=>M.trim());_==="loading"?w=L:_==="error"?x=L:_==="poll"&&(G=parseInt(L??"0",10))}let[ne,oe]=Z(null);if(t.getters[s]=ne,t.setters[s]=oe,w){let[R,_]=Z(!1);t.getters[w]=R,t.setters[w]=_}if(x){let[R,_]=Z(null);t.getters[x]=R,t.setters[x]=_}let ie=()=>{w&&t.setters[w](!0),fetch(y,{method:h}).then(R=>R.json()).then(R=>{oe(R),w&&t.setters[w](!1)}).catch(R=>{x&&t.setters[x](R.message),w&&t.setters[w](!1)})},N=e.getAttribute("data-fetch-id");if(N&&(Pe.set(N,ie),n.push(()=>Pe.delete(N))),ie(),G&&G>0){let R=setInterval(ie,G);n.push(()=>clearInterval(R))}}}}var ni=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function ro(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function so(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ao(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function lo(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function co(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function K(e){if(e.__formaDisposers){I&&D("mountScope: SKIPPED (already mounted)");return}let t=io(e),n=[];J(e,t,n);let o=0,i=ao();if(i){let a=e.querySelectorAll(i);for(let r=0;r<a.length;r++)J(a[r],t,n),o++}else{let a=e.querySelectorAll("*");for(let r=0;r<a.length;r++){let c=a[r];ro(c)&&(J(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",I&&D("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function X(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,fo=40,fe=[],me=!1;function uo(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: REMOVED scope"),X(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)X(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: ADDED scope via mutation"),K(o));let i=o.querySelectorAll("[data-forma-state]");I&&i.length>0&&D("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let r=i[a];r.closest("[data-forma-leaving]")||K(r)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;X(t),t.hasAttribute("data-forma-state")&&K(t)}}async function Mt(){try{for(;fe.length>0;){let e=fe.splice(0,fo);for(let t=0;t<e.length;t++)uo(e[t]);fe.length>0&&await ht()}}finally{me=!1,fe.length>0&&!me&&(me=!0,Mt())}}function mo(e){I&&D("MutationObserver: queued",e.length,"mutation(s)"),fe.push(...e),!me&&(me=!0,Mt())}function po(){if(W)return;W=new MutationObserver(mo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function go(){W&&(W.disconnect(),W=null)}function We(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");I&&D("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))K(t);po(),I&&D("initRuntime: MutationObserver started")}function ho(){go();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))X(t)}function vo(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}function bo(e){e.hasAttribute("data-forma-state")&&X(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))X(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",We):We());function Eo(e){I=e}function yo(e){P!==e&&(P=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),qe=new WeakMap,Ge=new WeakMap)}function So(e){if(P!=="mutable"){D(`setUnsafeEval ignored (mode=${P}); unsafe fallback is locked`);return}U!==e&&(U=e,qe=new WeakMap,Ge=new WeakMap)}function To(){return P}function Ao(e){Ve=e}function wo(){return Array.from(ue.values()).map(e=>({...e}))}function _o(){ue.clear()}function ko(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let r of Object.keys(o.getters)){let c=o.getters[r]();a[r]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function Ro(e,t,n){let o=e.__formaScope;o?.setters[t]&&H(()=>{o.setters[t](n)})}function Mo(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);H(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var He=null;function Co(){return He||(He=at({mountScope:K,unmountScope:X,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:H})),He}function No(e,t){Co()(e,t)}return It(xo);})();
//# sourceMappingURL=formajs-runtime-hardened.global.js.map

@@ -1,2 +0,2 @@

"use strict";var FormaRuntime=(()=>{var Se=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var xt=Object.getOwnPropertyNames;var Nt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)Se(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of xt(t))!Nt.call(e,i)&&i!==n&&Se(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(Se({},"__esModule",{value:!0}),e);var Co={};Dt(Co,{applyContainmentHints:()=>vt,clearDiagnostics:()=>Ao,destroyRuntime:()=>po,getDiagnostics:()=>To,getScopes:()=>_o,getUnsafeEvalMode:()=>yo,initRuntime:()=>Ue,mount:()=>go,reconcile:()=>Mo,resetScope:()=>ko,setDebug:()=>vo,setDiagnostics:()=>So,setDirectiveMap:()=>io,setScopeValue:()=>wo,setUnsafeEval:()=>Eo,setUnsafeEvalMode:()=>bo,unmount:()=>ho,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:s,updateDirtyFlag:u,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(l,p){let r=p.depsTail;if(r!==void 0&&r.dep===l)return;let f=r!==void 0?r.nextDep:p.deps;if(f!==void 0&&f.dep===l){p.depsTail=f;return}let h=l.subsTail;if(!(h!==void 0&&h.sub===p&&A(h,p)))return g(l,p,f,r)}function s(l){let p=l.nextSub,r,f=0,h=32;e:do{let y=l.sub,T=y.flags,C=!1;if(T&244?T&16&&!(T&4)?(y.flags=T&-17|h|8,C=!0):!(T&224)&&A(l,y)&&(y.flags=T|16|h|8,C=y.subs!==void 0):(y.flags=T|h|8,C=!0),C){let P=y.subs;if(P!==void 0){l=P,P.nextSub!==void 0?(r={target:p,linked:r},++f,p=l.nextSub,h=64):h=T&2?128:64;continue}T&2&&(n[i++]=y)}else T&(4|h)?!(T&h)&&T&224&&A(l,y)&&(y.flags=T|h):(y.flags=T|h|8,(T&10)===2&&(n[i++]=y));if((l=p)!==void 0){p=l.nextSub,h=f?64:32;continue}for(;f--;)if(l=r.target,r=r.linked,l!==void 0){p=l.nextSub,h=f?64:32;continue e}break}while(!0)}function c(l){l.depsTail=void 0,l.flags=l.flags&-249|4}function m(l){let p=l.depsTail;if(p!==void 0){let r=p.nextDep;r!==void 0&&(S(r),p.nextDep=void 0)}else l.deps!==void 0&&(S(l.deps),l.deps=void 0);l.flags&=-5}function u(l,p){return E(l.deps)?(l.flags=p|32,!0):(l.flags=p&-65,!1)}function d(l,p){if(p&32||E(l.deps)){if(e(l)){let r=l.subs;r!==void 0&&_(r)}}else l.flags=p&-65}function b(l,p){if(p&128){l.flags=p&-129;let r=l.deps;do{let f=r.dep;"flags"in f&&f.flags&2&&f.flags&224&&t(f),r=r.nextDep}while(r!==void 0)}}function v(){for(;o<i;){let l=n[o];n[o++]=void 0,t(l)||(l.flags&=-9)}o=0,i=0}function g(l,p,r,f){let h={dep:l,sub:p,nextDep:r,prevSub:void 0,nextSub:void 0};if(f===void 0?p.deps=h:f.nextDep=h,l.subs===void 0)l.subs=h;else{let y=l.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,l.subsTail=h,h}function E(l){let p,r=0,f;e:do{f=!1;let h=l.dep;if(l.sub.flags&32)f=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let T=h.subs;T.nextSub!==void 0&&_(T),f=!0}}else if((y&65)===65){(l.nextSub!==void 0||l.prevSub!==void 0)&&(p={target:l,linked:p}),l=h.deps,++r;continue}}if(!f&&l.nextDep!==void 0){l=l.nextDep;continue}for(;r;){--r;let y=l.sub,T=y.subs;if(f){if(e(y)){T.nextSub!==void 0?(l=p.target,p=p.linked,_(T)):l=T;continue}}else y.flags&=-65;if(T.nextSub!==void 0?(l=p.target,p=p.linked):l=T,l.nextDep!==void 0){l=l.nextDep;continue e}f=!1}return f}while(!0)}function _(l){do{let p=l.sub,r=p.flags;(r&96)===64&&(p.flags=r|32|8,(r&10)===2&&(n[i++]=p)),l=l.nextSub}while(l!==void 0)}function A(l,p){let r=p.depsTail;if(r!==void 0){let f=p.deps;do{if(f===l)return!0;if(f===r)break;f=f.nextDep}while(f!==void 0)}return!1}function S(l){do{let p=l.dep,r=l.nextDep,f=l.nextSub,h=l.prevSub;if(f!==void 0?f.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=f:p.subs=f,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let T=p.deps;if(T!==void 0){l=T,p.depsTail.nextDep=r,p.deps=void 0,p.depsTail=void 0;continue}}l=r}while(l!==void 0)}}var{link:oe,propagate:Ht,updateDirtyFlag:Ut,startTracking:Te,endTracking:Ae,processEffectNotifications:qe,processComputedUpdate:Pt,processPendingInnerEffects:Ge}=$t({updateComputed(e){let t=I;I=e,Te(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{I=t,Ae(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),je=[],_e=0,I,me;function ze(){++_e}function Je(){--_e||qe()}function Ke(){je.push(I),I=void 0}function Xe(){I=je.pop()}function Ye(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function Ze(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Qe(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};I!==void 0?oe(t,I):me!==void 0&&oe(t,me);let n=I;I=t;try{t.fn()}finally{I=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Ut(e,t)){let n=I;I=e,Te(e);try{e.fn()}finally{I=n,Ae(e)}}else Ge(e,e.flags);return!0}function Ft(e){return e.flags&128?(Ge(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Pt(this,e),I!==void 0?oe(this,I):me!==void 0&&oe(this,me),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),_e||qe())}}else return I!==void 0&&oe(this,I),this.currentValue}function qt(){Te(this),Ae(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ke();let n=e();Xe(),e(t(n))}function et(e){let t=Ye(e);return[t,i=>Gt(t,i)]}var Y=et;var we=null;function tt(e){we&&we.disposers.push(e)}function nt(){return we!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=Qe(e);return nt()&&tt(t),t}function ke(e){return Ze(e)}function $(e){ze();try{e()}finally{Je()}}function ot(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let u=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<u?d=v+1:b=v}n[d]=u,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let s=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)s[m]=c,c=i[c];return s}var Jt=32;function Kt(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length,b=new Array(u);for(let r=0;r<u;r++)b[r]=i(t[r]);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=-1;for(let y=0;y<u;y++)if(!g[y]&&b[y]===f){h=y,g[y]=1;break}v[r]=h}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Re(e,t,n,o,i,a,s,c,m){let u=t.length,d=n.length;if(d===0){for(let r=0;r<u;r++)if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);return{nodes:[],items:[]}}if(u===0){let r=new Array(d);for(let f=0;f<d;f++){let h=a(n[f]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),r[f]=h}return{nodes:r,items:n}}if(u<Jt)return Kt(e,t,n,o,i,a,s,c,m);let b=new Map;for(let r=0;r<u;r++)b.set(i(t[r]),r);let v=new Array(d),g=new Uint8Array(u);for(let r=0;r<d;r++){let f=i(n[r]),h=b.get(f);h!==void 0?(v[r]=h,g[h]=1):v[r]=-1}for(let r=0;r<u;r++)if(!g[r])if(m?.onBeforeRemove){let f=o[r];m.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[r]);if(u===d){let r=!0;for(let f=0;f<d;f++)if(v[f]!==f){r=!1;break}if(r){let f=new Array(d);for(let h=0;h<d;h++){let y=o[h];s(y,n[h]),f[h]=y}return{nodes:f,items:n}}}let E=[],_=[];for(let r=0;r<d;r++)v[r]!==-1&&(E.push(v[r]),_.push(r));let A=ot(E),S=new Uint8Array(d);for(let r of A)S[_[r]]=1;let l=new Array(d),p=c??null;for(let r=d-1;r>=0;r--){let f,h=!1;if(v[r]===-1)f=a(n[r]),h=!0;else if(f=o[v[r]],s(f,n[r]),S[r]){l[r]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),h&&m?.onInsert?.(f),l[r]=f,p=f}return{nodes:l,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function it(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",s=t.getAttribute("data-forma-state")??"{}",c=it(a),m=it(s);return Zt(c,m)?"PRESERVE":"RESET"}var pe=null;function en(e){return pe||(pe=document.createElement("template")),pe.innerHTML=e,pe.content}function Me(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,s=e.attributes;for(let m=0;m<s.length;m++)if(s[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let u=c[m];if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.getAttribute(u.name)!==u.value&&e.setAttribute(u.name,u.value)}for(let m=s.length-1;m>=0;m--){let u=s[m];if(!t.hasAttribute(u.name)){if(u.name==="style"&&o||u.name==="class"&&a||(u.name==="value"||u.name==="checked")&&i||n.has(u.name))continue;e.removeAttribute(u.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let s of Array.from(e.childNodes))s.nodeType===Node.TEXT_NODE&&n.push(s);for(let s=0;s<t.childNodes.length;s++){let c=t.childNodes[s];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:s})}if(n.length===o.length){for(let s=0;s<n.length;s++)n[s].textContent!==o[s].node.textContent&&(n[s].textContent=o[s].node.textContent);return}let i=new Set,a=0;for(let{node:s,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==s.textContent&&(m.textContent=s.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(s.textContent??""),m)}for(let s of n)!i.has(s)&&s.parentNode===e&&e.removeChild(s)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}}return null}function Ce(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,s=[];for(let u of o){if(u.hasAttribute("data-forma-leaving"))continue;let d=u.getAttribute("data-forma-id");d?a.set(d,u):s.push(u)}let c=0,m=new Set;for(let u of i){let d=u.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<s.length;){let v=s[c];if(c++,v.tagName===u.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&u.hasAttribute("data-forma-state"))switch(Qt(b,u)){case"PRESERVE":Me(b,u),Ce(b,u,n);break;case"RESET":n.unmountScope(b),Me(b,u),on(b,u),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=u.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else Me(b,u),Ce(b,u,n);rn(e,b,u,i)}else{let v=u.cloneNode(!0),g=sn(e,u,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let _ of Array.from(E))n.mountScope(_)}}for(let u of o)if(!m.has(u)){if(u.parentElement!==e||u.hasAttribute("data-forma-leaving"))continue;u.hasAttribute("data-forma-state")&&n.unmountScope(u);let d=u.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(u)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let u=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(u&&u.parentElement===e){e.insertBefore(t,u);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let s=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(s&&s.parentElement===e)return s}}return null}function rt(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let s=en(a),c=document.createElement("div");c.appendChild(s);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let u=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){u=!0;break}}if(m.size>0&&!u){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{Ce(o,c,e)})}finally{e.reconnectObserver()}}}}var Ie=new Map;function gt(e){let t=Ie.get(e);t?t():L&&N(`$refetch: no data-fetch with id "${e}" found`)}function st(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var L=!1,H="mutable",U=!1,Pe=!0;function N(...e){(L||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var le=new Map;function ge(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Oe(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Oe(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=ge(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Oe(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=ge(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=ge(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let s=ge(t.getAttribute("data-forma-auto-containment"));s!==void 0&&(e.autoContainment=s)}}return e}function Z(e,t,n){if(!Pe)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=le.get(o);a?(a.count+=1,a.lastSeenAt=i):(le.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let s={kind:e,expr:t,reason:n,count:le.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:s}))}}catch{}}var at=Oe("mutable");at&&(H=at,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0),H==="mutable"&&(U=!0));var X=an(),lt=X.lockUnsafeEval?"locked-off":X.unsafeEvalMode;lt&&(H=lt,H==="locked-off"&&(U=!1),H==="locked-on"&&(U=!0));H==="mutable"&&typeof X.allowUnsafeEval=="boolean"&&(U=X.allowUnsafeEval);typeof X.diagnostics=="boolean"&&(Pe=X.diagnostics);var ln=X.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let s=o[a];if(!s?.style)continue;let c=s.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=s.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",u=s.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=s.style.getPropertyValue("contain"),g=s.style.getPropertyValue("content-visibility"),E=s.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(s.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(s.style.setProperty("content-visibility",m),b=!0),u!=="off"&&(!d||!E)&&(s.style.setProperty("contain-intrinsic-size",u),b=!0),b&&i++}return L&&i>0&&N("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,$e=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,_n=/^(\+\+|--)(\w+)$/,wn=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/(\w+)\s*:/g,xn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,Dn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Ln=/^\{item\.?|\}$/g,In=/\bevent\b|\$event\b/,On=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Ee=Symbol.for("forma-transition-state"),$n=2048,re=new Map;function ie(e,t){if(re.size>=$n){let n=re.keys().next().value;n!==void 0&&re.delete(n)}re.set(e,t)}var Be=new WeakMap,Fe=new WeakMap,ct=new Map,We=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval"]),Hn=(()=>{let e=[];for(let t of We){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Hn)if(o.test(t)||i.test(t))return n;return null}var ft=Symbol.for("forma-text-binding-cache");function Un(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Pn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function He(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,s=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(s,c).trim()),s=c+1)}return t.push(e.slice(s).trim()),t.filter(Boolean)}function Q(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,s=!1,c=!1,m=!1;for(let u=t;u<e.length;u++){let d=e[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,u),end:u}}return null}function Bn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,s=!1,c=!1,m=!1,u=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(u){u=!1;continue}if(g==="\\"&&(s||c||m)){u=!0;continue}if(s){g==="'"&&(s=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){s=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let u=Q(t,0,"{","}");if(!u)return null;let d=u.inner.trim(),b=t.slice(u.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,s=!1,c=!1,m=!1;for(let u=0;u<t.length;u++){let d=t[u];if(m){m=!1;continue}if(d==="\\"&&(a||s||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(s){d==='"'&&(s=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){s=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,u).trim(),rest:t.slice(u+1).trim()}}return{body:t,rest:""}}function Fn(e,t){let n=e.trim();if(!Mn.test(n)||In.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=Q(n,o,"(",")");if(!i)return null;let a=M(i.inner.trim(),t);if(!a)return null;let s=n.slice(i.end+1).trim(),c=ut(s);if(!c||!c.body)return null;let m=ye(c.body,t);if(!m)return null;s=c.rest.trim();let u=null;if(s.startsWith("else")){s=s.slice(4).trim();let d=ut(s);if(!d||!d.body||(u=ye(d.body,t),!u))return null;s=d.rest.trim()}return s.length>0?null:d=>{$(()=>{a()?m(d):u?.(d)})}}function Wn(e){let t=e.trim();for(;t.startsWith("(");){let n=Q(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=ct.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,s;for(;(s=a.exec(e))!==null;)n.push(e.slice(i,s.index)),o.push(s[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return ct.set(e,c),c}var _t=new WeakMap;function Ve(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Vn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let s=At(a);_t.set(i,s),i.textContent=Ve(s,t)}}return Yn(n,t),n}function qn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=_t.get(o);i&&(o.textContent=Ve(i,t))}}var Gn=new WeakMap,jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function zn(e){for(let t of jn)if(e===t||e.startsWith(t))return!0;return!1}function se(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function ce(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function xe(e){let t=[],n;for(let o of se(e)){let i=ce(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function G(e){return Array.from(new Set(e.filter(Boolean)))}function he(e){return e?e.split(",").map(t=>ce(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,s=t[i%t.length]??0;a+s>o&&(o=a+s)}return o}function Jn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(he(n.transitionDuration),he(n.transitionDelay)),i=dt(he(n.animationDuration),he(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Ee];if(t)return t;let n={token:0,cancel:null};return e[Ee]=n,n}function ve(e){let t=e[Ee];t?.cancel&&t.cancel(),delete e[Ee]}function Ne(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=xe(e.getAttribute("data-transition")).classes,o=xe(e.getAttribute("data-transition:enter")),i=xe(e.getAttribute("data-transition:leave")),a=se(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),s=se(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=se(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=se(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),u=ce(e.getAttribute("data-transition:duration")??""),d=ce(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??u??void 0,b=ce(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??u??void 0;return{enter:G([...n,...o.classes]),enterFrom:G(a),enterTo:G(s),leave:G([...n,...i.classes]),leaveFrom:G(c),leaveTo:G(m),enterDurationMs:d,leaveDurationMs:b}}function be(e,t){for(let n of t)e.classList.remove(n)}function De(e,t){for(let n of t)e.classList.add(n)}function ue(e,t,n){let o=G([...t.base,...t.from,...t.to]),i=!1,a=null,s=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),s!=null&&cancelAnimationFrame(s),c!=null&&cancelAnimationFrame(c),be(e,o),n())};return De(e,t.base),De(e,t.from),be(e,t.to),s=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;be(e,t.from),De(e,t.to);let u=Jn(e,t.durationMs);if(u<=0){m();return}a=window.setTimeout(m,u+25)})}),m}function Kn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=ue(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=ue(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Xn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&be(e,G([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=ue(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let s=q(e);s.token===a&&(s.cancel=null)});return}i.cancel=ue(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let s=q(e);s.token===a&&(e.style.display="none",s.cancel=null)})}function Yn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!zn(a.name)&&a.value.includes("{item")){let s=At(a.value);i.push({attr:a.name,compiled:s}),o.setAttribute(a.name,Ve(s,t))}i.length>0&&Gn.set(o,i)}}function Zn(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let u=m[0];if(n+=u.length,We.has(u))return()=>{};if(n<e.length&&e[n]==="("){let d=Q(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of He(b)){let E=M(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:u,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:u,optional:c})}if(n!==e.length||a.length===0)return null;let s=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=s();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let u=c[m.name];if(typeof u!="function")return;let d=m.argFns.map(b=>b());c=u.apply(c,d)}}return c}}function M(e,t){let n=re.get(e);if(n)return n(t);let o=Qn(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;ie(e,()=>()=>i)}else if(St.test(e))ie(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);ie(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);ie(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],s=i[2];ie(e,c=>()=>c.getters[a]?.()?.[s])}}return o}function Qn(e,t){e=e.trim();let n=Wn(e);if(n!==e)return M(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=Zn(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],_=o[3].trim();if(We.has(E))return()=>{};let A=M(g,t);if(!A)return null;let S=[];for(let l of He(_)){let p=M(l,t);if(!p)return null;S.push(p)}return()=>{let l=A(),p=l?.[E];if(typeof p!="function")return;let r=S.map(f=>f());return p.apply(l,r)}}if(e.startsWith("!")){let g=M(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=M(i[1],t),E,_=i[2];if(Tn.test(_)?E=Number(_):E=_.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=Q(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let _=He(E),A=[],S=!0;for(let l of _){let p=M(l.trim(),t);if(!p){S=!1;break}A.push(p)}if(S)return()=>A.map(l=>l())}}let a=e.match(dn);if(a){let g=M(a[1].trim(),t),E=M(a[2].trim(),t),_=M(a[3].trim(),t);if(g&&E&&_)return()=>g()?E():_()}let s=e.match(mn);if(s){let g=M(s[1].trim(),t),E=M(s[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=M(c[1].trim(),t),E=M(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=M(m[1].trim(),t),E=M(m[2].trim(),t);if(g&&E)return()=>g()||E()}let u=e.match(hn);if(u){let g=M(u[1].trim(),t),E=M(u[3].trim(),t);if(g&&E){let _=u[2];return()=>{let A=g(),S=E();switch(_){case"===":return A===S;case"!==":return A!==S;case"==":return A==S;case"!=":return A!=S;case">":return A>S;case"<":return A<S;case">=":return A>=S;case"<=":return A<=S}}}}let d=e.match(vn);if(d){let g=M(d[1].trim(),t),E=M(d[3].trim(),t);if(g&&E){let _=d[2];return()=>{let A=g(),S=E();switch(_){case"*":return A*S;case"/":return A/S;case"%":return A%S}}}}let b=e.match(bn);if(b){let g=M(b[1].trim(),t),E=M(b[3].trim(),t);if(g&&E){let _=b[2];return()=>{let A=g(),S=E();return _==="+"?A+S:A-S}}}let v=e.match(En);if(v){let g=v[1],E=[],_=[],A=0,S=new RegExp(yn.source,"g"),l;for(;(l=S.exec(g))!==null;){E.push(g.slice(A,l.index));let p=M(l[1].trim(),t);if(!p)return null;_.push(p),A=S.lastIndex}return E.push(g.slice(A)),()=>{let p=E[0];for(let r=0;r<_.length;r++)p+=String(_[r]()??""),p+=E[r+1]??"";return p}}return null}function wt(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function j(e,t){let n=e.replace($e,"").trim(),o=wt(Be,t),i=o.get(n);if(i)return i;let a=M(n,t);if(a)return o.set(n,a),a;if(!U){N("buildEvaluator: blocked unsafe eval fallback for expression:",n),Z("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in expression`;throw Z("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){let v=t.getters[b];return v?v():void 0}}),u=()=>c(m);return o.set(n,u),u}catch{Z("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function ye(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Fn(n,t);if(o)return o;let i=Bn(n);if(i.length>1){let v=i.map(g=>ye(g,t));return v.every(g=>g!==null)?g=>{$(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,s=a.match(An);if(s){let v=s[1],g=s[2];return()=>{$(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(_n);if(c){let v=c[1],g=c[2];return()=>{$(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(wn);if(m&&m[1]===m[2]){let v=m[1];return()=>{$(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let u=a.match(kn);if(u){let v=u[1],g=M(u[2].trim(),t);if(g)return L&&N(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{$(()=>{let E=g();L&&N(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=M(d[3].trim(),t);if(E)return()=>{$(()=>{let _=t.getters[v]?.()??0,A=E();switch(g){case"+=":t.setters[v]?.(_+A);break;case"-=":t.setters[v]?.(_-A);break;case"*=":t.setters[v]?.(_*A);break;case"/=":t.setters[v]?.(_/A);break}})}}let b=a.match(On);if(b){let v=b[1];return()=>gt(v)}return null}function eo(e,t){let n=e.trim();if(n.startsWith("{")){let c=Q(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=wt(Fe,t),i=o.get(n);if(i)return i;let a=ye(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){N("buildHandler: blocked unsafe eval fallback for expression:",n),Z("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let s=Tt(n);if(s){let c=`Blocked unsafe method "${s}" in handler`;throw Z("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{$(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Z("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var to=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{try{t=JSON.parse(e.replace(Cn,'"$1":'))}catch{return{}}}for(let n of to)n in t&&delete t[n];return t}function no(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);L&&(N("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&N("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[s,c]of Object.entries(n)){let[m,u]=Y(c);i[s]=m,a[s]=u}return i.$refetch=()=>gt,{getters:i,setters:a}}function z(e,t,n){let o=so(e),i=!o||o.has("data-computed")?e.getAttribute("data-computed"):null;if(i){let S=i.split(/;\s*(?=\w+\s*=[^=])/);for(let l of S){let p=l.trim();if(!p)continue;let r=p.match(xn);if(r){let f=r[1],h=r[2],y=t.getters[f];delete t.getters[f];let T=j(`{${h}}`,t),C=ke(T);t.getters[f]=C,y||delete t.setters[f]}}}let a=!o||o.has("data-text")?e.getAttribute("data-text"):null;if(a){let S=j(a,t),l=F(()=>{Pn(e,Un(S()))});n.push(l)}let s=!o||o.has("data-show")?e.getAttribute("data-show"):null;if(s){let S=j(s,t),l=Ne(e);if(L){let f=e.tagName.toLowerCase(),h=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-show="${s}" on <${f}${h}>`)}let p=!1,r=F(()=>{let f=!!S();L&&N(`data-show effect: "${s}" \u2192 ${f}`),Xn(e,f,l,!p),p=!0});n.push(r),l&&n.push(()=>ve(e))}let c=!o||o.has("data-if")?e.getAttribute("data-if"):null;if(c){let S=j(c,t),l=Ne(e),p=document.createComment("forma-if"),r=e.parentNode,f=!0,h=!1,y=F(()=>{let T=!!S();T&&!f?(ve(e),e.removeAttribute("data-forma-leaving"),h&&l?Kn(e,r,p,l):r?.insertBefore(e,p),f=!0):!T&&f&&(h&&l?mt(e,l,()=>{e.parentNode&&(r?.insertBefore(p,e),e.remove())}):(r?.insertBefore(p,e),e.remove()),f=!1),h=!0});n.push(y),l&&n.push(()=>ve(e))}let m=!o||o.has("data-model")?e.getAttribute("data-model"):null;if(m){let S=m.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r=e,f=F(()=>{let T=l();r.type==="checkbox"?r.checked=!!T:r.value=String(T??"")});n.push(f);let h=r.type==="checkbox"?"change":"input",y=()=>{r.type==="checkbox"?p(r.checked):r.type==="number"||r.type==="range"?p(Number(r.value)):p(r.value)};r.addEventListener(h,y),n.push(()=>{r.removeEventListener(h,y)})}}let u=!o||ao(o,"data-on:","data-class:","data-bind:"),d=e.attributes;if(u)for(let S=0;S<d.length;S++){let l=d[S],p=l.name;if(p.startsWith("data-on:")){let r=p.slice(8),f=eo(l.value,t),h=f.handler;if(L){let y=e.tagName.toLowerCase(),T=e.id?`#${e.id}`:"",C=e.className?`.${String(e.className).split(" ")[0]}`:"";N(`bindElement: data-on:${r}="${l.value}" on <${y}${T}${C}>`)}if(f.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),L){let y=l.value,T=C=>{N(`HANDLER FIRED: data-on:${r}="${y}"`,"isTrusted:",C.isTrusted),h(C)};e.addEventListener(r,T),n.push(()=>{e.removeEventListener(r,T)})}else e.addEventListener(r,h),n.push(()=>{e.removeEventListener(r,h)})}else if(p.startsWith("data-class:")){let r=p.slice(11),f=j(l.value,t),h=F(()=>{e.classList.toggle(r,!!f())});n.push(h)}else if(p.startsWith("data-bind:")){let r=p.slice(10),f=j(l.value,t),h=F(()=>{let y=f();y==null||y===!1?e.removeAttribute(r):e.setAttribute(r,String(y))});n.push(h)}}let b=!o||o.has("data-persist")?e.getAttribute("data-persist"):null;if(b){let S=b.replace($e,"").trim(),l=t.getters[S],p=t.setters[S];if(l&&p){let r="forma:"+S;try{let h=localStorage.getItem(r);h!==null&&p(JSON.parse(h))}catch{}let f=F(()=>{try{localStorage.setItem(r,JSON.stringify(l()))}catch{}});n.push(f)}}let v=!o||o.has("data-list")?e.getAttribute("data-list"):null;if(v){let S=j(v,t),l=e.children[0];if(l){let C=function(x){let k=x;if(Array.isArray(k.__formaDisposers)){for(let w of k.__formaDisposers)try{w()}catch{}delete k.__formaDisposers}},P=function(x,k){let w=Vn(p,x),D=st(t,{item:x,index:k}),R=[];z(w,D,R);for(let B of Array.from(w.querySelectorAll("*")))z(B,D,R);return w.__formaDisposers=R,w},ee=function(x,k,w){C(x),qn(x,k);let D=st(t,{item:k,index:w}),R=[];z(x,D,R);for(let B of Array.from(x.querySelectorAll("*")))z(B,D,R);x.__formaDisposers=R};var E=C,_=P,A=ee;let p=l.cloneNode(!0);e.removeChild(l);let r=p.getAttribute("data-key"),f=r?r.replace(Ln,"").trim():null,h=Ne(e),y=[],T=[],te=h?{onInsert:x=>{let k=x;if(!k.setAttribute)return;let w=q(k);w.token+=1;let D=w.token;w.cancel&&w.cancel(),w.cancel=ue(k,{base:h.enter,from:h.enterFrom,to:h.enterTo,durationMs:h.enterDurationMs},()=>{let R=q(k);R.token===D&&(R.cancel=null)})},onBeforeRemove:(x,k)=>{let w=x;if(!w.setAttribute){k();return}C(x),mt(w,h,()=>{k()})}}:void 0,ne=F(()=>{let x=S();if(!Array.isArray(x)){for(let w of T)C(w),e.removeChild(w);y=[],T=[];return}if(h){let w=e.querySelectorAll("[data-forma-leaving]");for(let D of Array.from(w))ve(D),D.removeAttribute("data-forma-leaving"),D.parentNode&&D.parentNode.removeChild(D)}let k=new Set(T);if(f){let w=Re(e,y,x,T,R=>String(R?.[f]??""),R=>{let B=x.indexOf(R);return P(R,B)},(R,B)=>{let O=x.indexOf(B);ee(R,B,O)},void 0,te),D=new Set(w.nodes);for(let R of k)if(!D.has(R)){if(R.hasAttribute?.("data-forma-leaving"))continue;C(R)}y=w.items,T=w.nodes}else{let w=x.map((O,de)=>({__idx:de,__item:O})),R=Re(e,y,w,T,O=>O.__idx,O=>P(O.__item,O.__idx),(O,de)=>ee(O,de.__item,de.__idx),void 0,te),B=new Set(R.nodes);for(let O of k)if(!B.has(O)){if(O.hasAttribute?.("data-forma-leaving"))continue;C(O)}y=R.items,T=R.nodes}});n.push(ne)}}let g=!o||o.has("data-fetch")?e.getAttribute("data-fetch"):null;if(g){let S=g.match(Nn);if(S){let l=S[1].trim(),p=S[2].trim(),r=S[3]?.trim()??"",f="GET",h=l,y=l.match(Dn);y&&(f=y[1].toUpperCase(),h=y[2].trim());let T,C,P;for(let k of r.split("|").filter(Boolean)){let[w,D]=k.split(":").map(R=>R.trim());w==="loading"?T=D:w==="error"?C=D:w==="poll"&&(P=parseInt(D??"0",10))}let[ee,te]=Y(null);if(t.getters[p]=ee,t.setters[p]=te,T){let[k,w]=Y(!1);t.getters[T]=k,t.setters[T]=w}if(C){let[k,w]=Y(null);t.getters[C]=k,t.setters[C]=w}let ne=()=>{T&&t.setters[T](!0),fetch(h,{method:f}).then(k=>k.json()).then(k=>{te(k),T&&t.setters[T](!1)}).catch(k=>{C&&t.setters[C](k.message),T&&t.setters[T](!1)})},x=e.getAttribute("data-fetch-id");if(x&&(Ie.set(x,ne),n.push(()=>Ie.delete(x))),ne(),P&&P>0){let k=setInterval(ne,P);n.push(()=>clearInterval(k))}}}}var ei=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function oo(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function io(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ro(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function so(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function ao(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function J(e){if(e.__formaDisposers){L&&N("mountScope: SKIPPED (already mounted)");return}let t=no(e),n=[];z(e,t,n);let o=0,i=ro();if(i){let a=e.querySelectorAll(i);for(let s=0;s<a.length;s++)z(a[s],t,n),o++}else{let a=e.querySelectorAll("*");for(let s=0;s<a.length;s++){let c=a[s];oo(c)&&(z(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",L&&N("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function K(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,lo=40,ae=[],fe=!1;function co(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: REMOVED scope"),K(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)K(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(L&&N("MutationObserver: ADDED scope via mutation"),J(o));let i=o.querySelectorAll("[data-forma-state]");L&&i.length>0&&N("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let s=i[a];s.closest("[data-forma-leaving]")||J(s)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;K(t),t.hasAttribute("data-forma-state")&&J(t)}}async function Mt(){try{for(;ae.length>0;){let e=ae.splice(0,lo);for(let t=0;t<e.length;t++)co(e[t]);ae.length>0&&await ht()}}finally{fe=!1,ae.length>0&&!fe&&(fe=!0,Mt())}}function fo(e){L&&N("MutationObserver: queued",e.length,"mutation(s)"),ae.push(...e),!fe&&(fe=!0,Mt())}function uo(){if(W)return;W=new MutationObserver(fo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function mo(){W&&(W.disconnect(),W=null)}function Ue(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");L&&N("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))J(t);uo(),L&&N("initRuntime: MutationObserver started")}function po(){mo();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))K(t)}function go(e){e.hasAttribute("data-forma-state")&&J(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))J(n)}function ho(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Ue):Ue());function vo(e){L=e}function bo(e){H!==e&&(H=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),Be=new WeakMap,Fe=new WeakMap)}function Eo(e){if(H!=="mutable"){N(`setUnsafeEval ignored (mode=${H}); unsafe fallback is locked`);return}U!==e&&(U=e,Be=new WeakMap,Fe=new WeakMap)}function yo(){return H}function So(e){Pe=e}function To(){return Array.from(le.values()).map(e=>({...e}))}function Ao(){le.clear()}function _o(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let s of Object.keys(o.getters)){let c=o.getters[s]();a[s]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function wo(e,t,n){let o=e.__formaScope;o?.setters[t]&&$(()=>{o.setters[t](n)})}function ko(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);$(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var Le=null;function Ro(){return Le||(Le=rt({mountScope:J,unmountScope:K,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:$})),Le}function Mo(e,t){Ro()(e,t)}return It(Co);})();
"use strict";var FormaRuntime=(()=>{var we=Object.defineProperty;var Ct=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var xt=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var n in t)we(e,n,{get:t[n],enumerable:!0})},Lt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Nt(t))!xt.call(e,i)&&i!==n&&we(e,i,{get:()=>t[i],enumerable:!(o=Ct(t,i))||o.enumerable});return e};var It=e=>Lt(we({},"__esModule",{value:!0}),e);var xo={};Dt(xo,{applyContainmentHints:()=>vt,clearDiagnostics:()=>_o,destroyRuntime:()=>ho,getDiagnostics:()=>wo,getScopes:()=>ko,getUnsafeEvalMode:()=>To,initRuntime:()=>We,mount:()=>vo,reconcile:()=>No,resetScope:()=>Mo,setDebug:()=>Eo,setDiagnostics:()=>Ao,setDirectiveMap:()=>so,setScopeValue:()=>Ro,setUnsafeEval:()=>So,setUnsafeEvalMode:()=>yo,unmount:()=>bo,yieldToMain:()=>ht});var Ot=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Ot||{});function $t({updateComputed:e,notifyEffect:t}){let n=[],o=0,i=0;return{link:a,propagate:r,updateDirtyFlag:f,startTracking:c,endTracking:m,processEffectNotifications:v,processComputedUpdate:d,processPendingInnerEffects:b};function a(u,p){let s=p.depsTail;if(s!==void 0&&s.dep===u)return;let l=s!==void 0?s.nextDep:p.deps;if(l!==void 0&&l.dep===u){p.depsTail=l;return}let h=u.subsTail;if(!(h!==void 0&&h.sub===p&&T(h,p)))return g(u,p,l,s)}function r(u){let p=u.nextSub,s,l=0,h=32;e:do{let y=u.sub,S=y.flags,w=!1;if(S&244?S&16&&!(S&4)?(y.flags=S&-17|h|8,w=!0):!(S&224)&&T(u,y)&&(y.flags=S|16|h|8,w=y.subs!==void 0):(y.flags=S|h|8,w=!0),w){let x=y.subs;if(x!==void 0){u=x,x.nextSub!==void 0?(s={target:p,linked:s},++l,p=u.nextSub,h=64):h=S&2?128:64;continue}S&2&&(n[i++]=y)}else S&(4|h)?!(S&h)&&S&224&&T(u,y)&&(y.flags=S|h):(y.flags=S|h|8,(S&10)===2&&(n[i++]=y));if((u=p)!==void 0){p=u.nextSub,h=l?64:32;continue}for(;l--;)if(u=s.target,s=s.linked,u!==void 0){p=u.nextSub,h=l?64:32;continue e}break}while(!0)}function c(u){u.depsTail=void 0,u.flags=u.flags&-249|4}function m(u){let p=u.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(k(s),p.nextDep=void 0)}else u.deps!==void 0&&(k(u.deps),u.deps=void 0);u.flags&=-5}function f(u,p){return E(u.deps)?(u.flags=p|32,!0):(u.flags=p&-65,!1)}function d(u,p){if(p&32||E(u.deps)){if(e(u)){let s=u.subs;s!==void 0&&A(s)}}else u.flags=p&-65}function b(u,p){if(p&128){u.flags=p&-129;let s=u.deps;do{let l=s.dep;"flags"in l&&l.flags&2&&l.flags&224&&t(l),s=s.nextDep}while(s!==void 0)}}function v(){for(;o<i;){let u=n[o];n[o++]=void 0,t(u)||(u.flags&=-9)}o=0,i=0}function g(u,p,s,l){let h={dep:u,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(l===void 0?p.deps=h:l.nextDep=h,u.subs===void 0)u.subs=h;else{let y=u.subsTail;h.prevSub=y,y.nextSub=h}return p.depsTail=h,u.subsTail=h,h}function E(u){let p,s=0,l;e:do{l=!1;let h=u.dep;if(u.sub.flags&32)l=!0;else if("flags"in h){let y=h.flags;if((y&33)===33){if(e(h)){let S=h.subs;S.nextSub!==void 0&&A(S),l=!0}}else if((y&65)===65){(u.nextSub!==void 0||u.prevSub!==void 0)&&(p={target:u,linked:p}),u=h.deps,++s;continue}}if(!l&&u.nextDep!==void 0){u=u.nextDep;continue}for(;s;){--s;let y=u.sub,S=y.subs;if(l){if(e(y)){S.nextSub!==void 0?(u=p.target,p=p.linked,A(S)):u=S;continue}}else y.flags&=-65;if(S.nextSub!==void 0?(u=p.target,p=p.linked):u=S,u.nextDep!==void 0){u=u.nextDep;continue e}l=!1}return l}while(!0)}function A(u){do{let p=u.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[i++]=p)),u=u.nextSub}while(u!==void 0)}function T(u,p){let s=p.depsTail;if(s!==void 0){let l=p.deps;do{if(l===u)return!0;if(l===s)break;l=l.nextDep}while(l!==void 0)}return!1}function k(u){do{let p=u.dep,s=u.nextDep,l=u.nextSub,h=u.prevSub;if(l!==void 0?l.prevSub=h:p.subsTail=h,h!==void 0?h.nextSub=l:p.subs=l,p.subs===void 0&&"deps"in p){let y=p.flags;y&32||(p.flags=y|32);let S=p.deps;if(S!==void 0){u=S,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}u=s}while(u!==void 0)}}var{link:re,propagate:Ht,updateDirtyFlag:Pt,startTracking:_e,endTracking:ke,processEffectNotifications:ze,processComputedUpdate:Ut,processPendingInnerEffects:Je}=$t({updateComputed(e){let t=O;O=e,_e(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{O=t,ke(e)}},notifyEffect(e){return"isScope"in e?Ft(e):Bt(e)}}),Ke=[],Re=0,O,he;function Xe(){++Re}function Ye(){--Re||ze()}function Ze(){Ke.push(O),O=void 0}function Qe(){O=Ke.pop()}function et(e){return Vt.bind({currentValue:e,subs:void 0,subsTail:void 0})}function tt(e){return Wt.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function nt(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};O!==void 0?re(t,O):he!==void 0&&re(t,he);let n=O;O=t;try{t.fn()}finally{O=n}return qt.bind(t)}function Bt(e){let t=e.flags;if(t&32||t&64&&Pt(e,t)){let n=O;O=e,_e(e);try{e.fn()}finally{O=n,ke(e)}}else Je(e,e.flags);return!0}function Ft(e){return e.flags&128?(Je(e,e.flags),!0):!1}function Wt(){let e=this.flags;return e&96&&Ut(this,e),O!==void 0?re(this,O):he!==void 0&&re(this,he),this.currentValue}function Vt(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Ht(t),Re||ze())}}else return O!==void 0&&re(this,O),this.currentValue}function qt(){_e(this),ke(this)}function Gt(e,t){if(typeof t!="function"){e(t);return}Ze();let n=e();Qe(),e(t(n))}function Z(e){let t=et(e);return[t,i=>Gt(t,i)]}var Me=null;function ot(e){Me&&Me.disposers.push(e)}function it(){return Me!==null}var jt=32;var zt=[];for(let e=0;e<jt;e++)zt.push([]);function F(e){let t=nt(e);return it()&&ot(t),t}function Ce(e){return tt(e)}function H(e){Xe();try{e()}finally{Ye()}}function rt(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),i=new Int32Array(t).fill(-1),a=0;for(let m=0;m<t;m++){let f=e[m],d=0,b=a;for(;d<b;){let v=d+b>>1;n[v]<f?d=v+1:b=v}n[d]=f,o[d]=m,d>0&&(i[m]=o[d-1]),d>=a&&a++}let r=new Array(a),c=o[a-1];for(let m=a-1;m>=0;m--)r[m]=c,c=i[c];return r}var Jt=32;function Kt(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length,b=new Array(f);for(let s=0;s<f;s++)b[s]=i(t[s]);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=-1;for(let y=0;y<f;y++)if(!g[y]&&b[y]===l){h=y,g[y]=1;break}v[s]=h}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Ne(e,t,n,o,i,a,r,c,m){let f=t.length,d=n.length;if(d===0){for(let s=0;s<f;s++)if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(f===0){let s=new Array(d);for(let l=0;l<d;l++){let h=a(n[l]);c?e.insertBefore(h,c):e.appendChild(h),m?.onInsert?.(h),s[l]=h}return{nodes:s,items:n}}if(f<Jt)return Kt(e,t,n,o,i,a,r,c,m);let b=new Map;for(let s=0;s<f;s++)b.set(i(t[s]),s);let v=new Array(d),g=new Uint8Array(f);for(let s=0;s<d;s++){let l=i(n[s]),h=b.get(l);h!==void 0?(v[s]=h,g[h]=1):v[s]=-1}for(let s=0;s<f;s++)if(!g[s])if(m?.onBeforeRemove){let l=o[s];m.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(f===d){let s=!0;for(let l=0;l<d;l++)if(v[l]!==l){s=!1;break}if(s){let l=new Array(d);for(let h=0;h<d;h++){let y=o[h];r(y,n[h]),l[h]=y}return{nodes:l,items:n}}}let E=[],A=[];for(let s=0;s<d;s++)v[s]!==-1&&(E.push(v[s]),A.push(s));let T=rt(E),k=new Uint8Array(d);for(let s of T)k[A[s]]=1;let u=new Array(d),p=c??null;for(let s=d-1;s>=0;s--){let l,h=!1;if(v[s]===-1)l=a(n[s]),h=!0;else if(l=o[v[s]],r(l,n[s]),k[s]){u[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),h&&m?.onInsert?.(l),u[s]=l,p=l}return{nodes:u,items:n}}function Xt(e){let t=new Set,n=e.attributes;for(let o=0;o<n.length;o++){let i=n[o].name;i.startsWith("data-bind:")&&t.add(i.slice(10))}return t}function Yt(e){return e.hasAttribute("data-list")||e.hasAttribute("data-if")}function st(e){try{let t=JSON.parse(e);return Object.keys(t).sort()}catch{return[]}}function Zt(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Qt(e,t){let n=e.getAttribute("data-module"),o=t.getAttribute("data-module");if(n!==o)return"REPLACE";let a=e.__formaInitialState??e.getAttribute("data-forma-state")??"{}",r=t.getAttribute("data-forma-state")??"{}",c=st(a),m=st(r);return Zt(c,m)?"PRESERVE":"RESET"}var ve=null;function en(e){return ve||(ve=document.createElement("template")),ve.innerHTML=e,ve.content}function xe(e,t){let n=Xt(e),o=e.hasAttribute("data-show"),i=e.hasAttribute("data-model"),a=!1,r=e.attributes;for(let m=0;m<r.length;m++)if(r[m].name.startsWith("data-class:")){a=!0;break}let c=t.attributes;for(let m=0;m<c.length;m++){let f=c[m];if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.getAttribute(f.name)!==f.value&&e.setAttribute(f.name,f.value)}for(let m=r.length-1;m>=0;m--){let f=r[m];if(!t.hasAttribute(f.name)){if(f.name==="style"&&o||f.name==="class"&&a||(f.name==="value"||f.name==="checked")&&i||n.has(f.name))continue;e.removeAttribute(f.name)}}}function tn(e,t){if(e.hasAttribute("data-text"))return;let n=[],o=[];for(let r of Array.from(e.childNodes))r.nodeType===Node.TEXT_NODE&&n.push(r);for(let r=0;r<t.childNodes.length;r++){let c=t.childNodes[r];c.nodeType===Node.TEXT_NODE&&o.push({node:c,index:r})}if(n.length===o.length){for(let r=0;r<n.length;r++)n[r].textContent!==o[r].node.textContent&&(n[r].textContent=o[r].node.textContent);return}let i=new Set,a=0;for(let{node:r,index:c}of o)if(a<n.length){let m=n[a];a++,i.add(m),m.textContent!==r.textContent&&(m.textContent=r.textContent)}else{let m=nn(e,t,c);e.insertBefore(document.createTextNode(r.textContent??""),m)}for(let r of n)!i.has(r)&&r.parentNode===e&&e.removeChild(r)}function nn(e,t,n){for(let o=n+1;o<t.childNodes.length;o++){let i=t.childNodes[o];if(i.nodeType===Node.ELEMENT_NODE){let a=i.getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}}return null}function De(e,t,n){if(Yt(e))return;tn(e,t);let o=Array.from(e.children),i=Array.from(t.children),a=new Map,r=[];for(let f of o){if(f.hasAttribute("data-forma-leaving"))continue;let d=f.getAttribute("data-forma-id");d?a.set(d,f):r.push(f)}let c=0,m=new Set;for(let f of i){let d=f.getAttribute("data-forma-id"),b;if(d)b=a.get(d);else for(;c<r.length;){let v=r[c];if(c++,v.tagName===f.tagName&&!m.has(v)){b=v;break}}if(b){if(m.add(b),b.hasAttribute("data-forma-state")&&f.hasAttribute("data-forma-state"))switch(Qt(b,f)){case"PRESERVE":xe(b,f),De(b,f,n);break;case"RESET":n.unmountScope(b),xe(b,f),on(b,f),n.mountScope(b);break;case"REPLACE":{n.unmountScope(b);let g=f.cloneNode(!0);e.replaceChild(g,b),n.mountScope(g),m.delete(b),b=g,m.add(g);break}}else xe(b,f),De(b,f,n);rn(e,b,f,i)}else{let v=f.cloneNode(!0),g=sn(e,f,i);e.insertBefore(v,g),m.add(v),v.hasAttribute("data-forma-state")&&n.mountScope(v);let E=v.querySelectorAll("[data-forma-state]");for(let A of Array.from(E))n.mountScope(A)}}for(let f of o)if(!m.has(f)){if(f.parentElement!==e||f.hasAttribute("data-forma-leaving"))continue;f.hasAttribute("data-forma-state")&&n.unmountScope(f);let d=f.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))n.unmountScope(b);e.removeChild(f)}}function on(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of Array.from(t.childNodes))e.appendChild(n.cloneNode(!0))}function rn(e,t,n,o){let i=o.indexOf(n);if(Array.from(e.children).indexOf(t)!==i){let c=o[i+1];if(c){let m=c.getAttribute("data-forma-id");if(m){let f=e.querySelector(`[data-forma-id="${CSS.escape(m)}"]`);if(f&&f.parentElement===e){e.insertBefore(t,f);return}}}e.appendChild(t)}}function sn(e,t,n){let o=n.indexOf(t);for(let i=o+1;i<n.length;i++){let a=n[i].getAttribute("data-forma-id");if(a){let r=e.querySelector(`[data-forma-id="${CSS.escape(a)}"]`);if(r&&r.parentElement===e)return r}}return null}function at(e){let t="";return function(o,i){let a=i.trim();if(a&&!(a===t&&o.hasChildNodes())){t=a,e.disconnectObserver();try{if(!o.hasChildNodes()||o.children.length===0){o.innerHTML=a,e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let b of Array.from(d))e.mountScope(b)});return}let r=en(a),c=document.createElement("div");c.appendChild(r);let m=new Set;for(let d of Array.from(o.children)){if(d.hasAttribute("data-forma-leaving"))continue;let b=d.getAttribute("data-forma-id");b&&m.add(b)}let f=!1;if(m.size>0)for(let d of Array.from(c.children)){let b=d.getAttribute("data-forma-id");if(b&&m.has(b)){f=!0;break}}if(m.size>0&&!f){e.batch(()=>{let d=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(d))e.unmountScope(v);o.innerHTML=a;let b=o.querySelectorAll("[data-forma-state]");for(let v of Array.from(b))e.mountScope(v)});return}e.batch(()=>{De(o,c,e)})}finally{e.reconnectObserver()}}}}var Pe=new Map;function gt(e){let t=Pe.get(e);t?t():I&&D(`$refetch: no data-fetch with id "${e}" found`)}function Le(e,t){let n=Object.create(null);for(let o of Object.keys(t))n[o]=()=>t[o];return{getters:new Proxy(e.getters,{get(o,i){return i in n?n[i]:o[i]},has(o,i){return i in n||i in o}}),setters:e.setters}}var I=!1,P="mutable",U=!1,Ve=!0;function D(...e){(I||typeof window<"u"&&window.__FORMA_DEBUG)&&console.log("[FormaJS]",...e)}var ue=new Map;function be(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="1"||t==="true"||t==="on"||t==="yes")return!0;if(t==="0"||t==="false"||t==="off"||t==="no")return!1}function Ue(e){if(e==null)return;let t=e.trim().toLowerCase();if(t==="mutable")return"mutable";if(t==="locked-off"||t==="off"||t==="disabled")return"locked-off";if(t==="locked-on"||t==="on"||t==="enabled")return"locked-on"}function an(){let e={};if(typeof window<"u"){let t=window.__FORMA_RUNTIME_CONFIG;if(t){if(typeof t.allowUnsafeEval=="boolean"&&(e.allowUnsafeEval=t.allowUnsafeEval),typeof t.unsafeEvalMode=="string"){let n=Ue(t.unsafeEvalMode);n&&(e.unsafeEvalMode=n)}typeof t.lockUnsafeEval=="boolean"&&(e.lockUnsafeEval=t.lockUnsafeEval),typeof t.diagnostics=="boolean"&&(e.diagnostics=t.diagnostics),typeof t.autoContainment=="boolean"&&(e.autoContainment=t.autoContainment)}}if(typeof document<"u"){let t=document.currentScript;if(t){let n=be(t.getAttribute("data-forma-unsafe-eval"));n!==void 0&&(e.allowUnsafeEval=n);let o=Ue(t.getAttribute("data-forma-unsafe-eval-mode"));o!==void 0&&(e.unsafeEvalMode=o);let i=be(t.getAttribute("data-forma-lock-unsafe-eval"));i!==void 0&&(e.lockUnsafeEval=i);let a=be(t.getAttribute("data-forma-diagnostics"));a!==void 0&&(e.diagnostics=a);let r=be(t.getAttribute("data-forma-auto-containment"));r!==void 0&&(e.autoContainment=r)}}return e}function Q(e,t,n){if(!Ve)return;let o=`${e}|${n}|${t}`,i=Date.now(),a=ue.get(o);a?(a.count+=1,a.lastSeenAt=i):(ue.set(o,{kind:e,expr:t,reason:n,count:1,firstSeenAt:i,lastSeenAt:i}),console.warn(`[FormaJS] ${n}: ${t}`));try{if(typeof window<"u"){let r={kind:e,expr:t,reason:n,count:ue.get(o)?.count??1};window.dispatchEvent(new CustomEvent("formajs:diagnostic",{detail:r}))}}catch{}}var lt=Ue("mutable");lt&&(P=lt,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0),P==="mutable"&&(U=!0));var Y=an(),ct=Y.lockUnsafeEval?"locked-off":Y.unsafeEvalMode;ct&&(P=ct,P==="locked-off"&&(U=!1),P==="locked-on"&&(U=!0));P==="mutable"&&typeof Y.allowUnsafeEval=="boolean"&&(U=Y.allowUnsafeEval);typeof Y.diagnostics=="boolean"&&(Ve=Y.diagnostics);var ln=Y.autoContainment===!0;function cn(){let e=globalThis?.scheduler;if(e&&(typeof e.yield=="function"||typeof e.postTask=="function"))return e}async function ht(){let e=cn();if(e?.yield){await e.yield();return}if(e?.postTask){await e.postTask(()=>{},{priority:"background"});return}await new Promise(t=>setTimeout(t,0))}function vt(e=document,t={}){let n=t.selector??"[data-forma-contain]";if(!n||typeof e.querySelectorAll!="function")return 0;let o=e.querySelectorAll(n),i=0;for(let a=0;a<o.length;a++){let r=o[a];if(!r?.style)continue;let c=r.getAttribute("data-forma-contain")??t.contain??"layout style paint",m=r.getAttribute("data-forma-content-visibility")??t.contentVisibility??"auto",f=r.getAttribute("data-forma-contain-intrinsic-size")??t.containIntrinsicSize??"auto 800px",d=t.skipIfAlreadySet===!0,b=!1,v=r.style.getPropertyValue("contain"),g=r.style.getPropertyValue("content-visibility"),E=r.style.getPropertyValue("contain-intrinsic-size");c!=="off"&&(!d||!v)&&(r.style.setProperty("contain",c),b=!0),m!=="off"&&(!d||!g)&&(r.style.setProperty("content-visibility",m),b=!0),f!=="off"&&(!d||!E)&&(r.style.setProperty("contain-intrinsic-size",f),b=!0),b&&i++}return I&&i>0&&D("applyContainmentHints: applied to",i,"element(s)"),i}var bt=/^'[^']*'$/,Et=/^"[^"]*"$/,yt=/^-?\d+(\.\d+)?$/,St=/^[a-zA-Z_$]\w*$/,fn=/^(\w+)\.(\w+)$/;var un=/^(\w+)\[(\d+|'[^']*'|"[^"]*")\]$/,dn=/^(.+?)\s*\?\s*(.+?)\s*:\s*(.+)$/,mn=/^(.+?)\s*\?\?\s*(.+)$/,pn=/^(.+?)\s*&&\s*(.+)$/,gn=/^(.+?)\s*\|\|\s*(.+)$/,hn=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,vn=/^(.+?)\s*([*/%])\s*(.+)$/,bn=/^(.+?)\s*([+-])\s*(.+)$/,En=/^`([^`]*)`$/,yn=/\$\{([^}]+)\}/g;var Sn=/^\((.+)\)\.(\w+)\((.*)\)$/,Be=/^\{|\}$/g;var Tn=/^\d+$/,An=/^(\w+)(\+\+|--)$/,wn=/^(\+\+|--)(\w+)$/,_n=/^(\w+)\s*=\s*!(\w+)$/,kn=/^(\w+)\s*=\s*(.+)$/,Rn=/^(\w+)\s*(\+=|-=|\*=|\/=)\s*(.+)$/,Mn=/^if\b/,Cn=/^(\w+)\s*=\s*(.+)$/,Nn=/^(.+?)(?:→|->)\s*(\S+)(.*)$/,xn=/^(GET|POST|PUT|PATCH|DELETE)\s+(.+)$/i,Dn=/^\{item\.?|\}$/g,Ln=/\bevent\s*[.([]|\$event\b/,In=/^\$refetch\(\s*['"]([^'"]+)['"]\s*\)$/,Te=Symbol.for("forma-transition-state"),On=2048,ae=new Map;function se(e,t){if(ae.size>=On){let n=ae.keys().next().value;n!==void 0&&ae.delete(n)}ae.set(e,t)}var qe=new WeakMap,Ge=new WeakMap,le=new Map,$n=2048;function Hn(e,t){if(le.size>=$n){let n=le.keys().next().value;n!==void 0&&le.delete(n)}le.set(e,t)}var ee=new Set(["constructor","__proto__","prototype","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","eval","Function"]),Pn=(()=>{let e=[];for(let t of ee){let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e.push({name:t,dotRe:new RegExp(`(?:^|\\.)${n}(?:\\s*\\(|\\s*$|[^\\w$])`,"m"),bracketRe:new RegExp(`\\[\\s*(?:'${n}'|"${n}"|\``+n+"`)\\s*\\]")})}return e})();function Tt(e){let t=e.replace(/\/\*[\s\S]*?\*\//g,"");t=t.replace(/\/\/[^\n]*/g,""),t=t.replace(/\s*\.\s*/g,".");for(let{name:n,dotRe:o,bracketRe:i}of Pn)if(o.test(t)||i.test(t))return n;if(t.includes("[")){let n=Un(t);for(let o of n){if(!o.includes("+"))continue;let i=o.match(/['"`]([^'"`]*?)['"`]/g);if(!i)continue;let a=i.map(r=>r.slice(1,-1)).join("");if(ee.has(a))return a}}return null}function Un(e){let t=[],n=0,o=-1;for(let i=0;i<e.length;i++)e[i]==="["?(n===0&&(o=i+1),n++):e[i]==="]"&&(n--,n===0&&o>=0&&(t.push(e.slice(o,i)),o=-1));return t}var ft=Symbol.for("forma-text-binding-cache");function Bn(e){return e==null?"":typeof e=="string"?e:typeof e=="symbol"?e.toString():String(e)}function Fn(e,t){let n=e[ft];if(n||(n={initialized:!1,last:"",node:null},e[ft]=n),n.initialized&&n.last===t)return;let o=n.node;if(!o||o.parentNode!==e||e.childNodes.length!==1||e.firstChild!==o)if(e.childNodes.length===1&&e.firstChild?.nodeType===Node.TEXT_NODE)o=e.firstChild,n.node=o;else{e.textContent=t;let i=e.firstChild;n.node=i&&i.nodeType===Node.TEXT_NODE&&e.childNodes.length===1?i:null,n.last=t,n.initialized=!0;return}o.data=t,n.last=t,n.initialized=!0}function Fe(e){let t=[];if(e.trim()==="")return t;let n=0,o=!1,i=!1,a=!1,r=0;for(let c=0;c<e.length;c++){let m=e[c];if(a){a=!1;continue}if(m==="\\"){a=!0;continue}if(o){m==="'"&&(o=!1);continue}if(i){m==='"'&&(i=!1);continue}if(m==="'"){o=!0;continue}if(m==='"'){i=!0;continue}if(m==="("){n++;continue}if(m===")"){n>0&&n--;continue}m===","&&n===0&&(t.push(e.slice(r,c).trim()),r=c+1)}return t.push(e.slice(r).trim()),t.filter(Boolean)}function te(e,t,n,o){if(e[t]!==n)return null;let i=0,a=!1,r=!1,c=!1,m=!1;for(let f=t;f<e.length;f++){let d=e[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d===n){i++;continue}if(d===o&&(i--,i===0))return{inner:e.slice(t+1,f),end:f}}return null}function Wn(e){let t=e.trim();if(!t)return[];let n=[],o=0,i=0,a=0,r=!1,c=!1,m=!1,f=!1,d=0;for(let v=0;v<t.length;v++){let g=t[v];if(f){f=!1;continue}if(g==="\\"&&(r||c||m)){f=!0;continue}if(r){g==="'"&&(r=!1);continue}if(c){g==='"'&&(c=!1);continue}if(m){g==="`"&&(m=!1);continue}if(g==="'"){r=!0;continue}if(g==='"'){c=!0;continue}if(g==="`"){m=!0;continue}if(g==="("?o++:g===")"&&o>0?o--:g==="{"?i++:g==="}"&&i>0?i--:g==="["?a++:g==="]"&&a>0&&a--,g===";"&&o===0&&i===0&&a===0){let E=t.slice(d,v).trim();E&&n.push(E),d=v+1}}let b=t.slice(d).trim();return b&&n.push(b),n}function ut(e){let t=e.trim();if(!t)return null;if(t.startsWith("{")){let f=te(t,0,"{","}");if(!f)return null;let d=f.inner.trim(),b=t.slice(f.end+1).trim();return b.startsWith(";")&&(b=b.slice(1).trim()),{body:d,rest:b}}let n=0,o=0,i=0,a=!1,r=!1,c=!1,m=!1;for(let f=0;f<t.length;f++){let d=t[f];if(m){m=!1;continue}if(d==="\\"&&(a||r||c)){m=!0;continue}if(a){d==="'"&&(a=!1);continue}if(r){d==='"'&&(r=!1);continue}if(c){d==="`"&&(c=!1);continue}if(d==="'"){a=!0;continue}if(d==='"'){r=!0;continue}if(d==="`"){c=!0;continue}if(d==="("?n++:d===")"&&n>0?n--:d==="{"?o++:d==="}"&&o>0?o--:d==="["?i++:d==="]"&&i>0&&i--,d===";"&&n===0&&o===0&&i===0)return{body:t.slice(0,f).trim(),rest:t.slice(f+1).trim()}}return{body:t,rest:""}}function Vn(e,t){let n=e.trim();if(!Mn.test(n)||Ln.test(n))return null;let o=2;for(;o<n.length&&/\s/.test(n[o]);)o++;if(n[o]!=="(")return null;let i=te(n,o,"(",")");if(!i)return null;let a=C(i.inner.trim(),t);if(!a)return null;let r=n.slice(i.end+1).trim(),c=ut(r);if(!c||!c.body)return null;let m=Ae(c.body,t);if(!m)return null;r=c.rest.trim();let f=null;if(r.startsWith("else")){r=r.slice(4).trim();let d=ut(r);if(!d||!d.body||(f=Ae(d.body,t),!f))return null;r=d.rest.trim()}return r.length>0?null:d=>{H(()=>{a()?m(d):f?.(d)})}}function qn(e){let t=e.trim();for(;t.startsWith("(");){let n=te(t,0,"(",")");if(!n||n.end!==t.length-1)break;let o=n.inner.trim();if(!o)break;t=o}return t}function At(e){let t=le.get(e);if(t)return t;let n=[],o=[],i=0,a=/\{item\.?(\w*)\}/g,r;for(;(r=a.exec(e))!==null;)n.push(e.slice(i,r.index)),o.push(r[1]),i=a.lastIndex;n.push(e.slice(i));let c={statics:n,dynamics:o,hasItemRef:o.length>0};return Hn(e,c),c}var wt=new WeakMap;function je(e,t){if(!e.hasItemRef)return e.statics[0];let n=e.statics[0];for(let o=0;o<e.dynamics.length;o++){let i=e.dynamics[o];i?n+=String(t?.[i]??""):n+=typeof t=="object"?JSON.stringify(t):String(t??""),n+=e.statics[o+1]??""}return n}function Gn(e,t){let n=e.cloneNode(!0),o=document.createTreeWalker(n,NodeFilter.SHOW_TEXT);for(;o.nextNode();){let i=o.currentNode,a=i.textContent??"";if(a.includes("{item")){let r=At(a);wt.set(i,r),i.textContent=je(r,t)}}return Qn(n,t),n}function jn(e,t){let n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){let o=n.currentNode,i=wt.get(o);i&&(o.textContent=je(i,t))}}var zn=new WeakMap,Jn=["data-list","data-show","data-text","data-if","data-model","data-on:","data-class:","data-bind:","data-computed","data-persist","data-fetch","data-transition","data-transition:"];function Kn(e){for(let t of Jn)if(e===t||e.startsWith(t))return!0;return!1}function ce(e){return e?e.trim().split(/\s+/).map(t=>t.trim()).filter(Boolean):[]}function de(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let n=Number(t.slice(0,-2));return Number.isFinite(n)&&n>=0?n:null}if(t.endsWith("s")){let n=Number(t.slice(0,-1));return Number.isFinite(n)&&n>=0?n*1e3:null}return null}function Ie(e){let t=[],n;for(let o of ce(e)){let i=de(o);i!=null?n=i:t.push(o)}return{classes:t,durationMs:n}}function j(e){return Array.from(new Set(e.filter(Boolean)))}function Ee(e){return e?e.split(",").map(t=>de(t.trim())).filter(t=>t!=null):[]}function dt(e,t){if(e.length===0&&t.length===0)return 0;if(e.length===0)return Math.max(...t,0);if(t.length===0)return Math.max(...e,0);let n=Math.max(e.length,t.length),o=0;for(let i=0;i<n;i++){let a=e[i%e.length]??0,r=t[i%t.length]??0;a+r>o&&(o=a+r)}return o}function Xn(e,t){if(typeof t=="number")return t;let n=window.getComputedStyle(e),o=dt(Ee(n.transitionDuration),Ee(n.transitionDelay)),i=dt(Ee(n.animationDuration),Ee(n.animationDelay));return Math.max(o,i)}function q(e){let t=e[Te];if(t)return t;let n={token:0,cancel:null};return e[Te]=n,n}function ye(e){let t=e[Te];t?.cancel&&t.cancel(),delete e[Te]}function Oe(e){if(!(e.hasAttribute("data-transition")||Array.from(e.attributes).some(v=>v.name.startsWith("data-transition:"))))return null;let n=Ie(e.getAttribute("data-transition")).classes,o=Ie(e.getAttribute("data-transition:enter")),i=Ie(e.getAttribute("data-transition:leave")),a=ce(e.getAttribute("data-transition:enter-from")??e.getAttribute("data-transition:enter-start")),r=ce(e.getAttribute("data-transition:enter-to")??e.getAttribute("data-transition:enter-end")),c=ce(e.getAttribute("data-transition:leave-from")??e.getAttribute("data-transition:leave-start")),m=ce(e.getAttribute("data-transition:leave-to")??e.getAttribute("data-transition:leave-end")),f=de(e.getAttribute("data-transition:duration")??""),d=de(e.getAttribute("data-transition:duration-enter")??"")??o.durationMs??f??void 0,b=de(e.getAttribute("data-transition:duration-leave")??"")??i.durationMs??f??void 0;return{enter:j([...n,...o.classes]),enterFrom:j(a),enterTo:j(r),leave:j([...n,...i.classes]),leaveFrom:j(c),leaveTo:j(m),enterDurationMs:d,leaveDurationMs:b}}function Se(e,t){for(let n of t)e.classList.remove(n)}function $e(e,t){for(let n of t)e.classList.add(n)}function pe(e,t,n){let o=j([...t.base,...t.from,...t.to]),i=!1,a=null,r=null,c=null,m=()=>{i||(i=!0,a!=null&&window.clearTimeout(a),r!=null&&cancelAnimationFrame(r),c!=null&&cancelAnimationFrame(c),Se(e,o),n())};return $e(e,t.base),$e(e,t.from),Se(e,t.to),r=requestAnimationFrame(()=>{c=requestAnimationFrame(()=>{if(i)return;Se(e,t.from),$e(e,t.to);let f=Xn(e,t.durationMs);if(f<=0){m();return}a=window.setTimeout(m,f+25)})}),m}function Yn(e,t,n,o){if(t.insertBefore(e,n),!o)return;let i=q(e);i.token+=1;let a=i.token;i.cancel&&i.cancel(),i.cancel=pe(e,{base:o.enter,from:o.enterFrom,to:o.enterTo,durationMs:o.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)})}function mt(e,t,n){if(e.hasAttribute("data-forma-leaving")){n();return}if(!t){n();return}e.setAttribute("data-forma-leaving","");let o=q(e);o.token+=1;let i=o.token;o.cancel&&o.cancel(),o.cancel=pe(e,{base:t.leave,from:t.leaveFrom,to:t.leaveTo,durationMs:t.leaveDurationMs},()=>{let a=q(e);a.token===i&&(a.cancel=null),e.removeAttribute("data-forma-leaving"),n()})}function Zn(e,t,n,o){if(!n||o){e.style.display=t?"":"none",n&&Se(e,j([...n.enter,...n.enterFrom,...n.enterTo,...n.leave,...n.leaveFrom,...n.leaveTo]));return}let i=q(e);i.token+=1;let a=i.token;if(i.cancel&&i.cancel(),i.cancel=null,t){e.style.display="",i.cancel=pe(e,{base:n.enter,from:n.enterFrom,to:n.enterTo,durationMs:n.enterDurationMs},()=>{let r=q(e);r.token===a&&(r.cancel=null)});return}i.cancel=pe(e,{base:n.leave,from:n.leaveFrom,to:n.leaveTo,durationMs:n.leaveDurationMs},()=>{let r=q(e);r.token===a&&(e.style.display="none",r.cancel=null)})}function Qn(e,t){let n=[e,...Array.from(e.querySelectorAll("*"))];for(let o of n){let i=[];for(let a of Array.from(o.attributes))if(!Kn(a.name)&&a.value.includes("{item")){let r=At(a.value);i.push({attr:a.name,compiled:r}),o.setAttribute(a.name,je(r,t))}i.length>0&&zn.set(o,i)}}function eo(e,t){let n=0,o=e.match(/^[a-zA-Z_$]\w*/);if(!o)return null;let i=o[0];if(n=i.length,n>=e.length||e[n]!=="."&&!(e[n]==="?"&&e[n+1]==="."))return null;let a=[];for(;n<e.length;){let c=!1;if(e[n]==="?"&&e[n+1]===".")c=!0,n+=2;else if(e[n]===".")n+=1;else return null;let m=e.slice(n).match(/^\w+/);if(!m)return null;let f=m[0];if(n+=f.length,ee.has(f))return()=>{};if(n<e.length&&e[n]==="("){let d=te(e,n,"(",")");if(!d)return null;let b=d.inner.trim(),v=[];for(let g of Fe(b)){let E=C(g,t);if(!E)return null;v.push(E)}a.push({type:"call",name:f,optional:c,argFns:v}),n=d.end+1}else a.push({type:"prop",name:f,optional:c})}if(n!==e.length||a.length===0)return null;let r=i==="Math"?(()=>Math):(()=>t.getters[i]?.());return()=>{let c=r();for(let m of a){if(c==null)return m.optional,void 0;if(m.type==="prop")c=c[m.name];else{let f=c[m.name];if(typeof f!="function")return;let d=m.argFns.map(b=>b());c=f.apply(c,d)}}return c}}function C(e,t){let n=ae.get(e);if(n)return n(t);let o=to(e,t);if(o!==null)if(e==="true"||e==="false"||e==="null"||e==="undefined"){let i=e==="true"?!0:e==="false"?!1:e==="null"?null:void 0;se(e,()=>()=>i)}else if(St.test(e))se(e,i=>()=>i.getters[e]?.());else if(bt.test(e)||Et.test(e)){let i=e.slice(1,-1);se(e,()=>()=>i)}else if(yt.test(e)){let i=Number(e);se(e,()=>()=>i)}else{let i=e.match(fn);if(i){let a=i[1],r=i[2];se(e,c=>()=>c.getters[a]?.()?.[r])}}return o}function to(e,t){e=e.trim();let n=qn(e);if(n!==e)return C(n,t);if(bt.test(e)||Et.test(e)){let g=e.slice(1,-1);return()=>g}if(yt.test(e)){let g=Number(e);return()=>g}if(e==="true")return()=>!0;if(e==="false")return()=>!1;if(e==="null")return()=>null;if(e==="undefined")return()=>{};if(St.test(e))return()=>t.getters[e]?.();{let g=eo(e,t);if(g)return g}let o=e.match(Sn);if(o){let g=o[1].trim(),E=o[2],A=o[3].trim();if(ee.has(E))return()=>{};let T=C(g,t);if(!T)return null;let k=[];for(let u of Fe(A)){let p=C(u,t);if(!p)return null;k.push(p)}return()=>{let u=T(),p=u?.[E];if(typeof p!="function")return;let s=k.map(l=>l());return p.apply(u,s)}}if(e.startsWith("!")){let g=C(e.slice(1).trim(),t);if(g)return()=>!g()}let i=e.match(un);if(i){let g=C(i[1],t),E,A=i[2];if(Tn.test(A)?E=Number(A):E=A.slice(1,-1),g)return()=>g()?.[E]}if(e.startsWith("[")){let g=te(e,0,"[","]");if(g&&g.end===e.length-1){let E=g.inner.trim();if(E==="")return()=>[];let A=Fe(E),T=[],k=!0;for(let u of A){let p=C(u.trim(),t);if(!p){k=!1;break}T.push(p)}if(k)return()=>T.map(u=>u())}}let a=e.match(dn);if(a){let g=C(a[1].trim(),t),E=C(a[2].trim(),t),A=C(a[3].trim(),t);if(g&&E&&A)return()=>g()?E():A()}let r=e.match(mn);if(r){let g=C(r[1].trim(),t),E=C(r[2].trim(),t);if(g&&E)return()=>g()??E()}let c=e.match(pn);if(c){let g=C(c[1].trim(),t),E=C(c[2].trim(),t);if(g&&E)return()=>g()&&E()}let m=e.match(gn);if(m){let g=C(m[1].trim(),t),E=C(m[2].trim(),t);if(g&&E)return()=>g()||E()}let f=e.match(hn);if(f){let g=C(f[1].trim(),t),E=C(f[3].trim(),t);if(g&&E){let A=f[2];return()=>{let T=g(),k=E();switch(A){case"===":return T===k;case"!==":return T!==k;case"==":return T==k;case"!=":return T!=k;case">":return T>k;case"<":return T<k;case">=":return T>=k;case"<=":return T<=k}}}}let d=e.match(vn);if(d){let g=C(d[1].trim(),t),E=C(d[3].trim(),t);if(g&&E){let A=d[2];return()=>{let T=g(),k=E();switch(A){case"*":return T*k;case"/":return T/k;case"%":return T%k}}}}let b=e.match(bn);if(b){let g=C(b[1].trim(),t),E=C(b[3].trim(),t);if(g&&E){let A=b[2];return()=>{let T=g(),k=E();return A==="+"?T+k:T-k}}}let v=e.match(En);if(v){let g=v[1],E=[],A=[],T=0,k=new RegExp(yn.source,"g"),u;for(;(u=k.exec(g))!==null;){E.push(g.slice(T,u.index));let p=C(u[1].trim(),t);if(!p)return null;A.push(p),T=k.lastIndex}return E.push(g.slice(T)),()=>{let p=E[0];for(let s=0;s<A.length;s++)p+=String(A[s]()??""),p+=E[s+1]??"";return p}}return null}function _t(e,t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}function kt(e){return e.includes("...")?"Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).":e.includes("=>")?"Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).":"Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true)."}function z(e,t){let n=e.replace(Be,"").trim(),o=_t(qe,t),i=o.get(n);if(i)return i;let a=C(n,t);if(a)return o.set(n,a),a;if(!U){D("buildEvaluator: blocked unsafe eval fallback for expression:",n),Q("expression-unsupported",n,kt(n));let c=()=>{};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in expression`;throw Q("expression-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope",`with(__scope) { return (${n}); }`),m=new Proxy(Object.create(null),{has(d,b){return b in t.getters},get(d,b){if(ee.has(b))return;let v=t.getters[b];return v?v():void 0}}),f=()=>c(m);return o.set(n,f),f}catch{Q("expression-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c=()=>{};return o.set(n,c),c}}function Ae(e,t){let n=e.trim().replace(/;+$/g,"").trim();if(!n)return null;let o=Vn(n,t);if(o)return o;let i=Wn(n);if(i.length>1){let v=i.map(g=>Ae(g,t));return v.every(g=>g!==null)?g=>{H(()=>{for(let E of v)E(g)})}:null}let a=i[0]??n,r=a.match(An);if(r){let v=r[1],g=r[2];return()=>{H(()=>{let E=t.getters[v]?.()??0;t.setters[v]?.(g==="++"?E+1:E-1)})}}let c=a.match(wn);if(c){let v=c[1],g=c[2];return()=>{H(()=>{let E=t.getters[g]?.()??0;t.setters[g]?.(v==="++"?E+1:E-1)})}}let m=a.match(_n);if(m&&m[1]===m[2]){let v=m[1];return()=>{H(()=>{t.setters[v]?.(!t.getters[v]?.())})}}let f=a.match(kn);if(f){let v=f[1],g=C(f[2].trim(),t);if(g)return I&&D(`parseHandler: assignment "${v} = ..." \u2014 setter exists:`,!!t.setters[v],", getter exists:",!!t.getters[v]),()=>{H(()=>{let E=g();I&&D(`SETTER: ${v} = ${E} (was: ${t.getters[v]?.()})`),t.setters[v]?.(E)})}}let d=a.match(Rn);if(d){let v=d[1],g=d[2],E=C(d[3].trim(),t);if(E)return()=>{H(()=>{let A=t.getters[v]?.()??0,T=E();switch(g){case"+=":t.setters[v]?.(A+T);break;case"-=":t.setters[v]?.(A-T);break;case"*=":t.setters[v]?.(A*T);break;case"/=":t.setters[v]?.(A/T);break}})}}let b=a.match(In);if(b){let v=b[1];return()=>gt(v)}return null}function no(e,t){let n=e.trim();if(n.startsWith("{")){let c=te(n,0,"{","}");c&&c.end===n.length-1&&(n=c.inner.trim())}let o=_t(Ge,t),i=o.get(n);if(i)return i;let a=Ae(n,t);if(a){let c={handler:a,supported:!0};return o.set(n,c),c}if(!U){D("buildHandler: blocked unsafe eval fallback for expression:",n),Q("handler-unsupported",n,kt(n));let c={handler:()=>{},supported:!1};return o.set(n,c),c}let r=Tt(n);if(r){let c=`Blocked unsafe method "${r}" in handler`;throw Q("handler-unsupported",n,c),new Error(`[FormaJS] ${c}: ${n}`)}try{let c=new Function("__scope","$event","event",`with(__scope) { ${n} }`),m=new Proxy(Object.create(null),{has(b,v){return v==="$event"||v==="event"?!1:v in t.getters||v in t.setters},get(b,v){if(ee.has(v))return;let g=t.getters[v];return g?g():void 0},set(b,v,g){let E=t.setters[v];return E&&E(g),!0}}),d={handler:b=>{H(()=>c(m,b,b))},supported:!0};return o.set(n,d),d}catch{Q("handler-unsupported",n,"Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.");let c={handler:()=>{},supported:!1};return o.set(n,c),c}}var oo=new Set(["__proto__","constructor","prototype"]);function Rt(e){let t;try{t=JSON.parse(e)}catch{return I&&D("parseState: Invalid JSON in data-forma-state \u2014 use valid JSON with quoted keys. Got:",e.slice(0,200)),{}}for(let n of oo)n in t&&delete t[n];return t}function io(e){let t=e.getAttribute("data-forma-state")??"{}",n=Rt(t),o=Object.keys(n);I&&(D("initScope: parsed",o.length,"keys:",o.join(", ")),o.length===0&&D("initScope: WARNING \u2014 empty state! Raw attribute:",t.slice(0,200)));let i={},a={};for(let[r,c]of Object.entries(n)){let[m,f]=Z(c);i[r]=m,a[r]=f}return i.$refetch=()=>gt,{getters:i,setters:a}}function J(e,t,n){t=Le(t,{$el:e,$dispatch:(u,p)=>{e.dispatchEvent(new CustomEvent(u,{bubbles:!0,composed:!0,detail:p}))}});let i=lo(e),a=!i||i.has("data-computed")?e.getAttribute("data-computed"):null;if(a){let u=a.split(/;\s*(?=\w+\s*=[^=])/);for(let p of u){let s=p.trim();if(!s)continue;let l=s.match(Cn);if(l){let h=l[1],y=l[2],S=t.getters[h];delete t.getters[h];let w=z(`{${y}}`,t),x=Ce(w);t.getters[h]=x,S||delete t.setters[h]}}}let r=!i||i.has("data-text")?e.getAttribute("data-text"):null;if(r){let u=z(r,t),p=F(()=>{Fn(e,Bn(u()))});n.push(p)}let c=!i||i.has("data-show")?e.getAttribute("data-show"):null;if(c){let u=z(c,t),p=Oe(e);if(I){let h=e.tagName.toLowerCase(),y=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-show="${c}" on <${h}${y}>`)}let s=!1,l=F(()=>{let h=!!u();I&&D(`data-show effect: "${c}" \u2192 ${h}`),Zn(e,h,p,!s),s=!0});n.push(l),p&&n.push(()=>ye(e))}let m=!i||i.has("data-if")?e.getAttribute("data-if"):null;if(m){let u=z(m,t),p=Oe(e),s=document.createComment("forma-if"),l=e.parentNode,h=!0,y=!1,S=F(()=>{let w=!!u();w&&!h?(ye(e),e.removeAttribute("data-forma-leaving"),y&&p?Yn(e,l,s,p):l?.insertBefore(e,s),h=!0):!w&&h&&(y&&p?mt(e,p,()=>{e.parentNode&&(l?.insertBefore(s,e),e.remove())}):(l?.insertBefore(s,e),e.remove()),h=!1),y=!0});n.push(S),p&&n.push(()=>ye(e))}let f=!i||i.has("data-model")?e.getAttribute("data-model"):null;if(f){let u=f.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l=e,h=F(()=>{let w=p();l.type==="checkbox"?l.checked=!!w:l.value=String(w??"")});n.push(h);let y=l.type==="checkbox"?"change":"input",S=()=>{l.type==="checkbox"?s(l.checked):l.type==="number"||l.type==="range"?s(Number(l.value)):s(l.value)};l.addEventListener(y,S),n.push(()=>{l.removeEventListener(y,S)})}}let d=!i||co(i,"data-on:","data-class:","data-bind:"),b=e.attributes;if(d)for(let u=0;u<b.length;u++){let p=b[u],s=p.name;if(s.startsWith("data-on:")){let l=s.slice(8),h=no(p.value,t),y=h.handler;if(I){let S=e.tagName.toLowerCase(),w=e.id?`#${e.id}`:"",x=e.className?`.${String(e.className).split(" ")[0]}`:"";D(`bindElement: data-on:${l}="${p.value}" on <${S}${w}${x}>`)}if(h.supported?e.hasAttribute("data-forma-handler-error")&&e.removeAttribute("data-forma-handler-error"):e.setAttribute("data-forma-handler-error","unsupported"),I){let S=p.value,w=x=>{D(`HANDLER FIRED: data-on:${l}="${S}"`,"isTrusted:",x.isTrusted),y(x)};e.addEventListener(l,w),n.push(()=>{e.removeEventListener(l,w)})}else e.addEventListener(l,y),n.push(()=>{e.removeEventListener(l,y)})}else if(s.startsWith("data-class:")){let l=s.slice(11),h=z(p.value,t),y=F(()=>{e.classList.toggle(l,!!h())});n.push(y)}else if(s.startsWith("data-bind:")){let l=s.slice(10),h=z(p.value,t),y=F(()=>{let S=h();S==null||S===!1?e.removeAttribute(l):e.setAttribute(l,String(S))});n.push(y)}}let v=!i||i.has("data-persist")?e.getAttribute("data-persist"):null;if(v){let u=v.replace(Be,"").trim(),p=t.getters[u],s=t.setters[u];if(p&&s){let l="forma:"+u;try{let y=localStorage.getItem(l);y!==null&&s(JSON.parse(y))}catch{}let h=F(()=>{try{localStorage.setItem(l,JSON.stringify(p()))}catch{}});n.push(h)}}let g=!i||i.has("data-list")?e.getAttribute("data-list"):null;if(g){let u=z(g,t),p=e.children[0];if(p){let x=function(N){let R=N;if(Array.isArray(R.__formaDisposers)){for(let _ of R.__formaDisposers)try{_()}catch{}delete R.__formaDisposers}},G=function(N,R){let _=Gn(s,N),L=Le(t,{item:N,index:R}),M=[];J(_,L,M);for(let B of Array.from(_.querySelectorAll("*")))J(B,L,M);return _.__formaDisposers=M,_},ne=function(N,R,_){x(N),jn(N,R);let L=Le(t,{item:R,index:_}),M=[];J(N,L,M);for(let B of Array.from(N.querySelectorAll("*")))J(B,L,M);N.__formaDisposers=M};var A=x,T=G,k=ne;let s=p.cloneNode(!0);e.removeChild(p);let l=s.getAttribute("data-key"),h=l?l.replace(Dn,"").trim():null,y=Oe(e),S=[],w=[],oe=y?{onInsert:N=>{let R=N;if(!R.setAttribute)return;let _=q(R);_.token+=1;let L=_.token;_.cancel&&_.cancel(),_.cancel=pe(R,{base:y.enter,from:y.enterFrom,to:y.enterTo,durationMs:y.enterDurationMs},()=>{let M=q(R);M.token===L&&(M.cancel=null)})},onBeforeRemove:(N,R)=>{let _=N;if(!_.setAttribute){R();return}x(N),mt(_,y,()=>{R()})}}:void 0,ie=F(()=>{let N=u();if(!Array.isArray(N)){for(let _ of w)x(_),e.removeChild(_);S=[],w=[];return}if(y){let _=e.querySelectorAll("[data-forma-leaving]");for(let L of Array.from(_))ye(L),L.removeAttribute("data-forma-leaving"),L.parentNode&&L.parentNode.removeChild(L)}let R=new Set(w);if(h){let _=Ne(e,S,N,w,M=>String(M?.[h]??""),M=>{let B=N.indexOf(M);return G(M,B)},(M,B)=>{let $=N.indexOf(B);ne(M,B,$)},void 0,oe),L=new Set(_.nodes);for(let M of R)if(!L.has(M)){if(M.hasAttribute?.("data-forma-leaving"))continue;x(M)}S=_.items,w=_.nodes}else{let _=N.map(($,ge)=>({__idx:ge,__item:$})),M=Ne(e,S,_,w,$=>$.__idx,$=>G($.__item,$.__idx),($,ge)=>ne($,ge.__item,ge.__idx),void 0,oe),B=new Set(M.nodes);for(let $ of R)if(!B.has($)){if($.hasAttribute?.("data-forma-leaving"))continue;x($)}S=M.items,w=M.nodes}});n.push(ie)}}let E=!i||i.has("data-fetch")?e.getAttribute("data-fetch"):null;if(E){let u=E.match(Nn);if(u){let p=u[1].trim(),s=u[2].trim(),l=u[3]?.trim()??"",h="GET",y=p,S=p.match(xn);S&&(h=S[1].toUpperCase(),y=S[2].trim());let w,x,G;for(let R of l.split("|").filter(Boolean)){let[_,L]=R.split(":").map(M=>M.trim());_==="loading"?w=L:_==="error"?x=L:_==="poll"&&(G=parseInt(L??"0",10))}let[ne,oe]=Z(null);if(t.getters[s]=ne,t.setters[s]=oe,w){let[R,_]=Z(!1);t.getters[w]=R,t.setters[w]=_}if(x){let[R,_]=Z(null);t.getters[x]=R,t.setters[x]=_}let ie=()=>{w&&t.setters[w](!0),fetch(y,{method:h}).then(R=>R.json()).then(R=>{oe(R),w&&t.setters[w](!1)}).catch(R=>{x&&t.setters[x](R.message),w&&t.setters[w](!1)})},N=e.getAttribute("data-fetch-id");if(N&&(Pe.set(N,ie),n.push(()=>Pe.delete(N))),ie(),G&&G>0){let R=setInterval(ie,G);n.push(()=>clearInterval(R))}}}}var ni=["[data-text]","[data-show]","[data-if]","[data-model]","[data-computed]","[data-persist]","[data-list]","[data-fetch]","[data-bind\\:*]","[data-class\\:*]","[data-on\\:*]","[data-transition]"].join(",");function ro(e){let t=e.attributes;for(let n=0;n<t.length;n++){let o=t[n].name;if(o.startsWith("data-text")||o.startsWith("data-show")||o.startsWith("data-if")||o.startsWith("data-model")||o.startsWith("data-computed")||o.startsWith("data-persist")||o.startsWith("data-list")||o.startsWith("data-fetch")||o.startsWith("data-on:")||o.startsWith("data-class:")||o.startsWith("data-bind:")||o.startsWith("data-transition"))return!0}return!1}var V=null;function so(e){if(!e||Object.keys(e).length===0){V=null;return}V=new Map;for(let t in e)V.set(t,new Set(e[t]))}function ao(){if(!V||V.size===0||V.size>200)return null;let e=[];for(let t of V.keys())e.push(`[data-forma-id="${t}"]`);return e.join(",")}function lo(e){if(!V)return null;let t=e.getAttribute("data-forma-id");return t?V.get(t)??null:null}function co(e,...t){for(let n of e)for(let o of t)if(n.startsWith(o))return!0;return!1}function K(e){if(e.__formaDisposers){I&&D("mountScope: SKIPPED (already mounted)");return}let t=io(e),n=[];J(e,t,n);let o=0,i=ao();if(i){let a=e.querySelectorAll(i);for(let r=0;r<a.length;r++)J(a[r],t,n),o++}else{let a=e.querySelectorAll("*");for(let r=0;r<a.length;r++){let c=a[r];ro(c)&&(J(c,t,n),o++)}}e.__formaDisposers=n,e.__formaScope=t,e.__formaInitialState=e.getAttribute("data-forma-state")??"{}",I&&D("mountScope: DONE \u2014",o,"elements bound,",n.length,"disposers",i?"(targeted)":"(full scan)")}function X(e){let t=e.__formaDisposers;if(t){for(let n of t)try{n()}catch{}delete e.__formaDisposers,delete e.__formaScope,delete e.__formaInitialState}}var W=null,pt=1,fo=40,fe=[],me=!1;function uo(e){for(let t=0;t<e.removedNodes.length;t++){let n=e.removedNodes[t];if(n.nodeType!==pt)continue;let o=n;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: REMOVED scope"),X(o));let i=o.querySelectorAll("[data-forma-state]");for(let a=0;a<i.length;a++)X(i[a])}for(let t=0;t<e.addedNodes.length;t++){let n=e.addedNodes[t];if(n.nodeType!==pt)continue;let o=n;if(o.closest("[data-forma-leaving]"))continue;o.hasAttribute("data-forma-state")&&(I&&D("MutationObserver: ADDED scope via mutation"),K(o));let i=o.querySelectorAll("[data-forma-state]");I&&i.length>0&&D("MutationObserver: found",i.length,"nested scope(s) in added subtree");for(let a=0;a<i.length;a++){let r=i[a];r.closest("[data-forma-leaving]")||K(r)}}if(e.type==="attributes"&&e.attributeName==="data-forma-state"){let t=e.target;X(t),t.hasAttribute("data-forma-state")&&K(t)}}async function Mt(){try{for(;fe.length>0;){let e=fe.splice(0,fo);for(let t=0;t<e.length;t++)uo(e[t]);fe.length>0&&await ht()}}finally{me=!1,fe.length>0&&!me&&(me=!0,Mt())}}function mo(e){I&&D("MutationObserver: queued",e.length,"mutation(s)"),fe.push(...e),!me&&(me=!0,Mt())}function po(){if(W)return;W=new MutationObserver(mo);let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}function go(){W&&(W.disconnect(),W=null)}function We(){ln&&vt(document,{skipIfAlreadySet:!0});let e=document.querySelectorAll("[data-forma-state]");I&&D("initRuntime: found",e.length,"scope(s)");for(let t of Array.from(e))K(t);po(),I&&D("initRuntime: MutationObserver started")}function ho(){go();let e=document.querySelectorAll("[data-forma-state]");for(let t of Array.from(e))X(t)}function vo(e){e.hasAttribute("data-forma-state")&&K(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))K(n)}function bo(e){e.hasAttribute("data-forma-state")&&X(e);let t=e.querySelectorAll("[data-forma-state]");for(let n of Array.from(t))X(n)}typeof document<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",We):We());function Eo(e){I=e}function yo(e){P!==e&&(P=e,e==="locked-off"&&(U=!1),e==="locked-on"&&(U=!0),e==="mutable"&&(U=!0),qe=new WeakMap,Ge=new WeakMap)}function So(e){if(P!=="mutable"){D(`setUnsafeEval ignored (mode=${P}); unsafe fallback is locked`);return}U!==e&&(U=e,qe=new WeakMap,Ge=new WeakMap)}function To(){return P}function Ao(e){Ve=e}function wo(){return Array.from(ue.values()).map(e=>({...e}))}function _o(){ue.clear()}function ko(){let e=document.querySelectorAll("[data-forma-state]"),t=[];for(let n of Array.from(e)){if(n.closest("[data-forma-leaving]"))continue;let o=n.__formaScope,i=n.__formaInitialState;if(!o)continue;let a={};for(let r of Object.keys(o.getters)){let c=o.getters[r]();a[r]={value:c,type:typeof c}}t.push({element:n,id:n.getAttribute("data-forma-id")||n.id||n.tagName.toLowerCase(),values:a,initialJSON:i??"{}"})}return t}function Ro(e,t,n){let o=e.__formaScope;o?.setters[t]&&H(()=>{o.setters[t](n)})}function Mo(e){let t=e.__formaScope,n=e.__formaInitialState;if(!t||!n)return;let o=Rt(n);H(()=>{for(let[i,a]of Object.entries(o))t.setters[i]?.(a)})}var He=null;function Co(){return He||(He=at({mountScope:K,unmountScope:X,disconnectObserver(){W&&W.disconnect()},reconnectObserver(){if(W){let e=document.body||document.documentElement;e&&W.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-forma-state"]})}},batch:H})),He}function No(e,t){Co()(e,t)}return It(xo);})();
//# sourceMappingURL=formajs-runtime.global.js.map

@@ -1,2 +0,2 @@

"use strict";var FormaJS=(()=>{var Ce=Object.defineProperty;var In=Object.getOwnPropertyDescriptor;var On=Object.getOwnPropertyNames;var Fn=Object.prototype.hasOwnProperty;var Bn=(e,t)=>{for(var n in t)Ce(e,n,{get:t[n],enumerable:!0})},Kn=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of On(t))!Fn.call(e,r)&&r!==n&&Ce(e,r,{get:()=>t[r],enumerable:!(o=In(t,r))||o.enumerable});return e};var jn=e=>Kn(Ce({},"__esModule",{value:!0}),e);var Ho={};Bn(Ho,{$:()=>vt,$$:()=>wt,$$serverFunction:()=>en,Fragment:()=>he,activateIslands:()=>rt,addClass:()=>bt,applyRevalidation:()=>Se,batch:()=>H,children:()=>_t,cleanup:()=>qe,closest:()=>Lt,createAction:()=>Jt,createBus:()=>Tt,createComputed:()=>X,createContext:()=>ft,createEffect:()=>Y,createErrorBoundary:()=>nt,createFetch:()=>Ut,createHistory:()=>yt,createIndexedDB:()=>$t,createList:()=>Q,createLocalStorage:()=>Kt,createMemo:()=>Fe,createPortal:()=>tt,createRPCMiddleware:()=>rn,createReducer:()=>je,createRef:()=>Ke,createResource:()=>Ve,createRoot:()=>D,createSSE:()=>Gt,createSessionStorage:()=>jt,createShow:()=>ee,createSignal:()=>R,createStore:()=>gt,createSuspense:()=>ot,createSwitch:()=>et,createText:()=>Ze,createWebSocket:()=>zt,defineComponent:()=>at,delegate:()=>St,disposeComponent:()=>ct,enableAutoRevalidation:()=>Zt,fetchJSON:()=>Wt,fragment:()=>Xe,getRegisteredEndpoints:()=>on,getServerFunction:()=>nn,h:()=>oe,handleRPC:()=>ve,hydrateIsland:()=>K,inject:()=>dt,longestIncreasingSubsequence:()=>Z,mount:()=>Qe,nextSibling:()=>Pt,on:()=>Be,onCleanup:()=>_e,onError:()=>Pe,onIntersect:()=>Ft,onKey:()=>xt,onMount:()=>it,onMutation:()=>Bt,onResize:()=>Ot,onUnmount:()=>st,parent:()=>Ht,persist:()=>ht,prevSibling:()=>It,provide:()=>ut,reconcileList:()=>U,registerResource:()=>Yt,registerServerFunction:()=>tn,removeClass:()=>Ct,renderIsland:()=>Pn,renderLocal:()=>Hn,setAttr:()=>kt,setHTML:()=>At,setHTMLUnsafe:()=>Nt,setStyle:()=>Rt,setText:()=>Mt,siblings:()=>Dt,toggleClass:()=>Et,trackDisposer:()=>lt,unprovide:()=>pt,unregisterResource:()=>Xt,untrack:()=>N,withRevalidation:()=>Qt});var Vn=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))(Vn||{});function $n({updateComputed:e,notifyEffect:t}){let n=[],o=0,r=0;return{link:i,propagate:a,updateDirtyFlag:m,startTracking:c,endTracking:f,processEffectNotifications:T,processComputedUpdate:u,processPendingInnerEffects:g};function i(d,p){let s=p.depsTail;if(s!==void 0&&s.dep===d)return;let l=s!==void 0?s.nextDep:p.deps;if(l!==void 0&&l.dep===d){p.depsTail=l;return}let y=d.subsTail;if(!(y!==void 0&&y.sub===p&&C(y,p)))return h(d,p,l,s)}function a(d){let p=d.nextSub,s,l=0,y=32;e:do{let v=d.sub,w=v.flags,k=!1;if(w&244?w&16&&!(w&4)?(v.flags=w&-17|y|8,k=!0):!(w&224)&&C(d,v)&&(v.flags=w|16|y|8,k=v.subs!==void 0):(v.flags=w|y|8,k=!0),k){let A=v.subs;if(A!==void 0){d=A,A.nextSub!==void 0?(s={target:p,linked:s},++l,p=d.nextSub,y=64):y=w&2?128:64;continue}w&2&&(n[r++]=v)}else w&(4|y)?!(w&y)&&w&224&&C(d,v)&&(v.flags=w|y):(v.flags=w|y|8,(w&10)===2&&(n[r++]=v));if((d=p)!==void 0){p=d.nextSub,y=l?64:32;continue}for(;l--;)if(d=s.target,s=s.linked,d!==void 0){p=d.nextSub,y=l?64:32;continue e}break}while(!0)}function c(d){d.depsTail=void 0,d.flags=d.flags&-249|4}function f(d){let p=d.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(x(s),p.nextDep=void 0)}else d.deps!==void 0&&(x(d.deps),d.deps=void 0);d.flags&=-5}function m(d,p){return S(d.deps)?(d.flags=p|32,!0):(d.flags=p&-65,!1)}function u(d,p){if(p&32||S(d.deps)){if(e(d)){let s=d.subs;s!==void 0&&b(s)}}else d.flags=p&-65}function g(d,p){if(p&128){d.flags=p&-129;let s=d.deps;do{let l=s.dep;"flags"in l&&l.flags&2&&l.flags&224&&t(l),s=s.nextDep}while(s!==void 0)}}function T(){for(;o<r;){let d=n[o];n[o++]=void 0,t(d)||(d.flags&=-9)}o=0,r=0}function h(d,p,s,l){let y={dep:d,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(l===void 0?p.deps=y:l.nextDep=y,d.subs===void 0)d.subs=y;else{let v=d.subsTail;y.prevSub=v,v.nextSub=y}return p.depsTail=y,d.subsTail=y,y}function S(d){let p,s=0,l;e:do{l=!1;let y=d.dep;if(d.sub.flags&32)l=!0;else if("flags"in y){let v=y.flags;if((v&33)===33){if(e(y)){let w=y.subs;w.nextSub!==void 0&&b(w),l=!0}}else if((v&65)===65){(d.nextSub!==void 0||d.prevSub!==void 0)&&(p={target:d,linked:p}),d=y.deps,++s;continue}}if(!l&&d.nextDep!==void 0){d=d.nextDep;continue}for(;s;){--s;let v=d.sub,w=v.subs;if(l){if(e(v)){w.nextSub!==void 0?(d=p.target,p=p.linked,b(w)):d=w;continue}}else v.flags&=-65;if(w.nextSub!==void 0?(d=p.target,p=p.linked):d=w,d.nextDep!==void 0){d=d.nextDep;continue e}l=!1}return l}while(!0)}function b(d){do{let p=d.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[r++]=p)),d=d.nextSub}while(d!==void 0)}function C(d,p){let s=p.depsTail;if(s!==void 0){let l=p.deps;do{if(l===d)return!0;if(l===s)break;l=l.nextDep}while(l!==void 0)}return!1}function x(d){do{let p=d.dep,s=d.nextDep,l=d.nextSub,y=d.prevSub;if(l!==void 0?l.prevSub=y:p.subsTail=y,y!==void 0?y.nextSub=l:p.subs=l,p.subs===void 0&&"deps"in p){let v=p.flags;v&32||(p.flags=v|32);let w=p.deps;if(w!==void 0){d=w,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}d=s}while(d!==void 0)}}var{link:q,propagate:Un,updateDirtyFlag:Wn,startTracking:Ee,endTracking:Re,processEffectNotifications:sn,processComputedUpdate:Gn,processPendingInnerEffects:an}=$n({updateComputed(e){let t=L;L=e,Ee(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{L=t,Re(e)}},notifyEffect(e){return"isScope"in e?Jn(e):zn(e)}}),cn=[],ke=0,L,le;function ln(){++ke}function fn(){--ke||sn()}function fe(){cn.push(L),L=void 0}function ue(){L=cn.pop()}function un(e){return Yn.bind({currentValue:e,subs:void 0,subsTail:void 0})}function dn(e){return qn.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Me(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};L!==void 0?q(t,L):le!==void 0&&q(t,le);let n=L;L=t;try{t.fn()}finally{L=n}return Xn.bind(t)}function zn(e){let t=e.flags;if(t&32||t&64&&Wn(e,t)){let n=L;L=e,Ee(e);try{e.fn()}finally{L=n,Re(e)}}else an(e,e.flags);return!0}function Jn(e){return e.flags&128?(an(e,e.flags),!0):!1}function qn(){let e=this.flags;return e&96&&Gn(this,e),L!==void 0?q(this,L):le!==void 0&&q(this,le),this.currentValue}function Yn(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Un(t),ke||sn())}}else return L!==void 0&&q(this,L),this.currentValue}function Xn(){Ee(this),Re(this)}function Zn(e,t){if(typeof t!="function"){e(t);return}fe();let n=e();ue(),e(t(n))}function R(e){let t=un(e);return[t,r=>Zn(t,r)]}var I=R;var V=null,de=[];function D(e){let t={disposers:[]};de.push(V),V=t;let n=()=>{for(let o of t.disposers)try{o()}catch{}t.disposers.length=0};try{return e(n)}finally{V=de.pop()??null,de.length===0&&(de.length=0)}}function Ae(e){V&&V.disposers.push(e)}function Ne(){return V!==null}var Le=null;function _e(e){Le?.(e)}function De(e){let t=Le;return Le=e,t}var _=typeof process<"u"?process.env?.NODE_ENV!=="production":!0,He=null;function Pe(e){He=e}function $(e,t){if(He)try{He(e,t?{source:t}:{})}catch{}_&&console.error(`[forma] ${t??"Unknown"} error:`,e)}var Ie=32,pn=100,Oe=[];for(let e=0;e<Ie;e++)Oe.push([]);var pe=Ie;function Qn(){if(pe>0){let e=Oe[--pe];return e.length=0,e}return[]}function mn(e){e.length=0,pe<Ie&&(Oe[pe++]=e)}function gn(e){if(e!==void 0)try{e()}catch(t){$(t,"effect cleanup")}}function yn(e){if(e!==void 0)for(let t=0;t<e.length;t++)try{e[t]()}catch(n){$(n,"effect cleanup")}}function E(e){let t=Me(e);return Ne()&&Ae(t),t}function Y(e){let t=Ne(),n,o,r,i,a=C=>{if(i!==void 0){i.push(C);return}if(r!==void 0){let x=Qn();x.push(r,C),r=void 0,i=x;return}r=C},c=!1,f=!0,m=!1,u=!1,g=()=>{if(n!==void 0&&(gn(n),n=void 0),o!==void 0&&(yn(o),mn(o),o=void 0),c){try{e()}catch(x){$(x,"effect")}return}r=void 0,i=void 0;let C=De(a);try{let x=e();if(typeof x=="function"&&a(x),r===void 0&&i===void 0){f&&(c=!0);return}i!==void 0?o=i:n=r}catch(x){$(x,"effect"),i!==void 0?o=i:n=r}finally{De(C),f=!1}},h=Me(()=>{if(m){u=!0;return}m=!0;try{let C=0;do u=!1,g(),u&&(C++,C>=pn&&($(new Error(`createEffect exceeded ${pn} re-entrant runs`),"effect"),u=!1));while(u)}finally{m=!1}}),S=!1,b=()=>{S||(S=!0,h(),n!==void 0&&(gn(n),n=void 0),o!==void 0&&(yn(o),mn(o),o=void 0))};return t&&Ae(b),b}function X(e){return dn(e)}var Fe=X;function H(e){ln();try{e()}finally{fn()}}function N(e){fe();try{return e()}finally{ue()}}function Be(e,t,n){let o,r=!0;return()=>{let i=e();if(n?.defer&&r){r=!1,o=i;return}let a=N(()=>t(i,o));return o=i,a}}function Ke(e){return{current:e}}function je(e,t){let[n,o]=R(t);return[n,i=>{o(a=>e(a,i))}]}var me=null,hn=[];function Tn(e){hn.push(me),me=e}function Sn(){me=hn.pop()??null}function xn(){return me}function Ve(e,t,n){let[o,r]=R(n?.initialValue),[i,a]=I(!1),[c,f]=I(void 0),m=xn(),u=null,g=0,T=()=>{let S=N(e);u&&u.abort();let b=new AbortController;u=b;let C=++g,x=()=>C===g,d=!1;m&&(m.increment(),d=!0),a(!0),f(void 0),Promise.resolve(t(S)).then(p=>{x()&&!b.signal.aborted&&r(()=>p)}).catch(p=>{x()&&!b.signal.aborted&&p?.name!=="AbortError"&&f(p)}).finally(()=>{d&&m?.decrement(),x()&&(a(!1),u===b&&(u=null))})};E(()=>{e(),T()});let h=(()=>o());return h.loading=i,h.error=c,h.refetch=T,h.mutate=S=>r(()=>S),h}function Z(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),r=new Int32Array(t).fill(-1),i=0;for(let f=0;f<t;f++){let m=e[f],u=0,g=i;for(;u<g;){let T=u+g>>1;n[T]<m?u=T+1:g=T}n[u]=m,o[u]=f,u>0&&(r[f]=o[u-1]),u>=i&&i++}let a=new Array(i),c=o[i-1];for(let f=i-1;f>=0;f--)a[f]=c,c=r[c];return a}var eo=32,$e=Symbol.for("forma-abort"),Ue=Symbol.for("forma-attr-cache"),We=Symbol.for("forma-dynamic-child");function to(e,t){return e instanceof HTMLElement&&t instanceof HTMLElement&&e.tagName===t.tagName&&!e[$e]&&!e[Ue]&&!e[We]&&!t[$e]&&!t[Ue]&&!t[We]}function no(e,t){let n=new Set;for(let o of Array.from(t.attributes))n.add(o.name),e.getAttribute(o.name)!==o.value&&e.setAttribute(o.name,o.value);for(let o of Array.from(e.attributes))n.has(o.name)||e.removeAttribute(o.name);e.replaceChildren(...Array.from(t.childNodes))}function oo(e,t,n,o,r,i,a,c,f){let m=t.length,u=n.length,g=new Array(m);for(let s=0;s<m;s++)g[s]=r(t[s]);let T=new Array(u),h=new Uint8Array(m);for(let s=0;s<u;s++){let l=r(n[s]),y=-1;for(let v=0;v<m;v++)if(!h[v]&&g[v]===l){y=v,h[v]=1;break}T[s]=y}for(let s=0;s<m;s++)if(!h[s])if(f?.onBeforeRemove){let l=o[s];f.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(m===u){let s=!0;for(let l=0;l<u;l++)if(T[l]!==l){s=!1;break}if(s){let l=new Array(u);for(let y=0;y<u;y++){let v=o[y];a(v,n[y]),l[y]=v}return{nodes:l,items:n}}}let S=[],b=[];for(let s=0;s<u;s++)T[s]!==-1&&(S.push(T[s]),b.push(s));let C=Z(S),x=new Uint8Array(u);for(let s of C)x[b[s]]=1;let d=new Array(u),p=c??null;for(let s=u-1;s>=0;s--){let l,y=!1;if(T[s]===-1)l=i(n[s]),y=!0;else if(l=o[T[s]],a(l,n[s]),x[s]){d[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),y&&f?.onInsert?.(l),d[s]=l,p=l}return{nodes:d,items:n}}function U(e,t,n,o,r,i,a,c,f){let m=t.length,u=n.length;if(u===0){for(let s=0;s<m;s++)if(f?.onBeforeRemove){let l=o[s];f.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(m===0){let s=new Array(u);for(let l=0;l<u;l++){let y=i(n[l]);c?e.insertBefore(y,c):e.appendChild(y),f?.onInsert?.(y),s[l]=y}return{nodes:s,items:n}}if(m<eo)return oo(e,t,n,o,r,i,a,c,f);let g=new Map;for(let s=0;s<m;s++)g.set(r(t[s]),s);let T=new Array(u),h=new Uint8Array(m);for(let s=0;s<u;s++){let l=r(n[s]),y=g.get(l);y!==void 0?(T[s]=y,h[y]=1):T[s]=-1}for(let s=0;s<m;s++)if(!h[s])if(f?.onBeforeRemove){let l=o[s];f.onBeforeRemove(l,()=>{l.parentNode&&l.parentNode.removeChild(l)})}else e.removeChild(o[s]);if(m===u){let s=!0;for(let l=0;l<u;l++)if(T[l]!==l){s=!1;break}if(s){let l=new Array(u);for(let y=0;y<u;y++){let v=o[y];a(v,n[y]),l[y]=v}return{nodes:l,items:n}}}let S=[],b=[];for(let s=0;s<u;s++)T[s]!==-1&&(S.push(T[s]),b.push(s));let C=Z(S),x=new Uint8Array(u);for(let s of C)x[b[s]]=1;let d=new Array(u),p=c??null;for(let s=u-1;s>=0;s--){let l,y=!1;if(T[s]===-1)l=i(n[s]),y=!0;else if(l=o[T[s]],a(l,n[s]),x[s]){d[s]=l,p=l;continue}p?e.insertBefore(l,p):e.appendChild(l),y&&f?.onInsert?.(l),d[s]=l,p=l}return{nodes:d,items:n}}function Q(e,t,n,o){if(M)return{type:"list",items:e,keyFn:t,renderFn:n,options:o};let r=document.createComment("forma-list-start"),i=document.createComment("forma-list-end"),a=document.createDocumentFragment();a.appendChild(r),a.appendChild(i);let c=new Map,f=[],m=[],u=o?.updateOnItemChange??"none";return E(()=>{let g=e(),T=r.parentNode;if(!T)return;if(!Array.isArray(g)){_&&console.warn("[forma] createList: value is not an array, treating as empty");for(let x of f)x.parentNode===T&&T.removeChild(x);c=new Map,f=[],m=[];return}let h=g;for(let x=0;x<g.length;x++)if(g[x]==null){h=g.filter(d=>d!=null);break}if(_){let x=new Set;for(let d of h){let p=t(d);x.has(p)&&console.warn("[forma] createList: duplicate key detected:",p),x.add(p)}}let b=U(T,m,h,f,t,x=>{let d=t(x),[p,s]=R(0),l=N(()=>n(x,p));return c.set(d,{element:l,item:x,getIndex:p,setIndex:s}),l},u==="rerender"?(x,d)=>{let p=t(d),s=c.get(p);if(!s||s.item===d||(s.item=d,!(x instanceof HTMLElement))||x[$e]||x[Ue]||x[We])return;let l=N(()=>n(d,s.getIndex));to(x,l)&&(no(x,l),s.element=x)}:(x,d)=>{let p=t(d),s=c.get(p);s&&(s.item=d)},i),C=new Map;for(let x=0;x<h.length;x++){let d=t(h[x]),p=c.get(d);p&&(p.setIndex(x),C.set(d,p))}c=C,f=b.nodes,m=b.items}),a}function ee(e,t,n){if(M){let u=e()?t():n?.()??null;return{type:"show",condition:e,whenTrue:t,whenFalse:n,initialBranch:u}}let o=document.createComment("forma-show"),r=document.createComment("/forma-show"),i=document.createDocumentFragment();i.appendChild(o),i.appendChild(r);let a=null,c=null,f=null,m=E(()=>{let u=!!e(),g=typeof globalThis.__FORMA_DEBUG__<"u",T=g?t.toString().slice(0,60):"";if(u===c){g&&console.log("[forma:show] skip (same)",u,T);return}g&&console.log("[forma:show]",c,"\u2192",u,T),c=u;let h=o.parentNode;if(!h){g&&console.warn("[forma:show] parentNode is null! skipping.",T);return}if(g&&console.log("[forma:show] parent:",h.nodeName,"inDoc:",document.contains(h)),f&&(f(),f=null),a)if(a.parentNode===h)h.removeChild(a);else for(;o.nextSibling&&o.nextSibling!==r;)h.removeChild(o.nextSibling);let S=u?t:n;if(S){let b;a=D(C=>(b=C,N(()=>S()))),f=b}else a=null;a&&h.insertBefore(a,r)});return i.__showDispose=()=>{m(),f&&(f(),f=null)},i}var M=!1;function vn(e){M=e}function z(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="element"}function ge(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="show"}function ze(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="list"}function ro(e,t){if(t)for(let n in t){let o=t[n];if(typeof o!="function")continue;if(n.charCodeAt(0)===111&&n.charCodeAt(1)===110&&n.length>2){e.addEventListener(n.slice(2).toLowerCase(),o);continue}let r=o,i=n;E(()=>{let a=r();a===!1||a==null?e.removeAttribute(i):a===!0?e.setAttribute(i,""):e.setAttribute(i,String(a))})}}function te(e){if(e instanceof Node)return e;if(e==null||e===!1||e===!0)return null;if(typeof e=="string")return new Text(e);if(typeof e=="number")return new Text(String(e));if(z(e))return G(e);if(ge(e)){let t=M;M=!1;try{return ee(e.condition,()=>te(e.whenTrue())??document.createComment("empty"),e.whenFalse?()=>te(e.whenFalse())??document.createComment("empty"):void 0)}finally{M=t}}if(ze(e)){let t=M;M=!1;try{return Q(e.items,e.keyFn,e.renderFn,e.options)}finally{M=t}}return null}function G(e){let t=M;M=!1;try{let n=e.children.map(o=>z(o)?G(o):ge(o)||ze(o)?te(o):o);return oe(e.tag,e.props,...n)}finally{M=t}}function io(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===105}function Ge(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===115}function so(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===116}function ao(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===108}function W(e){let t="/"+e.data,n=e.nextSibling;for(;n;){if(n.nodeType===8&&n.data===t)return n;n=n.nextSibling}return null}function co(e,t){let n=e.nextSibling;for(;n&&n!==t;){if(n.nodeType===3)return n;n=n.nextSibling}return null}function lo(e,t){let n=e.nextSibling;for(;n&&n!==t;){if(n.nodeType===1)return n;n=n.nextSibling}}function fo(e,t){let n=document.createDocumentFragment(),o=e.nextSibling;for(;o&&o!==t;){let r=o.nextSibling;n.appendChild(o),o=r}return n}function wn(e,t){let n=!!e.condition(),o=null,r=null;if(!(t.start.nextSibling!==t.end)&&n){_&&console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");let a=e.whenTrue();a instanceof Node&&t.start.parentNode.insertBefore(a,t.end)}E(()=>{let a=!!e.condition();if(a===n)return;n=a;let c=t.start.parentNode;if(!c)return;let f=fo(t.start,t.end);a?r=f:o=f;let m=a?o??e.whenTrue():e.whenFalse?r??e.whenFalse():null;a&&o&&(o=null),!a&&r&&(r=null),m!=null&&!(m instanceof Node)&&(m=te(m)),m instanceof Node&&c.insertBefore(m,t.end)})}function bn(e,t,n){if(z(e)){let o=lo(t,n);o&&ne(e,o)}else if(ge(e)){let o=t.nextSibling;for(;o&&o!==n;){if(o.nodeType===8&&Ge(o.data)){let r=o,i=W(r);i&&(e.initialBranch&&bn(e.initialBranch,r,i),wn(e,{start:r,end:i,cachedContent:null}));break}o=o.nextSibling}}}function ne(e,t){if(!t||t.tagName!==e.tag.toUpperCase()){_&&console.warn(`Hydration mismatch: expected <${e.tag}>, got <${t?.tagName?.toLowerCase()??"nothing"}>`);let o=G(e);t&&t.replaceWith(o);return}ro(t,e.props);let n=t.firstChild;for(let o of e.children)if(!(o===!1||o==null))if(z(o)){for(;n&&n.nodeType===3&&!n.data.trim();)n=n.nextSibling;for(;n&&n.nodeType===1&&n.hasAttribute("data-forma-island");)n=n.nextSibling;if(!n){t.appendChild(G(o));continue}if(n.nodeType===1){let r=n;n=n.nextSibling,ne(o,r)}else if(n.nodeType===8&&io(n.data)){let r=W(n),i=G(o);r?(r.parentNode.insertBefore(i,r),n=r.nextSibling):(t.appendChild(i),n=null)}else t.appendChild(G(o))}else if(ge(o)){for(;n&&!(n.nodeType===8&&Ge(n.data));)n=n.nextSibling;if(n){let r=n,i=W(r);i&&(o.initialBranch&&bn(o.initialBranch,r,i),wn(o,{start:r,end:i,cachedContent:null}),n=i.nextSibling)}}else if(ze(o)){for(;n&&!(n.nodeType===8&&ao(n.data));)n=n.nextSibling;if(n){let r=n,i=W(r);if(i){let a=new Map,c=[],f=r.nextSibling;for(;f&&f!==i;){if(f.nodeType===1){let s=f;c.push(s);let l=s.getAttribute("data-forma-key");l!=null&&a.set(l,s)}f=f.nextSibling}let m=N(()=>o.items()),u=o.keyFn,g=o.renderFn,T=a.size===0&&c.length>0,h=[],S=[],b=new Set;for(let s=0;s<m.length;s++){let l=m[s],y=u(l),v;if(T?s<c.length&&(v=c[s],b.add(s)):(v=a.get(String(y)),v&&a.delete(String(y))),v)h.push(v),S.push(l);else{_&&console.warn(`[FormaJS] Hydration: list item key "${y}" not found in SSR \u2014 rendering fresh`);let w=M;M=!1;try{let[k]=R(s),A=g(l,k);i.parentNode.insertBefore(A,i),h.push(A),S.push(l)}finally{M=w}}}if(T)for(let s=0;s<c.length;s++)!b.has(s)&&c[s].parentNode&&c[s].parentNode.removeChild(c[s]);else for(let[s,l]of a)_&&console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${s}"`),l.parentNode&&l.parentNode.removeChild(l);let C=r.parentNode;for(let s of h)C.insertBefore(s,i);let x=new Map;for(let s=0;s<S.length;s++){let l=S[s],y=u(l),[v,w]=R(s);x.set(y,{element:h[s],item:l,getIndex:v,setIndex:w})}let d=h.slice(),p=S.slice();E(()=>{let s=o.items(),l=r.parentNode;if(!l)return;let y=U(l,p,s,d,u,w=>{let k=M;M=!1;try{let A=u(w),[P,be]=R(0),ce=N(()=>g(w,P));return x.set(A,{element:ce,item:w,getIndex:P,setIndex:be}),ce}finally{M=k}},(w,k)=>{let A=u(k),P=x.get(A);P&&(P.item=k)},i),v=new Map;for(let w=0;w<s.length;w++){let k=u(s[w]),A=x.get(k);A&&(A.setIndex(w),v.set(k,A))}x=v,d=y.nodes,p=y.items}),n=i.nextSibling}}}else if(typeof o=="function"){for(;n&&n.nodeType===3&&!n.data.trim();)n=n.nextSibling;if(n&&n.nodeType===1){let r=o();if(z(r)){let i=n;n=n.nextSibling,ne(r,i);continue}}if(n&&n.nodeType===8){let r=n.data;if(so(r)){let i=W(n),a=n.nextSibling;if(!a||a.nodeType!==3){_&&console.warn(`[FormaJS] Hydration: created text node for marker ${r} \u2014 SSR walker should emit content between markers`);let c=document.createTextNode("");n.parentNode.insertBefore(c,i||n.nextSibling),a=c}E(()=>{a.data=String(o())}),n=i?i.nextSibling:a.nextSibling}else if(Ge(r)){let i=n,a=W(i);if(a){let c=co(i,a);c||(_&&console.warn(`[FormaJS] Hydration: created text node for show marker ${i.data} \u2014 SSR walker should emit content between markers`),c=document.createTextNode(""),i.parentNode.insertBefore(c,a)),E(()=>{c.data=String(o())}),n=a.nextSibling}else n=n.nextSibling}else n=n.nextSibling}else if(n&&n.nodeType===3){let r=n;n=n.nextSibling,E(()=>{r.data=String(o())})}else{_&&console.warn(`[FormaJS] Hydration: created text node in empty <${t.tagName.toLowerCase()}> \u2014 IR may not cover this component`);let r=document.createTextNode("");t.appendChild(r),E(()=>{r.data=String(o())})}}else(typeof o=="string"||typeof o=="number")&&n&&n.nodeType===3&&(n=n.nextSibling)}function K(e,t){if(!(t.childElementCount>0||t.childNodes.length>0&&Array.from(t.childNodes).some(r=>r.nodeType===1||r.nodeType===3&&r.data.trim()))){if(_){let i=t.getAttribute("data-forma-component")||"unknown";console.warn(`[forma] Island "${i}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`)}let r=e();if(r instanceof Element){for(let i of Array.from(t.attributes))i.name.startsWith("data-forma-")&&r.setAttribute(i.name,i.value);return t.replaceWith(r),r}else r instanceof Node&&t.appendChild(r);return t}vn(!0);let o;try{o=e()}finally{vn(!1)}return!o||!z(o)?(t.removeAttribute("data-forma-ssr"),t):(t.hasAttribute("data-forma-island")?ne(o,t):ne(o,t.children[0]),t.removeAttribute("data-forma-ssr"),t)}var he=Symbol.for("forma.fragment"),uo="http://www.w3.org/2000/svg",re="http://www.w3.org/1999/xlink",po=new Set(["svg","path","circle","rect","line","polyline","polygon","ellipse","g","text","tspan","textPath","defs","use","symbol","clipPath","mask","pattern","marker","linearGradient","radialGradient","stop","filter","feGaussianBlur","feColorMatrix","feOffset","feBlend","feMerge","feMergeNode","feComposite","feFlood","feMorphology","feTurbulence","feDisplacementMap","feImage","foreignObject","animate","animateTransform","animateMotion","set","image","switch","desc","title","metadata"]),En=new Set(["disabled","checked","readonly","required","autofocus","autoplay","controls","default","defer","formnovalidate","hidden","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","reversed","selected","async"]),B=null;function mo(e){if(!B){B=Object.create(null);for(let t of["div","span","p","a","li","ul","ol","button","input","label","h1","h2","h3","h4","h5","h6","section","header","footer","main","nav","table","tr","td","th","tbody","img","form","select","option","textarea","i","b","strong","em","small","article","aside","details","summary"])B[t]=document.createElement(t)}return B[e]??(B[e]=document.createElement(e))}var Cn=Object.create(null);function go(e){return Cn[e]??(Cn[e]=e.slice(2).toLowerCase())}var ye=Symbol.for("forma-abort");function yo(e){let t=e[ye];return t||(t=new AbortController,e[ye]=t),t}function qe(e){let t=e[ye];t&&(t.abort(),delete e[ye])}var Je=Symbol.for("forma-attr-cache"),ho=Symbol.for("forma-dynamic-child");function O(e){return e[Je]??(e[Je]=Object.create(null))}function Ye(e,t,n){if(typeof n=="function")E(()=>{let o=n(),r=O(e);r.class!==o&&(r.class=o,e instanceof HTMLElement?e.className=o:e.setAttribute("class",o))});else{let o=O(e);if(o.class===n)return;o.class=n,e instanceof HTMLElement?e.className=n:e.setAttribute("class",n)}}function To(e,t,n){if(typeof n=="function"){let o=[];E(()=>{let r=n();if(typeof r=="string"){let i=O(e);if(i.style===r)return;i.style=r,o=[],e.style.cssText=r}else if(r&&typeof r=="object"){let i=e.style,a=Object.keys(r);for(let c of o)c in r||i.removeProperty(c.replace(/[A-Z]/g,f=>"-"+f.toLowerCase()));Object.assign(i,r),o=a}})}else if(typeof n=="string"){let o=O(e);if(o.style===n)return;o.style=n,e.style.cssText=n}else n&&typeof n=="object"&&Object.assign(e.style,n)}function Rn(e,t,n){let o=yo(e);e.addEventListener(go(t),n,{signal:o.signal})}function So(e,t,n){if(typeof n=="function")E(()=>{let o=n();if(o==null){e.innerHTML="";return}if(typeof o!="object"||!("__html"in o))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof o);let r=o.__html;if(typeof r!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof r);let i=O(e);i.innerHTML!==r&&(i.innerHTML=r,e.innerHTML=r)});else{if(n==null){e.innerHTML="";return}if(typeof n!="object"||!("__html"in n))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof n);let o=n.__html;if(typeof o!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof o);e.innerHTML=o}}function xo(e,t,n){let o=t.slice(6);typeof n=="function"?E(()=>{let r=n();r==null||r===!1?e.removeAttributeNS(re,o):e.setAttributeNS(re,t,String(r))}):n==null||n===!1?e.removeAttributeNS(re,o):e.setAttributeNS(re,t,String(n))}function vo(e,t,n){if(typeof n=="function")E(()=>{let o=n(),r=O(e);r[t]!==o&&(r[t]=o,o?e.setAttribute(t,""):e.removeAttribute(t))});else{let o=O(e);if(o[t]===n)return;o[t]=n,n?e.setAttribute(t,""):e.removeAttribute(t)}}function wo(e,t,n){if(typeof n=="function")E(()=>{let o=n();if(o==null||o===!1){let r=O(e);if(r[t]===null)return;r[t]=null,e.removeAttribute(t)}else{let r=String(o),i=O(e);if(i[t]===r)return;i[t]=r,e.setAttribute(t,r)}});else if(n==null||n===!1){let o=O(e);if(o[t]===null)return;o[t]=null,e.removeAttribute(t)}else{let o=String(n),r=O(e);if(r[t]===o)return;r[t]=o,e.setAttribute(t,o)}}var j=new Map;j.set("class",Ye);j.set("className",Ye);j.set("style",To);j.set("ref",()=>{});j.set("dangerouslySetInnerHTML",So);for(let e of En)j.set(e,vo);function bo(e,t,n){if(t==="class"){Ye(e,t,n);return}if(t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.length>2){Rn(e,t,n);return}let o=j.get(t);if(o){o(e,t,n);return}if(t.charCodeAt(0)===120&&t.startsWith("xlink:")){xo(e,t,n);return}wo(e,t,n)}function Co(e,t,n){if(!(n==null||n===!1)){if(t==="class"||t==="className"){e.className=n;return}if(t==="style"){typeof n=="string"?e.style.cssText=n:n&&typeof n=="object"&&Object.assign(e.style,n);return}if(t==="dangerouslySetInnerHTML"){if(typeof n!="object"||!("__html"in n))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof n);let o=n.__html;if(typeof o!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof o);e.innerHTML=o;return}if(t.charCodeAt(0)===120&&t.startsWith("xlink:")){e.setAttributeNS(re,t,String(n));return}if(En.has(t)){n&&e.setAttribute(t,"");return}n===!0?e.setAttribute(t,""):e.setAttribute(t,String(n))}}function ie(e,t){if(t instanceof Node){e.appendChild(t);return}if(typeof t=="string"){e.appendChild(new Text(t));return}if(!(t==null||t===!1||t===!0)){if(typeof t=="number"){e.appendChild(new Text(String(t)));return}if(typeof t=="function"){e instanceof Element&&(e[ho]=!0);let n=null;E(()=>{let o=t();if(o instanceof Node)n?e.replaceChild(o,n):e.appendChild(o),n=o;else{let r=String(typeof o=="symbol"?o:o??"");if(!n)n=new Text(r),e.appendChild(n);else if(n.nodeType===3)n.data=r;else{let i=new Text(r);e.replaceChild(i,n),n=i}}});return}if(Array.isArray(t)){for(let n of t)ie(e,n);return}}}function oe(e,t,...n){if(e===he){let a=document.createDocumentFragment();for(let c of n)ie(a,c);return a}let o=e;if(M)return{type:"element",tag:o,props:t??null,children:n};let r;if(B&&B[o]?r=B[o].cloneNode(!1):po.has(o)?r=document.createElementNS(uo,o):r=mo(o).cloneNode(!1),t){let a=!1;for(let c in t){if(c==="ref")continue;let f=t[c];if(c.charCodeAt(0)===111&&c.charCodeAt(1)===110&&c.length>2){Rn(r,c,f);continue}if(typeof f=="function"){a||(r[Je]=Object.create(null),a=!0),bo(r,c,f);continue}Co(r,c,f)}}let i=n.length;if(i===1){let a=n[0];typeof a=="string"?r.textContent=a:typeof a=="number"?r.textContent=String(a):ie(r,a)}else if(i>1)for(let a of n)ie(r,a);return t&&typeof t.ref=="function"&&t.ref(r),r}function Xe(...e){let t=document.createDocumentFragment();for(let n of e)ie(t,n);return t}function Ze(e){if(typeof e=="function"){let t=new Text("");return E(()=>{t.data=e()}),t}return new Text(e)}function Qe(e,t){let n=typeof t=="string"?document.querySelector(t):t;if(!n)throw new Error(`mount: container not found \u2014 "${t}"`);let o;if(n.hasAttribute("data-forma-ssr"))D(i=>{o=i,K(e,n)});else{let i=D(a=>(o=a,e()));n.innerHTML="",n.appendChild(i)}let r=!1;return()=>{r||(r=!0,o(),n.innerHTML="")}}function et(e,t,n){let o=document.createComment("forma-switch"),r=document.createComment("/forma-switch"),i=document.createDocumentFragment();i.appendChild(o),i.appendChild(r);let a=new Map,c=null,f=Eo,m=E(()=>{let u=e();if(u===f)return;let g=typeof globalThis.__FORMA_DEBUG__<"u";g&&console.log("[forma:switch] transition",String(f),"\u2192",String(u)),f=u;let T=o.parentNode;if(!T){g&&console.warn("[forma:switch] markers not in DOM yet, skipping");return}if(c)if(c.parentNode===T)g&&console.log("[forma:switch] removing single node"),T.removeChild(c);else if(c.nodeType===11){g&&console.log("[forma:switch] scooping nodes back into fragment");let S=0;for(;o.nextSibling&&o.nextSibling!==r;)c.appendChild(o.nextSibling),S++;g&&console.log("[forma:switch] scooped",S,"nodes back into fragment")}else for(g&&console.log("[forma:switch] clearing detached node between markers");o.nextSibling&&o.nextSibling!==r;)T.removeChild(o.nextSibling);let h=t.find(S=>S.match===u);if(h){let S=a.get(u);if(S)g&&console.log("[forma:switch] reusing cached branch for",String(u),"\u2192",S.node.nodeName,"type",S.node.nodeType,"childNodes",S.node.childNodes?.length);else{let b,C=D(x=>(b=x,N(()=>h.render())));S={node:C,dispose:b},a.set(u,S),g&&console.log("[forma:switch] rendered new branch for",String(u),"\u2192",C.nodeName,"type",C.nodeType)}c=S.node}else c=n?.()??null,g&&console.log("[forma:switch] no match, using fallback");c&&(T.insertBefore(c,r),g&&console.log("[forma:switch] inserted",c.nodeName,"before end marker"))});return i.__switchDispose=()=>{m();for(let u of a.values())u.dispose();a.clear()},i}var Eo=Symbol("unset");function tt(e,t){let n=document.createComment("forma-portal"),o=typeof t=="string"?document.querySelector(t):t??document.body;if(!o)throw new Error(`createPortal: target not found: ${t}`);let r=null,i=()=>{r&&r.parentNode===o&&o.removeChild(r),r=null};return Y(()=>{let a=e();return i(),r=a,o.appendChild(a),()=>{i()}}),n}function nt(e,t){let n=document.createComment("forma-error-boundary"),o=document.createComment("/forma-error-boundary"),r=document.createDocumentFragment();r.appendChild(n),r.appendChild(o);let[i,a]=R(0),c=null;return E(()=>{i();let f=n.parentNode;if(f){c&&c.parentNode===f&&f.removeChild(c);try{c=e()}catch(m){let u=m instanceof Error?m:new Error(String(m));c=t(u,()=>a(T=>T+1))}c&&f.insertBefore(c,o)}}),r}function ot(e,t){let n=document.createComment("forma-suspense"),o=document.createComment("/forma-suspense"),r=document.createDocumentFragment();r.appendChild(n),r.appendChild(o);let[i,a]=R(0),c=null,f=null,m=null;Tn({increment(){a(g=>g+1)},decrement(){a(g=>Math.max(0,g-1))}});try{f=t()}finally{Sn()}return E(()=>{let g=n.parentNode;if(!g)return;let h=i()>0?m??=e():f;h!==c&&(c&&c.parentNode===g&&g.removeChild(c),h&&g.insertBefore(h,o),c=h)}),r}function Ro(e,t,n){let o=e.getAttribute("data-forma-props");return o?JSON.parse(o):n&&String(t)in n?n[String(t)]:null}function rt(e){let t=document.getElementById("__forma_islands"),n=t?JSON.parse(t.textContent):null,o=document.querySelectorAll("[data-forma-island]");for(let r of o){let i=parseInt(r.getAttribute("data-forma-island"),10),a=r.getAttribute("data-forma-component"),c=e[a];if(!c){_&&console.warn(`[forma] No hydrate function for island "${a}" (id=${i})`),r.setAttribute("data-forma-status","error");continue}let f=r.getAttribute("data-forma-hydrate")||"load";if((f==="interaction"||f==="idle")&&_&&console.warn(`[forma] Trigger "${f}" not yet implemented for island "${a}" (id=${i}), falling back to load`),f==="visible"){let m=new IntersectionObserver(u=>{for(let g of u)g.isIntersecting&&(m.disconnect(),kn(r,i,a,c,n))},{rootMargin:"200px"});m.observe(r)}else kn(r,i,a,c,n)}}function kn(e,t,n,o,r){try{let i=Ro(e,t,r);e.setAttribute("data-forma-status","hydrating");let a=e;D(c=>{a=K(()=>o(i),e),a.__formaDispose=c}),a.setAttribute("data-forma-status","active")}catch(i){_&&console.error(`[forma] Island "${n}" (id=${t}) failed:`,i),e.setAttribute("data-forma-status","error")}}var F=null,Mn=[];function ko(e){Mn.push(F),F=e}function Mo(){F=Mn.pop()??null}function it(e){if(F===null)throw new Error("onMount() must be called inside a component setup function");F.mountCallbacks.push(e)}function st(e){if(F===null)throw new Error("onUnmount() must be called inside a component setup function");F.unmountCallbacks.push(e)}var Te=Symbol("forma:component:dispose");function at(e){let t=typeof e=="function"?e:e.setup,n=typeof e=="function"?void 0:e.name;return function(){let r={disposers:[],mountCallbacks:[],unmountCallbacks:[]};ko(r);let i;try{i=t()}finally{Mo()}let a=()=>{for(let c of r.unmountCallbacks)try{c()}catch{}for(let c of r.disposers)try{c()}catch{}r.disposers.length=0,r.mountCallbacks.length=0,r.unmountCallbacks.length=0};i[Te]=a;for(let c of r.mountCallbacks)try{let f=c();typeof f=="function"&&r.unmountCallbacks.push(f)}catch{}return i}}function ct(e){let t=e;typeof t[Te]=="function"&&(t[Te](),delete t[Te])}function lt(e){F!==null&&F.disposers.push(e)}var se=new Map;function ft(e){return{id:Symbol("forma:context"),defaultValue:e}}function ut(e,t){let n=se.get(e.id);n===void 0&&(n=[],se.set(e.id,n)),n.push(t)}function dt(e){let t=se.get(e.id);return t===void 0||t.length===0?e.defaultValue:t[t.length-1]}function pt(e){let t=se.get(e.id);t!==void 0&&t.length>0&&(t.pop(),t.length===0&&se.delete(e.id))}var ae=Symbol("forma-raw"),Nn=Symbol("forma-proxy"),Ao=new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]);function An(e){return!(e==null||typeof e!="object"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof WeakMap||e instanceof WeakSet||e instanceof Error||e instanceof Promise||e[Nn])}function mt(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(mt);if(e instanceof Date)return new Date(e.getTime());let t={};for(let n of Object.keys(e))t[n]=mt(e[n]);return t}function gt(e){let t=new Map,n=new Map;function o(g){let T=g.lastIndexOf(".");if(T===-1)return;let h=g.substring(0,T),S=n.get(h);S||(S=new Set,n.set(h,S)),S.add(g)}function r(g,T){let h=t.get(g);return h||(h=R(T),t.set(g,h),o(g)),h}let i=new WeakMap;function a(g){let T=n.get(g);if(T){for(let h of T)a(h),t.delete(h),n.delete(h);T.clear()}}function c(g,T){if(!An(g))return g;let h=i.get(g);if(h)return h;let S=Array.isArray(g),b=T?T+".":"",C="",x,d=new Proxy(g,{get(p,s,l){if(s===ae)return p;if(s===Nn)return!0;if(typeof s=="symbol")return Reflect.get(p,s,l);let y=String(s),v=b+y;if(S&&Ao.has(y))return(...A)=>{let P;return H(()=>{let be=A.map(J=>J!=null&&typeof J=="object"&&J[ae]?J[ae]:J);P=p[y].apply(p,be),a(T);let[,ce]=r(b+"length",p.length);ce(p.length)}),P};if(S&&y==="length"){let[A]=r(v,p.length);return A(),p.length}let w=Reflect.get(p,s),k;return y===C&&x?k=x:(k=r(v,w),C=y,x=k),k[0](),An(w)?c(w,v):w},set(p,s,l){if(typeof s=="symbol")return Reflect.set(p,s,l);let y=String(s),v=b+y,w=l!=null&&typeof l=="object"&&l[ae]?l[ae]:l;if(Reflect.set(p,s,w),w!=null&&typeof w=="object"&&a(v),S&&y!=="length"){let A=b+"length",P=t.get(A);P&&P[1](p.length)}let[,k]=r(v,w);return k(w),!0},has(p,s){if(typeof s=="symbol")return Reflect.has(p,s);let l=String(s),y=b+l,[v]=r(y,Reflect.get(p,s));return v(),Reflect.has(p,s)},ownKeys(p){return Reflect.ownKeys(p)},getOwnPropertyDescriptor(p,s){return Object.getOwnPropertyDescriptor(p,s)},deleteProperty(p,s){if(typeof s=="symbol")return Reflect.deleteProperty(p,s);let l=String(s),y=b+l,v=Reflect.deleteProperty(p,s);a(y),t.delete(y);let w=T;if(w!==void 0){let k=n.get(w);k&&(k.delete(y),k.size===0&&n.delete(w))}return n.delete(y),v}});return i.set(g,d),d}let f=c(e,"");function m(){return N(()=>mt(e))}return[f,g=>{let T=typeof g=="function"?g(m()):g;H(()=>{for(let h of Object.keys(T))f[h]=T[h]})}]}function yt(e,t){let[n,o]=e,r=t?.maxLength??100,i=[n()],a=0,[c,f]=I([...i]),[m,u]=I(a),[g,T]=I(i.length);function h(){H(()=>{f([...i]),u(a),T(i.length)})}let S=!1,b=!0;return E(()=>{let l=n();if(b){b=!1;return}if(S){S=!1;return}i=i.slice(0,a+1),i.push(l),i.length>r&&i.splice(0,i.length-r),a=i.length-1,h()}),{undo:()=>{a<=0||(a--,S=!0,o(i[a]),h())},redo:()=>{a>=i.length-1||(a++,S=!0,o(i[a]),h())},canUndo:()=>m()>0,canRedo:()=>m()<g()-1,history:()=>c(),cursor:()=>m(),clear:()=>{i=[n()],a=0,h()}}}function ht(e,t,n){let[o,r]=e,i=n?.storage??globalThis.localStorage,a=n?.serialize??JSON.stringify,c=n?.deserialize??JSON.parse,f=n?.validate;try{let m=i.getItem(t);if(m!==null){let u=c(m);(!f||f(u))&&r(u)}}catch{}E(()=>{let m=o();try{let u=a(m);i.setItem(t,u)}catch{}})}function Tt(){let e=new Map;function t(c){let f=e.get(c);return f||(f=new Set,e.set(c,f)),f}function n(c,f){let m=t(c);return m.add(f),()=>{m.delete(f)}}function o(c,f){let m=u=>{i(c,m),f(u)};return n(c,m)}function r(c,f){let m=e.get(c);if(m)for(let u of[...m])try{u(f)}catch(g){console.error(`[forma] Bus handler error on "${String(c)}":`,g)}}function i(c,f){let m=e.get(c);m&&m.delete(f)}function a(){e.clear()}return{on:n,once:o,emit:r,off:i,clear:a}}function St(e,t,n,o,r){let i=a=>{let c=a.target;if(!(c instanceof HTMLElement))return;let f=e instanceof Document?e.documentElement:e,m=c.closest(t);m instanceof HTMLElement&&f.contains(m)&&o(a,m)};return e.addEventListener(n,i,r),()=>{e.removeEventListener(n,i,r)}}function No(e){let t=e.toLowerCase().split("+").map(o=>o.trim()),n={ctrl:!1,shift:!1,alt:!1,meta:!1,key:""};for(let o of t)switch(o){case"ctrl":case"control":n.ctrl=!0;break;case"shift":n.shift=!0;break;case"alt":n.alt=!0;break;case"meta":case"cmd":case"command":n.meta=!0;break;default:n.key=o}return n}function Lo(e,t){return e.ctrlKey!==t.ctrl||e.shiftKey!==t.shift||e.altKey!==t.alt||e.metaKey!==t.meta?!1:e.key.toLowerCase()===t.key}function xt(e,t,n){let o=n?.target??document,r=n?.preventDefault??!0,i=No(e),a=c=>{c instanceof KeyboardEvent&&Lo(c,i)&&(r&&c.preventDefault(),t(c))};return o.addEventListener("keydown",a),()=>{o.removeEventListener("keydown",a)}}function vt(e,t){return(t??document).querySelector(e)}function wt(e,t){return Array.from((t??document).querySelectorAll(e))}function bt(e,...t){e.classList.add(...t)}function Ct(e,...t){e.classList.remove(...t)}function Et(e,t,n){return e.classList.toggle(t,n)}function Rt(e,t){for(let[n,o]of Object.entries(t))o!==void 0&&(e.style[n]=o)}function kt(e,t){for(let[n,o]of Object.entries(t))o===!1||o===null?e.removeAttribute(n):o===!0?e.setAttribute(n,""):e.setAttribute(n,o)}function Mt(e,t){e.textContent=t}function At(e,t){e.innerHTML=t}function Nt(e,t){e.innerHTML=t}function Lt(e,t){return e.closest(t)}function _t(e,t){let n=Array.from(e.children);return t?n.filter(o=>o.matches(t)):n}function Dt(e,t){let n=e.parentElement;if(!n)return[];let r=Array.from(n.children).filter(i=>i!==e);return t?r.filter(i=>i.matches(t)):r}function Ht(e){return e.parentElement}function Pt(e,t){let n=e.nextElementSibling;for(;n;){if(n instanceof HTMLElement&&(!t||n.matches(t)))return n;n=n.nextElementSibling}return null}function It(e,t){let n=e.previousElementSibling;for(;n;){if(n instanceof HTMLElement&&(!t||n.matches(t)))return n;n=n.previousElementSibling}return null}function Ot(e,t){let n=new ResizeObserver(o=>{for(let r of o)t(r)});return n.observe(e),()=>{n.disconnect()}}function Ft(e,t,n){let o=new IntersectionObserver(r=>{for(let i of r)t(i)},n);return o.observe(e),()=>{o.disconnect()}}function Bt(e,t,n){let o=new MutationObserver(r=>{t(r)});return o.observe(e,n??{childList:!0,subtree:!0}),()=>{o.disconnect()}}function Kt(e,t){let n=t?.serialize??JSON.stringify,o=t?.deserialize??JSON.parse,r=t?.validate;return{key:e,get(){try{let i=localStorage.getItem(e);if(i===null)return null;let a=o(i);return r&&!r(a)?null:a}catch{return null}},set(i){try{let a=n(i);localStorage.setItem(e,a)}catch{}},remove(){localStorage.removeItem(e)}}}function jt(e,t){let n=t?.serialize??JSON.stringify,o=t?.deserialize??JSON.parse,r=t?.validate;return{key:e,get(){try{let i=sessionStorage.getItem(e);if(i===null)return null;let a=o(i);return r&&!r(a)?null:a}catch{return null}},set(i){try{let a=n(i);sessionStorage.setItem(e,a)}catch{}},remove(){sessionStorage.removeItem(e)}}}var Vt=new Map;function _o(e,t){let n=`${e}::${t}`,o=Vt.get(n);if(o)return o;let r=new Promise((i,a)=>{let c=indexedDB.open(e);c.onerror=()=>a(c.error),c.onsuccess=()=>{let f=c.result;if(f.objectStoreNames.contains(t)){i(f);return}let m=f.version+1;f.close();let u=indexedDB.open(e,m);u.onerror=()=>a(u.error),u.onupgradeneeded=()=>{let g=u.result;g.objectStoreNames.contains(t)||g.createObjectStore(t)},u.onsuccess=()=>i(u.result)},c.onupgradeneeded=()=>{let f=c.result;f.objectStoreNames.contains(t)||f.createObjectStore(t)}});return Vt.set(n,r),r.catch(()=>{Vt.delete(n)}),r}function $t(e,t="default"){function n(o,r){return _o(e,t).then(i=>new Promise((a,c)=>{let m=i.transaction(t,o).objectStore(t),u=r(m);u.onsuccess=()=>a(u.result),u.onerror=()=>c(u.error)}))}return{get(o){return n("readonly",r=>r.get(o))},set(o,r){return n("readwrite",i=>i.put(r,o)).then(()=>{})},delete(o){return n("readwrite",r=>r.delete(o)).then(()=>{})},getAll(){return n("readonly",o=>o.getAll())},keys(){return n("readonly",o=>o.getAllKeys()).then(o=>o.map(String))},clear(){return n("readwrite",o=>o.clear()).then(()=>{})}}}function Ut(e,t){let[n,o]=R(null),[r,i]=R(null),[a,c]=R(!1),f=null;function m(){let g=typeof e=="function"?e():e,T=t?.base??"",h=new URL(g,T||void 0);if(t?.params)for(let[S,b]of Object.entries(t.params))h.searchParams.set(S,b);return h.toString()}async function u(){f&&f.abort(),f=new AbortController;let g=f,T=t?.timeout??3e4,h=setTimeout(()=>g.abort(),T);c(!0),i(null);try{let S=m(),{base:b,params:C,timeout:x,transform:d,...p}=t??{},s=await fetch(S,{...p,signal:g.signal});if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);let l=await s.json(),y=d?d(l):l;o(y)}catch(S){if(S instanceof Error&&S.name==="AbortError")return;i(S instanceof Error?S:new Error(String(S)))}finally{clearTimeout(h),f===g&&(f=null,c(!1))}}return typeof e=="function"?E(()=>{e(),u()}):u(),{data:n,error:r,loading:a,refetch:u,abort(){f&&f.abort()}}}async function Wt(e,t){let n=await fetch(e,t);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);return await n.json()}function Gt(e,t){let[n,o]=R(null),[r,i]=R(null),[a,c]=R(!1),f=new EventSource(e,{withCredentials:t?.withCredentials??!1});f.onopen=()=>{c(!0),i(null)};let m=t?.parse??(u=>{try{return JSON.parse(u)}catch{return u}});return f.onmessage=u=>{o(m(u.data))},f.onerror=u=>{i(u),c(!1)},{data:n,error:r,connected:a,close(){f.close(),c(!1)},on(u,g){let T=t?.parse??(S=>{try{return JSON.parse(S)}catch{return S}}),h=S=>{g(T(S.data))};return f.addEventListener(u,h),()=>{f.removeEventListener(u,h)}}}}function zt(e,t){let n=t?.reconnect??!0,o=t?.reconnectInterval??1e3,r=t?.maxReconnects??5,[i,a]=R(null),[c,f]=R("connecting"),m=new Set,u=null,g=0,T=null,h=!1;function S(){if(h)return;f("connecting"),u=new WebSocket(e,t?.protocols),u.onopen=()=>{f("open"),g=0};let b=t?.parse??(C=>{try{return JSON.parse(C)}catch{return C}});u.onmessage=C=>{let x=b(C.data);a(x);for(let d of m)d(x)},u.onerror=()=>{f("error")},u.onclose=()=>{if(h){f("closed");return}if(f("closed"),n&&g<r){let C=o*Math.pow(2,g);g++,T=setTimeout(S,C)}}}return S(),{data:i,status:c,send(b){u&&u.readyState===WebSocket.OPEN&&u.send(JSON.stringify(b))},close(){h=!0,T!==null&&(clearTimeout(T),T=null),u&&(u.close(),u=null),f("closed")},on(b){return m.add(b),()=>{m.delete(b)}}}}function Jt(e,t){let[n,o]=I(!1),[r,i]=I(void 0),c=async(...f)=>{if(o(!0),i(void 0),t?.optimistic)try{H(()=>t.optimistic(...f))}catch{}try{let m=await e(...f);if(t?.onSuccess&&H(()=>t.onSuccess(m,...f)),t?.invalidates)for(let u of t.invalidates)u.refetch();return o(!1),m}catch(m){if(t?.onError)try{H(()=>t.onError(m,...f))}catch{}throw i(m),o(!1),m}};return c.pending=n,c.error=r,c.clearError=()=>i(void 0),c}var qt=new Map;function Yt(e,t){qt.set(e,t)}function Xt(e){qt.delete(e)}function Se(e){for(let[t,n]of Object.entries(e)){let o=qt.get(t);o&&o.mutate(n)}}function Zt(){if(typeof window>"u")return()=>{};let e=t=>{let n=t.detail;n&&typeof n=="object"&&Se(n)};return window.addEventListener("forma:revalidate",e),()=>window.removeEventListener("forma:revalidate",e)}function Qt(e,t){return{data:e,__revalidate:t}}function en(e){return async(...n)=>{let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Forma-RPC":"1"},body:JSON.stringify({args:n})});if(!o.ok){let i=await o.text();throw new Error(`Server function failed (${o.status}): ${i}`)}let r=await o.json();return r&&typeof r=="object"&&"__revalidate"in r?(typeof window<"u"&&window.dispatchEvent(new CustomEvent("forma:revalidate",{detail:r.__revalidate})),r.data):r}}var xe=new Map;function tn(e,t){xe.set(e,t)}function nn(e){return xe.get(e)}function on(){return[...xe.keys()]}var Do=new Set(["__proto__","constructor","prototype"]);async function ve(e,t,n){let o=e.split("/").pop()??"";if(Do.has(o))return{error:"Forbidden endpoint name"};let r=xe.get(e);if(!r)return{error:`Unknown server function: ${e}`};try{let i=await r(...t.args);return n?{data:i,__revalidate:n}:{data:i}}catch(i){return{error:typeof process<"u"&&process.env?.NODE_ENV==="development"&&i instanceof Error?i.message:"Internal server error"}}}function rn(){return async(e,t)=>{if(e.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}let n=e.body;if(!n||!Array.isArray(n.args)){t.status(400).json({error:"Invalid RPC request: missing args array"});return}let o=await ve(e.url,n);o.error?t.status(500).json(o):t.json(o)}}var we=null,Ln=new Map;async function _n(){if(we)return we;let e=window.__FORMA_WASM__;if(!e)throw new Error("No __FORMA_WASM__ config");let t=await import(e.loader);return await t.default(e.binary),we=t,we}async function Dn(){let e=window.__FORMA_WASM__;if(!e)throw new Error("No __FORMA_WASM__ config");let t=Ln.get(e.ir);if(t)return t;let n=await fetch(e.ir),o=new Uint8Array(await n.arrayBuffer());return Ln.set(e.ir,o),o}async function Hn(e){let[t,n]=await Promise.all([_n(),Dn()]);return t.render(n,e)}async function Pn(e,t){let[n,o]=await Promise.all([_n(),Dn()]);return n.render_island(o,e,t)}return jn(Ho);})();
"use strict";var FormaJS=(()=>{var Ce=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var Bn=Object.getOwnPropertyNames;var Kn=Object.prototype.hasOwnProperty;var jn=(e,t)=>{for(var n in t)Ce(e,n,{get:t[n],enumerable:!0})},Un=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Bn(t))!Kn.call(e,r)&&r!==n&&Ce(e,r,{get:()=>t[r],enumerable:!(o=Fn(t,r))||o.enumerable});return e};var Vn=e=>Un(Ce({},"__esModule",{value:!0}),e);var Io={};jn(Io,{$:()=>bt,$$:()=>Ct,$$serverFunction:()=>nn,Fragment:()=>re,activateIslands:()=>it,addClass:()=>Et,applyRevalidation:()=>Se,batch:()=>H,children:()=>Ht,cleanup:()=>Ye,closest:()=>Dt,createAction:()=>Yt,createBus:()=>xt,createComputed:()=>Y,createContext:()=>dt,createEffect:()=>J,createErrorBoundary:()=>ot,createFetch:()=>Gt,createHistory:()=>Tt,createIndexedDB:()=>Wt,createList:()=>X,createLocalStorage:()=>Ut,createMemo:()=>Fe,createPortal:()=>nt,createRPCMiddleware:()=>an,createReducer:()=>je,createRef:()=>Ke,createResource:()=>Ue,createRoot:()=>D,createSSE:()=>qt,createSessionStorage:()=>Vt,createShow:()=>Z,createSignal:()=>E,createStore:()=>ht,createSuspense:()=>rt,createSwitch:()=>tt,createText:()=>Qe,createWebSocket:()=>Jt,deactivateAllIslands:()=>st,deactivateIsland:()=>he,defineComponent:()=>lt,delegate:()=>vt,disposeComponent:()=>ft,enableAutoRevalidation:()=>en,fetchJSON:()=>zt,fragment:()=>Ze,getRegisteredEndpoints:()=>sn,getServerFunction:()=>rn,h:()=>te,handleRPC:()=>ve,hydrateIsland:()=>K,inject:()=>mt,mount:()=>et,nextSibling:()=>Ot,on:()=>Be,onCleanup:()=>_e,onError:()=>Pe,onIntersect:()=>Kt,onKey:()=>wt,onMount:()=>at,onMutation:()=>jt,onResize:()=>Bt,onUnmount:()=>ct,parent:()=>It,persist:()=>St,prevSibling:()=>Ft,provide:()=>pt,reconcileList:()=>V,registerResource:()=>Zt,registerServerFunction:()=>on,removeClass:()=>Rt,renderIsland:()=>On,renderLocal:()=>In,setAttr:()=>At,setHTML:()=>Nt,setHTMLUnsafe:()=>_t,setStyle:()=>Mt,setText:()=>Lt,siblings:()=>Pt,toggleClass:()=>kt,trackDisposer:()=>ut,unprovide:()=>gt,unregisterResource:()=>Qt,untrack:()=>L,withRevalidation:()=>tn});var $n=(e=>(e[e.Computed=1]="Computed",e[e.Effect=2]="Effect",e[e.Tracking=4]="Tracking",e[e.Notified=8]="Notified",e[e.Recursed=16]="Recursed",e[e.Dirty=32]="Dirty",e[e.PendingComputed=64]="PendingComputed",e[e.PendingEffect=128]="PendingEffect",e[e.Propagated=224]="Propagated",e))($n||{});function Wn({updateComputed:e,notifyEffect:t}){let n=[],o=0,r=0;return{link:i,propagate:a,updateDirtyFlag:m,startTracking:c,endTracking:l,processEffectNotifications:T,processComputedUpdate:u,processPendingInnerEffects:g};function i(d,p){let s=p.depsTail;if(s!==void 0&&s.dep===d)return;let f=s!==void 0?s.nextDep:p.deps;if(f!==void 0&&f.dep===d){p.depsTail=f;return}let y=d.subsTail;if(!(y!==void 0&&y.sub===p&&C(y,p)))return h(d,p,f,s)}function a(d){let p=d.nextSub,s,f=0,y=32;e:do{let v=d.sub,w=v.flags,k=!1;if(w&244?w&16&&!(w&4)?(v.flags=w&-17|y|8,k=!0):!(w&224)&&C(d,v)&&(v.flags=w|16|y|8,k=v.subs!==void 0):(v.flags=w|y|8,k=!0),k){let A=v.subs;if(A!==void 0){d=A,A.nextSub!==void 0?(s={target:p,linked:s},++f,p=d.nextSub,y=64):y=w&2?128:64;continue}w&2&&(n[r++]=v)}else w&(4|y)?!(w&y)&&w&224&&C(d,v)&&(v.flags=w|y):(v.flags=w|y|8,(w&10)===2&&(n[r++]=v));if((d=p)!==void 0){p=d.nextSub,y=f?64:32;continue}for(;f--;)if(d=s.target,s=s.linked,d!==void 0){p=d.nextSub,y=f?64:32;continue e}break}while(!0)}function c(d){d.depsTail=void 0,d.flags=d.flags&-249|4}function l(d){let p=d.depsTail;if(p!==void 0){let s=p.nextDep;s!==void 0&&(x(s),p.nextDep=void 0)}else d.deps!==void 0&&(x(d.deps),d.deps=void 0);d.flags&=-5}function m(d,p){return S(d.deps)?(d.flags=p|32,!0):(d.flags=p&-65,!1)}function u(d,p){if(p&32||S(d.deps)){if(e(d)){let s=d.subs;s!==void 0&&b(s)}}else d.flags=p&-65}function g(d,p){if(p&128){d.flags=p&-129;let s=d.deps;do{let f=s.dep;"flags"in f&&f.flags&2&&f.flags&224&&t(f),s=s.nextDep}while(s!==void 0)}}function T(){for(;o<r;){let d=n[o];n[o++]=void 0,t(d)||(d.flags&=-9)}o=0,r=0}function h(d,p,s,f){let y={dep:d,sub:p,nextDep:s,prevSub:void 0,nextSub:void 0};if(f===void 0?p.deps=y:f.nextDep=y,d.subs===void 0)d.subs=y;else{let v=d.subsTail;y.prevSub=v,v.nextSub=y}return p.depsTail=y,d.subsTail=y,y}function S(d){let p,s=0,f;e:do{f=!1;let y=d.dep;if(d.sub.flags&32)f=!0;else if("flags"in y){let v=y.flags;if((v&33)===33){if(e(y)){let w=y.subs;w.nextSub!==void 0&&b(w),f=!0}}else if((v&65)===65){(d.nextSub!==void 0||d.prevSub!==void 0)&&(p={target:d,linked:p}),d=y.deps,++s;continue}}if(!f&&d.nextDep!==void 0){d=d.nextDep;continue}for(;s;){--s;let v=d.sub,w=v.subs;if(f){if(e(v)){w.nextSub!==void 0?(d=p.target,p=p.linked,b(w)):d=w;continue}}else v.flags&=-65;if(w.nextSub!==void 0?(d=p.target,p=p.linked):d=w,d.nextDep!==void 0){d=d.nextDep;continue e}f=!1}return f}while(!0)}function b(d){do{let p=d.sub,s=p.flags;(s&96)===64&&(p.flags=s|32|8,(s&10)===2&&(n[r++]=p)),d=d.nextSub}while(d!==void 0)}function C(d,p){let s=p.depsTail;if(s!==void 0){let f=p.deps;do{if(f===d)return!0;if(f===s)break;f=f.nextDep}while(f!==void 0)}return!1}function x(d){do{let p=d.dep,s=d.nextDep,f=d.nextSub,y=d.prevSub;if(f!==void 0?f.prevSub=y:p.subsTail=y,y!==void 0?y.nextSub=f:p.subs=f,p.subs===void 0&&"deps"in p){let v=p.flags;v&32||(p.flags=v|32);let w=p.deps;if(w!==void 0){d=w,p.depsTail.nextDep=s,p.deps=void 0,p.depsTail=void 0;continue}}d=s}while(d!==void 0)}}var{link:q,propagate:Gn,updateDirtyFlag:zn,startTracking:Ee,endTracking:Re,processEffectNotifications:cn,processComputedUpdate:qn,processPendingInnerEffects:ln}=Wn({updateComputed(e){let t=N;N=e,Ee(e);try{let n=e.currentValue,o=e.getter(n);return n!==o?(e.currentValue=o,!0):!1}finally{N=t,Re(e)}},notifyEffect(e){return"isScope"in e?Yn(e):Jn(e)}}),fn=[],ke=0,N,ce;function un(){++ke}function dn(){--ke||cn()}function le(){fn.push(N),N=void 0}function fe(){N=fn.pop()}function pn(e){return Zn.bind({currentValue:e,subs:void 0,subsTail:void 0})}function mn(e){return Xn.bind({currentValue:void 0,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:33,getter:e})}function Me(e){let t={fn:e,subs:void 0,subsTail:void 0,deps:void 0,depsTail:void 0,flags:2};N!==void 0?q(t,N):ce!==void 0&&q(t,ce);let n=N;N=t;try{t.fn()}finally{N=n}return Qn.bind(t)}function Jn(e){let t=e.flags;if(t&32||t&64&&zn(e,t)){let n=N;N=e,Ee(e);try{e.fn()}finally{N=n,Re(e)}}else ln(e,e.flags);return!0}function Yn(e){return e.flags&128?(ln(e,e.flags),!0):!1}function Xn(){let e=this.flags;return e&96&&qn(this,e),N!==void 0?q(this,N):ce!==void 0&&q(this,ce),this.currentValue}function Zn(...e){if(e.length){if(this.currentValue!==(this.currentValue=e[0])){let t=this.subs;t!==void 0&&(Gn(t),ke||cn())}}else return N!==void 0&&q(this,N),this.currentValue}function Qn(){Ee(this),Re(this)}function eo(e,t){if(typeof t!="function"){e(t);return}le();let n=e();fe(),e(t(n))}function E(e){let t=pn(e);return[t,r=>eo(t,r)]}var U=null,ue=[];function D(e){let t={disposers:[]};ue.push(U),U=t;let n=()=>{for(let o of t.disposers)try{o()}catch{}t.disposers.length=0};try{return e(n)}finally{U=ue.pop()??null,ue.length===0&&(ue.length=0)}}function Ae(e){U&&U.disposers.push(e)}function Le(){return U!==null}var Ne=null;function _e(e){Ne?.(e)}function De(e){let t=Ne;return Ne=e,t}var _=typeof process<"u"?process.env?.NODE_ENV!=="production":!0,He=null;function Pe(e){He=e}function O(e,t){if(He)try{He(e,t?{source:t}:{})}catch{}_&&console.error(`[forma] ${t??"Unknown"} error:`,e)}var Ie=32,gn=100,Oe=[];for(let e=0;e<Ie;e++)Oe.push([]);var de=Ie;function to(){if(de>0){let e=Oe[--de];return e.length=0,e}return[]}function yn(e){e.length=0,de<Ie&&(Oe[de++]=e)}function hn(e){if(e!==void 0)try{e()}catch(t){O(t,"effect cleanup")}}function Tn(e){if(e!==void 0)for(let t=0;t<e.length;t++)try{e[t]()}catch(n){O(n,"effect cleanup")}}function R(e){let t=Me(e);return Le()&&Ae(t),t}function J(e){let t=Le(),n,o,r,i,a=C=>{if(i!==void 0){i.push(C);return}if(r!==void 0){let x=to();x.push(r,C),r=void 0,i=x;return}r=C},c=!1,l=!0,m=!1,u=!1,g=()=>{if(n!==void 0&&(hn(n),n=void 0),o!==void 0&&(Tn(o),yn(o),o=void 0),c){try{e()}catch(x){O(x,"effect")}return}r=void 0,i=void 0;let C=De(a);try{let x=e();if(typeof x=="function"&&a(x),r===void 0&&i===void 0){l&&(c=!0);return}i!==void 0?o=i:n=r}catch(x){O(x,"effect"),i!==void 0?o=i:n=r}finally{De(C),l=!1}},h=Me(()=>{if(m){u=!0;return}m=!0;try{let C=0;do u=!1,g(),u&&(C++,C>=gn&&(O(new Error(`createEffect exceeded ${gn} re-entrant runs`),"effect"),u=!1));while(u)}finally{m=!1}}),S=!1,b=()=>{S||(S=!0,h(),n!==void 0&&(hn(n),n=void 0),o!==void 0&&(Tn(o),yn(o),o=void 0))};return t&&Ae(b),b}function Y(e){return mn(e)}var Fe=Y;function H(e){un();try{e()}finally{dn()}}function L(e){le();try{return e()}finally{fe()}}function Be(e,t,n){let o,r=!0;return()=>{let i=e();if(n?.defer&&r){r=!1,o=i;return}let a=L(()=>t(i,o));return o=i,a}}function Ke(e){return{current:e}}function je(e,t){let[n,o]=E(t);return[n,i=>{o(a=>e(a,i))}]}var pe=null,Sn=[];function xn(e){Sn.push(pe),pe=e}function vn(){pe=Sn.pop()??null}function wn(){return pe}function Ue(e,t,n){let[o,r]=E(n?.initialValue),[i,a]=E(!1),[c,l]=E(void 0),m=wn(),u=null,g=0,T=()=>{let S=L(e);u&&u.abort();let b=new AbortController;u=b;let C=++g,x=()=>C===g,d=!1;m&&(m.increment(),d=!0),a(!0),l(void 0),Promise.resolve(t(S)).then(p=>{x()&&!b.signal.aborted&&r(()=>p)}).catch(p=>{x()&&!b.signal.aborted&&p?.name!=="AbortError"&&l(p)}).finally(()=>{d&&m?.decrement(),x()&&(a(!1),u===b&&(u=null))})};R(()=>{e(),T()});let h=(()=>o());return h.loading=i,h.error=c,h.refetch=T,h.mutate=S=>r(()=>S),h}function Ge(e){let t=e.length;if(t===0)return[];let n=new Int32Array(t),o=new Int32Array(t),r=new Int32Array(t).fill(-1),i=0;for(let l=0;l<t;l++){let m=e[l],u=0,g=i;for(;u<g;){let T=u+g>>1;n[T]<m?u=T+1:g=T}n[u]=m,o[u]=l,u>0&&(r[l]=o[u-1]),u>=i&&i++}let a=new Array(i),c=o[i-1];for(let l=i-1;l>=0;l--)a[l]=c,c=r[c];return a}var no=32,Ve=Symbol.for("forma-abort"),$e=Symbol.for("forma-attr-cache"),We=Symbol.for("forma-dynamic-child");function oo(e,t){return e instanceof HTMLElement&&t instanceof HTMLElement&&e.tagName===t.tagName&&!e[Ve]&&!e[$e]&&!e[We]&&!t[Ve]&&!t[$e]&&!t[We]}function ro(e,t){let n=new Set;for(let o of Array.from(t.attributes))n.add(o.name),e.getAttribute(o.name)!==o.value&&e.setAttribute(o.name,o.value);for(let o of Array.from(e.attributes))n.has(o.name)||e.removeAttribute(o.name);e.replaceChildren(...Array.from(t.childNodes))}function io(e,t,n,o,r,i,a,c,l){let m=t.length,u=n.length,g=new Array(m);for(let s=0;s<m;s++)g[s]=r(t[s]);let T=new Array(u),h=new Uint8Array(m);for(let s=0;s<u;s++){let f=r(n[s]),y=-1;for(let v=0;v<m;v++)if(!h[v]&&g[v]===f){y=v,h[v]=1;break}T[s]=y}for(let s=0;s<m;s++)if(!h[s])if(l?.onBeforeRemove){let f=o[s];l.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[s]);if(m===u){let s=!0;for(let f=0;f<u;f++)if(T[f]!==f){s=!1;break}if(s){let f=new Array(u);for(let y=0;y<u;y++){let v=o[y];a(v,n[y]),f[y]=v}return{nodes:f,items:n}}}let S=[],b=[];for(let s=0;s<u;s++)T[s]!==-1&&(S.push(T[s]),b.push(s));let C=Ge(S),x=new Uint8Array(u);for(let s of C)x[b[s]]=1;let d=new Array(u),p=c??null;for(let s=u-1;s>=0;s--){let f,y=!1;if(T[s]===-1)f=i(n[s]),y=!0;else if(f=o[T[s]],a(f,n[s]),x[s]){d[s]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),y&&l?.onInsert?.(f),d[s]=f,p=f}return{nodes:d,items:n}}function V(e,t,n,o,r,i,a,c,l){let m=t.length,u=n.length;if(u===0){for(let s=0;s<m;s++)if(l?.onBeforeRemove){let f=o[s];l.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[s]);return{nodes:[],items:[]}}if(m===0){let s=new Array(u);for(let f=0;f<u;f++){let y=i(n[f]);c?e.insertBefore(y,c):e.appendChild(y),l?.onInsert?.(y),s[f]=y}return{nodes:s,items:n}}if(m<no)return io(e,t,n,o,r,i,a,c,l);let g=new Map;for(let s=0;s<m;s++)g.set(r(t[s]),s);let T=new Array(u),h=new Uint8Array(m);for(let s=0;s<u;s++){let f=r(n[s]),y=g.get(f);y!==void 0?(T[s]=y,h[y]=1):T[s]=-1}for(let s=0;s<m;s++)if(!h[s])if(l?.onBeforeRemove){let f=o[s];l.onBeforeRemove(f,()=>{f.parentNode&&f.parentNode.removeChild(f)})}else e.removeChild(o[s]);if(m===u){let s=!0;for(let f=0;f<u;f++)if(T[f]!==f){s=!1;break}if(s){let f=new Array(u);for(let y=0;y<u;y++){let v=o[y];a(v,n[y]),f[y]=v}return{nodes:f,items:n}}}let S=[],b=[];for(let s=0;s<u;s++)T[s]!==-1&&(S.push(T[s]),b.push(s));let C=Ge(S),x=new Uint8Array(u);for(let s of C)x[b[s]]=1;let d=new Array(u),p=c??null;for(let s=u-1;s>=0;s--){let f,y=!1;if(T[s]===-1)f=i(n[s]),y=!0;else if(f=o[T[s]],a(f,n[s]),x[s]){d[s]=f,p=f;continue}p?e.insertBefore(f,p):e.appendChild(f),y&&l?.onInsert?.(f),d[s]=f,p=f}return{nodes:d,items:n}}function X(e,t,n,o){if(M)return{type:"list",items:e,keyFn:t,renderFn:n,options:o};let r=document.createComment("forma-list-start"),i=document.createComment("forma-list-end"),a=document.createDocumentFragment();a.appendChild(r),a.appendChild(i);let c=new Map,l=[],m=[],u=o?.updateOnItemChange??"none";return R(()=>{let g=e(),T=r.parentNode;if(!T)return;if(!Array.isArray(g)){_&&console.warn("[forma] createList: value is not an array, treating as empty");for(let x of l)x.parentNode===T&&T.removeChild(x);c=new Map,l=[],m=[];return}let h=g;for(let x=0;x<g.length;x++)if(g[x]==null){h=g.filter(d=>d!=null);break}if(_){let x=new Set;for(let d of h){let p=t(d);x.has(p)&&console.warn("[forma] createList: duplicate key detected:",p),x.add(p)}}let b=V(T,m,h,l,t,x=>{let d=t(x),[p,s]=E(0),f=L(()=>n(x,p));return c.set(d,{element:f,item:x,getIndex:p,setIndex:s}),f},u==="rerender"?(x,d)=>{let p=t(d),s=c.get(p);if(!s||s.item===d||(s.item=d,!(x instanceof HTMLElement))||x[Ve]||x[$e]||x[We])return;let f=L(()=>n(d,s.getIndex));oo(x,f)&&(ro(x,f),s.element=x)}:(x,d)=>{let p=t(d),s=c.get(p);s&&(s.item=d)},i),C=new Map;for(let x=0;x<h.length;x++){let d=t(h[x]),p=c.get(d);p&&(p.setIndex(x),C.set(d,p))}c=C,l=b.nodes,m=b.items}),a}function Z(e,t,n){if(M){let u=e()?t():n?.()??null;return{type:"show",condition:e,whenTrue:t,whenFalse:n,initialBranch:u}}let o=document.createComment("forma-show"),r=document.createComment("/forma-show"),i=document.createDocumentFragment();i.appendChild(o),i.appendChild(r);let a=null,c=null,l=null,m=R(()=>{let u=!!e(),g=typeof globalThis.__FORMA_DEBUG__<"u",T=g?t.toString().slice(0,60):"";if(u===c){g&&console.log("[forma:show] skip (same)",u,T);return}g&&console.log("[forma:show]",c,"\u2192",u,T),c=u;let h=o.parentNode;if(!h){g&&console.warn("[forma:show] parentNode is null! skipping.",T);return}if(g&&console.log("[forma:show] parent:",h.nodeName,"inDoc:",document.contains(h)),l&&(l(),l=null),a)if(a.parentNode===h)h.removeChild(a);else for(;o.nextSibling&&o.nextSibling!==r;)h.removeChild(o.nextSibling);let S=u?t:n;if(S){let b;a=D(C=>(b=C,L(()=>S()))),l=b}else a=null;a&&h.insertBefore(a,r)});return i.__showDispose=()=>{m(),l&&(l(),l=null)},i}var bn=Symbol.for("forma-abort"),M=!1;function Cn(e){M=e}function G(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="element"}function me(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="show"}function qe(e){return e!=null&&typeof e=="object"&&"type"in e&&e.type==="list"}function so(e,t){if(t)for(let n in t){let o=t[n];if(typeof o!="function")continue;if(n.charCodeAt(0)===111&&n.charCodeAt(1)===110&&n.length>2){let a=e[bn];a||(a=new AbortController,e[bn]=a),e.addEventListener(n.slice(2).toLowerCase(),o,{signal:a.signal});continue}let r=o,i=n;R(()=>{let a=r();a===!1||a==null?e.removeAttribute(i):a===!0?e.setAttribute(i,""):e.setAttribute(i,String(a))})}}function Q(e){if(e instanceof Node)return e;if(e==null||e===!1||e===!0)return null;if(typeof e=="string")return new Text(e);if(typeof e=="number")return new Text(String(e));if(G(e))return W(e);if(me(e)){let t=M;M=!1;try{return Z(e.condition,()=>Q(e.whenTrue())??document.createComment("empty"),e.whenFalse?()=>Q(e.whenFalse())??document.createComment("empty"):void 0)}finally{M=t}}if(qe(e)){let t=M;M=!1;try{return X(e.items,e.keyFn,e.renderFn,e.options)}finally{M=t}}return null}function W(e){let t=M;M=!1;try{let n=e.children.map(o=>G(o)?W(o):me(o)||qe(o)?Q(o):o);return te(e.tag,e.props,...n)}finally{M=t}}function ao(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===105}function ze(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===115}function co(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===116}function lo(e){return e.length>=4&&e.charCodeAt(0)===102&&e.charCodeAt(1)===58&&e.charCodeAt(2)===108}function $(e){let t="/"+e.data,n=e.nextSibling;for(;n;){if(n.nodeType===8&&n.data===t)return n;n=n.nextSibling}return null}function fo(e,t){let n=e.nextSibling;for(;n&&n!==t;){if(n.nodeType===3)return n;n=n.nextSibling}return null}function uo(e,t){let n=e.nextSibling;for(;n&&n!==t;){if(n.nodeType===1)return n;n=n.nextSibling}}function po(e,t){let n=document.createDocumentFragment(),o=e.nextSibling;for(;o&&o!==t;){let r=o.nextSibling;n.appendChild(o),o=r}return n}function En(e,t){let n=!!e.condition(),o=null,r=null;if(!(t.start.nextSibling!==t.end)&&n){_&&console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");let a=e.whenTrue();a instanceof Node&&t.start.parentNode.insertBefore(a,t.end)}R(()=>{let a=!!e.condition();if(a===n)return;n=a;let c=t.start.parentNode;if(!c)return;let l=po(t.start,t.end);a?r=l:o=l;let m=a?o??e.whenTrue():e.whenFalse?r??e.whenFalse():null;a&&o&&(o=null),!a&&r&&(r=null),m!=null&&!(m instanceof Node)&&(m=Q(m)),m instanceof Node&&c.insertBefore(m,t.end)})}function Rn(e,t,n){if(G(e)){let o=uo(t,n);o&&ee(e,o)}else if(me(e)){let o=t.nextSibling;for(;o&&o!==n;){if(o.nodeType===8&&ze(o.data)){let r=o,i=$(r);i&&(e.initialBranch&&Rn(e.initialBranch,r,i),En(e,{start:r,end:i,cachedContent:null}));break}o=o.nextSibling}}}function ee(e,t){if(!t||t.tagName!==e.tag.toUpperCase()){_&&console.warn(`Hydration mismatch: expected <${e.tag}>, got <${t?.tagName?.toLowerCase()??"nothing"}>`);let o=W(e);t&&t.replaceWith(o);return}so(t,e.props);let n=t.firstChild;for(let o of e.children)if(!(o===!1||o==null))if(G(o)){for(;n&&n.nodeType===3&&!n.data.trim();)n=n.nextSibling;for(;n&&n.nodeType===1&&n.hasAttribute("data-forma-island");)n=n.nextSibling;if(!n){t.appendChild(W(o));continue}if(n.nodeType===1){let r=n;n=n.nextSibling,ee(o,r)}else if(n.nodeType===8&&ao(n.data)){let r=$(n),i=W(o);r?(r.parentNode.insertBefore(i,r),n=r.nextSibling):(t.appendChild(i),n=null)}else t.appendChild(W(o))}else if(me(o)){for(;n&&!(n.nodeType===8&&ze(n.data));)n=n.nextSibling;if(n){let r=n,i=$(r);i&&(o.initialBranch&&Rn(o.initialBranch,r,i),En(o,{start:r,end:i,cachedContent:null}),n=i.nextSibling)}}else if(qe(o)){for(;n&&!(n.nodeType===8&&lo(n.data));)n=n.nextSibling;if(n){let r=n,i=$(r);if(i){let a=new Map,c=[],l=r.nextSibling;for(;l&&l!==i;){if(l.nodeType===1){let s=l;c.push(s);let f=s.getAttribute("data-forma-key");f!=null&&a.set(f,s)}l=l.nextSibling}let m=L(()=>o.items()),u=o.keyFn,g=o.renderFn,T=a.size===0&&c.length>0,h=[],S=[],b=new Set;for(let s=0;s<m.length;s++){let f=m[s],y=u(f),v;if(T?s<c.length&&(v=c[s],b.add(s)):(v=a.get(String(y)),v&&a.delete(String(y))),v)h.push(v),S.push(f);else{_&&console.warn(`[FormaJS] Hydration: list item key "${y}" not found in SSR \u2014 rendering fresh`);let w=M;M=!1;try{let[k]=E(s),A=g(f,k);i.parentNode.insertBefore(A,i),h.push(A),S.push(f)}finally{M=w}}}if(T)for(let s=0;s<c.length;s++)!b.has(s)&&c[s].parentNode&&c[s].parentNode.removeChild(c[s]);else for(let[s,f]of a)_&&console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${s}"`),f.parentNode&&f.parentNode.removeChild(f);let C=r.parentNode;for(let s of h)C.insertBefore(s,i);let x=new Map;for(let s=0;s<S.length;s++){let f=S[s],y=u(f),[v,w]=E(s);x.set(y,{element:h[s],item:f,getIndex:v,setIndex:w})}let d=h.slice(),p=S.slice();R(()=>{let s=o.items(),f=r.parentNode;if(!f)return;let y=V(f,p,s,d,u,w=>{let k=M;M=!1;try{let A=u(w),[P,be]=E(0),ae=L(()=>g(w,P));return x.set(A,{element:ae,item:w,getIndex:P,setIndex:be}),ae}finally{M=k}},(w,k)=>{let A=u(k),P=x.get(A);P&&(P.item=k)},i),v=new Map;for(let w=0;w<s.length;w++){let k=u(s[w]),A=x.get(k);A&&(A.setIndex(w),v.set(k,A))}x=v,d=y.nodes,p=y.items}),n=i.nextSibling}}}else if(typeof o=="function"){for(;n&&n.nodeType===3&&!n.data.trim();)n=n.nextSibling;if(n&&n.nodeType===1){let r=o();if(G(r)){let i=n;n=n.nextSibling,ee(r,i);continue}}if(n&&n.nodeType===8){let r=n.data;if(co(r)){let i=$(n),a=n.nextSibling;if(!a||a.nodeType!==3){_&&console.warn(`[FormaJS] Hydration: created text node for marker ${r} \u2014 SSR walker should emit content between markers`);let c=document.createTextNode("");n.parentNode.insertBefore(c,i||n.nextSibling),a=c}R(()=>{a.data=String(o())}),n=i?i.nextSibling:a.nextSibling}else if(ze(r)){let i=n,a=$(i);if(a){let c=fo(i,a);c||(_&&console.warn(`[FormaJS] Hydration: created text node for show marker ${i.data} \u2014 SSR walker should emit content between markers`),c=document.createTextNode(""),i.parentNode.insertBefore(c,a)),R(()=>{c.data=String(o())}),n=a.nextSibling}else n=n.nextSibling}else n=n.nextSibling}else if(n&&n.nodeType===3){let r=n;n=n.nextSibling,R(()=>{r.data=String(o())})}else{_&&console.warn(`[FormaJS] Hydration: created text node in empty <${t.tagName.toLowerCase()}> \u2014 IR may not cover this component`);let r=document.createTextNode("");t.appendChild(r),R(()=>{r.data=String(o())})}}else(typeof o=="string"||typeof o=="number")&&n&&n.nodeType===3&&(n=n.nextSibling)}function K(e,t){if(!(t.childElementCount>0||t.childNodes.length>0&&Array.from(t.childNodes).some(r=>r.nodeType===1||r.nodeType===3&&r.data.trim()))){if(_){let i=t.getAttribute("data-forma-component")||"unknown";console.warn(`[forma] Island "${i}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`)}let r=e();if(r instanceof Element){for(let i of Array.from(t.attributes))i.name.startsWith("data-forma-")&&r.setAttribute(i.name,i.value);return t.replaceWith(r),r}else r instanceof Node&&t.appendChild(r);return t}Cn(!0);let o;try{o=e()}finally{Cn(!1)}return!o||!G(o)?(t.removeAttribute("data-forma-ssr"),t):(t.hasAttribute("data-forma-island")?ee(o,t):ee(o,t.children[0]),t.removeAttribute("data-forma-ssr"),t)}var re=Symbol.for("forma.fragment"),mo="http://www.w3.org/2000/svg",ne="http://www.w3.org/1999/xlink",go=new Set(["svg","path","circle","rect","line","polyline","polygon","ellipse","g","text","tspan","textPath","defs","use","symbol","clipPath","mask","pattern","marker","linearGradient","radialGradient","stop","filter","feGaussianBlur","feColorMatrix","feOffset","feBlend","feMerge","feMergeNode","feComposite","feFlood","feMorphology","feTurbulence","feDisplacementMap","feImage","foreignObject","animate","animateTransform","animateMotion","set","image","switch","desc","title","metadata"]),Mn=new Set(["disabled","checked","readonly","required","autofocus","autoplay","controls","default","defer","formnovalidate","hidden","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","reversed","selected","async"]),B=null;function yo(e){if(!B){B=Object.create(null);for(let t of["div","span","p","a","li","ul","ol","button","input","label","h1","h2","h3","h4","h5","h6","section","header","footer","main","nav","table","tr","td","th","tbody","img","form","select","option","textarea","i","b","strong","em","small","article","aside","details","summary"])B[t]=document.createElement(t)}return B[e]??(B[e]=document.createElement(e))}var kn=Object.create(null);function ho(e){return kn[e]??(kn[e]=e.slice(2).toLowerCase())}var ge=Symbol.for("forma-abort");function To(e){let t=e[ge];return t||(t=new AbortController,e[ge]=t),t}function Ye(e){let t=e[ge];t&&(t.abort(),delete e[ge])}var Je=Symbol.for("forma-attr-cache"),So=Symbol.for("forma-dynamic-child");function I(e){return e[Je]??(e[Je]=Object.create(null))}function Xe(e,t,n){if(typeof n=="function")R(()=>{let o=n(),r=I(e);r.class!==o&&(r.class=o,e instanceof HTMLElement?e.className=o:e.setAttribute("class",o))});else{let o=I(e);if(o.class===n)return;o.class=n,e instanceof HTMLElement?e.className=n:e.setAttribute("class",n)}}function xo(e,t,n){if(typeof n=="function"){let o=[];R(()=>{let r=n();if(typeof r=="string"){let i=I(e);if(i.style===r)return;i.style=r,o=[],e.style.cssText=r}else if(r&&typeof r=="object"){let i=e.style,a=Object.keys(r);for(let c of o)c in r||i.removeProperty(c.replace(/[A-Z]/g,l=>"-"+l.toLowerCase()));Object.assign(i,r),o=a}})}else if(typeof n=="string"){let o=I(e);if(o.style===n)return;o.style=n,e.style.cssText=n}else n&&typeof n=="object"&&Object.assign(e.style,n)}function An(e,t,n){let o=To(e);e.addEventListener(ho(t),n,{signal:o.signal})}function vo(e,t,n){if(typeof n=="function")R(()=>{let o=n();if(o==null){e.innerHTML="";return}if(typeof o!="object"||!("__html"in o))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof o);let r=o.__html;if(typeof r!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof r);let i=I(e);i.innerHTML!==r&&(i.innerHTML=r,e.innerHTML=r)});else{if(n==null){e.innerHTML="";return}if(typeof n!="object"||!("__html"in n))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof n);let o=n.__html;if(typeof o!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof o);e.innerHTML=o}}function wo(e,t,n){let o=t.slice(6);typeof n=="function"?R(()=>{let r=n();r==null||r===!1?e.removeAttributeNS(ne,o):e.setAttributeNS(ne,t,String(r))}):n==null||n===!1?e.removeAttributeNS(ne,o):e.setAttributeNS(ne,t,String(n))}function bo(e,t,n){if(typeof n=="function")R(()=>{let o=n(),r=I(e);r[t]!==o&&(r[t]=o,o?e.setAttribute(t,""):e.removeAttribute(t))});else{let o=I(e);if(o[t]===n)return;o[t]=n,n?e.setAttribute(t,""):e.removeAttribute(t)}}function Co(e,t,n){if(typeof n=="function")R(()=>{let o=n();if(o==null||o===!1){let r=I(e);if(r[t]===null)return;r[t]=null,e.removeAttribute(t)}else{let r=String(o),i=I(e);if(i[t]===r)return;i[t]=r,e.setAttribute(t,r)}});else if(n==null||n===!1){let o=I(e);if(o[t]===null)return;o[t]=null,e.removeAttribute(t)}else{let o=String(n),r=I(e);if(r[t]===o)return;r[t]=o,e.setAttribute(t,o)}}var j=new Map;j.set("class",Xe);j.set("className",Xe);j.set("style",xo);j.set("ref",()=>{});j.set("dangerouslySetInnerHTML",vo);for(let e of Mn)j.set(e,bo);function Eo(e,t,n){if(t==="class"){Xe(e,t,n);return}if(t.charCodeAt(0)===111&&t.charCodeAt(1)===110&&t.length>2){An(e,t,n);return}let o=j.get(t);if(o){o(e,t,n);return}if(t.charCodeAt(0)===120&&t.startsWith("xlink:")){wo(e,t,n);return}Co(e,t,n)}function Ro(e,t,n){if(!(n==null||n===!1)){if(t==="class"||t==="className"){e.className=n;return}if(t==="style"){typeof n=="string"?e.style.cssText=n:n&&typeof n=="object"&&Object.assign(e.style,n);return}if(t==="dangerouslySetInnerHTML"){if(typeof n!="object"||!("__html"in n))throw new TypeError("dangerouslySetInnerHTML: expected { __html: string }, got "+typeof n);let o=n.__html;if(typeof o!="string")throw new TypeError("dangerouslySetInnerHTML: __html must be a string, got "+typeof o);e.innerHTML=o;return}if(t.charCodeAt(0)===120&&t.startsWith("xlink:")){e.setAttributeNS(ne,t,String(n));return}if(Mn.has(t)){n&&e.setAttribute(t,"");return}n===!0?e.setAttribute(t,""):e.setAttribute(t,String(n))}}function oe(e,t){if(t instanceof Node){e.appendChild(t);return}if(typeof t=="string"){e.appendChild(new Text(t));return}if(!(t==null||t===!1||t===!0)){if(typeof t=="number"){e.appendChild(new Text(String(t)));return}if(typeof t=="function"){e instanceof Element&&(e[So]=!0);let n=null;R(()=>{let o=t();if(o instanceof Node)n?e.replaceChild(o,n):e.appendChild(o),n=o;else{let r=String(typeof o=="symbol"?o:o??"");if(!n)n=new Text(r),e.appendChild(n);else if(n.nodeType===3)n.data=r;else{let i=new Text(r);e.replaceChild(i,n),n=i}}});return}if(Array.isArray(t)){for(let n of t)oe(e,n);return}}}function te(e,t,...n){if(typeof e=="function"&&e!==re){let a={...t??{},children:n};return e(a)}if(e===re){let a=document.createDocumentFragment();for(let c of n)oe(a,c);return a}let o=e;if(M)return{type:"element",tag:o,props:t??null,children:n};let r;if(B&&B[o]?r=B[o].cloneNode(!1):go.has(o)?r=document.createElementNS(mo,o):r=yo(o).cloneNode(!1),t){let a=!1;for(let c in t){if(c==="ref")continue;let l=t[c];if(c.charCodeAt(0)===111&&c.charCodeAt(1)===110&&c.length>2){An(r,c,l);continue}if(typeof l=="function"){a||(r[Je]=Object.create(null),a=!0),Eo(r,c,l);continue}Ro(r,c,l)}}let i=n.length;if(i===1){let a=n[0];typeof a=="string"?r.textContent=a:typeof a=="number"?r.textContent=String(a):oe(r,a)}else if(i>1)for(let a of n)oe(r,a);return t&&typeof t.ref=="function"&&t.ref(r),r}function Ze(...e){let t=document.createDocumentFragment();for(let n of e)oe(t,n);return t}function Qe(e){if(typeof e=="function"){let t=new Text("");return R(()=>{t.data=e()}),t}return new Text(e)}function et(e,t){let n=typeof t=="string"?document.querySelector(t):t;if(!n)throw new Error(`mount: container not found \u2014 "${t}"`);let o;if(n.hasAttribute("data-forma-ssr"))D(i=>{o=i,K(e,n)});else{let i=D(a=>(o=a,e()));n.innerHTML="",n.appendChild(i)}let r=!1;return()=>{r||(r=!0,o(),n.innerHTML="")}}function tt(e,t,n){let o=document.createComment("forma-switch"),r=document.createComment("/forma-switch"),i=document.createDocumentFragment();i.appendChild(o),i.appendChild(r);let a=new Map,c=null,l=ko,m=R(()=>{let u=e();if(u===l)return;let g=typeof globalThis.__FORMA_DEBUG__<"u";g&&console.log("[forma:switch] transition",String(l),"\u2192",String(u)),l=u;let T=o.parentNode;if(!T){g&&console.warn("[forma:switch] markers not in DOM yet, skipping");return}if(c)if(c.parentNode===T)g&&console.log("[forma:switch] removing single node"),T.removeChild(c);else if(c.nodeType===11){g&&console.log("[forma:switch] scooping nodes back into fragment");let S=0;for(;o.nextSibling&&o.nextSibling!==r;)c.appendChild(o.nextSibling),S++;g&&console.log("[forma:switch] scooped",S,"nodes back into fragment")}else for(g&&console.log("[forma:switch] clearing detached node between markers");o.nextSibling&&o.nextSibling!==r;)T.removeChild(o.nextSibling);let h=t.find(S=>S.match===u);if(h){let S=a.get(u);if(S)g&&console.log("[forma:switch] reusing cached branch for",String(u),"\u2192",S.node.nodeName,"type",S.node.nodeType,"childNodes",S.node.childNodes?.length);else{let b,C=D(x=>(b=x,L(()=>h.render())));S={node:C,dispose:b},a.set(u,S),g&&console.log("[forma:switch] rendered new branch for",String(u),"\u2192",C.nodeName,"type",C.nodeType)}c=S.node}else c=n?.()??null,g&&console.log("[forma:switch] no match, using fallback");c&&(T.insertBefore(c,r),g&&console.log("[forma:switch] inserted",c.nodeName,"before end marker"))});return i.__switchDispose=()=>{m();for(let u of a.values())u.dispose();a.clear()},i}var ko=Symbol("unset");function nt(e,t){let n=document.createComment("forma-portal"),o=typeof t=="string"?document.querySelector(t):t??document.body;if(!o)throw new Error(`createPortal: target not found: ${t}`);let r=null,i=()=>{r&&r.parentNode===o&&o.removeChild(r),r=null};return J(()=>{let a=e();return i(),r=a,o.appendChild(a),()=>{i()}}),n}function ot(e,t){let n=document.createComment("forma-error-boundary"),o=document.createComment("/forma-error-boundary"),r=document.createDocumentFragment();r.appendChild(n),r.appendChild(o);let[i,a]=E(0),c=null;return R(()=>{i();let l=n.parentNode;if(l){c&&c.parentNode===l&&l.removeChild(c);try{c=e()}catch(m){let u=m instanceof Error?m:new Error(String(m));c=t(u,()=>a(T=>T+1))}c&&l.insertBefore(c,o)}}),r}function rt(e,t){let n=document.createComment("forma-suspense"),o=document.createComment("/forma-suspense"),r=document.createDocumentFragment();r.appendChild(n),r.appendChild(o);let[i,a]=E(0),c=null,l=null,m=null;xn({increment(){a(g=>g+1)},decrement(){a(g=>Math.max(0,g-1))}});try{l=t()}finally{vn()}return R(()=>{let g=n.parentNode;if(!g)return;let h=i()>0?m??=e():l;h!==c&&(c&&c.parentNode===g&&g.removeChild(c),h&&g.insertBefore(h,o),c=h)}),r}function Mo(e,t,n){let o=e.getAttribute("data-forma-props");return o?JSON.parse(o):n&&String(t)in n?n[String(t)]:null}function it(e){let t=document.getElementById("__forma_islands"),n=t?JSON.parse(t.textContent):null,o=document.querySelectorAll("[data-forma-island]");for(let r of o){let i=parseInt(r.getAttribute("data-forma-island"),10),a=r.getAttribute("data-forma-component"),c=e[a];if(!c){_&&console.warn(`[forma] No hydrate function for island "${a}" (id=${i})`),r.setAttribute("data-forma-status","error");continue}let l=r.getAttribute("data-forma-hydrate")||"load";if(l==="visible"){let m=new IntersectionObserver(u=>{for(let g of u)g.isIntersecting&&(m.disconnect(),ye(r,i,a,c,n))},{rootMargin:"200px"});m.observe(r)}else if(l==="idle"){let m=()=>ye(r,i,a,c,n);typeof requestIdleCallback=="function"?requestIdleCallback(m):setTimeout(m,200)}else if(l==="interaction"){let m=()=>{r.removeEventListener("pointerdown",m,!0),r.removeEventListener("focusin",m,!0),ye(r,i,a,c,n)};r.addEventListener("pointerdown",m,{capture:!0,once:!0}),r.addEventListener("focusin",m,{capture:!0,once:!0})}else ye(r,i,a,c,n)}}function he(e){let t=e.__formaDispose;typeof t=="function"&&(t(),delete e.__formaDispose,e.setAttribute("data-forma-status","disposed"))}function st(e=document){let t=e.querySelectorAll('[data-forma-status="active"]');for(let n of t)he(n)}function ye(e,t,n,o,r){try{let i=Mo(e,t,r);e.setAttribute("data-forma-status","hydrating");let a=e;D(c=>{a=K(()=>o(e,i),e),a.__formaDispose=c}),a.setAttribute("data-forma-status","active")}catch(i){_&&console.error(`[forma] Island "${n}" (id=${t}) failed:`,i),e.setAttribute("data-forma-status","error")}}var F=null,Ln=[];function Ao(e){Ln.push(F),F=e}function Lo(){F=Ln.pop()??null}function at(e){if(F===null)throw new Error("onMount() must be called inside a component setup function");F.mountCallbacks.push(e)}function ct(e){if(F===null)throw new Error("onUnmount() must be called inside a component setup function");F.unmountCallbacks.push(e)}var Te=Symbol("forma:component:dispose");function lt(e){let t=typeof e=="function"?e:e.setup,n=typeof e=="function"?void 0:e.name;return function(){let r={disposers:[],mountCallbacks:[],unmountCallbacks:[]};Ao(r);let i;try{i=t()}finally{Lo()}let a=()=>{for(let c of r.unmountCallbacks)try{c()}catch(l){O(l,"onUnmount")}for(let c of r.disposers)try{c()}catch(l){O(l,"component disposer")}r.disposers.length=0,r.mountCallbacks.length=0,r.unmountCallbacks.length=0};i[Te]=a;for(let c of r.mountCallbacks)try{let l=c();typeof l=="function"&&r.unmountCallbacks.push(l)}catch(l){O(l,"onMount")}return i}}function ft(e){let t=e;typeof t[Te]=="function"&&(t[Te](),delete t[Te])}function ut(e){F!==null&&F.disposers.push(e)}var ie=new Map;function dt(e){return{id:Symbol("forma:context"),defaultValue:e}}function pt(e,t){let n=ie.get(e.id);n===void 0&&(n=[],ie.set(e.id,n)),n.push(t)}function mt(e){let t=ie.get(e.id);return t===void 0||t.length===0?e.defaultValue:t[t.length-1]}function gt(e){let t=ie.get(e.id);t!==void 0&&t.length>0&&(t.pop(),t.length===0&&ie.delete(e.id))}var se=Symbol("forma-raw"),_n=Symbol("forma-proxy"),No=new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]);function Nn(e){return!(e==null||typeof e!="object"||e instanceof Date||e instanceof RegExp||e instanceof Map||e instanceof Set||e instanceof WeakMap||e instanceof WeakSet||e instanceof Error||e instanceof Promise||e[_n])}function yt(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(yt);if(e instanceof Date)return new Date(e.getTime());let t={};for(let n of Object.keys(e))t[n]=yt(e[n]);return t}function ht(e){let t=new Map,n=new Map;function o(g){let T=g.lastIndexOf(".");if(T===-1)return;let h=g.substring(0,T),S=n.get(h);S||(S=new Set,n.set(h,S)),S.add(g)}function r(g,T){let h=t.get(g);return h||(h=E(T),t.set(g,h),o(g)),h}let i=new WeakMap;function a(g){let T=n.get(g);if(T){for(let h of T)a(h),t.delete(h),n.delete(h);T.clear()}}function c(g,T){if(!Nn(g))return g;let h=i.get(g);if(h)return h;let S=Array.isArray(g),b=T?T+".":"",C="",x,d=new Proxy(g,{get(p,s,f){if(s===se)return p;if(s===_n)return!0;if(typeof s=="symbol")return Reflect.get(p,s,f);let y=String(s),v=b+y;if(S&&No.has(y))return(...A)=>{let P;return H(()=>{let be=A.map(z=>z!=null&&typeof z=="object"&&z[se]?z[se]:z);P=p[y].apply(p,be),a(T);let[,ae]=r(b+"length",p.length);ae(p.length)}),P};if(S&&y==="length"){let[A]=r(v,p.length);return A(),p.length}let w=Reflect.get(p,s),k;return y===C&&x?k=x:(k=r(v,w),C=y,x=k),k[0](),Nn(w)?c(w,v):w},set(p,s,f){if(typeof s=="symbol")return Reflect.set(p,s,f);let y=String(s),v=b+y,w=f!=null&&typeof f=="object"&&f[se]?f[se]:f;if(Reflect.set(p,s,w),w!=null&&typeof w=="object"&&a(v),S&&y!=="length"){let A=b+"length",P=t.get(A);P&&P[1](p.length)}let[,k]=r(v,w);return k(w),!0},has(p,s){if(typeof s=="symbol")return Reflect.has(p,s);let f=String(s),y=b+f,[v]=r(y,Reflect.get(p,s));return v(),Reflect.has(p,s)},ownKeys(p){return Reflect.ownKeys(p)},getOwnPropertyDescriptor(p,s){return Object.getOwnPropertyDescriptor(p,s)},deleteProperty(p,s){if(typeof s=="symbol")return Reflect.deleteProperty(p,s);let f=String(s),y=b+f,v=Reflect.deleteProperty(p,s);a(y),t.delete(y);let w=T;if(w!==void 0){let k=n.get(w);k&&(k.delete(y),k.size===0&&n.delete(w))}return n.delete(y),v}});return i.set(g,d),d}let l=c(e,"");function m(){return L(()=>yt(e))}return[l,g=>{let T=typeof g=="function"?g(m()):g;H(()=>{for(let h of Object.keys(T))l[h]=T[h]})}]}function Tt(e,t){let[n,o]=e,r=t?.maxLength??100,i=[n()],a=0,[c,l]=E([...i]),[m,u]=E(a),[g,T]=E(i.length);function h(){H(()=>{l([...i]),u(a),T(i.length)})}let S=!1,b=!0;return R(()=>{let f=n();if(b){b=!1;return}if(S){S=!1;return}i=i.slice(0,a+1),i.push(f),i.length>r&&i.splice(0,i.length-r),a=i.length-1,h()}),{undo:()=>{a<=0||(a--,S=!0,o(i[a]),h())},redo:()=>{a>=i.length-1||(a++,S=!0,o(i[a]),h())},canUndo:()=>m()>0,canRedo:()=>m()<g()-1,history:()=>c(),cursor:()=>m(),clear:()=>{i=[n()],a=0,h()}}}function St(e,t,n){let[o,r]=e,i=n?.storage??globalThis.localStorage,a=n?.serialize??JSON.stringify,c=n?.deserialize??JSON.parse,l=n?.validate;try{let m=i.getItem(t);if(m!==null){let u=c(m);(!l||l(u))&&r(u)}}catch{}R(()=>{let m=o();try{let u=a(m);i.setItem(t,u)}catch{}})}function xt(){let e=new Map;function t(c){let l=e.get(c);return l||(l=new Set,e.set(c,l)),l}function n(c,l){let m=t(c);return m.add(l),()=>{m.delete(l)}}function o(c,l){let m=u=>{i(c,m),l(u)};return n(c,m)}function r(c,l){let m=e.get(c);if(m)for(let u of[...m])try{u(l)}catch(g){console.error(`[forma] Bus handler error on "${String(c)}":`,g)}}function i(c,l){let m=e.get(c);m&&m.delete(l)}function a(){e.clear()}return{on:n,once:o,emit:r,off:i,clear:a}}function vt(e,t,n,o,r){let i=a=>{let c=a.target;if(!(c instanceof HTMLElement))return;let l=e instanceof Document?e.documentElement:e,m=c.closest(t);m instanceof HTMLElement&&l.contains(m)&&o(a,m)};return e.addEventListener(n,i,r),()=>{e.removeEventListener(n,i,r)}}function _o(e){let t=e.toLowerCase().split("+").map(o=>o.trim()),n={ctrl:!1,shift:!1,alt:!1,meta:!1,key:""};for(let o of t)switch(o){case"ctrl":case"control":n.ctrl=!0;break;case"shift":n.shift=!0;break;case"alt":n.alt=!0;break;case"meta":case"cmd":case"command":n.meta=!0;break;default:n.key=o}return n}function Do(e,t){return e.ctrlKey!==t.ctrl||e.shiftKey!==t.shift||e.altKey!==t.alt||e.metaKey!==t.meta?!1:e.key.toLowerCase()===t.key}function wt(e,t,n){let o=n?.target??document,r=n?.preventDefault??!0,i=_o(e),a=c=>{c instanceof KeyboardEvent&&Do(c,i)&&(r&&c.preventDefault(),t(c))};return o.addEventListener("keydown",a),()=>{o.removeEventListener("keydown",a)}}function bt(e,t){return(t??document).querySelector(e)}function Ct(e,t){return Array.from((t??document).querySelectorAll(e))}function Et(e,...t){e.classList.add(...t)}function Rt(e,...t){e.classList.remove(...t)}function kt(e,t,n){return e.classList.toggle(t,n)}function Mt(e,t){for(let[n,o]of Object.entries(t))o!==void 0&&(e.style[n]=o)}function At(e,t){for(let[n,o]of Object.entries(t))o===!1||o===null?e.removeAttribute(n):o===!0?e.setAttribute(n,""):e.setAttribute(n,o)}function Lt(e,t){e.textContent=t}function Nt(e,t){e.innerHTML=t}function _t(e,t){e.innerHTML=t}function Dt(e,t){return e.closest(t)}function Ht(e,t){let n=Array.from(e.children);return t?n.filter(o=>o.matches(t)):n}function Pt(e,t){let n=e.parentElement;if(!n)return[];let r=Array.from(n.children).filter(i=>i!==e);return t?r.filter(i=>i.matches(t)):r}function It(e){return e.parentElement}function Ot(e,t){let n=e.nextElementSibling;for(;n;){if(n instanceof HTMLElement&&(!t||n.matches(t)))return n;n=n.nextElementSibling}return null}function Ft(e,t){let n=e.previousElementSibling;for(;n;){if(n instanceof HTMLElement&&(!t||n.matches(t)))return n;n=n.previousElementSibling}return null}function Bt(e,t){let n=new ResizeObserver(o=>{for(let r of o)t(r)});return n.observe(e),()=>{n.disconnect()}}function Kt(e,t,n){let o=new IntersectionObserver(r=>{for(let i of r)t(i)},n);return o.observe(e),()=>{o.disconnect()}}function jt(e,t,n){let o=new MutationObserver(r=>{t(r)});return o.observe(e,n??{childList:!0,subtree:!0}),()=>{o.disconnect()}}function Ut(e,t){let n=t?.serialize??JSON.stringify,o=t?.deserialize??JSON.parse,r=t?.validate;return{key:e,get(){try{let i=localStorage.getItem(e);if(i===null)return null;let a=o(i);return r&&!r(a)?null:a}catch{return null}},set(i){try{let a=n(i);localStorage.setItem(e,a)}catch{}},remove(){localStorage.removeItem(e)}}}function Vt(e,t){let n=t?.serialize??JSON.stringify,o=t?.deserialize??JSON.parse,r=t?.validate;return{key:e,get(){try{let i=sessionStorage.getItem(e);if(i===null)return null;let a=o(i);return r&&!r(a)?null:a}catch{return null}},set(i){try{let a=n(i);sessionStorage.setItem(e,a)}catch{}},remove(){sessionStorage.removeItem(e)}}}var $t=new Map;function Ho(e,t){let n=`${e}::${t}`,o=$t.get(n);if(o)return o;let r=new Promise((i,a)=>{let c=indexedDB.open(e);c.onerror=()=>a(c.error),c.onsuccess=()=>{let l=c.result;if(l.objectStoreNames.contains(t)){i(l);return}let m=l.version+1;l.close();let u=indexedDB.open(e,m);u.onerror=()=>a(u.error),u.onupgradeneeded=()=>{let g=u.result;g.objectStoreNames.contains(t)||g.createObjectStore(t)},u.onsuccess=()=>i(u.result)},c.onupgradeneeded=()=>{let l=c.result;l.objectStoreNames.contains(t)||l.createObjectStore(t)}});return $t.set(n,r),r.catch(()=>{$t.delete(n)}),r}function Wt(e,t="default"){function n(o,r){return Ho(e,t).then(i=>new Promise((a,c)=>{let m=i.transaction(t,o).objectStore(t),u=r(m);u.onsuccess=()=>a(u.result),u.onerror=()=>c(u.error)}))}return{get(o){return n("readonly",r=>r.get(o))},set(o,r){return n("readwrite",i=>i.put(r,o)).then(()=>{})},delete(o){return n("readwrite",r=>r.delete(o)).then(()=>{})},getAll(){return n("readonly",o=>o.getAll())},keys(){return n("readonly",o=>o.getAllKeys()).then(o=>o.map(String))},clear(){return n("readwrite",o=>o.clear()).then(()=>{})}}}function Gt(e,t){let[n,o]=E(null),[r,i]=E(null),[a,c]=E(!1),l=null;function m(){let g=typeof e=="function"?e():e,T=t?.base??"",h=new URL(g,T||void 0);if(t?.params)for(let[S,b]of Object.entries(t.params))h.searchParams.set(S,b);return h.toString()}async function u(){l&&l.abort(),l=new AbortController;let g=l,T=t?.timeout??3e4,h=setTimeout(()=>g.abort(),T);c(!0),i(null);try{let S=m(),{base:b,params:C,timeout:x,transform:d,...p}=t??{},s=await fetch(S,{...p,signal:g.signal});if(!s.ok)throw new Error(`HTTP ${s.status}: ${s.statusText}`);let f=await s.json(),y=d?d(f):f;o(y)}catch(S){if(S instanceof Error&&S.name==="AbortError")return;i(S instanceof Error?S:new Error(String(S)))}finally{clearTimeout(h),l===g&&(l=null,c(!1))}}return typeof e=="function"?R(()=>{e(),u()}):u(),{data:n,error:r,loading:a,refetch:u,abort(){l&&l.abort()}}}async function zt(e,t){let n=await fetch(e,t);if(!n.ok)throw new Error(`HTTP ${n.status}: ${n.statusText}`);return await n.json()}function qt(e,t){let[n,o]=E(null),[r,i]=E(null),[a,c]=E(!1),l=new EventSource(e,{withCredentials:t?.withCredentials??!1});l.onopen=()=>{c(!0),i(null)};let m=t?.parse??(u=>{try{return JSON.parse(u)}catch{return u}});return l.onmessage=u=>{o(m(u.data))},l.onerror=u=>{i(u),c(!1)},{data:n,error:r,connected:a,close(){l.close(),c(!1)},on(u,g){let T=t?.parse??(S=>{try{return JSON.parse(S)}catch{return S}}),h=S=>{g(T(S.data))};return l.addEventListener(u,h),()=>{l.removeEventListener(u,h)}}}}function Jt(e,t){let n=t?.reconnect??!0,o=t?.reconnectInterval??1e3,r=t?.maxReconnects??5,[i,a]=E(null),[c,l]=E("connecting"),m=new Set,u=null,g=0,T=null,h=!1;function S(){if(h)return;l("connecting"),u=new WebSocket(e,t?.protocols),u.onopen=()=>{l("open"),g=0};let b=t?.parse??(C=>{try{return JSON.parse(C)}catch{return C}});u.onmessage=C=>{let x=b(C.data);a(x);for(let d of m)d(x)},u.onerror=()=>{l("error")},u.onclose=()=>{if(h){l("closed");return}if(l("closed"),n&&g<r){let C=o*Math.pow(2,g);g++,T=setTimeout(S,C)}}}return S(),{data:i,status:c,send(b){u&&u.readyState===WebSocket.OPEN&&u.send(JSON.stringify(b))},close(){h=!0,T!==null&&(clearTimeout(T),T=null),u&&(u.close(),u=null),l("closed")},on(b){return m.add(b),()=>{m.delete(b)}}}}function Yt(e,t){let[n,o]=E(!1),[r,i]=E(void 0),c=async(...l)=>{if(o(!0),i(void 0),t?.optimistic)try{H(()=>t.optimistic(...l))}catch{}try{let m=await e(...l);if(t?.onSuccess&&H(()=>t.onSuccess(m,...l)),t?.invalidates)for(let u of t.invalidates)u.refetch();return o(!1),m}catch(m){if(t?.onError)try{H(()=>t.onError(m,...l))}catch{}throw i(m),o(!1),m}};return c.pending=n,c.error=r,c.clearError=()=>i(void 0),c}var Xt=new Map;function Zt(e,t){Xt.set(e,t)}function Qt(e){Xt.delete(e)}function Se(e){for(let[t,n]of Object.entries(e)){let o=Xt.get(t);o&&o.mutate(n)}}function en(){if(typeof window>"u")return()=>{};let e=t=>{let n=t.detail;n&&typeof n=="object"&&Se(n)};return window.addEventListener("forma:revalidate",e),()=>window.removeEventListener("forma:revalidate",e)}function tn(e,t){return{data:e,__revalidate:t}}function nn(e){return async(...n)=>{let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","X-Forma-RPC":"1"},body:JSON.stringify({args:n})});if(!o.ok){let i=await o.text();throw new Error(`Server function failed (${o.status}): ${i}`)}let r=await o.json();return r&&typeof r=="object"&&"__revalidate"in r?(typeof window<"u"&&window.dispatchEvent(new CustomEvent("forma:revalidate",{detail:r.__revalidate})),r.data):r}}var xe=new Map;function on(e,t){xe.set(e,t)}function rn(e){return xe.get(e)}function sn(){return[...xe.keys()]}var Po=new Set(["__proto__","constructor","prototype"]);async function ve(e,t,n){let o=e.split("/").pop()??"";if(Po.has(o))return{error:"Forbidden endpoint name"};let r=xe.get(e);if(!r)return{error:`Unknown server function: ${e}`};try{let i=await r(...t.args);return n?{data:i,__revalidate:n}:{data:i}}catch(i){return{error:typeof process<"u"&&process.env?.NODE_ENV==="development"&&i instanceof Error?i.message:"Internal server error"}}}function an(){return async(e,t)=>{if(e.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}let n=e.body;if(!n||!Array.isArray(n.args)){t.status(400).json({error:"Invalid RPC request: missing args array"});return}let o=await ve(e.url,n);o.error?t.status(500).json(o):t.json(o)}}var we=null,Dn=new Map;async function Hn(){if(we)return we;let e=window.__FORMA_WASM__;if(!e)throw new Error("No __FORMA_WASM__ config");let t=await import(e.loader);return await t.default(e.binary),we=t,we}async function Pn(){let e=window.__FORMA_WASM__;if(!e)throw new Error("No __FORMA_WASM__ config");let t=Dn.get(e.ir);if(t)return t;let n=await fetch(e.ir),o=new Uint8Array(await n.arrayBuffer());return Dn.set(e.ir,o),o}async function In(e){let[t,n]=await Promise.all([Hn(),Pn()]);return t.render(n,e)}async function On(e,t){let[n,o]=await Promise.all([Hn(),Pn()]);return n.render_island(o,e,t)}return Vn(Io);})();
//# sourceMappingURL=formajs.global.js.map
'use strict';
var chunkTSQ7AKFT_cjs = require('./chunk-TSQ7AKFT.cjs');
var chunkFPSLC62A_cjs = require('./chunk-FPSLC62A.cjs');
var chunkYSKF3VRA_cjs = require('./chunk-YSKF3VRA.cjs');
var chunkKH3F5NRU_cjs = require('./chunk-KH3F5NRU.cjs');

@@ -10,3 +10,3 @@ // src/dom/text.ts

const node = new Text("");
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
node.data = value();

@@ -27,8 +27,8 @@ });

if (target.hasAttribute("data-forma-ssr")) {
chunkTSQ7AKFT_cjs.createRoot((dispose) => {
chunkYSKF3VRA_cjs.createRoot((dispose) => {
disposeRoot = dispose;
chunkTSQ7AKFT_cjs.hydrateIsland(component, target);
chunkYSKF3VRA_cjs.hydrateIsland(component, target);
});
} else {
const dom = chunkTSQ7AKFT_cjs.createRoot((dispose) => {
const dom = chunkYSKF3VRA_cjs.createRoot((dispose) => {
disposeRoot = dispose;

@@ -59,3 +59,3 @@ return component();

let currentMatch = UNSET;
const switchDispose = chunkTSQ7AKFT_cjs.internalEffect(() => {
const switchDispose = chunkYSKF3VRA_cjs.internalEffect(() => {
const val = value();

@@ -95,5 +95,5 @@ if (val === currentMatch) return;

let branchDispose;
const node = chunkTSQ7AKFT_cjs.createRoot((dispose) => {
const node = chunkYSKF3VRA_cjs.createRoot((dispose) => {
branchDispose = dispose;
return chunkTSQ7AKFT_cjs.untrack(() => matchedCase.render());
return chunkYSKF3VRA_cjs.untrack(() => matchedCase.render());
});

@@ -141,3 +141,3 @@ entry = { node, dispose: branchDispose };

};
chunkTSQ7AKFT_cjs.createEffect(() => {
chunkYSKF3VRA_cjs.createEffect(() => {
const node = children2();

@@ -161,5 +161,5 @@ removeMountedNode();

fragment2.appendChild(endMarker);
const [retryCount, setRetryCount] = chunkFPSLC62A_cjs.createSignal(0);
const [retryCount, setRetryCount] = chunkKH3F5NRU_cjs.createSignal(0);
let currentNode = null;
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
retryCount();

@@ -192,3 +192,3 @@ const parent2 = startMarker.parentNode;

fragment2.appendChild(endMarker);
const [pending, setPending] = chunkFPSLC62A_cjs.createSignal(0);
const [pending, setPending] = chunkKH3F5NRU_cjs.createSignal(0);
let currentNode = null;

@@ -205,9 +205,9 @@ let resolvedNode = null;

};
chunkTSQ7AKFT_cjs.pushSuspenseContext(ctx);
chunkYSKF3VRA_cjs.pushSuspenseContext(ctx);
try {
resolvedNode = children2();
} finally {
chunkTSQ7AKFT_cjs.popSuspenseContext();
chunkYSKF3VRA_cjs.popSuspenseContext();
}
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
const parent2 = startMarker.parentNode;

@@ -249,3 +249,3 @@ if (!parent2) return;

if (!hydrateFn) {
if (chunkTSQ7AKFT_cjs.__DEV__) console.warn(`[forma] No hydrate function for island "${componentName}" (id=${id})`);
if (chunkYSKF3VRA_cjs.__DEV__) console.warn(`[forma] No hydrate function for island "${componentName}" (id=${id})`);
root.setAttribute("data-forma-status", "error");

@@ -255,5 +255,2 @@ continue;

const trigger = root.getAttribute("data-forma-hydrate") || "load";
if (trigger === "interaction" || trigger === "idle") {
if (chunkTSQ7AKFT_cjs.__DEV__) console.warn(`[forma] Trigger "${trigger}" not yet implemented for island "${componentName}" (id=${id}), falling back to load`);
}
if (trigger === "visible") {

@@ -271,2 +268,17 @@ const observer = new IntersectionObserver(

observer.observe(root);
} else if (trigger === "idle") {
const hydrate = () => hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);
if (typeof requestIdleCallback === "function") {
requestIdleCallback(hydrate);
} else {
setTimeout(hydrate, 200);
}
} else if (trigger === "interaction") {
const hydrate = () => {
root.removeEventListener("pointerdown", hydrate, true);
root.removeEventListener("focusin", hydrate, true);
hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);
};
root.addEventListener("pointerdown", hydrate, { capture: true, once: true });
root.addEventListener("focusin", hydrate, { capture: true, once: true });
} else {

@@ -277,2 +289,16 @@ hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);

}
function deactivateIsland(el) {
const dispose = el.__formaDispose;
if (typeof dispose === "function") {
dispose();
delete el.__formaDispose;
el.setAttribute("data-forma-status", "disposed");
}
}
function deactivateAllIslands(root = document) {
const islands = root.querySelectorAll('[data-forma-status="active"]');
for (const island of islands) {
deactivateIsland(island);
}
}
function hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps) {

@@ -283,4 +309,4 @@ try {

let activeRoot = root;
chunkTSQ7AKFT_cjs.createRoot((dispose) => {
activeRoot = chunkTSQ7AKFT_cjs.hydrateIsland(() => hydrateFn(props), root);
chunkYSKF3VRA_cjs.createRoot((dispose) => {
activeRoot = chunkYSKF3VRA_cjs.hydrateIsland(() => hydrateFn(root, props), root);
activeRoot.__formaDispose = dispose;

@@ -290,3 +316,3 @@ });

} catch (err) {
if (chunkTSQ7AKFT_cjs.__DEV__) console.error(`[forma] Island "${componentName}" (id=${id}) failed:`, err);
if (chunkYSKF3VRA_cjs.__DEV__) console.error(`[forma] Island "${componentName}" (id=${id}) failed:`, err);
root.setAttribute("data-forma-status", "error");

@@ -339,3 +365,4 @@ }

cb();
} catch {
} catch (e) {
chunkYSKF3VRA_cjs.reportError(e, "onUnmount");
}

@@ -346,3 +373,4 @@ }

d();
} catch {
} catch (e) {
chunkYSKF3VRA_cjs.reportError(e, "component disposer");
}

@@ -361,3 +389,4 @@ }

}
} catch {
} catch (e) {
chunkYSKF3VRA_cjs.reportError(e, "onMount");
}

@@ -463,3 +492,3 @@ }

if (!pair) {
pair = chunkFPSLC62A_cjs.createSignal(initialValue);
pair = chunkKH3F5NRU_cjs.createSignal(initialValue);
signals.set(path, pair);

@@ -504,3 +533,3 @@ registerChild(path);

let result;
chunkTSQ7AKFT_cjs.batch(() => {
chunkYSKF3VRA_cjs.batch(() => {
const rawArgs = args.map(

@@ -619,7 +648,7 @@ (a) => a != null && typeof a === "object" && a[RAW] ? a[RAW] : a

function getCurrentSnapshot() {
return chunkTSQ7AKFT_cjs.untrack(() => deepClone(initial));
return chunkYSKF3VRA_cjs.untrack(() => deepClone(initial));
}
const setter = (partial) => {
const updates = typeof partial === "function" ? partial(getCurrentSnapshot()) : partial;
chunkTSQ7AKFT_cjs.batch(() => {
chunkYSKF3VRA_cjs.batch(() => {
for (const key of Object.keys(updates)) {

@@ -639,7 +668,7 @@ rootProxy[key] = updates[key];

let _cursor = 0;
const [stackSignal, setStackSignal] = chunkFPSLC62A_cjs.createValueSignal([..._stack]);
const [cursorSignal, setCursorSignal] = chunkFPSLC62A_cjs.createValueSignal(_cursor);
const [stackLenSignal, setStackLenSignal] = chunkFPSLC62A_cjs.createValueSignal(_stack.length);
const [stackSignal, setStackSignal] = chunkKH3F5NRU_cjs.createSignal([..._stack]);
const [cursorSignal, setCursorSignal] = chunkKH3F5NRU_cjs.createSignal(_cursor);
const [stackLenSignal, setStackLenSignal] = chunkKH3F5NRU_cjs.createSignal(_stack.length);
function syncSignals() {
chunkTSQ7AKFT_cjs.batch(() => {
chunkYSKF3VRA_cjs.batch(() => {
setStackSignal([..._stack]);

@@ -652,3 +681,3 @@ setCursorSignal(_cursor);

let isFirstRun = true;
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
const value = sourceGet();

@@ -721,3 +750,3 @@ if (isFirstRun) {

}
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
const value = sourceGet();

@@ -1127,5 +1156,5 @@ try {

function createFetch(url, options) {
const [data, setData] = chunkFPSLC62A_cjs.createSignal(null);
const [error, setError] = chunkFPSLC62A_cjs.createSignal(null);
const [loading, setLoading] = chunkFPSLC62A_cjs.createSignal(false);
const [data, setData] = chunkKH3F5NRU_cjs.createSignal(null);
const [error, setError] = chunkKH3F5NRU_cjs.createSignal(null);
const [loading, setLoading] = chunkKH3F5NRU_cjs.createSignal(false);
let currentController = null;

@@ -1180,3 +1209,3 @@ function resolveURL() {

if (typeof url === "function") {
chunkTSQ7AKFT_cjs.internalEffect(() => {
chunkYSKF3VRA_cjs.internalEffect(() => {
url();

@@ -1210,5 +1239,5 @@ execute();

function createSSE(url, options) {
const [data, setData] = chunkFPSLC62A_cjs.createSignal(null);
const [error, setError] = chunkFPSLC62A_cjs.createSignal(null);
const [connected, setConnected] = chunkFPSLC62A_cjs.createSignal(false);
const [data, setData] = chunkKH3F5NRU_cjs.createSignal(null);
const [error, setError] = chunkKH3F5NRU_cjs.createSignal(null);
const [connected, setConnected] = chunkKH3F5NRU_cjs.createSignal(false);
const source = new EventSource(url, {

@@ -1267,4 +1296,4 @@ withCredentials: options?.withCredentials ?? false

const maxReconnects = options?.maxReconnects ?? 5;
const [data, setData] = chunkFPSLC62A_cjs.createSignal(null);
const [status, setStatus] = chunkFPSLC62A_cjs.createSignal("connecting");
const [data, setData] = chunkKH3F5NRU_cjs.createSignal(null);
const [status, setStatus] = chunkKH3F5NRU_cjs.createSignal("connecting");
const handlers = /* @__PURE__ */ new Set();

@@ -1345,4 +1374,4 @@ let socket = null;

function createAction(serverFn, options) {
const [pending, setPending] = chunkFPSLC62A_cjs.createValueSignal(false);
const [error, setError] = chunkFPSLC62A_cjs.createValueSignal(void 0);
const [pending, setPending] = chunkKH3F5NRU_cjs.createSignal(false);
const [error, setError] = chunkKH3F5NRU_cjs.createSignal(void 0);
const action = async (...args) => {

@@ -1353,3 +1382,3 @@ setPending(true);

try {
chunkTSQ7AKFT_cjs.batch(() => options.optimistic(...args));
chunkYSKF3VRA_cjs.batch(() => options.optimistic(...args));
} catch {

@@ -1361,3 +1390,3 @@ }

if (options?.onSuccess) {
chunkTSQ7AKFT_cjs.batch(() => options.onSuccess(result, ...args));
chunkYSKF3VRA_cjs.batch(() => options.onSuccess(result, ...args));
}

@@ -1374,3 +1403,3 @@ if (options?.invalidates) {

try {
chunkTSQ7AKFT_cjs.batch(() => options.onError(err, ...args));
chunkYSKF3VRA_cjs.batch(() => options.onError(err, ...args));
} catch {

@@ -1543,87 +1572,83 @@ }

enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.Fragment; }
get: function () { return chunkYSKF3VRA_cjs.Fragment; }
});
Object.defineProperty(exports, "batch", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.batch; }
get: function () { return chunkYSKF3VRA_cjs.batch; }
});
Object.defineProperty(exports, "cleanup", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.cleanup; }
get: function () { return chunkYSKF3VRA_cjs.cleanup; }
});
Object.defineProperty(exports, "createEffect", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createEffect; }
get: function () { return chunkYSKF3VRA_cjs.createEffect; }
});
Object.defineProperty(exports, "createList", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createList; }
get: function () { return chunkYSKF3VRA_cjs.createList; }
});
Object.defineProperty(exports, "createMemo", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createMemo; }
get: function () { return chunkYSKF3VRA_cjs.createMemo; }
});
Object.defineProperty(exports, "createReducer", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createReducer; }
get: function () { return chunkYSKF3VRA_cjs.createReducer; }
});
Object.defineProperty(exports, "createRef", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createRef; }
get: function () { return chunkYSKF3VRA_cjs.createRef; }
});
Object.defineProperty(exports, "createResource", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createResource; }
get: function () { return chunkYSKF3VRA_cjs.createResource; }
});
Object.defineProperty(exports, "createRoot", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createRoot; }
get: function () { return chunkYSKF3VRA_cjs.createRoot; }
});
Object.defineProperty(exports, "createShow", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.createShow; }
get: function () { return chunkYSKF3VRA_cjs.createShow; }
});
Object.defineProperty(exports, "fragment", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.fragment; }
get: function () { return chunkYSKF3VRA_cjs.fragment; }
});
Object.defineProperty(exports, "h", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.h; }
get: function () { return chunkYSKF3VRA_cjs.h; }
});
Object.defineProperty(exports, "hydrateIsland", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.hydrateIsland; }
get: function () { return chunkYSKF3VRA_cjs.hydrateIsland; }
});
Object.defineProperty(exports, "longestIncreasingSubsequence", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.longestIncreasingSubsequence; }
});
Object.defineProperty(exports, "on", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.on; }
get: function () { return chunkYSKF3VRA_cjs.on; }
});
Object.defineProperty(exports, "onCleanup", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.onCleanup; }
get: function () { return chunkYSKF3VRA_cjs.onCleanup; }
});
Object.defineProperty(exports, "onError", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.onError; }
get: function () { return chunkYSKF3VRA_cjs.onError; }
});
Object.defineProperty(exports, "reconcileList", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.reconcileList; }
get: function () { return chunkYSKF3VRA_cjs.reconcileList; }
});
Object.defineProperty(exports, "untrack", {
enumerable: true,
get: function () { return chunkTSQ7AKFT_cjs.untrack; }
get: function () { return chunkYSKF3VRA_cjs.untrack; }
});
Object.defineProperty(exports, "createComputed", {
enumerable: true,
get: function () { return chunkFPSLC62A_cjs.createComputed; }
get: function () { return chunkKH3F5NRU_cjs.createComputed; }
});
Object.defineProperty(exports, "createSignal", {
enumerable: true,
get: function () { return chunkFPSLC62A_cjs.createSignal; }
get: function () { return chunkKH3F5NRU_cjs.createSignal; }
});

@@ -1655,2 +1680,4 @@ exports.$ = $;

exports.createWebSocket = createWebSocket;
exports.deactivateAllIslands = deactivateAllIslands;
exports.deactivateIsland = deactivateIsland;
exports.defineComponent = defineComponent;

@@ -1657,0 +1684,0 @@ exports.delegate = delegate;

@@ -19,2 +19,7 @@ /// <reference path="./jsx.d.ts" />

*
* Note: Unlike SolidJS's createComputed (which is an eager synchronous
* side effect), this is a lazy cached derivation — equivalent to
* SolidJS's createMemo. Both createComputed and createMemo in FormaJS
* are identical.
*
* ```ts

@@ -43,2 +48,7 @@ * const [count, setCount] = createSignal(0);

*
* Note: Unlike SolidJS's createComputed (which is an eager synchronous
* side effect), both createComputed and createMemo in FormaJS are lazy
* cached derivations — equivalent to SolidJS's createMemo. They are
* identical.
*
* The computation runs lazily and caches the result. It only recomputes

@@ -385,2 +395,3 @@ * when a signal it reads during computation changes.

*/
declare function h(tag: (props: Record<string, unknown>) => unknown, props?: Record<string, unknown> | null, ...children: unknown[]): Node;
declare function h(tag: typeof Fragment, props?: null, ...children: unknown[]): DocumentFragment;

@@ -480,8 +491,2 @@ declare function h(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): HTMLElement;

/**
* Find the longest increasing subsequence.
* Returns indices into the input array.
* O(n log n) time, O(n) space.
*/
declare function longestIncreasingSubsequence(arr: number[]): number[];
/**
* Reconcile a DOM parent's children to match a new array of items.

@@ -719,5 +724,17 @@ * Uses keyed reconciliation with LIS for minimum DOM operations.

*/
/** Function that creates a component's DOM tree (same for CSR and hydration). */
type IslandHydrateFn = (props: Record<string, unknown> | null) => unknown;
/**
* Function that hydrates an island.
*
* @param el The root element of the island (`[data-forma-island]`).
* Useful for layout measurement, focus management, CSS class
* toggling, third-party library init, or reading extra `data-*`
* attributes from the server-rendered shell.
* @param props Parsed props from `data-forma-props` (inline or script block),
* or `null` if no props were provided.
* @returns A component tree (from `h()` calls) for descriptor-based
* hydration, or `undefined` for imperative islands that set up
* their own effects.
*/
type IslandHydrateFn = (el: HTMLElement, props: Record<string, unknown> | null) => unknown;
/**
* Discover and activate all SSR-rendered islands on the page.

@@ -731,2 +748,17 @@ *

declare function activateIslands(registry: Record<string, IslandHydrateFn>): void;
/**
* Dispose a single island, tearing down its reactive root and all effects.
*
* Safe to call multiple times (idempotent). Sets `data-forma-status` to
* `"disposed"` so the island can be distinguished from active/error states.
*/
declare function deactivateIsland(el: HTMLElement): void;
/**
* Dispose ALL active islands under a root element (or the whole document).
*
* Use this when swapping module content — e.g., replacing the contents of
* a `<forma-stage>` Shadow DOM during AI generation. Prevents leaked effects
* and event listeners from accumulating across swaps.
*/
declare function deactivateAllIslands(root?: Element | Document): void;

@@ -1416,2 +1448,2 @@ /**

export { $, $$, $$serverFunction, type Action, type ActionOptions, Fragment, type IslandHydrateFn, type MutationResponse, type RPCRequest, type RPCResponse, activateIslands, addClass, applyRevalidation, batch, children, cleanup, closest, createAction, createBus, createComputed, createContext, createEffect, createErrorBoundary, createFetch, createHistory, createIndexedDB, createList, createLocalStorage, createMemo, createPortal, createRPCMiddleware, createReducer, createRef, createResource, createRoot, createSSE, createSessionStorage, createShow, createStore, createSuspense, createSwitch, createText, createWebSocket, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, fragment, getRegisteredEndpoints, getServerFunction, h, handleRPC, hydrateIsland, inject, longestIncreasingSubsequence, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, untrack, withRevalidation };
export { $, $$, $$serverFunction, type Action, type ActionOptions, Fragment, type IslandHydrateFn, type MutationResponse, type RPCRequest, type RPCResponse, activateIslands, addClass, applyRevalidation, batch, children, cleanup, closest, createAction, createBus, createComputed, createContext, createEffect, createErrorBoundary, createFetch, createHistory, createIndexedDB, createList, createLocalStorage, createMemo, createPortal, createRPCMiddleware, createReducer, createRef, createResource, createRoot, createSSE, createSessionStorage, createShow, createStore, createSuspense, createSwitch, createText, createWebSocket, deactivateAllIslands, deactivateIsland, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, fragment, getRegisteredEndpoints, getServerFunction, h, handleRPC, hydrateIsland, inject, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, untrack, withRevalidation };

@@ -19,2 +19,7 @@ /// <reference path="./jsx.d.ts" />

*
* Note: Unlike SolidJS's createComputed (which is an eager synchronous
* side effect), this is a lazy cached derivation — equivalent to
* SolidJS's createMemo. Both createComputed and createMemo in FormaJS
* are identical.
*
* ```ts

@@ -43,2 +48,7 @@ * const [count, setCount] = createSignal(0);

*
* Note: Unlike SolidJS's createComputed (which is an eager synchronous
* side effect), both createComputed and createMemo in FormaJS are lazy
* cached derivations — equivalent to SolidJS's createMemo. They are
* identical.
*
* The computation runs lazily and caches the result. It only recomputes

@@ -385,2 +395,3 @@ * when a signal it reads during computation changes.

*/
declare function h(tag: (props: Record<string, unknown>) => unknown, props?: Record<string, unknown> | null, ...children: unknown[]): Node;
declare function h(tag: typeof Fragment, props?: null, ...children: unknown[]): DocumentFragment;

@@ -480,8 +491,2 @@ declare function h(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): HTMLElement;

/**
* Find the longest increasing subsequence.
* Returns indices into the input array.
* O(n log n) time, O(n) space.
*/
declare function longestIncreasingSubsequence(arr: number[]): number[];
/**
* Reconcile a DOM parent's children to match a new array of items.

@@ -719,5 +724,17 @@ * Uses keyed reconciliation with LIS for minimum DOM operations.

*/
/** Function that creates a component's DOM tree (same for CSR and hydration). */
type IslandHydrateFn = (props: Record<string, unknown> | null) => unknown;
/**
* Function that hydrates an island.
*
* @param el The root element of the island (`[data-forma-island]`).
* Useful for layout measurement, focus management, CSS class
* toggling, third-party library init, or reading extra `data-*`
* attributes from the server-rendered shell.
* @param props Parsed props from `data-forma-props` (inline or script block),
* or `null` if no props were provided.
* @returns A component tree (from `h()` calls) for descriptor-based
* hydration, or `undefined` for imperative islands that set up
* their own effects.
*/
type IslandHydrateFn = (el: HTMLElement, props: Record<string, unknown> | null) => unknown;
/**
* Discover and activate all SSR-rendered islands on the page.

@@ -731,2 +748,17 @@ *

declare function activateIslands(registry: Record<string, IslandHydrateFn>): void;
/**
* Dispose a single island, tearing down its reactive root and all effects.
*
* Safe to call multiple times (idempotent). Sets `data-forma-status` to
* `"disposed"` so the island can be distinguished from active/error states.
*/
declare function deactivateIsland(el: HTMLElement): void;
/**
* Dispose ALL active islands under a root element (or the whole document).
*
* Use this when swapping module content — e.g., replacing the contents of
* a `<forma-stage>` Shadow DOM during AI generation. Prevents leaked effects
* and event listeners from accumulating across swaps.
*/
declare function deactivateAllIslands(root?: Element | Document): void;

@@ -1416,2 +1448,2 @@ /**

export { $, $$, $$serverFunction, type Action, type ActionOptions, Fragment, type IslandHydrateFn, type MutationResponse, type RPCRequest, type RPCResponse, activateIslands, addClass, applyRevalidation, batch, children, cleanup, closest, createAction, createBus, createComputed, createContext, createEffect, createErrorBoundary, createFetch, createHistory, createIndexedDB, createList, createLocalStorage, createMemo, createPortal, createRPCMiddleware, createReducer, createRef, createResource, createRoot, createSSE, createSessionStorage, createShow, createStore, createSuspense, createSwitch, createText, createWebSocket, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, fragment, getRegisteredEndpoints, getServerFunction, h, handleRPC, hydrateIsland, inject, longestIncreasingSubsequence, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, untrack, withRevalidation };
export { $, $$, $$serverFunction, type Action, type ActionOptions, Fragment, type IslandHydrateFn, type MutationResponse, type RPCRequest, type RPCResponse, activateIslands, addClass, applyRevalidation, batch, children, cleanup, closest, createAction, createBus, createComputed, createContext, createEffect, createErrorBoundary, createFetch, createHistory, createIndexedDB, createList, createLocalStorage, createMemo, createPortal, createRPCMiddleware, createReducer, createRef, createResource, createRoot, createSSE, createSessionStorage, createShow, createStore, createSuspense, createSwitch, createText, createWebSocket, deactivateAllIslands, deactivateIsland, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, fragment, getRegisteredEndpoints, getServerFunction, h, handleRPC, hydrateIsland, inject, mount, nextSibling, on, onCleanup, onError, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, reconcileList, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, untrack, withRevalidation };

@@ -1,5 +0,5 @@

import { internalEffect, createRoot, hydrateIsland, untrack, createEffect, pushSuspenseContext, popSuspenseContext, __DEV__, batch } from './chunk-5H52PKGF.js';
export { Fragment, batch, cleanup, createEffect, createList, createMemo, createReducer, createRef, createResource, createRoot, createShow, fragment, h, hydrateIsland, longestIncreasingSubsequence, on, onCleanup, onError, reconcileList, untrack } from './chunk-5H52PKGF.js';
import { createSignal, createValueSignal } from './chunk-KX5WRZH7.js';
export { createComputed, createSignal } from './chunk-KX5WRZH7.js';
import { internalEffect, createRoot, hydrateIsland, untrack, createEffect, pushSuspenseContext, popSuspenseContext, __DEV__, reportError, batch } from './chunk-TKGUHASG.js';
export { Fragment, batch, cleanup, createEffect, createList, createMemo, createReducer, createRef, createResource, createRoot, createShow, fragment, h, hydrateIsland, on, onCleanup, onError, reconcileList, untrack } from './chunk-TKGUHASG.js';
import { createSignal } from './chunk-DPSAVBCP.js';
export { createComputed, createSignal } from './chunk-DPSAVBCP.js';

@@ -246,5 +246,2 @@ // src/dom/text.ts

const trigger = root.getAttribute("data-forma-hydrate") || "load";
if (trigger === "interaction" || trigger === "idle") {
if (__DEV__) console.warn(`[forma] Trigger "${trigger}" not yet implemented for island "${componentName}" (id=${id}), falling back to load`);
}
if (trigger === "visible") {

@@ -262,2 +259,17 @@ const observer = new IntersectionObserver(

observer.observe(root);
} else if (trigger === "idle") {
const hydrate = () => hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);
if (typeof requestIdleCallback === "function") {
requestIdleCallback(hydrate);
} else {
setTimeout(hydrate, 200);
}
} else if (trigger === "interaction") {
const hydrate = () => {
root.removeEventListener("pointerdown", hydrate, true);
root.removeEventListener("focusin", hydrate, true);
hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);
};
root.addEventListener("pointerdown", hydrate, { capture: true, once: true });
root.addEventListener("focusin", hydrate, { capture: true, once: true });
} else {

@@ -268,2 +280,16 @@ hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps);

}
function deactivateIsland(el) {
const dispose = el.__formaDispose;
if (typeof dispose === "function") {
dispose();
delete el.__formaDispose;
el.setAttribute("data-forma-status", "disposed");
}
}
function deactivateAllIslands(root = document) {
const islands = root.querySelectorAll('[data-forma-status="active"]');
for (const island of islands) {
deactivateIsland(island);
}
}
function hydrateIslandRoot(root, id, componentName, hydrateFn, sharedProps) {

@@ -275,3 +301,3 @@ try {

createRoot((dispose) => {
activeRoot = hydrateIsland(() => hydrateFn(props), root);
activeRoot = hydrateIsland(() => hydrateFn(root, props), root);
activeRoot.__formaDispose = dispose;

@@ -329,3 +355,4 @@ });

cb();
} catch {
} catch (e) {
reportError(e, "onUnmount");
}

@@ -336,3 +363,4 @@ }

d();
} catch {
} catch (e) {
reportError(e, "component disposer");
}

@@ -351,3 +379,4 @@ }

}
} catch {
} catch (e) {
reportError(e, "onMount");
}

@@ -626,5 +655,5 @@ }

let _cursor = 0;
const [stackSignal, setStackSignal] = createValueSignal([..._stack]);
const [cursorSignal, setCursorSignal] = createValueSignal(_cursor);
const [stackLenSignal, setStackLenSignal] = createValueSignal(_stack.length);
const [stackSignal, setStackSignal] = createSignal([..._stack]);
const [cursorSignal, setCursorSignal] = createSignal(_cursor);
const [stackLenSignal, setStackLenSignal] = createSignal(_stack.length);
function syncSignals() {

@@ -1326,4 +1355,4 @@ batch(() => {

function createAction(serverFn, options) {
const [pending, setPending] = createValueSignal(false);
const [error, setError] = createValueSignal(void 0);
const [pending, setPending] = createSignal(false);
const [error, setError] = createSignal(void 0);
const action = async (...args) => {

@@ -1519,4 +1548,4 @@ setPending(true);

export { $, $$, $$serverFunction, activateIslands, addClass, applyRevalidation, children, closest, createAction, createBus, createContext, createErrorBoundary, createFetch, createHistory, createIndexedDB, createLocalStorage, createPortal, createRPCMiddleware, createSSE, createSessionStorage, createStore, createSuspense, createSwitch, createText, createWebSocket, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, getRegisteredEndpoints, getServerFunction, handleRPC, inject, mount, nextSibling, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, withRevalidation };
export { $, $$, $$serverFunction, activateIslands, addClass, applyRevalidation, children, closest, createAction, createBus, createContext, createErrorBoundary, createFetch, createHistory, createIndexedDB, createLocalStorage, createPortal, createRPCMiddleware, createSSE, createSessionStorage, createStore, createSuspense, createSwitch, createText, createWebSocket, deactivateAllIslands, deactivateIsland, defineComponent, delegate, disposeComponent, enableAutoRevalidation, fetchJSON, getRegisteredEndpoints, getServerFunction, handleRPC, inject, mount, nextSibling, onIntersect, onKey, onMount, onMutation, onResize, onUnmount, parent, persist, prevSibling, provide, registerResource, registerServerFunction, removeClass, renderIsland, renderLocal, setAttr, setHTML, setHTMLUnsafe, setStyle, setText, siblings, toggleClass, trackDisposer, unprovide, unregisterResource, withRevalidation };
//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map

@@ -83,7 +83,7 @@ 'use strict';

parts.push(html);
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got " + typeof html);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got " + typeof raw);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}

@@ -160,7 +160,7 @@ } else {

parts.push(html);
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got " + typeof html);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got " + typeof raw);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}

@@ -246,3 +246,7 @@ } else {

if (props?.["dangerouslySetInnerHTML"]) {
parts.push(props["dangerouslySetInnerHTML"].__html);
const raw = props["dangerouslySetInnerHTML"];
if (typeof raw !== "object" || raw == null || !("__html" in raw) || typeof raw.__html !== "string") {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
parts.push(raw.__html);
} else {

@@ -352,3 +356,7 @@ for (const child of children) renderSync(child, parts);

if (props?.["dangerouslySetInnerHTML"]) {
parts.push(props["dangerouslySetInnerHTML"].__html);
const raw = props["dangerouslySetInnerHTML"];
if (typeof raw !== "object" || raw == null || !("__html" in raw) || typeof raw.__html !== "string") {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
parts.push(raw.__html);
} else {

@@ -355,0 +363,0 @@ for (const child of children) renderStreamNode(child, parts, state);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/ssr/render.ts","../../src/ssr/ssr-reactive.ts","../../src/ssr/client-script.ts","../../src/ssr/stream.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["// Void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\n// Map of prop names to HTML attribute names\nexport const PROP_TO_ATTR: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n tabIndex: 'tabindex',\n};\n\n// Escape HTML entities\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n// Escape attribute values\nexport function escapeAttr(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nexport interface VNode {\n tag: string;\n props: Record<string, unknown> | null;\n children: unknown[];\n}\n\n/**\n * Server-side hyperscript — creates a virtual node instead of a DOM element.\n */\nexport function sh(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): VNode {\n return { tag, props: props ?? null, children };\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string.\n *\n * Uses an array buffer internally to avoid O(n^2) string concatenation\n * for large trees, then joins once at the end.\n *\n * Usage:\n * ```ts\n * import { renderToString, sh } from '@getforma/core/ssr';\n *\n * const html = renderToString(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()), // signal getters resolved synchronously\n * )\n * );\n * ```\n */\nexport function renderToString(node: unknown): string {\n const parts: string[] = [];\n renderToBuffer(node, parts);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer.\n * Avoids O(n^2) string concatenation for large trees.\n */\nfunction renderToBuffer(node: unknown, parts: string[]): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter) → resolve and render\n if (typeof node === 'function') { renderToBuffer(node(), parts); return; }\n\n // Array → render each\n if (Array.isArray(node)) {\n for (const child of node) renderToBuffer(child, parts);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got ' + typeof html);\n }\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof raw);\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBuffer(child, parts);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return v != null && typeof v === 'object' && 'tag' in v && 'children' in v;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration-aware rendering\n// ---------------------------------------------------------------------------\n\n/** Per-render hydration context — avoids shared module-level counter. */\ninterface HydrationContext {\n id: number;\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string with hydration markers.\n *\n * Like `renderToString`, but injects comment markers and `data-forma-h`\n * attributes so the client-side `hydrate()` function can adopt existing\n * DOM nodes without re-creating them.\n *\n * Each call creates its own hydration counter, so concurrent calls\n * (e.g. multiple SSR requests in the same process) produce independent,\n * non-overlapping hydration IDs.\n *\n * Marker types:\n * - `data-forma-h=\"N\"` — element boundary (attribute on the element)\n * - `<!--forma-t:N-->` / `<!--/forma-t:N-->` — reactive text boundary\n * - `<!--forma-l:N-->` / `<!--/forma-l:N-->` — list boundary\n *\n * Usage:\n * ```ts\n * import { renderToStringWithHydration, sh } from '@getforma/core/ssr';\n *\n * const html = renderToStringWithHydration(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()),\n * )\n * );\n * ```\n */\nexport function renderToStringWithHydration(node: unknown): string {\n const ctx: HydrationContext = { id: 0 };\n const parts: string[] = [];\n renderToBufferHydrated(node, parts, ctx);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer with hydration markers.\n * The `ctx` object carries the hydration counter so concurrent renders are isolated.\n */\nfunction renderToBufferHydrated(node: unknown, parts: string[], ctx: HydrationContext): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter / reactive text) → wrap with text markers\n if (typeof node === 'function') {\n const id = ctx.id++;\n parts.push(`<!--forma-t:${id}-->`);\n renderToBufferHydrated(node(), parts, ctx);\n parts.push(`<!--/forma-t:${id}-->`);\n return;\n }\n\n // Array → wrap with list markers\n if (Array.isArray(node)) {\n const id = ctx.id++;\n parts.push(`<!--forma-l:${id}-->`);\n for (const child of node) renderToBufferHydrated(child, parts, ctx);\n parts.push(`<!--/forma-l:${id}-->`);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const id = ctx.id++;\n const { tag, props, children } = node;\n\n // Add hydration data-attribute to element\n parts.push('<', tag, ` data-forma-h=\"${id}\"`);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got ' + typeof html);\n }\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof raw);\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBufferHydrated(child, parts, ctx);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\n","/**\n * SSR-only signal: just a value holder, no reactivity needed on server.\n */\nexport function ssrSignal<T>(initial: T): [get: () => T, set: (v: T) => void] {\n let value = initial;\n return [() => value, (v) => { value = v; }];\n}\n\nexport function ssrComputed<T>(fn: () => T): () => T {\n return fn; // On server, just call the function directly\n}\n","/**\n * FormaJS SSR - Client Swap Script\n *\n * Tiny inline script injected into the HTML stream that handles\n * out-of-order Suspense boundary resolution.\n *\n * When the server resolves a Suspense boundary, it sends:\n * <script>$FORMA_SWAP(\"forma-s:0\",\"<resolved html>\")</script>\n *\n * This script replaces the fallback placeholder with the resolved content.\n */\n\n/**\n * Returns the client-side swap script as a string, ready to be injected\n * into the HTML stream (typically right after <body> or before first Suspense).\n */\nexport function getSwapScript(): string {\n return `<script>\nfunction $FORMA_SWAP(id,html){\n var el=document.getElementById(id);\n if(el){\n var tpl=document.createElement('template');\n tpl.innerHTML=html;\n el.replaceWith(tpl.content);\n }\n}\n</script>`;\n}\n\n/**\n * Returns a script tag that swaps a specific Suspense boundary's content.\n * Called when an async resource resolves during streaming.\n */\nexport function getSwapTag(id: string, html: string): string {\n // Use JSON.stringify for both arguments to handle all edge cases:\n // backslashes, quotes, newlines, null bytes, </script>, unicode escapes\n return `<script>$FORMA_SWAP(${JSON.stringify(id)},${JSON.stringify(html)})</script>`;\n}\n","/**\n * FormaJS SSR - Streaming Renderer\n *\n * Implements true chunked HTML streaming with out-of-order Suspense resolution.\n *\n * How it works:\n * 1. Yields shell HTML immediately (opening tags, head, static content)\n * 2. When a Suspense boundary is encountered:\n * - Yields the fallback HTML with a placeholder: <div id=\"forma-s:N\" style=\"display:contents\">\n * - Continues rendering siblings without blocking\n * - When the async resource resolves, yields a swap script\n * 3. Suspense boundaries resolve independently in any order (out-of-order streaming)\n */\n\nimport { getSwapScript, getSwapTag } from './client-script.js';\nimport { escapeHtml, escapeAttr, isVNode, VOID_ELEMENTS, PROP_TO_ATTR, type VNode } from './render.js';\n\n// ---------------------------------------------------------------------------\n// Suspense boundary tracking\n// ---------------------------------------------------------------------------\n\ninterface PendingBoundary {\n id: string;\n promise: Promise<string>;\n}\n\n/** Per-render mutable state, scoped to a single renderToStreamNew call. */\ninterface StreamState {\n suspenseCounter: number;\n pendingBoundaries: PendingBoundary[];\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous render to buffer (for non-async content)\n// ---------------------------------------------------------------------------\n\nfunction renderSync(node: unknown, parts: string[]): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderSync(node(), parts); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderSync(child, parts);\n return;\n }\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n parts.push((props['dangerouslySetInnerHTML'] as { __html: string }).__html);\n } else {\n for (const child of children) renderSync(child, parts);\n }\n parts.push('</', tag, '>');\n return;\n }\n parts.push(escapeHtml(String(node)));\n}\n\n// ---------------------------------------------------------------------------\n// Suspense VNode detection\n// ---------------------------------------------------------------------------\n\n/**\n * A Suspense boundary VNode has a special shape:\n * { tag: 'forma-suspense', props: { fallback: VNode }, children: [asyncChildren] }\n *\n * Or it can be created via:\n * shSuspense(fallbackVNode, () => asyncContent)\n */\nexport interface SuspenseVNode {\n tag: 'forma-suspense';\n props: { fallback: unknown };\n children: [() => Promise<unknown>];\n}\n\nfunction isSuspenseVNode(v: unknown): v is SuspenseVNode {\n return isVNode(v) && v.tag === 'forma-suspense';\n}\n\n/**\n * Create a server-side Suspense VNode for streaming SSR.\n */\nexport function shSuspense(fallback: unknown, asyncChildren: () => Promise<unknown>): SuspenseVNode {\n return {\n tag: 'forma-suspense',\n props: { fallback },\n children: [asyncChildren],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming renderer\n// ---------------------------------------------------------------------------\n\nexport interface StreamOptions {\n /** Script to bootstrap the client-side app (e.g. <script src=\"/app.js\"></script>) */\n bootstrapScript?: string;\n /** Whether to inject the $FORMA_SWAP client script (default: true) */\n injectSwapScript?: boolean;\n}\n\n/**\n * Render a FormaJS virtual tree to a stream of HTML chunks.\n *\n * Yields HTML progressively:\n * - Static content is yielded immediately\n * - Suspense boundaries yield their fallback, then resolve later\n * - Resolved Suspense boundaries yield swap scripts\n *\n * Usage:\n * ```ts\n * import { renderToStream, shSuspense, sh } from '@getforma/core/ssr';\n *\n * const stream = renderToStream(\n * sh('html', null,\n * sh('body', null,\n * sh('h1', null, 'Hello'),\n * shSuspense(\n * sh('div', null, 'Loading...'),\n * async () => {\n * const data = await fetchData();\n * return sh('div', null, data.name);\n * },\n * ),\n * ),\n * ),\n * );\n *\n * for await (const chunk of stream) {\n * response.write(chunk);\n * }\n * ```\n */\nexport async function* renderToStreamNew(\n node: unknown,\n options?: StreamOptions,\n): AsyncGenerator<string> {\n // Per-render state — scoped to this generator invocation\n const state: StreamState = {\n suspenseCounter: 0,\n pendingBoundaries: [],\n };\n\n const injectSwap = options?.injectSwapScript !== false;\n\n // Inject the swap script first (if there could be Suspense boundaries)\n if (injectSwap) {\n yield getSwapScript();\n }\n\n // Render the main tree synchronously, collecting Suspense boundaries\n const mainParts: string[] = [];\n renderStreamNode(node, mainParts, state);\n yield mainParts.join('');\n\n // Yield bootstrap script if provided\n if (options?.bootstrapScript) {\n yield options.bootstrapScript;\n }\n\n // Wait for and yield all pending Suspense boundaries\n // Each resolves independently (out-of-order)\n while (state.pendingBoundaries.length > 0) {\n const pending = [...state.pendingBoundaries];\n state.pendingBoundaries = [];\n\n // Race all pending boundaries — yield each as it resolves\n const results = await Promise.allSettled(\n pending.map(async (boundary) => {\n const html = await boundary.promise;\n return { id: boundary.id, html };\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n yield getSwapTag(result.value.id, result.value.html);\n }\n // On rejection, the fallback stays visible (no swap)\n }\n }\n}\n\n/**\n * Render a node synchronously. If a Suspense boundary is encountered,\n * render the fallback inline and queue the async resolution.\n */\nfunction renderStreamNode(node: unknown, parts: string[], state: StreamState): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderStreamNode(node(), parts, state); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderStreamNode(child, parts, state);\n return;\n }\n\n // Suspense boundary: render fallback, queue async resolution\n if (isSuspenseVNode(node)) {\n const id = `forma-s:${state.suspenseCounter++}`;\n const fallback = node.props.fallback;\n const asyncFn = node.children[0]!;\n\n // Render fallback inside a replaceable container\n parts.push(`<div id=\"${id}\" style=\"display:contents\">`);\n renderSync(fallback, parts);\n parts.push('</div>');\n\n // Queue the async resolution\n const promise = asyncFn().then((resolved: unknown) => {\n const resolvedParts: string[] = [];\n renderSync(resolved, resolvedParts);\n return resolvedParts.join('');\n });\n state.pendingBoundaries.push({ id, promise });\n return;\n }\n\n // Regular VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'fallback') continue; // skip internal suspense props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n parts.push((props['dangerouslySetInnerHTML'] as { __html: string }).__html);\n } else {\n for (const child of children) renderStreamNode(child, parts, state);\n }\n parts.push('</', tag, '>');\n return;\n }\n\n parts.push(escapeHtml(String(node)));\n}\n"]}
{"version":3,"sources":["../../src/ssr/render.ts","../../src/ssr/ssr-reactive.ts","../../src/ssr/client-script.ts","../../src/ssr/stream.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["// Void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\n// Map of prop names to HTML attribute names\nexport const PROP_TO_ATTR: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n tabIndex: 'tabindex',\n};\n\n// Escape HTML entities\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n// Escape attribute values\nexport function escapeAttr(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nexport interface VNode {\n tag: string;\n props: Record<string, unknown> | null;\n children: unknown[];\n}\n\n/**\n * Server-side hyperscript — creates a virtual node instead of a DOM element.\n */\nexport function sh(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): VNode {\n return { tag, props: props ?? null, children };\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string.\n *\n * Uses an array buffer internally to avoid O(n^2) string concatenation\n * for large trees, then joins once at the end.\n *\n * Usage:\n * ```ts\n * import { renderToString, sh } from '@getforma/core/ssr';\n *\n * const html = renderToString(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()), // signal getters resolved synchronously\n * )\n * );\n * ```\n */\nexport function renderToString(node: unknown): string {\n const parts: string[] = [];\n renderToBuffer(node, parts);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer.\n * Avoids O(n^2) string concatenation for large trees.\n */\nfunction renderToBuffer(node: unknown, parts: string[]): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter) → resolve and render\n if (typeof node === 'function') { renderToBuffer(node(), parts); return; }\n\n // Array → render each\n if (Array.isArray(node)) {\n for (const child of node) renderToBuffer(child, parts);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBuffer(child, parts);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return v != null && typeof v === 'object' && 'tag' in v && 'children' in v;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration-aware rendering\n// ---------------------------------------------------------------------------\n\n/** Per-render hydration context — avoids shared module-level counter. */\ninterface HydrationContext {\n id: number;\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string with hydration markers.\n *\n * Like `renderToString`, but injects comment markers and `data-forma-h`\n * attributes so the client-side `hydrate()` function can adopt existing\n * DOM nodes without re-creating them.\n *\n * Each call creates its own hydration counter, so concurrent calls\n * (e.g. multiple SSR requests in the same process) produce independent,\n * non-overlapping hydration IDs.\n *\n * Marker types:\n * - `data-forma-h=\"N\"` — element boundary (attribute on the element)\n * - `<!--forma-t:N-->` / `<!--/forma-t:N-->` — reactive text boundary\n * - `<!--forma-l:N-->` / `<!--/forma-l:N-->` — list boundary\n *\n * Usage:\n * ```ts\n * import { renderToStringWithHydration, sh } from '@getforma/core/ssr';\n *\n * const html = renderToStringWithHydration(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()),\n * )\n * );\n * ```\n */\nexport function renderToStringWithHydration(node: unknown): string {\n const ctx: HydrationContext = { id: 0 };\n const parts: string[] = [];\n renderToBufferHydrated(node, parts, ctx);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer with hydration markers.\n * The `ctx` object carries the hydration counter so concurrent renders are isolated.\n */\nfunction renderToBufferHydrated(node: unknown, parts: string[], ctx: HydrationContext): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter / reactive text) → wrap with text markers\n if (typeof node === 'function') {\n const id = ctx.id++;\n parts.push(`<!--forma-t:${id}-->`);\n renderToBufferHydrated(node(), parts, ctx);\n parts.push(`<!--/forma-t:${id}-->`);\n return;\n }\n\n // Array → wrap with list markers\n if (Array.isArray(node)) {\n const id = ctx.id++;\n parts.push(`<!--forma-l:${id}-->`);\n for (const child of node) renderToBufferHydrated(child, parts, ctx);\n parts.push(`<!--/forma-l:${id}-->`);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const id = ctx.id++;\n const { tag, props, children } = node;\n\n // Add hydration data-attribute to element\n parts.push('<', tag, ` data-forma-h=\"${id}\"`);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBufferHydrated(child, parts, ctx);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\n","/**\n * SSR-only signal: just a value holder, no reactivity needed on server.\n */\nexport function ssrSignal<T>(initial: T): [get: () => T, set: (v: T) => void] {\n let value = initial;\n return [() => value, (v) => { value = v; }];\n}\n\nexport function ssrComputed<T>(fn: () => T): () => T {\n return fn; // On server, just call the function directly\n}\n","/**\n * FormaJS SSR - Client Swap Script\n *\n * Tiny inline script injected into the HTML stream that handles\n * out-of-order Suspense boundary resolution.\n *\n * When the server resolves a Suspense boundary, it sends:\n * <script>$FORMA_SWAP(\"forma-s:0\",\"<resolved html>\")</script>\n *\n * This script replaces the fallback placeholder with the resolved content.\n */\n\n/**\n * Returns the client-side swap script as a string, ready to be injected\n * into the HTML stream (typically right after <body> or before first Suspense).\n */\nexport function getSwapScript(): string {\n return `<script>\nfunction $FORMA_SWAP(id,html){\n var el=document.getElementById(id);\n if(el){\n var tpl=document.createElement('template');\n tpl.innerHTML=html;\n el.replaceWith(tpl.content);\n }\n}\n</script>`;\n}\n\n/**\n * Returns a script tag that swaps a specific Suspense boundary's content.\n * Called when an async resource resolves during streaming.\n */\nexport function getSwapTag(id: string, html: string): string {\n // Use JSON.stringify for both arguments to handle all edge cases:\n // backslashes, quotes, newlines, null bytes, </script>, unicode escapes\n return `<script>$FORMA_SWAP(${JSON.stringify(id)},${JSON.stringify(html)})</script>`;\n}\n","/**\n * FormaJS SSR - Streaming Renderer\n *\n * Implements true chunked HTML streaming with out-of-order Suspense resolution.\n *\n * How it works:\n * 1. Yields shell HTML immediately (opening tags, head, static content)\n * 2. When a Suspense boundary is encountered:\n * - Yields the fallback HTML with a placeholder: <div id=\"forma-s:N\" style=\"display:contents\">\n * - Continues rendering siblings without blocking\n * - When the async resource resolves, yields a swap script\n * 3. Suspense boundaries resolve independently in any order (out-of-order streaming)\n */\n\nimport { getSwapScript, getSwapTag } from './client-script.js';\nimport { escapeHtml, escapeAttr, isVNode, VOID_ELEMENTS, PROP_TO_ATTR, type VNode } from './render.js';\n\n// ---------------------------------------------------------------------------\n// Suspense boundary tracking\n// ---------------------------------------------------------------------------\n\ninterface PendingBoundary {\n id: string;\n promise: Promise<string>;\n}\n\n/** Per-render mutable state, scoped to a single renderToStreamNew call. */\ninterface StreamState {\n suspenseCounter: number;\n pendingBoundaries: PendingBoundary[];\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous render to buffer (for non-async content)\n// ---------------------------------------------------------------------------\n\nfunction renderSync(node: unknown, parts: string[]): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderSync(node(), parts); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderSync(child, parts);\n return;\n }\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw !== 'object' || raw == null || !('__html' in raw) || typeof (raw as { __html: unknown }).__html !== 'string') {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n parts.push((raw as { __html: string }).__html);\n } else {\n for (const child of children) renderSync(child, parts);\n }\n parts.push('</', tag, '>');\n return;\n }\n parts.push(escapeHtml(String(node)));\n}\n\n// ---------------------------------------------------------------------------\n// Suspense VNode detection\n// ---------------------------------------------------------------------------\n\n/**\n * A Suspense boundary VNode has a special shape:\n * { tag: 'forma-suspense', props: { fallback: VNode }, children: [asyncChildren] }\n *\n * Or it can be created via:\n * shSuspense(fallbackVNode, () => asyncContent)\n */\nexport interface SuspenseVNode {\n tag: 'forma-suspense';\n props: { fallback: unknown };\n children: [() => Promise<unknown>];\n}\n\nfunction isSuspenseVNode(v: unknown): v is SuspenseVNode {\n return isVNode(v) && v.tag === 'forma-suspense';\n}\n\n/**\n * Create a server-side Suspense VNode for streaming SSR.\n */\nexport function shSuspense(fallback: unknown, asyncChildren: () => Promise<unknown>): SuspenseVNode {\n return {\n tag: 'forma-suspense',\n props: { fallback },\n children: [asyncChildren],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming renderer\n// ---------------------------------------------------------------------------\n\nexport interface StreamOptions {\n /** Script to bootstrap the client-side app (e.g. <script src=\"/app.js\"></script>) */\n bootstrapScript?: string;\n /** Whether to inject the $FORMA_SWAP client script (default: true) */\n injectSwapScript?: boolean;\n}\n\n/**\n * Render a FormaJS virtual tree to a stream of HTML chunks.\n *\n * Yields HTML progressively:\n * - Static content is yielded immediately\n * - Suspense boundaries yield their fallback, then resolve later\n * - Resolved Suspense boundaries yield swap scripts\n *\n * Usage:\n * ```ts\n * import { renderToStream, shSuspense, sh } from '@getforma/core/ssr';\n *\n * const stream = renderToStream(\n * sh('html', null,\n * sh('body', null,\n * sh('h1', null, 'Hello'),\n * shSuspense(\n * sh('div', null, 'Loading...'),\n * async () => {\n * const data = await fetchData();\n * return sh('div', null, data.name);\n * },\n * ),\n * ),\n * ),\n * );\n *\n * for await (const chunk of stream) {\n * response.write(chunk);\n * }\n * ```\n */\nexport async function* renderToStreamNew(\n node: unknown,\n options?: StreamOptions,\n): AsyncGenerator<string> {\n // Per-render state — scoped to this generator invocation\n const state: StreamState = {\n suspenseCounter: 0,\n pendingBoundaries: [],\n };\n\n const injectSwap = options?.injectSwapScript !== false;\n\n // Inject the swap script first (if there could be Suspense boundaries)\n if (injectSwap) {\n yield getSwapScript();\n }\n\n // Render the main tree synchronously, collecting Suspense boundaries\n const mainParts: string[] = [];\n renderStreamNode(node, mainParts, state);\n yield mainParts.join('');\n\n // Yield bootstrap script if provided\n if (options?.bootstrapScript) {\n yield options.bootstrapScript;\n }\n\n // Wait for and yield all pending Suspense boundaries\n // Each resolves independently (out-of-order)\n while (state.pendingBoundaries.length > 0) {\n const pending = [...state.pendingBoundaries];\n state.pendingBoundaries = [];\n\n // Race all pending boundaries — yield each as it resolves\n const results = await Promise.allSettled(\n pending.map(async (boundary) => {\n const html = await boundary.promise;\n return { id: boundary.id, html };\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n yield getSwapTag(result.value.id, result.value.html);\n }\n // On rejection, the fallback stays visible (no swap)\n }\n }\n}\n\n/**\n * Render a node synchronously. If a Suspense boundary is encountered,\n * render the fallback inline and queue the async resolution.\n */\nfunction renderStreamNode(node: unknown, parts: string[], state: StreamState): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderStreamNode(node(), parts, state); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderStreamNode(child, parts, state);\n return;\n }\n\n // Suspense boundary: render fallback, queue async resolution\n if (isSuspenseVNode(node)) {\n const id = `forma-s:${state.suspenseCounter++}`;\n const fallback = node.props.fallback;\n const asyncFn = node.children[0]!;\n\n // Render fallback inside a replaceable container\n parts.push(`<div id=\"${id}\" style=\"display:contents\">`);\n renderSync(fallback, parts);\n parts.push('</div>');\n\n // Queue the async resolution\n const promise = asyncFn().then((resolved: unknown) => {\n const resolvedParts: string[] = [];\n renderSync(resolved, resolvedParts);\n return resolvedParts.join('');\n });\n state.pendingBoundaries.push({ id, promise });\n return;\n }\n\n // Regular VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'fallback') continue; // skip internal suspense props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw !== 'object' || raw == null || !('__html' in raw) || typeof (raw as { __html: unknown }).__html !== 'string') {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n parts.push((raw as { __html: string }).__html);\n } else {\n for (const child of children) renderStreamNode(child, parts, state);\n }\n parts.push('</', tag, '>');\n return;\n }\n\n parts.push(escapeHtml(String(node)));\n}\n"]}

@@ -81,7 +81,7 @@ // src/ssr/render.ts

parts.push(html);
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got " + typeof html);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got " + typeof raw);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}

@@ -158,7 +158,7 @@ } else {

parts.push(html);
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got " + typeof html);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
} else if (typeof console !== "undefined") {
console.warn("[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got " + typeof raw);
} else {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}

@@ -244,3 +244,7 @@ } else {

if (props?.["dangerouslySetInnerHTML"]) {
parts.push(props["dangerouslySetInnerHTML"].__html);
const raw = props["dangerouslySetInnerHTML"];
if (typeof raw !== "object" || raw == null || !("__html" in raw) || typeof raw.__html !== "string") {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
parts.push(raw.__html);
} else {

@@ -350,3 +354,7 @@ for (const child of children) renderSync(child, parts);

if (props?.["dangerouslySetInnerHTML"]) {
parts.push(props["dangerouslySetInnerHTML"].__html);
const raw = props["dangerouslySetInnerHTML"];
if (typeof raw !== "object" || raw == null || !("__html" in raw) || typeof raw.__html !== "string") {
throw new TypeError("dangerouslySetInnerHTML must be { __html: string }");
}
parts.push(raw.__html);
} else {

@@ -353,0 +361,0 @@ for (const child of children) renderStreamNode(child, parts, state);

@@ -1,1 +0,1 @@

{"version":3,"sources":["../../src/ssr/render.ts","../../src/ssr/ssr-reactive.ts","../../src/ssr/client-script.ts","../../src/ssr/stream.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\n// Map of prop names to HTML attribute names\nexport const PROP_TO_ATTR: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n tabIndex: 'tabindex',\n};\n\n// Escape HTML entities\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n// Escape attribute values\nexport function escapeAttr(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nexport interface VNode {\n tag: string;\n props: Record<string, unknown> | null;\n children: unknown[];\n}\n\n/**\n * Server-side hyperscript — creates a virtual node instead of a DOM element.\n */\nexport function sh(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): VNode {\n return { tag, props: props ?? null, children };\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string.\n *\n * Uses an array buffer internally to avoid O(n^2) string concatenation\n * for large trees, then joins once at the end.\n *\n * Usage:\n * ```ts\n * import { renderToString, sh } from '@getforma/core/ssr';\n *\n * const html = renderToString(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()), // signal getters resolved synchronously\n * )\n * );\n * ```\n */\nexport function renderToString(node: unknown): string {\n const parts: string[] = [];\n renderToBuffer(node, parts);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer.\n * Avoids O(n^2) string concatenation for large trees.\n */\nfunction renderToBuffer(node: unknown, parts: string[]): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter) → resolve and render\n if (typeof node === 'function') { renderToBuffer(node(), parts); return; }\n\n // Array → render each\n if (Array.isArray(node)) {\n for (const child of node) renderToBuffer(child, parts);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got ' + typeof html);\n }\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof raw);\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBuffer(child, parts);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return v != null && typeof v === 'object' && 'tag' in v && 'children' in v;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration-aware rendering\n// ---------------------------------------------------------------------------\n\n/** Per-render hydration context — avoids shared module-level counter. */\ninterface HydrationContext {\n id: number;\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string with hydration markers.\n *\n * Like `renderToString`, but injects comment markers and `data-forma-h`\n * attributes so the client-side `hydrate()` function can adopt existing\n * DOM nodes without re-creating them.\n *\n * Each call creates its own hydration counter, so concurrent calls\n * (e.g. multiple SSR requests in the same process) produce independent,\n * non-overlapping hydration IDs.\n *\n * Marker types:\n * - `data-forma-h=\"N\"` — element boundary (attribute on the element)\n * - `<!--forma-t:N-->` / `<!--/forma-t:N-->` — reactive text boundary\n * - `<!--forma-l:N-->` / `<!--/forma-l:N-->` — list boundary\n *\n * Usage:\n * ```ts\n * import { renderToStringWithHydration, sh } from '@getforma/core/ssr';\n *\n * const html = renderToStringWithHydration(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()),\n * )\n * );\n * ```\n */\nexport function renderToStringWithHydration(node: unknown): string {\n const ctx: HydrationContext = { id: 0 };\n const parts: string[] = [];\n renderToBufferHydrated(node, parts, ctx);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer with hydration markers.\n * The `ctx` object carries the hydration counter so concurrent renders are isolated.\n */\nfunction renderToBufferHydrated(node: unknown, parts: string[], ctx: HydrationContext): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter / reactive text) → wrap with text markers\n if (typeof node === 'function') {\n const id = ctx.id++;\n parts.push(`<!--forma-t:${id}-->`);\n renderToBufferHydrated(node(), parts, ctx);\n parts.push(`<!--/forma-t:${id}-->`);\n return;\n }\n\n // Array → wrap with list markers\n if (Array.isArray(node)) {\n const id = ctx.id++;\n parts.push(`<!--forma-l:${id}-->`);\n for (const child of node) renderToBufferHydrated(child, parts, ctx);\n parts.push(`<!--/forma-l:${id}-->`);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const id = ctx.id++;\n const { tag, props, children } = node;\n\n // Add hydration data-attribute to element\n parts.push('<', tag, ` data-forma-h=\"${id}\"`);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML.__html must be a string, got ' + typeof html);\n }\n } else if (typeof console !== 'undefined') {\n console.warn('[FormaJS SSR] dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof raw);\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBufferHydrated(child, parts, ctx);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\n","/**\n * SSR-only signal: just a value holder, no reactivity needed on server.\n */\nexport function ssrSignal<T>(initial: T): [get: () => T, set: (v: T) => void] {\n let value = initial;\n return [() => value, (v) => { value = v; }];\n}\n\nexport function ssrComputed<T>(fn: () => T): () => T {\n return fn; // On server, just call the function directly\n}\n","/**\n * FormaJS SSR - Client Swap Script\n *\n * Tiny inline script injected into the HTML stream that handles\n * out-of-order Suspense boundary resolution.\n *\n * When the server resolves a Suspense boundary, it sends:\n * <script>$FORMA_SWAP(\"forma-s:0\",\"<resolved html>\")</script>\n *\n * This script replaces the fallback placeholder with the resolved content.\n */\n\n/**\n * Returns the client-side swap script as a string, ready to be injected\n * into the HTML stream (typically right after <body> or before first Suspense).\n */\nexport function getSwapScript(): string {\n return `<script>\nfunction $FORMA_SWAP(id,html){\n var el=document.getElementById(id);\n if(el){\n var tpl=document.createElement('template');\n tpl.innerHTML=html;\n el.replaceWith(tpl.content);\n }\n}\n</script>`;\n}\n\n/**\n * Returns a script tag that swaps a specific Suspense boundary's content.\n * Called when an async resource resolves during streaming.\n */\nexport function getSwapTag(id: string, html: string): string {\n // Use JSON.stringify for both arguments to handle all edge cases:\n // backslashes, quotes, newlines, null bytes, </script>, unicode escapes\n return `<script>$FORMA_SWAP(${JSON.stringify(id)},${JSON.stringify(html)})</script>`;\n}\n","/**\n * FormaJS SSR - Streaming Renderer\n *\n * Implements true chunked HTML streaming with out-of-order Suspense resolution.\n *\n * How it works:\n * 1. Yields shell HTML immediately (opening tags, head, static content)\n * 2. When a Suspense boundary is encountered:\n * - Yields the fallback HTML with a placeholder: <div id=\"forma-s:N\" style=\"display:contents\">\n * - Continues rendering siblings without blocking\n * - When the async resource resolves, yields a swap script\n * 3. Suspense boundaries resolve independently in any order (out-of-order streaming)\n */\n\nimport { getSwapScript, getSwapTag } from './client-script.js';\nimport { escapeHtml, escapeAttr, isVNode, VOID_ELEMENTS, PROP_TO_ATTR, type VNode } from './render.js';\n\n// ---------------------------------------------------------------------------\n// Suspense boundary tracking\n// ---------------------------------------------------------------------------\n\ninterface PendingBoundary {\n id: string;\n promise: Promise<string>;\n}\n\n/** Per-render mutable state, scoped to a single renderToStreamNew call. */\ninterface StreamState {\n suspenseCounter: number;\n pendingBoundaries: PendingBoundary[];\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous render to buffer (for non-async content)\n// ---------------------------------------------------------------------------\n\nfunction renderSync(node: unknown, parts: string[]): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderSync(node(), parts); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderSync(child, parts);\n return;\n }\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n parts.push((props['dangerouslySetInnerHTML'] as { __html: string }).__html);\n } else {\n for (const child of children) renderSync(child, parts);\n }\n parts.push('</', tag, '>');\n return;\n }\n parts.push(escapeHtml(String(node)));\n}\n\n// ---------------------------------------------------------------------------\n// Suspense VNode detection\n// ---------------------------------------------------------------------------\n\n/**\n * A Suspense boundary VNode has a special shape:\n * { tag: 'forma-suspense', props: { fallback: VNode }, children: [asyncChildren] }\n *\n * Or it can be created via:\n * shSuspense(fallbackVNode, () => asyncContent)\n */\nexport interface SuspenseVNode {\n tag: 'forma-suspense';\n props: { fallback: unknown };\n children: [() => Promise<unknown>];\n}\n\nfunction isSuspenseVNode(v: unknown): v is SuspenseVNode {\n return isVNode(v) && v.tag === 'forma-suspense';\n}\n\n/**\n * Create a server-side Suspense VNode for streaming SSR.\n */\nexport function shSuspense(fallback: unknown, asyncChildren: () => Promise<unknown>): SuspenseVNode {\n return {\n tag: 'forma-suspense',\n props: { fallback },\n children: [asyncChildren],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming renderer\n// ---------------------------------------------------------------------------\n\nexport interface StreamOptions {\n /** Script to bootstrap the client-side app (e.g. <script src=\"/app.js\"></script>) */\n bootstrapScript?: string;\n /** Whether to inject the $FORMA_SWAP client script (default: true) */\n injectSwapScript?: boolean;\n}\n\n/**\n * Render a FormaJS virtual tree to a stream of HTML chunks.\n *\n * Yields HTML progressively:\n * - Static content is yielded immediately\n * - Suspense boundaries yield their fallback, then resolve later\n * - Resolved Suspense boundaries yield swap scripts\n *\n * Usage:\n * ```ts\n * import { renderToStream, shSuspense, sh } from '@getforma/core/ssr';\n *\n * const stream = renderToStream(\n * sh('html', null,\n * sh('body', null,\n * sh('h1', null, 'Hello'),\n * shSuspense(\n * sh('div', null, 'Loading...'),\n * async () => {\n * const data = await fetchData();\n * return sh('div', null, data.name);\n * },\n * ),\n * ),\n * ),\n * );\n *\n * for await (const chunk of stream) {\n * response.write(chunk);\n * }\n * ```\n */\nexport async function* renderToStreamNew(\n node: unknown,\n options?: StreamOptions,\n): AsyncGenerator<string> {\n // Per-render state — scoped to this generator invocation\n const state: StreamState = {\n suspenseCounter: 0,\n pendingBoundaries: [],\n };\n\n const injectSwap = options?.injectSwapScript !== false;\n\n // Inject the swap script first (if there could be Suspense boundaries)\n if (injectSwap) {\n yield getSwapScript();\n }\n\n // Render the main tree synchronously, collecting Suspense boundaries\n const mainParts: string[] = [];\n renderStreamNode(node, mainParts, state);\n yield mainParts.join('');\n\n // Yield bootstrap script if provided\n if (options?.bootstrapScript) {\n yield options.bootstrapScript;\n }\n\n // Wait for and yield all pending Suspense boundaries\n // Each resolves independently (out-of-order)\n while (state.pendingBoundaries.length > 0) {\n const pending = [...state.pendingBoundaries];\n state.pendingBoundaries = [];\n\n // Race all pending boundaries — yield each as it resolves\n const results = await Promise.allSettled(\n pending.map(async (boundary) => {\n const html = await boundary.promise;\n return { id: boundary.id, html };\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n yield getSwapTag(result.value.id, result.value.html);\n }\n // On rejection, the fallback stays visible (no swap)\n }\n }\n}\n\n/**\n * Render a node synchronously. If a Suspense boundary is encountered,\n * render the fallback inline and queue the async resolution.\n */\nfunction renderStreamNode(node: unknown, parts: string[], state: StreamState): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderStreamNode(node(), parts, state); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderStreamNode(child, parts, state);\n return;\n }\n\n // Suspense boundary: render fallback, queue async resolution\n if (isSuspenseVNode(node)) {\n const id = `forma-s:${state.suspenseCounter++}`;\n const fallback = node.props.fallback;\n const asyncFn = node.children[0]!;\n\n // Render fallback inside a replaceable container\n parts.push(`<div id=\"${id}\" style=\"display:contents\">`);\n renderSync(fallback, parts);\n parts.push('</div>');\n\n // Queue the async resolution\n const promise = asyncFn().then((resolved: unknown) => {\n const resolvedParts: string[] = [];\n renderSync(resolved, resolvedParts);\n return resolvedParts.join('');\n });\n state.pendingBoundaries.push({ id, promise });\n return;\n }\n\n // Regular VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'fallback') continue; // skip internal suspense props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n parts.push((props['dangerouslySetInnerHTML'] as { __html: string }).__html);\n } else {\n for (const child of children) renderStreamNode(child, parts, state);\n }\n parts.push('</', tag, '>');\n return;\n }\n\n parts.push(escapeHtml(String(node)));\n}\n"]}
{"version":3,"sources":["../../src/ssr/render.ts","../../src/ssr/ssr-reactive.ts","../../src/ssr/client-script.ts","../../src/ssr/stream.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Void elements that don't have closing tags\nexport const VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\n// Map of prop names to HTML attribute names\nexport const PROP_TO_ATTR: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n tabIndex: 'tabindex',\n};\n\n// Escape HTML entities\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#x27;');\n}\n\n// Escape attribute values\nexport function escapeAttr(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\n}\n\nexport interface VNode {\n tag: string;\n props: Record<string, unknown> | null;\n children: unknown[];\n}\n\n/**\n * Server-side hyperscript — creates a virtual node instead of a DOM element.\n */\nexport function sh(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): VNode {\n return { tag, props: props ?? null, children };\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string.\n *\n * Uses an array buffer internally to avoid O(n^2) string concatenation\n * for large trees, then joins once at the end.\n *\n * Usage:\n * ```ts\n * import { renderToString, sh } from '@getforma/core/ssr';\n *\n * const html = renderToString(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()), // signal getters resolved synchronously\n * )\n * );\n * ```\n */\nexport function renderToString(node: unknown): string {\n const parts: string[] = [];\n renderToBuffer(node, parts);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer.\n * Avoids O(n^2) string concatenation for large trees.\n */\nfunction renderToBuffer(node: unknown, parts: string[]): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter) → resolve and render\n if (typeof node === 'function') { renderToBuffer(node(), parts); return; }\n\n // Array → render each\n if (Array.isArray(node)) {\n for (const child of node) renderToBuffer(child, parts);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBuffer(child, parts);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\nexport function isVNode(v: unknown): v is VNode {\n return v != null && typeof v === 'object' && 'tag' in v && 'children' in v;\n}\n\n// ---------------------------------------------------------------------------\n// Hydration-aware rendering\n// ---------------------------------------------------------------------------\n\n/** Per-render hydration context — avoids shared module-level counter. */\ninterface HydrationContext {\n id: number;\n}\n\n/**\n * Render a FormaJS virtual tree to an HTML string with hydration markers.\n *\n * Like `renderToString`, but injects comment markers and `data-forma-h`\n * attributes so the client-side `hydrate()` function can adopt existing\n * DOM nodes without re-creating them.\n *\n * Each call creates its own hydration counter, so concurrent calls\n * (e.g. multiple SSR requests in the same process) produce independent,\n * non-overlapping hydration IDs.\n *\n * Marker types:\n * - `data-forma-h=\"N\"` — element boundary (attribute on the element)\n * - `<!--forma-t:N-->` / `<!--/forma-t:N-->` — reactive text boundary\n * - `<!--forma-l:N-->` / `<!--/forma-l:N-->` — list boundary\n *\n * Usage:\n * ```ts\n * import { renderToStringWithHydration, sh } from '@getforma/core/ssr';\n *\n * const html = renderToStringWithHydration(\n * sh('div', { class: 'app' },\n * sh('h1', null, 'Hello SSR!'),\n * sh('p', null, () => count()),\n * )\n * );\n * ```\n */\nexport function renderToStringWithHydration(node: unknown): string {\n const ctx: HydrationContext = { id: 0 };\n const parts: string[] = [];\n renderToBufferHydrated(node, parts, ctx);\n return parts.join('');\n}\n\n/**\n * Internal: recursively render into a string array buffer with hydration markers.\n * The `ctx` object carries the hydration counter so concurrent renders are isolated.\n */\nfunction renderToBufferHydrated(node: unknown, parts: string[], ctx: HydrationContext): void {\n // null/undefined/boolean → empty\n if (node == null || node === true || node === false) return;\n\n // String → escaped text\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n\n // Number → stringified\n if (typeof node === 'number') { parts.push(String(node)); return; }\n\n // Function (signal getter / reactive text) → wrap with text markers\n if (typeof node === 'function') {\n const id = ctx.id++;\n parts.push(`<!--forma-t:${id}-->`);\n renderToBufferHydrated(node(), parts, ctx);\n parts.push(`<!--/forma-t:${id}-->`);\n return;\n }\n\n // Array → wrap with list markers\n if (Array.isArray(node)) {\n const id = ctx.id++;\n parts.push(`<!--forma-l:${id}-->`);\n for (const child of node) renderToBufferHydrated(child, parts, ctx);\n parts.push(`<!--/forma-l:${id}-->`);\n return;\n }\n\n // VNode\n if (isVNode(node)) {\n const id = ctx.id++;\n const { tag, props, children } = node;\n\n // Add hydration data-attribute to element\n parts.push('<', tag, ` data-forma-h=\"${id}\"`);\n\n // Render props as attributes\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n // Skip event handlers, refs, and internal props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n\n const attrName = PROP_TO_ATTR[key] ?? key;\n\n // Resolve reactive values\n const resolved = typeof value === 'function' ? value() : value;\n\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n\n // Void elements\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n\n parts.push('>');\n\n // dangerouslySetInnerHTML\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw === 'object' && raw != null && '__html' in raw) {\n const html = (raw as { __html: unknown }).__html;\n if (typeof html === 'string') {\n parts.push(html);\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n } else {\n // Render children\n for (const child of children) {\n renderToBufferHydrated(child, parts, ctx);\n }\n }\n\n parts.push('</', tag, '>');\n return;\n }\n\n // Fallback: stringify\n parts.push(escapeHtml(String(node)));\n}\n\n","/**\n * SSR-only signal: just a value holder, no reactivity needed on server.\n */\nexport function ssrSignal<T>(initial: T): [get: () => T, set: (v: T) => void] {\n let value = initial;\n return [() => value, (v) => { value = v; }];\n}\n\nexport function ssrComputed<T>(fn: () => T): () => T {\n return fn; // On server, just call the function directly\n}\n","/**\n * FormaJS SSR - Client Swap Script\n *\n * Tiny inline script injected into the HTML stream that handles\n * out-of-order Suspense boundary resolution.\n *\n * When the server resolves a Suspense boundary, it sends:\n * <script>$FORMA_SWAP(\"forma-s:0\",\"<resolved html>\")</script>\n *\n * This script replaces the fallback placeholder with the resolved content.\n */\n\n/**\n * Returns the client-side swap script as a string, ready to be injected\n * into the HTML stream (typically right after <body> or before first Suspense).\n */\nexport function getSwapScript(): string {\n return `<script>\nfunction $FORMA_SWAP(id,html){\n var el=document.getElementById(id);\n if(el){\n var tpl=document.createElement('template');\n tpl.innerHTML=html;\n el.replaceWith(tpl.content);\n }\n}\n</script>`;\n}\n\n/**\n * Returns a script tag that swaps a specific Suspense boundary's content.\n * Called when an async resource resolves during streaming.\n */\nexport function getSwapTag(id: string, html: string): string {\n // Use JSON.stringify for both arguments to handle all edge cases:\n // backslashes, quotes, newlines, null bytes, </script>, unicode escapes\n return `<script>$FORMA_SWAP(${JSON.stringify(id)},${JSON.stringify(html)})</script>`;\n}\n","/**\n * FormaJS SSR - Streaming Renderer\n *\n * Implements true chunked HTML streaming with out-of-order Suspense resolution.\n *\n * How it works:\n * 1. Yields shell HTML immediately (opening tags, head, static content)\n * 2. When a Suspense boundary is encountered:\n * - Yields the fallback HTML with a placeholder: <div id=\"forma-s:N\" style=\"display:contents\">\n * - Continues rendering siblings without blocking\n * - When the async resource resolves, yields a swap script\n * 3. Suspense boundaries resolve independently in any order (out-of-order streaming)\n */\n\nimport { getSwapScript, getSwapTag } from './client-script.js';\nimport { escapeHtml, escapeAttr, isVNode, VOID_ELEMENTS, PROP_TO_ATTR, type VNode } from './render.js';\n\n// ---------------------------------------------------------------------------\n// Suspense boundary tracking\n// ---------------------------------------------------------------------------\n\ninterface PendingBoundary {\n id: string;\n promise: Promise<string>;\n}\n\n/** Per-render mutable state, scoped to a single renderToStreamNew call. */\ninterface StreamState {\n suspenseCounter: number;\n pendingBoundaries: PendingBoundary[];\n}\n\n// ---------------------------------------------------------------------------\n// Synchronous render to buffer (for non-async content)\n// ---------------------------------------------------------------------------\n\nfunction renderSync(node: unknown, parts: string[]): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderSync(node(), parts); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderSync(child, parts);\n return;\n }\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw !== 'object' || raw == null || !('__html' in raw) || typeof (raw as { __html: unknown }).__html !== 'string') {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n parts.push((raw as { __html: string }).__html);\n } else {\n for (const child of children) renderSync(child, parts);\n }\n parts.push('</', tag, '>');\n return;\n }\n parts.push(escapeHtml(String(node)));\n}\n\n// ---------------------------------------------------------------------------\n// Suspense VNode detection\n// ---------------------------------------------------------------------------\n\n/**\n * A Suspense boundary VNode has a special shape:\n * { tag: 'forma-suspense', props: { fallback: VNode }, children: [asyncChildren] }\n *\n * Or it can be created via:\n * shSuspense(fallbackVNode, () => asyncContent)\n */\nexport interface SuspenseVNode {\n tag: 'forma-suspense';\n props: { fallback: unknown };\n children: [() => Promise<unknown>];\n}\n\nfunction isSuspenseVNode(v: unknown): v is SuspenseVNode {\n return isVNode(v) && v.tag === 'forma-suspense';\n}\n\n/**\n * Create a server-side Suspense VNode for streaming SSR.\n */\nexport function shSuspense(fallback: unknown, asyncChildren: () => Promise<unknown>): SuspenseVNode {\n return {\n tag: 'forma-suspense',\n props: { fallback },\n children: [asyncChildren],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Streaming renderer\n// ---------------------------------------------------------------------------\n\nexport interface StreamOptions {\n /** Script to bootstrap the client-side app (e.g. <script src=\"/app.js\"></script>) */\n bootstrapScript?: string;\n /** Whether to inject the $FORMA_SWAP client script (default: true) */\n injectSwapScript?: boolean;\n}\n\n/**\n * Render a FormaJS virtual tree to a stream of HTML chunks.\n *\n * Yields HTML progressively:\n * - Static content is yielded immediately\n * - Suspense boundaries yield their fallback, then resolve later\n * - Resolved Suspense boundaries yield swap scripts\n *\n * Usage:\n * ```ts\n * import { renderToStream, shSuspense, sh } from '@getforma/core/ssr';\n *\n * const stream = renderToStream(\n * sh('html', null,\n * sh('body', null,\n * sh('h1', null, 'Hello'),\n * shSuspense(\n * sh('div', null, 'Loading...'),\n * async () => {\n * const data = await fetchData();\n * return sh('div', null, data.name);\n * },\n * ),\n * ),\n * ),\n * );\n *\n * for await (const chunk of stream) {\n * response.write(chunk);\n * }\n * ```\n */\nexport async function* renderToStreamNew(\n node: unknown,\n options?: StreamOptions,\n): AsyncGenerator<string> {\n // Per-render state — scoped to this generator invocation\n const state: StreamState = {\n suspenseCounter: 0,\n pendingBoundaries: [],\n };\n\n const injectSwap = options?.injectSwapScript !== false;\n\n // Inject the swap script first (if there could be Suspense boundaries)\n if (injectSwap) {\n yield getSwapScript();\n }\n\n // Render the main tree synchronously, collecting Suspense boundaries\n const mainParts: string[] = [];\n renderStreamNode(node, mainParts, state);\n yield mainParts.join('');\n\n // Yield bootstrap script if provided\n if (options?.bootstrapScript) {\n yield options.bootstrapScript;\n }\n\n // Wait for and yield all pending Suspense boundaries\n // Each resolves independently (out-of-order)\n while (state.pendingBoundaries.length > 0) {\n const pending = [...state.pendingBoundaries];\n state.pendingBoundaries = [];\n\n // Race all pending boundaries — yield each as it resolves\n const results = await Promise.allSettled(\n pending.map(async (boundary) => {\n const html = await boundary.promise;\n return { id: boundary.id, html };\n }),\n );\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n yield getSwapTag(result.value.id, result.value.html);\n }\n // On rejection, the fallback stays visible (no swap)\n }\n }\n}\n\n/**\n * Render a node synchronously. If a Suspense boundary is encountered,\n * render the fallback inline and queue the async resolution.\n */\nfunction renderStreamNode(node: unknown, parts: string[], state: StreamState): void {\n if (node == null || node === true || node === false) return;\n if (typeof node === 'string') { parts.push(escapeHtml(node)); return; }\n if (typeof node === 'number') { parts.push(String(node)); return; }\n if (typeof node === 'function') { renderStreamNode(node(), parts, state); return; }\n if (Array.isArray(node)) {\n for (const child of node) renderStreamNode(child, parts, state);\n return;\n }\n\n // Suspense boundary: render fallback, queue async resolution\n if (isSuspenseVNode(node)) {\n const id = `forma-s:${state.suspenseCounter++}`;\n const fallback = node.props.fallback;\n const asyncFn = node.children[0]!;\n\n // Render fallback inside a replaceable container\n parts.push(`<div id=\"${id}\" style=\"display:contents\">`);\n renderSync(fallback, parts);\n parts.push('</div>');\n\n // Queue the async resolution\n const promise = asyncFn().then((resolved: unknown) => {\n const resolvedParts: string[] = [];\n renderSync(resolved, resolvedParts);\n return resolvedParts.join('');\n });\n state.pendingBoundaries.push({ id, promise });\n return;\n }\n\n // Regular VNode\n if (isVNode(node)) {\n const { tag, props, children } = node;\n parts.push('<', tag);\n if (props) {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'fallback') continue; // skip internal suspense props\n if (key.startsWith('on') || key === 'ref' || key === 'dangerouslySetInnerHTML') continue;\n const attrName = PROP_TO_ATTR[key] ?? key;\n const resolved = typeof value === 'function' ? value() : value;\n if (resolved === true) {\n parts.push(' ', attrName);\n } else if (resolved !== false && resolved != null) {\n parts.push(' ', attrName, '=\"', escapeAttr(String(resolved)), '\"');\n }\n }\n }\n if (VOID_ELEMENTS.has(tag)) { parts.push(' />'); return; }\n parts.push('>');\n if (props?.['dangerouslySetInnerHTML']) {\n const raw = props['dangerouslySetInnerHTML'];\n if (typeof raw !== 'object' || raw == null || !('__html' in raw) || typeof (raw as { __html: unknown }).__html !== 'string') {\n throw new TypeError('dangerouslySetInnerHTML must be { __html: string }');\n }\n parts.push((raw as { __html: string }).__html);\n } else {\n for (const child of children) renderStreamNode(child, parts, state);\n }\n parts.push('</', tag, '>');\n return;\n }\n\n parts.push(escapeHtml(String(node)));\n}\n"]}
'use strict';
var chunkFPSLC62A_cjs = require('./chunk-FPSLC62A.cjs');
var chunkKH3F5NRU_cjs = require('./chunk-KH3F5NRU.cjs');

@@ -10,3 +10,3 @@ // src/reactive/tc39-compat.ts

constructor(initialValue, options) {
const [getter, setter] = chunkFPSLC62A_cjs.createSignal(initialValue);
const [getter, setter] = chunkKH3F5NRU_cjs.createSignal(initialValue);
this._get = getter;

@@ -36,3 +36,3 @@ if (options?.equals) {

constructor(fn) {
this._get = chunkFPSLC62A_cjs.createComputed(fn);
this._get = chunkKH3F5NRU_cjs.createComputed(fn);
}

@@ -39,0 +39,0 @@ get() {

@@ -1,2 +0,2 @@

import { createSignal, createComputed } from './chunk-KX5WRZH7.js';
import { createSignal, createComputed } from './chunk-DPSAVBCP.js';

@@ -3,0 +3,0 @@ // src/reactive/tc39-compat.ts

{
"name": "@getforma/core",
"author": "Forma <victor@getforma.dev>",
"version": "0.3.1",
"version": "0.6.1",
"description": "Real DOM reactive library — fine-grained signals, islands architecture, SSR hydration. No virtual DOM, no diffing. ~15KB gzipped.",

@@ -6,0 +6,0 @@ "type": "module",

+190
-16

@@ -21,2 +21,37 @@ # FormaJS

### Getting Started with a Bundler
After `npm install`, you need a bundler to resolve the ES module imports. Here's a minimal Vite setup:
```bash
npm install @getforma/core
npm install -D vite
```
```html
<!-- index.html -->
<div id="app"></div>
<script type="module" src="./main.ts"></script>
```
```typescript
// main.ts
import { createSignal, h, mount } from '@getforma/core';
const [count, setCount] = createSignal(0);
mount(() =>
h('button', { onClick: () => setCount(count() + 1) },
() => `Clicked ${count()} times`
),
'#app'
);
```
```bash
npx vite
```
For **esbuild**, **tsup**, or other bundlers — no special config is needed. FormaJS ships standard ESM and CJS via `package.json` exports.
## Why FormaJS?

@@ -69,2 +104,4 @@

| `data-transition:*` | Enter/leave CSS transitions | `data-transition:enter="fade-in"` |
| `$el` | Reference to the current DOM element | `data-on:click="{$el.classList.toggle('active')}"` |
| `$dispatch` | Fire a CustomEvent (bubbles, crosses Shadow DOM) | `data-on:click="{$dispatch('selected', {id: itemId})}"` |

@@ -130,11 +167,10 @@ CSP-safe expression parser — no `eval()` or `new Function()` by default. For strict CSP environments, use the hardened build:

### Standard (recommended)
```html
<script src="https://unpkg.com/@getforma/core/dist/forma-runtime.js"></script>
```
Both long and short filenames are provided. They are identical files — use whichever you prefer:
### CSP-Safe (strict Content-Security-Policy)
```html
<script src="https://unpkg.com/@getforma/core/dist/forma-runtime-csp.js"></script>
```
| Build | URL |
|-------|-----|
| **Standard** (recommended) | `unpkg.com/@getforma/core/dist/formajs-runtime.global.js` |
| Standard (short alias) | `unpkg.com/@getforma/core/dist/forma-runtime.js` |
| **CSP-safe** (no `new Function`) | `unpkg.com/@getforma/core/dist/formajs-runtime-hardened.global.js` |
| CSP-safe (short alias) | `unpkg.com/@getforma/core/dist/forma-runtime-csp.js` |

@@ -237,2 +273,56 @@ > The CSP build uses a hand-written expression parser and never calls `new Function`.

#### Lifecycle: `onMount` vs `onUnmount`
- **`onMount(fn)`** — runs after the component's DOM is created. If `fn` returns a function, that function is automatically registered as an unmount callback.
- **`onUnmount(fn)`** — explicitly registers a cleanup function that runs when the component is disposed.
Both mechanisms feed into the same cleanup queue — the `onMount` return shorthand is convenience for the common pattern of setting up and tearing down in one place:
```typescript
// These are equivalent:
onMount(() => {
const id = setInterval(tick, 1000);
return () => clearInterval(id);
});
// vs.
onMount(() => {
const id = setInterval(tick, 1000);
onUnmount(() => clearInterval(id));
});
```
### Error Handling
**`mount()` fails fast.** If the container selector doesn't match any element, it throws:
```typescript
mount(() => h('p', null, 'hello'), '#nonexistent');
// Error: mount: container not found — "#nonexistent"
```
**Global error handler.** Register a handler for errors in effects and lifecycle callbacks:
```typescript
import { onError } from '@getforma/core';
onError((error, info) => {
console.error(`[${info?.source}]`, error);
});
```
**Error boundaries.** Catch rendering errors and display fallback UI with a retry option:
```typescript
import { createErrorBoundary, h } from '@getforma/core';
createErrorBoundary(
() => h(UnstableComponent),
(error, retry) => h('div', null,
h('p', null, `Something went wrong: ${error.message}`),
h('button', { onClick: retry }, 'Retry'),
),
);
```
### Context (Dependency Injection)

@@ -251,3 +341,3 @@

For server-rendered HTML, activate independent interactive regions:
For server-rendered HTML, activate independent interactive regions. Each island callback receives the root DOM element and parsed props, then returns a component tree — the same `h()` calls you'd use for client-side rendering. The hydration system walks the descriptor tree against the existing SSR DOM, attaching event handlers and reactive bindings without recreating elements.

@@ -259,4 +349,14 @@ ```typescript

Counter: (el, props) => {
const [count, setCount] = createSignal(props.initial ?? 0);
// Hydrate: attach reactivity to existing server-rendered DOM
const [count, setCount] = createSignal(props?.initial ?? 0);
// el is the island's root HTMLElement — useful for layout measurement,
// focus management, CSS classes, or reading extra data-* attributes.
el.classList.add('is-hydrated');
// Return the same tree shape as the SSR output.
// Hydration matches this against existing DOM — no elements are created.
return h('div', null,
h('span', null, () => String(count())),
h('button', { onClick: () => setCount(c => c + 1) }, '+1'),
);
},

@@ -268,3 +368,3 @@ });

<!-- Server-rendered HTML -->
<div data-forma-island="Counter" data-forma-props='{"initial": 5}'>
<div data-forma-island="0" data-forma-component="Counter" data-forma-props='{"initial": 5}'>
<span>5</span>

@@ -275,2 +375,35 @@ <button>+1</button>

Each island is activated inside its own `createRoot` scope with error isolation — a broken island never takes down its siblings.
### Hydration Triggers
Control when an island hydrates via `data-forma-hydrate`:
| Trigger | When it hydrates | Use case |
|---------|-----------------|----------|
| `load` (default) | Immediately on page load | Above-the-fold interactive content |
| `visible` | When island enters viewport | Below-the-fold components |
| `idle` | During browser idle time (`requestIdleCallback`) | Non-critical functionality |
| `interaction` | On first `pointerdown` or `focusin` | Skeleton+skin pattern |
```html
<div data-forma-island="1" data-forma-component="Comments" data-forma-hydrate="visible">
<!-- Only loads JS when scrolled into view -->
</div>
```
### Island Disposal
When swapping module content (e.g., inside `<forma-stage>` Shadow DOM), dispose islands to prevent leaked effects and listeners:
```typescript
import { deactivateIsland, deactivateAllIslands } from '@getforma/core';
// Dispose all active islands under a root
deactivateAllIslands(shadowRoot);
// Or dispose a single island
deactivateIsland(islandElement);
```
## Subpath Exports

@@ -299,11 +432,52 @@

## How Is This Different from Solid?
FormaJS shares Solid's core insight — fine-grained signals updating the real DOM without a virtual DOM. If you know Solid, you'll feel at home. The differences are in scope and delivery:
| | Solid | FormaJS |
|-|-------|---------|
| **Build requirement** | Always needs a compiler (JSX transform) | CDN runtime works with zero build step; bundler is optional |
| **Entry points** | JSX-first | HTML Runtime (`data-*` attributes), `h()` hyperscript, or JSX |
| **CSP** | Relies on compiler output | Hand-written expression parser; hardened build has no `new Function()` |
| **Islands** | Via [solid-start](https://start.solidjs.com/) meta-framework | Built-in `activateIslands()` — no meta-framework needed |
| **Ecosystem** | Mature (router, meta-framework, devtools) | Minimal — reactive core only, you bring the architecture |
| **Size** | ~7KB | ~15KB (includes runtime parser, stores, SSR) |
**When to choose FormaJS:** You want to progressively enhance server-rendered HTML, need CSP compliance without a build step, or prefer a single library that scales from a `<script>` tag to a full SSR pipeline.
**When to choose Solid:** You want a mature ecosystem with routing, SSR meta-framework, and community-built component libraries.
## Stability
Some features are more battle-tested than others:
| Feature | Status | Notes |
|---------|--------|-------|
| Signals (`createSignal`, `createEffect`, `createComputed`, `batch`) | **Stable** | Core primitive, well-tested |
| `h()` / JSX rendering | **Stable** | |
| `mount()`, `createShow`, `createSwitch`, `createList` | **Stable** | |
| HTML Runtime (`data-*` directives) | **Stable** | Expression parser covers common patterns |
| CSP-hardened runtime | **Stable** | No `new Function()`, tested with strict CSP headers |
| `createStore` (deep reactivity) | **Stable** | |
| Components (`defineComponent`, lifecycle) | **Stable** | |
| Context (`createContext`, `provide`, `inject`) | **Stable** | |
| Islands (`activateIslands`) | **Stable** | 10 activation + 88 hydration tests |
| SSR (`renderToString`, `renderToStream`) | **Beta** | Functional, API may evolve |
| TC39 Signals compat (`Signal.State`, `Signal.Computed`) | **Beta** | 9 tests, but tracks an evolving TC39 proposal |
## Ecosystem
| Package | Description |
|---------|-------------|
| [@getforma/core](https://www.npmjs.com/package/@getforma/core) | This library — `npm install @getforma/core` |
| [forma](https://github.com/getforma-dev/forma) | Rust server framework (forma-ir + forma-server) |
FormaJS is the reactive frontend layer of a full-stack Rust + TypeScript framework. The pipeline flows: TypeScript components → `@getforma/compiler` → FMIR binary → `forma-ir` (parse) → `forma-server` (render) → Axum HTTP response.
| Package | Language | Description |
|---------|----------|-------------|
| [@getforma/core](https://www.npmjs.com/package/@getforma/core) | TypeScript | This library — reactive DOM, signals, islands, SSR hydration |
| [@getforma/compiler](https://github.com/getforma-dev/forma-tools) | TypeScript | TypeScript-to-FMIR compiler, Vite plugin, esbuild SSR plugin |
| [@getforma/build](https://github.com/getforma-dev/forma-tools) | TypeScript | esbuild pipeline with content hashing, compression, manifest |
| [@getforma/create-app](https://github.com/getforma-dev/create-forma-app) | TypeScript | `npx @getforma/create-app` — scaffold a new Forma project |
| [forma-ir](https://crates.io/crates/forma-ir) | Rust | FMIR binary format: parser, walker, WASM exports |
| [forma-server](https://crates.io/crates/forma-server) | Rust | Axum middleware for SSR page rendering, asset serving, CSP |
## License
MIT
import { createComputed, createSignal, createValueSignal } from './chunk-KX5WRZH7.js';
import { effect, startBatch, endBatch, pauseTracking, resumeTracking } from 'alien-signals';
// src/reactive/root.ts
var currentRoot = null;
var rootStack = [];
function createRoot(fn) {
const scope = { disposers: [] };
rootStack.push(currentRoot);
currentRoot = scope;
const dispose = () => {
for (const d of scope.disposers) {
try {
d();
} catch {
}
}
scope.disposers.length = 0;
};
try {
return fn(dispose);
} finally {
currentRoot = rootStack.pop() ?? null;
if (rootStack.length === 0) {
rootStack.length = 0;
}
}
}
function registerDisposer(dispose) {
if (currentRoot) {
currentRoot.disposers.push(dispose);
}
}
function hasActiveRoot() {
return currentRoot !== null;
}
// src/reactive/cleanup.ts
var currentCleanupCollector = null;
function onCleanup(fn) {
currentCleanupCollector?.(fn);
}
function setCleanupCollector(collector) {
const prev = currentCleanupCollector;
currentCleanupCollector = collector;
return prev;
}
// src/reactive/dev.ts
var __DEV__ = typeof process !== "undefined" ? process.env?.NODE_ENV !== "production" : true;
var _errorHandler = null;
function onError(handler) {
_errorHandler = handler;
}
function reportError(error, source) {
if (_errorHandler) {
try {
_errorHandler(error, source ? { source } : {});
} catch {
}
}
if (__DEV__) {
console.error(`[forma] ${source ?? "Unknown"} error:`, error);
}
}
var POOL_SIZE = 32;
var MAX_REENTRANT_RUNS = 100;
var pool = [];
for (let i = 0; i < POOL_SIZE; i++) pool.push([]);
var poolIdx = POOL_SIZE;
function acquireArray() {
if (poolIdx > 0) {
const arr = pool[--poolIdx];
arr.length = 0;
return arr;
}
return [];
}
function releaseArray(arr) {
arr.length = 0;
if (poolIdx < POOL_SIZE) {
pool[poolIdx++] = arr;
}
}
function runCleanup(fn) {
if (fn === void 0) return;
try {
fn();
} catch (e) {
reportError(e, "effect cleanup");
}
}
function runCleanups(bag) {
if (bag === void 0) return;
for (let i = 0; i < bag.length; i++) {
try {
bag[i]();
} catch (e) {
reportError(e, "effect cleanup");
}
}
}
function internalEffect(fn) {
const dispose = effect(fn);
if (hasActiveRoot()) {
registerDisposer(dispose);
}
return dispose;
}
function createEffect(fn) {
const shouldRegister = hasActiveRoot();
let cleanup2;
let cleanupBag;
let nextCleanup;
let nextCleanupBag;
const addCleanup = (cb) => {
if (nextCleanupBag !== void 0) {
nextCleanupBag.push(cb);
return;
}
if (nextCleanup !== void 0) {
const bag = acquireArray();
bag.push(nextCleanup, cb);
nextCleanup = void 0;
nextCleanupBag = bag;
return;
}
nextCleanup = cb;
};
let skipCleanupInfra = false;
let firstRun = true;
let running = false;
let rerunRequested = false;
const runOnce = () => {
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
if (skipCleanupInfra) {
try {
fn();
} catch (e) {
reportError(e, "effect");
}
return;
}
nextCleanup = void 0;
nextCleanupBag = void 0;
const prevCollector = setCleanupCollector(addCleanup);
try {
const result = fn();
if (typeof result === "function") {
addCleanup(result);
}
if (nextCleanup === void 0 && nextCleanupBag === void 0) {
if (firstRun) skipCleanupInfra = true;
return;
}
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} catch (e) {
reportError(e, "effect");
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} finally {
setCleanupCollector(prevCollector);
firstRun = false;
}
};
const safeFn = () => {
if (running) {
rerunRequested = true;
return;
}
running = true;
try {
let reentrantRuns = 0;
do {
rerunRequested = false;
runOnce();
if (rerunRequested) {
reentrantRuns++;
if (reentrantRuns >= MAX_REENTRANT_RUNS) {
reportError(
new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} re-entrant runs`),
"effect"
);
rerunRequested = false;
}
}
} while (rerunRequested);
} finally {
running = false;
}
};
const dispose = effect(safeFn);
let disposed = false;
const wrappedDispose = () => {
if (disposed) return;
disposed = true;
dispose();
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
};
if (shouldRegister) {
registerDisposer(wrappedDispose);
}
return wrappedDispose;
}
// src/reactive/memo.ts
var createMemo = createComputed;
function batch(fn) {
startBatch();
try {
fn();
} finally {
endBatch();
}
}
function untrack(fn) {
pauseTracking();
try {
return fn();
} finally {
resumeTracking();
}
}
// src/reactive/on.ts
function on(deps, fn, options) {
let prev;
let isFirst = true;
return () => {
const value2 = deps();
if (options?.defer && isFirst) {
isFirst = false;
prev = value2;
return void 0;
}
const result = untrack(() => fn(value2, prev));
prev = value2;
return result;
};
}
// src/reactive/ref.ts
function createRef(initialValue) {
return { current: initialValue };
}
// src/reactive/reducer.ts
function createReducer(reducer, initialState) {
const [state, setState] = createSignal(initialState);
const dispatch = (action) => {
setState((prev) => reducer(prev, action));
};
return [state, dispatch];
}
// src/reactive/suspense-context.ts
var currentSuspenseContext = null;
var suspenseStack = [];
function pushSuspenseContext(ctx) {
suspenseStack.push(currentSuspenseContext);
currentSuspenseContext = ctx;
}
function popSuspenseContext() {
currentSuspenseContext = suspenseStack.pop() ?? null;
}
function getSuspenseContext() {
return currentSuspenseContext;
}
// src/reactive/resource.ts
function createResource(source, fetcher, options) {
const [data, setData] = createSignal(options?.initialValue);
const [loading, setLoading] = createValueSignal(false);
const [error, setError] = createValueSignal(void 0);
const suspenseCtx = getSuspenseContext();
let abortController = null;
let fetchVersion = 0;
const doFetch = () => {
const sourceValue = untrack(source);
if (abortController) {
abortController.abort();
}
const controller = new AbortController();
abortController = controller;
const version = ++fetchVersion;
const isLatest = () => version === fetchVersion;
let suspensePending = false;
if (suspenseCtx) {
suspenseCtx.increment();
suspensePending = true;
}
setLoading(true);
setError(void 0);
Promise.resolve(fetcher(sourceValue)).then((result) => {
if (isLatest() && !controller.signal.aborted) {
setData(() => result);
}
}).catch((err) => {
if (isLatest() && !controller.signal.aborted) {
if (err?.name !== "AbortError") {
setError(err);
}
}
}).finally(() => {
if (suspensePending) suspenseCtx?.decrement();
if (isLatest()) {
setLoading(false);
if (abortController === controller) {
abortController = null;
}
}
});
};
internalEffect(() => {
source();
doFetch();
});
const resource = (() => data());
resource.loading = loading;
resource.error = error;
resource.refetch = doFetch;
resource.mutate = (value2) => setData(() => value2);
return resource;
}
// src/dom/element.ts
var Fragment = /* @__PURE__ */ Symbol.for("forma.fragment");
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK_NS = "http://www.w3.org/1999/xlink";
var SVG_TAGS = /* @__PURE__ */ new Set([
"svg",
"path",
"circle",
"rect",
"line",
"polyline",
"polygon",
"ellipse",
"g",
"text",
"tspan",
"textPath",
"defs",
"use",
"symbol",
"clipPath",
"mask",
"pattern",
"marker",
"linearGradient",
"radialGradient",
"stop",
"filter",
"feGaussianBlur",
"feColorMatrix",
"feOffset",
"feBlend",
"feMerge",
"feMergeNode",
"feComposite",
"feFlood",
"feMorphology",
"feTurbulence",
"feDisplacementMap",
"feImage",
"foreignObject",
"animate",
"animateTransform",
"animateMotion",
"set",
"image",
"switch",
"desc",
"title",
"metadata"
]);
var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
"disabled",
"checked",
"readonly",
"required",
"autofocus",
"autoplay",
"controls",
"default",
"defer",
"formnovalidate",
"hidden",
"ismap",
"loop",
"multiple",
"muted",
"nomodule",
"novalidate",
"open",
"playsinline",
"reversed",
"selected",
"async"
]);
var ELEMENT_PROTOS = null;
function getProto(tag) {
if (!ELEMENT_PROTOS) {
ELEMENT_PROTOS = /* @__PURE__ */ Object.create(null);
for (const t of [
"div",
"span",
"p",
"a",
"li",
"ul",
"ol",
"button",
"input",
"label",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"section",
"header",
"footer",
"main",
"nav",
"table",
"tr",
"td",
"th",
"tbody",
"img",
"form",
"select",
"option",
"textarea",
"i",
"b",
"strong",
"em",
"small",
"article",
"aside",
"details",
"summary"
]) {
ELEMENT_PROTOS[t] = document.createElement(t);
}
}
return ELEMENT_PROTOS[tag] ?? (ELEMENT_PROTOS[tag] = document.createElement(tag));
}
var EVENT_NAMES = /* @__PURE__ */ Object.create(null);
function eventName(key) {
return EVENT_NAMES[key] ?? (EVENT_NAMES[key] = key.slice(2).toLowerCase());
}
var ABORT_SYM = /* @__PURE__ */ Symbol.for("forma-abort");
function getAbortController(el) {
let controller = el[ABORT_SYM];
if (!controller) {
controller = new AbortController();
el[ABORT_SYM] = controller;
}
return controller;
}
function cleanup(el) {
const controller = el[ABORT_SYM];
if (controller) {
controller.abort();
delete el[ABORT_SYM];
}
}
var CACHE_SYM = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function getCache(el) {
return el[CACHE_SYM] ?? (el[CACHE_SYM] = /* @__PURE__ */ Object.create(null));
}
function handleClass(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache["class"] === v) return;
cache["class"] = v;
if (el instanceof HTMLElement) {
el.className = v;
} else {
el.setAttribute("class", v);
}
});
} else {
const cache = getCache(el);
if (cache["class"] === value2) return;
cache["class"] = value2;
if (el instanceof HTMLElement) {
el.className = value2;
} else {
el.setAttribute("class", value2);
}
}
}
function handleStyle(el, _key, value2) {
if (typeof value2 === "function") {
let prevKeys = [];
internalEffect(() => {
const v = value2();
if (typeof v === "string") {
const cache = getCache(el);
if (cache["style"] === v) return;
cache["style"] = v;
prevKeys = [];
el.style.cssText = v;
} else if (v && typeof v === "object") {
const style = el.style;
const nextKeys = Object.keys(v);
for (const k of prevKeys) {
if (!(k in v)) {
style.removeProperty(k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()));
}
}
Object.assign(style, v);
prevKeys = nextKeys;
}
});
} else if (typeof value2 === "string") {
const cache = getCache(el);
if (cache["style"] === value2) return;
cache["style"] = value2;
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
}
function handleEvent(el, key, value2) {
const controller = getAbortController(el);
el.addEventListener(
eventName(key),
value2,
{ signal: controller.signal }
);
}
function handleInnerHTML(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const resolved = value2();
if (resolved == null) {
el.innerHTML = "";
return;
}
if (typeof resolved !== "object" || !("__html" in resolved)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof resolved
);
}
const html = resolved.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
const cache = getCache(el);
if (cache["innerHTML"] === html) return;
cache["innerHTML"] = html;
el.innerHTML = html;
});
} else {
if (value2 == null) {
el.innerHTML = "";
return;
}
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
}
}
function handleXLink(el, key, value2) {
const localName = key.slice(6);
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(v));
}
});
} else {
if (value2 == null || value2 === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(value2));
}
}
}
function handleBooleanAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache[key] === v) return;
cache[key] = v;
if (v) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
});
} else {
const cache = getCache(el);
if (cache[key] === value2) return;
cache[key] = value2;
if (value2) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
}
}
function handleGenericAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(v);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
});
} else {
if (value2 == null || value2 === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(value2);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
}
}
var PROP_HANDLERS = /* @__PURE__ */ new Map();
PROP_HANDLERS.set("class", handleClass);
PROP_HANDLERS.set("className", handleClass);
PROP_HANDLERS.set("style", handleStyle);
PROP_HANDLERS.set("ref", () => {
});
PROP_HANDLERS.set("dangerouslySetInnerHTML", handleInnerHTML);
for (const attr of BOOLEAN_ATTRS) {
PROP_HANDLERS.set(attr, handleBooleanAttr);
}
function applyProp(el, key, value2) {
if (key === "class") {
handleClass(el, key, value2);
return;
}
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
return;
}
const handler = PROP_HANDLERS.get(key);
if (handler) {
handler(el, key, value2);
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
handleXLink(el, key, value2);
return;
}
handleGenericAttr(el, key, value2);
}
function applyStaticProp(el, key, value2) {
if (value2 == null || value2 === false) return;
if (key === "class" || key === "className") {
el.className = value2;
return;
}
if (key === "style") {
if (typeof value2 === "string") {
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
return;
}
if (key === "dangerouslySetInnerHTML") {
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
el.setAttributeNS(XLINK_NS, key, String(value2));
return;
}
if (BOOLEAN_ATTRS.has(key)) {
if (value2) el.setAttribute(key, "");
return;
}
if (value2 === true) {
el.setAttribute(key, "");
} else {
el.setAttribute(key, String(value2));
}
}
function appendChild(parent, child) {
if (child instanceof Node) {
parent.appendChild(child);
return;
}
if (typeof child === "string") {
parent.appendChild(new Text(child));
return;
}
if (child == null || child === false || child === true) {
return;
}
if (typeof child === "number") {
parent.appendChild(new Text(String(child)));
return;
}
if (typeof child === "function") {
if (parent instanceof Element) {
parent[DYNAMIC_CHILD_SYM] = true;
}
let currentNode = null;
internalEffect(() => {
const v = child();
if (v instanceof Node) {
if (currentNode) {
parent.replaceChild(v, currentNode);
} else {
parent.appendChild(v);
}
currentNode = v;
} else {
const text = typeof v === "symbol" ? String(v) : String(v ?? "");
if (!currentNode) {
currentNode = new Text(text);
parent.appendChild(currentNode);
} else if (currentNode.nodeType === 3) {
currentNode.data = text;
} else {
const tn = new Text(text);
parent.replaceChild(tn, currentNode);
currentNode = tn;
}
}
});
return;
}
if (Array.isArray(child)) {
for (const item of child) {
appendChild(parent, item);
}
return;
}
}
function h(tag, props, ...children) {
if (tag === Fragment) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
const tagName = tag;
if (hydrating) {
return { type: "element", tag: tagName, props: props ?? null, children };
}
let el;
if (ELEMENT_PROTOS && ELEMENT_PROTOS[tagName]) {
el = ELEMENT_PROTOS[tagName].cloneNode(false);
} else if (SVG_TAGS.has(tagName)) {
el = document.createElementNS(SVG_NS, tagName);
} else {
el = getProto(tagName).cloneNode(false);
}
if (props) {
let hasDynamic = false;
for (const key in props) {
if (key === "ref") continue;
const value2 = props[key];
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
continue;
}
if (typeof value2 === "function") {
if (!hasDynamic) {
el[CACHE_SYM] = /* @__PURE__ */ Object.create(null);
hasDynamic = true;
}
applyProp(el, key, value2);
continue;
}
applyStaticProp(el, key, value2);
}
}
const childLen = children.length;
if (childLen === 1) {
const only = children[0];
if (typeof only === "string") {
el.textContent = only;
} else if (typeof only === "number") {
el.textContent = String(only);
} else {
appendChild(el, only);
}
} else if (childLen > 1) {
for (const child of children) {
appendChild(el, child);
}
}
if (props && typeof props["ref"] === "function") {
props["ref"](el);
}
return el;
}
function fragment(...children) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
// src/dom/show.ts
function createShow(when, thenFn, elseFn) {
if (hydrating) {
const branch = when() ? thenFn() : elseFn?.() ?? null;
return {
type: "show",
condition: when,
whenTrue: thenFn,
whenFalse: elseFn,
initialBranch: branch
};
}
const startMarker = document.createComment("forma-show");
const endMarker = document.createComment("/forma-show");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let currentNode = null;
let lastTruthy = null;
let currentDispose = null;
const showDispose = internalEffect(() => {
const truthy = !!when();
const DEBUG = typeof globalThis.__FORMA_DEBUG__ !== "undefined";
const DEBUG_LABEL = DEBUG ? thenFn.toString().slice(0, 60) : "";
if (truthy === lastTruthy) {
if (DEBUG) console.log("[forma:show] skip (same)", truthy, DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show]", lastTruthy, "\u2192", truthy, DEBUG_LABEL);
lastTruthy = truthy;
const parent = startMarker.parentNode;
if (!parent) {
if (DEBUG) console.warn("[forma:show] parentNode is null! skipping.", DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show] parent:", parent.nodeName, "inDoc:", document.contains(parent));
if (currentDispose) {
currentDispose();
currentDispose = null;
}
if (currentNode) {
if (currentNode.parentNode === parent) {
parent.removeChild(currentNode);
} else {
while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {
parent.removeChild(startMarker.nextSibling);
}
}
}
const branchFn = truthy ? thenFn : elseFn;
if (branchFn) {
let branchDispose;
currentNode = createRoot((dispose) => {
branchDispose = dispose;
return untrack(() => branchFn());
});
currentDispose = branchDispose;
} else {
currentNode = null;
}
if (currentNode) {
parent.insertBefore(currentNode, endMarker);
}
});
fragment2.__showDispose = () => {
showDispose();
if (currentDispose) {
currentDispose();
currentDispose = null;
}
};
return fragment2;
}
// src/dom/hydrate.ts
var hydrating = false;
function setHydrating(value2) {
hydrating = value2;
}
function isDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "element";
}
function isShowDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "show";
}
function isListDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "list";
}
function applyDynamicProps(el, props) {
if (!props) return;
for (const key in props) {
const value2 = props[key];
if (typeof value2 !== "function") continue;
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
el.addEventListener(key.slice(2).toLowerCase(), value2);
continue;
}
const fn = value2;
const attrKey = key;
internalEffect(() => {
const v = fn();
if (v === false || v == null) {
el.removeAttribute(attrKey);
} else if (v === true) {
el.setAttribute(attrKey, "");
} else {
el.setAttribute(attrKey, String(v));
}
});
}
}
function ensureNode(value2) {
if (value2 instanceof Node) return value2;
if (value2 == null || value2 === false || value2 === true) return null;
if (typeof value2 === "string") return new Text(value2);
if (typeof value2 === "number") return new Text(String(value2));
if (isDescriptor(value2)) return descriptorToElement(value2);
if (isShowDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createShow(
value2.condition,
() => ensureNode(value2.whenTrue()) ?? document.createComment("empty"),
value2.whenFalse ? () => ensureNode(value2.whenFalse()) ?? document.createComment("empty") : void 0
);
} finally {
hydrating = prevH;
}
}
if (isListDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createList(value2.items, value2.keyFn, value2.renderFn, value2.options);
} finally {
hydrating = prevH;
}
}
return null;
}
function descriptorToElement(desc) {
const prevHydrating = hydrating;
hydrating = false;
try {
const children = desc.children.map((child) => {
if (isDescriptor(child)) return descriptorToElement(child);
if (isShowDescriptor(child)) return ensureNode(child);
if (isListDescriptor(child)) return ensureNode(child);
return child;
});
return h(desc.tag, desc.props, ...children);
} finally {
hydrating = prevHydrating;
}
}
function isIslandStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 105;
}
function isShowStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 115;
}
function isTextStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 116;
}
function isListStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 108;
}
function findClosingMarker(start) {
const closing = "/" + start.data;
let node = start.nextSibling;
while (node) {
if (node.nodeType === 8 && node.data === closing) {
return node;
}
node = node.nextSibling;
}
return null;
}
function findTextBetween(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 3) return node;
node = node.nextSibling;
}
return null;
}
function nextElementBetweenMarkers(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) return node;
node = node.nextSibling;
}
return void 0;
}
function extractContentBetweenMarkers(start, end) {
const frag = document.createDocumentFragment();
let node = start.nextSibling;
while (node && node !== end) {
const next = node.nextSibling;
frag.appendChild(node);
node = next;
}
return frag;
}
function setupShowEffect(desc, marker) {
let currentCondition = !!desc.condition();
let thenFragment = null;
let elseFragment = null;
const hasSSRContent = marker.start.nextSibling !== marker.end;
if (!hasSSRContent && currentCondition) {
if (__DEV__) console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");
const trueBranch = desc.whenTrue();
if (trueBranch instanceof Node) {
marker.start.parentNode.insertBefore(trueBranch, marker.end);
}
}
internalEffect(() => {
const next = !!desc.condition();
if (next === currentCondition) return;
currentCondition = next;
const parent = marker.start.parentNode;
if (!parent) return;
const current = extractContentBetweenMarkers(marker.start, marker.end);
if (!next) {
thenFragment = current;
} else {
elseFragment = current;
}
let branch = next ? thenFragment ?? desc.whenTrue() : desc.whenFalse ? elseFragment ?? desc.whenFalse() : null;
if (next && thenFragment) thenFragment = null;
if (!next && elseFragment) elseFragment = null;
if (branch != null && !(branch instanceof Node)) {
branch = ensureNode(branch);
}
if (branch instanceof Node) {
parent.insertBefore(branch, marker.end);
}
});
}
function adoptBranchContent(desc, regionStart, regionEnd) {
if (isDescriptor(desc)) {
const el = nextElementBetweenMarkers(regionStart, regionEnd);
if (el) adoptNode(desc, el);
} else if (isShowDescriptor(desc)) {
let node = regionStart.nextSibling;
while (node && node !== regionEnd) {
if (node.nodeType === 8 && isShowStart(node.data)) {
const innerStart = node;
const innerEnd = findClosingMarker(innerStart);
if (innerEnd) {
if (desc.initialBranch) {
adoptBranchContent(desc.initialBranch, innerStart, innerEnd);
}
setupShowEffect(desc, { start: innerStart, end: innerEnd});
}
break;
}
node = node.nextSibling;
}
}
}
function adoptNode(desc, ssrEl) {
if (!ssrEl || ssrEl.tagName !== desc.tag.toUpperCase()) {
if (__DEV__) console.warn(`Hydration mismatch: expected <${desc.tag}>, got <${ssrEl?.tagName?.toLowerCase() ?? "nothing"}>`);
const fresh = descriptorToElement(desc);
if (ssrEl) ssrEl.replaceWith(fresh);
return;
}
applyDynamicProps(ssrEl, desc.props);
let cursor = ssrEl.firstChild;
for (const child of desc.children) {
if (child === false || child == null) continue;
if (isDescriptor(child)) {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
while (cursor && cursor.nodeType === 1 && cursor.hasAttribute("data-forma-island")) {
cursor = cursor.nextSibling;
}
if (!cursor) {
ssrEl.appendChild(descriptorToElement(child));
continue;
}
if (cursor.nodeType === 1) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(child, el);
} else if (cursor.nodeType === 8 && isIslandStart(cursor.data)) {
const end = findClosingMarker(cursor);
const fresh = descriptorToElement(child);
if (end) {
end.parentNode.insertBefore(fresh, end);
cursor = end.nextSibling;
} else {
ssrEl.appendChild(fresh);
cursor = null;
}
} else {
ssrEl.appendChild(descriptorToElement(child));
}
} else if (isShowDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isShowStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
if (child.initialBranch) {
adoptBranchContent(child.initialBranch, start, end);
}
setupShowEffect(child, { start, end});
cursor = end.nextSibling;
}
}
} else if (isListDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isListStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
const ssrKeyMap = /* @__PURE__ */ new Map();
const ssrElements = [];
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) {
const el = node;
ssrElements.push(el);
const key = el.getAttribute("data-forma-key");
if (key != null) {
ssrKeyMap.set(key, el);
}
}
node = node.nextSibling;
}
const currentItems = untrack(() => child.items());
const listKeyFn = child.keyFn;
const listRenderFn = child.renderFn;
const useIndexFallback = ssrKeyMap.size === 0 && ssrElements.length > 0;
const adoptedNodes = [];
const adoptedItems = [];
const usedIndices = /* @__PURE__ */ new Set();
for (let i = 0; i < currentItems.length; i++) {
const item = currentItems[i];
const key = listKeyFn(item);
let ssrNode;
if (useIndexFallback) {
if (i < ssrElements.length) {
ssrNode = ssrElements[i];
usedIndices.add(i);
}
} else {
ssrNode = ssrKeyMap.get(String(key));
if (ssrNode) ssrKeyMap.delete(String(key));
}
if (ssrNode) {
adoptedNodes.push(ssrNode);
adoptedItems.push(item);
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: list item key "${key}" not found in SSR \u2014 rendering fresh`);
const prevHydrating = hydrating;
hydrating = false;
try {
const [getIndex] = createSignal(i);
const fresh = listRenderFn(item, getIndex);
end.parentNode.insertBefore(fresh, end);
adoptedNodes.push(fresh);
adoptedItems.push(item);
} finally {
hydrating = prevHydrating;
}
}
}
if (useIndexFallback) {
for (let i = 0; i < ssrElements.length; i++) {
if (!usedIndices.has(i) && ssrElements[i].parentNode) {
ssrElements[i].parentNode.removeChild(ssrElements[i]);
}
}
} else {
for (const [unusedKey, unusedNode] of ssrKeyMap) {
if (__DEV__) console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${unusedKey}"`);
if (unusedNode.parentNode) {
unusedNode.parentNode.removeChild(unusedNode);
}
}
}
const parent = start.parentNode;
for (const adoptedNode of adoptedNodes) {
parent.insertBefore(adoptedNode, end);
}
let cache = /* @__PURE__ */ new Map();
for (let i = 0; i < adoptedItems.length; i++) {
const item = adoptedItems[i];
const key = listKeyFn(item);
const [getIndex, setIndex] = createSignal(i);
cache.set(key, {
element: adoptedNodes[i],
item,
getIndex,
setIndex
});
}
let reconcileNodes = adoptedNodes.slice();
let reconcileItems = adoptedItems.slice();
internalEffect(() => {
const newItems = child.items();
const parent2 = start.parentNode;
if (!parent2) return;
const result = reconcileList(
parent2,
reconcileItems,
newItems,
reconcileNodes,
listKeyFn,
(item) => {
const prevHydrating = hydrating;
hydrating = false;
try {
const key = listKeyFn(item);
const [getIndex, setIndex] = createSignal(0);
const element = untrack(() => listRenderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
} finally {
hydrating = prevHydrating;
}
},
(_node, item) => {
const key = listKeyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
},
end
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < newItems.length; i++) {
const key = listKeyFn(newItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
reconcileNodes = result.nodes;
reconcileItems = result.items;
});
cursor = end.nextSibling;
}
}
} else if (typeof child === "function") {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
if (cursor && cursor.nodeType === 1) {
const initial = child();
if (isDescriptor(initial)) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(initial, el);
continue;
}
}
if (cursor && cursor.nodeType === 8) {
const data = cursor.data;
if (isTextStart(data)) {
const endMarker = findClosingMarker(cursor);
let textNode = cursor.nextSibling;
if (!textNode || textNode.nodeType !== 3) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for marker ${data} \u2014 SSR walker should emit content between markers`);
const created = document.createTextNode("");
cursor.parentNode.insertBefore(created, endMarker || cursor.nextSibling);
textNode = created;
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = endMarker ? endMarker.nextSibling : textNode.nextSibling;
} else if (isShowStart(data)) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
let textNode = findTextBetween(start, end);
if (!textNode) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for show marker ${start.data} \u2014 SSR walker should emit content between markers`);
textNode = document.createTextNode("");
start.parentNode.insertBefore(textNode, end);
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = end.nextSibling;
} else {
cursor = cursor.nextSibling;
}
} else {
cursor = cursor.nextSibling;
}
} else if (cursor && cursor.nodeType === 3) {
const textNode = cursor;
cursor = cursor.nextSibling;
internalEffect(() => {
textNode.data = String(child());
});
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node in empty <${ssrEl.tagName.toLowerCase()}> \u2014 IR may not cover this component`);
const textNode = document.createTextNode("");
ssrEl.appendChild(textNode);
internalEffect(() => {
textNode.data = String(child());
});
}
} else if (typeof child === "string" || typeof child === "number") {
if (cursor && cursor.nodeType === 3) {
cursor = cursor.nextSibling;
}
}
}
}
function hydrateIsland(component, target) {
const hasSSRContent = target.childElementCount > 0 || target.childNodes.length > 0 && Array.from(target.childNodes).some((n) => n.nodeType === 1 || n.nodeType === 3 && n.data.trim());
if (!hasSSRContent) {
if (__DEV__) {
const name = target.getAttribute("data-forma-component") || "unknown";
console.warn(
`[forma] Island "${name}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`
);
}
const result = component();
if (result instanceof Element) {
for (const attr of Array.from(target.attributes)) {
if (attr.name.startsWith("data-forma-")) {
result.setAttribute(attr.name, attr.value);
}
}
target.replaceWith(result);
return result;
} else if (result instanceof Node) {
target.appendChild(result);
}
return target;
}
setHydrating(true);
let descriptor;
try {
descriptor = component();
} finally {
setHydrating(false);
}
if (!descriptor || !isDescriptor(descriptor)) {
target.removeAttribute("data-forma-ssr");
return target;
}
if (target.hasAttribute("data-forma-island")) {
adoptNode(descriptor, target);
} else {
adoptNode(descriptor, target.children[0]);
}
target.removeAttribute("data-forma-ssr");
return target;
}
// src/dom/list.ts
function longestIncreasingSubsequence(arr) {
const n = arr.length;
if (n === 0) return [];
const tails = new Int32Array(n);
const tailIndices = new Int32Array(n);
const predecessor = new Int32Array(n).fill(-1);
let tailsLen = 0;
for (let i = 0; i < n; i++) {
const val = arr[i];
let lo = 0, hi = tailsLen;
while (lo < hi) {
const mid = lo + hi >> 1;
if (tails[mid] < val) lo = mid + 1;
else hi = mid;
}
tails[lo] = val;
tailIndices[lo] = i;
if (lo > 0) predecessor[i] = tailIndices[lo - 1];
if (lo >= tailsLen) tailsLen++;
}
const result = new Array(tailsLen);
let idx = tailIndices[tailsLen - 1];
for (let i = tailsLen - 1; i >= 0; i--) {
result[i] = idx;
idx = predecessor[idx];
}
return result;
}
var SMALL_LIST_THRESHOLD = 32;
var ABORT_SYM2 = /* @__PURE__ */ Symbol.for("forma-abort");
var CACHE_SYM2 = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM2 = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function canPatchStaticElement(target, source) {
return target instanceof HTMLElement && source instanceof HTMLElement && target.tagName === source.tagName && !target[ABORT_SYM2] && !target[CACHE_SYM2] && !target[DYNAMIC_CHILD_SYM2] && !source[ABORT_SYM2] && !source[CACHE_SYM2] && !source[DYNAMIC_CHILD_SYM2];
}
function patchStaticElement(target, source) {
const sourceAttrNames = /* @__PURE__ */ new Set();
for (const attr of Array.from(source.attributes)) {
sourceAttrNames.add(attr.name);
if (target.getAttribute(attr.name) !== attr.value) {
target.setAttribute(attr.name, attr.value);
}
}
for (const attr of Array.from(target.attributes)) {
if (!sourceAttrNames.has(attr.name)) {
target.removeAttribute(attr.name);
}
}
target.replaceChildren(...Array.from(source.childNodes));
}
function reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
const oldKeys = new Array(oldLen);
for (let i = 0; i < oldLen; i++) {
oldKeys[i] = keyFn(oldItems[i]);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
let found = -1;
for (let j = 0; j < oldLen; j++) {
if (!oldUsed[j] && oldKeys[j] === key) {
found = j;
oldUsed[j] = 1;
break;
}
}
oldIndices[i] = found;
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function reconcileList(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
if (newLen === 0) {
for (let i = 0; i < oldLen; i++) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
return { nodes: [], items: [] };
}
if (oldLen === 0) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = createFn(newItems[i]);
if (beforeNode) {
parent.insertBefore(node, beforeNode);
} else {
parent.appendChild(node);
}
hooks?.onInsert?.(node);
nodes[i] = node;
}
return { nodes, items: newItems };
}
if (oldLen < SMALL_LIST_THRESHOLD) {
return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);
}
const oldKeyMap = /* @__PURE__ */ new Map();
for (let i = 0; i < oldLen; i++) {
oldKeyMap.set(keyFn(oldItems[i]), i);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
const oldIdx = oldKeyMap.get(key);
if (oldIdx !== void 0) {
oldIndices[i] = oldIdx;
oldUsed[oldIdx] = 1;
} else {
oldIndices[i] = -1;
}
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function createList(items, keyFn, renderFn, options) {
if (hydrating) {
return { type: "list", items, keyFn, renderFn, options };
}
const startMarker = document.createComment("forma-list-start");
const endMarker = document.createComment("forma-list-end");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let cache = /* @__PURE__ */ new Map();
let currentNodes = [];
let currentItems = [];
const updateOnItemChange = options?.updateOnItemChange ?? "none";
internalEffect(() => {
const newItems = items();
const parent = startMarker.parentNode;
if (!parent) {
return;
}
if (!Array.isArray(newItems)) {
if (__DEV__) {
console.warn("[forma] createList: value is not an array, treating as empty");
}
for (const node of currentNodes) {
if (node.parentNode === parent) parent.removeChild(node);
}
cache = /* @__PURE__ */ new Map();
currentNodes = [];
currentItems = [];
return;
}
let cleanItems = newItems;
for (let i = 0; i < newItems.length; i++) {
if (newItems[i] == null) {
cleanItems = newItems.filter((item) => item != null);
break;
}
}
if (__DEV__) {
const seen = /* @__PURE__ */ new Set();
for (const item of cleanItems) {
const key = keyFn(item);
if (seen.has(key)) {
console.warn("[forma] createList: duplicate key detected:", key);
}
seen.add(key);
}
}
const updateRow = updateOnItemChange === "rerender" ? (node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (!cached) return;
if (cached.item === item) return;
cached.item = item;
if (!(node instanceof HTMLElement)) return;
if (node[ABORT_SYM2] || node[CACHE_SYM2] || node[DYNAMIC_CHILD_SYM2]) {
return;
}
const next = untrack(() => renderFn(item, cached.getIndex));
if (canPatchStaticElement(node, next)) {
patchStaticElement(node, next);
cached.element = node;
}
} : (_node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
};
const result = reconcileList(
parent,
currentItems,
cleanItems,
currentNodes,
keyFn,
// createFn: create element + cache entry
(item) => {
const key = keyFn(item);
const [getIndex, setIndex] = createSignal(0);
const element = untrack(() => renderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
},
updateRow,
// beforeNode: insert items before the end marker
endMarker
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < cleanItems.length; i++) {
const key = keyFn(cleanItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
currentNodes = result.nodes;
currentItems = result.items;
});
return fragment2;
}
export { Fragment, __DEV__, batch, cleanup, createEffect, createList, createMemo, createReducer, createRef, createResource, createRoot, createShow, fragment, h, hydrateIsland, internalEffect, longestIncreasingSubsequence, on, onCleanup, onError, popSuspenseContext, pushSuspenseContext, reconcileList, untrack };
//# sourceMappingURL=chunk-5H52PKGF.js.map
//# sourceMappingURL=chunk-5H52PKGF.js.map

Sorry, the diff of this file is too big to display

'use strict';
var alienSignals = require('alien-signals');
// src/reactive/signal.ts
function applySignalSet(s, v) {
if (typeof v !== "function") {
s(v);
return;
}
alienSignals.pauseTracking();
const prev = s();
alienSignals.resumeTracking();
s(v(prev));
}
function createSignal(initialValue) {
const s = alienSignals.signal(initialValue);
const getter = s;
const setter = (v) => applySignalSet(s, v);
return [getter, setter];
}
var createValueSignal = createSignal;
function createComputed(fn) {
return alienSignals.computed(fn);
}
exports.createComputed = createComputed;
exports.createSignal = createSignal;
exports.createValueSignal = createValueSignal;
//# sourceMappingURL=chunk-FPSLC62A.cjs.map
//# sourceMappingURL=chunk-FPSLC62A.cjs.map
{"version":3,"sources":["../src/reactive/signal.ts","../src/reactive/computed.ts"],"names":["pauseTracking","resumeTracking","createRawSignal","rawComputed"],"mappings":";;;;;AAmDA,SAAS,cAAA,CACP,GACA,CAAA,EACM;AACN,EAAA,IAAI,OAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,CAAA,CAAE,CAAC,CAAA;AACH,IAAA;AAAA,EACF;AAEA,EAAAA,0BAAA,EAAc;AACd,EAAA,MAAM,OAAO,CAAA,EAAE;AACf,EAAAC,2BAAA,EAAe;AACf,EAAA,CAAA,CAAG,CAAA,CAAqB,IAAI,CAAC,CAAA;AAC/B;AAYO,SAAS,aAAgB,YAAA,EAA+D;AAC7F,EAAA,MAAM,CAAA,GAAIC,oBAAmB,YAAY,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,KAA4B,cAAA,CAAe,GAAG,CAAC,CAAA;AAEhF,EAAA,OAAO,CAAC,QAAQ,MAAM,CAAA;AACxB;AAMO,IAAM,iBAAA,GAAoB;ACjE1B,SAAS,eAAkB,EAAA,EAAsB;AACtD,EAAA,OAAOC,sBAAY,EAAE,CAAA;AACvB","file":"chunk-FPSLC62A.cjs","sourcesContent":["/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, pauseTracking, resumeTracking } from 'alien-signals';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type SignalGetter<T> = () => T;\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /** Custom equality check. Default: Object.is (via alien-signals). */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n): void {\n if (typeof v !== 'function') {\n s(v);\n return;\n }\n\n pauseTracking();\n const prev = s();\n resumeTracking();\n s((v as (prev: T) => T)(prev));\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n */\nexport function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v);\n\n return [getter, setter];\n}\n\n/** @deprecated Use createSignal instead. Alias kept for backwards compatibility. */\nexport type ValueSignalSetter<T> = SignalSetter<T>;\n\n/** @deprecated Use createSignal instead. Alias kept for backwards compatibility. */\nexport const createValueSignal = createSignal;\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\n\n/**\n * Create a lazy, cached computed value.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n */\nexport function createComputed<T>(fn: () => T): () => T {\n return rawComputed(fn);\n}\n"]}
import { signal, computed, pauseTracking, resumeTracking } from 'alien-signals';
// src/reactive/signal.ts
function applySignalSet(s, v) {
if (typeof v !== "function") {
s(v);
return;
}
pauseTracking();
const prev = s();
resumeTracking();
s(v(prev));
}
function createSignal(initialValue) {
const s = signal(initialValue);
const getter = s;
const setter = (v) => applySignalSet(s, v);
return [getter, setter];
}
var createValueSignal = createSignal;
function createComputed(fn) {
return computed(fn);
}
export { createComputed, createSignal, createValueSignal };
//# sourceMappingURL=chunk-KX5WRZH7.js.map
//# sourceMappingURL=chunk-KX5WRZH7.js.map
{"version":3,"sources":["../src/reactive/signal.ts","../src/reactive/computed.ts"],"names":["createRawSignal","rawComputed"],"mappings":";;;AAmDA,SAAS,cAAA,CACP,GACA,CAAA,EACM;AACN,EAAA,IAAI,OAAO,MAAM,UAAA,EAAY;AAC3B,IAAA,CAAA,CAAE,CAAC,CAAA;AACH,IAAA;AAAA,EACF;AAEA,EAAA,aAAA,EAAc;AACd,EAAA,MAAM,OAAO,CAAA,EAAE;AACf,EAAA,cAAA,EAAe;AACf,EAAA,CAAA,CAAG,CAAA,CAAqB,IAAI,CAAC,CAAA;AAC/B;AAYO,SAAS,aAAgB,YAAA,EAA+D;AAC7F,EAAA,MAAM,CAAA,GAAIA,OAAmB,YAAY,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,MAAA,GAA0B,CAAC,CAAA,KAA4B,cAAA,CAAe,GAAG,CAAC,CAAA;AAEhF,EAAA,OAAO,CAAC,QAAQ,MAAM,CAAA;AACxB;AAMO,IAAM,iBAAA,GAAoB;ACjE1B,SAAS,eAAkB,EAAA,EAAsB;AACtD,EAAA,OAAOC,SAAY,EAAE,CAAA;AACvB","file":"chunk-KX5WRZH7.js","sourcesContent":["/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, pauseTracking, resumeTracking } from 'alien-signals';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type SignalGetter<T> = () => T;\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /** Custom equality check. Default: Object.is (via alien-signals). */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n): void {\n if (typeof v !== 'function') {\n s(v);\n return;\n }\n\n pauseTracking();\n const prev = s();\n resumeTracking();\n s((v as (prev: T) => T)(prev));\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n */\nexport function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v);\n\n return [getter, setter];\n}\n\n/** @deprecated Use createSignal instead. Alias kept for backwards compatibility. */\nexport type ValueSignalSetter<T> = SignalSetter<T>;\n\n/** @deprecated Use createSignal instead. Alias kept for backwards compatibility. */\nexport const createValueSignal = createSignal;\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\n\n/**\n * Create a lazy, cached computed value.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n */\nexport function createComputed<T>(fn: () => T): () => T {\n return rawComputed(fn);\n}\n"]}
'use strict';
var chunkFPSLC62A_cjs = require('./chunk-FPSLC62A.cjs');
var alienSignals = require('alien-signals');
// src/reactive/root.ts
var currentRoot = null;
var rootStack = [];
function createRoot(fn) {
const scope = { disposers: [] };
rootStack.push(currentRoot);
currentRoot = scope;
const dispose = () => {
for (const d of scope.disposers) {
try {
d();
} catch {
}
}
scope.disposers.length = 0;
};
try {
return fn(dispose);
} finally {
currentRoot = rootStack.pop() ?? null;
if (rootStack.length === 0) {
rootStack.length = 0;
}
}
}
function registerDisposer(dispose) {
if (currentRoot) {
currentRoot.disposers.push(dispose);
}
}
function hasActiveRoot() {
return currentRoot !== null;
}
// src/reactive/cleanup.ts
var currentCleanupCollector = null;
function onCleanup(fn) {
currentCleanupCollector?.(fn);
}
function setCleanupCollector(collector) {
const prev = currentCleanupCollector;
currentCleanupCollector = collector;
return prev;
}
// src/reactive/dev.ts
var __DEV__ = typeof process !== "undefined" ? process.env?.NODE_ENV !== "production" : true;
var _errorHandler = null;
function onError(handler) {
_errorHandler = handler;
}
function reportError(error, source) {
if (_errorHandler) {
try {
_errorHandler(error, source ? { source } : {});
} catch {
}
}
if (__DEV__) {
console.error(`[forma] ${source ?? "Unknown"} error:`, error);
}
}
var POOL_SIZE = 32;
var MAX_REENTRANT_RUNS = 100;
var pool = [];
for (let i = 0; i < POOL_SIZE; i++) pool.push([]);
var poolIdx = POOL_SIZE;
function acquireArray() {
if (poolIdx > 0) {
const arr = pool[--poolIdx];
arr.length = 0;
return arr;
}
return [];
}
function releaseArray(arr) {
arr.length = 0;
if (poolIdx < POOL_SIZE) {
pool[poolIdx++] = arr;
}
}
function runCleanup(fn) {
if (fn === void 0) return;
try {
fn();
} catch (e) {
reportError(e, "effect cleanup");
}
}
function runCleanups(bag) {
if (bag === void 0) return;
for (let i = 0; i < bag.length; i++) {
try {
bag[i]();
} catch (e) {
reportError(e, "effect cleanup");
}
}
}
function internalEffect(fn) {
const dispose = alienSignals.effect(fn);
if (hasActiveRoot()) {
registerDisposer(dispose);
}
return dispose;
}
function createEffect(fn) {
const shouldRegister = hasActiveRoot();
let cleanup2;
let cleanupBag;
let nextCleanup;
let nextCleanupBag;
const addCleanup = (cb) => {
if (nextCleanupBag !== void 0) {
nextCleanupBag.push(cb);
return;
}
if (nextCleanup !== void 0) {
const bag = acquireArray();
bag.push(nextCleanup, cb);
nextCleanup = void 0;
nextCleanupBag = bag;
return;
}
nextCleanup = cb;
};
let skipCleanupInfra = false;
let firstRun = true;
let running = false;
let rerunRequested = false;
const runOnce = () => {
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
if (skipCleanupInfra) {
try {
fn();
} catch (e) {
reportError(e, "effect");
}
return;
}
nextCleanup = void 0;
nextCleanupBag = void 0;
const prevCollector = setCleanupCollector(addCleanup);
try {
const result = fn();
if (typeof result === "function") {
addCleanup(result);
}
if (nextCleanup === void 0 && nextCleanupBag === void 0) {
if (firstRun) skipCleanupInfra = true;
return;
}
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} catch (e) {
reportError(e, "effect");
if (nextCleanupBag !== void 0) {
cleanupBag = nextCleanupBag;
} else {
cleanup2 = nextCleanup;
}
} finally {
setCleanupCollector(prevCollector);
firstRun = false;
}
};
const safeFn = () => {
if (running) {
rerunRequested = true;
return;
}
running = true;
try {
let reentrantRuns = 0;
do {
rerunRequested = false;
runOnce();
if (rerunRequested) {
reentrantRuns++;
if (reentrantRuns >= MAX_REENTRANT_RUNS) {
reportError(
new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} re-entrant runs`),
"effect"
);
rerunRequested = false;
}
}
} while (rerunRequested);
} finally {
running = false;
}
};
const dispose = alienSignals.effect(safeFn);
let disposed = false;
const wrappedDispose = () => {
if (disposed) return;
disposed = true;
dispose();
if (cleanup2 !== void 0) {
runCleanup(cleanup2);
cleanup2 = void 0;
}
if (cleanupBag !== void 0) {
runCleanups(cleanupBag);
releaseArray(cleanupBag);
cleanupBag = void 0;
}
};
if (shouldRegister) {
registerDisposer(wrappedDispose);
}
return wrappedDispose;
}
// src/reactive/memo.ts
var createMemo = chunkFPSLC62A_cjs.createComputed;
function batch(fn) {
alienSignals.startBatch();
try {
fn();
} finally {
alienSignals.endBatch();
}
}
function untrack(fn) {
alienSignals.pauseTracking();
try {
return fn();
} finally {
alienSignals.resumeTracking();
}
}
// src/reactive/on.ts
function on(deps, fn, options) {
let prev;
let isFirst = true;
return () => {
const value2 = deps();
if (options?.defer && isFirst) {
isFirst = false;
prev = value2;
return void 0;
}
const result = untrack(() => fn(value2, prev));
prev = value2;
return result;
};
}
// src/reactive/ref.ts
function createRef(initialValue) {
return { current: initialValue };
}
// src/reactive/reducer.ts
function createReducer(reducer, initialState) {
const [state, setState] = chunkFPSLC62A_cjs.createSignal(initialState);
const dispatch = (action) => {
setState((prev) => reducer(prev, action));
};
return [state, dispatch];
}
// src/reactive/suspense-context.ts
var currentSuspenseContext = null;
var suspenseStack = [];
function pushSuspenseContext(ctx) {
suspenseStack.push(currentSuspenseContext);
currentSuspenseContext = ctx;
}
function popSuspenseContext() {
currentSuspenseContext = suspenseStack.pop() ?? null;
}
function getSuspenseContext() {
return currentSuspenseContext;
}
// src/reactive/resource.ts
function createResource(source, fetcher, options) {
const [data, setData] = chunkFPSLC62A_cjs.createSignal(options?.initialValue);
const [loading, setLoading] = chunkFPSLC62A_cjs.createValueSignal(false);
const [error, setError] = chunkFPSLC62A_cjs.createValueSignal(void 0);
const suspenseCtx = getSuspenseContext();
let abortController = null;
let fetchVersion = 0;
const doFetch = () => {
const sourceValue = untrack(source);
if (abortController) {
abortController.abort();
}
const controller = new AbortController();
abortController = controller;
const version = ++fetchVersion;
const isLatest = () => version === fetchVersion;
let suspensePending = false;
if (suspenseCtx) {
suspenseCtx.increment();
suspensePending = true;
}
setLoading(true);
setError(void 0);
Promise.resolve(fetcher(sourceValue)).then((result) => {
if (isLatest() && !controller.signal.aborted) {
setData(() => result);
}
}).catch((err) => {
if (isLatest() && !controller.signal.aborted) {
if (err?.name !== "AbortError") {
setError(err);
}
}
}).finally(() => {
if (suspensePending) suspenseCtx?.decrement();
if (isLatest()) {
setLoading(false);
if (abortController === controller) {
abortController = null;
}
}
});
};
internalEffect(() => {
source();
doFetch();
});
const resource = (() => data());
resource.loading = loading;
resource.error = error;
resource.refetch = doFetch;
resource.mutate = (value2) => setData(() => value2);
return resource;
}
// src/dom/element.ts
var Fragment = /* @__PURE__ */ Symbol.for("forma.fragment");
var SVG_NS = "http://www.w3.org/2000/svg";
var XLINK_NS = "http://www.w3.org/1999/xlink";
var SVG_TAGS = /* @__PURE__ */ new Set([
"svg",
"path",
"circle",
"rect",
"line",
"polyline",
"polygon",
"ellipse",
"g",
"text",
"tspan",
"textPath",
"defs",
"use",
"symbol",
"clipPath",
"mask",
"pattern",
"marker",
"linearGradient",
"radialGradient",
"stop",
"filter",
"feGaussianBlur",
"feColorMatrix",
"feOffset",
"feBlend",
"feMerge",
"feMergeNode",
"feComposite",
"feFlood",
"feMorphology",
"feTurbulence",
"feDisplacementMap",
"feImage",
"foreignObject",
"animate",
"animateTransform",
"animateMotion",
"set",
"image",
"switch",
"desc",
"title",
"metadata"
]);
var BOOLEAN_ATTRS = /* @__PURE__ */ new Set([
"disabled",
"checked",
"readonly",
"required",
"autofocus",
"autoplay",
"controls",
"default",
"defer",
"formnovalidate",
"hidden",
"ismap",
"loop",
"multiple",
"muted",
"nomodule",
"novalidate",
"open",
"playsinline",
"reversed",
"selected",
"async"
]);
var ELEMENT_PROTOS = null;
function getProto(tag) {
if (!ELEMENT_PROTOS) {
ELEMENT_PROTOS = /* @__PURE__ */ Object.create(null);
for (const t of [
"div",
"span",
"p",
"a",
"li",
"ul",
"ol",
"button",
"input",
"label",
"h1",
"h2",
"h3",
"h4",
"h5",
"h6",
"section",
"header",
"footer",
"main",
"nav",
"table",
"tr",
"td",
"th",
"tbody",
"img",
"form",
"select",
"option",
"textarea",
"i",
"b",
"strong",
"em",
"small",
"article",
"aside",
"details",
"summary"
]) {
ELEMENT_PROTOS[t] = document.createElement(t);
}
}
return ELEMENT_PROTOS[tag] ?? (ELEMENT_PROTOS[tag] = document.createElement(tag));
}
var EVENT_NAMES = /* @__PURE__ */ Object.create(null);
function eventName(key) {
return EVENT_NAMES[key] ?? (EVENT_NAMES[key] = key.slice(2).toLowerCase());
}
var ABORT_SYM = /* @__PURE__ */ Symbol.for("forma-abort");
function getAbortController(el) {
let controller = el[ABORT_SYM];
if (!controller) {
controller = new AbortController();
el[ABORT_SYM] = controller;
}
return controller;
}
function cleanup(el) {
const controller = el[ABORT_SYM];
if (controller) {
controller.abort();
delete el[ABORT_SYM];
}
}
var CACHE_SYM = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function getCache(el) {
return el[CACHE_SYM] ?? (el[CACHE_SYM] = /* @__PURE__ */ Object.create(null));
}
function handleClass(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache["class"] === v) return;
cache["class"] = v;
if (el instanceof HTMLElement) {
el.className = v;
} else {
el.setAttribute("class", v);
}
});
} else {
const cache = getCache(el);
if (cache["class"] === value2) return;
cache["class"] = value2;
if (el instanceof HTMLElement) {
el.className = value2;
} else {
el.setAttribute("class", value2);
}
}
}
function handleStyle(el, _key, value2) {
if (typeof value2 === "function") {
let prevKeys = [];
internalEffect(() => {
const v = value2();
if (typeof v === "string") {
const cache = getCache(el);
if (cache["style"] === v) return;
cache["style"] = v;
prevKeys = [];
el.style.cssText = v;
} else if (v && typeof v === "object") {
const style = el.style;
const nextKeys = Object.keys(v);
for (const k of prevKeys) {
if (!(k in v)) {
style.removeProperty(k.replace(/[A-Z]/g, (c) => "-" + c.toLowerCase()));
}
}
Object.assign(style, v);
prevKeys = nextKeys;
}
});
} else if (typeof value2 === "string") {
const cache = getCache(el);
if (cache["style"] === value2) return;
cache["style"] = value2;
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
}
function handleEvent(el, key, value2) {
const controller = getAbortController(el);
el.addEventListener(
eventName(key),
value2,
{ signal: controller.signal }
);
}
function handleInnerHTML(el, _key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const resolved = value2();
if (resolved == null) {
el.innerHTML = "";
return;
}
if (typeof resolved !== "object" || !("__html" in resolved)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof resolved
);
}
const html = resolved.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
const cache = getCache(el);
if (cache["innerHTML"] === html) return;
cache["innerHTML"] = html;
el.innerHTML = html;
});
} else {
if (value2 == null) {
el.innerHTML = "";
return;
}
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
}
}
function handleXLink(el, key, value2) {
const localName = key.slice(6);
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(v));
}
});
} else {
if (value2 == null || value2 === false) {
el.removeAttributeNS(XLINK_NS, localName);
} else {
el.setAttributeNS(XLINK_NS, key, String(value2));
}
}
}
function handleBooleanAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
const cache = getCache(el);
if (cache[key] === v) return;
cache[key] = v;
if (v) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
});
} else {
const cache = getCache(el);
if (cache[key] === value2) return;
cache[key] = value2;
if (value2) {
el.setAttribute(key, "");
} else {
el.removeAttribute(key);
}
}
}
function handleGenericAttr(el, key, value2) {
if (typeof value2 === "function") {
internalEffect(() => {
const v = value2();
if (v == null || v === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(v);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
});
} else {
if (value2 == null || value2 === false) {
const cache = getCache(el);
if (cache[key] === null) return;
cache[key] = null;
el.removeAttribute(key);
} else {
const strVal = String(value2);
const cache = getCache(el);
if (cache[key] === strVal) return;
cache[key] = strVal;
el.setAttribute(key, strVal);
}
}
}
var PROP_HANDLERS = /* @__PURE__ */ new Map();
PROP_HANDLERS.set("class", handleClass);
PROP_HANDLERS.set("className", handleClass);
PROP_HANDLERS.set("style", handleStyle);
PROP_HANDLERS.set("ref", () => {
});
PROP_HANDLERS.set("dangerouslySetInnerHTML", handleInnerHTML);
for (const attr of BOOLEAN_ATTRS) {
PROP_HANDLERS.set(attr, handleBooleanAttr);
}
function applyProp(el, key, value2) {
if (key === "class") {
handleClass(el, key, value2);
return;
}
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
return;
}
const handler = PROP_HANDLERS.get(key);
if (handler) {
handler(el, key, value2);
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
handleXLink(el, key, value2);
return;
}
handleGenericAttr(el, key, value2);
}
function applyStaticProp(el, key, value2) {
if (value2 == null || value2 === false) return;
if (key === "class" || key === "className") {
el.className = value2;
return;
}
if (key === "style") {
if (typeof value2 === "string") {
el.style.cssText = value2;
} else if (value2 && typeof value2 === "object") {
Object.assign(el.style, value2);
}
return;
}
if (key === "dangerouslySetInnerHTML") {
if (typeof value2 !== "object" || !("__html" in value2)) {
throw new TypeError(
"dangerouslySetInnerHTML: expected { __html: string }, got " + typeof value2
);
}
const html = value2.__html;
if (typeof html !== "string") {
throw new TypeError(
"dangerouslySetInnerHTML: __html must be a string, got " + typeof html
);
}
el.innerHTML = html;
return;
}
if (key.charCodeAt(0) === 120 && key.startsWith("xlink:")) {
el.setAttributeNS(XLINK_NS, key, String(value2));
return;
}
if (BOOLEAN_ATTRS.has(key)) {
if (value2) el.setAttribute(key, "");
return;
}
if (value2 === true) {
el.setAttribute(key, "");
} else {
el.setAttribute(key, String(value2));
}
}
function appendChild(parent, child) {
if (child instanceof Node) {
parent.appendChild(child);
return;
}
if (typeof child === "string") {
parent.appendChild(new Text(child));
return;
}
if (child == null || child === false || child === true) {
return;
}
if (typeof child === "number") {
parent.appendChild(new Text(String(child)));
return;
}
if (typeof child === "function") {
if (parent instanceof Element) {
parent[DYNAMIC_CHILD_SYM] = true;
}
let currentNode = null;
internalEffect(() => {
const v = child();
if (v instanceof Node) {
if (currentNode) {
parent.replaceChild(v, currentNode);
} else {
parent.appendChild(v);
}
currentNode = v;
} else {
const text = typeof v === "symbol" ? String(v) : String(v ?? "");
if (!currentNode) {
currentNode = new Text(text);
parent.appendChild(currentNode);
} else if (currentNode.nodeType === 3) {
currentNode.data = text;
} else {
const tn = new Text(text);
parent.replaceChild(tn, currentNode);
currentNode = tn;
}
}
});
return;
}
if (Array.isArray(child)) {
for (const item of child) {
appendChild(parent, item);
}
return;
}
}
function h(tag, props, ...children) {
if (tag === Fragment) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
const tagName = tag;
if (hydrating) {
return { type: "element", tag: tagName, props: props ?? null, children };
}
let el;
if (ELEMENT_PROTOS && ELEMENT_PROTOS[tagName]) {
el = ELEMENT_PROTOS[tagName].cloneNode(false);
} else if (SVG_TAGS.has(tagName)) {
el = document.createElementNS(SVG_NS, tagName);
} else {
el = getProto(tagName).cloneNode(false);
}
if (props) {
let hasDynamic = false;
for (const key in props) {
if (key === "ref") continue;
const value2 = props[key];
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
handleEvent(el, key, value2);
continue;
}
if (typeof value2 === "function") {
if (!hasDynamic) {
el[CACHE_SYM] = /* @__PURE__ */ Object.create(null);
hasDynamic = true;
}
applyProp(el, key, value2);
continue;
}
applyStaticProp(el, key, value2);
}
}
const childLen = children.length;
if (childLen === 1) {
const only = children[0];
if (typeof only === "string") {
el.textContent = only;
} else if (typeof only === "number") {
el.textContent = String(only);
} else {
appendChild(el, only);
}
} else if (childLen > 1) {
for (const child of children) {
appendChild(el, child);
}
}
if (props && typeof props["ref"] === "function") {
props["ref"](el);
}
return el;
}
function fragment(...children) {
const frag = document.createDocumentFragment();
for (const child of children) {
appendChild(frag, child);
}
return frag;
}
// src/dom/show.ts
function createShow(when, thenFn, elseFn) {
if (hydrating) {
const branch = when() ? thenFn() : elseFn?.() ?? null;
return {
type: "show",
condition: when,
whenTrue: thenFn,
whenFalse: elseFn,
initialBranch: branch
};
}
const startMarker = document.createComment("forma-show");
const endMarker = document.createComment("/forma-show");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let currentNode = null;
let lastTruthy = null;
let currentDispose = null;
const showDispose = internalEffect(() => {
const truthy = !!when();
const DEBUG = typeof globalThis.__FORMA_DEBUG__ !== "undefined";
const DEBUG_LABEL = DEBUG ? thenFn.toString().slice(0, 60) : "";
if (truthy === lastTruthy) {
if (DEBUG) console.log("[forma:show] skip (same)", truthy, DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show]", lastTruthy, "\u2192", truthy, DEBUG_LABEL);
lastTruthy = truthy;
const parent = startMarker.parentNode;
if (!parent) {
if (DEBUG) console.warn("[forma:show] parentNode is null! skipping.", DEBUG_LABEL);
return;
}
if (DEBUG) console.log("[forma:show] parent:", parent.nodeName, "inDoc:", document.contains(parent));
if (currentDispose) {
currentDispose();
currentDispose = null;
}
if (currentNode) {
if (currentNode.parentNode === parent) {
parent.removeChild(currentNode);
} else {
while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {
parent.removeChild(startMarker.nextSibling);
}
}
}
const branchFn = truthy ? thenFn : elseFn;
if (branchFn) {
let branchDispose;
currentNode = createRoot((dispose) => {
branchDispose = dispose;
return untrack(() => branchFn());
});
currentDispose = branchDispose;
} else {
currentNode = null;
}
if (currentNode) {
parent.insertBefore(currentNode, endMarker);
}
});
fragment2.__showDispose = () => {
showDispose();
if (currentDispose) {
currentDispose();
currentDispose = null;
}
};
return fragment2;
}
// src/dom/hydrate.ts
var hydrating = false;
function setHydrating(value2) {
hydrating = value2;
}
function isDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "element";
}
function isShowDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "show";
}
function isListDescriptor(v) {
return v != null && typeof v === "object" && "type" in v && v.type === "list";
}
function applyDynamicProps(el, props) {
if (!props) return;
for (const key in props) {
const value2 = props[key];
if (typeof value2 !== "function") continue;
if (key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.length > 2) {
el.addEventListener(key.slice(2).toLowerCase(), value2);
continue;
}
const fn = value2;
const attrKey = key;
internalEffect(() => {
const v = fn();
if (v === false || v == null) {
el.removeAttribute(attrKey);
} else if (v === true) {
el.setAttribute(attrKey, "");
} else {
el.setAttribute(attrKey, String(v));
}
});
}
}
function ensureNode(value2) {
if (value2 instanceof Node) return value2;
if (value2 == null || value2 === false || value2 === true) return null;
if (typeof value2 === "string") return new Text(value2);
if (typeof value2 === "number") return new Text(String(value2));
if (isDescriptor(value2)) return descriptorToElement(value2);
if (isShowDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createShow(
value2.condition,
() => ensureNode(value2.whenTrue()) ?? document.createComment("empty"),
value2.whenFalse ? () => ensureNode(value2.whenFalse()) ?? document.createComment("empty") : void 0
);
} finally {
hydrating = prevH;
}
}
if (isListDescriptor(value2)) {
const prevH = hydrating;
hydrating = false;
try {
return createList(value2.items, value2.keyFn, value2.renderFn, value2.options);
} finally {
hydrating = prevH;
}
}
return null;
}
function descriptorToElement(desc) {
const prevHydrating = hydrating;
hydrating = false;
try {
const children = desc.children.map((child) => {
if (isDescriptor(child)) return descriptorToElement(child);
if (isShowDescriptor(child)) return ensureNode(child);
if (isListDescriptor(child)) return ensureNode(child);
return child;
});
return h(desc.tag, desc.props, ...children);
} finally {
hydrating = prevHydrating;
}
}
function isIslandStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 105;
}
function isShowStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 115;
}
function isTextStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 116;
}
function isListStart(data) {
return data.length >= 4 && data.charCodeAt(0) === 102 && data.charCodeAt(1) === 58 && data.charCodeAt(2) === 108;
}
function findClosingMarker(start) {
const closing = "/" + start.data;
let node = start.nextSibling;
while (node) {
if (node.nodeType === 8 && node.data === closing) {
return node;
}
node = node.nextSibling;
}
return null;
}
function findTextBetween(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 3) return node;
node = node.nextSibling;
}
return null;
}
function nextElementBetweenMarkers(start, end) {
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) return node;
node = node.nextSibling;
}
return void 0;
}
function extractContentBetweenMarkers(start, end) {
const frag = document.createDocumentFragment();
let node = start.nextSibling;
while (node && node !== end) {
const next = node.nextSibling;
frag.appendChild(node);
node = next;
}
return frag;
}
function setupShowEffect(desc, marker) {
let currentCondition = !!desc.condition();
let thenFragment = null;
let elseFragment = null;
const hasSSRContent = marker.start.nextSibling !== marker.end;
if (!hasSSRContent && currentCondition) {
if (__DEV__) console.warn("[forma] Hydration: show condition mismatch \u2014 SSR empty but client condition is true");
const trueBranch = desc.whenTrue();
if (trueBranch instanceof Node) {
marker.start.parentNode.insertBefore(trueBranch, marker.end);
}
}
internalEffect(() => {
const next = !!desc.condition();
if (next === currentCondition) return;
currentCondition = next;
const parent = marker.start.parentNode;
if (!parent) return;
const current = extractContentBetweenMarkers(marker.start, marker.end);
if (!next) {
thenFragment = current;
} else {
elseFragment = current;
}
let branch = next ? thenFragment ?? desc.whenTrue() : desc.whenFalse ? elseFragment ?? desc.whenFalse() : null;
if (next && thenFragment) thenFragment = null;
if (!next && elseFragment) elseFragment = null;
if (branch != null && !(branch instanceof Node)) {
branch = ensureNode(branch);
}
if (branch instanceof Node) {
parent.insertBefore(branch, marker.end);
}
});
}
function adoptBranchContent(desc, regionStart, regionEnd) {
if (isDescriptor(desc)) {
const el = nextElementBetweenMarkers(regionStart, regionEnd);
if (el) adoptNode(desc, el);
} else if (isShowDescriptor(desc)) {
let node = regionStart.nextSibling;
while (node && node !== regionEnd) {
if (node.nodeType === 8 && isShowStart(node.data)) {
const innerStart = node;
const innerEnd = findClosingMarker(innerStart);
if (innerEnd) {
if (desc.initialBranch) {
adoptBranchContent(desc.initialBranch, innerStart, innerEnd);
}
setupShowEffect(desc, { start: innerStart, end: innerEnd});
}
break;
}
node = node.nextSibling;
}
}
}
function adoptNode(desc, ssrEl) {
if (!ssrEl || ssrEl.tagName !== desc.tag.toUpperCase()) {
if (__DEV__) console.warn(`Hydration mismatch: expected <${desc.tag}>, got <${ssrEl?.tagName?.toLowerCase() ?? "nothing"}>`);
const fresh = descriptorToElement(desc);
if (ssrEl) ssrEl.replaceWith(fresh);
return;
}
applyDynamicProps(ssrEl, desc.props);
let cursor = ssrEl.firstChild;
for (const child of desc.children) {
if (child === false || child == null) continue;
if (isDescriptor(child)) {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
while (cursor && cursor.nodeType === 1 && cursor.hasAttribute("data-forma-island")) {
cursor = cursor.nextSibling;
}
if (!cursor) {
ssrEl.appendChild(descriptorToElement(child));
continue;
}
if (cursor.nodeType === 1) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(child, el);
} else if (cursor.nodeType === 8 && isIslandStart(cursor.data)) {
const end = findClosingMarker(cursor);
const fresh = descriptorToElement(child);
if (end) {
end.parentNode.insertBefore(fresh, end);
cursor = end.nextSibling;
} else {
ssrEl.appendChild(fresh);
cursor = null;
}
} else {
ssrEl.appendChild(descriptorToElement(child));
}
} else if (isShowDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isShowStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
if (child.initialBranch) {
adoptBranchContent(child.initialBranch, start, end);
}
setupShowEffect(child, { start, end});
cursor = end.nextSibling;
}
}
} else if (isListDescriptor(child)) {
while (cursor && !(cursor.nodeType === 8 && isListStart(cursor.data))) {
cursor = cursor.nextSibling;
}
if (cursor) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
const ssrKeyMap = /* @__PURE__ */ new Map();
const ssrElements = [];
let node = start.nextSibling;
while (node && node !== end) {
if (node.nodeType === 1) {
const el = node;
ssrElements.push(el);
const key = el.getAttribute("data-forma-key");
if (key != null) {
ssrKeyMap.set(key, el);
}
}
node = node.nextSibling;
}
const currentItems = untrack(() => child.items());
const listKeyFn = child.keyFn;
const listRenderFn = child.renderFn;
const useIndexFallback = ssrKeyMap.size === 0 && ssrElements.length > 0;
const adoptedNodes = [];
const adoptedItems = [];
const usedIndices = /* @__PURE__ */ new Set();
for (let i = 0; i < currentItems.length; i++) {
const item = currentItems[i];
const key = listKeyFn(item);
let ssrNode;
if (useIndexFallback) {
if (i < ssrElements.length) {
ssrNode = ssrElements[i];
usedIndices.add(i);
}
} else {
ssrNode = ssrKeyMap.get(String(key));
if (ssrNode) ssrKeyMap.delete(String(key));
}
if (ssrNode) {
adoptedNodes.push(ssrNode);
adoptedItems.push(item);
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: list item key "${key}" not found in SSR \u2014 rendering fresh`);
const prevHydrating = hydrating;
hydrating = false;
try {
const [getIndex] = chunkFPSLC62A_cjs.createSignal(i);
const fresh = listRenderFn(item, getIndex);
end.parentNode.insertBefore(fresh, end);
adoptedNodes.push(fresh);
adoptedItems.push(item);
} finally {
hydrating = prevHydrating;
}
}
}
if (useIndexFallback) {
for (let i = 0; i < ssrElements.length; i++) {
if (!usedIndices.has(i) && ssrElements[i].parentNode) {
ssrElements[i].parentNode.removeChild(ssrElements[i]);
}
}
} else {
for (const [unusedKey, unusedNode] of ssrKeyMap) {
if (__DEV__) console.warn(`[FormaJS] Hydration: removing extra SSR list item with key "${unusedKey}"`);
if (unusedNode.parentNode) {
unusedNode.parentNode.removeChild(unusedNode);
}
}
}
const parent = start.parentNode;
for (const adoptedNode of adoptedNodes) {
parent.insertBefore(adoptedNode, end);
}
let cache = /* @__PURE__ */ new Map();
for (let i = 0; i < adoptedItems.length; i++) {
const item = adoptedItems[i];
const key = listKeyFn(item);
const [getIndex, setIndex] = chunkFPSLC62A_cjs.createSignal(i);
cache.set(key, {
element: adoptedNodes[i],
item,
getIndex,
setIndex
});
}
let reconcileNodes = adoptedNodes.slice();
let reconcileItems = adoptedItems.slice();
internalEffect(() => {
const newItems = child.items();
const parent2 = start.parentNode;
if (!parent2) return;
const result = reconcileList(
parent2,
reconcileItems,
newItems,
reconcileNodes,
listKeyFn,
(item) => {
const prevHydrating = hydrating;
hydrating = false;
try {
const key = listKeyFn(item);
const [getIndex, setIndex] = chunkFPSLC62A_cjs.createSignal(0);
const element = untrack(() => listRenderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
} finally {
hydrating = prevHydrating;
}
},
(_node, item) => {
const key = listKeyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
},
end
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < newItems.length; i++) {
const key = listKeyFn(newItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
reconcileNodes = result.nodes;
reconcileItems = result.items;
});
cursor = end.nextSibling;
}
}
} else if (typeof child === "function") {
while (cursor && cursor.nodeType === 3 && !cursor.data.trim()) {
cursor = cursor.nextSibling;
}
if (cursor && cursor.nodeType === 1) {
const initial = child();
if (isDescriptor(initial)) {
const el = cursor;
cursor = cursor.nextSibling;
adoptNode(initial, el);
continue;
}
}
if (cursor && cursor.nodeType === 8) {
const data = cursor.data;
if (isTextStart(data)) {
const endMarker = findClosingMarker(cursor);
let textNode = cursor.nextSibling;
if (!textNode || textNode.nodeType !== 3) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for marker ${data} \u2014 SSR walker should emit content between markers`);
const created = document.createTextNode("");
cursor.parentNode.insertBefore(created, endMarker || cursor.nextSibling);
textNode = created;
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = endMarker ? endMarker.nextSibling : textNode.nextSibling;
} else if (isShowStart(data)) {
const start = cursor;
const end = findClosingMarker(start);
if (end) {
let textNode = findTextBetween(start, end);
if (!textNode) {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for show marker ${start.data} \u2014 SSR walker should emit content between markers`);
textNode = document.createTextNode("");
start.parentNode.insertBefore(textNode, end);
}
internalEffect(() => {
textNode.data = String(child());
});
cursor = end.nextSibling;
} else {
cursor = cursor.nextSibling;
}
} else {
cursor = cursor.nextSibling;
}
} else if (cursor && cursor.nodeType === 3) {
const textNode = cursor;
cursor = cursor.nextSibling;
internalEffect(() => {
textNode.data = String(child());
});
} else {
if (__DEV__) console.warn(`[FormaJS] Hydration: created text node in empty <${ssrEl.tagName.toLowerCase()}> \u2014 IR may not cover this component`);
const textNode = document.createTextNode("");
ssrEl.appendChild(textNode);
internalEffect(() => {
textNode.data = String(child());
});
}
} else if (typeof child === "string" || typeof child === "number") {
if (cursor && cursor.nodeType === 3) {
cursor = cursor.nextSibling;
}
}
}
}
function hydrateIsland(component, target) {
const hasSSRContent = target.childElementCount > 0 || target.childNodes.length > 0 && Array.from(target.childNodes).some((n) => n.nodeType === 1 || n.nodeType === 3 && n.data.trim());
if (!hasSSRContent) {
if (__DEV__) {
const name = target.getAttribute("data-forma-component") || "unknown";
console.warn(
`[forma] Island "${name}" has no SSR content \u2014 falling back to CSR. This means the IR walker did not render content between ISLAND_START and ISLAND_END.`
);
}
const result = component();
if (result instanceof Element) {
for (const attr of Array.from(target.attributes)) {
if (attr.name.startsWith("data-forma-")) {
result.setAttribute(attr.name, attr.value);
}
}
target.replaceWith(result);
return result;
} else if (result instanceof Node) {
target.appendChild(result);
}
return target;
}
setHydrating(true);
let descriptor;
try {
descriptor = component();
} finally {
setHydrating(false);
}
if (!descriptor || !isDescriptor(descriptor)) {
target.removeAttribute("data-forma-ssr");
return target;
}
if (target.hasAttribute("data-forma-island")) {
adoptNode(descriptor, target);
} else {
adoptNode(descriptor, target.children[0]);
}
target.removeAttribute("data-forma-ssr");
return target;
}
// src/dom/list.ts
function longestIncreasingSubsequence(arr) {
const n = arr.length;
if (n === 0) return [];
const tails = new Int32Array(n);
const tailIndices = new Int32Array(n);
const predecessor = new Int32Array(n).fill(-1);
let tailsLen = 0;
for (let i = 0; i < n; i++) {
const val = arr[i];
let lo = 0, hi = tailsLen;
while (lo < hi) {
const mid = lo + hi >> 1;
if (tails[mid] < val) lo = mid + 1;
else hi = mid;
}
tails[lo] = val;
tailIndices[lo] = i;
if (lo > 0) predecessor[i] = tailIndices[lo - 1];
if (lo >= tailsLen) tailsLen++;
}
const result = new Array(tailsLen);
let idx = tailIndices[tailsLen - 1];
for (let i = tailsLen - 1; i >= 0; i--) {
result[i] = idx;
idx = predecessor[idx];
}
return result;
}
var SMALL_LIST_THRESHOLD = 32;
var ABORT_SYM2 = /* @__PURE__ */ Symbol.for("forma-abort");
var CACHE_SYM2 = /* @__PURE__ */ Symbol.for("forma-attr-cache");
var DYNAMIC_CHILD_SYM2 = /* @__PURE__ */ Symbol.for("forma-dynamic-child");
function canPatchStaticElement(target, source) {
return target instanceof HTMLElement && source instanceof HTMLElement && target.tagName === source.tagName && !target[ABORT_SYM2] && !target[CACHE_SYM2] && !target[DYNAMIC_CHILD_SYM2] && !source[ABORT_SYM2] && !source[CACHE_SYM2] && !source[DYNAMIC_CHILD_SYM2];
}
function patchStaticElement(target, source) {
const sourceAttrNames = /* @__PURE__ */ new Set();
for (const attr of Array.from(source.attributes)) {
sourceAttrNames.add(attr.name);
if (target.getAttribute(attr.name) !== attr.value) {
target.setAttribute(attr.name, attr.value);
}
}
for (const attr of Array.from(target.attributes)) {
if (!sourceAttrNames.has(attr.name)) {
target.removeAttribute(attr.name);
}
}
target.replaceChildren(...Array.from(source.childNodes));
}
function reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
const oldKeys = new Array(oldLen);
for (let i = 0; i < oldLen; i++) {
oldKeys[i] = keyFn(oldItems[i]);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
let found = -1;
for (let j = 0; j < oldLen; j++) {
if (!oldUsed[j] && oldKeys[j] === key) {
found = j;
oldUsed[j] = 1;
break;
}
}
oldIndices[i] = found;
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function reconcileList(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks) {
const oldLen = oldItems.length;
const newLen = newItems.length;
if (newLen === 0) {
for (let i = 0; i < oldLen; i++) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
return { nodes: [], items: [] };
}
if (oldLen === 0) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = createFn(newItems[i]);
if (beforeNode) {
parent.insertBefore(node, beforeNode);
} else {
parent.appendChild(node);
}
hooks?.onInsert?.(node);
nodes[i] = node;
}
return { nodes, items: newItems };
}
if (oldLen < SMALL_LIST_THRESHOLD) {
return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);
}
const oldKeyMap = /* @__PURE__ */ new Map();
for (let i = 0; i < oldLen; i++) {
oldKeyMap.set(keyFn(oldItems[i]), i);
}
const oldIndices = new Array(newLen);
const oldUsed = new Uint8Array(oldLen);
for (let i = 0; i < newLen; i++) {
const key = keyFn(newItems[i]);
const oldIdx = oldKeyMap.get(key);
if (oldIdx !== void 0) {
oldIndices[i] = oldIdx;
oldUsed[oldIdx] = 1;
} else {
oldIndices[i] = -1;
}
}
for (let i = 0; i < oldLen; i++) {
if (!oldUsed[i]) {
if (hooks?.onBeforeRemove) {
const node = oldNodes[i];
hooks.onBeforeRemove(node, () => {
if (node.parentNode) node.parentNode.removeChild(node);
});
} else {
parent.removeChild(oldNodes[i]);
}
}
}
if (oldLen === newLen) {
let allSameOrder = true;
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== i) {
allSameOrder = false;
break;
}
}
if (allSameOrder) {
const nodes = new Array(newLen);
for (let i = 0; i < newLen; i++) {
const node = oldNodes[i];
updateFn(node, newItems[i]);
nodes[i] = node;
}
return { nodes, items: newItems };
}
}
const reusedIndices = [];
const reusedPositions = [];
for (let i = 0; i < newLen; i++) {
if (oldIndices[i] !== -1) {
reusedIndices.push(oldIndices[i]);
reusedPositions.push(i);
}
}
const lisOfReused = longestIncreasingSubsequence(reusedIndices);
const lisFlags = new Uint8Array(newLen);
for (const li of lisOfReused) {
lisFlags[reusedPositions[li]] = 1;
}
const newNodes = new Array(newLen);
let nextSibling = beforeNode ?? null;
for (let i = newLen - 1; i >= 0; i--) {
let node;
let isNew = false;
if (oldIndices[i] === -1) {
node = createFn(newItems[i]);
isNew = true;
} else {
node = oldNodes[oldIndices[i]];
updateFn(node, newItems[i]);
if (lisFlags[i]) {
newNodes[i] = node;
nextSibling = node;
continue;
}
}
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
if (isNew) hooks?.onInsert?.(node);
newNodes[i] = node;
nextSibling = node;
}
return { nodes: newNodes, items: newItems };
}
function createList(items, keyFn, renderFn, options) {
if (hydrating) {
return { type: "list", items, keyFn, renderFn, options };
}
const startMarker = document.createComment("forma-list-start");
const endMarker = document.createComment("forma-list-end");
const fragment2 = document.createDocumentFragment();
fragment2.appendChild(startMarker);
fragment2.appendChild(endMarker);
let cache = /* @__PURE__ */ new Map();
let currentNodes = [];
let currentItems = [];
const updateOnItemChange = options?.updateOnItemChange ?? "none";
internalEffect(() => {
const newItems = items();
const parent = startMarker.parentNode;
if (!parent) {
return;
}
if (!Array.isArray(newItems)) {
if (__DEV__) {
console.warn("[forma] createList: value is not an array, treating as empty");
}
for (const node of currentNodes) {
if (node.parentNode === parent) parent.removeChild(node);
}
cache = /* @__PURE__ */ new Map();
currentNodes = [];
currentItems = [];
return;
}
let cleanItems = newItems;
for (let i = 0; i < newItems.length; i++) {
if (newItems[i] == null) {
cleanItems = newItems.filter((item) => item != null);
break;
}
}
if (__DEV__) {
const seen = /* @__PURE__ */ new Set();
for (const item of cleanItems) {
const key = keyFn(item);
if (seen.has(key)) {
console.warn("[forma] createList: duplicate key detected:", key);
}
seen.add(key);
}
}
const updateRow = updateOnItemChange === "rerender" ? (node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (!cached) return;
if (cached.item === item) return;
cached.item = item;
if (!(node instanceof HTMLElement)) return;
if (node[ABORT_SYM2] || node[CACHE_SYM2] || node[DYNAMIC_CHILD_SYM2]) {
return;
}
const next = untrack(() => renderFn(item, cached.getIndex));
if (canPatchStaticElement(node, next)) {
patchStaticElement(node, next);
cached.element = node;
}
} : (_node, item) => {
const key = keyFn(item);
const cached = cache.get(key);
if (cached) cached.item = item;
};
const result = reconcileList(
parent,
currentItems,
cleanItems,
currentNodes,
keyFn,
// createFn: create element + cache entry
(item) => {
const key = keyFn(item);
const [getIndex, setIndex] = chunkFPSLC62A_cjs.createSignal(0);
const element = untrack(() => renderFn(item, getIndex));
cache.set(key, { element, item, getIndex, setIndex });
return element;
},
updateRow,
// beforeNode: insert items before the end marker
endMarker
);
const newCache = /* @__PURE__ */ new Map();
for (let i = 0; i < cleanItems.length; i++) {
const key = keyFn(cleanItems[i]);
const cached = cache.get(key);
if (cached) {
cached.setIndex(i);
newCache.set(key, cached);
}
}
cache = newCache;
currentNodes = result.nodes;
currentItems = result.items;
});
return fragment2;
}
exports.Fragment = Fragment;
exports.__DEV__ = __DEV__;
exports.batch = batch;
exports.cleanup = cleanup;
exports.createEffect = createEffect;
exports.createList = createList;
exports.createMemo = createMemo;
exports.createReducer = createReducer;
exports.createRef = createRef;
exports.createResource = createResource;
exports.createRoot = createRoot;
exports.createShow = createShow;
exports.fragment = fragment;
exports.h = h;
exports.hydrateIsland = hydrateIsland;
exports.internalEffect = internalEffect;
exports.longestIncreasingSubsequence = longestIncreasingSubsequence;
exports.on = on;
exports.onCleanup = onCleanup;
exports.onError = onError;
exports.popSuspenseContext = popSuspenseContext;
exports.pushSuspenseContext = pushSuspenseContext;
exports.reconcileList = reconcileList;
exports.untrack = untrack;
//# sourceMappingURL=chunk-TSQ7AKFT.cjs.map
//# sourceMappingURL=chunk-TSQ7AKFT.cjs.map

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display