@slexkit/mcp 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -3,7 +3,7 @@
3
3
  "sources": ["../src/index.ts", "../../../dist/runtime.js"],
4
4
  "sourcesContent": [
5
5
  "#!/usr/bin/env node\nimport { createInterface } from \"node:readline\";\nimport { readFile } from \"node:fs/promises\";\n\nimport { parseSlexSource, validateSlexSource } from \"slexkit/runtime\";\n\ntype JsonRpcRequest = {\n jsonrpc?: \"2.0\";\n id?: string | number | null;\n method: string;\n params?: Record<string, unknown>;\n};\n\ntype ToolDefinition = {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>) => Promise<unknown> | unknown;\n};\n\ntype Manifest = {\n version: string;\n pages: Array<{\n id: string;\n group: string;\n title: string;\n summary: string;\n href: string;\n rawHref: string;\n sourcePath: string;\n body: string;\n }>;\n expressionContext: unknown;\n stdlib: unknown;\n capabilities: unknown;\n components: Array<{\n type: string;\n title: string;\n category: string;\n status: string;\n state: string;\n since: string;\n summary: string;\n docsHref: string;\n rawHref: string;\n props: Record<string, unknown>;\n children: unknown;\n examples: Array<{ id: string; title: string; description?: string; source: unknown }>;\n }>;\n};\n\nconst dataBase = new URL(\"./data/\", import.meta.url);\n\nasync function readDataFile(name: string): Promise<string> {\n return readFile(new URL(name, dataBase), \"utf-8\");\n}\n\nconst manifest = JSON.parse(await readDataFile(\"slexkit-ai-manifest.json\")) as Manifest;\n\nfunction stringArg(args: Record<string, unknown>, key: string): string {\n const value = args[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction optionalStringArg(args: Record<string, unknown>, key: string): string | undefined {\n const value = args[key];\n return typeof value === \"string\" && value ? value : undefined;\n}\n\nfunction booleanArg(args: Record<string, unknown>, key: string): boolean {\n return args[key] === true;\n}\n\nfunction jsonSchema(properties: Record<string, unknown>, required: string[] = []): Record<string, unknown> {\n return {\n type: \"object\",\n properties,\n required,\n additionalProperties: false,\n };\n}\n\nfunction pageMatches(page: Manifest[\"pages\"][number], query: string): boolean {\n const needle = query.toLowerCase();\n return [\n page.id,\n page.group,\n page.title,\n page.summary,\n page.href,\n page.rawHref,\n page.sourcePath,\n page.body,\n ].some((value) => value.toLowerCase().includes(needle));\n}\n\nfunction findPage(args: Record<string, unknown>): Manifest[\"pages\"][number] | undefined {\n const slug = optionalStringArg(args, \"slug\");\n const url = optionalStringArg(args, \"url\");\n if (url) {\n const normalized = url.replace(/^https?:\\/\\/[^/]+/, \"\");\n return manifest.pages.find((page) => page.rawHref === normalized || page.href === normalized || page.rawHref === url || page.href === url);\n }\n if (slug) {\n return manifest.pages.find((page) => page.id === slug || page.id.endsWith(`/${slug}`) || page.rawHref.endsWith(`/${slug}.md`));\n }\n return undefined;\n}\n\nfunction searchPages(args: Record<string, unknown>) {\n const group = optionalStringArg(args, \"group\");\n const query = optionalStringArg(args, \"query\");\n return manifest.pages\n .filter((page) => !group || page.group.toLowerCase() === group.toLowerCase())\n .filter((page) => !query || pageMatches(page, query))\n .map(({ body: _body, ...page }) => page);\n}\n\nfunction sourceFromTemplate(template: string): string {\n if (template === \"calculator\") {\n return `{\n slex: \"0.1\",\n namespace: \"calculator\",\n g: { a: 10, b: 5, samples: [10, 5, 20] },\n layout: {\n \"card:calc\": {\n title: \"Calculator\",\n \"input:a\": { label: \"A\", \"$value\": \"String(g.a)\", onchange: \"g.a = Number($event || 0)\" },\n \"input:b\": { label: \"B\", \"$value\": \"String(g.b)\", onchange: \"g.b = Number($event || 0)\" },\n \"stat:sum\": { label: \"Sum\", \"$value\": \"std.math.round(g.a + g.b, 2)\" },\n \"stat:mean\": { label: \"Mean\", \"$value\": \"std.format.fixed(std.stats.mean(g.samples), 1)\" }\n }\n }\n}`;\n }\n\n if (template === \"stdlib-calculator\") {\n return `{\n slex: \"0.1\",\n namespace: \"stdlib_calculator\",\n g: { done: 7, total: 12, payloadBytes: 1536000, latency: [120, 95, 143, 110] },\n layout: {\n \"card:std\": {\n title: \"Stdlib calculator\",\n \"stat:progress\": { label: \"Progress\", \"$value\": \"std.format.percent(std.math.safeDivide(g.done, g.total), 1)\" },\n \"stat:average\": { label: \"Avg latency\", \"$value\": \"std.format.fixed(std.stats.mean(g.latency), 1)\", unit: \"ms\" },\n \"stat:payload\": { label: \"Payload\", \"$value\": \"std.units.bytes(g.payloadBytes)\" }\n }\n }\n}`;\n }\n\n if (template === \"secure-network-card\") {\n return `{\n slex: \"0.1\",\n namespace: \"secure_network_card\",\n g: {\n status: \"idle\",\n async load() {\n this.status = \"loading\";\n try {\n var result = await api.get(\"https://api.example.com/status\", { credentials: \"omit\" });\n this.status = \"HTTP \" + result.status;\n } catch (error) {\n this.status = api.isPolicyError(error) ? \"blocked by policy\" : api.errorMessage(error);\n }\n }\n },\n layout: {\n \"card:network\": {\n title: \"Secure network card\",\n \"button:load\": { label: \"Load\", onclick: \"g.load()\" },\n \"text:status\": { \"$text\": \"g.status\" }\n }\n }\n}`;\n }\n\n if (template === \"toolhost-form\") {\n return `{\n slex: \"0.1\",\n namespace: \"approval_form\",\n g: { approved: false, reason: \"\" },\n layout: {\n \"card:approval\": {\n title: \"Review request\",\n \"checkbox:approved\": { label: \"Approve\", \"$checked\": \"g.approved\", onchange: \"g.approved = Boolean($event)\" },\n \"input:reason\": { label: \"Reason\", \"$value\": \"g.reason\", onchange: \"g.reason = String($event || '')\" },\n \"submit:actions\": { submitLabel: \"Submit\", ignoreLabel: \"Ignore\", returnKeys: [\"approved\", \"reason\"] }\n }\n }\n}`;\n }\n\n if (template === \"host-integration\") {\n return `import { createSlexKitMarkdownRuntimeHost } from \"slexkit\";\nimport \"slexkit/style.css\";\n\nconst runtime = createSlexKitMarkdownRuntimeHost({\n mode: \"secure\",\n secureFrame: { runtimeUrl: \"/runtime.js\" }\n});\n\nruntime.mountBlock({\n artifactId: \"message-1\",\n blockId: \"message-1:block-1\",\n source,\n container\n});`;\n }\n\n return `{\n slex: \"0.1\",\n namespace: \"status\",\n g: { done: 3, total: 4 },\n layout: {\n \"card:summary\": {\n title: \"Status\",\n \"text:count\": { \"$text\": \"g.done + '/' + g.total + ' complete'\" },\n \"progress:bar\": { \"$value\": \"g.done / g.total * 100\" }\n }\n }\n}`;\n}\n\nconst tools: ToolDefinition[] = [\n {\n name: \"slexkitDocs\",\n description: \"Search or fetch SlexKit Markdown docs. Raw docs are .md files with explicit slex fences; no .mdx routes are used.\",\n inputSchema: jsonSchema({\n query: { type: \"string\", description: \"Search text. Searches titles, summaries, URLs, source paths, and body text.\" },\n group: { type: \"string\", description: \"Optional group filter: Guides, Components, Runtime, ToolHost, Security, Packages, Icons.\" },\n slug: { type: \"string\", description: \"Optional page id or slug to fetch, such as components/card or card.\" },\n url: { type: \"string\", description: \"Optional href or raw .md URL to fetch.\" },\n includeCapabilities: { type: \"boolean\", description: \"When true, include expression context, stdlib, and api capability summaries.\" },\n }),\n handler(args) {\n const capabilities = booleanArg(args, \"includeCapabilities\")\n ? {\n expressionContext: manifest.expressionContext,\n stdlib: manifest.stdlib,\n capabilities: manifest.capabilities,\n }\n : undefined;\n const page = findPage(args);\n if (page) return { version: manifest.version, page, capabilities };\n return { version: manifest.version, pages: searchPages(args), capabilities };\n },\n },\n {\n name: \"slexkitExamples\",\n description: \"Browse SlexKit component examples, ToolHost examples, and host integration snippets.\",\n inputSchema: jsonSchema({\n type: { type: \"string\", description: \"Optional component type, such as card, input, stat, or submit.\" },\n template: { type: \"string\", enum: [\"status\", \"calculator\", \"stdlib-calculator\", \"secure-network-card\", \"toolhost-form\", \"host-integration\"], description: \"Optional generated example template.\" },\n }),\n handler(args) {\n const template = optionalStringArg(args, \"template\");\n if (template) {\n const source = sourceFromTemplate(template);\n const parsed = template === \"host-integration\" ? { ok: true } : parseSlexSource(source);\n return { template, source, valid: parsed.ok };\n }\n\n const type = optionalStringArg(args, \"type\");\n const components = manifest.components.filter((component) => !type || component.type === type);\n if (type && components.length === 0) {\n return { error: \"component_not_found\", type, available: manifest.components.map((component) => component.type) };\n }\n return {\n components: components.map((component) => ({\n type: component.type,\n title: component.title,\n summary: component.summary,\n rawHref: component.rawHref,\n examples: component.examples.map((example) => ({\n id: example.id,\n title: example.title,\n description: example.description,\n source: JSON.stringify(example.source, null, 2),\n })),\n })),\n };\n },\n },\n {\n name: \"slexkitValidate\",\n description: \"Parse Slex source and return diagnostics plus component usage.\",\n inputSchema: jsonSchema({ source: { type: \"string\", description: \"Slex object literal source.\" } }, [\"source\"]),\n handler(args) {\n const source = stringArg(args, \"source\");\n const validation = validateSlexSource(source, { mode: \"secure\" });\n if (!validation.ok) return validation;\n const { value: _value, ...result } = validation;\n return result;\n },\n },\n];\n\nconst toolByName = new Map(tools.map((tool) => [tool.name, tool]));\n\nfunction send(message: unknown): void {\n process.stdout.write(`${JSON.stringify(message)}\\n`);\n}\n\nfunction respond(id: JsonRpcRequest[\"id\"], result: unknown): void {\n send({ jsonrpc: \"2.0\", id, result });\n}\n\nfunction respondError(id: JsonRpcRequest[\"id\"], code: number, message: string, data?: unknown): void {\n send({ jsonrpc: \"2.0\", id, error: { code, message, data } });\n}\n\nasync function handleRequest(request: JsonRpcRequest): Promise<void> {\n if (request.id === undefined && request.method.startsWith(\"notifications/\")) return;\n\n if (request.method === \"initialize\") {\n respond(request.id, {\n protocolVersion: \"2025-06-18\",\n capabilities: { tools: {} },\n serverInfo: { name: \"@slexkit/mcp\", version: manifest.version },\n });\n return;\n }\n\n if (request.method === \"tools/list\") {\n respond(request.id, {\n tools: tools.map(({ name, description, inputSchema }) => ({ name, description, inputSchema })),\n });\n return;\n }\n\n if (request.method === \"tools/call\") {\n const params = request.params ?? {};\n const name = typeof params.name === \"string\" ? params.name : \"\";\n const args = params.arguments && typeof params.arguments === \"object\" ? params.arguments as Record<string, unknown> : {};\n const tool = toolByName.get(name);\n if (!tool) {\n respondError(request.id, -32602, `Unknown tool: ${name}`, { available: [...toolByName.keys()] });\n return;\n }\n const result = await tool.handler(args);\n respond(request.id, {\n content: [{ type: \"text\", text: typeof result === \"string\" ? result : JSON.stringify(result, null, 2) }],\n structuredContent: result,\n });\n return;\n }\n\n respondError(request.id, -32601, `Method not found: ${request.method}`);\n}\n\nconst rl = createInterface({ input: process.stdin, crlfDelay: Infinity });\nrl.on(\"line\", (line) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n void (async () => {\n try {\n await handleRequest(JSON.parse(trimmed) as JsonRpcRequest);\n } catch (error) {\n respondError(null, -32700, error instanceof Error ? error.message : String(error));\n }\n })();\n});\n",
6
- "// src/engine/reactive.ts\nvar ITERATE_KEY = Symbol(\"iterate\");\nvar REVISION_KEY = Symbol(\"revision\");\nvar activeEffect = null;\nvar activeScope = null;\nvar batchDepth = 0;\nvar pendingEffects = new Set;\nvar targetDeps = new WeakMap;\nvar proxyCache = new WeakMap;\nvar rawTargets = new WeakMap;\nvar rootTargets = new WeakMap;\n\nclass ReactiveScope {\n cleanups = [];\n effects = new Set;\n disposed = false;\n dispose() {\n if (this.disposed)\n return;\n this.disposed = true;\n for (const effect of Array.from(this.effects))\n effect.stop();\n this.effects.clear();\n for (let i = this.cleanups.length - 1;i >= 0; i -= 1) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n }\n}\n\nclass ReactiveEffect {\n fn;\n scope;\n deps = [];\n cleanups = [];\n stopped = false;\n running = false;\n constructor(fn, scope) {\n this.fn = fn;\n this.scope = scope;\n if (scope)\n scope.effects.add(this);\n }\n run() {\n if (this.stopped || this.running)\n return;\n this.running = true;\n this.cleanupDeps();\n this.runCleanups();\n const previousEffect = activeEffect;\n const previousScope = activeScope;\n activeEffect = this;\n if (this.scope)\n activeScope = this.scope;\n try {\n this.fn();\n } finally {\n activeEffect = previousEffect;\n activeScope = previousScope;\n this.running = false;\n }\n }\n stop() {\n if (this.stopped)\n return;\n this.stopped = true;\n this.cleanupDeps();\n this.runCleanups();\n this.scope?.effects.delete(this);\n }\n cleanupDeps() {\n for (const dep of this.deps)\n dep.delete(this);\n this.deps.length = 0;\n }\n runCleanups() {\n for (let i = this.cleanups.length - 1;i >= 0; i -= 1) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n }\n}\nfunction getDep(target, key) {\n let deps = targetDeps.get(target);\n if (!deps) {\n deps = new Map;\n targetDeps.set(target, deps);\n }\n let dep = deps.get(key);\n if (!dep) {\n dep = new Set;\n deps.set(key, dep);\n }\n return dep;\n}\nfunction track(target, key) {\n if (!activeEffect)\n return;\n const dep = getDep(target, key);\n if (dep.has(activeEffect))\n return;\n dep.add(activeEffect);\n activeEffect.deps.push(dep);\n}\nfunction trigger(target, key) {\n const deps = targetDeps.get(target);\n if (!deps)\n return;\n const effects = new Set;\n const add = (dep) => {\n if (!dep)\n return;\n for (const effect of dep)\n effects.add(effect);\n };\n add(deps.get(key));\n if (key !== REVISION_KEY)\n add(deps.get(ITERATE_KEY));\n for (const effect of effects)\n schedule(effect);\n}\nfunction schedule(effect) {\n if (effect.stopped)\n return;\n if (batchDepth > 0) {\n pendingEffects.add(effect);\n return;\n }\n effect.run();\n}\nfunction flush() {\n while (pendingEffects.size > 0) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects)\n effect.run();\n }\n}\nfunction notifyRoot(target) {\n const root = rootTargets.get(target) ?? target;\n trigger(root, REVISION_KEY);\n}\nfunction toReactive(value, root) {\n const cached = proxyCache.get(value);\n if (cached)\n return cached;\n const proxy = new Proxy(value, {\n get(target, key, receiver) {\n if (key === \"__slexkitRaw\")\n return target;\n if (key === \"__slexkitRoot\")\n return root;\n track(target, key);\n const result = Reflect.get(target, key, receiver);\n if (result && typeof result === \"object\") {\n return toReactive(result, root);\n }\n return result;\n },\n set(target, key, next, receiver) {\n const previous = Reflect.get(target, key, receiver);\n const hadKey = Object.prototype.hasOwnProperty.call(target, key);\n const ok = Reflect.set(target, key, next, receiver);\n if (ok && (!Object.is(previous, next) || !hadKey)) {\n trigger(target, key);\n if (!hadKey)\n trigger(target, ITERATE_KEY);\n notifyRoot(target);\n }\n return ok;\n },\n deleteProperty(target, key) {\n const hadKey = Object.prototype.hasOwnProperty.call(target, key);\n const ok = Reflect.deleteProperty(target, key);\n if (ok && hadKey) {\n trigger(target, key);\n trigger(target, ITERATE_KEY);\n notifyRoot(target);\n }\n return ok;\n },\n ownKeys(target) {\n track(target, ITERATE_KEY);\n return Reflect.ownKeys(target);\n }\n });\n proxyCache.set(value, proxy);\n rawTargets.set(proxy, value);\n rootTargets.set(value, root);\n rootTargets.set(proxy, root);\n return proxy;\n}\nfunction createReactiveState(value) {\n return toReactive(value, value);\n}\nfunction asReactiveValue(value, owner) {\n if (!value || typeof value !== \"object\")\n return value;\n if (rawTargets.has(value) || rootTargets.has(value))\n return value;\n if (!owner || typeof owner !== \"object\")\n return value;\n const root = rootTargets.get(owner) ?? rawTargets.get(owner);\n if (!root)\n return value;\n return toReactive(value, root);\n}\nfunction trackReactiveValue(value) {\n if (!value || typeof value !== \"object\")\n return;\n const root = rootTargets.get(value) ?? rawTargets.get(value);\n if (root)\n track(root, REVISION_KEY);\n}\nfunction createRoot(fn) {\n const scope = new ReactiveScope;\n const previousScope = activeScope;\n const previousEffect = activeEffect;\n activeScope = scope;\n activeEffect = null;\n try {\n return fn(() => scope.dispose());\n } finally {\n activeEffect = previousEffect;\n activeScope = previousScope;\n }\n}\nfunction createEffect(fn) {\n const effect = new ReactiveEffect(fn, activeScope);\n effect.run();\n return () => effect.stop();\n}\nfunction createMemo(fn) {\n const source = {};\n let value;\n createEffect(() => {\n value = fn();\n trigger(source, \"value\");\n });\n return () => {\n track(source, \"value\");\n return value;\n };\n}\nfunction createSignal(initial) {\n const source = {};\n let value = initial;\n return [\n () => {\n track(source, \"value\");\n return value;\n },\n (next) => {\n if (Object.is(value, next))\n return;\n value = next;\n trigger(source, \"value\");\n }\n ];\n}\nfunction onCleanup(cleanup) {\n if (activeEffect) {\n activeEffect.cleanups.push(cleanup);\n return;\n }\n if (activeScope) {\n activeScope.cleanups.push(cleanup);\n }\n}\nfunction batch(fn) {\n batchDepth += 1;\n try {\n return fn();\n } finally {\n batchDepth -= 1;\n if (batchDepth === 0)\n flush();\n }\n}\n\n// src/engine/store.ts\nvar _stores = new Map;\nfunction getStore(ns) {\n if (!_stores.has(ns)) {\n _stores.set(ns, {\n g: createReactiveState({}),\n components: createReactiveState({}),\n componentTypes: createReactiveState({}),\n layouts: [],\n roots: new Map,\n cleanups: new Map\n });\n }\n return _stores.get(ns);\n}\nfunction peekStore(ns) {\n return _stores.get(ns);\n}\nfunction deleteStore(ns) {\n return _stores.delete(ns);\n}\n\n// src/engine/merge.ts\nfunction deepMerge(target, source) {\n for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key))\n continue;\n const srcVal = source[key];\n if (typeof srcVal === \"function\") {\n target[key] = srcVal;\n } else if (srcVal !== null && typeof srcVal === \"object\" && !Array.isArray(srcVal)) {\n if (!(key in target) || typeof target[key] !== \"object\") {\n target[key] = {};\n }\n deepMerge(target[key], srcVal);\n } else {\n target[key] = srcVal;\n }\n }\n return target;\n}\n\n// src/engine/registry.ts\nvar _registry = new Map;\nfunction register(type, renderFn, options = {}) {\n _registry.set(type, {\n renderFn,\n options: {\n state: options.state ?? \"none\"\n }\n });\n}\nfunction getRenderer(type) {\n return _registry.get(type)?.renderFn;\n}\nfunction getComponentStateMode(type) {\n return _registry.get(type)?.options.state ?? \"none\";\n}\n\n// src/engine/eval.ts\nvar lastValues = new Map;\nvar SKIP_EAGER_TRACK = Symbol.for(\"slexkit.skipEagerTrack\");\nvar EAGER_TRACK_TARGET = Symbol.for(\"slexkit.eagerTrackTarget\");\nfunction clearEvalCache(ns) {\n const prefix = `${ns}:`;\n for (const key of Array.from(lastValues.keys())) {\n if (key.startsWith(prefix))\n lastValues.delete(key);\n }\n}\nfunction evalRead(expr, context, ns, path) {\n try {\n for (const value of Object.values(context)) {\n if (value && (typeof value === \"object\" || typeof value === \"function\") && value[SKIP_EAGER_TRACK]) {\n continue;\n }\n const target = value && (typeof value === \"object\" || typeof value === \"function\") ? value[EAGER_TRACK_TARGET] ?? value : value;\n trackReactiveValue(target);\n }\n const revision = context.$revision;\n if (typeof revision === \"function\")\n revision();\n const keys = Object.keys(context);\n const vals = Object.values(context);\n const fn = new Function(...keys, `\"use strict\"; return (${expr});`);\n const result = fn(...vals);\n if (path !== undefined)\n lastValues.set(`${ns ?? \"?\"}:${path}:${expr}`, result);\n return result;\n } catch (e) {\n const cacheKey = path !== undefined ? `${ns ?? \"?\"}:${path}:${expr}` : expr;\n const last = lastValues.get(cacheKey);\n console.warn(`[SlexKit][${ns || \"?\"}] $eval error at ${path || \"?\"}:`, expr, e.message);\n if (last !== undefined)\n return last;\n return;\n }\n}\nfunction execWrite(stmt, context, ns, path) {\n try {\n const keys = Object.keys(context);\n const vals = Object.values(context);\n const fn = new Function(...keys, `\"use strict\"; { ${stmt} }`);\n batch(() => fn(...vals));\n } catch (e) {\n console.warn(`[SlexKit][${ns || \"?\"}] @exec error at ${path || \"?\"}:`, stmt, e.message);\n }\n}\n\n// src/engine/component-scope.ts\nvar componentDisposers = new WeakMap;\nvar flushDom;\nfunction configureComponentScope(options) {\n flushDom = options.flush;\n}\nfunction createComponentAccessor(read) {\n const subscribers = new Set;\n let current = read();\n let stopEffect;\n const start = () => {\n if (stopEffect)\n return;\n stopEffect = createEffect(() => {\n current = read();\n for (const subscriber of Array.from(subscribers))\n subscriber(current);\n flushDom?.();\n });\n };\n const accessor = () => current;\n accessor.subscribe = (run) => {\n const wasIdle = subscribers.size === 0;\n subscribers.add(run);\n if (wasIdle)\n start();\n else\n run(current);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stopEffect?.();\n stopEffect = undefined;\n }\n };\n };\n return accessor;\n}\nfunction renderComponent(render) {\n return render() ?? null;\n}\nfunction attachComponentDisposer(el, dispose) {\n componentDisposers.set(el, dispose);\n}\nfunction disposeComponent(el) {\n const dispose = componentDisposers.get(el);\n if (!dispose)\n return;\n componentDisposers.delete(el);\n dispose();\n}\n\n// src/engine/engineering.ts\nvar NUMBER_RE = /^[+-]?(?:(?:\\d+(?:\\.\\d*)?)|(?:\\.\\d+))(?:[eE][+-]?\\d+)?/;\nvar PREFIX_FACTORS = {\n p: 0.000000000001,\n n: 0.000000001,\n u: 0.000001,\n \"µ\": 0.000001,\n m: 0.001,\n k: 1000,\n K: 1000,\n M: 1e6,\n meg: 1e6,\n G: 1e9,\n T: 1000000000000\n};\nvar PREFIXES = [\"meg\", \"p\", \"n\", \"u\", \"µ\", \"m\", \"k\", \"K\", \"M\", \"G\", \"T\"];\nfunction invalid(raw, error) {\n return {\n raw,\n number: null,\n valid: false,\n prefix: \"\",\n unit: \"\",\n normalized: \"\",\n error\n };\n}\nfunction parseSuffix(suffix) {\n const compact = suffix.trim();\n if (!compact)\n return { prefix: \"\", unit: \"\" };\n for (const prefix of PREFIXES) {\n if (prefix === \"meg\") {\n if (compact.toLowerCase().startsWith(\"meg\")) {\n return { prefix: \"meg\", unit: compact.slice(3).trim() };\n }\n continue;\n }\n if (compact.startsWith(prefix)) {\n return { prefix, unit: compact.slice(prefix.length).trim() };\n }\n }\n return { prefix: \"\", unit: compact };\n}\nfunction parseEngineeringNumber(input) {\n const raw = input == null ? \"\" : String(input);\n const source = raw.trim();\n if (!source) {\n return {\n raw,\n number: null,\n valid: false,\n prefix: \"\",\n unit: \"\",\n normalized: \"\",\n error: \"empty\"\n };\n }\n const numberMatch = source.match(NUMBER_RE);\n if (!numberMatch)\n return invalid(raw, \"invalid_number\");\n const numberText = numberMatch[0];\n const rest = source.slice(numberText.length).trim();\n const base = Number(numberText);\n if (!Number.isFinite(base))\n return invalid(raw, \"invalid_number\");\n const { prefix, unit } = parseSuffix(rest);\n const multiplier = prefix ? PREFIX_FACTORS[prefix] : 1;\n if (!Number.isFinite(multiplier))\n return invalid(raw, \"invalid_prefix\");\n const number = base * multiplier;\n if (!Number.isFinite(number))\n return invalid(raw, \"out_of_range\");\n return {\n raw,\n number,\n valid: true,\n prefix,\n unit,\n normalized: `${number}${unit ? ` ${unit}` : \"\"}`\n };\n}\nfunction isEngineeringNumberResult(value) {\n return !!value && typeof value === \"object\" && \"raw\" in value && \"number\" in value && \"valid\" in value && \"prefix\" in value && \"unit\" in value && \"normalized\" in value;\n}\n\n// src/engine/stdlib.ts\nfunction toNumber(value) {\n return Number(value);\n}\nfunction finiteNumber(value, fallback = 0) {\n const parsed = toNumber(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\nfunction digits(value, fallback) {\n const parsed = Math.trunc(finiteNumber(value, fallback));\n return Math.max(0, Math.min(20, parsed));\n}\nfunction finiteValues(values) {\n if (!Array.isArray(values))\n return [];\n return values.map(toNumber).filter(Number.isFinite);\n}\nfunction formatFixed(value, digitCount = 2) {\n const parsed = toNumber(value);\n return Number.isFinite(parsed) ? parsed.toFixed(digitCount) : \"NaN\";\n}\nfunction locale(value) {\n return typeof value === \"string\" && value.trim() ? value : \"en-US\";\n}\nfunction currencyCode(value) {\n return typeof value === \"string\" && /^[A-Za-z]{3}$/.test(value) ? value.toUpperCase() : \"USD\";\n}\nfunction formatNumber(value, digitCount, localeName, notation, style, currency, minimumFractionDigits = 0) {\n const parsed = toNumber(value);\n if (!Number.isFinite(parsed))\n return \"NaN\";\n return new Intl.NumberFormat(localeName, {\n maximumFractionDigits: digitCount,\n minimumFractionDigits,\n notation,\n style,\n currency\n }).format(parsed);\n}\nfunction freezeDeep(value) {\n for (const child of Object.values(value)) {\n if (child && typeof child === \"object\")\n freezeDeep(child);\n }\n return Object.freeze(value);\n}\nvar slexkitStd = freezeDeep({\n math: {\n clamp(value, min, max) {\n const lower = finiteNumber(min);\n const upper = finiteNumber(max);\n const parsed = finiteNumber(value);\n return Math.min(Math.max(parsed, Math.min(lower, upper)), Math.max(lower, upper));\n },\n round(value, digitValue = 0) {\n const factor = 10 ** digits(digitValue, 0);\n return Math.round(finiteNumber(value) * factor) / factor;\n },\n safeDivide(numerator, denominator, fallback = 0) {\n const divisor = toNumber(denominator);\n if (!Number.isFinite(divisor) || divisor === 0)\n return finiteNumber(fallback);\n const quotient = toNumber(numerator) / divisor;\n return Number.isFinite(quotient) ? quotient : finiteNumber(fallback);\n },\n percent(part, total, digitValue = 1) {\n const ratio = slexkitStd.math.safeDivide(part, total, NaN) * 100;\n return slexkitStd.math.round(ratio, digitValue);\n },\n lerp(start, end, t) {\n const a = finiteNumber(start);\n return a + (finiteNumber(end) - a) * finiteNumber(t);\n }\n },\n stats: {\n sum(values) {\n return finiteValues(values).reduce((total, value) => total + value, 0);\n },\n mean(values) {\n const numbers = finiteValues(values);\n return numbers.length ? slexkitStd.stats.sum(numbers) / numbers.length : NaN;\n },\n min(values) {\n const numbers = finiteValues(values);\n return numbers.length ? Math.min(...numbers) : NaN;\n },\n max(values) {\n const numbers = finiteValues(values);\n return numbers.length ? Math.max(...numbers) : NaN;\n },\n median(values) {\n const numbers = finiteValues(values).sort((a, b) => a - b);\n if (!numbers.length)\n return NaN;\n const middle = Math.floor(numbers.length / 2);\n return numbers.length % 2 ? numbers[middle] : (numbers[middle - 1] + numbers[middle]) / 2;\n }\n },\n format: {\n fixed(value, digitValue = 2) {\n return formatFixed(value, digits(digitValue, 2));\n },\n number(value, digitValue = 0, localeName = \"en-US\") {\n return formatNumber(value, digits(digitValue, 0), locale(localeName));\n },\n compact(value, digitValue = 1, localeName = \"en-US\") {\n return formatNumber(value, digits(digitValue, 1), locale(localeName), \"compact\");\n },\n percent(ratio, digitValue = 1) {\n return `${formatFixed(finiteNumber(ratio) * 100, digits(digitValue, 1))}%`;\n },\n currency(value, currency = \"USD\", localeName = \"en-US\") {\n return formatNumber(value, 2, locale(localeName), undefined, \"currency\", currencyCode(currency), 2);\n }\n },\n units: {\n withUnit(value, unit, digitValue = 2) {\n const suffix = typeof unit === \"string\" ? unit : String(unit ?? \"\");\n return `${formatFixed(value, digits(digitValue, 2))}${suffix ? ` ${suffix}` : \"\"}`;\n },\n bytes(value, digitValue = 1) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n let amount = Math.abs(finiteNumber(value));\n let index = 0;\n while (amount >= 1024 && index < units.length - 1) {\n amount /= 1024;\n index += 1;\n }\n const sign = finiteNumber(value) < 0 ? -1 : 1;\n return `${formatFixed(amount * sign, digits(digitValue, 1))} ${units[index]}`;\n },\n duration(ms, digitValue = 1) {\n const value = finiteNumber(ms);\n const abs = Math.abs(value);\n if (abs < 1000)\n return `${formatFixed(value, 0)} ms`;\n if (abs < 60000)\n return `${formatFixed(value / 1000, digits(digitValue, 1))} s`;\n if (abs < 3600000)\n return `${formatFixed(value / 60000, digits(digitValue, 1))} min`;\n return `${formatFixed(value / 3600000, digits(digitValue, 1))} h`;\n },\n si(value, unit = \"\", digitValue = 2) {\n const units = [\"\", \"k\", \"M\", \"G\", \"T\", \"P\"];\n let amount = Math.abs(finiteNumber(value));\n let index = 0;\n while (amount >= 1000 && index < units.length - 1) {\n amount /= 1000;\n index += 1;\n }\n const sign = finiteNumber(value) < 0 ? -1 : 1;\n const suffix = typeof unit === \"string\" ? unit : String(unit ?? \"\");\n return `${formatFixed(amount * sign, digits(digitValue, 2))} ${units[index]}${suffix}`.trim();\n }\n }\n});\n\n// src/engine/component-state.ts\nvar IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nvar componentStateProxies = new WeakMap;\nfunction isReadableValue(value) {\n return !!value && (typeof value === \"object\" || typeof value === \"function\") && typeof value.subscribe === \"function\";\n}\nfunction rawRecord(value) {\n return value.__slexkitRaw ?? value;\n}\nfunction componentPropName(key) {\n return key.startsWith(\"$\") ? key.slice(1) : key;\n}\nfunction isEventProp(key, value) {\n return key.startsWith(\"on\") && typeof value === \"function\";\n}\nfunction isWritableComponent(type) {\n const mode = getComponentStateMode(type);\n return mode === \"value\" || mode === \"checked\" || mode === \"enabled\";\n}\nfunction isReadableComponent(type) {\n return getComponentStateMode(type) === \"readable\";\n}\nfunction isStatefulComponent(type) {\n return getComponentStateMode(type) !== \"none\";\n}\nfunction isInputStateProp(type, propName) {\n const mode = getComponentStateMode(type);\n if (mode === \"value\")\n return propName === \"value\";\n if (mode === \"checked\")\n return propName === \"value\" || propName === \"checked\";\n if (mode === \"enabled\")\n return propName === \"enabled\";\n return false;\n}\nfunction assignEngineeringState(state, value) {\n const result = isEngineeringNumberResult(value) ? value : parseEngineeringNumber(value);\n state.value = result.raw;\n state.number = result.number;\n state.valid = result.valid;\n state.prefix = result.prefix;\n state.unit = result.unit;\n state.normalized = result.normalized;\n if (result.error)\n state.error = result.error;\n else\n delete state.error;\n}\nfunction clearEngineeringState(state) {\n delete state.number;\n delete state.valid;\n delete state.prefix;\n delete state.unit;\n delete state.normalized;\n delete state.error;\n}\nfunction assignInputType(state, inputType) {\n const previousType = state.type;\n state.type = inputType;\n if (inputType === \"engineering\" && \"value\" in state) {\n assignEngineeringState(state, state.value);\n } else if (previousType === \"engineering\" && inputType !== \"engineering\") {\n clearEngineeringState(state);\n }\n}\nfunction assignComponentProp(state, type, propName, value, force) {\n if (!force && propName in state)\n return;\n if (type === \"input\" && propName === \"value\" && state.type === \"engineering\") {\n assignEngineeringState(state, value);\n return;\n }\n if (getComponentStateMode(type) === \"checked\" && (propName === \"checked\" || propName === \"value\")) {\n const checked = !!value;\n state.checked = checked;\n state.value = checked;\n return;\n }\n if (getComponentStateMode(type) === \"enabled\" && propName === \"enabled\") {\n state.enabled = !!value;\n return;\n }\n state[propName] = value;\n}\nfunction publicComponentState(name, state, componentTypes) {\n let cached = componentStateProxies.get(state);\n if (!cached) {\n cached = new Proxy(state, {\n get(target, key, receiver) {\n if (key === SKIP_EAGER_TRACK)\n return true;\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n const currentType = componentTypes[name] ?? \"\";\n if (isWritableComponent(currentType)) {\n if (typeof key === \"string\") {\n assignComponentProp(target, currentType, key, value, true);\n return true;\n }\n return Reflect.set(target, key, value, receiver);\n }\n console.warn(`[SlexKit] Component state '${name}' is read-only. Use dynamic $ props to update output components.`);\n return true;\n },\n deleteProperty(target, key) {\n if (isWritableComponent(componentTypes[name] ?? \"\")) {\n return Reflect.deleteProperty(target, key);\n }\n console.warn(`[SlexKit] Component state '${name}' is read-only. Use dynamic $ props to update output components.`);\n return true;\n }\n });\n componentStateProxies.set(state, cached);\n }\n return cached;\n}\nfunction createGProxy(g, components, componentTypes) {\n return new Proxy(g, {\n get(target, key, receiver) {\n if (key === EAGER_TRACK_TARGET)\n return target;\n if (typeof key === \"string\" && !(key in target) && key in components) {\n return publicComponentState(key, components[key], componentTypes);\n }\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n return Reflect.set(target, key, value, receiver);\n },\n has(target, key) {\n return key in target || key in components;\n }\n });\n}\nfunction ensureComponentState(name, type, components, componentTypes) {\n if (!components[name])\n components[name] = {};\n const previousType = componentTypes[name] ?? \"\";\n if (!(isWritableComponent(previousType) && isReadableComponent(type))) {\n componentTypes[name] = type;\n }\n return components[name];\n}\nfunction syncReadableComponentProp(type, state, propName, value) {\n if (isWritableComponent(type)) {\n const unsubscribe2 = value.subscribe((next) => {\n assignComponentProp(state, type, propName, next, true);\n });\n onCleanup(unsubscribe2);\n return;\n }\n let unsubscribe;\n let cancelled = false;\n queueMicrotask(() => {\n if (cancelled)\n return;\n unsubscribe = value.subscribe((next) => {\n assignComponentProp(state, type, propName, next, true);\n });\n });\n onCleanup(() => {\n cancelled = true;\n unsubscribe?.();\n });\n}\nfunction syncComponentProps(type, name, props, components, componentTypes) {\n if (!name || !isStatefulComponent(type))\n return;\n const previousType = componentTypes[name] ?? \"\";\n if (isWritableComponent(previousType) && isReadableComponent(type))\n return;\n const state = ensureComponentState(name, type, components, componentTypes);\n if (type === \"input\" && typeof props.type === \"string\") {\n assignInputType(state, props.type);\n }\n for (const [key, value] of Object.entries(props)) {\n if (isEventProp(key, value))\n continue;\n const propName = componentPropName(key);\n const inputStateProp = isInputStateProp(type, propName);\n if (isReadableValue(value)) {\n syncReadableComponentProp(type, state, propName, value);\n } else {\n assignComponentProp(state, type, propName, value, !inputStateProp);\n }\n }\n return state;\n}\nfunction bindInputStateProps(type, state, props) {\n if (!state)\n return;\n const mode = getComponentStateMode(type);\n if (mode === \"value\") {\n props.value = createComponentAccessor(() => state.value);\n } else if (mode === \"checked\") {\n const checked = createComponentAccessor(() => !!(state.checked ?? state.value));\n props.checked = checked;\n props.value = checked;\n } else if (mode === \"enabled\") {\n props.enabled = createComponentAccessor(() => !!state.enabled);\n }\n}\nfunction applyComponentEventState(type, name, data, components, componentTypes) {\n if (!name || !isWritableComponent(type))\n return;\n const state = ensureComponentState(name, type, components, componentTypes);\n const mode = getComponentStateMode(type);\n if (mode === \"checked\") {\n const checked = !!data;\n state.checked = checked;\n state.value = checked;\n } else if (mode === \"enabled\") {\n state.enabled = !!data;\n } else if (type === \"input\" && state.type === \"engineering\") {\n assignEngineeringState(state, data);\n } else {\n state.value = data;\n }\n}\nfunction seedStaticComponentState(type, state, props) {\n if (type === \"input\" && typeof props.type === \"string\") {\n assignInputType(state, props.type);\n }\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith(\"$\") || isEventProp(key, value))\n continue;\n const propName = componentPropName(key);\n if (isInputStateProp(type, propName)) {\n assignComponentProp(state, type, propName, value, false);\n }\n }\n}\nfunction warnDuplicateState(ns, name, currentType, currentPath, previous) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is declared more than once at ${previous.path} and ${currentPath}; state is shared by namespace and component name.`);\n if (previous.type !== currentType) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is used by multiple component types (${previous.type}, ${currentType}); use distinct names when components should not share state.`);\n }\n}\nfunction dynamicStateBinding(type, props) {\n const mode = getComponentStateMode(type);\n const value = mode === \"checked\" ? props.$checked ?? props.$value : mode === \"enabled\" ? props.$enabled : props.$value;\n return typeof value === \"string\" ? value.trim() : undefined;\n}\nfunction isMirroredValueControlPair(previousType, currentType) {\n return previousType === \"input\" && currentType === \"slider\" || previousType === \"slider\" && currentType === \"input\";\n}\nfunction shouldWarnDuplicateState(currentType, currentBinding, previous) {\n if (isReadableComponent(previous.type) && isReadableComponent(currentType)) {\n return false;\n }\n if (currentBinding && previous.stateBinding === currentBinding && isMirroredValueControlPair(previous.type, currentType)) {\n return false;\n }\n return true;\n}\nfunction warnForState(ns, name, path) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is used with $for at ${path}; repeated items share one namespace-level instance state.`);\n}\nfunction prepareComponentStatesInner(layout, components, componentTypes, ns, seen, parentPath = \"\") {\n if (!layout || typeof layout !== \"object\")\n return;\n for (const [key, val] of Object.entries(layout)) {\n if (!key.includes(\":\") || typeof val !== \"object\" || val === null)\n continue;\n const [type, name] = key.split(\":\");\n const props = val;\n const path = parentPath ? `${parentPath}.${key}` : key;\n if (name && isStatefulComponent(type)) {\n const stateBinding = dynamicStateBinding(type, props);\n const previous = seen.get(name);\n if (previous) {\n if (shouldWarnDuplicateState(type, stateBinding, previous)) {\n warnDuplicateState(ns, name, type, path, previous);\n }\n } else {\n seen.set(name, { type, path, stateBinding });\n }\n if (props.$for && isWritableComponent(type))\n warnForState(ns, name, path);\n const state = ensureComponentState(name, type, components, componentTypes);\n seedStaticComponentState(type, state, props);\n }\n prepareComponentStatesInner(props, components, componentTypes, ns, seen, path);\n }\n}\nfunction prepareComponentStates(layout, components, componentTypes, ns) {\n prepareComponentStatesInner(layout, components, componentTypes, ns, new Map);\n}\nfunction buildComponentEvalContext(g, components, componentTypes, api, forCtx) {\n const ctx = {\n g: createGProxy(g, components, componentTypes),\n std: slexkitStd\n };\n const gKeys = new Set(Object.keys(rawRecord(g)));\n for (const name of Object.keys(rawRecord(components))) {\n if (name === \"std\" || name === \"g\" || name === \"api\")\n continue;\n if (IDENTIFIER.test(name) && !gKeys.has(name)) {\n ctx[name] = publicComponentState(name, components[name], componentTypes);\n }\n }\n if (api)\n ctx.api = api;\n if (forCtx) {\n for (const k of Object.keys(forCtx)) {\n if (k === \"std\")\n continue;\n Object.defineProperty(ctx, k, {\n get: () => {\n const current = forCtx[k];\n return k === \"$index\" && typeof current === \"function\" ? current() : current;\n },\n enumerable: true\n });\n }\n }\n return ctx;\n}\n\n// src/engine/renderer.ts\nvar FALLBACK_CSS = \"background:var(--muted);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);padding:0.5rem;text-align:center;font-size:0.75rem;color:var(--muted-foreground)\";\nvar defaultRenderOptions = {\n dir: \"ltr\",\n labels: {}\n};\nfunction hasComponentKey(obj) {\n return Object.keys(obj).some((k) => k.includes(\":\"));\n}\nfunction separatePropsAndChildren(obj, props, children) {\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"$if\" || k === \"$for\" || k === \"$key\")\n continue;\n if (k.includes(\":\") || typeof v === \"object\" && v !== null && Object.keys(v).length > 0 && hasComponentKey(v)) {\n children[k] = v;\n } else {\n props[k] = v;\n }\n }\n}\nfunction callHook(g, name, type) {\n const key = name ? `${type}_${name}` : `${type}_`;\n const fn = g[key];\n if (typeof fn === \"function\") {\n fn.call(g);\n }\n}\nfunction applyEnterAnimation(el, props) {\n const enterFn = props.$enter;\n if (typeof enterFn !== \"function\")\n return;\n const animClass = enterFn();\n if (animClass && typeof animClass === \"string\") {\n el.classList.add(animClass);\n el.addEventListener(\"animationend\", () => el.classList.remove(animClass), { once: true });\n }\n}\nfunction applyLeaveAnimation(el, props, callback) {\n const leaveFn = props.$leave;\n if (typeof leaveFn !== \"function\") {\n callback();\n return;\n }\n const animClass = leaveFn();\n if (animClass && typeof animClass === \"string\") {\n el.classList.add(animClass);\n el.addEventListener(\"animationend\", () => {\n callback();\n }, { once: true });\n } else {\n callback();\n }\n}\nfunction renderWithFallback(renderer, props, name, ctx, fullKey, ns) {\n try {\n return renderComponent(() => renderer(props, name, ctx));\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Render error at ${fullKey}:`, e.message);\n const fb = (ctx.document || document).createElement(\"div\");\n fb.className = \"slex-render-error\";\n fb.title = fullKey;\n fb.setAttribute(\"style\", FALLBACK_CSS);\n return fb;\n }\n}\nfunction resolveDynamicProps(props, g, components, componentTypes, api, forCtx, ns, fullKey) {\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n for (const [k, v] of Object.entries(props)) {\n if (k.startsWith(\"$\") && !k.startsWith(\"$if\") && !k.startsWith(\"$for\") && !k.startsWith(\"$key\") && typeof v === \"string\") {\n const path = `${fullKey}:${k}`;\n const memo = createMemo(() => evalRead(v, evalCtx, ns, path));\n props[k] = createComponentAccessor(memo);\n } else if (k.startsWith(\"on\") && typeof v === \"string\") {\n const stmt = v;\n const path = `${fullKey}:${k}`;\n props[k] = ($event) => execWrite(stmt, { ...evalCtx, $event: $event ?? null }, ns, path);\n }\n }\n}\nfunction resolveKeyValue(item, itemIndex, $keyProp) {\n if ($keyProp) {\n if ($keyProp === \"$value\") {\n return item;\n }\n if ($keyProp === \"id\" || $keyProp !== \"id\" && item && typeof item === \"object\") {\n return item?.[$keyProp];\n }\n }\n if (item && typeof item === \"object\" && \"id\" in item) {\n return item.id;\n }\n const primitiveTypes = [\"string\", \"number\", \"boolean\"];\n if (primitiveTypes.includes(typeof item)) {\n console.warn(\"[SlexKit] $for with primitive array items but no $key specified. Use '$key: $value' for primitive arrays. Falling back to index.\");\n return itemIndex;\n }\n console.warn(\"[SlexKit] $for array item has no 'id' property and no $key specified. Falling back to index.\");\n return itemIndex;\n}\nfunction trackForCollection(value) {\n if (!Array.isArray(value))\n return value;\n Reflect.get(value, \"length\");\n for (const item of value) {\n if (item && typeof item === \"object\") {\n for (const key of Object.keys(item)) {\n Reflect.get(item, key);\n }\n }\n }\n return value;\n}\nfunction renderIfNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n const show = createMemo(() => evalRead(props.$if, evalCtx, ns, `${fullKey}:$if`));\n let current = null;\n const leavingInstances = new Set;\n let mounting = false;\n let emit;\n const disposeInstance = (instance) => {\n if (instance.disposed)\n return;\n instance.disposed = true;\n leavingInstances.delete(instance);\n if (current === instance)\n current = null;\n disposeComponent(instance.el);\n instance.dispose();\n callHook(g, name, \"onUnmount\");\n instance.el.remove();\n };\n createEffect(() => {\n if (show()) {\n if (!current && !mounting) {\n mounting = true;\n let innerProps;\n let innerChildren;\n let currentEl;\n const dispose = createRoot((_dispose) => {\n innerProps = {};\n innerChildren = {};\n separatePropsAndChildren(props, innerProps, innerChildren);\n resolveDynamicProps(innerProps, g, components, componentTypes, api, forCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, innerProps, components, componentTypes);\n bindInputStateProps(type, componentState, innerProps);\n emit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = innerProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n currentEl = renderWithFallback(renderer, innerProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx,\n children: innerChildren,\n id: name || null,\n emit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? forCtx, ns, api, options, false)\n }, fullKey, ns);\n return _dispose;\n });\n mounting = false;\n if (currentEl) {\n container.appendChild(currentEl);\n applyEnterAnimation(currentEl, innerProps);\n callHook(g, name, \"onMount\");\n current = {\n el: currentEl,\n props: innerProps,\n dispose,\n disposed: false\n };\n } else {\n dispose();\n }\n }\n } else {\n if (current) {\n const instance = current;\n current = null;\n leavingInstances.add(instance);\n applyLeaveAnimation(instance.el, instance.props, () => {\n disposeInstance(instance);\n });\n }\n }\n });\n onCleanup(() => {\n if (current)\n disposeInstance(current);\n for (const instance of Array.from(leavingInstances))\n disposeInstance(instance);\n });\n}\nfunction renderAndMountSlot(item, index, keyVal, indexSignal, revisionSignal, renderer, type, name, props, container, g, components, componentTypes, api, forCtx, ns, fullKey, options) {\n indexSignal[1](index);\n const reactiveItem = asReactiveValue(item, g);\n const innerForCtx = {\n ...forCtx,\n $item: reactiveItem,\n $index: indexSignal[0],\n $key: keyVal,\n $revision: revisionSignal[0]\n };\n if (name) {\n innerForCtx[name] = reactiveItem;\n }\n let innerProps;\n let innerChildren;\n let el;\n let fEmit;\n const dispose = createRoot((_dispose) => {\n innerProps = {};\n innerChildren = {};\n separatePropsAndChildren(props, innerProps, innerChildren);\n resolveDynamicProps(innerProps, g, components, componentTypes, api, innerForCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, innerProps, components, componentTypes);\n bindInputStateProps(type, componentState, innerProps);\n fEmit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = innerProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n el = renderWithFallback(renderer, innerProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx: innerForCtx,\n children: innerChildren,\n id: name || null,\n emit: fEmit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? innerForCtx, ns, api, options, false)\n }, `${fullKey}[${index}]`, ns);\n return _dispose;\n });\n return {\n key: keyVal,\n el,\n forCtx: innerForCtx,\n index,\n item: reactiveItem,\n props: innerProps,\n children: innerChildren,\n indexSignal,\n revision: 0,\n revisionSignal,\n dispose\n };\n}\nfunction renderForNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const doc = container.ownerDocument || document;\n const startAnchor = doc.createComment(`slexkit-for:${fullKey}:start`);\n const endAnchor = doc.createComment(`slexkit-for:${fullKey}:end`);\n container.append(startAnchor, endAnchor);\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n const items = createMemo(() => trackForCollection(evalRead(props.$for, evalCtx, ns, `${fullKey}:$for`)));\n const $keyProp = props.$key;\n const slotMap = new Map;\n const leavingSlots = new Set;\n const disposedSlots = new WeakSet;\n const disposeSlot = (slot) => {\n if (disposedSlots.has(slot))\n return;\n disposedSlots.add(slot);\n leavingSlots.delete(slot);\n callHook(g, name, \"onUnmount\");\n if (slot.el) {\n disposeComponent(slot.el);\n slot.el.remove();\n }\n if (slot.dispose)\n slot.dispose();\n };\n createEffect(() => {\n const arr = items();\n if (!Array.isArray(arr)) {\n if (slotMap.size > 0) {\n for (const [, slot] of slotMap) {\n disposeSlot(slot);\n }\n slotMap.clear();\n }\n return;\n }\n const newKeys = arr.map((item, i) => resolveKeyValue(item, i, $keyProp));\n const newKeySet = new Set(newKeys);\n const deletedSlots = [];\n for (const [oldKey, slot] of slotMap) {\n if (!newKeySet.has(oldKey)) {\n deletedSlots.push(slot);\n slotMap.delete(oldKey);\n }\n }\n for (const slot of deletedSlots) {\n leavingSlots.add(slot);\n if (!slot.el) {\n disposeSlot(slot);\n continue;\n }\n applyLeaveAnimation(slot.el, slot.props, () => {\n disposeSlot(slot);\n });\n }\n let cursor = startAnchor;\n arr.forEach((item, index) => {\n item = asReactiveValue(item, g);\n const keyVal = newKeys[index];\n let slot = slotMap.get(keyVal);\n if (slot) {\n const indexChanged = slot.index !== index;\n const itemChanged = slot.item !== item;\n slot.forCtx.$item = item;\n slot.forCtx.$key = keyVal;\n if (name)\n slot.forCtx[name] = item;\n slot.index = index;\n slot.item = item;\n if (slot.revisionSignal) {\n slot.revision = (slot.revision ?? 0) + 1;\n slot.revisionSignal[1](slot.revision);\n }\n if (indexChanged || itemChanged) {\n if (indexChanged && slot.indexSignal) {\n slot.indexSignal[1](index);\n }\n callHook(g, name, \"onUpdate\");\n }\n } else {\n const indexSignal = createSignal(index);\n const revisionSignal = createSignal(0);\n slot = renderAndMountSlot(item, index, keyVal, indexSignal, revisionSignal, renderer, type, name, props, container, g, components, componentTypes, api, forCtx, ns, fullKey, options);\n if (!slot.el) {\n disposeSlot(slot);\n return;\n }\n applyEnterAnimation(slot.el, slot.props);\n callHook(g, name, \"onMount\");\n slotMap.set(keyVal, slot);\n }\n const nextChild = cursor.nextSibling;\n if (slot.el && nextChild !== slot.el) {\n container.insertBefore(slot.el, nextChild ?? endAnchor);\n }\n if (slot.el) {\n cursor = slot.el;\n }\n });\n });\n onCleanup(() => {\n for (const slot of Array.from(slotMap.values()))\n disposeSlot(slot);\n slotMap.clear();\n for (const slot of Array.from(leavingSlots))\n disposeSlot(slot);\n startAnchor.remove();\n endAnchor.remove();\n });\n}\nfunction renderNormalNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const nodeProps = {};\n const nodeChildren = {};\n separatePropsAndChildren(props, nodeProps, nodeChildren);\n resolveDynamicProps(nodeProps, g, components, componentTypes, api, forCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, nodeProps, components, componentTypes);\n bindInputStateProps(type, componentState, nodeProps);\n const nEmit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = nodeProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n const el = renderWithFallback(renderer, nodeProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx,\n children: nodeChildren,\n id: name || null,\n emit: nEmit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? forCtx, ns, api, options, false)\n }, fullKey, ns);\n if (el) {\n container.appendChild(el);\n applyEnterAnimation(el, nodeProps);\n callHook(g, name, \"onMount\");\n onCleanup(() => callHook(g, name, \"onUnmount\"));\n onCleanup(() => disposeComponent(el));\n }\n}\nfunction renderNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n if (!fullKey || !fullKey.includes(\":\"))\n return;\n if (props.$if) {\n renderIfNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n } else if (props.$for) {\n renderForNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n } else {\n renderNormalNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n }\n}\nfunction renderTree(layout, container, g, components, componentTypes, forCtx, ns = \"?\", api, options = defaultRenderOptions, prepare = true) {\n if (!layout || typeof layout !== \"object\")\n return;\n if (prepare)\n prepareComponentStates(layout, components, componentTypes, ns);\n for (const [key, val] of Object.entries(layout)) {\n if (!key.includes(\":\"))\n continue;\n if (typeof val === \"object\" && val !== null) {\n renderNode(key, val, container, g, components, componentTypes, api, forCtx, ns, options);\n }\n }\n}\n\n// src/engine/diagnostics.ts\nclass SlexKitSyntaxError extends SyntaxError {\n diagnostic;\n constructor(diagnostic) {\n super(formatSlexKitDiagnostic(diagnostic));\n this.name = \"SlexKitSyntaxError\";\n this.diagnostic = diagnostic;\n }\n}\nfunction excerpt(source, line, column) {\n const lines = source.split(`\n`);\n const start = Math.max(1, line - 2);\n const end = Math.min(lines.length, line + 2);\n const width = String(end).length;\n const rows = [];\n for (let current = start;current <= end; current += 1) {\n const marker = current === line ? \">\" : \" \";\n rows.push(`${marker} ${String(current).padStart(width, \" \")} | ${lines[current - 1] ?? \"\"}`);\n if (current === line) {\n rows.push(` ${\" \".repeat(width)} | ${\" \".repeat(Math.max(0, column - 1))}^`);\n }\n }\n return rows.join(`\n`);\n}\nfunction lineColumnAt(source, index) {\n const prefix = source.slice(0, Math.max(0, index));\n const lines = prefix.split(`\n`);\n return {\n line: lines.length,\n column: lines[lines.length - 1].length + 1\n };\n}\nfunction stackLine(error) {\n if (!(error instanceof Error) || !error.stack)\n return null;\n const match = error.stack.match(/<parse>\\s+\\(:(\\d+)\\)/);\n if (!match)\n return null;\n const parsed = Number(match[1]);\n return Number.isFinite(parsed) ? Math.max(1, parsed - 2) : null;\n}\nfunction scanSource(source) {\n const chars = [];\n let quote = \"\";\n let escaped = false;\n let line = 1;\n let column = 0;\n for (let index = 0;index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1];\n column += 1;\n if (char === `\n`) {\n line += 1;\n column = 0;\n if (quote === \"//\")\n quote = \"\";\n continue;\n }\n if (quote) {\n if (quote === \"/*\" && char === \"*\" && next === \"/\") {\n quote = \"\";\n index += 1;\n column += 1;\n } else if (quote !== \"/*\" && quote !== \"//\" && !escaped && char === quote) {\n quote = \"\";\n }\n escaped = !escaped && quote !== \"/*\" && quote !== \"//\" && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n continue;\n }\n if (char === \"/\" && next === \"/\") {\n quote = \"//\";\n index += 1;\n column += 1;\n continue;\n }\n if (char === \"/\" && next === \"*\") {\n quote = \"/*\";\n index += 1;\n column += 1;\n continue;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n escaped = false;\n continue;\n }\n chars.push({ char, index, line, column });\n }\n return chars;\n}\nfunction tokenDiagnostic(source, message) {\n const chars = scanSource(source);\n const unexpectedString = message.match(/Unexpected string(?: literal)?(?: \"([^\"]+)\")?/);\n if (unexpectedString) {\n const literal = unexpectedString[1];\n if (literal) {\n const quoted = [`\"${literal}\"`, `'${literal}'`, `\\`${literal}\\``];\n const index = quoted.map((candidate) => source.indexOf(candidate)).filter((candidate) => candidate >= 0).sort((a, b) => a - b)[0];\n if (index !== undefined)\n return lineColumnAt(source, index);\n }\n const suspiciousString = source.match(/[}\\])\"']\\s*(['\"`])/);\n if (suspiciousString?.index !== undefined) {\n const quoteIndex = source.indexOf(suspiciousString[1], suspiciousString.index + 1);\n if (quoteIndex >= 0)\n return lineColumnAt(source, quoteIndex);\n }\n }\n if (message.includes(\"Unexpected token ':'\")) {\n const doubleColon = chars.find((item, index) => item.char === \":\" && chars[index - 1]?.char === \":\");\n if (doubleColon)\n return doubleColon;\n const suspiciousColon = chars.find((item, index) => {\n if (item.char !== \":\")\n return false;\n const prev = chars[index - 1]?.char;\n return prev === '\"' || prev === \"'\" || prev === \"}\" || prev === \"]\" || prev === \")\";\n });\n if (suspiciousColon)\n return suspiciousColon;\n }\n return null;\n}\nfunction delimiterDiagnostic(source) {\n const stack = [];\n const pairs = { \"}\": \"{\", \"]\": \"[\", \")\": \"(\" };\n for (const item of scanSource(source)) {\n if (item.char === \"{\" || item.char === \"[\" || item.char === \"(\") {\n stack.push(item);\n continue;\n }\n if (item.char === \"}\" || item.char === \"]\" || item.char === \")\") {\n const expected = pairs[item.char];\n const opener2 = stack.pop();\n if (!opener2 || opener2.char !== expected) {\n return {\n line: item.line,\n column: item.column,\n detail: `Unexpected closing delimiter ${item.char}.`\n };\n }\n }\n }\n const opener = stack.at(-1);\n if (!opener)\n return null;\n const end = lineColumnAt(source, source.length);\n return {\n line: end.line,\n column: end.column,\n detail: `Expected closing delimiter for ${opener.char} opened at line ${opener.line}, column ${opener.column}.`\n };\n}\nfunction locateSyntaxError(source, error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const delimiter = delimiterDiagnostic(source);\n const token = tokenDiagnostic(source, rawMessage);\n const stack = stackLine(error);\n const position = token ?? (delimiter && rawMessage.includes(\"Expected\") ? delimiter : null) ?? (stack ? { line: stack, column: 1 } : null) ?? delimiter ?? { line: 1, column: 1 };\n const detail = token ? \"The parser failed at this token.\" : delimiter?.detail;\n return {\n message: rawMessage,\n line: position.line,\n column: position.column,\n detail,\n excerpt: excerpt(source, position.line, position.column)\n };\n}\nfunction readStringLiteral(source, start) {\n const quote = source[start];\n if (quote !== '\"' && quote !== \"'\" && quote !== \"`\")\n return null;\n let escaped = false;\n for (let index = start + 1;index < source.length; index += 1) {\n const char = source[index];\n if (!escaped && char === quote) {\n return { end: index + 1, value: source.slice(start, index + 1) };\n }\n escaped = !escaped && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n }\n return null;\n}\nfunction skipWhitespace(source, index) {\n let cursor = index;\n while (cursor < source.length && /\\s/.test(source[cursor]))\n cursor += 1;\n return cursor;\n}\nfunction findExpressionEnd(source, start) {\n const stack = [];\n let quote = \"\";\n let escaped = false;\n for (let index = start;index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1];\n if (quote) {\n if (quote === \"//\" && char === `\n`) {\n quote = \"\";\n } else if (quote === \"/*\" && char === \"*\" && next === \"/\") {\n quote = \"\";\n index += 1;\n } else if (quote !== \"//\" && quote !== \"/*\" && !escaped && char === quote) {\n quote = \"\";\n }\n escaped = !escaped && quote !== \"//\" && quote !== \"/*\" && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n continue;\n }\n if (char === \"/\" && next === \"/\") {\n quote = \"//\";\n index += 1;\n continue;\n }\n if (char === \"/\" && next === \"*\") {\n quote = \"/*\";\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n escaped = false;\n continue;\n }\n if (char === \"{\" || char === \"[\" || char === \"(\") {\n stack.push(char);\n continue;\n }\n if (char === \"}\" || char === \"]\" || char === \")\") {\n if (stack.length === 0)\n return index;\n stack.pop();\n continue;\n }\n if (char === \",\" && stack.length === 0)\n return index;\n }\n return source.length;\n}\nfunction isSingleStringLiteral(source) {\n const start = skipWhitespace(source, 0);\n const literal = readStringLiteral(source, start);\n return Boolean(literal && skipWhitespace(source, literal.end) === source.length);\n}\nfunction transformDynamicPropExpressions(source) {\n const edits = [];\n const keyPattern = /(^|[,{]\\s*)(\\$[A-Za-z_$][\\w$]*)\\s*:/g;\n let match;\n while (match = keyPattern.exec(source)) {\n const colon = source.indexOf(\":\", match.index + match[1].length);\n const valueStart = skipWhitespace(source, colon + 1);\n const valueEnd = findExpressionEnd(source, valueStart);\n const rawValue = source.slice(valueStart, valueEnd);\n if (!rawValue.trim() || isSingleStringLiteral(rawValue))\n continue;\n edits.push({\n start: valueStart,\n end: valueEnd,\n value: JSON.stringify(rawValue.trim())\n });\n }\n if (edits.length === 0)\n return source;\n let transformed = source;\n for (let index = edits.length - 1;index >= 0; index -= 1) {\n const edit = edits[index];\n transformed = `${transformed.slice(0, edit.start)}${edit.value}${transformed.slice(edit.end)}`;\n }\n return transformed;\n}\nfunction formatSlexKitDiagnostic(diagnostic) {\n const detail = diagnostic.detail ? `\n${diagnostic.detail}` : \"\";\n return `${diagnostic.message} at line ${diagnostic.line}, column ${diagnostic.column}.${detail}\n${diagnostic.excerpt}`;\n}\nfunction diagnoseSlexKitSource(source, error) {\n return locateSyntaxError(source, error);\n}\nfunction parseSlexSource(source) {\n try {\n const parseSource = transformDynamicPropExpressions(source);\n return {\n ok: true,\n value: new Function(`\"use strict\";\nreturn (\n${parseSource}\n);`)()\n };\n } catch (error) {\n const diagnostic = diagnoseSlexKitSource(source, error);\n return {\n ok: false,\n diagnostic,\n error: new SlexKitSyntaxError(diagnostic)\n };\n }\n}\nvar parseSlexKitDsl = parseSlexSource;\n\n// src/version.ts\nvar SLEXKIT_VERSION = \"0.3.2\";\nvar SLEX_PROTOCOL_VERSION = \"0.1\";\nvar SLEXKIT_COMPONENTS_VERSION = SLEXKIT_VERSION;\nfunction getSlexKitInfo() {\n return {\n version: SLEXKIT_VERSION,\n protocolVersion: SLEX_PROTOCOL_VERSION,\n componentsVersion: SLEXKIT_COMPONENTS_VERSION\n };\n}\n\n// src/engine/secure-runtime.ts\nclass SlexKitRuntimeError extends Error {\n kind;\n code;\n elapsedMs;\n constructor(kind, code, message, elapsedMs) {\n super(message);\n this.name = \"SlexKitRuntimeError\";\n this.kind = kind;\n this.code = code;\n this.elapsedMs = elapsedMs;\n }\n}\nfunction runtimeNow(adapter) {\n if (adapter?.now)\n return adapter.now();\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\nfunction currentOrigin() {\n if (typeof location !== \"undefined\" && location.origin)\n return location.origin;\n if (typeof window !== \"undefined\" && window.location?.origin)\n return window.location.origin;\n return \"http://localhost\";\n}\nfunction resolveUrl(url) {\n try {\n return new URL(url);\n } catch {}\n try {\n return new URL(url, currentOrigin());\n } catch {\n throw new SlexKitRuntimeError(\"policy\", \"invalid_url\", \"Invalid request URL.\");\n }\n}\nfunction originAllowed(origin, patterns) {\n let parsedOrigin;\n try {\n parsedOrigin = new URL(origin);\n } catch {\n return false;\n }\n for (const pattern of patterns) {\n const normalized = pattern.trim();\n if (normalized === \"*\" || normalized === origin)\n return true;\n if (normalized.endsWith(\"://*\")) {\n const protocol = normalized.slice(0, -4);\n if (parsedOrigin.protocol === `${protocol}:`)\n return true;\n }\n const wildcard = normalized.match(/^([a-z][a-z0-9+.-]*):\\/\\/\\*\\.(.+)$/i);\n if (wildcard && parsedOrigin.protocol === `${wildcard[1]}:`) {\n const suffix = wildcard[2].toLowerCase();\n const host = parsedOrigin.hostname.toLowerCase();\n if (host.endsWith(`.${suffix}`))\n return true;\n }\n }\n return false;\n}\nfunction needsJsonBody(method, body) {\n if (method !== \"POST\" || body === undefined)\n return false;\n return !(typeof body === \"string\" || body instanceof ArrayBuffer || ArrayBuffer.isView(body));\n}\nfunction bodySize(body) {\n if (body === undefined || body === null)\n return 0;\n if (typeof body === \"string\")\n return body.length;\n if (body instanceof ArrayBuffer)\n return body.byteLength;\n if (ArrayBuffer.isView(body))\n return body.byteLength;\n return JSON.stringify(body).length;\n}\nvar DEFAULT_ALLOWED_HEADERS = [\"accept\", \"content-type\"];\nvar BLOCKED_HEADERS = [\n \"authorization\",\n \"cookie\",\n \"proxy-authorization\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"set-cookie\"\n];\nfunction normalizeHeaderName(name) {\n return name.trim().toLowerCase();\n}\nfunction assertHeaders(headers, allowHeaders) {\n if (!headers)\n return;\n const allowed = new Set((allowHeaders ?? DEFAULT_ALLOWED_HEADERS).map(normalizeHeaderName));\n for (const [name, value] of Object.entries(headers)) {\n const normalized = normalizeHeaderName(name);\n if (!normalized || typeof value !== \"string\") {\n throw new SlexKitRuntimeError(\"policy\", \"header_blocked\", \"Request header is not allowed.\");\n }\n if (BLOCKED_HEADERS.includes(normalized) || !allowed.has(normalized)) {\n throw new SlexKitRuntimeError(\"policy\", \"header_blocked\", `Request header ${name} is not allowed.`);\n }\n }\n}\nfunction responseSize(result) {\n if (typeof result.text === \"string\")\n return result.text.length;\n if (result.data !== undefined) {\n try {\n return JSON.stringify(result.data).length;\n } catch {\n return 0;\n }\n }\n return 0;\n}\nfunction contentTypeAllowed(contentType, patterns) {\n const normalized = contentType.split(\";\")[0].trim().toLowerCase();\n if (!normalized)\n return false;\n return patterns.some((pattern) => {\n const allowed = pattern.trim().toLowerCase();\n if (allowed === \"*\" || allowed === normalized)\n return true;\n if (allowed.endsWith(\"/*\")) {\n return normalized.startsWith(`${allowed.slice(0, -1)}`);\n }\n return false;\n });\n}\nfunction responseHeader(headers, name) {\n const target = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === target)\n return value;\n }\n return;\n}\nfunction assertNetworkResult(result, policy) {\n if (!policy)\n return;\n if (policy.maxResponseBytes !== undefined && responseSize(result) > policy.maxResponseBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\", result.elapsedMs);\n }\n if (policy.allowContentTypes?.length) {\n const contentType = responseHeader(result.headers, \"content-type\");\n if (!contentType || !contentTypeAllowed(contentType, policy.allowContentTypes)) {\n throw new SlexKitRuntimeError(\"policy\", \"content_type_blocked\", `Response content-type ${contentType || \"unknown\"} is not allowed.`, result.elapsedMs);\n }\n }\n}\nfunction canvasPolicy(policy) {\n const canvas = policy.canvas;\n if (!canvas?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_disabled\", \"Canvas access is disabled.\");\n }\n return canvas;\n}\nfunction assertCanvasDimensions(policy, width, height) {\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_size_invalid\", \"Canvas size must be positive finite numbers.\");\n }\n const pixels = Math.ceil(width) * Math.ceil(height);\n if (policy.maxPixels !== undefined && pixels > policy.maxPixels) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_too_large\", \"Canvas size exceeds the runtime policy limit.\");\n }\n}\nfunction assertCanvasContext(policy, contextId) {\n if (policy.allowedContexts?.length && !policy.allowedContexts.includes(contextId)) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_context_blocked\", `Canvas context ${contextId} is not allowed.`);\n }\n}\nfunction emitNetworkLog(adapter, event) {\n try {\n adapter?.onNetworkLog?.(event);\n } catch {}\n}\nfunction emitRuntimeError(adapter, event) {\n try {\n adapter?.onRuntimeError?.(event);\n } catch {}\n}\nfunction timerHost(adapter) {\n const globalTimer = globalThis;\n return {\n setTimeout: adapter?.setTimeout ?? ((fn, ms) => Number(globalTimer.setTimeout(fn, ms))),\n clearTimeout: adapter?.clearTimeout ?? ((id) => globalTimer.clearTimeout(id)),\n setInterval: adapter?.setInterval ?? ((fn, ms) => Number(globalTimer.setInterval(fn, ms))),\n clearInterval: adapter?.clearInterval ?? ((id) => globalTimer.clearInterval(id))\n };\n}\nfunction rafHost(adapter) {\n const globalRaf = globalThis;\n return {\n requestAnimationFrame: adapter?.requestAnimationFrame ?? ((fn) => {\n if (typeof globalRaf.requestAnimationFrame === \"function\") {\n return Number(globalRaf.requestAnimationFrame(fn));\n }\n return Number(globalThis.setTimeout(() => fn(runtimeNow(adapter)), 16));\n }),\n cancelAnimationFrame: adapter?.cancelAnimationFrame ?? ((id) => {\n if (typeof globalRaf.cancelAnimationFrame === \"function\") {\n globalRaf.cancelAnimationFrame(id);\n } else {\n globalThis.clearTimeout(id);\n }\n })\n };\n}\nasync function readResponseText(response, maxResponseBytes) {\n if (maxResponseBytes === undefined || !response.body?.getReader) {\n const text2 = await response.text();\n if (maxResponseBytes !== undefined && text2.length > maxResponseBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\");\n }\n return text2;\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder;\n let size = 0;\n let text = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n size += value.byteLength;\n if (size > maxResponseBytes) {\n await reader.cancel();\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\");\n }\n text += decoder.decode(value, { stream: true });\n }\n text += decoder.decode();\n return text;\n}\nasync function defaultFetch(request, adapter, options = {}) {\n if (adapter?.fetch)\n return adapter.fetch(request);\n if (typeof fetch !== \"function\") {\n throw new SlexKitRuntimeError(\"network\", \"fetch_unavailable\", \"Host fetch is unavailable.\");\n }\n const start = runtimeNow(adapter);\n const controller = typeof AbortController !== \"undefined\" ? new AbortController : undefined;\n const releaseController = controller ? options.onController?.(controller) : undefined;\n const timeout = controller ? globalThis.setTimeout(() => controller.abort(), request.timeoutMs) : undefined;\n try {\n const init = {\n method: request.method,\n headers: request.headers,\n credentials: request.credentials,\n signal: controller?.signal\n };\n if (request.method === \"POST\" && request.body !== undefined) {\n if (typeof request.body === \"string\" || request.body instanceof ArrayBuffer || ArrayBuffer.isView(request.body)) {\n init.body = request.body;\n } else {\n init.body = JSON.stringify(request.body);\n init.headers = request.headers;\n }\n }\n const response = await fetch(request.url, init);\n const text = await readResponseText(response, options.maxResponseBytes);\n let data = undefined;\n try {\n data = text ? JSON.parse(text) : undefined;\n } catch {\n data = undefined;\n }\n const headers = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers,\n text,\n data,\n elapsedMs: runtimeNow(adapter) - start\n };\n } catch (error) {\n const elapsedMs = runtimeNow(adapter) - start;\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SlexKitRuntimeError(\"timeout\", \"timeout\", \"Request timed out.\", elapsedMs);\n }\n throw new SlexKitRuntimeError(\"network\", \"network_error\", errorMessage(error), elapsedMs);\n } finally {\n if (timeout !== undefined)\n globalThis.clearTimeout(timeout);\n releaseController?.();\n }\n}\nfunction errorMessage(error) {\n if (error instanceof Error)\n return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n return String(error.message);\n }\n return String(error ?? \"Unknown error.\");\n}\nfunction serializeRuntimeError(error) {\n if (error instanceof SlexKitRuntimeError) {\n return {\n name: error.name,\n message: error.message,\n kind: error.kind,\n code: error.code,\n elapsedMs: error.elapsedMs\n };\n }\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message\n };\n }\n return {\n name: \"Error\",\n message: errorMessage(error)\n };\n}\nfunction deserializeRuntimeError(error) {\n if (error.name === \"SlexKitRuntimeError\" && error.kind && error.code) {\n return new SlexKitRuntimeError(error.kind, error.code, error.message, error.elapsedMs);\n }\n const next = new Error(error.message);\n next.name = error.name || \"Error\";\n return next;\n}\nfunction createSecureRuntime(policy, hostAdapter) {\n const disposers = new Set;\n const timeoutIds = new Set;\n const intervalIds = new Set;\n const rafIds = new Set;\n const abortControllers = new Set;\n const ownedCanvases = new Set;\n const countedCanvases = new Set;\n let disposed = false;\n let nextSyntheticId = 1;\n const syntheticTimers = new Map;\n const timers = timerHost(hostAdapter);\n const raf = rafHost(hostAdapter);\n function assertNotDisposed() {\n if (disposed) {\n throw new SlexKitRuntimeError(\"policy\", \"runtime_disposed\", \"Runtime has been disposed.\");\n }\n }\n function assertNetwork(method, url, options = {}) {\n const network = policy.network;\n if (!network?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"network_disabled\", \"Network access is disabled.\");\n }\n if (!network.methods.includes(method)) {\n throw new SlexKitRuntimeError(\"policy\", \"method_blocked\", `Network method ${method} is not allowed.`);\n }\n const parsed = resolveUrl(url);\n if (!originAllowed(parsed.origin, network.allowOrigins)) {\n throw new SlexKitRuntimeError(\"policy\", \"origin_blocked\", `Network origin ${parsed.origin} is not allowed.`);\n }\n if (method === \"POST\" && bodySize(options.body) > network.maxBodyBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"body_too_large\", \"Request body exceeds the runtime policy limit.\");\n }\n const headers = needsJsonBody(method, options.body) ? { \"content-type\": \"application/json\", ...options.headers } : options.headers;\n assertHeaders(headers, network.allowHeaders);\n const timeoutMs = Math.min(options.timeoutMs ?? network.timeoutMs, network.timeoutMs);\n const credentials = options.credentials ?? network.credentials;\n if (credentials !== network.credentials) {\n throw new SlexKitRuntimeError(\"policy\", \"credentials_blocked\", \"Request credentials mode is not allowed.\");\n }\n return {\n method,\n url: parsed.href,\n headers,\n body: options.body,\n credentials,\n timeoutMs\n };\n }\n function assertTimer(ms) {\n const timer = policy.timer;\n if (!timer?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_disabled\", \"Timer access is disabled.\");\n }\n if (!Number.isFinite(ms) || ms < timer.minIntervalMs) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_interval_blocked\", \"Timer interval is below policy limit.\");\n }\n if (timeoutIds.size + intervalIds.size >= timer.maxTimers) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_limit\", \"Timer limit exceeded.\");\n }\n }\n function normalizeTimerId(raw) {\n if (Number.isFinite(raw) && raw > 0)\n return raw;\n const synthetic = nextSyntheticId++;\n syntheticTimers.set(synthetic, raw);\n return synthetic;\n }\n function assertCanvas(width, height) {\n assertNotDisposed();\n const canvas = canvasPolicy(policy);\n assertCanvasDimensions(canvas, width, height);\n if (canvas.maxCanvases !== undefined && countedCanvases.size >= canvas.maxCanvases) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_limit\", \"Canvas limit exceeded.\");\n }\n return canvas;\n }\n function countCanvas(canvas, policy2) {\n if (countedCanvases.has(canvas))\n return;\n if (policy2.maxCanvases !== undefined && countedCanvases.size >= policy2.maxCanvases) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_limit\", \"Canvas limit exceeded.\");\n }\n countedCanvases.add(canvas);\n }\n function reportCallbackError(phase, error) {\n emitRuntimeError(hostAdapter, {\n phase,\n error: serializeRuntimeError(error)\n });\n }\n const api = {\n now: () => runtimeNow(hostAdapter),\n get: (url, options = {}) => api.fetch(url, { ...options, method: \"GET\" }),\n post: (url, body, options = {}) => api.fetch(url, { ...options, method: \"POST\", body }),\n fetch: async (url, options = {}) => {\n assertNotDisposed();\n const method = options.method ?? \"GET\";\n const request = assertNetwork(method, url, options);\n const started = runtimeNow(hostAdapter);\n emitNetworkLog(hostAdapter, { phase: \"request\", request });\n try {\n const result = await defaultFetch(request, hostAdapter, {\n maxResponseBytes: policy.network?.maxResponseBytes,\n onController(controller) {\n abortControllers.add(controller);\n return () => abortControllers.delete(controller);\n }\n });\n assertNetworkResult(result, policy.network);\n emitNetworkLog(hostAdapter, {\n phase: \"response\",\n request,\n result,\n elapsedMs: runtimeNow(hostAdapter) - started\n });\n return result;\n } catch (error) {\n const serialized = serializeRuntimeError(error);\n emitNetworkLog(hostAdapter, {\n phase: \"error\",\n request,\n error: serialized,\n elapsedMs: runtimeNow(hostAdapter) - started\n });\n throw error;\n }\n },\n setTimeout: (fn, ms) => {\n assertNotDisposed();\n assertTimer(ms);\n let id = 0;\n const raw = timers.setTimeout(() => {\n timeoutIds.delete(id);\n syntheticTimers.delete(id);\n try {\n fn();\n } catch (error) {\n reportCallbackError(\"timer\", error);\n throw error;\n }\n }, ms);\n id = normalizeTimerId(raw);\n timeoutIds.add(id);\n return id;\n },\n clearTimeout: (id) => {\n const raw = syntheticTimers.get(id) ?? id;\n timers.clearTimeout(raw);\n timeoutIds.delete(id);\n syntheticTimers.delete(id);\n },\n setInterval: (fn, ms) => {\n assertNotDisposed();\n assertTimer(ms);\n const id = normalizeTimerId(timers.setInterval(() => {\n try {\n fn();\n } catch (error) {\n reportCallbackError(\"interval\", error);\n throw error;\n }\n }, ms));\n intervalIds.add(id);\n return id;\n },\n clearInterval: (id) => {\n const raw = syntheticTimers.get(id) ?? id;\n timers.clearInterval(raw);\n intervalIds.delete(id);\n syntheticTimers.delete(id);\n },\n raf: (fn) => {\n assertNotDisposed();\n if (!policy.animation?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"animation_disabled\", \"Animation access is disabled.\");\n }\n const id = raf.requestAnimationFrame((time) => {\n rafIds.delete(id);\n try {\n fn(time);\n } catch (error) {\n reportCallbackError(\"raf\", error);\n throw error;\n }\n });\n rafIds.add(id);\n return id;\n },\n cancelRaf: (id) => {\n raf.cancelAnimationFrame(id);\n rafIds.delete(id);\n },\n createCanvas: (width, height) => {\n assertCanvas(width, height);\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_unavailable\", \"Canvas is unavailable in this runtime.\");\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.ceil(width);\n canvas.height = Math.ceil(height);\n ownedCanvases.add(canvas);\n countedCanvases.add(canvas);\n return canvas;\n },\n getCanvasContext: (canvas, contextId = \"2d\", options) => {\n assertNotDisposed();\n const canvasAccess = canvasPolicy(policy);\n assertCanvasDimensions(canvasAccess, canvas.width, canvas.height);\n assertCanvasContext(canvasAccess, contextId);\n countCanvas(canvas, canvasAccess);\n const context = canvas.getContext(contextId, options);\n if (!context) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_context_unavailable\", `Canvas context ${contextId} is unavailable.`);\n }\n return context;\n },\n onDispose: (fn) => {\n disposers.add(fn);\n },\n isTimeoutError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"timeout\",\n isNetworkError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"network\",\n isPolicyError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"policy\",\n errorMessage\n };\n return {\n api,\n dispose: () => {\n if (disposed)\n return;\n disposed = true;\n for (const id of Array.from(timeoutIds))\n api.clearTimeout(id);\n for (const id of Array.from(intervalIds))\n api.clearInterval(id);\n for (const id of Array.from(rafIds))\n api.cancelRaf(id);\n for (const controller of Array.from(abortControllers))\n controller.abort();\n abortControllers.clear();\n for (const canvas of Array.from(ownedCanvases)) {\n if (canvas.isConnected)\n canvas.remove();\n }\n ownedCanvases.clear();\n countedCanvases.clear();\n for (const disposer of Array.from(disposers)) {\n try {\n disposer();\n } catch (error) {\n reportCallbackError(\"dispose\", error);\n }\n }\n disposers.clear();\n }\n };\n}\n// src/components/spec-helpers.ts\nvar SINCE = \"0.1.0\";\nfunction docs(type) {\n return {\n href: `/docs/components/${type}`,\n anchors: {\n api: `${type}-api-reference`,\n examples: `${type}-canonical-example`\n }\n };\n}\nfunction isSlexExpression(value) {\n return typeof value.namespace === \"string\" && typeof value.layout === \"object\" && value.layout !== null;\n}\nfunction example(type, propsOrSource, title = \"Basic usage\") {\n return {\n id: \"basic\",\n title,\n source: isSlexExpression(propsOrSource) ? {\n slex: propsOrSource.slex ?? SLEX_PROTOCOL_VERSION,\n ...propsOrSource\n } : {\n slex: SLEX_PROTOCOL_VERSION,\n namespace: `spec_${type.replaceAll(\"-\", \"_\")}_basic`,\n layout: {\n [`${type}:demo`]: propsOrSource\n }\n }\n };\n}\nvar semanticTones = [\"info\", \"success\", \"warning\", \"danger\", \"muted\"];\nvar inputState = [\"input\", \"slider\", \"select\", \"tabs\", \"radio-group\"];\nvar checkedState = [\"checkbox\"];\nvar enabledState = [\"switch\"];\nvar readableState = [\"stat\", \"text\", \"progress\", \"badge\", \"callout\", \"code-block\", \"divider\", \"link\", \"table\", \"section\"];\nfunction stateFor(type) {\n if (inputState.includes(type))\n return \"value\";\n if (checkedState.includes(type))\n return \"checked\";\n if (enabledState.includes(type))\n return \"enabled\";\n if (readableState.includes(type))\n return \"readable\";\n return \"none\";\n}\nfunction component(spec) {\n return {\n status: \"ready\",\n since: SINCE,\n docs: docs(spec.type),\n state: spec.state ?? stateFor(spec.type),\n ...spec\n };\n}\nvar childContent = {\n allowed: true,\n description: \"Nested component fields are rendered as child content in field order.\"\n};\nvar noChildren = {\n allowed: false,\n description: \"This component does not render nested child components.\"\n};\n\n// src/components/entries/accordion.spec.ts\nvar accordionSpec = component({\n type: \"accordion\",\n category: \"Disclosure\",\n title: \"Accordion\",\n summary: \"Expandable grouped panels.\",\n description: \"Use accordion to reveal one or more sections from a compact list of panels.\",\n props: {\n value: { type: \"string | string[]\", dynamic: true, description: \"Current expanded item value; use an array when multiple is true.\" },\n multiple: { type: \"boolean\", default: false, description: \"Allow multiple items to be expanded at the same time.\" },\n items: { type: \"array\", description: \"Panel definitions with value, label, content, and optional icon.\" },\n \"items[].icon\": { type: \"string\", description: \"Icon name shown before an item trigger label.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when expanded items change.\" }\n },\n children: noChildren,\n examples: [example(\"accordion\", {\n namespace: \"doc_accordion_typical\",\n layout: {\n \"accordion:faq\": {\n multiple: true,\n value: [\n \"install\"\n ],\n items: [\n {\n value: \"install\",\n label: \"Install\",\n icon: \"download-simple\",\n content: \"Prepare dependencies.\"\n },\n {\n value: \"review\",\n label: \"Review\",\n icon: \"check-circle\",\n content: \"Check the result.\"\n },\n {\n value: \"ship\",\n label: \"Ship\",\n icon: \"rocket-launch\",\n content: \"Publish the change.\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/badge.spec.ts\nvar badgeSpec = component({\n type: \"badge\",\n category: \"Content\",\n title: \"Badge\",\n summary: \"Compact label for status or classification.\",\n description: \"Use badge to annotate nearby content with a short semantic label.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Badge text.\" },\n text: { type: \"string\", dynamic: true, description: \"Alias for label.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the badge label.\" },\n tone: { type: \"string\", values: semanticTones, default: \"info\", description: \"Semantic tone applied to the badge.\" },\n variant: { type: \"string\", values: semanticTones, description: \"Alias for tone.\" }\n },\n children: noChildren,\n examples: [example(\"badge\", {\n namespace: \"doc_badge_typical\",\n layout: {\n \"row:badges\": {\n \"badge:ready\": {\n label: \"ready\",\n icon: \"check-circle\",\n tone: \"success\"\n },\n \"badge:pending\": {\n label: \"pending\",\n tone: \"warning\"\n },\n \"badge:info\": {\n label: \"info\",\n tone: \"info\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/button.spec.ts\nvar buttonSpec = component({\n type: \"button\",\n category: \"Action\",\n title: \"Button\",\n summary: \"Action trigger.\",\n description: \"Use button for explicit actions in interactive SlexKit layouts.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Visible button text and accessible name.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n iconOnly: { type: \"boolean\", default: false, description: \"Show only the icon while retaining label as the accessible name.\" },\n variant: { type: \"string\", values: [\"primary\", \"secondary\", \"danger\", \"ghost\"], default: \"primary\", description: \"Semantic action variant.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the action.\" },\n href: { type: \"string\", dynamic: true, description: \"Render the button surface as a link to this URL.\" },\n target: { type: \"string\", description: \"Link target used when href is present.\" },\n title: { type: \"string\", dynamic: true, description: \"Tooltip and accessible-label fallback.\" },\n selected: { type: \"boolean\", dynamic: true, description: \"Render the icon in its selected visual state.\" },\n active: { type: \"boolean\", dynamic: true, description: \"Render the icon in its active visual state.\" },\n pressed: { type: \"boolean\", dynamic: true, description: \"Expose pressed state and render the selected icon style.\" },\n onclick: { type: \"write-expression\", description: \"Write expression invoked when the button is clicked.\" }\n },\n children: noChildren,\n examples: [example(\"button\", {\n namespace: \"doc_button_typical\",\n layout: {\n \"row:actions\": {\n \"button:save\": {\n label: \"Save\",\n icon: \"floppy-disk\",\n variant: \"primary\"\n },\n \"button:cancel\": {\n label: \"Cancel\",\n variant: \"secondary\"\n },\n \"button:delete\": {\n label: \"Delete\",\n variant: \"danger\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/callout.spec.ts\nvar calloutSpec = component({\n type: \"callout\",\n category: \"Content\",\n title: \"Callout\",\n summary: \"Highlighted contextual message.\",\n description: \"Use callout for notes, warnings, and other contextual blocks.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Callout title.\" },\n heading: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n text: { type: \"string\", dynamic: true, description: \"Callout body text.\" },\n message: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n tone: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Semantic tone for the callout.\" }\n },\n children: childContent,\n examples: [example(\"callout\", {\n namespace: \"doc_callout_typical\",\n layout: {\n \"callout:notice\": {\n tone: \"info\",\n title: \"Notice\",\n icon: \"info\",\n text: \"Use callout for information that should stand out.\"\n }\n }\n })]\n});\n\n// src/components/entries/card.spec.ts\nvar cardSpec = component({\n type: \"card\",\n category: \"Layout\",\n title: \"Card\",\n summary: \"Bordered grouping container.\",\n description: \"Use card to group related content on a bounded surface.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Card title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n tone: { type: \"string\", values: semanticTones, description: \"Optional semantic tone for the card surface.\" }\n },\n children: childContent,\n examples: [example(\"card\", {\n namespace: \"doc_card_typical\",\n layout: {\n \"card:metrics\": {\n title: \"Metrics\",\n icon: \"chart-bar\",\n \"grid:items\": {\n columns: 2,\n \"stat:requests\": {\n label: \"Requests\",\n value: \"1.2k\",\n unit: \"/min\"\n },\n \"stat:latency\": {\n label: \"Latency\",\n value: \"42\",\n unit: \"ms\"\n }\n }\n }\n }\n })]\n});\n\n// src/components/entries/checkbox.spec.ts\nvar checkboxSpec = component({\n type: \"checkbox\",\n category: \"Input\",\n title: \"Checkbox\",\n summary: \"Boolean checkbox input.\",\n description: \"Use checkbox for binary choices that can be toggled independently.\",\n props: {\n checked: { type: \"boolean\", default: false, dynamic: true, description: \"Checked state.\" },\n label: { type: \"string\", dynamic: true, description: \"Checkbox label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the visible label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the checkbox.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when checked state changes.\" }\n },\n children: noChildren,\n examples: [example(\"checkbox\", {\n namespace: \"doc_checkbox_typical\",\n layout: {\n \"checkbox:agree\": {\n checked: true,\n label: \"I agree\",\n icon: \"handshake\"\n }\n }\n })]\n});\n\n// src/components/entries/code-block.spec.ts\nvar codeBlockSpec = component({\n type: \"code-block\",\n category: \"Content\",\n title: \"Code Block\",\n summary: \"Formatted code or log block.\",\n description: \"Use code-block for static code samples, configuration snippets, and logs.\",\n props: {\n code: { type: \"string\", dynamic: true, description: \"Code text content.\" },\n source: { type: \"string\", dynamic: true, description: \"Alias for code.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for code.\" },\n language: { type: \"string\", description: \"Language label.\" },\n title: { type: \"string\", description: \"Code block title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n lineNumbers: { type: \"boolean\", default: true, description: \"Show line numbers.\" }\n },\n children: noChildren,\n examples: [example(\"code-block\", {\n namespace: \"doc_code_block_typical\",\n layout: {\n \"code-block:config\": {\n title: \"Config\",\n icon: \"code\",\n language: \"js\",\n code: \"export const enabled = true;\"\n }\n }\n })]\n});\n\n// src/components/entries/collapsible.spec.ts\nvar collapsibleSpec = component({\n type: \"collapsible\",\n category: \"Disclosure\",\n title: \"Collapsible\",\n summary: \"Single expandable region.\",\n description: \"Use collapsible to show or hide one related content region.\",\n props: {\n open: { type: \"boolean\", default: false, dynamic: true, description: \"Expanded state.\" },\n trigger: { type: \"string\", dynamic: true, description: \"Trigger button text.\" },\n icon: { type: \"string\", description: \"Icon name shown before trigger text.\" },\n content: { type: \"string\", dynamic: true, description: \"Static body content.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when open state changes.\" }\n },\n children: childContent,\n examples: [example(\"collapsible\", {\n namespace: \"doc_collapsible_typical\",\n layout: {\n \"collapsible:more\": {\n open: true,\n trigger: \"Details\",\n icon: \"caret-circle-down\",\n content: \"This secondary content can be collapsed.\"\n }\n }\n })]\n});\n\n// src/components/entries/column.spec.ts\nvar columnSpec = component({\n type: \"column\",\n category: \"Layout\",\n title: \"Column\",\n summary: \"Vertical layout container.\",\n description: \"Use column to stack child components vertically in field order.\",\n props: {},\n children: childContent,\n examples: [example(\"column\", {\n namespace: \"doc_column_typical\",\n layout: {\n \"column:form\": {\n \"input:name\": {\n placeholder: \"Name\"\n },\n \"input:email\": {\n placeholder: \"Email\"\n },\n \"button:save\": {\n label: \"Save\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/divider.spec.ts\nvar dividerSpec = component({\n type: \"divider\",\n category: \"Content\",\n title: \"Divider\",\n summary: \"Visual separator.\",\n description: \"Use divider to separate related regions, optionally with a label.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Text shown in the divider.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" }\n },\n children: noChildren,\n examples: [example(\"divider\", {\n namespace: \"doc_divider_typical\",\n layout: {\n \"column:content\": {\n \"text:top\": {\n text: \"Above\"\n },\n \"divider:line\": {\n label: \"Divider\",\n icon: \"flag\"\n },\n \"text:bottom\": {\n text: \"Below\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/formula.spec.ts\nvar formulaSpec = component({\n type: \"formula\",\n category: \"Display\",\n title: \"Formula\",\n summary: \"Reactive KaTeX formula display.\",\n description: \"Use formula to render SlexKit state and computed values through KaTeX.\",\n props: {\n tex: { type: \"string\", dynamic: true, description: \"KaTeX source to render.\" },\n formula: { type: \"string\", dynamic: true, description: \"Alias for tex.\" },\n value: { type: \"string\", dynamic: true, description: \"Alias for tex.\" },\n displayMode: { type: \"boolean\", default: true, description: \"Render as display math when true; inline math when false.\" },\n display: { type: \"boolean\", default: true, description: \"Alias for displayMode.\" },\n block: { type: \"boolean\", default: true, description: \"Alias for displayMode.\" }\n },\n children: noChildren,\n examples: [example(\"formula\", {\n namespace: \"doc_formula_typical\",\n g: {\n r: 1e4,\n c: 100,\n fc: 159.15\n },\n layout: {\n \"formula:cutoff\": {\n $tex: \"'f_c = \\\\\\\\frac{1}{2\\\\\\\\pi RC} = ' + g.fc + '\\\\\\\\text{ Hz}'\"\n }\n }\n })]\n});\n\n// src/components/entries/grid.spec.ts\nvar gridSpec = component({\n type: \"grid\",\n category: \"Layout\",\n title: \"Grid\",\n summary: \"Responsive grid container.\",\n description: \"Use grid to arrange child components in responsive columns.\",\n props: {\n columns: { type: \"number\", default: 1, dynamic: true, description: \"Base column count.\" },\n smColumns: { type: \"number\", dynamic: true, description: \"Column count at the small breakpoint.\" },\n mdColumns: { type: \"number\", dynamic: true, description: \"Column count at the medium breakpoint.\" },\n lgColumns: { type: \"number\", dynamic: true, description: \"Column count at the large breakpoint.\" },\n xlColumns: { type: \"number\", dynamic: true, description: \"Column count at the extra-large breakpoint.\" },\n gap: { type: \"string\", dynamic: true, description: \"Spacing between grid items.\" }\n },\n children: childContent,\n examples: [example(\"grid\", {\n namespace: \"doc_grid_typical\",\n layout: {\n \"grid:stats\": {\n columns: 1,\n mdColumns: 3,\n \"stat:a\": {\n label: \"Requests\",\n value: \"1.2k\"\n },\n \"stat:b\": {\n label: \"Success\",\n value: \"98%\"\n },\n \"stat:c\": {\n label: \"Errors\",\n value: \"3\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/icon.spec.ts\nvar iconSpec = component({\n type: \"icon\",\n category: \"Component\",\n title: \"Icon\",\n summary: \"Shared icon field capability.\",\n description: \"Icon is a shared field capability, not an independent icon component type.\",\n props: {\n icon: { type: \"string\", description: \"Icon name resolved through the global icon manager.\" },\n iconOnly: { type: \"boolean\", description: \"Render only the icon while retaining an accessible label where supported.\" },\n \"items[].icon\": { type: \"string\", description: \"Accordion item trigger icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Select or radio option icon.\" },\n \"columns[].icon\": { type: \"string\", description: \"Table column header icon.\" },\n \"tabs[].icon\": { type: \"string\", description: \"Tab trigger icon.\" },\n \"tabs[].iconOnly\": { type: \"boolean\", description: \"Tab trigger icon-only mode.\" }\n },\n children: noChildren,\n examples: [example(\"button\", { label: \"Settings\", icon: \"gear-six\", iconOnly: true, variant: \"ghost\" }, \"Icon field usage\")]\n});\n\n// src/components/entries/input.spec.ts\nvar inputSpec = component({\n type: \"input\",\n category: \"Input\",\n title: \"Input\",\n summary: \"Text or engineering-value input.\",\n description: \"Use input for editable text and engineering numeric values.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current input value.\" },\n label: { type: \"string\", dynamic: true, description: \"Input label.\" },\n unit: { type: \"string\", dynamic: true, description: \"Trailing unit text.\" },\n description: { type: \"string\", dynamic: true, description: \"Assistive description below the input.\" },\n help: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n hint: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n error: { type: \"string\", dynamic: true, description: \"Error text shown below the input and linked with aria-describedby.\" },\n errorMessage: { type: \"string\", dynamic: true, description: \"Alias for error.\" },\n invalid: { type: \"boolean\", default: false, dynamic: true, description: \"Mark the input as invalid with aria-invalid and error styling.\" },\n placeholder: { type: \"string\", description: \"Placeholder text for empty values.\" },\n type: { type: \"string\", default: \"text\", description: \"Input value kind; use engineering for parsed engineering values.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable editing.\" },\n readonly: { type: \"boolean\", default: false, dynamic: true, description: \"Make the input read-only.\" },\n readOnly: { type: \"boolean\", default: false, dynamic: true, description: \"Alias for readonly.\" },\n required: { type: \"boolean\", default: false, dynamic: true, description: \"Mark the input as required.\" },\n id: { type: \"string\", description: \"Native input id; defaults to a stable id derived from the component name.\" },\n name: { type: \"string\", description: \"Native input name attribute.\" },\n min: { type: \"string | number\", dynamic: true, description: \"Minimum value used by numeric input controls.\" },\n max: { type: \"string | number\", dynamic: true, description: \"Maximum value used by numeric input controls.\" },\n step: { type: \"string | number\", dynamic: true, description: \"Step size used by numeric input controls.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the value changes.\" }\n },\n children: noChildren,\n examples: [example(\"input\", {\n namespace: \"doc_input_typical\",\n layout: {\n \"input:name\": {\n label: \"Project\",\n value: \"SlexKit\",\n placeholder: \"Enter name\",\n description: \"Visible labels keep form fields scannable.\"\n }\n }\n })]\n});\n\n// src/components/entries/link.spec.ts\nvar linkSpec = component({\n type: \"link\",\n category: \"Content\",\n title: \"Link\",\n summary: \"Inline navigation link.\",\n description: \"Use link to navigate to another page or resource.\",\n props: {\n href: { type: \"string\", description: \"Target URL.\" },\n text: { type: \"string\", dynamic: true, description: \"Visible link text.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n icon: { type: \"string\", description: \"Icon name shown before link text.\" },\n target: { type: \"string\", description: \"Native link target attribute.\" },\n variant: { type: \"string\", values: [\"default\", \"muted\"], default: \"default\", description: \"Link visual variant.\" }\n },\n children: noChildren,\n examples: [example(\"link\", {\n namespace: \"doc_link_typical\",\n layout: {\n \"column:links\": {\n \"link:docs\": {\n href: \"/components\",\n icon: \"arrow-square-out\",\n text: \"View components\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/playground.spec.ts\nvar playgroundSpec = component({\n type: \"playground\",\n category: \"Tooling\",\n title: \"Playground\",\n summary: \"Interactive source preview.\",\n description: \"Use playground in documentation surfaces to render editable SlexKit or Markdown examples.\",\n props: {\n source: { type: \"object | string\", description: \"SlexKit or Markdown source to preview.\" },\n sourceType: { type: \"string\", values: [\"slex\", \"markdown\", \"auto-markdown\"], default: \"slex\", description: \"Source parser mode.\" },\n title: { type: \"string\", description: \"Playground title.\" },\n previewAlign: { type: \"string\", values: [\"center\", \"start\"], default: \"center\", description: \"Vertical preview alignment in render mode.\" },\n alignPreview: { type: \"string\", values: [\"center\", \"start\"], description: \"Alias for previewAlign.\" },\n previewPlacement: { type: \"string\", values: [\"center\", \"start\"], description: \"Alias for previewAlign.\" },\n previewMinHeight: { type: \"string\", description: \"Minimum preview area height.\" },\n previewMaxWidth: { type: \"string\", description: \"Maximum preview content width.\" },\n themeToggle: { type: \"boolean\", default: false, description: \"Show the theme toggle action.\" },\n showThemeToggle: { type: \"boolean\", default: false, description: \"Alias for themeToggle.\" },\n enableThemeToggle: { type: \"boolean\", default: false, description: \"Alias for themeToggle.\" },\n themeLabel: { type: \"string\", description: \"Accessible label for the theme toggle action.\" },\n themeToggleLabel: { type: \"string\", description: \"Alias for themeLabel.\" },\n sourceTypeLabel: { type: \"string\", description: \"Accessible label for the source type selector.\" },\n copyLabel: { type: \"string\", description: \"Accessible label for the copy source action.\" },\n openWebLabel: { type: \"string\", description: \"Accessible label for opening the source in the standalone playground.\" },\n webUrl: { type: \"string\", description: \"Standalone playground URL used by the open action.\" },\n playgroundUrl: { type: \"string\", description: \"Alias for webUrl.\" }\n },\n children: noChildren,\n examples: [example(\"playground\", {\n namespace: \"doc_playground_typical\",\n layout: {\n \"playground:demo\": {\n title: \"Stat Playground\",\n previewMinHeight: \"180px\",\n source: {\n namespace: \"inner_stat_demo\",\n layout: {\n \"stat:value\": {\n label: \"Requests\",\n value: \"1.2k\",\n unit: \"/min\"\n }\n }\n }\n }\n }\n })]\n});\n\n// src/components/entries/progress.spec.ts\nvar progressSpec = component({\n type: \"progress\",\n category: \"Feedback\",\n title: \"Progress\",\n summary: \"Progress bar.\",\n description: \"Use progress to show completion as a percentage.\",\n props: {\n value: { type: \"number\", default: 0, dynamic: true, description: \"Progress percentage from 0 to 100.\" },\n label: { type: \"string\", dynamic: true, description: \"Progress label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n indeterminate: { type: \"boolean\", default: false, dynamic: true, description: \"Render an indeterminate progress state without aria-valuenow.\" }\n },\n children: noChildren,\n examples: [example(\"progress\", {\n namespace: \"doc_progress_typical\",\n layout: {\n \"progress:build\": {\n label: \"Build progress\",\n icon: \"gear-six\",\n value: 64\n }\n }\n })]\n});\n\n// src/components/entries/radio-group.spec.ts\nvar radioGroupSpec = component({\n type: \"radio-group\",\n category: \"Input\",\n title: \"Radio Group\",\n summary: \"Single-choice option group.\",\n description: \"Use radio-group for one-of-many choices.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current selected value.\" },\n label: { type: \"string\", dynamic: true, description: \"Group label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the group label.\" },\n options: { type: \"array\", description: \"Options with label, value, and optional icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Icon name shown before a single option label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable every radio option in the group.\" },\n orientation: { type: \"string\", values: [\"vertical\", \"horizontal\"], default: \"vertical\", description: \"Radio option layout direction.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n name: { type: \"string\", description: \"Native radio group name shared by options.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when selection changes.\" }\n },\n children: noChildren,\n examples: [example(\"radio-group\", {\n namespace: \"doc_radio_group_typical\",\n layout: {\n \"radio-group:mode\": {\n label: \"Mode\",\n icon: \"sliders-horizontal\",\n value: \"auto\",\n options: [\n {\n label: \"Auto\",\n value: \"auto\",\n icon: \"sparkle\"\n },\n {\n label: \"Manual\",\n value: \"manual\",\n icon: \"wrench\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/row.spec.ts\nvar rowSpec = component({\n type: \"row\",\n category: \"Layout\",\n title: \"Row\",\n summary: \"Horizontal layout container.\",\n description: \"Use row to place child components horizontally in field order.\",\n props: {\n justify: { type: \"string\", values: [\"start\", \"center\", \"end\", \"space-between\", \"space-around\"], default: \"start\", description: \"Main-axis distribution.\" },\n align: { type: \"string\", values: [\"start\", \"center\", \"end\", \"baseline\", \"stretch\"], default: \"center\", description: \"Cross-axis alignment.\" },\n gap: { type: \"string\", dynamic: true, description: \"Spacing between children.\" }\n },\n children: childContent,\n examples: [example(\"row\", {\n namespace: \"doc_row_typical\",\n layout: {\n \"row:toolbar\": {\n justify: \"space-between\",\n \"text:title\": {\n text: \"Runtime status\"\n },\n \"button:refresh\": {\n label: \"Refresh\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/section.spec.ts\nvar sectionSpec = component({\n type: \"section\",\n category: \"Content\",\n title: \"Section\",\n summary: \"Page section with optional heading chrome.\",\n description: \"Use section to group page content with title, subtitle, and optional action link.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Section title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n eyebrow: { type: \"string\", dynamic: true, description: \"Small label above the title.\" },\n subtitle: { type: \"string\", dynamic: true, description: \"Subtitle text below the title.\" },\n actionLabel: { type: \"string\", dynamic: true, description: \"Optional action link label.\" },\n actionHref: { type: \"string\", description: \"Optional action link target.\" }\n },\n children: childContent,\n examples: [example(\"section\", {\n namespace: \"doc_section_typical\",\n layout: {\n \"section:overview\": {\n eyebrow: \"Dashboard\",\n title: \"Runtime overview\",\n icon: \"chart-bar\",\n subtitle: \"This section groups the most important state.\",\n \"stat:latency\": {\n label: \"Latency\",\n value: \"42\",\n unit: \"ms\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/select.spec.ts\nvar selectSpec = component({\n type: \"select\",\n category: \"Input\",\n title: \"Select\",\n summary: \"Dropdown selection input.\",\n description: \"Use select for compact single-choice selection from an option list.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Select label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the top label.\" },\n value: { type: \"string\", dynamic: true, description: \"Current selected value.\" },\n options: { type: \"array\", description: \"Options with label, value, and optional icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Icon name shown before an option label.\" },\n placeholder: { type: \"string\", description: \"Placeholder shown when no value is selected.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the select trigger and native select.\" },\n required: { type: \"boolean\", default: false, dynamic: true, description: \"Require a non-placeholder value in the native select.\" },\n variant: { type: \"string\", values: [\"default\", \"toolbar\"], default: \"default\", description: \"Select surface variant.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when selection changes.\" }\n },\n children: noChildren,\n examples: [example(\"select\", {\n namespace: \"doc_select_typical\",\n layout: {\n \"select:env\": {\n label: \"Environment\",\n icon: \"server\",\n value: \"prod\",\n options: [\n {\n label: \"Development\",\n value: \"dev\",\n icon: \"code\"\n },\n {\n label: \"Production\",\n value: \"prod\",\n icon: \"rocket-launch\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/slider.spec.ts\nvar sliderSpec = component({\n type: \"slider\",\n category: \"Input\",\n title: \"Slider\",\n summary: \"Numeric range input.\",\n description: \"Use slider for bounded numeric adjustments such as volume, brightness, or thresholds.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Slider label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n value: { type: \"number\", default: 0, dynamic: true, description: \"Current numeric value.\" },\n min: { type: \"number\", default: 0, dynamic: true, description: \"Minimum value.\" },\n max: { type: \"number\", default: 100, dynamic: true, description: \"Maximum value.\" },\n step: { type: \"number\", default: 1, dynamic: true, description: \"Step interval.\" },\n unit: { type: \"string\", dynamic: true, description: \"Unit shown after the value.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the range input.\" },\n orientation: { type: \"string\", values: [\"horizontal\", \"vertical\"], default: \"horizontal\", description: \"Slider orientation metadata used for styling.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the value changes.\" }\n },\n children: noChildren,\n examples: [example(\"slider\", {\n namespace: \"doc_slider_typical\",\n layout: {\n \"slider:volume\": {\n label: \"Volume\",\n icon: \"speaker-high\",\n value: 42,\n min: 0,\n max: 100,\n step: 1,\n unit: \"%\"\n }\n }\n })]\n});\n\n// src/components/entries/stat.spec.ts\nvar statSpec = component({\n type: \"stat\",\n category: \"Display\",\n title: \"Stat\",\n summary: \"Metric display.\",\n description: \"Use stat to present a labeled metric value with optional unit and semantic tone.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Metric label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n value: { type: \"string | number\", dynamic: true, description: \"Metric value.\" },\n unit: { type: \"string\", dynamic: true, description: \"Unit shown after the value.\" },\n tone: { type: \"string\", values: semanticTones, description: \"Optional semantic tone.\" },\n animateInitial: { type: \"boolean\", default: false, description: \"Animate the initial rendered value.\" }\n },\n children: noChildren,\n examples: [example(\"stat\", {\n namespace: \"doc_stat_typical\",\n layout: {\n \"grid:stats\": {\n columns: 2,\n \"stat:requests\": {\n label: \"Requests\",\n icon: \"activity\",\n value: \"1.2k\",\n unit: \"/min\"\n },\n \"stat:success\": {\n label: \"Success\",\n icon: \"check-circle\",\n value: \"98.4\",\n unit: \"%\",\n tone: \"success\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/submit.spec.ts\nvar submitSpec = component({\n type: \"submit\",\n category: \"Action\",\n title: \"Submit\",\n summary: \"ToolHost submit and ignore controls.\",\n description: \"Use submit inside tool templates to return selected state fields to the host.\",\n props: {\n submitLabel: { type: \"string\", default: \"Submit\", description: \"Submit button text.\" },\n ignoreLabel: { type: \"string\", default: \"Ignore\", description: \"Ignore button text.\" },\n returnKeys: { type: \"string[]\", description: \"State field paths returned to ToolHost.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable submit action.\" }\n },\n children: noChildren,\n examples: [example(\"submit\", {\n namespace: \"doc_submit_typical\",\n layout: {\n \"column:tool\": {\n \"input:title\": {\n value: \"Release note\",\n placeholder: \"Title\"\n },\n \"submit:done\": {\n submitLabel: \"Submit\",\n ignoreLabel: \"Ignore\",\n returnKeys: [\n \"title\"\n ]\n }\n }\n }\n })]\n});\n\n// src/components/entries/switch.spec.ts\nvar switchSpec = component({\n type: \"switch\",\n category: \"Input\",\n title: \"Switch\",\n summary: \"Boolean switch input.\",\n description: \"Use switch for an on/off setting.\",\n props: {\n enabled: { type: \"boolean\", default: false, dynamic: true, description: \"Enabled state.\" },\n label: { type: \"string\", dynamic: true, description: \"Switch label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the visible label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the switch.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when enabled state changes.\" }\n },\n children: noChildren,\n examples: [example(\"switch\", {\n namespace: \"doc_switch_typical\",\n layout: {\n \"switch:feature\": {\n enabled: true,\n label: \"Enable sync\",\n icon: \"arrows-clockwise\"\n }\n }\n })]\n});\n\n// src/components/entries/table.spec.ts\nvar tableSpec = component({\n type: \"table\",\n category: \"Data\",\n title: \"Table\",\n summary: \"Simple data table.\",\n description: \"Use table to render rows of keyed data against a column definition.\",\n props: {\n columns: { type: \"array\", description: \"Column definitions with key, label, and optional icon.\" },\n \"columns[].icon\": { type: \"string\", description: \"Icon name shown before a column label.\" },\n rows: { type: \"array\", description: \"Row data objects keyed by column key.\" },\n items: { type: \"array\", description: \"Alias for rows.\" }\n },\n children: noChildren,\n examples: [example(\"table\", {\n namespace: \"doc_table_typical\",\n layout: {\n \"table:routes\": {\n columns: [\n {\n key: \"name\",\n label: \"Name\",\n icon: \"text-t\"\n },\n {\n key: \"status\",\n label: \"Status\",\n icon: \"check-circle\"\n }\n ],\n rows: [\n {\n name: \"Parse\",\n status: \"ready\"\n },\n {\n name: \"Publish\",\n status: \"pending\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/tabs.spec.ts\nvar tabsSpec = component({\n type: \"tabs\",\n category: \"Navigation\",\n title: \"Tabs\",\n summary: \"Tabbed view switcher.\",\n description: \"Use tabs to switch between named content panels.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current active tab value.\" },\n tabs: { type: \"array\", description: \"Tab definitions with value, label, content, icon, and iconOnly.\" },\n \"tabs[].icon\": { type: \"string\", description: \"Icon name shown before a tab trigger label.\" },\n \"tabs[].iconOnly\": { type: \"boolean\", description: \"Show only the tab icon while retaining label as accessible text.\" },\n orientation: { type: \"string\", values: [\"horizontal\", \"vertical\"], default: \"horizontal\", description: \"Tab list orientation.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the active tab changes.\" }\n },\n children: noChildren,\n examples: [example(\"tabs\", {\n namespace: \"doc_tabs_typical\",\n layout: {\n \"tabs:main\": {\n value: \"overview\",\n tabs: [\n {\n value: \"overview\",\n label: \"Overview\"\n },\n {\n value: \"settings\",\n label: \"Settings\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/text.spec.ts\nvar textSpec = component({\n type: \"text\",\n category: \"Display\",\n title: \"Text\",\n summary: \"Plain text display.\",\n description: \"Use text for short static or dynamic copy inside SlexKit layouts.\",\n props: {\n text: { type: \"string\", dynamic: true, description: \"Displayed text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n variant: { type: \"string\", values: [\"default\", \"muted\"], default: \"default\", description: \"Text visual variant.\" },\n color: { type: \"string\", dynamic: true, description: \"Optional CSS color for controlled previews.\" },\n size: { type: \"string | number\", dynamic: true, description: \"Optional font size. Numbers are treated as px.\" },\n class: { type: \"string\", description: \"Additional host-controlled CSS class.\" }\n },\n children: noChildren,\n examples: [example(\"text\", {\n namespace: \"doc_text_typical\",\n layout: {\n \"text:status\": {\n text: \"System is healthy\"\n }\n }\n })]\n});\n\n// src/components/entries/toast.spec.ts\nvar toastSpec = component({\n type: \"toast\",\n category: \"Feedback\",\n title: \"Toast\",\n summary: \"Transient notification.\",\n description: \"Use toast to show an inline notification with semantic status.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Toast title.\" },\n heading: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n icon: { type: \"string\", description: \"Icon name shown at the left of the toast.\" },\n description: { type: \"string\", dynamic: true, description: \"Toast body text.\" },\n text: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n message: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n type: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Semantic notification type.\" },\n tone: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Alias for type.\" },\n duration: { type: \"number\", description: \"Auto-hide delay in milliseconds.\" },\n dismissable: { type: \"boolean\", default: true, description: \"Show a close button.\" },\n dismissible: { type: \"boolean\", default: true, description: \"Alias for dismissable.\" },\n closeLabel: { type: \"string\", default: \"Close notification\", description: \"Accessible close button label.\" },\n closeAriaLabel: { type: \"string\", description: \"Alias for closeLabel.\" }\n },\n children: noChildren,\n examples: [example(\"toast\", {\n namespace: \"doc_toast_typical\",\n layout: {\n \"toast:saved\": {\n type: \"success\",\n title: \"Saved\",\n icon: \"check-circle\",\n description: \"Changes have been written.\"\n }\n }\n })]\n});\n\n// src/components/entries/specs.ts\nvar componentSpecs = [\n accordionSpec,\n badgeSpec,\n buttonSpec,\n calloutSpec,\n cardSpec,\n checkboxSpec,\n codeBlockSpec,\n collapsibleSpec,\n columnSpec,\n dividerSpec,\n formulaSpec,\n gridSpec,\n iconSpec,\n inputSpec,\n linkSpec,\n playgroundSpec,\n progressSpec,\n radioGroupSpec,\n rowSpec,\n sectionSpec,\n selectSpec,\n sliderSpec,\n statSpec,\n submitSpec,\n switchSpec,\n tableSpec,\n tabsSpec,\n textSpec,\n toastSpec\n];\n\n// src/components/spec-registry.ts\nvar publicComponentTypes = componentSpecs.map((spec) => spec.type);\nvar componentSpecByType = new Map(componentSpecs.map((spec) => [spec.type, spec]));\n\n// src/engine/capabilities.ts\nvar slexkitStdlibDocs = [\n {\n name: \"math\",\n summary: \"Small numeric helpers for common interactive calculations.\",\n functions: [\n { name: \"std.math.clamp\", signature: \"clamp(value, min, max)\", summary: \"Clamp a number into a range.\", pure: true, example: \"std.math.clamp(g.score, 0, 100)\" },\n { name: \"std.math.round\", signature: \"round(value, digits = 0)\", summary: \"Round with a fixed number of decimal digits.\", pure: true, example: \"std.math.round(g.latency, 1)\" },\n { name: \"std.math.safeDivide\", signature: \"safeDivide(numerator, denominator, fallback = 0)\", summary: \"Divide with a fallback for zero or invalid denominators.\", pure: true, example: \"std.math.safeDivide(g.used, g.total, 0)\" },\n { name: \"std.math.percent\", signature: \"percent(part, total, digits = 1)\", summary: \"Return part / total as a percentage number.\", pure: true, example: \"std.math.percent(g.done, g.total, 1)\" },\n { name: \"std.math.lerp\", signature: \"lerp(start, end, t)\", summary: \"Linear interpolation.\", pure: true, example: \"std.math.lerp(0, 100, g.progress)\" }\n ]\n },\n {\n name: \"stats\",\n summary: \"Finite-number aggregations for arrays.\",\n functions: [\n { name: \"std.stats.sum\", signature: \"sum(values)\", summary: \"Sum finite numeric values. Empty arrays return 0.\", pure: true, example: \"std.stats.sum(g.samples)\" },\n { name: \"std.stats.mean\", signature: \"mean(values)\", summary: \"Average finite numeric values. Empty arrays return NaN.\", pure: true, example: \"std.stats.mean(g.samples)\" },\n { name: \"std.stats.min\", signature: \"min(values)\", summary: \"Minimum finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.min(g.samples)\" },\n { name: \"std.stats.max\", signature: \"max(values)\", summary: \"Maximum finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.max(g.samples)\" },\n { name: \"std.stats.median\", signature: \"median(values)\", summary: \"Median finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.median(g.samples)\" }\n ]\n },\n {\n name: \"format\",\n summary: \"Deterministic display formatting with en-US defaults.\",\n functions: [\n { name: \"std.format.fixed\", signature: \"fixed(value, digits = 2)\", summary: \"Format a number with fixed decimal places.\", pure: true, example: \"std.format.fixed(g.voltage, 3)\" },\n { name: \"std.format.number\", signature: \"number(value, digits = 0, locale = 'en-US')\", summary: \"Locale number formatting.\", pure: true, example: \"std.format.number(g.requests)\" },\n { name: \"std.format.compact\", signature: \"compact(value, digits = 1, locale = 'en-US')\", summary: \"Compact number formatting.\", pure: true, example: \"std.format.compact(g.users)\" },\n { name: \"std.format.percent\", signature: \"percent(ratio, digits = 1)\", summary: \"Format a ratio as a percentage string.\", pure: true, example: \"std.format.percent(g.done / g.total, 1)\" },\n { name: \"std.format.currency\", signature: \"currency(value, currency = 'USD', locale = 'en-US')\", summary: \"Format a currency value.\", pure: true, example: \"std.format.currency(g.revenue, 'USD')\" }\n ]\n },\n {\n name: \"units\",\n summary: \"Small unit display helpers for common dashboards.\",\n functions: [\n { name: \"std.units.withUnit\", signature: \"withUnit(value, unit, digits = 2)\", summary: \"Format a value with a unit suffix.\", pure: true, example: \"std.units.withUnit(g.power, 'W', 1)\" },\n { name: \"std.units.bytes\", signature: \"bytes(value, digits = 1)\", summary: \"Format bytes as B, KB, MB, GB, TB, or PB.\", pure: true, example: \"std.units.bytes(g.payloadBytes)\" },\n { name: \"std.units.duration\", signature: \"duration(ms, digits = 1)\", summary: \"Format milliseconds as ms, s, min, or h.\", pure: true, example: \"std.units.duration(g.elapsedMs)\" },\n { name: \"std.units.si\", signature: \"si(value, unit = '', digits = 2)\", summary: \"Format with SI prefixes.\", pure: true, example: \"std.units.si(g.frequency, 'Hz', 2)\" }\n ]\n }\n];\nvar slexkitRuntimeCapabilities = [\n { name: \"api.get\", policy: \"network\", signature: \"get(url, options)\", summary: \"Policy-gated GET request.\", example: \"await api.get('https://api.example.com/status')\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.post\", policy: \"network\", signature: \"post(url, body, options)\", summary: \"Policy-gated POST request.\", example: \"await api.post('https://api.example.com/items', { ok: true })\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.fetch\", policy: \"network\", signature: \"fetch(url, options)\", summary: \"Policy-gated GET or POST request.\", example: \"await api.fetch(url, { method: 'GET' })\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.setTimeout\", policy: \"timer\", signature: \"setTimeout(fn, ms)\", summary: \"Policy-gated timeout.\", example: \"api.setTimeout(function () { g.ready = true; }, 500)\", secureDefault: \"denied\", forbidden: [\"setTimeout(fn, ms)\"] },\n { name: \"api.clearTimeout\", policy: \"timer\", signature: \"clearTimeout(id)\", summary: \"Clear a policy-gated timeout.\", example: \"api.clearTimeout(g.timeoutId)\", secureDefault: \"denied\" },\n { name: \"api.setInterval\", policy: \"timer\", signature: \"setInterval(fn, ms)\", summary: \"Policy-gated interval.\", example: \"api.setInterval(function () { g.ticks += 1; }, 1000)\", secureDefault: \"denied\", forbidden: [\"setInterval(fn, ms)\"] },\n { name: \"api.clearInterval\", policy: \"timer\", signature: \"clearInterval(id)\", summary: \"Clear a policy-gated interval.\", example: \"api.clearInterval(g.intervalId)\", secureDefault: \"denied\" },\n { name: \"api.raf\", policy: \"animation\", signature: \"raf(fn)\", summary: \"Policy-gated animation frame.\", example: \"api.raf(function (time) { g.time = time; })\", secureDefault: \"denied\", forbidden: [\"requestAnimationFrame(fn)\"] },\n { name: \"api.cancelRaf\", policy: \"animation\", signature: \"cancelRaf(id)\", summary: \"Cancel a policy-gated animation frame.\", example: \"api.cancelRaf(g.rafId)\", secureDefault: \"denied\" },\n { name: \"api.createCanvas\", policy: \"canvas\", signature: \"createCanvas(width, height)\", summary: \"Create a policy-counted canvas.\", example: \"var canvas = api.createCanvas(320, 180)\", secureDefault: \"denied\" },\n { name: \"api.getCanvasContext\", policy: \"canvas\", signature: \"getCanvasContext(canvas, contextId, options)\", summary: \"Get a policy-checked canvas context.\", example: \"var ctx = api.getCanvasContext(canvas, '2d')\", secureDefault: \"denied\" },\n { name: \"api.onDispose\", policy: \"lifecycle\", signature: \"onDispose(fn)\", summary: \"Register runtime cleanup.\", example: \"api.onDispose(function () { g.closed = true; })\", secureDefault: \"available\" },\n { name: \"api.now\", policy: \"lifecycle\", signature: \"now()\", summary: \"Runtime clock.\", example: \"api.now()\", secureDefault: \"available\" },\n { name: \"api.isTimeoutError\", policy: \"diagnostics\", signature: \"isTimeoutError(error)\", summary: \"Check timeout errors.\", example: \"api.isTimeoutError(error)\", secureDefault: \"available\" },\n { name: \"api.isNetworkError\", policy: \"diagnostics\", signature: \"isNetworkError(error)\", summary: \"Check network errors.\", example: \"api.isNetworkError(error)\", secureDefault: \"available\" },\n { name: \"api.isPolicyError\", policy: \"diagnostics\", signature: \"isPolicyError(error)\", summary: \"Check policy errors.\", example: \"api.isPolicyError(error)\", secureDefault: \"available\" },\n { name: \"api.errorMessage\", policy: \"diagnostics\", signature: \"errorMessage(error)\", summary: \"Extract a displayable error message.\", example: \"api.errorMessage(error)\", secureDefault: \"available\" }\n];\nvar slexkitStdlibFunctionNames = slexkitStdlibDocs.flatMap((namespace) => namespace.functions.map((fn) => fn.name));\nvar slexkitRuntimeCapabilityNames = slexkitRuntimeCapabilities.map((capability) => capability.name);\n\n// src/engine/validation.ts\nvar componentSpecByType2 = new Map(componentSpecs.map((spec) => [spec.type, spec]));\nvar stdlibFunctions = new Set(slexkitStdlibFunctionNames);\nvar stdlibNamespaces = new Set(slexkitStdlibFunctionNames.map((name) => name.split(\".\").slice(0, 2).join(\".\")));\nvar apiMembers = new Set(slexkitRuntimeCapabilityNames);\nvar directiveProps = new Set([\"$if\", \"$for\", \"$key\"]);\nvar nativeSecureCapabilities = [\n { value: \"fetch\", pattern: /(?<!\\.)\\bfetch\\s*\\(/ },\n { value: \"XMLHttpRequest\", pattern: /\\bXMLHttpRequest\\b/ },\n { value: \"WebSocket\", pattern: /\\bWebSocket\\b/ },\n { value: \"setTimeout\", pattern: /(?<!\\.)\\bsetTimeout\\s*\\(/ },\n { value: \"requestAnimationFrame\", pattern: /(?<!\\.)\\brequestAnimationFrame\\s*\\(/ }\n];\nfunction collectMemberUsage(source, root) {\n const matches = source.matchAll(new RegExp(`\\\\b${root}\\\\.([A-Za-z_$][\\\\w$]*)(?:\\\\.([A-Za-z_$][\\\\w$]*))?`, \"g\"));\n const found = new Set;\n for (const match of matches) {\n found.add([root, match[1], match[2]].filter(Boolean).join(\".\"));\n }\n return [...found].sort();\n}\nfunction componentKeyType(key) {\n const colon = key.indexOf(\":\");\n return colon > 0 ? key.slice(0, colon) : null;\n}\nfunction isKnownProp(type, key) {\n if (directiveProps.has(key) || key.startsWith(\"on\"))\n return true;\n const spec = componentSpecByType2.get(type);\n if (!spec)\n return true;\n const propName = key.startsWith(\"$\") ? key.slice(1) : key;\n return propName in spec.props;\n}\nfunction walkComponents(value, warnings, usage, path = \"\") {\n if (!value || typeof value !== \"object\")\n return;\n for (const [key, child] of Object.entries(value)) {\n const childPath = path ? `${path}.${key}` : key;\n const type = componentKeyType(key);\n if (type) {\n usage.add(type);\n const spec = componentSpecByType2.get(type);\n if (!spec) {\n warnings.push({\n code: \"unknown_component\",\n message: `Unknown SlexKit component '${type}'.`,\n path: childPath,\n value: type\n });\n }\n if (child && typeof child === \"object\") {\n for (const propName of Object.keys(child)) {\n if (componentKeyType(propName))\n continue;\n if (!isKnownProp(type, propName)) {\n warnings.push({\n code: \"unknown_prop\",\n message: `Unknown prop '${propName}' on component '${type}'.`,\n path: `${childPath}.${propName}`,\n value: propName\n });\n }\n }\n }\n }\n walkComponents(child, warnings, usage, childPath);\n }\n}\nfunction sourceWarnings(source, mode) {\n const warnings = [];\n const stdlibUsage = collectMemberUsage(source, \"std\");\n const apiUsage = collectMemberUsage(source, \"api\");\n for (const name of stdlibUsage) {\n if (stdlibFunctions.has(name) || stdlibNamespaces.has(name))\n continue;\n warnings.push({\n code: \"unknown_std_member\",\n message: `Unknown SlexKit stdlib member '${name}'.`,\n value: name\n });\n }\n for (const name of apiUsage) {\n if (apiMembers.has(name))\n continue;\n warnings.push({\n code: \"unknown_api_member\",\n message: `Unknown SlexKit runtime API member '${name}'.`,\n value: name\n });\n }\n if (mode === \"secure\") {\n for (const capability of nativeSecureCapabilities) {\n if (capability.pattern.test(source)) {\n warnings.push({\n code: \"native_secure_capability\",\n message: `Native '${capability.value}' is not supported in secure mode. Use policy-gated api.* instead.`,\n value: capability.value\n });\n }\n }\n }\n return { warnings, stdlibUsage, apiUsage };\n}\nfunction validateSlexSource(source, options = {}) {\n const mode = options.mode ?? \"trusted\";\n const parsed = parseSlexSource(source);\n const usage = new Set;\n const { warnings, stdlibUsage, apiUsage } = sourceWarnings(source, mode);\n if (!parsed.ok) {\n return {\n ok: false,\n diagnostic: parsed.diagnostic,\n warnings,\n componentUsage: [],\n stdlibUsage,\n apiUsage\n };\n }\n walkComponents(parsed.value, warnings, usage);\n return {\n ok: true,\n value: parsed.value,\n warnings,\n componentUsage: [...usage].sort(),\n stdlibUsage,\n apiUsage\n };\n}\n// src/engine/markdown-runtime.ts\nvar DEFAULT_POLICY = {};\nfunction isRecord(value) {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction isRenderableSource(value) {\n if (!isRecord(value))\n return false;\n if (\"layout\" in value)\n return isRecord(value.layout) && Object.keys(value.layout).length > 0;\n if (\"namespace\" in value || \"g\" in value)\n return false;\n return Object.keys(value).some((key) => key.includes(\":\"));\n}\nfunction bareLayoutFromSource(value) {\n const layout = { ...value };\n delete layout.slex;\n delete layout.namespace;\n delete layout.g;\n delete layout.layout;\n return layout;\n}\nfunction isStateOnlySource(value) {\n return isRecord(value) && !isRenderableSource(value) && ((\"slex\" in value) || (\"namespace\" in value) || (\"g\" in value));\n}\nfunction isSlexExpressionEnvelope(value) {\n return isRecord(value) && ((\"slex\" in value) || (\"namespace\" in value) || (\"g\" in value) || (\"layout\" in value));\n}\nfunction parseTrustedSource(source) {\n if (typeof source !== \"string\")\n return source;\n const parsed = parseSlexSource(source);\n return parsed.ok ? parsed.value : source;\n}\nfunction scopedTrustedSource(source, artifactId) {\n if (!artifactId || !isSlexExpressionEnvelope(source)) {\n return source;\n }\n if (!(\"layout\" in source) && isRenderableSource(source)) {\n return {\n slex: typeof source.slex === \"string\" ? source.slex : undefined,\n namespace: `${artifactId}::${String(source.namespace || \"default\")}`,\n g: isRecord(source.g) ? source.g : {},\n layout: bareLayoutFromSource(source)\n };\n }\n return {\n ...source,\n namespace: `${artifactId}::${String(source.namespace || \"default\")}`\n };\n}\nfunction namespaceFromSource(source) {\n if (!isSlexExpressionEnvelope(source))\n return;\n return String(source.namespace || \"default\");\n}\nfunction compareDocumentOrder(a, b) {\n if (a === b)\n return 0;\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING)\n return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING)\n return 1;\n return 0;\n}\nfunction createSlexKitMarkdownRuntimeHost(initialOptions = {}) {\n let options = {\n mode: \"trusted\",\n secureFrame: true,\n policy: DEFAULT_POLICY,\n ...initialOptions\n };\n const cleanups = new Map;\n const artifactContainers = new Map;\n const artifactSources = new Map;\n const secureArtifactAnchors = new Map;\n const secureArtifactCleanups = new Map;\n const trustedArtifactNamespaces = new Map;\n function rememberTrustedArtifactNamespace(artifactId, source) {\n if (!artifactId)\n return;\n const namespace = namespaceFromSource(source);\n if (!namespace)\n return;\n let namespaces = trustedArtifactNamespaces.get(artifactId);\n if (!namespaces) {\n namespaces = new Set;\n trustedArtifactNamespaces.set(artifactId, namespaces);\n }\n namespaces.add(`${artifactId}::${namespace}`);\n }\n function disposeTrustedArtifactNamespaces(artifactId) {\n const namespaces = trustedArtifactNamespaces.get(artifactId);\n if (!namespaces)\n return;\n for (const namespace of namespaces)\n disposeNamespace(namespace);\n trustedArtifactNamespaces.delete(artifactId);\n }\n function composeSecureArtifactSource(artifactId) {\n const sources = artifactSources.get(artifactId);\n if (!sources)\n return \"\";\n const orderedSources = Array.from(sources.entries()).sort(([a], [b]) => compareDocumentOrder(a, b)).map(([, source]) => source);\n const serializedSources = JSON.stringify(orderedSources.map((source) => ({\n kind: typeof source === \"string\" ? \"script\" : \"json\",\n source: encodeURIComponent(typeof source === \"string\" ? source : JSON.stringify(source))\n })));\n const artifactPrefix = JSON.stringify(`${artifactId}::`);\n return `(() => {\n const __sources = ${serializedSources}.map((entry) => ({\n kind: entry.kind,\n source: decodeURIComponent(entry.source),\n }));\n const __isRecord = (value) => !!value && typeof value === \"object\" && !Array.isArray(value);\n const __merge = (target, source) => {\n if (!__isRecord(source)) return target;\n for (const [key, value] of Object.entries(source)) {\n if (__isRecord(value) && __isRecord(target[key])) __merge(target[key], value);\n else target[key] = value;\n }\n return target;\n };\n const __isRenderableTree = (value) => __isRecord(value) && Object.keys(value).some((key) => key.includes(\":\"));\n const __artifactPrefix = ${artifactPrefix};\n const __target = { slex: \"0.1\", namespace: __artifactPrefix + \"default\", g: {}, layout: {} };\n const __layouts = [];\n for (const __entry of __sources) {\n const __script = __entry.kind === \"json\" ? JSON.parse(__entry.source) : (0, eval)(\"(\" + __entry.source + \")\");\n if (!__isRecord(__script)) continue;\n if (\"slex\" in __script) __target.slex = String(__script.slex || \"0.1\");\n if (\"namespace\" in __script) __target.namespace = __artifactPrefix + String(__script.namespace || \"default\");\n if (__isRecord(__script.g)) __merge(__target.g, __script.g);\n if (__isRecord(__script.layout) && Object.keys(__script.layout).length > 0) __layouts.push(__script.layout);\n else if (!(\"namespace\" in __script) && !(\"g\" in __script) && !(\"layout\" in __script) && __isRenderableTree(__script)) {\n const { slex: __slex, ...__layout } = __script;\n __layouts.push(__layout);\n }\n }\n if (__layouts.length === 1) {\n __target.layout = { \"column:block_0\": Object.assign({}, __layouts[0], { id: \"slexkit-slot-slot_0\" }) };\n } else if (__layouts.length > 1) {\n __target.layout = {\n \"column:artifact\": Object.fromEntries(\n __layouts.map((layout, index) => [\"column:block_\" + index, Object.assign({}, layout, { id: \"slexkit-slot-slot_\" + index })]),\n ),\n };\n }\n return __target;\n })()`;\n }\n function addArtifactContainer(artifactId, container) {\n let containers = artifactContainers.get(artifactId);\n if (!containers) {\n containers = new Set;\n artifactContainers.set(artifactId, containers);\n }\n containers.add(container);\n }\n function addArtifactSource(block) {\n const artifactId = block.artifactId;\n let sources = artifactSources.get(artifactId);\n if (!sources) {\n sources = new Map;\n artifactSources.set(artifactId, sources);\n }\n sources.set(block.container, block.source);\n addArtifactContainer(artifactId, block.container);\n return artifactId;\n }\n function clearSecureSlot(container) {\n delete container.dataset.slexkitSecureArtifactSlot;\n container.replaceChildren();\n }\n function selectSecureArtifactAnchor(artifactId) {\n const containers = artifactContainers.get(artifactId);\n if (!containers?.size)\n return;\n return Array.from(containers).sort(compareDocumentOrder)[0];\n }\n function remountSecureArtifact(artifactId, theme) {\n const anchor = secureArtifactAnchors.get(artifactId);\n if (!anchor)\n return;\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n clearSecureSlot(anchor);\n const containers = artifactContainers.get(artifactId) ?? new Set;\n const orderedContainers = Array.from(containers).sort(compareDocumentOrder);\n for (const container of containers) {\n if (container === anchor)\n continue;\n clearSecureSlot(container);\n container.dataset.slexkitSecureArtifactSlot = \"true\";\n }\n const cleanup = mountSecureArtifact(composeSecureArtifactSource(artifactId), anchor, {\n theme,\n dir: options.dir,\n labels: options.labels,\n policy: options.policy ?? DEFAULT_POLICY,\n hostAdapter: options.hostAdapter,\n frame: options.secureFrame ?? true,\n artifactSlots: orderedContainers.map((container, index) => ({\n id: `slot_${index}`,\n container\n }))\n });\n secureArtifactCleanups.set(artifactId, cleanup);\n }\n function mountSecureBlock(block) {\n if (!block.artifactId) {\n const cleanup2 = mountSecureArtifact(block.source, block.container, {\n theme: block.theme ?? options.theme,\n dir: block.dir ?? options.dir,\n labels: block.labels ?? options.labels,\n policy: options.policy ?? DEFAULT_POLICY,\n hostAdapter: options.hostAdapter,\n frame: options.secureFrame ?? true\n });\n return remember(block, cleanup2);\n }\n const artifactId = addArtifactSource(block);\n const anchor = selectSecureArtifactAnchor(artifactId);\n if (anchor)\n secureArtifactAnchors.set(artifactId, anchor);\n remountSecureArtifact(artifactId, block.theme ?? options.theme);\n const cleanup = () => {\n artifactSources.get(artifactId)?.delete(block.container);\n artifactContainers.get(artifactId)?.delete(block.container);\n cleanups.delete(block.container);\n clearSecureSlot(block.container);\n const sources = artifactSources.get(artifactId);\n const containers = artifactContainers.get(artifactId);\n if (!sources?.size || !containers?.size) {\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n secureArtifactAnchors.delete(artifactId);\n artifactSources.delete(artifactId);\n artifactContainers.delete(artifactId);\n return;\n }\n if (secureArtifactAnchors.get(artifactId) === block.container) {\n const nextAnchor = selectSecureArtifactAnchor(artifactId);\n if (nextAnchor)\n secureArtifactAnchors.set(artifactId, nextAnchor);\n }\n remountSecureArtifact(artifactId, block.theme ?? options.theme);\n };\n cleanups.set(block.container, cleanup);\n return cleanup;\n }\n function remember(block, cleanup) {\n cleanups.set(block.container, cleanup);\n if (block.artifactId) {\n addArtifactContainer(block.artifactId, block.container);\n }\n return () => {\n cleanup();\n cleanups.delete(block.container);\n if (!block.artifactId)\n return;\n const containers = artifactContainers.get(block.artifactId);\n containers?.delete(block.container);\n if (containers?.size === 0)\n artifactContainers.delete(block.artifactId);\n };\n }\n function disposeBlock(container) {\n const cleanup = cleanups.get(container);\n if (!cleanup)\n return;\n cleanup();\n cleanups.delete(container);\n for (const [artifactId, containers] of artifactContainers) {\n containers.delete(container);\n artifactSources.get(artifactId)?.delete(container);\n if (secureArtifactAnchors.get(artifactId) === container) {\n const nextAnchor = selectSecureArtifactAnchor(artifactId);\n if (nextAnchor)\n secureArtifactAnchors.set(artifactId, nextAnchor);\n else\n secureArtifactAnchors.delete(artifactId);\n }\n if (containers.size === 0)\n artifactContainers.delete(artifactId);\n if (artifactSources.get(artifactId)?.size === 0)\n artifactSources.delete(artifactId);\n }\n }\n return {\n configure(nextOptions) {\n options = { ...options, ...nextOptions };\n },\n getMode() {\n return options.mode ?? \"trusted\";\n },\n mountBlock(block) {\n disposeBlock(block.container);\n block.container.replaceChildren();\n const mode = options.mode ?? \"trusted\";\n if (mode === \"secure\")\n return mountSecureBlock(block);\n const parsedSource = parseTrustedSource(block.source);\n rememberTrustedArtifactNamespace(block.artifactId, parsedSource);\n const trustedSource = scopedTrustedSource(parsedSource, block.artifactId);\n const stateOnly = block.stateOnly ?? isStateOnlySource(trustedSource);\n if (stateOnly) {\n const ok = ingest(trustedSource);\n if (!ok)\n throw new Error(\"Failed to parse Slex state block.\");\n return remember(block, () => {});\n }\n const theme = block.theme ?? options.theme;\n const cleanup = mount(trustedSource, block.container, {\n theme,\n dir: block.dir ?? options.dir,\n labels: block.labels ?? options.labels\n });\n return remember(block, cleanup);\n },\n disposeBlock,\n disposeArtifact(artifactId) {\n const containers = Array.from(artifactContainers.get(artifactId) ?? []);\n for (const container of containers)\n disposeBlock(container);\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n secureArtifactAnchors.delete(artifactId);\n artifactContainers.delete(artifactId);\n artifactSources.delete(artifactId);\n disposeTrustedArtifactNamespaces(artifactId);\n },\n disposeAll() {\n for (const container of Array.from(cleanups.keys()))\n disposeBlock(container);\n for (const cleanup of Array.from(secureArtifactCleanups.values()))\n cleanup();\n secureArtifactCleanups.clear();\n secureArtifactAnchors.clear();\n artifactContainers.clear();\n artifactSources.clear();\n for (const artifactId of Array.from(trustedArtifactNamespaces.keys())) {\n disposeTrustedArtifactNamespaces(artifactId);\n }\n }\n };\n}\nvar globalMarkdownRuntimeHost;\nfunction installSlexKitMarkdownRuntimeHost(options = {}) {\n globalMarkdownRuntimeHost = createSlexKitMarkdownRuntimeHost(options);\n return globalMarkdownRuntimeHost;\n}\nfunction getSlexKitMarkdownRuntimeHost() {\n if (!globalMarkdownRuntimeHost) {\n globalMarkdownRuntimeHost = createSlexKitMarkdownRuntimeHost();\n }\n return globalMarkdownRuntimeHost;\n}\n\n// src/engine/index.ts\nvar defaultRuntimeUrl = typeof document !== \"undefined\" && typeof document.currentScript === \"object\" && document.currentScript && \"src\" in document.currentScript ? String(document.currentScript.src || \"\") : undefined;\nfunction setSlexKitRuntimeUrl(url) {\n defaultRuntimeUrl = url || undefined;\n}\nfunction getSlexKitRuntimeUrl() {\n return defaultRuntimeUrl;\n}\nfunction normalizeExpression(input) {\n if (!input || typeof input !== \"object\")\n return input;\n const hasProtocolMarker = \"slex\" in input;\n const hasEnvelopeField = \"namespace\" in input || \"g\" in input || \"layout\" in input;\n if (hasEnvelopeField)\n return input;\n const keys = Object.keys(input);\n if (keys.some((key) => key.includes(\":\"))) {\n const { slex, ...layout } = input;\n return {\n ...hasProtocolMarker ? { slex } : {},\n namespace: \"default\",\n g: {},\n layout\n };\n }\n return input;\n}\nfunction warnUnsupportedProtocol(expression) {\n if (expression.slex === undefined || expression.slex === SLEX_PROTOCOL_VERSION)\n return;\n console.warn(`[SlexKit] Slex protocol marker '${String(expression.slex)}' does not match supported protocol '${SLEX_PROTOCOL_VERSION}'.`);\n}\nfunction parseSourceOrExpression(input) {\n if (typeof input !== \"string\")\n return normalizeExpression(input);\n const parsed = parseSlexSource(input);\n if (!parsed.ok) {\n console.warn(\"[SlexKit] Failed to parse Slex source:\", parsed.error.message);\n return;\n }\n return normalizeExpression(parsed.value);\n}\nfunction applyExpression(expression) {\n warnUnsupportedProtocol(expression);\n const ns = expression.namespace || \"default\";\n const store = getStore(ns);\n if (expression.g) {\n try {\n deepMerge(store.g, expression.g);\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Merge error, replacing entire g:`, e.message);\n for (const k of Object.keys(store.g)) {\n delete store.g[k];\n }\n Object.assign(store.g, expression.g);\n }\n }\n if (expression.layout) {\n store.layouts = [expression.layout];\n }\n}\nfunction hasThemeToken(el, token) {\n return getComputedStyle(el).getPropertyValue(token).trim().length > 0;\n}\nfunction resolveThemeMode(container, requested = \"auto\") {\n if (requested !== \"auto\")\n return requested;\n if (container.closest(\".slexkit-theme-uno, .slexkit-theme-flowbite\"))\n return \"uno\";\n return hasThemeToken(container, \"--primary\") && hasThemeToken(container, \"--background\") ? \"host-shadcn\" : \"uno\";\n}\nfunction resolveColorMode(container) {\n const scoped = container.closest(\".dark, .light, [data-theme='dark'], [data-theme='light']\");\n if (scoped?.classList.contains(\"dark\") || scoped?.dataset.theme === \"dark\")\n return \"dark\";\n if (scoped?.classList.contains(\"light\") || scoped?.dataset.theme === \"light\")\n return \"light\";\n const doc = container.ownerDocument || document;\n const docEl = doc.documentElement;\n if (docEl.classList.contains(\"dark\") || docEl.dataset.theme === \"dark\")\n return \"dark\";\n if (docEl.classList.contains(\"light\") || docEl.dataset.theme === \"light\")\n return \"light\";\n const scheme = getComputedStyle(docEl).colorScheme || getComputedStyle(container).colorScheme;\n if (scheme.split(/\\s+/).includes(\"dark\"))\n return \"dark\";\n if (scheme.split(/\\s+/).includes(\"light\"))\n return \"light\";\n return;\n}\nfunction applyDocumentColorMode(doc, mode) {\n if (!mode)\n return;\n doc.documentElement.classList.toggle(\"dark\", mode === \"dark\");\n doc.documentElement.classList.toggle(\"light\", mode === \"light\");\n doc.documentElement.dataset.theme = mode;\n}\nfunction resolveDirection(container, requested = \"auto\") {\n if (requested === \"ltr\" || requested === \"rtl\")\n return requested;\n const inherited = container.closest(\"[dir]\")?.dir || container.ownerDocument?.documentElement?.dir;\n return inherited === \"rtl\" ? \"rtl\" : \"ltr\";\n}\nfunction mount(input, container, options = {}) {\n const expression = parseSourceOrExpression(input);\n if (!expression)\n return () => {};\n const ns = expression.namespace || \"default\";\n const store = getStore(ns);\n const ownerDocument = container.ownerDocument || document;\n applyExpression(expression);\n const oldCleanup = store.cleanups.get(container);\n if (oldCleanup)\n oldCleanup();\n const root = ownerDocument.createElement(\"div\");\n const theme = resolveThemeMode(container, options.theme);\n const dir = resolveDirection(container, options.dir);\n root.className = `slexkit-root slexkit-theme-${theme}`;\n root.dir = dir;\n root.dataset.namespace = ns;\n root.dataset.theme = theme;\n root.dataset.dir = dir;\n container.appendChild(root);\n store.roots.set(container, root);\n const cleanup = createRoot((dispose) => {\n const layoutRoot = ownerDocument.createElement(\"div\");\n layoutRoot.className = \"slex-layout\";\n root.appendChild(layoutRoot);\n renderTree(expression.layout ?? {}, layoutRoot, store.g, store.components, store.componentTypes, undefined, ns, options.api, {\n dir,\n labels: options.labels ?? {}\n });\n return () => {\n dispose();\n root.remove();\n store.roots.delete(container);\n store.cleanups.delete(container);\n };\n });\n store.cleanups.set(container, cleanup);\n return cleanup;\n}\nfunction disposeNamespace(namespace) {\n const ns = namespace || \"default\";\n const store = peekStore(ns);\n if (store) {\n for (const cleanup of Array.from(store.cleanups.values())) {\n try {\n cleanup();\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Cleanup error while disposing namespace:`, e.message);\n }\n }\n for (const root of Array.from(store.roots.values())) {\n root.remove();\n }\n store.roots.clear();\n store.cleanups.clear();\n deleteStore(ns);\n }\n clearEvalCache(ns);\n}\nfunction mountSecureArtifact(input, container, options) {\n container.dataset.slexkitSecureRuntime = \"true\";\n let frameTarget;\n try {\n frameTarget = createSecureFrameTarget(input, container, options);\n } catch (error) {\n delete container.dataset.slexkitSecureRuntime;\n throw error;\n }\n if (frameTarget?.sandboxed) {\n return () => {\n frameTarget.dispose();\n delete container.dataset.slexkitSecureRuntime;\n };\n }\n if (!options.unsafeInlineExecution) {\n delete container.dataset.slexkitSecureRuntime;\n throw new Error(\"mountSecureArtifact requires a sandbox frame runtime URL. Use unsafeInlineExecution only for trusted inline execution.\");\n }\n const runtime = createSecureRuntime(options.policy, options.hostAdapter);\n const target = frameTarget?.target ?? container;\n const cleanup = mount(input, target, {\n theme: options.theme,\n dir: options.dir,\n labels: options.labels,\n api: runtime.api\n });\n return () => {\n cleanup();\n runtime.dispose();\n frameTarget?.dispose();\n delete container.dataset.slexkitSecureRuntime;\n };\n}\nfunction createSecureFrameTarget(input, container, mountOptions) {\n const frame = mountOptions.frame;\n if (!frame)\n return null;\n const ownerDocument = container.ownerDocument || document;\n const options = typeof frame === \"object\" ? frame : {};\n const iframe = ownerDocument.createElement(\"iframe\");\n iframe.className = options.className ?? \"slexkit-secure-frame\";\n iframe.title = options.title ?? \"SlexKit secure artifact\";\n iframe.setAttribute(\"data-slexkit-secure-frame\", \"true\");\n iframe.setAttribute(\"referrerpolicy\", \"no-referrer\");\n iframe.style.display = \"block\";\n iframe.style.width = \"100%\";\n iframe.style.border = \"0\";\n iframe.style.background = \"transparent\";\n const runtimeUrl = options.runtimeUrl ?? options.runnerUrl ?? defaultRuntimeUrl;\n if (runtimeUrl) {\n const resolvedRuntimeUrl = resolveRuntimeUrl(runtimeUrl);\n const styleUrl = options.styleUrl === false ? \"\" : options.styleUrl ?? defaultSecureFrameStyleUrl(resolvedRuntimeUrl);\n const resolvedStyleUrl = styleUrl ? resolveRuntimeUrl(styleUrl) : undefined;\n assertSandboxCloneable(input);\n iframe.setAttribute(\"sandbox\", secureSandboxAttribute(options));\n container.replaceChildren(iframe);\n const bridge = createSandboxBridge(input, container, iframe, mountOptions);\n iframe.srcdoc = secureRunnerSrcdoc(resolvedRuntimeUrl, resolvedStyleUrl);\n return bridge;\n }\n if (frame) {\n iframe.remove();\n throw new Error(\"SlexKit secure frame requires runtimeUrl or setSlexKitRuntimeUrl().\");\n }\n if (options.sandbox)\n iframe.setAttribute(\"sandbox\", options.sandbox);\n container.replaceChildren(iframe);\n const frameDocument = iframe.contentDocument;\n if (!frameDocument?.body) {\n iframe.remove();\n throw new Error(\"Unable to create SlexKit secure frame document.\");\n }\n frameDocument.open();\n frameDocument.write('<!doctype html><html><head></head><body><div id=\"slexkit-secure-root\"></div></body></html>');\n frameDocument.close();\n applyDocumentColorMode(frameDocument, resolveColorMode(container));\n const target = frameDocument.getElementById(\"slexkit-secure-root\");\n if (!target) {\n iframe.remove();\n throw new Error(\"Unable to create SlexKit secure frame root.\");\n }\n return {\n target,\n dispose: () => iframe.remove()\n };\n}\nfunction secureSandboxAttribute(options) {\n const sandbox = options.sandbox ?? \"allow-scripts\";\n const tokens = sandbox.split(/\\s+/).filter(Boolean);\n if (tokens.includes(\"allow-same-origin\") && !options.unsafeAllowSameOrigin) {\n throw new Error(\"SlexKit secure frames cannot use allow-same-origin unless unsafeAllowSameOrigin is explicitly enabled.\");\n }\n if (!tokens.includes(\"allow-scripts\")) {\n throw new Error(\"SlexKit secure frames require allow-scripts to run the runtime.\");\n }\n return tokens.join(\" \");\n}\nfunction resolveRuntimeUrl(runtimeUrl) {\n try {\n const base = typeof document !== \"undefined\" ? document.baseURI : undefined;\n return new URL(runtimeUrl, base).href;\n } catch {\n return runtimeUrl;\n }\n}\nfunction cspSourceForRuntime(runtimeUrl) {\n try {\n const parsed = new URL(runtimeUrl);\n if (parsed.protocol === \"blob:\")\n return \"blob:\";\n if (parsed.protocol === \"data:\")\n return \"data:\";\n return parsed.origin;\n } catch {\n return \"'self'\";\n }\n}\nfunction defaultSecureFrameStyleUrl(runtimeUrl) {\n try {\n const url = new URL(runtimeUrl);\n if (url.protocol === \"blob:\" || url.protocol === \"data:\")\n return \"\";\n url.pathname = url.pathname.replace(/[^/]+$/, \"slexkit.css\");\n url.search = \"\";\n url.hash = \"\";\n return url.href;\n } catch {\n return \"\";\n }\n}\nfunction escapeHtmlAttribute(value) {\n return value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\nfunction secureRunnerSrcdoc(runtimeUrl, styleUrl) {\n const nonce = randomToken(12);\n const styleSource = styleUrl ? ` ${cspSourceForRuntime(styleUrl)}` : \"\";\n const csp = [\n \"default-src 'none'\",\n `script-src 'nonce-${nonce}' 'unsafe-eval' ${cspSourceForRuntime(runtimeUrl)}`,\n \"connect-src 'none'\",\n \"img-src data: blob:\",\n `style-src 'unsafe-inline'${styleSource}`,\n \"font-src data:\",\n \"form-action 'none'\",\n \"base-uri 'none'\"\n ].join(\"; \");\n const style = \"html,body{margin:0;min-height:100%;overflow:hidden;}#slexkit-secure-root{min-height:100%;}\";\n const stylesheet = styleUrl ? `<link rel=\"stylesheet\" href=\"${escapeHtmlAttribute(styleUrl)}\">` : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(csp)}\">${stylesheet}<style>${style}</style></head><body><div id=\"slexkit-secure-root\"></div><script type=\"module\" nonce=\"${nonce}\">import { startSlexKitSandboxRunner } from ${JSON.stringify(runtimeUrl)}; startSlexKitSandboxRunner();</script></body></html>`;\n}\nfunction secureFrameLoadTimeout(options) {\n const frame = options.frame;\n if (frame && typeof frame === \"object\" && typeof frame.loadTimeoutMs === \"number\") {\n return Math.max(0, frame.loadTimeoutMs);\n }\n return 8000;\n}\nfunction secureFrameMaxUnresponsiveMs(options) {\n const value = options.policy.execution?.maxUnresponsiveMs;\n return typeof value === \"number\" ? Math.max(0, value) : 0;\n}\nfunction secureFrameLoadError(runtimeUrl, phase, detail) {\n const phaseMessage = phase === \"ready\" ? \"The sandbox did not report that the runtime module loaded.\" : \"The sandbox loaded but did not confirm artifact mount.\";\n const suffix = detail ? `\nSandbox error: ${detail}` : \"\";\n return new Error(`SlexKit secure runtime failed to load.\n${phaseMessage}\nRuntime URL: ${runtimeUrl}\n` + `Check that this URL serves slexkit.runtime.js as an ES module with:\n` + `Access-Control-Allow-Origin: *\nContent-Type: text/javascript\n` + \"Do not fix this by adding allow-same-origin to the sandbox frame.\" + suffix);\n}\nfunction secureFrameHeartbeatError(runtimeUrl, elapsedMs) {\n return new Error(`SlexKit secure runtime stopped responding.\n` + `No sandbox heartbeat was received for ${Math.round(elapsedMs)} ms.\n` + `Runtime URL: ${runtimeUrl}\n` + \"The sandbox frame was terminated to avoid keeping unresponsive agent code alive.\");\n}\nfunction showSecureFrameError(container, iframe, error) {\n container.dataset.slexkitSecureStatus = \"error\";\n let alert = container.querySelector(\".slexkit-secure-error\");\n if (!alert) {\n alert = (container.ownerDocument || document).createElement(\"div\");\n alert.className = \"slexkit-secure-error\";\n alert.setAttribute(\"role\", \"alert\");\n iframe.after(alert);\n }\n alert.textContent = error.message;\n console.error(error.message);\n}\nfunction clearSecureFrameError(container) {\n delete container.dataset.slexkitSecureStatus;\n container.querySelector(\".slexkit-secure-error\")?.remove();\n}\nfunction assertSandboxCloneable(input) {\n if (typeof input === \"string\")\n return;\n const seen = new Set;\n const visit = (value) => {\n if (typeof value === \"function\") {\n throw new Error(\"Sandbox runner input cannot contain functions. Pass Slex source to execute functions inside the sandbox realm.\");\n }\n if (!value || typeof value !== \"object\")\n return;\n if (seen.has(value))\n return;\n seen.add(value);\n for (const item of Object.values(value))\n visit(item);\n };\n visit(input);\n}\nfunction createSandboxBridge(input, container, iframe, options) {\n const id = `secure_${randomToken(8)}`;\n const token = randomToken(24);\n const bridgeRuntime = createSecureRuntime(options.policy, options.hostAdapter);\n const runtimeUrl = typeof options.frame === \"object\" ? resolveRuntimeUrl(options.frame.runtimeUrl ?? options.frame.runnerUrl ?? defaultRuntimeUrl ?? \"\") : resolveRuntimeUrl(defaultRuntimeUrl ?? \"\");\n const loadTimeoutMs = secureFrameLoadTimeout(options);\n const artifactSlots = normalizeArtifactSlots(options.artifactSlots);\n let disposed = false;\n let mounted = false;\n let ready = false;\n let mountAcknowledged = false;\n let loadTimer;\n let heartbeatTimer;\n let slotSyncFrame;\n let slotSyncTimer;\n let lastHeartbeat = 0;\n const maxUnresponsiveMs = secureFrameMaxUnresponsiveMs(options);\n const ownerWindow = iframe.ownerDocument.defaultView ?? window;\n const slotStyleSnapshots = new Map;\n let adjustedAnchorPosition = false;\n const clearLoadTimer = () => {\n if (loadTimer === undefined)\n return;\n window.clearTimeout(loadTimer);\n loadTimer = undefined;\n };\n const clearHeartbeatTimer = () => {\n if (heartbeatTimer === undefined)\n return;\n window.clearInterval(heartbeatTimer);\n heartbeatTimer = undefined;\n };\n const failLoad = (phase, detail) => {\n if (disposed || mountAcknowledged)\n return;\n clearLoadTimer();\n showSecureFrameError(container, iframe, secureFrameLoadError(runtimeUrl, phase, detail));\n terminateFrame({ keepDiagnostic: true });\n };\n const failHeartbeat = () => {\n if (disposed || !mountAcknowledged || maxUnresponsiveMs <= 0)\n return;\n const elapsed = Date.now() - lastHeartbeat;\n if (elapsed < maxUnresponsiveMs)\n return;\n clearHeartbeatTimer();\n showSecureFrameError(container, iframe, secureFrameHeartbeatError(runtimeUrl, elapsed));\n terminateFrame({ keepDiagnostic: true });\n };\n const startHeartbeatWatchdog = () => {\n if (maxUnresponsiveMs <= 0 || heartbeatTimer !== undefined)\n return;\n lastHeartbeat = Date.now();\n heartbeatTimer = window.setInterval(failHeartbeat, Math.max(10, Math.min(1000, maxUnresponsiveMs / 2)));\n };\n const clearSlotSyncTimer = () => {\n if (slotSyncFrame !== undefined) {\n ownerWindow.cancelAnimationFrame(slotSyncFrame);\n slotSyncFrame = undefined;\n }\n if (slotSyncTimer !== undefined) {\n ownerWindow.clearTimeout(slotSyncTimer);\n slotSyncTimer = undefined;\n }\n };\n const syncArtifactSlotsNow = () => {\n slotSyncFrame = undefined;\n slotSyncTimer = undefined;\n if (!artifactSlots.length || disposed)\n return;\n const frameRect = iframe.getBoundingClientRect();\n const slots = artifactSlots.map((slot) => {\n const rect = slot.container.getBoundingClientRect();\n return {\n id: slot.id,\n left: rect.left - frameRect.left,\n top: rect.top - frameRect.top,\n width: rect.width,\n height: rect.height\n };\n });\n if (artifactSlots.length > 1) {\n const maxBottom = Math.max(1, ...slots.map((slot) => slot.top + slot.height));\n iframe.style.height = `${Math.ceil(maxBottom)}px`;\n }\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"slots\",\n id,\n token,\n slots\n }, \"*\");\n };\n const requestArtifactSlotSync = () => {\n if (!artifactSlots.length || disposed || slotSyncFrame !== undefined || slotSyncTimer !== undefined)\n return;\n if (typeof ownerWindow.requestAnimationFrame === \"function\") {\n slotSyncFrame = ownerWindow.requestAnimationFrame(syncArtifactSlotsNow);\n } else {\n slotSyncTimer = ownerWindow.setTimeout(syncArtifactSlotsNow, 0);\n }\n };\n const slotResizeObserver = artifactSlots.length && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(requestArtifactSlotSync) : undefined;\n if (artifactSlots.length > 1) {\n slotStyleSnapshots.set(container, {\n minHeight: container.style.minHeight,\n position: container.style.position,\n secureSlotId: container.dataset.slexkitSecureArtifactSlotId\n });\n iframe.style.position = \"absolute\";\n iframe.style.inset = \"0 auto auto 0\";\n iframe.style.width = \"100%\";\n iframe.style.minHeight = \"1px\";\n iframe.style.border = \"0\";\n iframe.style.background = \"transparent\";\n iframe.style.zIndex = \"1\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n const computedAnchorPosition = ownerWindow.getComputedStyle(container).position;\n if (!computedAnchorPosition || computedAnchorPosition === \"static\") {\n container.style.position = \"relative\";\n adjustedAnchorPosition = true;\n }\n }\n for (const slot of artifactSlots) {\n if (!slotStyleSnapshots.has(slot.container)) {\n slotStyleSnapshots.set(slot.container, {\n minHeight: slot.container.style.minHeight,\n position: slot.container.style.position,\n secureSlotId: slot.container.dataset.slexkitSecureArtifactSlotId\n });\n }\n slot.container.dataset.slexkitSecureArtifactSlotId = slot.id;\n slotResizeObserver?.observe(slot.container);\n }\n if (artifactSlots.length) {\n ownerWindow.addEventListener(\"resize\", requestArtifactSlotSync);\n ownerWindow.addEventListener(\"scroll\", requestArtifactSlotSync, true);\n }\n if (loadTimeoutMs > 0) {\n loadTimer = window.setTimeout(() => {\n failLoad(ready ? \"mounted\" : \"ready\");\n }, loadTimeoutMs);\n }\n const postMount = () => {\n if (mounted)\n return;\n mounted = true;\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"mount\",\n id,\n token,\n input,\n policy: options.policy,\n theme: options.theme,\n colorMode: resolveColorMode(container),\n dir: options.dir,\n labels: options.labels\n }, \"*\");\n };\n const onMessage = (event) => {\n if (disposed || event.source !== iframe.contentWindow)\n return;\n const data = event.data;\n if (!data || data.channel !== \"slexkit-secure\")\n return;\n if (data.type === \"ready\") {\n ready = true;\n postMount();\n return;\n }\n if (data.type === \"mounted\" && data.id === id && data.token === token) {\n mountAcknowledged = true;\n lastHeartbeat = Date.now();\n clearLoadTimer();\n clearSecureFrameError(container);\n startHeartbeatWatchdog();\n syncArtifactSlotsNow();\n return;\n }\n if (data.type === \"heartbeat\" && data.id === id && data.token === token) {\n lastHeartbeat = Date.now();\n return;\n }\n if (data.type === \"slot-size\" && data.id === id && data.token === token && typeof data.slotId === \"string\") {\n const slot = artifactSlots.find((item) => item.id === data.slotId);\n if (slot && typeof data.height === \"number\" && Number.isFinite(data.height)) {\n const height = Math.max(0, Math.ceil(data.height));\n slot.container.style.minHeight = `${height}px`;\n if (artifactSlots.length === 1) {\n iframe.style.height = `${Math.max(1, height)}px`;\n }\n requestArtifactSlotSync();\n }\n return;\n }\n if (data.type === \"frame-size\" && data.id === id && data.token === token) {\n if (artifactSlots.length <= 1 && typeof data.height === \"number\" && Number.isFinite(data.height)) {\n iframe.style.height = `${Math.max(1, Math.ceil(data.height))}px`;\n }\n return;\n }\n if (data.type === \"error\" && (!data.id || data.id === id) && (!data.token || data.token === token)) {\n const error = data;\n failLoad(ready ? \"mounted\" : \"ready\", typeof error.error?.message === \"string\" ? error.error.message : undefined);\n return;\n }\n if (data.type !== \"fetch\" || data.id !== id || data.token !== token || typeof data.requestId !== \"string\")\n return;\n const request = validateSandboxFetchRequest(data.request);\n if (!request)\n return;\n bridgeRuntime.api.fetch(request.url, request).then((result) => {\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"fetch-result\",\n id,\n token,\n requestId: data.requestId,\n result\n }, \"*\");\n }).catch((error) => {\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"fetch-result\",\n id,\n token,\n requestId: data.requestId,\n error: serializeRuntimeError(error)\n }, \"*\");\n });\n };\n window.addEventListener(\"message\", onMessage);\n const terminateFrame = ({ keepDiagnostic = false } = {}) => {\n if (disposed)\n return;\n disposed = true;\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"dispose\",\n id,\n token\n }, \"*\");\n clearLoadTimer();\n clearHeartbeatTimer();\n clearSlotSyncTimer();\n slotResizeObserver?.disconnect();\n if (artifactSlots.length) {\n ownerWindow.removeEventListener(\"resize\", requestArtifactSlotSync);\n ownerWindow.removeEventListener(\"scroll\", requestArtifactSlotSync, true);\n }\n for (const slot of artifactSlots) {\n const snapshot = slotStyleSnapshots.get(slot.container);\n if (snapshot) {\n if (snapshot.secureSlotId === undefined)\n delete slot.container.dataset.slexkitSecureArtifactSlotId;\n else\n slot.container.dataset.slexkitSecureArtifactSlotId = snapshot.secureSlotId;\n slot.container.style.minHeight = snapshot.minHeight;\n } else {\n delete slot.container.dataset.slexkitSecureArtifactSlotId;\n slot.container.style.removeProperty(\"min-height\");\n }\n }\n if (adjustedAnchorPosition)\n container.style.position = slotStyleSnapshots.get(container)?.position ?? \"\";\n window.removeEventListener(\"message\", onMessage);\n bridgeRuntime.dispose();\n iframe.remove();\n if (!keepDiagnostic)\n clearSecureFrameError(container);\n if (!container.hasChildNodes())\n container.replaceChildren();\n };\n return {\n sandboxed: true,\n dispose: () => terminateFrame()\n };\n}\nfunction normalizeArtifactSlots(slots) {\n if (!slots?.length)\n return [];\n const seen = new Set;\n const normalized = [];\n for (const slot of slots) {\n const id = String(slot.id || \"\").trim();\n if (!id || seen.has(id) || !slot.container)\n continue;\n seen.add(id);\n normalized.push({ id, container: slot.container });\n }\n return normalized;\n}\nfunction randomToken(bytes) {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.getRandomValues) {\n const values = new Uint8Array(bytes);\n cryptoApi.getRandomValues(values);\n return Array.from(values, (value) => value.toString(16).padStart(2, \"0\")).join(\"\");\n }\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;\n}\nfunction validateSandboxFetchRequest(value) {\n if (!value || typeof value !== \"object\")\n return null;\n const request = value;\n if (typeof request.url !== \"string\")\n return null;\n if (request.method !== \"GET\" && request.method !== \"POST\")\n return null;\n if (request.credentials !== \"omit\" && request.credentials !== \"same-origin\" && request.credentials !== \"include\")\n return null;\n if (typeof request.timeoutMs !== \"number\" || !Number.isFinite(request.timeoutMs) || request.timeoutMs <= 0)\n return null;\n if (request.headers !== undefined && !isStringRecord(request.headers))\n return null;\n return {\n url: request.url,\n method: request.method,\n headers: request.headers,\n body: request.body,\n credentials: request.credentials,\n timeoutMs: request.timeoutMs\n };\n}\nfunction isStringRecord(value) {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return false;\n return Object.values(value).every((item) => typeof item === \"string\");\n}\nfunction ingest(input) {\n const expression = parseSourceOrExpression(input);\n if (!expression)\n return false;\n applyExpression(expression);\n return true;\n}\nfunction copyText(text) {\n if (navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(text);\n return;\n }\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n}\nfunction mountBootPreview(source, host, options) {\n host.replaceChildren();\n const preview = document.createElement(\"div\");\n preview.className = \"slexkit-preview\";\n host.appendChild(preview);\n return mount(source, preview, options);\n}\nfunction addSourceControls(pre, host, remount) {\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"slexkit-source-toolbar\";\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"slexkit-source-button\";\n copyButton.textContent = \"Copy source\";\n copyButton.addEventListener(\"click\", () => copyText(pre.textContent || \"\"));\n const viewButton = document.createElement(\"button\");\n viewButton.type = \"button\";\n viewButton.className = \"slexkit-source-button\";\n viewButton.textContent = \"Hide source\";\n viewButton.addEventListener(\"click\", () => {\n pre.hidden = !pre.hidden;\n viewButton.textContent = pre.hidden ? \"View source\" : \"Hide source\";\n });\n const renderButton = document.createElement(\"button\");\n renderButton.type = \"button\";\n renderButton.className = \"slexkit-source-button\";\n renderButton.textContent = \"Re-render\";\n renderButton.addEventListener(\"click\", remount);\n toolbar.append(copyButton, viewButton, renderButton);\n host.parentNode?.insertBefore(toolbar, host);\n}\nfunction boot(options = {}) {\n const selector = options.selector || \"pre code.language-slex\";\n document.querySelectorAll(selector).forEach((el) => {\n if (el.dataset.slexkitBooted === \"true\")\n return;\n el.dataset.slexkitBooted = \"true\";\n const source = el.textContent || \"\";\n const pre = el.closest(\"pre\");\n const host = document.createElement(\"div\");\n host.className = \"slexkit-card\";\n if (pre)\n pre.parentNode.insertBefore(host, pre.nextSibling);\n else\n el.parentNode.insertBefore(host, el.nextSibling);\n let cleanup = mountBootPreview(source, host, { theme: options.theme, dir: options.dir, labels: options.labels });\n const remount = () => {\n cleanup();\n cleanup = mountBootPreview(el.textContent || \"\", host, { theme: options.theme, dir: options.dir, labels: options.labels });\n };\n if (pre && options.sourceControls !== false) {\n addSourceControls(pre, host, remount);\n }\n });\n}\n\n// src/engine/sandbox-runner.ts\nvar schedulingSnapshot = {\n setTimeout: typeof globalThis.setTimeout === \"function\" ? globalThis.setTimeout.bind(globalThis) : undefined,\n clearTimeout: typeof globalThis.clearTimeout === \"function\" ? globalThis.clearTimeout.bind(globalThis) : undefined,\n setInterval: typeof globalThis.setInterval === \"function\" ? globalThis.setInterval.bind(globalThis) : undefined,\n clearInterval: typeof globalThis.clearInterval === \"function\" ? globalThis.clearInterval.bind(globalThis) : undefined,\n requestAnimationFrame: typeof globalThis.requestAnimationFrame === \"function\" ? globalThis.requestAnimationFrame.bind(globalThis) : undefined,\n cancelAnimationFrame: typeof globalThis.cancelAnimationFrame === \"function\" ? globalThis.cancelAnimationFrame.bind(globalThis) : undefined\n};\nfunction isHostMessage(value) {\n return !!value && typeof value === \"object\" && value.channel === \"slexkit-secure\" && typeof value.type === \"string\";\n}\nfunction frameRoot() {\n let root = document.getElementById(\"slexkit-secure-root\");\n if (!root) {\n root = document.createElement(\"div\");\n root.id = \"slexkit-secure-root\";\n document.body.appendChild(root);\n }\n return root;\n}\nfunction applyColorMode(mode) {\n if (mode !== \"dark\" && mode !== \"light\")\n return;\n document.documentElement.classList.toggle(\"dark\", mode === \"dark\");\n document.documentElement.classList.toggle(\"light\", mode === \"light\");\n document.documentElement.dataset.theme = mode;\n}\nfunction post(message) {\n window.parent?.postMessage(message, \"*\");\n}\nfunction createBridgeAdapter(id, token, pending) {\n let nextRequest = 1;\n return {\n fetch(request) {\n const requestId = `${Date.now()}_${nextRequest++}`;\n post({\n channel: \"slexkit-secure\",\n type: \"fetch\",\n id,\n token,\n requestId,\n request\n });\n return new Promise((resolve, reject) => {\n pending.set(requestId, { resolve, reject });\n });\n },\n setTimeout(fn, ms) {\n if (!schedulingSnapshot.setTimeout) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_unavailable\", \"Native timer host is unavailable.\");\n }\n return schedulingSnapshot.setTimeout(fn, ms);\n },\n clearTimeout(id2) {\n schedulingSnapshot.clearTimeout?.(id2);\n },\n setInterval(fn, ms) {\n if (!schedulingSnapshot.setInterval) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_unavailable\", \"Native interval host is unavailable.\");\n }\n return schedulingSnapshot.setInterval(fn, ms);\n },\n clearInterval(id2) {\n schedulingSnapshot.clearInterval?.(id2);\n },\n requestAnimationFrame(fn) {\n if (!schedulingSnapshot.requestAnimationFrame) {\n throw new SlexKitRuntimeError(\"policy\", \"animation_unavailable\", \"Native animation frame host is unavailable.\");\n }\n return schedulingSnapshot.requestAnimationFrame(fn);\n },\n cancelAnimationFrame(id2) {\n schedulingSnapshot.cancelAnimationFrame?.(id2);\n }\n };\n}\nfunction blockedNetworkError() {\n return new Error(\"Native network APIs are disabled inside the SlexKit sandbox. Use api.get(), api.post(), or api.fetch().\");\n}\nfunction defineBlockedGlobal(name, value) {\n try {\n Object.defineProperty(globalThis, name, {\n configurable: true,\n value\n });\n } catch {}\n}\nfunction hardenNetworkGlobals() {\n defineBlockedGlobal(\"fetch\", () => Promise.reject(blockedNetworkError()));\n defineBlockedGlobal(\"XMLHttpRequest\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"WebSocket\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"EventSource\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"Worker\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"SharedWorker\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n try {\n Object.defineProperty(navigator, \"sendBeacon\", {\n configurable: true,\n value: () => false\n });\n } catch {}\n}\nfunction blockedSchedulingError(name) {\n return new SlexKitRuntimeError(\"policy\", \"native_scheduling_disabled\", `Native ${name} is disabled inside the SlexKit sandbox. Use api.${name}().`);\n}\nfunction hardenSchedulingGlobals() {\n defineBlockedGlobal(\"setTimeout\", () => {\n throw blockedSchedulingError(\"setTimeout\");\n });\n defineBlockedGlobal(\"setInterval\", () => {\n throw blockedSchedulingError(\"setInterval\");\n });\n defineBlockedGlobal(\"requestAnimationFrame\", () => {\n throw blockedSchedulingError(\"raf\");\n });\n defineBlockedGlobal(\"clearTimeout\", () => {\n return;\n });\n defineBlockedGlobal(\"clearInterval\", () => {\n return;\n });\n defineBlockedGlobal(\"cancelAnimationFrame\", () => {\n return;\n });\n}\nvar canvasSnapshot = {\n getContext: typeof HTMLCanvasElement !== \"undefined\" ? HTMLCanvasElement.prototype.getContext : undefined,\n offscreenCanvas: typeof OffscreenCanvas !== \"undefined\" ? OffscreenCanvas : undefined\n};\nfunction canvasPolicyError(code, message) {\n return new SlexKitRuntimeError(\"policy\", code, message);\n}\nfunction assertSandboxCanvasPolicy(policy, width, height, contextId) {\n if (!policy.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw canvasPolicyError(\"canvas_size_invalid\", \"Canvas size must be positive finite numbers.\");\n }\n const pixels = Math.ceil(width) * Math.ceil(height);\n if (policy.maxPixels !== undefined && pixels > policy.maxPixels) {\n throw canvasPolicyError(\"canvas_too_large\", \"Canvas size exceeds the runtime policy limit.\");\n }\n if (contextId && policy.allowedContexts?.length && !policy.allowedContexts.includes(contextId)) {\n throw canvasPolicyError(\"canvas_context_blocked\", `Canvas context ${contextId} is not allowed.`);\n }\n}\nfunction hardenCanvasGlobals(policy) {\n if (typeof HTMLCanvasElement !== \"undefined\" && canvasSnapshot.getContext) {\n const contextCanvases = new WeakSet;\n let contextCanvasCount = 0;\n const canvasPolicy2 = policy.canvas;\n HTMLCanvasElement.prototype.getContext = function getContext(contextId, options) {\n if (!canvasPolicy2?.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n assertSandboxCanvasPolicy(canvasPolicy2, this.width, this.height, contextId);\n if (!contextCanvases.has(this)) {\n if (canvasPolicy2.maxCanvases !== undefined && contextCanvasCount >= canvasPolicy2.maxCanvases) {\n throw canvasPolicyError(\"canvas_limit\", \"Canvas limit exceeded.\");\n }\n contextCanvases.add(this);\n contextCanvasCount += 1;\n }\n return canvasSnapshot.getContext.call(this, contextId, options);\n };\n }\n if (canvasSnapshot.offscreenCanvas) {\n const OriginalOffscreenCanvas = canvasSnapshot.offscreenCanvas;\n defineBlockedGlobal(\"OffscreenCanvas\", class extends OriginalOffscreenCanvas {\n constructor(width, height) {\n const canvasPolicy2 = policy.canvas;\n if (!canvasPolicy2?.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n assertSandboxCanvasPolicy(canvasPolicy2, width, height);\n super(width, height);\n }\n });\n }\n}\nfunction startSlexKitSandboxRunner() {\n hardenNetworkGlobals();\n hardenSchedulingGlobals();\n const pendingFetches = new Map;\n let cleanup;\n let runtimeDispose;\n let activeId;\n let activeToken;\n let heartbeatTimer;\n let rootResizeObserver;\n let slotResizeObserver;\n function clearHeartbeat() {\n if (heartbeatTimer === undefined)\n return;\n schedulingSnapshot.clearInterval?.(heartbeatTimer);\n heartbeatTimer = undefined;\n }\n function startHeartbeat(policy, id, token) {\n clearHeartbeat();\n const intervalMs = Math.max(100, policy.execution?.heartbeatIntervalMs ?? 1000);\n if (!schedulingSnapshot.setInterval)\n return;\n heartbeatTimer = schedulingSnapshot.setInterval(() => {\n post({\n channel: \"slexkit-secure\",\n type: \"heartbeat\",\n id,\n token\n });\n }, intervalMs);\n }\n function dispose(id) {\n if (id && activeId && id !== activeId)\n return;\n clearHeartbeat();\n rootResizeObserver?.disconnect();\n rootResizeObserver = undefined;\n slotResizeObserver?.disconnect();\n slotResizeObserver = undefined;\n cleanup?.();\n runtimeDispose?.();\n for (const pending of pendingFetches.values()) {\n pending.reject(new Error(\"SlexKit sandbox runtime was disposed.\"));\n }\n pendingFetches.clear();\n cleanup = undefined;\n runtimeDispose = undefined;\n activeId = undefined;\n activeToken = undefined;\n const root = frameRoot();\n root.style.removeProperty(\"position\");\n root.style.removeProperty(\"min-height\");\n root.replaceChildren();\n }\n function slotElement(slotId) {\n return document.getElementById(`slexkit-slot-${slotId}`);\n }\n function reportSlotSize(slotId, element) {\n if (!activeId || !activeToken)\n return;\n const height = Math.max(element.scrollHeight, element.getBoundingClientRect().height);\n post({\n channel: \"slexkit-secure\",\n type: \"slot-size\",\n id: activeId,\n token: activeToken,\n slotId,\n height\n });\n }\n function reportFrameSize() {\n if (!activeId || !activeToken)\n return;\n const root = frameRoot();\n const rootRect = root.getBoundingClientRect();\n let contentBottom = rootRect.height;\n for (const child of root.querySelectorAll(\"*\")) {\n const rect = child.getBoundingClientRect();\n contentBottom = Math.max(contentBottom, rect.bottom - rootRect.top);\n }\n const height = Math.max(root.scrollHeight, root.getBoundingClientRect().height, contentBottom, document.body?.scrollHeight ?? 0, document.documentElement?.scrollHeight ?? 0, 1);\n post({\n channel: \"slexkit-secure\",\n type: \"frame-size\",\n id: activeId,\n token: activeToken,\n height\n });\n }\n function observeFrameSize() {\n rootResizeObserver?.disconnect();\n rootResizeObserver = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(() => reportFrameSize()) : undefined;\n const root = frameRoot();\n rootResizeObserver?.observe(root);\n for (const child of root.children) {\n rootResizeObserver?.observe(child);\n }\n reportFrameSize();\n schedulingSnapshot.requestAnimationFrame?.(() => reportFrameSize());\n }\n function applySlotRects(slots) {\n const root = frameRoot();\n const multiSlot = slots.length > 1;\n if (multiSlot) {\n const maxBottom = Math.max(1, ...slots.map((slot) => slot.top + slot.height));\n root.style.position = \"relative\";\n root.style.minHeight = `${Math.ceil(maxBottom)}px`;\n } else {\n root.style.removeProperty(\"position\");\n root.style.removeProperty(\"min-height\");\n }\n slotResizeObserver?.disconnect();\n slotResizeObserver = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n const slotId = element.dataset.slexkitSlotId;\n if (slotId)\n reportSlotSize(slotId, element);\n }\n }) : undefined;\n for (const slot of slots) {\n const element = slotElement(slot.id);\n if (!element)\n continue;\n element.dataset.slexkitSlotId = slot.id;\n element.style.boxSizing = \"border-box\";\n if (multiSlot) {\n element.style.position = \"absolute\";\n element.style.left = `${slot.left}px`;\n element.style.top = `${slot.top}px`;\n } else {\n element.style.removeProperty(\"position\");\n element.style.removeProperty(\"left\");\n element.style.removeProperty(\"top\");\n }\n if (slot.width > 0)\n element.style.width = `${slot.width}px`;\n slotResizeObserver?.observe(element);\n reportSlotSize(slot.id, element);\n }\n }\n async function mountArtifact(message) {\n dispose();\n activeId = message.id;\n activeToken = message.token;\n hardenCanvasGlobals(message.policy);\n applyColorMode(message.colorMode);\n const runtime = createSecureRuntime(message.policy, createBridgeAdapter(message.id, message.token, pendingFetches));\n runtimeDispose = runtime.dispose;\n cleanup = mount(message.input, frameRoot(), {\n theme: message.theme,\n dir: message.dir,\n labels: message.labels,\n api: runtime.api\n });\n startHeartbeat(message.policy, message.id, message.token);\n observeFrameSize();\n post({\n channel: \"slexkit-secure\",\n type: \"mounted\",\n id: message.id,\n token: message.token\n });\n }\n window.addEventListener(\"message\", (event) => {\n if (event.source !== window.parent || !isHostMessage(event.data))\n return;\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n mountArtifact(message).catch((error) => {\n post({\n channel: \"slexkit-secure\",\n type: \"error\",\n id: message.id,\n token: message.token,\n error: serializeRuntimeError(error)\n });\n });\n } else if (message.type === \"dispose\") {\n if (activeToken && message.token !== activeToken)\n return;\n dispose(message.id);\n post({\n channel: \"slexkit-secure\",\n type: \"disposed\",\n id: message.id,\n token: message.token\n });\n } else if (message.type === \"fetch-result\") {\n const response = message;\n if (activeToken && response.token !== activeToken)\n return;\n const pending = pendingFetches.get(response.requestId);\n if (!pending)\n return;\n pendingFetches.delete(response.requestId);\n if (response.error)\n pending.reject(deserializeRuntimeError(response.error));\n else\n pending.resolve(response.result);\n } else if (message.type === \"slots\") {\n if (activeToken && message.token !== activeToken)\n return;\n applySlotRects(message.slots);\n }\n } catch (error) {\n post({\n channel: \"slexkit-secure\",\n type: \"error\",\n id: \"id\" in message ? message.id : undefined,\n token: activeToken,\n error: serializeRuntimeError(error)\n });\n }\n });\n post({\n channel: \"slexkit-secure\",\n type: \"ready\"\n });\n}\n\n// src/runtime.ts\nsetSlexKitRuntimeUrl(import.meta.url);\nvar mountApi = mount;\nvar ingestApi = ingest;\nvar bootApi = boot;\nvar disposeNamespaceApi = disposeNamespace;\nvar registerApi = register;\nvar getRendererApi = getRenderer;\nvar diagnoseSlexKitSourceApi = diagnoseSlexKitSource;\nvar SlexKitSyntaxErrorApi = SlexKitSyntaxError;\nvar formatSlexKitDiagnosticApi = formatSlexKitDiagnostic;\nvar mountSecureArtifactApi = mountSecureArtifact;\nvar parseSlexSourceApi = parseSlexSource;\nvar parseSlexKitDslApi = parseSlexKitDsl;\nvar validateSlexSourceApi = validateSlexSource;\nvar createSecureRuntimeApi = createSecureRuntime;\nvar SlexKitRuntimeErrorApi = SlexKitRuntimeError;\nvar getSlexKitRuntimeUrlApi = getSlexKitRuntimeUrl;\nvar setSlexKitRuntimeUrlApi = setSlexKitRuntimeUrl;\nvar createSlexKitMarkdownRuntimeHostApi = createSlexKitMarkdownRuntimeHost;\nvar getSlexKitMarkdownRuntimeHostApi = getSlexKitMarkdownRuntimeHost;\nvar installSlexKitMarkdownRuntimeHostApi = installSlexKitMarkdownRuntimeHost;\nvar slexkitStdApi = slexkitStd;\nvar attachComponentDisposerApi = attachComponentDisposer;\nvar configureComponentScopeApi = configureComponentScope;\nvar startSlexKitSandboxRunnerApi = startSlexKitSandboxRunner;\nvar getSlexKitInfoApi = getSlexKitInfo;\nexport {\n validateSlexSourceApi as validateSlexSource,\n startSlexKitSandboxRunnerApi as startSlexKitSandboxRunner,\n slexkitStdApi as slexkitStd,\n setSlexKitRuntimeUrlApi as setSlexKitRuntimeUrl,\n registerApi as register,\n parseSlexSourceApi as parseSlexSource,\n parseSlexKitDslApi as parseSlexKitDsl,\n mountSecureArtifactApi as mountSecureArtifact,\n mountApi as mount,\n installSlexKitMarkdownRuntimeHostApi as installSlexKitMarkdownRuntimeHost,\n ingestApi as ingest,\n getSlexKitRuntimeUrlApi as getSlexKitRuntimeUrl,\n getSlexKitMarkdownRuntimeHostApi as getSlexKitMarkdownRuntimeHost,\n getSlexKitInfoApi as getSlexKitInfo,\n getRendererApi as getRenderer,\n formatSlexKitDiagnosticApi as formatSlexKitDiagnostic,\n disposeNamespaceApi as disposeNamespace,\n diagnoseSlexKitSourceApi as diagnoseSlexKitSource,\n createSlexKitMarkdownRuntimeHostApi as createSlexKitMarkdownRuntimeHost,\n createSecureRuntimeApi as createSecureRuntime,\n configureComponentScopeApi as configureComponentScope,\n bootApi as boot,\n attachComponentDisposerApi as attachComponentDisposer,\n SlexKitSyntaxErrorApi as SlexKitSyntaxError,\n SlexKitRuntimeErrorApi as SlexKitRuntimeError,\n SLEX_PROTOCOL_VERSION,\n SLEXKIT_VERSION,\n SLEXKIT_COMPONENTS_VERSION\n};\n"
6
+ "// src/engine/reactive.ts\nvar ITERATE_KEY = Symbol(\"iterate\");\nvar REVISION_KEY = Symbol(\"revision\");\nvar activeEffect = null;\nvar activeScope = null;\nvar batchDepth = 0;\nvar pendingEffects = new Set;\nvar targetDeps = new WeakMap;\nvar proxyCache = new WeakMap;\nvar rawTargets = new WeakMap;\nvar rootTargets = new WeakMap;\n\nclass ReactiveScope {\n cleanups = [];\n effects = new Set;\n disposed = false;\n dispose() {\n if (this.disposed)\n return;\n this.disposed = true;\n for (const effect of Array.from(this.effects))\n effect.stop();\n this.effects.clear();\n for (let i = this.cleanups.length - 1;i >= 0; i -= 1) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n }\n}\n\nclass ReactiveEffect {\n fn;\n scope;\n deps = [];\n cleanups = [];\n stopped = false;\n running = false;\n constructor(fn, scope) {\n this.fn = fn;\n this.scope = scope;\n if (scope)\n scope.effects.add(this);\n }\n run() {\n if (this.stopped || this.running)\n return;\n this.running = true;\n this.cleanupDeps();\n this.runCleanups();\n const previousEffect = activeEffect;\n const previousScope = activeScope;\n activeEffect = this;\n if (this.scope)\n activeScope = this.scope;\n try {\n this.fn();\n } finally {\n activeEffect = previousEffect;\n activeScope = previousScope;\n this.running = false;\n }\n }\n stop() {\n if (this.stopped)\n return;\n this.stopped = true;\n this.cleanupDeps();\n this.runCleanups();\n this.scope?.effects.delete(this);\n }\n cleanupDeps() {\n for (const dep of this.deps)\n dep.delete(this);\n this.deps.length = 0;\n }\n runCleanups() {\n for (let i = this.cleanups.length - 1;i >= 0; i -= 1) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n }\n}\nfunction getDep(target, key) {\n let deps = targetDeps.get(target);\n if (!deps) {\n deps = new Map;\n targetDeps.set(target, deps);\n }\n let dep = deps.get(key);\n if (!dep) {\n dep = new Set;\n deps.set(key, dep);\n }\n return dep;\n}\nfunction track(target, key) {\n if (!activeEffect)\n return;\n const dep = getDep(target, key);\n if (dep.has(activeEffect))\n return;\n dep.add(activeEffect);\n activeEffect.deps.push(dep);\n}\nfunction trigger(target, key) {\n const deps = targetDeps.get(target);\n if (!deps)\n return;\n const effects = new Set;\n const add = (dep) => {\n if (!dep)\n return;\n for (const effect of dep)\n effects.add(effect);\n };\n add(deps.get(key));\n if (key !== REVISION_KEY)\n add(deps.get(ITERATE_KEY));\n for (const effect of effects)\n schedule(effect);\n}\nfunction schedule(effect) {\n if (effect.stopped)\n return;\n if (batchDepth > 0) {\n pendingEffects.add(effect);\n return;\n }\n effect.run();\n}\nfunction flush() {\n while (pendingEffects.size > 0) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects)\n effect.run();\n }\n}\nfunction notifyRoot(target) {\n const root = rootTargets.get(target) ?? target;\n trigger(root, REVISION_KEY);\n}\nfunction toReactive(value, root) {\n const cached = proxyCache.get(value);\n if (cached)\n return cached;\n const proxy = new Proxy(value, {\n get(target, key, receiver) {\n if (key === \"__slexkitRaw\")\n return target;\n if (key === \"__slexkitRoot\")\n return root;\n track(target, key);\n const result = Reflect.get(target, key, receiver);\n if (result && typeof result === \"object\") {\n return toReactive(result, root);\n }\n return result;\n },\n set(target, key, next, receiver) {\n const previous = Reflect.get(target, key, receiver);\n const hadKey = Object.prototype.hasOwnProperty.call(target, key);\n const ok = Reflect.set(target, key, next, receiver);\n if (ok && (!Object.is(previous, next) || !hadKey)) {\n trigger(target, key);\n if (!hadKey)\n trigger(target, ITERATE_KEY);\n notifyRoot(target);\n }\n return ok;\n },\n deleteProperty(target, key) {\n const hadKey = Object.prototype.hasOwnProperty.call(target, key);\n const ok = Reflect.deleteProperty(target, key);\n if (ok && hadKey) {\n trigger(target, key);\n trigger(target, ITERATE_KEY);\n notifyRoot(target);\n }\n return ok;\n },\n ownKeys(target) {\n track(target, ITERATE_KEY);\n return Reflect.ownKeys(target);\n }\n });\n proxyCache.set(value, proxy);\n rawTargets.set(proxy, value);\n rootTargets.set(value, root);\n rootTargets.set(proxy, root);\n return proxy;\n}\nfunction createReactiveState(value) {\n return toReactive(value, value);\n}\nfunction asReactiveValue(value, owner) {\n if (!value || typeof value !== \"object\")\n return value;\n if (rawTargets.has(value) || rootTargets.has(value))\n return value;\n if (!owner || typeof owner !== \"object\")\n return value;\n const root = rootTargets.get(owner) ?? rawTargets.get(owner);\n if (!root)\n return value;\n return toReactive(value, root);\n}\nfunction trackReactiveValue(value) {\n if (!value || typeof value !== \"object\")\n return;\n const root = rootTargets.get(value) ?? rawTargets.get(value);\n if (root)\n track(root, REVISION_KEY);\n}\nfunction createRoot(fn) {\n const scope = new ReactiveScope;\n const previousScope = activeScope;\n const previousEffect = activeEffect;\n activeScope = scope;\n activeEffect = null;\n try {\n return fn(() => scope.dispose());\n } finally {\n activeEffect = previousEffect;\n activeScope = previousScope;\n }\n}\nfunction createEffect(fn) {\n const effect = new ReactiveEffect(fn, activeScope);\n effect.run();\n return () => effect.stop();\n}\nfunction createMemo(fn) {\n const source = {};\n let value;\n createEffect(() => {\n value = fn();\n trigger(source, \"value\");\n });\n return () => {\n track(source, \"value\");\n return value;\n };\n}\nfunction createSignal(initial) {\n const source = {};\n let value = initial;\n return [\n () => {\n track(source, \"value\");\n return value;\n },\n (next) => {\n if (Object.is(value, next))\n return;\n value = next;\n trigger(source, \"value\");\n }\n ];\n}\nfunction onCleanup(cleanup) {\n if (activeEffect) {\n activeEffect.cleanups.push(cleanup);\n return;\n }\n if (activeScope) {\n activeScope.cleanups.push(cleanup);\n }\n}\nfunction batch(fn) {\n batchDepth += 1;\n try {\n return fn();\n } finally {\n batchDepth -= 1;\n if (batchDepth === 0)\n flush();\n }\n}\n\n// src/engine/store.ts\nvar _stores = new Map;\nfunction getStore(ns) {\n if (!_stores.has(ns)) {\n _stores.set(ns, {\n g: createReactiveState({}),\n components: createReactiveState({}),\n componentTypes: createReactiveState({}),\n layouts: [],\n roots: new Map,\n cleanups: new Map\n });\n }\n return _stores.get(ns);\n}\nfunction peekStore(ns) {\n return _stores.get(ns);\n}\nfunction deleteStore(ns) {\n return _stores.delete(ns);\n}\n\n// src/engine/merge.ts\nfunction deepMerge(target, source) {\n for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key))\n continue;\n const srcVal = source[key];\n if (typeof srcVal === \"function\") {\n target[key] = srcVal;\n } else if (srcVal !== null && typeof srcVal === \"object\" && !Array.isArray(srcVal)) {\n if (!(key in target) || typeof target[key] !== \"object\") {\n target[key] = {};\n }\n deepMerge(target[key], srcVal);\n } else {\n target[key] = srcVal;\n }\n }\n return target;\n}\n\n// src/engine/registry.ts\nvar _registry = new Map;\nfunction register(type, renderFn, options = {}) {\n _registry.set(type, {\n renderFn,\n options: {\n state: options.state ?? \"none\"\n }\n });\n}\nfunction getRenderer(type) {\n return _registry.get(type)?.renderFn;\n}\nfunction getComponentStateMode(type) {\n return _registry.get(type)?.options.state ?? \"none\";\n}\n\n// src/engine/eval.ts\nvar lastValues = new Map;\nvar SKIP_EAGER_TRACK = Symbol.for(\"slexkit.skipEagerTrack\");\nvar EAGER_TRACK_TARGET = Symbol.for(\"slexkit.eagerTrackTarget\");\nfunction clearEvalCache(ns) {\n const prefix = `${ns}:`;\n for (const key of Array.from(lastValues.keys())) {\n if (key.startsWith(prefix))\n lastValues.delete(key);\n }\n}\nfunction evalRead(expr, context, ns, path) {\n try {\n for (const value of Object.values(context)) {\n if (value && (typeof value === \"object\" || typeof value === \"function\") && value[SKIP_EAGER_TRACK]) {\n continue;\n }\n const target = value && (typeof value === \"object\" || typeof value === \"function\") ? value[EAGER_TRACK_TARGET] ?? value : value;\n trackReactiveValue(target);\n }\n const revision = context.$revision;\n if (typeof revision === \"function\")\n revision();\n const keys = Object.keys(context);\n const vals = Object.values(context);\n const fn = new Function(...keys, `\"use strict\"; return (${expr});`);\n const result = fn(...vals);\n if (path !== undefined)\n lastValues.set(`${ns ?? \"?\"}:${path}:${expr}`, result);\n return result;\n } catch (e) {\n const cacheKey = path !== undefined ? `${ns ?? \"?\"}:${path}:${expr}` : expr;\n const last = lastValues.get(cacheKey);\n console.warn(`[SlexKit][${ns || \"?\"}] $eval error at ${path || \"?\"}:`, expr, e.message);\n if (last !== undefined)\n return last;\n return;\n }\n}\nfunction execWrite(stmt, context, ns, path) {\n try {\n const keys = Object.keys(context);\n const vals = Object.values(context);\n const fn = new Function(...keys, `\"use strict\"; { ${stmt} }`);\n batch(() => fn(...vals));\n } catch (e) {\n console.warn(`[SlexKit][${ns || \"?\"}] @exec error at ${path || \"?\"}:`, stmt, e.message);\n }\n}\n\n// src/engine/component-scope.ts\nvar componentDisposers = new WeakMap;\nvar flushDom;\nfunction configureComponentScope(options) {\n flushDom = options.flush;\n}\nfunction createComponentAccessor(read) {\n const subscribers = new Set;\n let current = read();\n let stopEffect;\n const start = () => {\n if (stopEffect)\n return;\n stopEffect = createEffect(() => {\n current = read();\n for (const subscriber of Array.from(subscribers))\n subscriber(current);\n flushDom?.();\n });\n };\n const accessor = () => current;\n accessor.subscribe = (run) => {\n const wasIdle = subscribers.size === 0;\n subscribers.add(run);\n if (wasIdle)\n start();\n else\n run(current);\n return () => {\n subscribers.delete(run);\n if (subscribers.size === 0) {\n stopEffect?.();\n stopEffect = undefined;\n }\n };\n };\n return accessor;\n}\nfunction renderComponent(render) {\n return render() ?? null;\n}\nfunction attachComponentDisposer(el, dispose) {\n componentDisposers.set(el, dispose);\n}\nfunction disposeComponent(el) {\n const dispose = componentDisposers.get(el);\n if (!dispose)\n return;\n componentDisposers.delete(el);\n dispose();\n}\n\n// src/engine/engineering.ts\nvar NUMBER_RE = /^[+-]?(?:(?:\\d+(?:\\.\\d*)?)|(?:\\.\\d+))(?:[eE][+-]?\\d+)?/;\nvar PREFIX_FACTORS = {\n p: 0.000000000001,\n n: 0.000000001,\n u: 0.000001,\n \"µ\": 0.000001,\n m: 0.001,\n k: 1000,\n K: 1000,\n M: 1e6,\n meg: 1e6,\n G: 1e9,\n T: 1000000000000\n};\nvar PREFIXES = [\"meg\", \"p\", \"n\", \"u\", \"µ\", \"m\", \"k\", \"K\", \"M\", \"G\", \"T\"];\nfunction invalid(raw, error) {\n return {\n raw,\n number: null,\n valid: false,\n prefix: \"\",\n unit: \"\",\n normalized: \"\",\n error\n };\n}\nfunction parseSuffix(suffix) {\n const compact = suffix.trim();\n if (!compact)\n return { prefix: \"\", unit: \"\" };\n for (const prefix of PREFIXES) {\n if (prefix === \"meg\") {\n if (compact.toLowerCase().startsWith(\"meg\")) {\n return { prefix: \"meg\", unit: compact.slice(3).trim() };\n }\n continue;\n }\n if (compact.startsWith(prefix)) {\n return { prefix, unit: compact.slice(prefix.length).trim() };\n }\n }\n return { prefix: \"\", unit: compact };\n}\nfunction parseEngineeringNumber(input) {\n const raw = input == null ? \"\" : String(input);\n const source = raw.trim();\n if (!source) {\n return {\n raw,\n number: null,\n valid: false,\n prefix: \"\",\n unit: \"\",\n normalized: \"\",\n error: \"empty\"\n };\n }\n const numberMatch = source.match(NUMBER_RE);\n if (!numberMatch)\n return invalid(raw, \"invalid_number\");\n const numberText = numberMatch[0];\n const rest = source.slice(numberText.length).trim();\n const base = Number(numberText);\n if (!Number.isFinite(base))\n return invalid(raw, \"invalid_number\");\n const { prefix, unit } = parseSuffix(rest);\n const multiplier = prefix ? PREFIX_FACTORS[prefix] : 1;\n if (!Number.isFinite(multiplier))\n return invalid(raw, \"invalid_prefix\");\n const number = base * multiplier;\n if (!Number.isFinite(number))\n return invalid(raw, \"out_of_range\");\n return {\n raw,\n number,\n valid: true,\n prefix,\n unit,\n normalized: `${number}${unit ? ` ${unit}` : \"\"}`\n };\n}\nfunction isEngineeringNumberResult(value) {\n return !!value && typeof value === \"object\" && \"raw\" in value && \"number\" in value && \"valid\" in value && \"prefix\" in value && \"unit\" in value && \"normalized\" in value;\n}\n\n// src/engine/stdlib.ts\nfunction toNumber(value) {\n return Number(value);\n}\nfunction finiteNumber(value, fallback = 0) {\n const parsed = toNumber(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\nfunction digits(value, fallback) {\n const parsed = Math.trunc(finiteNumber(value, fallback));\n return Math.max(0, Math.min(20, parsed));\n}\nfunction finiteValues(values) {\n if (!Array.isArray(values))\n return [];\n return values.map(toNumber).filter(Number.isFinite);\n}\nfunction formatFixed(value, digitCount = 2) {\n const parsed = toNumber(value);\n return Number.isFinite(parsed) ? parsed.toFixed(digitCount) : \"NaN\";\n}\nfunction locale(value) {\n return typeof value === \"string\" && value.trim() ? value : \"en-US\";\n}\nfunction currencyCode(value) {\n return typeof value === \"string\" && /^[A-Za-z]{3}$/.test(value) ? value.toUpperCase() : \"USD\";\n}\nfunction formatNumber(value, digitCount, localeName, notation, style, currency, minimumFractionDigits = 0) {\n const parsed = toNumber(value);\n if (!Number.isFinite(parsed))\n return \"NaN\";\n return new Intl.NumberFormat(localeName, {\n maximumFractionDigits: digitCount,\n minimumFractionDigits,\n notation,\n style,\n currency\n }).format(parsed);\n}\nfunction freezeDeep(value) {\n for (const child of Object.values(value)) {\n if (child && typeof child === \"object\")\n freezeDeep(child);\n }\n return Object.freeze(value);\n}\nvar slexkitStd = freezeDeep({\n math: {\n clamp(value, min, max) {\n const lower = finiteNumber(min);\n const upper = finiteNumber(max);\n const parsed = finiteNumber(value);\n return Math.min(Math.max(parsed, Math.min(lower, upper)), Math.max(lower, upper));\n },\n round(value, digitValue = 0) {\n const factor = 10 ** digits(digitValue, 0);\n return Math.round(finiteNumber(value) * factor) / factor;\n },\n safeDivide(numerator, denominator, fallback = 0) {\n const divisor = toNumber(denominator);\n if (!Number.isFinite(divisor) || divisor === 0)\n return finiteNumber(fallback);\n const quotient = toNumber(numerator) / divisor;\n return Number.isFinite(quotient) ? quotient : finiteNumber(fallback);\n },\n percent(part, total, digitValue = 1) {\n const ratio = slexkitStd.math.safeDivide(part, total, NaN) * 100;\n return slexkitStd.math.round(ratio, digitValue);\n },\n lerp(start, end, t) {\n const a = finiteNumber(start);\n return a + (finiteNumber(end) - a) * finiteNumber(t);\n }\n },\n stats: {\n sum(values) {\n return finiteValues(values).reduce((total, value) => total + value, 0);\n },\n mean(values) {\n const numbers = finiteValues(values);\n return numbers.length ? slexkitStd.stats.sum(numbers) / numbers.length : NaN;\n },\n min(values) {\n const numbers = finiteValues(values);\n return numbers.length ? Math.min(...numbers) : NaN;\n },\n max(values) {\n const numbers = finiteValues(values);\n return numbers.length ? Math.max(...numbers) : NaN;\n },\n median(values) {\n const numbers = finiteValues(values).sort((a, b) => a - b);\n if (!numbers.length)\n return NaN;\n const middle = Math.floor(numbers.length / 2);\n return numbers.length % 2 ? numbers[middle] : (numbers[middle - 1] + numbers[middle]) / 2;\n }\n },\n format: {\n fixed(value, digitValue = 2) {\n return formatFixed(value, digits(digitValue, 2));\n },\n number(value, digitValue = 0, localeName = \"en-US\") {\n return formatNumber(value, digits(digitValue, 0), locale(localeName));\n },\n compact(value, digitValue = 1, localeName = \"en-US\") {\n return formatNumber(value, digits(digitValue, 1), locale(localeName), \"compact\");\n },\n percent(ratio, digitValue = 1) {\n return `${formatFixed(finiteNumber(ratio) * 100, digits(digitValue, 1))}%`;\n },\n currency(value, currency = \"USD\", localeName = \"en-US\") {\n return formatNumber(value, 2, locale(localeName), undefined, \"currency\", currencyCode(currency), 2);\n }\n },\n units: {\n withUnit(value, unit, digitValue = 2) {\n const suffix = typeof unit === \"string\" ? unit : String(unit ?? \"\");\n return `${formatFixed(value, digits(digitValue, 2))}${suffix ? ` ${suffix}` : \"\"}`;\n },\n bytes(value, digitValue = 1) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n let amount = Math.abs(finiteNumber(value));\n let index = 0;\n while (amount >= 1024 && index < units.length - 1) {\n amount /= 1024;\n index += 1;\n }\n const sign = finiteNumber(value) < 0 ? -1 : 1;\n return `${formatFixed(amount * sign, digits(digitValue, 1))} ${units[index]}`;\n },\n duration(ms, digitValue = 1) {\n const value = finiteNumber(ms);\n const abs = Math.abs(value);\n if (abs < 1000)\n return `${formatFixed(value, 0)} ms`;\n if (abs < 60000)\n return `${formatFixed(value / 1000, digits(digitValue, 1))} s`;\n if (abs < 3600000)\n return `${formatFixed(value / 60000, digits(digitValue, 1))} min`;\n return `${formatFixed(value / 3600000, digits(digitValue, 1))} h`;\n },\n si(value, unit = \"\", digitValue = 2) {\n const units = [\"\", \"k\", \"M\", \"G\", \"T\", \"P\"];\n let amount = Math.abs(finiteNumber(value));\n let index = 0;\n while (amount >= 1000 && index < units.length - 1) {\n amount /= 1000;\n index += 1;\n }\n const sign = finiteNumber(value) < 0 ? -1 : 1;\n const suffix = typeof unit === \"string\" ? unit : String(unit ?? \"\");\n return `${formatFixed(amount * sign, digits(digitValue, 2))} ${units[index]}${suffix}`.trim();\n }\n }\n});\n\n// src/engine/component-state.ts\nvar IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\nvar componentStateProxies = new WeakMap;\nfunction isReadableValue(value) {\n return !!value && (typeof value === \"object\" || typeof value === \"function\") && typeof value.subscribe === \"function\";\n}\nfunction rawRecord(value) {\n return value.__slexkitRaw ?? value;\n}\nfunction componentPropName(key) {\n return key.startsWith(\"$\") ? key.slice(1) : key;\n}\nfunction isEventProp(key, value) {\n return key.startsWith(\"on\") && typeof value === \"function\";\n}\nfunction isWritableComponent(type) {\n const mode = getComponentStateMode(type);\n return mode === \"value\" || mode === \"checked\" || mode === \"enabled\";\n}\nfunction isReadableComponent(type) {\n return getComponentStateMode(type) === \"readable\";\n}\nfunction isStatefulComponent(type) {\n return getComponentStateMode(type) !== \"none\";\n}\nfunction isInputStateProp(type, propName) {\n const mode = getComponentStateMode(type);\n if (mode === \"value\")\n return propName === \"value\";\n if (mode === \"checked\")\n return propName === \"value\" || propName === \"checked\";\n if (mode === \"enabled\")\n return propName === \"enabled\";\n return false;\n}\nfunction assignEngineeringState(state, value) {\n const result = isEngineeringNumberResult(value) ? value : parseEngineeringNumber(value);\n state.value = result.raw;\n state.number = result.number;\n state.valid = result.valid;\n state.prefix = result.prefix;\n state.unit = result.unit;\n state.normalized = result.normalized;\n if (result.error)\n state.error = result.error;\n else\n delete state.error;\n}\nfunction clearEngineeringState(state) {\n delete state.number;\n delete state.valid;\n delete state.prefix;\n delete state.unit;\n delete state.normalized;\n delete state.error;\n}\nfunction assignInputType(state, inputType) {\n const previousType = state.type;\n state.type = inputType;\n if (inputType === \"engineering\" && \"value\" in state) {\n assignEngineeringState(state, state.value);\n } else if (previousType === \"engineering\" && inputType !== \"engineering\") {\n clearEngineeringState(state);\n }\n}\nfunction assignComponentProp(state, type, propName, value, force) {\n if (!force && propName in state)\n return;\n if (type === \"input\" && propName === \"value\" && state.type === \"engineering\") {\n assignEngineeringState(state, value);\n return;\n }\n if (getComponentStateMode(type) === \"checked\" && (propName === \"checked\" || propName === \"value\")) {\n const checked = !!value;\n state.checked = checked;\n state.value = checked;\n return;\n }\n if (getComponentStateMode(type) === \"enabled\" && propName === \"enabled\") {\n state.enabled = !!value;\n return;\n }\n state[propName] = value;\n}\nfunction publicComponentState(name, state, componentTypes) {\n let cached = componentStateProxies.get(state);\n if (!cached) {\n cached = new Proxy(state, {\n get(target, key, receiver) {\n if (key === SKIP_EAGER_TRACK)\n return true;\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n const currentType = componentTypes[name] ?? \"\";\n if (isWritableComponent(currentType)) {\n if (typeof key === \"string\") {\n assignComponentProp(target, currentType, key, value, true);\n return true;\n }\n return Reflect.set(target, key, value, receiver);\n }\n console.warn(`[SlexKit] Component state '${name}' is read-only. Use dynamic $ props to update output components.`);\n return true;\n },\n deleteProperty(target, key) {\n if (isWritableComponent(componentTypes[name] ?? \"\")) {\n return Reflect.deleteProperty(target, key);\n }\n console.warn(`[SlexKit] Component state '${name}' is read-only. Use dynamic $ props to update output components.`);\n return true;\n }\n });\n componentStateProxies.set(state, cached);\n }\n return cached;\n}\nfunction createGProxy(g, components, componentTypes) {\n return new Proxy(g, {\n get(target, key, receiver) {\n if (key === EAGER_TRACK_TARGET)\n return target;\n if (typeof key === \"string\" && !(key in target) && key in components) {\n return publicComponentState(key, components[key], componentTypes);\n }\n return Reflect.get(target, key, receiver);\n },\n set(target, key, value, receiver) {\n return Reflect.set(target, key, value, receiver);\n },\n has(target, key) {\n return key in target || key in components;\n }\n });\n}\nfunction ensureComponentState(name, type, components, componentTypes) {\n if (!components[name])\n components[name] = {};\n const previousType = componentTypes[name] ?? \"\";\n if (!(isWritableComponent(previousType) && isReadableComponent(type))) {\n componentTypes[name] = type;\n }\n return components[name];\n}\nfunction syncReadableComponentProp(type, state, propName, value) {\n if (isWritableComponent(type)) {\n const unsubscribe2 = value.subscribe((next) => {\n assignComponentProp(state, type, propName, next, true);\n });\n onCleanup(unsubscribe2);\n return;\n }\n let unsubscribe;\n let cancelled = false;\n queueMicrotask(() => {\n if (cancelled)\n return;\n unsubscribe = value.subscribe((next) => {\n assignComponentProp(state, type, propName, next, true);\n });\n });\n onCleanup(() => {\n cancelled = true;\n unsubscribe?.();\n });\n}\nfunction syncComponentProps(type, name, props, components, componentTypes) {\n if (!name || !isStatefulComponent(type))\n return;\n const previousType = componentTypes[name] ?? \"\";\n if (isWritableComponent(previousType) && isReadableComponent(type))\n return;\n const state = ensureComponentState(name, type, components, componentTypes);\n if (type === \"input\" && typeof props.type === \"string\") {\n assignInputType(state, props.type);\n }\n for (const [key, value] of Object.entries(props)) {\n if (isEventProp(key, value))\n continue;\n const propName = componentPropName(key);\n const inputStateProp = isInputStateProp(type, propName);\n if (isReadableValue(value)) {\n syncReadableComponentProp(type, state, propName, value);\n } else {\n assignComponentProp(state, type, propName, value, !inputStateProp);\n }\n }\n return state;\n}\nfunction bindInputStateProps(type, state, props) {\n if (!state)\n return;\n const mode = getComponentStateMode(type);\n if (mode === \"value\") {\n props.value = createComponentAccessor(() => state.value);\n } else if (mode === \"checked\") {\n const checked = createComponentAccessor(() => !!(state.checked ?? state.value));\n props.checked = checked;\n props.value = checked;\n } else if (mode === \"enabled\") {\n props.enabled = createComponentAccessor(() => !!state.enabled);\n }\n}\nfunction applyComponentEventState(type, name, data, components, componentTypes) {\n if (!name || !isWritableComponent(type))\n return;\n const state = ensureComponentState(name, type, components, componentTypes);\n const mode = getComponentStateMode(type);\n if (mode === \"checked\") {\n const checked = !!data;\n state.checked = checked;\n state.value = checked;\n } else if (mode === \"enabled\") {\n state.enabled = !!data;\n } else if (type === \"input\" && state.type === \"engineering\") {\n assignEngineeringState(state, data);\n } else {\n state.value = data;\n }\n}\nfunction seedStaticComponentState(type, state, props) {\n if (type === \"input\" && typeof props.type === \"string\") {\n assignInputType(state, props.type);\n }\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith(\"$\") || isEventProp(key, value))\n continue;\n const propName = componentPropName(key);\n if (isInputStateProp(type, propName)) {\n assignComponentProp(state, type, propName, value, false);\n }\n }\n}\nfunction warnDuplicateState(ns, name, currentType, currentPath, previous) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is declared more than once at ${previous.path} and ${currentPath}; state is shared by namespace and component name.`);\n if (previous.type !== currentType) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is used by multiple component types (${previous.type}, ${currentType}); use distinct names when components should not share state.`);\n }\n}\nfunction dynamicStateBinding(type, props) {\n const mode = getComponentStateMode(type);\n const value = mode === \"checked\" ? props.$checked ?? props.$value : mode === \"enabled\" ? props.$enabled : props.$value;\n return typeof value === \"string\" ? value.trim() : undefined;\n}\nfunction isMirroredValueControlPair(previousType, currentType) {\n return previousType === \"input\" && currentType === \"slider\" || previousType === \"slider\" && currentType === \"input\";\n}\nfunction shouldWarnDuplicateState(currentType, currentBinding, previous) {\n if (isReadableComponent(previous.type) && isReadableComponent(currentType)) {\n return false;\n }\n if (currentBinding && previous.stateBinding === currentBinding && isMirroredValueControlPair(previous.type, currentType)) {\n return false;\n }\n return true;\n}\nfunction warnForState(ns, name, path) {\n console.warn(`[SlexKit][${ns}] Component state '${name}' is used with $for at ${path}; repeated items share one namespace-level instance state.`);\n}\nfunction prepareComponentStatesInner(layout, components, componentTypes, ns, seen, parentPath = \"\") {\n if (!layout || typeof layout !== \"object\")\n return;\n for (const [key, val] of Object.entries(layout)) {\n if (!key.includes(\":\") || typeof val !== \"object\" || val === null)\n continue;\n const [type, name] = key.split(\":\");\n const props = val;\n const path = parentPath ? `${parentPath}.${key}` : key;\n if (name && isStatefulComponent(type)) {\n const stateBinding = dynamicStateBinding(type, props);\n const previous = seen.get(name);\n if (previous) {\n if (shouldWarnDuplicateState(type, stateBinding, previous)) {\n warnDuplicateState(ns, name, type, path, previous);\n }\n } else {\n seen.set(name, { type, path, stateBinding });\n }\n if (props.$for && isWritableComponent(type))\n warnForState(ns, name, path);\n const state = ensureComponentState(name, type, components, componentTypes);\n seedStaticComponentState(type, state, props);\n }\n prepareComponentStatesInner(props, components, componentTypes, ns, seen, path);\n }\n}\nfunction prepareComponentStates(layout, components, componentTypes, ns) {\n prepareComponentStatesInner(layout, components, componentTypes, ns, new Map);\n}\nfunction buildComponentEvalContext(g, components, componentTypes, api, forCtx) {\n const ctx = {\n g: createGProxy(g, components, componentTypes),\n std: slexkitStd\n };\n const gKeys = new Set(Object.keys(rawRecord(g)));\n for (const name of Object.keys(rawRecord(components))) {\n if (name === \"std\" || name === \"g\" || name === \"api\")\n continue;\n if (IDENTIFIER.test(name) && !gKeys.has(name)) {\n ctx[name] = publicComponentState(name, components[name], componentTypes);\n }\n }\n if (api)\n ctx.api = api;\n if (forCtx) {\n for (const k of Object.keys(forCtx)) {\n if (k === \"std\")\n continue;\n Object.defineProperty(ctx, k, {\n get: () => {\n const current = forCtx[k];\n return k === \"$index\" && typeof current === \"function\" ? current() : current;\n },\n enumerable: true\n });\n }\n }\n return ctx;\n}\n\n// src/engine/renderer.ts\nvar FALLBACK_CSS = \"background:var(--muted);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);padding:0.5rem;text-align:center;font-size:0.75rem;color:var(--muted-foreground)\";\nvar defaultRenderOptions = {\n dir: \"ltr\",\n labels: {}\n};\nfunction hasComponentKey(obj) {\n return Object.keys(obj).some((k) => k.includes(\":\"));\n}\nfunction separatePropsAndChildren(obj, props, children) {\n for (const [k, v] of Object.entries(obj)) {\n if (k === \"$if\" || k === \"$for\" || k === \"$key\")\n continue;\n if (k.includes(\":\") || typeof v === \"object\" && v !== null && Object.keys(v).length > 0 && hasComponentKey(v)) {\n children[k] = v;\n } else {\n props[k] = v;\n }\n }\n}\nfunction callHook(g, name, type) {\n const key = name ? `${type}_${name}` : `${type}_`;\n const fn = g[key];\n if (typeof fn === \"function\") {\n fn.call(g);\n }\n}\nfunction applyEnterAnimation(el, props) {\n const enterFn = props.$enter;\n if (typeof enterFn !== \"function\")\n return;\n const animClass = enterFn();\n if (animClass && typeof animClass === \"string\") {\n el.classList.add(animClass);\n el.addEventListener(\"animationend\", () => el.classList.remove(animClass), { once: true });\n }\n}\nfunction applyLeaveAnimation(el, props, callback) {\n const leaveFn = props.$leave;\n if (typeof leaveFn !== \"function\") {\n callback();\n return;\n }\n const animClass = leaveFn();\n if (animClass && typeof animClass === \"string\") {\n el.classList.add(animClass);\n el.addEventListener(\"animationend\", () => {\n callback();\n }, { once: true });\n } else {\n callback();\n }\n}\nfunction renderWithFallback(renderer, props, name, ctx, fullKey, ns) {\n try {\n return renderComponent(() => renderer(props, name, ctx));\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Render error at ${fullKey}:`, e.message);\n const fb = (ctx.document || document).createElement(\"div\");\n fb.className = \"slex-render-error\";\n fb.title = fullKey;\n fb.setAttribute(\"style\", FALLBACK_CSS);\n return fb;\n }\n}\nfunction resolveDynamicProps(props, g, components, componentTypes, api, forCtx, ns, fullKey) {\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n for (const [k, v] of Object.entries(props)) {\n if (k.startsWith(\"$\") && !k.startsWith(\"$if\") && !k.startsWith(\"$for\") && !k.startsWith(\"$key\") && typeof v === \"string\") {\n const path = `${fullKey}:${k}`;\n const memo = createMemo(() => evalRead(v, evalCtx, ns, path));\n props[k] = createComponentAccessor(memo);\n } else if (k.startsWith(\"on\") && typeof v === \"string\") {\n const stmt = v;\n const path = `${fullKey}:${k}`;\n props[k] = ($event) => execWrite(stmt, { ...evalCtx, $event: $event ?? null }, ns, path);\n }\n }\n}\nfunction resolveKeyValue(item, itemIndex, $keyProp) {\n if ($keyProp) {\n if ($keyProp === \"$value\") {\n return item;\n }\n if ($keyProp === \"id\" || $keyProp !== \"id\" && item && typeof item === \"object\") {\n return item?.[$keyProp];\n }\n }\n if (item && typeof item === \"object\" && \"id\" in item) {\n return item.id;\n }\n const primitiveTypes = [\"string\", \"number\", \"boolean\"];\n if (primitiveTypes.includes(typeof item)) {\n console.warn(\"[SlexKit] $for with primitive array items but no $key specified. Use '$key: $value' for primitive arrays. Falling back to index.\");\n return itemIndex;\n }\n console.warn(\"[SlexKit] $for array item has no 'id' property and no $key specified. Falling back to index.\");\n return itemIndex;\n}\nfunction trackForCollection(value) {\n if (!Array.isArray(value))\n return value;\n Reflect.get(value, \"length\");\n for (const item of value) {\n if (item && typeof item === \"object\") {\n for (const key of Object.keys(item)) {\n Reflect.get(item, key);\n }\n }\n }\n return value;\n}\nfunction renderIfNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n const show = createMemo(() => evalRead(props.$if, evalCtx, ns, `${fullKey}:$if`));\n let current = null;\n const leavingInstances = new Set;\n let mounting = false;\n let emit;\n const disposeInstance = (instance) => {\n if (instance.disposed)\n return;\n instance.disposed = true;\n leavingInstances.delete(instance);\n if (current === instance)\n current = null;\n disposeComponent(instance.el);\n instance.dispose();\n callHook(g, name, \"onUnmount\");\n instance.el.remove();\n };\n createEffect(() => {\n if (show()) {\n if (!current && !mounting) {\n mounting = true;\n let innerProps;\n let innerChildren;\n let currentEl;\n const dispose = createRoot((_dispose) => {\n innerProps = {};\n innerChildren = {};\n separatePropsAndChildren(props, innerProps, innerChildren);\n resolveDynamicProps(innerProps, g, components, componentTypes, api, forCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, innerProps, components, componentTypes);\n bindInputStateProps(type, componentState, innerProps);\n emit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = innerProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n currentEl = renderWithFallback(renderer, innerProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx,\n children: innerChildren,\n id: name || null,\n emit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? forCtx, ns, api, options, false)\n }, fullKey, ns);\n return _dispose;\n });\n mounting = false;\n if (currentEl) {\n container.appendChild(currentEl);\n applyEnterAnimation(currentEl, innerProps);\n callHook(g, name, \"onMount\");\n current = {\n el: currentEl,\n props: innerProps,\n dispose,\n disposed: false\n };\n } else {\n dispose();\n }\n }\n } else {\n if (current) {\n const instance = current;\n current = null;\n leavingInstances.add(instance);\n applyLeaveAnimation(instance.el, instance.props, () => {\n disposeInstance(instance);\n });\n }\n }\n });\n onCleanup(() => {\n if (current)\n disposeInstance(current);\n for (const instance of Array.from(leavingInstances))\n disposeInstance(instance);\n });\n}\nfunction renderAndMountSlot(item, index, keyVal, indexSignal, revisionSignal, renderer, type, name, props, container, g, components, componentTypes, api, forCtx, ns, fullKey, options) {\n indexSignal[1](index);\n const reactiveItem = asReactiveValue(item, g);\n const innerForCtx = {\n ...forCtx,\n $item: reactiveItem,\n $index: indexSignal[0],\n $key: keyVal,\n $revision: revisionSignal[0]\n };\n if (name) {\n innerForCtx[name] = reactiveItem;\n }\n let innerProps;\n let innerChildren;\n let el;\n let fEmit;\n const dispose = createRoot((_dispose) => {\n innerProps = {};\n innerChildren = {};\n separatePropsAndChildren(props, innerProps, innerChildren);\n resolveDynamicProps(innerProps, g, components, componentTypes, api, innerForCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, innerProps, components, componentTypes);\n bindInputStateProps(type, componentState, innerProps);\n fEmit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = innerProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n el = renderWithFallback(renderer, innerProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx: innerForCtx,\n children: innerChildren,\n id: name || null,\n emit: fEmit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? innerForCtx, ns, api, options, false)\n }, `${fullKey}[${index}]`, ns);\n return _dispose;\n });\n return {\n key: keyVal,\n el,\n forCtx: innerForCtx,\n index,\n item: reactiveItem,\n props: innerProps,\n children: innerChildren,\n indexSignal,\n revision: 0,\n revisionSignal,\n dispose\n };\n}\nfunction renderForNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const doc = container.ownerDocument || document;\n const startAnchor = doc.createComment(`slexkit-for:${fullKey}:start`);\n const endAnchor = doc.createComment(`slexkit-for:${fullKey}:end`);\n container.append(startAnchor, endAnchor);\n const evalCtx = buildComponentEvalContext(g, components, componentTypes, api, forCtx);\n const items = createMemo(() => trackForCollection(evalRead(props.$for, evalCtx, ns, `${fullKey}:$for`)));\n const $keyProp = props.$key;\n const slotMap = new Map;\n const leavingSlots = new Set;\n const disposedSlots = new WeakSet;\n const disposeSlot = (slot) => {\n if (disposedSlots.has(slot))\n return;\n disposedSlots.add(slot);\n leavingSlots.delete(slot);\n callHook(g, name, \"onUnmount\");\n if (slot.el) {\n disposeComponent(slot.el);\n slot.el.remove();\n }\n if (slot.dispose)\n slot.dispose();\n };\n createEffect(() => {\n const arr = items();\n if (!Array.isArray(arr)) {\n if (slotMap.size > 0) {\n for (const [, slot] of slotMap) {\n disposeSlot(slot);\n }\n slotMap.clear();\n }\n return;\n }\n const newKeys = arr.map((item, i) => resolveKeyValue(item, i, $keyProp));\n const newKeySet = new Set(newKeys);\n const deletedSlots = [];\n for (const [oldKey, slot] of slotMap) {\n if (!newKeySet.has(oldKey)) {\n deletedSlots.push(slot);\n slotMap.delete(oldKey);\n }\n }\n for (const slot of deletedSlots) {\n leavingSlots.add(slot);\n if (!slot.el) {\n disposeSlot(slot);\n continue;\n }\n applyLeaveAnimation(slot.el, slot.props, () => {\n disposeSlot(slot);\n });\n }\n let cursor = startAnchor;\n arr.forEach((item, index) => {\n item = asReactiveValue(item, g);\n const keyVal = newKeys[index];\n let slot = slotMap.get(keyVal);\n if (slot) {\n const indexChanged = slot.index !== index;\n const itemChanged = slot.item !== item;\n slot.forCtx.$item = item;\n slot.forCtx.$key = keyVal;\n if (name)\n slot.forCtx[name] = item;\n slot.index = index;\n slot.item = item;\n if (slot.revisionSignal) {\n slot.revision = (slot.revision ?? 0) + 1;\n slot.revisionSignal[1](slot.revision);\n }\n if (indexChanged || itemChanged) {\n if (indexChanged && slot.indexSignal) {\n slot.indexSignal[1](index);\n }\n callHook(g, name, \"onUpdate\");\n }\n } else {\n const indexSignal = createSignal(index);\n const revisionSignal = createSignal(0);\n slot = renderAndMountSlot(item, index, keyVal, indexSignal, revisionSignal, renderer, type, name, props, container, g, components, componentTypes, api, forCtx, ns, fullKey, options);\n if (!slot.el) {\n disposeSlot(slot);\n return;\n }\n applyEnterAnimation(slot.el, slot.props);\n callHook(g, name, \"onMount\");\n slotMap.set(keyVal, slot);\n }\n const nextChild = cursor.nextSibling;\n if (slot.el && nextChild !== slot.el) {\n container.insertBefore(slot.el, nextChild ?? endAnchor);\n }\n if (slot.el) {\n cursor = slot.el;\n }\n });\n });\n onCleanup(() => {\n for (const slot of Array.from(slotMap.values()))\n disposeSlot(slot);\n slotMap.clear();\n for (const slot of Array.from(leavingSlots))\n disposeSlot(slot);\n startAnchor.remove();\n endAnchor.remove();\n });\n}\nfunction renderNormalNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n const [type, name] = fullKey.split(\":\");\n const renderer = getRenderer(type);\n if (!renderer)\n return;\n const nodeProps = {};\n const nodeChildren = {};\n separatePropsAndChildren(props, nodeProps, nodeChildren);\n resolveDynamicProps(nodeProps, g, components, componentTypes, api, forCtx, ns, fullKey);\n const componentState = syncComponentProps(type, name, nodeProps, components, componentTypes);\n bindInputStateProps(type, componentState, nodeProps);\n const nEmit = (event, data) => {\n if (event === \"change\")\n applyComponentEventState(type, name, data, components, componentTypes);\n const h = nodeProps[`on${event}`];\n if (typeof h === \"function\")\n h(data);\n };\n const el = renderWithFallback(renderer, nodeProps, name, {\n g,\n std: slexkitStd,\n api,\n dir: options.dir,\n labels: options.labels,\n document: container.ownerDocument || document,\n forCtx,\n children: nodeChildren,\n id: name || null,\n emit: nEmit,\n renderTree: (layout, _container, childForCtx) => renderTree(layout, _container, g, components, componentTypes, childForCtx ?? forCtx, ns, api, options, false)\n }, fullKey, ns);\n if (el) {\n container.appendChild(el);\n applyEnterAnimation(el, nodeProps);\n callHook(g, name, \"onMount\");\n onCleanup(() => callHook(g, name, \"onUnmount\"));\n onCleanup(() => disposeComponent(el));\n }\n}\nfunction renderNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options) {\n if (!fullKey || !fullKey.includes(\":\"))\n return;\n if (props.$if) {\n renderIfNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n } else if (props.$for) {\n renderForNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n } else {\n renderNormalNode(fullKey, props, container, g, components, componentTypes, api, forCtx, ns, options);\n }\n}\nfunction renderTree(layout, container, g, components, componentTypes, forCtx, ns = \"?\", api, options = defaultRenderOptions, prepare = true) {\n if (!layout || typeof layout !== \"object\")\n return;\n if (prepare)\n prepareComponentStates(layout, components, componentTypes, ns);\n for (const [key, val] of Object.entries(layout)) {\n if (!key.includes(\":\"))\n continue;\n if (typeof val === \"object\" && val !== null) {\n renderNode(key, val, container, g, components, componentTypes, api, forCtx, ns, options);\n }\n }\n}\n\n// src/engine/diagnostics.ts\nclass SlexKitSyntaxError extends SyntaxError {\n diagnostic;\n constructor(diagnostic) {\n super(formatSlexKitDiagnostic(diagnostic));\n this.name = \"SlexKitSyntaxError\";\n this.diagnostic = diagnostic;\n }\n}\nfunction excerpt(source, line, column) {\n const lines = source.split(`\n`);\n const start = Math.max(1, line - 2);\n const end = Math.min(lines.length, line + 2);\n const width = String(end).length;\n const rows = [];\n for (let current = start;current <= end; current += 1) {\n const marker = current === line ? \">\" : \" \";\n rows.push(`${marker} ${String(current).padStart(width, \" \")} | ${lines[current - 1] ?? \"\"}`);\n if (current === line) {\n rows.push(` ${\" \".repeat(width)} | ${\" \".repeat(Math.max(0, column - 1))}^`);\n }\n }\n return rows.join(`\n`);\n}\nfunction lineColumnAt(source, index) {\n const prefix = source.slice(0, Math.max(0, index));\n const lines = prefix.split(`\n`);\n return {\n line: lines.length,\n column: lines[lines.length - 1].length + 1\n };\n}\nfunction stackLine(error) {\n if (!(error instanceof Error) || !error.stack)\n return null;\n const match = error.stack.match(/<parse>\\s+\\(:(\\d+)\\)/);\n if (!match)\n return null;\n const parsed = Number(match[1]);\n return Number.isFinite(parsed) ? Math.max(1, parsed - 2) : null;\n}\nfunction scanSource(source) {\n const chars = [];\n let quote = \"\";\n let escaped = false;\n let line = 1;\n let column = 0;\n for (let index = 0;index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1];\n column += 1;\n if (char === `\n`) {\n line += 1;\n column = 0;\n if (quote === \"//\")\n quote = \"\";\n continue;\n }\n if (quote) {\n if (quote === \"/*\" && char === \"*\" && next === \"/\") {\n quote = \"\";\n index += 1;\n column += 1;\n } else if (quote !== \"/*\" && quote !== \"//\" && !escaped && char === quote) {\n quote = \"\";\n }\n escaped = !escaped && quote !== \"/*\" && quote !== \"//\" && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n continue;\n }\n if (char === \"/\" && next === \"/\") {\n quote = \"//\";\n index += 1;\n column += 1;\n continue;\n }\n if (char === \"/\" && next === \"*\") {\n quote = \"/*\";\n index += 1;\n column += 1;\n continue;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n escaped = false;\n continue;\n }\n chars.push({ char, index, line, column });\n }\n return chars;\n}\nfunction tokenDiagnostic(source, message) {\n const chars = scanSource(source);\n const unexpectedString = message.match(/Unexpected string(?: literal)?(?: \"([^\"]+)\")?/);\n if (unexpectedString) {\n const literal = unexpectedString[1];\n if (literal) {\n const quoted = [`\"${literal}\"`, `'${literal}'`, `\\`${literal}\\``];\n const index = quoted.map((candidate) => source.indexOf(candidate)).filter((candidate) => candidate >= 0).sort((a, b) => a - b)[0];\n if (index !== undefined)\n return lineColumnAt(source, index);\n }\n const suspiciousString = source.match(/[}\\])\"']\\s*(['\"`])/);\n if (suspiciousString?.index !== undefined) {\n const quoteIndex = source.indexOf(suspiciousString[1], suspiciousString.index + 1);\n if (quoteIndex >= 0)\n return lineColumnAt(source, quoteIndex);\n }\n }\n if (message.includes(\"Unexpected token ':'\")) {\n const doubleColon = chars.find((item, index) => item.char === \":\" && chars[index - 1]?.char === \":\");\n if (doubleColon)\n return doubleColon;\n const suspiciousColon = chars.find((item, index) => {\n if (item.char !== \":\")\n return false;\n const prev = chars[index - 1]?.char;\n return prev === '\"' || prev === \"'\" || prev === \"}\" || prev === \"]\" || prev === \")\";\n });\n if (suspiciousColon)\n return suspiciousColon;\n }\n return null;\n}\nfunction delimiterDiagnostic(source) {\n const stack = [];\n const pairs = { \"}\": \"{\", \"]\": \"[\", \")\": \"(\" };\n for (const item of scanSource(source)) {\n if (item.char === \"{\" || item.char === \"[\" || item.char === \"(\") {\n stack.push(item);\n continue;\n }\n if (item.char === \"}\" || item.char === \"]\" || item.char === \")\") {\n const expected = pairs[item.char];\n const opener2 = stack.pop();\n if (!opener2 || opener2.char !== expected) {\n return {\n line: item.line,\n column: item.column,\n detail: `Unexpected closing delimiter ${item.char}.`\n };\n }\n }\n }\n const opener = stack.at(-1);\n if (!opener)\n return null;\n const end = lineColumnAt(source, source.length);\n return {\n line: end.line,\n column: end.column,\n detail: `Expected closing delimiter for ${opener.char} opened at line ${opener.line}, column ${opener.column}.`\n };\n}\nfunction locateSyntaxError(source, error) {\n const rawMessage = error instanceof Error ? error.message : String(error);\n const delimiter = delimiterDiagnostic(source);\n const token = tokenDiagnostic(source, rawMessage);\n const stack = stackLine(error);\n const position = token ?? (delimiter && rawMessage.includes(\"Expected\") ? delimiter : null) ?? (stack ? { line: stack, column: 1 } : null) ?? delimiter ?? { line: 1, column: 1 };\n const detail = token ? \"The parser failed at this token.\" : delimiter?.detail;\n return {\n message: rawMessage,\n line: position.line,\n column: position.column,\n detail,\n excerpt: excerpt(source, position.line, position.column)\n };\n}\nfunction readStringLiteral(source, start) {\n const quote = source[start];\n if (quote !== '\"' && quote !== \"'\" && quote !== \"`\")\n return null;\n let escaped = false;\n for (let index = start + 1;index < source.length; index += 1) {\n const char = source[index];\n if (!escaped && char === quote) {\n return { end: index + 1, value: source.slice(start, index + 1) };\n }\n escaped = !escaped && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n }\n return null;\n}\nfunction skipWhitespace(source, index) {\n let cursor = index;\n while (cursor < source.length && /\\s/.test(source[cursor]))\n cursor += 1;\n return cursor;\n}\nfunction findExpressionEnd(source, start) {\n const stack = [];\n let quote = \"\";\n let escaped = false;\n for (let index = start;index < source.length; index += 1) {\n const char = source[index];\n const next = source[index + 1];\n if (quote) {\n if (quote === \"//\" && char === `\n`) {\n quote = \"\";\n } else if (quote === \"/*\" && char === \"*\" && next === \"/\") {\n quote = \"\";\n index += 1;\n } else if (quote !== \"//\" && quote !== \"/*\" && !escaped && char === quote) {\n quote = \"\";\n }\n escaped = !escaped && quote !== \"//\" && quote !== \"/*\" && char === \"\\\\\";\n if (char !== \"\\\\\")\n escaped = false;\n continue;\n }\n if (char === \"/\" && next === \"/\") {\n quote = \"//\";\n index += 1;\n continue;\n }\n if (char === \"/\" && next === \"*\") {\n quote = \"/*\";\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n escaped = false;\n continue;\n }\n if (char === \"{\" || char === \"[\" || char === \"(\") {\n stack.push(char);\n continue;\n }\n if (char === \"}\" || char === \"]\" || char === \")\") {\n if (stack.length === 0)\n return index;\n stack.pop();\n continue;\n }\n if (char === \",\" && stack.length === 0)\n return index;\n }\n return source.length;\n}\nfunction isSingleStringLiteral(source) {\n const start = skipWhitespace(source, 0);\n const literal = readStringLiteral(source, start);\n return Boolean(literal && skipWhitespace(source, literal.end) === source.length);\n}\nfunction transformDynamicPropExpressions(source) {\n const edits = [];\n const keyPattern = /(^|[,{]\\s*)(\\$[A-Za-z_$][\\w$]*)\\s*:/g;\n let match;\n while (match = keyPattern.exec(source)) {\n const colon = source.indexOf(\":\", match.index + match[1].length);\n const valueStart = skipWhitespace(source, colon + 1);\n const valueEnd = findExpressionEnd(source, valueStart);\n const rawValue = source.slice(valueStart, valueEnd);\n if (!rawValue.trim() || isSingleStringLiteral(rawValue))\n continue;\n edits.push({\n start: valueStart,\n end: valueEnd,\n value: JSON.stringify(rawValue.trim())\n });\n }\n if (edits.length === 0)\n return source;\n let transformed = source;\n for (let index = edits.length - 1;index >= 0; index -= 1) {\n const edit = edits[index];\n transformed = `${transformed.slice(0, edit.start)}${edit.value}${transformed.slice(edit.end)}`;\n }\n return transformed;\n}\nfunction formatSlexKitDiagnostic(diagnostic) {\n const detail = diagnostic.detail ? `\n${diagnostic.detail}` : \"\";\n return `${diagnostic.message} at line ${diagnostic.line}, column ${diagnostic.column}.${detail}\n${diagnostic.excerpt}`;\n}\nfunction diagnoseSlexKitSource(source, error) {\n return locateSyntaxError(source, error);\n}\nfunction parseSlexSource(source) {\n try {\n const parseSource = transformDynamicPropExpressions(source);\n return {\n ok: true,\n value: new Function(`\"use strict\";\nreturn (\n${parseSource}\n);`)()\n };\n } catch (error) {\n const diagnostic = diagnoseSlexKitSource(source, error);\n return {\n ok: false,\n diagnostic,\n error: new SlexKitSyntaxError(diagnostic)\n };\n }\n}\nvar parseSlexKitDsl = parseSlexSource;\n\n// src/version.ts\nvar SLEXKIT_VERSION = \"0.3.3\";\nvar SLEX_PROTOCOL_VERSION = \"0.1\";\nvar SLEXKIT_COMPONENTS_VERSION = SLEXKIT_VERSION;\nfunction getSlexKitInfo() {\n return {\n version: SLEXKIT_VERSION,\n protocolVersion: SLEX_PROTOCOL_VERSION,\n componentsVersion: SLEXKIT_COMPONENTS_VERSION\n };\n}\n\n// src/engine/secure-runtime.ts\nclass SlexKitRuntimeError extends Error {\n kind;\n code;\n elapsedMs;\n constructor(kind, code, message, elapsedMs) {\n super(message);\n this.name = \"SlexKitRuntimeError\";\n this.kind = kind;\n this.code = code;\n this.elapsedMs = elapsedMs;\n }\n}\nfunction runtimeNow(adapter) {\n if (adapter?.now)\n return adapter.now();\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\nfunction currentOrigin() {\n if (typeof location !== \"undefined\" && location.origin)\n return location.origin;\n if (typeof window !== \"undefined\" && window.location?.origin)\n return window.location.origin;\n return \"http://localhost\";\n}\nfunction resolveUrl(url) {\n try {\n return new URL(url);\n } catch {}\n try {\n return new URL(url, currentOrigin());\n } catch {\n throw new SlexKitRuntimeError(\"policy\", \"invalid_url\", \"Invalid request URL.\");\n }\n}\nfunction originAllowed(origin, patterns) {\n let parsedOrigin;\n try {\n parsedOrigin = new URL(origin);\n } catch {\n return false;\n }\n for (const pattern of patterns) {\n const normalized = pattern.trim();\n if (normalized === \"*\" || normalized === origin)\n return true;\n if (normalized.endsWith(\"://*\")) {\n const protocol = normalized.slice(0, -4);\n if (parsedOrigin.protocol === `${protocol}:`)\n return true;\n }\n const wildcard = normalized.match(/^([a-z][a-z0-9+.-]*):\\/\\/\\*\\.(.+)$/i);\n if (wildcard && parsedOrigin.protocol === `${wildcard[1]}:`) {\n const suffix = wildcard[2].toLowerCase();\n const host = parsedOrigin.hostname.toLowerCase();\n if (host.endsWith(`.${suffix}`))\n return true;\n }\n }\n return false;\n}\nfunction needsJsonBody(method, body) {\n if (method !== \"POST\" || body === undefined)\n return false;\n return !(typeof body === \"string\" || body instanceof ArrayBuffer || ArrayBuffer.isView(body));\n}\nfunction bodySize(body) {\n if (body === undefined || body === null)\n return 0;\n if (typeof body === \"string\")\n return body.length;\n if (body instanceof ArrayBuffer)\n return body.byteLength;\n if (ArrayBuffer.isView(body))\n return body.byteLength;\n return JSON.stringify(body).length;\n}\nvar DEFAULT_ALLOWED_HEADERS = [\"accept\", \"content-type\"];\nvar BLOCKED_HEADERS = [\n \"authorization\",\n \"cookie\",\n \"proxy-authorization\",\n \"sec-fetch-dest\",\n \"sec-fetch-mode\",\n \"sec-fetch-site\",\n \"sec-fetch-user\",\n \"set-cookie\"\n];\nfunction normalizeHeaderName(name) {\n return name.trim().toLowerCase();\n}\nfunction assertHeaders(headers, allowHeaders) {\n if (!headers)\n return;\n const allowed = new Set((allowHeaders ?? DEFAULT_ALLOWED_HEADERS).map(normalizeHeaderName));\n for (const [name, value] of Object.entries(headers)) {\n const normalized = normalizeHeaderName(name);\n if (!normalized || typeof value !== \"string\") {\n throw new SlexKitRuntimeError(\"policy\", \"header_blocked\", \"Request header is not allowed.\");\n }\n if (BLOCKED_HEADERS.includes(normalized) || !allowed.has(normalized)) {\n throw new SlexKitRuntimeError(\"policy\", \"header_blocked\", `Request header ${name} is not allowed.`);\n }\n }\n}\nfunction responseSize(result) {\n if (typeof result.text === \"string\")\n return result.text.length;\n if (result.data !== undefined) {\n try {\n return JSON.stringify(result.data).length;\n } catch {\n return 0;\n }\n }\n return 0;\n}\nfunction contentTypeAllowed(contentType, patterns) {\n const normalized = contentType.split(\";\")[0].trim().toLowerCase();\n if (!normalized)\n return false;\n return patterns.some((pattern) => {\n const allowed = pattern.trim().toLowerCase();\n if (allowed === \"*\" || allowed === normalized)\n return true;\n if (allowed.endsWith(\"/*\")) {\n return normalized.startsWith(`${allowed.slice(0, -1)}`);\n }\n return false;\n });\n}\nfunction responseHeader(headers, name) {\n const target = name.toLowerCase();\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === target)\n return value;\n }\n return;\n}\nfunction assertNetworkResult(result, policy) {\n if (!policy)\n return;\n if (policy.maxResponseBytes !== undefined && responseSize(result) > policy.maxResponseBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\", result.elapsedMs);\n }\n if (policy.allowContentTypes?.length) {\n const contentType = responseHeader(result.headers, \"content-type\");\n if (!contentType || !contentTypeAllowed(contentType, policy.allowContentTypes)) {\n throw new SlexKitRuntimeError(\"policy\", \"content_type_blocked\", `Response content-type ${contentType || \"unknown\"} is not allowed.`, result.elapsedMs);\n }\n }\n}\nfunction canvasPolicy(policy) {\n const canvas = policy.canvas;\n if (!canvas?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_disabled\", \"Canvas access is disabled.\");\n }\n return canvas;\n}\nfunction assertCanvasDimensions(policy, width, height) {\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_size_invalid\", \"Canvas size must be positive finite numbers.\");\n }\n const pixels = Math.ceil(width) * Math.ceil(height);\n if (policy.maxPixels !== undefined && pixels > policy.maxPixels) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_too_large\", \"Canvas size exceeds the runtime policy limit.\");\n }\n}\nfunction assertCanvasContext(policy, contextId) {\n if (policy.allowedContexts?.length && !policy.allowedContexts.includes(contextId)) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_context_blocked\", `Canvas context ${contextId} is not allowed.`);\n }\n}\nfunction emitNetworkLog(adapter, event) {\n try {\n adapter?.onNetworkLog?.(event);\n } catch {}\n}\nfunction emitRuntimeError(adapter, event) {\n try {\n adapter?.onRuntimeError?.(event);\n } catch {}\n}\nfunction timerHost(adapter) {\n const globalTimer = globalThis;\n return {\n setTimeout: adapter?.setTimeout ?? ((fn, ms) => Number(globalTimer.setTimeout(fn, ms))),\n clearTimeout: adapter?.clearTimeout ?? ((id) => globalTimer.clearTimeout(id)),\n setInterval: adapter?.setInterval ?? ((fn, ms) => Number(globalTimer.setInterval(fn, ms))),\n clearInterval: adapter?.clearInterval ?? ((id) => globalTimer.clearInterval(id))\n };\n}\nfunction rafHost(adapter) {\n const globalRaf = globalThis;\n return {\n requestAnimationFrame: adapter?.requestAnimationFrame ?? ((fn) => {\n if (typeof globalRaf.requestAnimationFrame === \"function\") {\n return Number(globalRaf.requestAnimationFrame(fn));\n }\n return Number(globalThis.setTimeout(() => fn(runtimeNow(adapter)), 16));\n }),\n cancelAnimationFrame: adapter?.cancelAnimationFrame ?? ((id) => {\n if (typeof globalRaf.cancelAnimationFrame === \"function\") {\n globalRaf.cancelAnimationFrame(id);\n } else {\n globalThis.clearTimeout(id);\n }\n })\n };\n}\nasync function readResponseText(response, maxResponseBytes) {\n if (maxResponseBytes === undefined || !response.body?.getReader) {\n const text2 = await response.text();\n if (maxResponseBytes !== undefined && text2.length > maxResponseBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\");\n }\n return text2;\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder;\n let size = 0;\n let text = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n size += value.byteLength;\n if (size > maxResponseBytes) {\n await reader.cancel();\n throw new SlexKitRuntimeError(\"policy\", \"response_too_large\", \"Response body exceeds the runtime policy limit.\");\n }\n text += decoder.decode(value, { stream: true });\n }\n text += decoder.decode();\n return text;\n}\nasync function defaultFetch(request, adapter, options = {}) {\n if (adapter?.fetch)\n return adapter.fetch(request);\n if (typeof fetch !== \"function\") {\n throw new SlexKitRuntimeError(\"network\", \"fetch_unavailable\", \"Host fetch is unavailable.\");\n }\n const start = runtimeNow(adapter);\n const controller = typeof AbortController !== \"undefined\" ? new AbortController : undefined;\n const releaseController = controller ? options.onController?.(controller) : undefined;\n const timeout = controller ? globalThis.setTimeout(() => controller.abort(), request.timeoutMs) : undefined;\n try {\n const init = {\n method: request.method,\n headers: request.headers,\n credentials: request.credentials,\n signal: controller?.signal\n };\n if (request.method === \"POST\" && request.body !== undefined) {\n if (typeof request.body === \"string\" || request.body instanceof ArrayBuffer || ArrayBuffer.isView(request.body)) {\n init.body = request.body;\n } else {\n init.body = JSON.stringify(request.body);\n init.headers = request.headers;\n }\n }\n const response = await fetch(request.url, init);\n const text = await readResponseText(response, options.maxResponseBytes);\n let data = undefined;\n try {\n data = text ? JSON.parse(text) : undefined;\n } catch {\n data = undefined;\n }\n const headers = {};\n response.headers.forEach((value, key) => {\n headers[key] = value;\n });\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers,\n text,\n data,\n elapsedMs: runtimeNow(adapter) - start\n };\n } catch (error) {\n const elapsedMs = runtimeNow(adapter) - start;\n if (error instanceof Error && error.name === \"AbortError\") {\n throw new SlexKitRuntimeError(\"timeout\", \"timeout\", \"Request timed out.\", elapsedMs);\n }\n throw new SlexKitRuntimeError(\"network\", \"network_error\", errorMessage(error), elapsedMs);\n } finally {\n if (timeout !== undefined)\n globalThis.clearTimeout(timeout);\n releaseController?.();\n }\n}\nfunction errorMessage(error) {\n if (error instanceof Error)\n return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n return String(error.message);\n }\n return String(error ?? \"Unknown error.\");\n}\nfunction serializeRuntimeError(error) {\n if (error instanceof SlexKitRuntimeError) {\n return {\n name: error.name,\n message: error.message,\n kind: error.kind,\n code: error.code,\n elapsedMs: error.elapsedMs\n };\n }\n if (error instanceof Error) {\n return {\n name: error.name,\n message: error.message\n };\n }\n return {\n name: \"Error\",\n message: errorMessage(error)\n };\n}\nfunction deserializeRuntimeError(error) {\n if (error.name === \"SlexKitRuntimeError\" && error.kind && error.code) {\n return new SlexKitRuntimeError(error.kind, error.code, error.message, error.elapsedMs);\n }\n const next = new Error(error.message);\n next.name = error.name || \"Error\";\n return next;\n}\nfunction createSecureRuntime(policy, hostAdapter) {\n const disposers = new Set;\n const timeoutIds = new Set;\n const intervalIds = new Set;\n const rafIds = new Set;\n const abortControllers = new Set;\n const ownedCanvases = new Set;\n const countedCanvases = new Set;\n let disposed = false;\n let nextSyntheticId = 1;\n const syntheticTimers = new Map;\n const timers = timerHost(hostAdapter);\n const raf = rafHost(hostAdapter);\n function assertNotDisposed() {\n if (disposed) {\n throw new SlexKitRuntimeError(\"policy\", \"runtime_disposed\", \"Runtime has been disposed.\");\n }\n }\n function assertNetwork(method, url, options = {}) {\n const network = policy.network;\n if (!network?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"network_disabled\", \"Network access is disabled.\");\n }\n if (!network.methods.includes(method)) {\n throw new SlexKitRuntimeError(\"policy\", \"method_blocked\", `Network method ${method} is not allowed.`);\n }\n const parsed = resolveUrl(url);\n if (!originAllowed(parsed.origin, network.allowOrigins)) {\n throw new SlexKitRuntimeError(\"policy\", \"origin_blocked\", `Network origin ${parsed.origin} is not allowed.`);\n }\n if (method === \"POST\" && bodySize(options.body) > network.maxBodyBytes) {\n throw new SlexKitRuntimeError(\"policy\", \"body_too_large\", \"Request body exceeds the runtime policy limit.\");\n }\n const headers = needsJsonBody(method, options.body) ? { \"content-type\": \"application/json\", ...options.headers } : options.headers;\n assertHeaders(headers, network.allowHeaders);\n const timeoutMs = Math.min(options.timeoutMs ?? network.timeoutMs, network.timeoutMs);\n const credentials = options.credentials ?? network.credentials;\n if (credentials !== network.credentials) {\n throw new SlexKitRuntimeError(\"policy\", \"credentials_blocked\", \"Request credentials mode is not allowed.\");\n }\n return {\n method,\n url: parsed.href,\n headers,\n body: options.body,\n credentials,\n timeoutMs\n };\n }\n function assertTimer(ms) {\n const timer = policy.timer;\n if (!timer?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_disabled\", \"Timer access is disabled.\");\n }\n if (!Number.isFinite(ms) || ms < timer.minIntervalMs) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_interval_blocked\", \"Timer interval is below policy limit.\");\n }\n if (timeoutIds.size + intervalIds.size >= timer.maxTimers) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_limit\", \"Timer limit exceeded.\");\n }\n }\n function normalizeTimerId(raw) {\n if (Number.isFinite(raw) && raw > 0)\n return raw;\n const synthetic = nextSyntheticId++;\n syntheticTimers.set(synthetic, raw);\n return synthetic;\n }\n function assertCanvas(width, height) {\n assertNotDisposed();\n const canvas = canvasPolicy(policy);\n assertCanvasDimensions(canvas, width, height);\n if (canvas.maxCanvases !== undefined && countedCanvases.size >= canvas.maxCanvases) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_limit\", \"Canvas limit exceeded.\");\n }\n return canvas;\n }\n function countCanvas(canvas, policy2) {\n if (countedCanvases.has(canvas))\n return;\n if (policy2.maxCanvases !== undefined && countedCanvases.size >= policy2.maxCanvases) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_limit\", \"Canvas limit exceeded.\");\n }\n countedCanvases.add(canvas);\n }\n function reportCallbackError(phase, error) {\n emitRuntimeError(hostAdapter, {\n phase,\n error: serializeRuntimeError(error)\n });\n }\n const api = {\n now: () => runtimeNow(hostAdapter),\n get: (url, options = {}) => api.fetch(url, { ...options, method: \"GET\" }),\n post: (url, body, options = {}) => api.fetch(url, { ...options, method: \"POST\", body }),\n fetch: async (url, options = {}) => {\n assertNotDisposed();\n const method = options.method ?? \"GET\";\n const request = assertNetwork(method, url, options);\n const started = runtimeNow(hostAdapter);\n emitNetworkLog(hostAdapter, { phase: \"request\", request });\n try {\n const result = await defaultFetch(request, hostAdapter, {\n maxResponseBytes: policy.network?.maxResponseBytes,\n onController(controller) {\n abortControllers.add(controller);\n return () => abortControllers.delete(controller);\n }\n });\n assertNetworkResult(result, policy.network);\n emitNetworkLog(hostAdapter, {\n phase: \"response\",\n request,\n result,\n elapsedMs: runtimeNow(hostAdapter) - started\n });\n return result;\n } catch (error) {\n const serialized = serializeRuntimeError(error);\n emitNetworkLog(hostAdapter, {\n phase: \"error\",\n request,\n error: serialized,\n elapsedMs: runtimeNow(hostAdapter) - started\n });\n throw error;\n }\n },\n setTimeout: (fn, ms) => {\n assertNotDisposed();\n assertTimer(ms);\n let id = 0;\n const raw = timers.setTimeout(() => {\n timeoutIds.delete(id);\n syntheticTimers.delete(id);\n try {\n fn();\n } catch (error) {\n reportCallbackError(\"timer\", error);\n throw error;\n }\n }, ms);\n id = normalizeTimerId(raw);\n timeoutIds.add(id);\n return id;\n },\n clearTimeout: (id) => {\n const raw = syntheticTimers.get(id) ?? id;\n timers.clearTimeout(raw);\n timeoutIds.delete(id);\n syntheticTimers.delete(id);\n },\n setInterval: (fn, ms) => {\n assertNotDisposed();\n assertTimer(ms);\n const id = normalizeTimerId(timers.setInterval(() => {\n try {\n fn();\n } catch (error) {\n reportCallbackError(\"interval\", error);\n throw error;\n }\n }, ms));\n intervalIds.add(id);\n return id;\n },\n clearInterval: (id) => {\n const raw = syntheticTimers.get(id) ?? id;\n timers.clearInterval(raw);\n intervalIds.delete(id);\n syntheticTimers.delete(id);\n },\n raf: (fn) => {\n assertNotDisposed();\n if (!policy.animation?.enabled) {\n throw new SlexKitRuntimeError(\"policy\", \"animation_disabled\", \"Animation access is disabled.\");\n }\n const id = raf.requestAnimationFrame((time) => {\n rafIds.delete(id);\n try {\n fn(time);\n } catch (error) {\n reportCallbackError(\"raf\", error);\n throw error;\n }\n });\n rafIds.add(id);\n return id;\n },\n cancelRaf: (id) => {\n raf.cancelAnimationFrame(id);\n rafIds.delete(id);\n },\n createCanvas: (width, height) => {\n assertCanvas(width, height);\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_unavailable\", \"Canvas is unavailable in this runtime.\");\n }\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.ceil(width);\n canvas.height = Math.ceil(height);\n ownedCanvases.add(canvas);\n countedCanvases.add(canvas);\n return canvas;\n },\n getCanvasContext: (canvas, contextId = \"2d\", options) => {\n assertNotDisposed();\n const canvasAccess = canvasPolicy(policy);\n assertCanvasDimensions(canvasAccess, canvas.width, canvas.height);\n assertCanvasContext(canvasAccess, contextId);\n countCanvas(canvas, canvasAccess);\n const context = canvas.getContext(contextId, options);\n if (!context) {\n throw new SlexKitRuntimeError(\"policy\", \"canvas_context_unavailable\", `Canvas context ${contextId} is unavailable.`);\n }\n return context;\n },\n onDispose: (fn) => {\n disposers.add(fn);\n },\n isTimeoutError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"timeout\",\n isNetworkError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"network\",\n isPolicyError: (error) => error instanceof SlexKitRuntimeError && error.kind === \"policy\",\n errorMessage\n };\n return {\n api,\n dispose: () => {\n if (disposed)\n return;\n disposed = true;\n for (const id of Array.from(timeoutIds))\n api.clearTimeout(id);\n for (const id of Array.from(intervalIds))\n api.clearInterval(id);\n for (const id of Array.from(rafIds))\n api.cancelRaf(id);\n for (const controller of Array.from(abortControllers))\n controller.abort();\n abortControllers.clear();\n for (const canvas of Array.from(ownedCanvases)) {\n if (canvas.isConnected)\n canvas.remove();\n }\n ownedCanvases.clear();\n countedCanvases.clear();\n for (const disposer of Array.from(disposers)) {\n try {\n disposer();\n } catch (error) {\n reportCallbackError(\"dispose\", error);\n }\n }\n disposers.clear();\n }\n };\n}\n// src/components/spec-helpers.ts\nvar SINCE = \"0.1.0\";\nfunction docs(type) {\n return {\n href: `/docs/components/${type}`,\n anchors: {\n api: `${type}-api-reference`,\n examples: `${type}-canonical-example`\n }\n };\n}\nfunction isSlexExpression(value) {\n return typeof value.namespace === \"string\" && typeof value.layout === \"object\" && value.layout !== null;\n}\nfunction example(type, propsOrSource, title = \"Basic usage\") {\n return {\n id: \"basic\",\n title,\n source: isSlexExpression(propsOrSource) ? {\n slex: propsOrSource.slex ?? SLEX_PROTOCOL_VERSION,\n ...propsOrSource\n } : {\n slex: SLEX_PROTOCOL_VERSION,\n namespace: `spec_${type.replaceAll(\"-\", \"_\")}_basic`,\n layout: {\n [`${type}:demo`]: propsOrSource\n }\n }\n };\n}\nvar semanticTones = [\"info\", \"success\", \"warning\", \"danger\", \"muted\"];\nvar inputState = [\"input\", \"slider\", \"select\", \"tabs\", \"radio-group\"];\nvar checkedState = [\"checkbox\"];\nvar enabledState = [\"switch\"];\nvar readableState = [\"stat\", \"text\", \"progress\", \"badge\", \"callout\", \"code-block\", \"divider\", \"link\", \"table\", \"section\"];\nfunction stateFor(type) {\n if (inputState.includes(type))\n return \"value\";\n if (checkedState.includes(type))\n return \"checked\";\n if (enabledState.includes(type))\n return \"enabled\";\n if (readableState.includes(type))\n return \"readable\";\n return \"none\";\n}\nfunction component(spec) {\n return {\n status: \"ready\",\n since: SINCE,\n docs: docs(spec.type),\n state: spec.state ?? stateFor(spec.type),\n ...spec\n };\n}\nvar childContent = {\n allowed: true,\n description: \"Nested component fields are rendered as child content in field order.\"\n};\nvar noChildren = {\n allowed: false,\n description: \"This component does not render nested child components.\"\n};\n\n// src/components/entries/accordion.spec.ts\nvar accordionSpec = component({\n type: \"accordion\",\n category: \"Disclosure\",\n title: \"Accordion\",\n summary: \"Expandable grouped panels.\",\n description: \"Use accordion to reveal one or more sections from a compact list of panels.\",\n props: {\n value: { type: \"string | string[]\", dynamic: true, description: \"Current expanded item value; use an array when multiple is true.\" },\n multiple: { type: \"boolean\", default: false, description: \"Allow multiple items to be expanded at the same time.\" },\n items: { type: \"array\", description: \"Panel definitions with value, label, content, and optional icon.\" },\n \"items[].icon\": { type: \"string\", description: \"Icon name shown before an item trigger label.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when expanded items change.\" }\n },\n children: noChildren,\n examples: [example(\"accordion\", {\n namespace: \"doc_accordion_typical\",\n layout: {\n \"accordion:faq\": {\n multiple: true,\n value: [\n \"install\"\n ],\n items: [\n {\n value: \"install\",\n label: \"Install\",\n icon: \"download-simple\",\n content: \"Prepare dependencies.\"\n },\n {\n value: \"review\",\n label: \"Review\",\n icon: \"check-circle\",\n content: \"Check the result.\"\n },\n {\n value: \"ship\",\n label: \"Ship\",\n icon: \"rocket-launch\",\n content: \"Publish the change.\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/badge.spec.ts\nvar badgeSpec = component({\n type: \"badge\",\n category: \"Content\",\n title: \"Badge\",\n summary: \"Compact label for status or classification.\",\n description: \"Use badge to annotate nearby content with a short semantic label.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Badge text.\" },\n text: { type: \"string\", dynamic: true, description: \"Alias for label.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the badge label.\" },\n tone: { type: \"string\", values: semanticTones, default: \"info\", description: \"Semantic tone applied to the badge.\" },\n variant: { type: \"string\", values: semanticTones, description: \"Alias for tone.\" }\n },\n children: noChildren,\n examples: [example(\"badge\", {\n namespace: \"doc_badge_typical\",\n layout: {\n \"row:badges\": {\n \"badge:ready\": {\n label: \"ready\",\n icon: \"check-circle\",\n tone: \"success\"\n },\n \"badge:pending\": {\n label: \"pending\",\n tone: \"warning\"\n },\n \"badge:info\": {\n label: \"info\",\n tone: \"info\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/button.spec.ts\nvar buttonSpec = component({\n type: \"button\",\n category: \"Action\",\n title: \"Button\",\n summary: \"Action trigger.\",\n description: \"Use button for explicit actions in interactive SlexKit layouts.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Visible button text and accessible name.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n iconOnly: { type: \"boolean\", default: false, description: \"Show only the icon while retaining label as the accessible name.\" },\n variant: { type: \"string\", values: [\"primary\", \"secondary\", \"danger\", \"ghost\"], default: \"primary\", description: \"Semantic action variant.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the action.\" },\n href: { type: \"string\", dynamic: true, description: \"Render the button surface as a link to this URL.\" },\n target: { type: \"string\", description: \"Link target used when href is present.\" },\n title: { type: \"string\", dynamic: true, description: \"Tooltip and accessible-label fallback.\" },\n selected: { type: \"boolean\", dynamic: true, description: \"Render the icon in its selected visual state.\" },\n active: { type: \"boolean\", dynamic: true, description: \"Render the icon in its active visual state.\" },\n pressed: { type: \"boolean\", dynamic: true, description: \"Expose pressed state and render the selected icon style.\" },\n onclick: { type: \"write-expression\", description: \"Write expression invoked when the button is clicked.\" }\n },\n children: noChildren,\n examples: [example(\"button\", {\n namespace: \"doc_button_typical\",\n layout: {\n \"row:actions\": {\n \"button:save\": {\n label: \"Save\",\n icon: \"floppy-disk\",\n variant: \"primary\"\n },\n \"button:cancel\": {\n label: \"Cancel\",\n variant: \"secondary\"\n },\n \"button:delete\": {\n label: \"Delete\",\n variant: \"danger\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/callout.spec.ts\nvar calloutSpec = component({\n type: \"callout\",\n category: \"Content\",\n title: \"Callout\",\n summary: \"Highlighted contextual message.\",\n description: \"Use callout for notes, warnings, and other contextual blocks.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Callout title.\" },\n heading: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n text: { type: \"string\", dynamic: true, description: \"Callout body text.\" },\n message: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n tone: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Semantic tone for the callout.\" }\n },\n children: childContent,\n examples: [example(\"callout\", {\n namespace: \"doc_callout_typical\",\n layout: {\n \"callout:notice\": {\n tone: \"info\",\n title: \"Notice\",\n icon: \"info\",\n text: \"Use callout for information that should stand out.\"\n }\n }\n })]\n});\n\n// src/components/entries/card.spec.ts\nvar cardSpec = component({\n type: \"card\",\n category: \"Layout\",\n title: \"Card\",\n summary: \"Bordered grouping container.\",\n description: \"Use card to group related content on a bounded surface.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Card title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n tone: { type: \"string\", values: semanticTones, description: \"Optional semantic tone for the card surface.\" }\n },\n children: childContent,\n examples: [example(\"card\", {\n namespace: \"doc_card_typical\",\n layout: {\n \"card:metrics\": {\n title: \"Metrics\",\n icon: \"chart-bar\",\n \"grid:items\": {\n columns: 2,\n \"stat:requests\": {\n label: \"Requests\",\n value: \"1.2k\",\n unit: \"/min\"\n },\n \"stat:latency\": {\n label: \"Latency\",\n value: \"42\",\n unit: \"ms\"\n }\n }\n }\n }\n })]\n});\n\n// src/components/entries/checkbox.spec.ts\nvar checkboxSpec = component({\n type: \"checkbox\",\n category: \"Input\",\n title: \"Checkbox\",\n summary: \"Boolean checkbox input.\",\n description: \"Use checkbox for binary choices that can be toggled independently.\",\n props: {\n checked: { type: \"boolean\", default: false, dynamic: true, description: \"Checked state.\" },\n label: { type: \"string\", dynamic: true, description: \"Checkbox label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the visible label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the checkbox.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when checked state changes.\" }\n },\n children: noChildren,\n examples: [example(\"checkbox\", {\n namespace: \"doc_checkbox_typical\",\n layout: {\n \"checkbox:agree\": {\n checked: true,\n label: \"I agree\",\n icon: \"handshake\"\n }\n }\n })]\n});\n\n// src/components/entries/code-block.spec.ts\nvar codeBlockSpec = component({\n type: \"code-block\",\n category: \"Content\",\n title: \"Code Block\",\n summary: \"Formatted code or log block.\",\n description: \"Use code-block for static code samples, configuration snippets, and logs.\",\n props: {\n code: { type: \"string\", dynamic: true, description: \"Code text content.\" },\n source: { type: \"string\", dynamic: true, description: \"Alias for code.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for code.\" },\n language: { type: \"string\", description: \"Language label.\" },\n title: { type: \"string\", description: \"Code block title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n lineNumbers: { type: \"boolean\", default: true, description: \"Show line numbers.\" }\n },\n children: noChildren,\n examples: [example(\"code-block\", {\n namespace: \"doc_code_block_typical\",\n layout: {\n \"code-block:config\": {\n title: \"Config\",\n icon: \"code\",\n language: \"js\",\n code: \"export const enabled = true;\"\n }\n }\n })]\n});\n\n// src/components/entries/collapsible.spec.ts\nvar collapsibleSpec = component({\n type: \"collapsible\",\n category: \"Disclosure\",\n title: \"Collapsible\",\n summary: \"Single expandable region.\",\n description: \"Use collapsible to show or hide one related content region.\",\n props: {\n open: { type: \"boolean\", default: false, dynamic: true, description: \"Expanded state.\" },\n trigger: { type: \"string\", dynamic: true, description: \"Trigger button text.\" },\n icon: { type: \"string\", description: \"Icon name shown before trigger text.\" },\n content: { type: \"string\", dynamic: true, description: \"Static body content.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when open state changes.\" }\n },\n children: childContent,\n examples: [example(\"collapsible\", {\n namespace: \"doc_collapsible_typical\",\n layout: {\n \"collapsible:more\": {\n open: true,\n trigger: \"Details\",\n icon: \"caret-circle-down\",\n content: \"This secondary content can be collapsed.\"\n }\n }\n })]\n});\n\n// src/components/entries/column.spec.ts\nvar columnSpec = component({\n type: \"column\",\n category: \"Layout\",\n title: \"Column\",\n summary: \"Vertical layout container.\",\n description: \"Use column to stack child components vertically in field order.\",\n props: {},\n children: childContent,\n examples: [example(\"column\", {\n namespace: \"doc_column_typical\",\n layout: {\n \"column:form\": {\n \"input:name\": {\n placeholder: \"Name\"\n },\n \"input:email\": {\n placeholder: \"Email\"\n },\n \"button:save\": {\n label: \"Save\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/divider.spec.ts\nvar dividerSpec = component({\n type: \"divider\",\n category: \"Content\",\n title: \"Divider\",\n summary: \"Visual separator.\",\n description: \"Use divider to separate related regions, optionally with a label.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Text shown in the divider.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" }\n },\n children: noChildren,\n examples: [example(\"divider\", {\n namespace: \"doc_divider_typical\",\n layout: {\n \"column:content\": {\n \"text:top\": {\n text: \"Above\"\n },\n \"divider:line\": {\n label: \"Divider\",\n icon: \"flag\"\n },\n \"text:bottom\": {\n text: \"Below\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/formula.spec.ts\nvar formulaSpec = component({\n type: \"formula\",\n category: \"Display\",\n title: \"Formula\",\n summary: \"Reactive KaTeX formula display.\",\n description: \"Use formula to render SlexKit state and computed values through KaTeX.\",\n props: {\n tex: { type: \"string\", dynamic: true, description: \"KaTeX source to render.\" },\n formula: { type: \"string\", dynamic: true, description: \"Alias for tex.\" },\n value: { type: \"string\", dynamic: true, description: \"Alias for tex.\" },\n displayMode: { type: \"boolean\", default: true, description: \"Render as display math when true; inline math when false.\" },\n display: { type: \"boolean\", default: true, description: \"Alias for displayMode.\" },\n block: { type: \"boolean\", default: true, description: \"Alias for displayMode.\" }\n },\n children: noChildren,\n examples: [example(\"formula\", {\n namespace: \"doc_formula_typical\",\n g: {\n r: 1e4,\n c: 100,\n fc: 159.15\n },\n layout: {\n \"formula:cutoff\": {\n $tex: \"'f_c = \\\\\\\\frac{1}{2\\\\\\\\pi RC} = ' + g.fc + '\\\\\\\\text{ Hz}'\"\n }\n }\n })]\n});\n\n// src/components/entries/grid.spec.ts\nvar gridSpec = component({\n type: \"grid\",\n category: \"Layout\",\n title: \"Grid\",\n summary: \"Responsive grid container.\",\n description: \"Use grid to arrange child components in responsive columns.\",\n props: {\n columns: { type: \"number\", default: 1, dynamic: true, description: \"Base column count.\" },\n smColumns: { type: \"number\", dynamic: true, description: \"Column count at the small breakpoint.\" },\n mdColumns: { type: \"number\", dynamic: true, description: \"Column count at the medium breakpoint.\" },\n lgColumns: { type: \"number\", dynamic: true, description: \"Column count at the large breakpoint.\" },\n xlColumns: { type: \"number\", dynamic: true, description: \"Column count at the extra-large breakpoint.\" },\n gap: { type: \"string\", dynamic: true, description: \"Spacing between grid items.\" }\n },\n children: childContent,\n examples: [example(\"grid\", {\n namespace: \"doc_grid_typical\",\n layout: {\n \"grid:stats\": {\n columns: 1,\n mdColumns: 3,\n \"stat:a\": {\n label: \"Requests\",\n value: \"1.2k\"\n },\n \"stat:b\": {\n label: \"Success\",\n value: \"98%\"\n },\n \"stat:c\": {\n label: \"Errors\",\n value: \"3\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/icon.spec.ts\nvar iconSpec = component({\n type: \"icon\",\n category: \"Component\",\n title: \"Icon\",\n summary: \"Shared icon field capability.\",\n description: \"Icon is a shared field capability, not an independent icon component type.\",\n props: {\n icon: { type: \"string\", description: \"Icon name resolved through the global icon manager.\" },\n iconOnly: { type: \"boolean\", description: \"Render only the icon while retaining an accessible label where supported.\" },\n \"items[].icon\": { type: \"string\", description: \"Accordion item trigger icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Select or radio option icon.\" },\n \"columns[].icon\": { type: \"string\", description: \"Table column header icon.\" },\n \"tabs[].icon\": { type: \"string\", description: \"Tab trigger icon.\" },\n \"tabs[].iconOnly\": { type: \"boolean\", description: \"Tab trigger icon-only mode.\" }\n },\n children: noChildren,\n examples: [example(\"button\", { label: \"Settings\", icon: \"gear-six\", iconOnly: true, variant: \"ghost\" }, \"Icon field usage\")]\n});\n\n// src/components/entries/input.spec.ts\nvar inputSpec = component({\n type: \"input\",\n category: \"Input\",\n title: \"Input\",\n summary: \"Text or engineering-value input.\",\n description: \"Use input for editable text and engineering numeric values.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current input value.\" },\n label: { type: \"string\", dynamic: true, description: \"Input label.\" },\n unit: { type: \"string\", dynamic: true, description: \"Trailing unit text.\" },\n description: { type: \"string\", dynamic: true, description: \"Assistive description below the input.\" },\n help: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n hint: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n error: { type: \"string\", dynamic: true, description: \"Error text shown below the input and linked with aria-describedby.\" },\n errorMessage: { type: \"string\", dynamic: true, description: \"Alias for error.\" },\n invalid: { type: \"boolean\", default: false, dynamic: true, description: \"Mark the input as invalid with aria-invalid and error styling.\" },\n placeholder: { type: \"string\", description: \"Placeholder text for empty values.\" },\n type: { type: \"string\", default: \"text\", description: \"Input value kind; use engineering for parsed engineering values.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable editing.\" },\n readonly: { type: \"boolean\", default: false, dynamic: true, description: \"Make the input read-only.\" },\n readOnly: { type: \"boolean\", default: false, dynamic: true, description: \"Alias for readonly.\" },\n required: { type: \"boolean\", default: false, dynamic: true, description: \"Mark the input as required.\" },\n id: { type: \"string\", description: \"Native input id; defaults to a stable id derived from the component name.\" },\n name: { type: \"string\", description: \"Native input name attribute.\" },\n min: { type: \"string | number\", dynamic: true, description: \"Minimum value used by numeric input controls.\" },\n max: { type: \"string | number\", dynamic: true, description: \"Maximum value used by numeric input controls.\" },\n step: { type: \"string | number\", dynamic: true, description: \"Step size used by numeric input controls.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the value changes.\" }\n },\n children: noChildren,\n examples: [example(\"input\", {\n namespace: \"doc_input_typical\",\n layout: {\n \"input:name\": {\n label: \"Project\",\n value: \"SlexKit\",\n placeholder: \"Enter name\",\n description: \"Visible labels keep form fields scannable.\"\n }\n }\n })]\n});\n\n// src/components/entries/link.spec.ts\nvar linkSpec = component({\n type: \"link\",\n category: \"Content\",\n title: \"Link\",\n summary: \"Inline navigation link.\",\n description: \"Use link to navigate to another page or resource.\",\n props: {\n href: { type: \"string\", description: \"Target URL.\" },\n text: { type: \"string\", dynamic: true, description: \"Visible link text.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n icon: { type: \"string\", description: \"Icon name shown before link text.\" },\n target: { type: \"string\", description: \"Native link target attribute.\" },\n variant: { type: \"string\", values: [\"default\", \"muted\"], default: \"default\", description: \"Link visual variant.\" }\n },\n children: noChildren,\n examples: [example(\"link\", {\n namespace: \"doc_link_typical\",\n layout: {\n \"column:links\": {\n \"link:docs\": {\n href: \"/components\",\n icon: \"arrow-square-out\",\n text: \"View components\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/playground.spec.ts\nvar playgroundSpec = component({\n type: \"playground\",\n category: \"Tooling\",\n title: \"Playground\",\n summary: \"Interactive source preview.\",\n description: \"Use playground in documentation surfaces to render editable SlexKit or Markdown examples.\",\n props: {\n source: { type: \"object | string\", description: \"SlexKit or Markdown source to preview.\" },\n sourceType: { type: \"string\", values: [\"slex\", \"markdown\", \"auto-markdown\"], default: \"slex\", description: \"Source parser mode.\" },\n title: { type: \"string\", description: \"Playground title.\" },\n previewAlign: { type: \"string\", values: [\"center\", \"start\"], default: \"center\", description: \"Vertical preview alignment in render mode.\" },\n alignPreview: { type: \"string\", values: [\"center\", \"start\"], description: \"Alias for previewAlign.\" },\n previewPlacement: { type: \"string\", values: [\"center\", \"start\"], description: \"Alias for previewAlign.\" },\n previewMinHeight: { type: \"string\", description: \"Minimum preview area height.\" },\n previewMaxWidth: { type: \"string\", description: \"Maximum preview content width.\" },\n themeToggle: { type: \"boolean\", default: false, description: \"Show the theme toggle action.\" },\n showThemeToggle: { type: \"boolean\", default: false, description: \"Alias for themeToggle.\" },\n enableThemeToggle: { type: \"boolean\", default: false, description: \"Alias for themeToggle.\" },\n themeLabel: { type: \"string\", description: \"Accessible label for the theme toggle action.\" },\n themeToggleLabel: { type: \"string\", description: \"Alias for themeLabel.\" },\n sourceTypeLabel: { type: \"string\", description: \"Accessible label for the source type selector.\" },\n copyLabel: { type: \"string\", description: \"Accessible label for the copy source action.\" },\n openWebLabel: { type: \"string\", description: \"Accessible label for opening the source in the standalone playground.\" },\n webUrl: { type: \"string\", description: \"Standalone playground URL used by the open action.\" },\n playgroundUrl: { type: \"string\", description: \"Alias for webUrl.\" }\n },\n children: noChildren,\n examples: [example(\"playground\", {\n namespace: \"doc_playground_typical\",\n layout: {\n \"playground:demo\": {\n title: \"Stat Playground\",\n previewMinHeight: \"180px\",\n source: {\n namespace: \"inner_stat_demo\",\n layout: {\n \"stat:value\": {\n label: \"Requests\",\n value: \"1.2k\",\n unit: \"/min\"\n }\n }\n }\n }\n }\n })]\n});\n\n// src/components/entries/progress.spec.ts\nvar progressSpec = component({\n type: \"progress\",\n category: \"Feedback\",\n title: \"Progress\",\n summary: \"Progress bar.\",\n description: \"Use progress to show completion as a percentage.\",\n props: {\n value: { type: \"number\", default: 0, dynamic: true, description: \"Progress percentage from 0 to 100.\" },\n label: { type: \"string\", dynamic: true, description: \"Progress label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n indeterminate: { type: \"boolean\", default: false, dynamic: true, description: \"Render an indeterminate progress state without aria-valuenow.\" }\n },\n children: noChildren,\n examples: [example(\"progress\", {\n namespace: \"doc_progress_typical\",\n layout: {\n \"progress:build\": {\n label: \"Build progress\",\n icon: \"gear-six\",\n value: 64\n }\n }\n })]\n});\n\n// src/components/entries/radio-group.spec.ts\nvar radioGroupSpec = component({\n type: \"radio-group\",\n category: \"Input\",\n title: \"Radio Group\",\n summary: \"Single-choice option group.\",\n description: \"Use radio-group for one-of-many choices.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current selected value.\" },\n label: { type: \"string\", dynamic: true, description: \"Group label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the group label.\" },\n options: { type: \"array\", description: \"Options with label, value, and optional icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Icon name shown before a single option label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable every radio option in the group.\" },\n orientation: { type: \"string\", values: [\"vertical\", \"horizontal\"], default: \"vertical\", description: \"Radio option layout direction.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n name: { type: \"string\", description: \"Native radio group name shared by options.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when selection changes.\" }\n },\n children: noChildren,\n examples: [example(\"radio-group\", {\n namespace: \"doc_radio_group_typical\",\n layout: {\n \"radio-group:mode\": {\n label: \"Mode\",\n icon: \"sliders-horizontal\",\n value: \"auto\",\n options: [\n {\n label: \"Auto\",\n value: \"auto\",\n icon: \"sparkle\"\n },\n {\n label: \"Manual\",\n value: \"manual\",\n icon: \"wrench\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/row.spec.ts\nvar rowSpec = component({\n type: \"row\",\n category: \"Layout\",\n title: \"Row\",\n summary: \"Horizontal layout container.\",\n description: \"Use row to place child components horizontally in field order.\",\n props: {\n justify: { type: \"string\", values: [\"start\", \"center\", \"end\", \"space-between\", \"space-around\"], default: \"start\", description: \"Main-axis distribution.\" },\n align: { type: \"string\", values: [\"start\", \"center\", \"end\", \"baseline\", \"stretch\"], default: \"center\", description: \"Cross-axis alignment.\" },\n gap: { type: \"string\", dynamic: true, description: \"Spacing between children.\" }\n },\n children: childContent,\n examples: [example(\"row\", {\n namespace: \"doc_row_typical\",\n layout: {\n \"row:toolbar\": {\n justify: \"space-between\",\n \"text:title\": {\n text: \"Runtime status\"\n },\n \"button:refresh\": {\n label: \"Refresh\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/section.spec.ts\nvar sectionSpec = component({\n type: \"section\",\n category: \"Content\",\n title: \"Section\",\n summary: \"Page section with optional heading chrome.\",\n description: \"Use section to group page content with title, subtitle, and optional action link.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Section title.\" },\n icon: { type: \"string\", description: \"Icon name shown before the title.\" },\n eyebrow: { type: \"string\", dynamic: true, description: \"Small label above the title.\" },\n subtitle: { type: \"string\", dynamic: true, description: \"Subtitle text below the title.\" },\n actionLabel: { type: \"string\", dynamic: true, description: \"Optional action link label.\" },\n actionHref: { type: \"string\", description: \"Optional action link target.\" }\n },\n children: childContent,\n examples: [example(\"section\", {\n namespace: \"doc_section_typical\",\n layout: {\n \"section:overview\": {\n eyebrow: \"Dashboard\",\n title: \"Runtime overview\",\n icon: \"chart-bar\",\n subtitle: \"This section groups the most important state.\",\n \"stat:latency\": {\n label: \"Latency\",\n value: \"42\",\n unit: \"ms\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/select.spec.ts\nvar selectSpec = component({\n type: \"select\",\n category: \"Input\",\n title: \"Select\",\n summary: \"Dropdown selection input.\",\n description: \"Use select for compact single-choice selection from an option list.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Select label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the top label.\" },\n value: { type: \"string\", dynamic: true, description: \"Current selected value.\" },\n options: { type: \"array\", description: \"Options with label, value, and optional icon.\" },\n \"options[].icon\": { type: \"string\", description: \"Icon name shown before an option label.\" },\n placeholder: { type: \"string\", description: \"Placeholder shown when no value is selected.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the select trigger and native select.\" },\n required: { type: \"boolean\", default: false, dynamic: true, description: \"Require a non-placeholder value in the native select.\" },\n variant: { type: \"string\", values: [\"default\", \"toolbar\"], default: \"default\", description: \"Select surface variant.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when selection changes.\" }\n },\n children: noChildren,\n examples: [example(\"select\", {\n namespace: \"doc_select_typical\",\n layout: {\n \"select:env\": {\n label: \"Environment\",\n icon: \"server\",\n value: \"prod\",\n options: [\n {\n label: \"Development\",\n value: \"dev\",\n icon: \"code\"\n },\n {\n label: \"Production\",\n value: \"prod\",\n icon: \"rocket-launch\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/slider.spec.ts\nvar sliderSpec = component({\n type: \"slider\",\n category: \"Input\",\n title: \"Slider\",\n summary: \"Numeric range input.\",\n description: \"Use slider for bounded numeric adjustments such as volume, brightness, or thresholds.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Slider label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n value: { type: \"number\", default: 0, dynamic: true, description: \"Current numeric value.\" },\n min: { type: \"number\", default: 0, dynamic: true, description: \"Minimum value.\" },\n max: { type: \"number\", default: 100, dynamic: true, description: \"Maximum value.\" },\n step: { type: \"number\", default: 1, dynamic: true, description: \"Step interval.\" },\n unit: { type: \"string\", dynamic: true, description: \"Unit shown after the value.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the range input.\" },\n orientation: { type: \"string\", values: [\"horizontal\", \"vertical\"], default: \"horizontal\", description: \"Slider orientation metadata used for styling.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the value changes.\" }\n },\n children: noChildren,\n examples: [example(\"slider\", {\n namespace: \"doc_slider_typical\",\n layout: {\n \"slider:volume\": {\n label: \"Volume\",\n icon: \"speaker-high\",\n value: 42,\n min: 0,\n max: 100,\n step: 1,\n unit: \"%\"\n }\n }\n })]\n});\n\n// src/components/entries/stat.spec.ts\nvar statSpec = component({\n type: \"stat\",\n category: \"Display\",\n title: \"Stat\",\n summary: \"Metric display.\",\n description: \"Use stat to present a labeled metric value with optional unit and semantic tone.\",\n props: {\n label: { type: \"string\", dynamic: true, description: \"Metric label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the label.\" },\n value: { type: \"string | number\", dynamic: true, description: \"Metric value.\" },\n unit: { type: \"string\", dynamic: true, description: \"Unit shown after the value.\" },\n tone: { type: \"string\", values: semanticTones, description: \"Optional semantic tone.\" },\n animateInitial: { type: \"boolean\", default: false, description: \"Animate the initial rendered value.\" }\n },\n children: noChildren,\n examples: [example(\"stat\", {\n namespace: \"doc_stat_typical\",\n layout: {\n \"grid:stats\": {\n columns: 2,\n \"stat:requests\": {\n label: \"Requests\",\n icon: \"activity\",\n value: \"1.2k\",\n unit: \"/min\"\n },\n \"stat:success\": {\n label: \"Success\",\n icon: \"check-circle\",\n value: \"98.4\",\n unit: \"%\",\n tone: \"success\"\n }\n }\n }\n })]\n});\n\n// src/components/entries/submit.spec.ts\nvar submitSpec = component({\n type: \"submit\",\n category: \"Action\",\n title: \"Submit\",\n summary: \"ToolHost submit and ignore controls.\",\n description: \"Use submit inside tool templates to return selected state fields to the host.\",\n props: {\n submitLabel: { type: \"string\", default: \"Submit\", description: \"Submit button text.\" },\n ignoreLabel: { type: \"string\", default: \"Ignore\", description: \"Ignore button text.\" },\n returnKeys: { type: \"string[]\", description: \"State field paths returned to ToolHost.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable submit action.\" }\n },\n children: noChildren,\n examples: [example(\"submit\", {\n namespace: \"doc_submit_typical\",\n layout: {\n \"column:tool\": {\n \"input:title\": {\n value: \"Release note\",\n placeholder: \"Title\"\n },\n \"submit:done\": {\n submitLabel: \"Submit\",\n ignoreLabel: \"Ignore\",\n returnKeys: [\n \"title\"\n ]\n }\n }\n }\n })]\n});\n\n// src/components/entries/switch.spec.ts\nvar switchSpec = component({\n type: \"switch\",\n category: \"Input\",\n title: \"Switch\",\n summary: \"Boolean switch input.\",\n description: \"Use switch for an on/off setting.\",\n props: {\n enabled: { type: \"boolean\", default: false, dynamic: true, description: \"Enabled state.\" },\n label: { type: \"string\", dynamic: true, description: \"Switch label.\" },\n icon: { type: \"string\", description: \"Icon name shown before the visible label.\" },\n disabled: { type: \"boolean\", default: false, dynamic: true, description: \"Disable the switch.\" },\n haptic: { type: \"boolean\", default: true, description: \"Enable vibration feedback on supported devices.\" },\n haptics: { type: \"boolean\", default: true, description: \"Alias for haptic.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when enabled state changes.\" }\n },\n children: noChildren,\n examples: [example(\"switch\", {\n namespace: \"doc_switch_typical\",\n layout: {\n \"switch:feature\": {\n enabled: true,\n label: \"Enable sync\",\n icon: \"arrows-clockwise\"\n }\n }\n })]\n});\n\n// src/components/entries/table.spec.ts\nvar tableSpec = component({\n type: \"table\",\n category: \"Data\",\n title: \"Table\",\n summary: \"Simple data table.\",\n description: \"Use table to render rows of keyed data against a column definition.\",\n props: {\n columns: { type: \"array\", description: \"Column definitions with key, label, and optional icon.\" },\n \"columns[].icon\": { type: \"string\", description: \"Icon name shown before a column label.\" },\n rows: { type: \"array\", description: \"Row data objects keyed by column key.\" },\n items: { type: \"array\", description: \"Alias for rows.\" }\n },\n children: noChildren,\n examples: [example(\"table\", {\n namespace: \"doc_table_typical\",\n layout: {\n \"table:routes\": {\n columns: [\n {\n key: \"name\",\n label: \"Name\",\n icon: \"text-t\"\n },\n {\n key: \"status\",\n label: \"Status\",\n icon: \"check-circle\"\n }\n ],\n rows: [\n {\n name: \"Parse\",\n status: \"ready\"\n },\n {\n name: \"Publish\",\n status: \"pending\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/tabs.spec.ts\nvar tabsSpec = component({\n type: \"tabs\",\n category: \"Navigation\",\n title: \"Tabs\",\n summary: \"Tabbed view switcher.\",\n description: \"Use tabs to switch between named content panels.\",\n props: {\n value: { type: \"string\", dynamic: true, description: \"Current active tab value.\" },\n tabs: { type: \"array\", description: \"Tab definitions with value, label, content, icon, and iconOnly.\" },\n \"tabs[].icon\": { type: \"string\", description: \"Icon name shown before a tab trigger label.\" },\n \"tabs[].iconOnly\": { type: \"boolean\", description: \"Show only the tab icon while retaining label as accessible text.\" },\n orientation: { type: \"string\", values: [\"horizontal\", \"vertical\"], default: \"horizontal\", description: \"Tab list orientation.\" },\n onchange: { type: \"write-expression\", description: \"Write expression invoked when the active tab changes.\" }\n },\n children: noChildren,\n examples: [example(\"tabs\", {\n namespace: \"doc_tabs_typical\",\n layout: {\n \"tabs:main\": {\n value: \"overview\",\n tabs: [\n {\n value: \"overview\",\n label: \"Overview\"\n },\n {\n value: \"settings\",\n label: \"Settings\"\n }\n ]\n }\n }\n })]\n});\n\n// src/components/entries/text.spec.ts\nvar textSpec = component({\n type: \"text\",\n category: \"Display\",\n title: \"Text\",\n summary: \"Plain text display.\",\n description: \"Use text for short static or dynamic copy inside SlexKit layouts.\",\n props: {\n text: { type: \"string\", dynamic: true, description: \"Displayed text.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for text.\" },\n variant: { type: \"string\", values: [\"default\", \"muted\"], default: \"default\", description: \"Text visual variant.\" },\n color: { type: \"string\", dynamic: true, description: \"Optional CSS color for controlled previews.\" },\n size: { type: \"string | number\", dynamic: true, description: \"Optional font size. Numbers are treated as px.\" },\n class: { type: \"string\", description: \"Additional host-controlled CSS class.\" }\n },\n children: noChildren,\n examples: [example(\"text\", {\n namespace: \"doc_text_typical\",\n layout: {\n \"text:status\": {\n text: \"System is healthy\"\n }\n }\n })]\n});\n\n// src/components/entries/toast.spec.ts\nvar toastSpec = component({\n type: \"toast\",\n category: \"Feedback\",\n title: \"Toast\",\n summary: \"Transient notification.\",\n description: \"Use toast to show an inline notification with semantic status.\",\n props: {\n title: { type: \"string\", dynamic: true, description: \"Toast title.\" },\n heading: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n label: { type: \"string\", dynamic: true, description: \"Alias for title.\" },\n icon: { type: \"string\", description: \"Icon name shown at the left of the toast.\" },\n description: { type: \"string\", dynamic: true, description: \"Toast body text.\" },\n text: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n message: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n content: { type: \"string\", dynamic: true, description: \"Alias for description.\" },\n type: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Semantic notification type.\" },\n tone: { type: \"string\", values: [\"info\", \"success\", \"warning\", \"danger\"], default: \"info\", description: \"Alias for type.\" },\n duration: { type: \"number\", description: \"Auto-hide delay in milliseconds.\" },\n dismissable: { type: \"boolean\", default: true, description: \"Show a close button.\" },\n dismissible: { type: \"boolean\", default: true, description: \"Alias for dismissable.\" },\n closeLabel: { type: \"string\", default: \"Close notification\", description: \"Accessible close button label.\" },\n closeAriaLabel: { type: \"string\", description: \"Alias for closeLabel.\" }\n },\n children: noChildren,\n examples: [example(\"toast\", {\n namespace: \"doc_toast_typical\",\n layout: {\n \"toast:saved\": {\n type: \"success\",\n title: \"Saved\",\n icon: \"check-circle\",\n description: \"Changes have been written.\"\n }\n }\n })]\n});\n\n// src/components/entries/specs.ts\nvar componentSpecs = [\n accordionSpec,\n badgeSpec,\n buttonSpec,\n calloutSpec,\n cardSpec,\n checkboxSpec,\n codeBlockSpec,\n collapsibleSpec,\n columnSpec,\n dividerSpec,\n formulaSpec,\n gridSpec,\n iconSpec,\n inputSpec,\n linkSpec,\n playgroundSpec,\n progressSpec,\n radioGroupSpec,\n rowSpec,\n sectionSpec,\n selectSpec,\n sliderSpec,\n statSpec,\n submitSpec,\n switchSpec,\n tableSpec,\n tabsSpec,\n textSpec,\n toastSpec\n];\n\n// src/components/spec-registry.ts\nvar publicComponentTypes = componentSpecs.map((spec) => spec.type);\nvar componentSpecByType = new Map(componentSpecs.map((spec) => [spec.type, spec]));\n\n// src/engine/capabilities.ts\nvar slexkitStdlibDocs = [\n {\n name: \"math\",\n summary: \"Small numeric helpers for common interactive calculations.\",\n functions: [\n { name: \"std.math.clamp\", signature: \"clamp(value, min, max)\", summary: \"Clamp a number into a range.\", pure: true, example: \"std.math.clamp(g.score, 0, 100)\" },\n { name: \"std.math.round\", signature: \"round(value, digits = 0)\", summary: \"Round with a fixed number of decimal digits.\", pure: true, example: \"std.math.round(g.latency, 1)\" },\n { name: \"std.math.safeDivide\", signature: \"safeDivide(numerator, denominator, fallback = 0)\", summary: \"Divide with a fallback for zero or invalid denominators.\", pure: true, example: \"std.math.safeDivide(g.used, g.total, 0)\" },\n { name: \"std.math.percent\", signature: \"percent(part, total, digits = 1)\", summary: \"Return part / total as a percentage number.\", pure: true, example: \"std.math.percent(g.done, g.total, 1)\" },\n { name: \"std.math.lerp\", signature: \"lerp(start, end, t)\", summary: \"Linear interpolation.\", pure: true, example: \"std.math.lerp(0, 100, g.progress)\" }\n ]\n },\n {\n name: \"stats\",\n summary: \"Finite-number aggregations for arrays.\",\n functions: [\n { name: \"std.stats.sum\", signature: \"sum(values)\", summary: \"Sum finite numeric values. Empty arrays return 0.\", pure: true, example: \"std.stats.sum(g.samples)\" },\n { name: \"std.stats.mean\", signature: \"mean(values)\", summary: \"Average finite numeric values. Empty arrays return NaN.\", pure: true, example: \"std.stats.mean(g.samples)\" },\n { name: \"std.stats.min\", signature: \"min(values)\", summary: \"Minimum finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.min(g.samples)\" },\n { name: \"std.stats.max\", signature: \"max(values)\", summary: \"Maximum finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.max(g.samples)\" },\n { name: \"std.stats.median\", signature: \"median(values)\", summary: \"Median finite numeric value. Empty arrays return NaN.\", pure: true, example: \"std.stats.median(g.samples)\" }\n ]\n },\n {\n name: \"format\",\n summary: \"Deterministic display formatting with en-US defaults.\",\n functions: [\n { name: \"std.format.fixed\", signature: \"fixed(value, digits = 2)\", summary: \"Format a number with fixed decimal places.\", pure: true, example: \"std.format.fixed(g.voltage, 3)\" },\n { name: \"std.format.number\", signature: \"number(value, digits = 0, locale = 'en-US')\", summary: \"Locale number formatting.\", pure: true, example: \"std.format.number(g.requests)\" },\n { name: \"std.format.compact\", signature: \"compact(value, digits = 1, locale = 'en-US')\", summary: \"Compact number formatting.\", pure: true, example: \"std.format.compact(g.users)\" },\n { name: \"std.format.percent\", signature: \"percent(ratio, digits = 1)\", summary: \"Format a ratio as a percentage string.\", pure: true, example: \"std.format.percent(g.done / g.total, 1)\" },\n { name: \"std.format.currency\", signature: \"currency(value, currency = 'USD', locale = 'en-US')\", summary: \"Format a currency value.\", pure: true, example: \"std.format.currency(g.revenue, 'USD')\" }\n ]\n },\n {\n name: \"units\",\n summary: \"Small unit display helpers for common dashboards.\",\n functions: [\n { name: \"std.units.withUnit\", signature: \"withUnit(value, unit, digits = 2)\", summary: \"Format a value with a unit suffix.\", pure: true, example: \"std.units.withUnit(g.power, 'W', 1)\" },\n { name: \"std.units.bytes\", signature: \"bytes(value, digits = 1)\", summary: \"Format bytes as B, KB, MB, GB, TB, or PB.\", pure: true, example: \"std.units.bytes(g.payloadBytes)\" },\n { name: \"std.units.duration\", signature: \"duration(ms, digits = 1)\", summary: \"Format milliseconds as ms, s, min, or h.\", pure: true, example: \"std.units.duration(g.elapsedMs)\" },\n { name: \"std.units.si\", signature: \"si(value, unit = '', digits = 2)\", summary: \"Format with SI prefixes.\", pure: true, example: \"std.units.si(g.frequency, 'Hz', 2)\" }\n ]\n }\n];\nvar slexkitRuntimeCapabilities = [\n { name: \"api.get\", policy: \"network\", signature: \"get(url, options)\", summary: \"Policy-gated GET request.\", example: \"await api.get('https://api.example.com/status')\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.post\", policy: \"network\", signature: \"post(url, body, options)\", summary: \"Policy-gated POST request.\", example: \"await api.post('https://api.example.com/items', { ok: true })\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.fetch\", policy: \"network\", signature: \"fetch(url, options)\", summary: \"Policy-gated GET or POST request.\", example: \"await api.fetch(url, { method: 'GET' })\", secureDefault: \"denied\", forbidden: [\"fetch(url)\", \"XMLHttpRequest\", \"WebSocket\"] },\n { name: \"api.setTimeout\", policy: \"timer\", signature: \"setTimeout(fn, ms)\", summary: \"Policy-gated timeout.\", example: \"api.setTimeout(function () { g.ready = true; }, 500)\", secureDefault: \"denied\", forbidden: [\"setTimeout(fn, ms)\"] },\n { name: \"api.clearTimeout\", policy: \"timer\", signature: \"clearTimeout(id)\", summary: \"Clear a policy-gated timeout.\", example: \"api.clearTimeout(g.timeoutId)\", secureDefault: \"denied\" },\n { name: \"api.setInterval\", policy: \"timer\", signature: \"setInterval(fn, ms)\", summary: \"Policy-gated interval.\", example: \"api.setInterval(function () { g.ticks += 1; }, 1000)\", secureDefault: \"denied\", forbidden: [\"setInterval(fn, ms)\"] },\n { name: \"api.clearInterval\", policy: \"timer\", signature: \"clearInterval(id)\", summary: \"Clear a policy-gated interval.\", example: \"api.clearInterval(g.intervalId)\", secureDefault: \"denied\" },\n { name: \"api.raf\", policy: \"animation\", signature: \"raf(fn)\", summary: \"Policy-gated animation frame.\", example: \"api.raf(function (time) { g.time = time; })\", secureDefault: \"denied\", forbidden: [\"requestAnimationFrame(fn)\"] },\n { name: \"api.cancelRaf\", policy: \"animation\", signature: \"cancelRaf(id)\", summary: \"Cancel a policy-gated animation frame.\", example: \"api.cancelRaf(g.rafId)\", secureDefault: \"denied\" },\n { name: \"api.createCanvas\", policy: \"canvas\", signature: \"createCanvas(width, height)\", summary: \"Create a policy-counted canvas.\", example: \"var canvas = api.createCanvas(320, 180)\", secureDefault: \"denied\" },\n { name: \"api.getCanvasContext\", policy: \"canvas\", signature: \"getCanvasContext(canvas, contextId, options)\", summary: \"Get a policy-checked canvas context.\", example: \"var ctx = api.getCanvasContext(canvas, '2d')\", secureDefault: \"denied\" },\n { name: \"api.onDispose\", policy: \"lifecycle\", signature: \"onDispose(fn)\", summary: \"Register runtime cleanup.\", example: \"api.onDispose(function () { g.closed = true; })\", secureDefault: \"available\" },\n { name: \"api.now\", policy: \"lifecycle\", signature: \"now()\", summary: \"Runtime clock.\", example: \"api.now()\", secureDefault: \"available\" },\n { name: \"api.isTimeoutError\", policy: \"diagnostics\", signature: \"isTimeoutError(error)\", summary: \"Check timeout errors.\", example: \"api.isTimeoutError(error)\", secureDefault: \"available\" },\n { name: \"api.isNetworkError\", policy: \"diagnostics\", signature: \"isNetworkError(error)\", summary: \"Check network errors.\", example: \"api.isNetworkError(error)\", secureDefault: \"available\" },\n { name: \"api.isPolicyError\", policy: \"diagnostics\", signature: \"isPolicyError(error)\", summary: \"Check policy errors.\", example: \"api.isPolicyError(error)\", secureDefault: \"available\" },\n { name: \"api.errorMessage\", policy: \"diagnostics\", signature: \"errorMessage(error)\", summary: \"Extract a displayable error message.\", example: \"api.errorMessage(error)\", secureDefault: \"available\" }\n];\nvar slexkitStdlibFunctionNames = slexkitStdlibDocs.flatMap((namespace) => namespace.functions.map((fn) => fn.name));\nvar slexkitRuntimeCapabilityNames = slexkitRuntimeCapabilities.map((capability) => capability.name);\n\n// src/engine/validation.ts\nvar componentSpecByType2 = new Map(componentSpecs.map((spec) => [spec.type, spec]));\nvar stdlibFunctions = new Set(slexkitStdlibFunctionNames);\nvar stdlibNamespaces = new Set(slexkitStdlibFunctionNames.map((name) => name.split(\".\").slice(0, 2).join(\".\")));\nvar apiMembers = new Set(slexkitRuntimeCapabilityNames);\nvar directiveProps = new Set([\"$if\", \"$for\", \"$key\"]);\nvar nativeSecureCapabilities = [\n { value: \"fetch\", pattern: /(?<!\\.)\\bfetch\\s*\\(/ },\n { value: \"XMLHttpRequest\", pattern: /\\bXMLHttpRequest\\b/ },\n { value: \"WebSocket\", pattern: /\\bWebSocket\\b/ },\n { value: \"setTimeout\", pattern: /(?<!\\.)\\bsetTimeout\\s*\\(/ },\n { value: \"requestAnimationFrame\", pattern: /(?<!\\.)\\brequestAnimationFrame\\s*\\(/ }\n];\nfunction collectMemberUsage(source, root) {\n const matches = source.matchAll(new RegExp(`\\\\b${root}\\\\.([A-Za-z_$][\\\\w$]*)(?:\\\\.([A-Za-z_$][\\\\w$]*))?`, \"g\"));\n const found = new Set;\n for (const match of matches) {\n found.add([root, match[1], match[2]].filter(Boolean).join(\".\"));\n }\n return [...found].sort();\n}\nfunction componentKeyType(key) {\n const colon = key.indexOf(\":\");\n return colon > 0 ? key.slice(0, colon) : null;\n}\nfunction isKnownProp(type, key) {\n if (directiveProps.has(key) || key.startsWith(\"on\"))\n return true;\n const spec = componentSpecByType2.get(type);\n if (!spec)\n return true;\n const propName = key.startsWith(\"$\") ? key.slice(1) : key;\n return propName in spec.props;\n}\nfunction walkComponents(value, warnings, usage, path = \"\") {\n if (!value || typeof value !== \"object\")\n return;\n for (const [key, child] of Object.entries(value)) {\n const childPath = path ? `${path}.${key}` : key;\n const type = componentKeyType(key);\n if (type) {\n usage.add(type);\n const spec = componentSpecByType2.get(type);\n if (!spec) {\n warnings.push({\n code: \"unknown_component\",\n message: `Unknown SlexKit component '${type}'.`,\n path: childPath,\n value: type\n });\n }\n if (child && typeof child === \"object\") {\n for (const propName of Object.keys(child)) {\n if (componentKeyType(propName))\n continue;\n if (!isKnownProp(type, propName)) {\n warnings.push({\n code: \"unknown_prop\",\n message: `Unknown prop '${propName}' on component '${type}'.`,\n path: `${childPath}.${propName}`,\n value: propName\n });\n }\n }\n }\n }\n walkComponents(child, warnings, usage, childPath);\n }\n}\nfunction sourceWarnings(source, mode) {\n const warnings = [];\n const stdlibUsage = collectMemberUsage(source, \"std\");\n const apiUsage = collectMemberUsage(source, \"api\");\n for (const name of stdlibUsage) {\n if (stdlibFunctions.has(name) || stdlibNamespaces.has(name))\n continue;\n warnings.push({\n code: \"unknown_std_member\",\n message: `Unknown SlexKit stdlib member '${name}'.`,\n value: name\n });\n }\n for (const name of apiUsage) {\n if (apiMembers.has(name))\n continue;\n warnings.push({\n code: \"unknown_api_member\",\n message: `Unknown SlexKit runtime API member '${name}'.`,\n value: name\n });\n }\n if (mode === \"secure\") {\n for (const capability of nativeSecureCapabilities) {\n if (capability.pattern.test(source)) {\n warnings.push({\n code: \"native_secure_capability\",\n message: `Native '${capability.value}' is not supported in secure mode. Use policy-gated api.* instead.`,\n value: capability.value\n });\n }\n }\n }\n return { warnings, stdlibUsage, apiUsage };\n}\nfunction validateSlexSource(source, options = {}) {\n const mode = options.mode ?? \"trusted\";\n const parsed = parseSlexSource(source);\n const usage = new Set;\n const { warnings, stdlibUsage, apiUsage } = sourceWarnings(source, mode);\n if (!parsed.ok) {\n return {\n ok: false,\n diagnostic: parsed.diagnostic,\n warnings,\n componentUsage: [],\n stdlibUsage,\n apiUsage\n };\n }\n walkComponents(parsed.value, warnings, usage);\n return {\n ok: true,\n value: parsed.value,\n warnings,\n componentUsage: [...usage].sort(),\n stdlibUsage,\n apiUsage\n };\n}\n// src/engine/markdown-runtime.ts\nvar DEFAULT_POLICY = {};\nfunction isRecord(value) {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction isRenderableSource(value) {\n if (!isRecord(value))\n return false;\n if (\"layout\" in value)\n return isRecord(value.layout) && Object.keys(value.layout).length > 0;\n if (\"namespace\" in value || \"g\" in value)\n return false;\n return Object.keys(value).some((key) => key.includes(\":\"));\n}\nfunction bareLayoutFromSource(value) {\n const layout = { ...value };\n delete layout.slex;\n delete layout.namespace;\n delete layout.g;\n delete layout.layout;\n return layout;\n}\nfunction isStateOnlySource(value) {\n return isRecord(value) && !isRenderableSource(value) && ((\"slex\" in value) || (\"namespace\" in value) || (\"g\" in value));\n}\nfunction isSlexExpressionEnvelope(value) {\n return isRecord(value) && ((\"slex\" in value) || (\"namespace\" in value) || (\"g\" in value) || (\"layout\" in value));\n}\nfunction parseTrustedSource(source) {\n if (typeof source !== \"string\")\n return source;\n const parsed = parseSlexSource(source);\n return parsed.ok ? parsed.value : source;\n}\nfunction scopedTrustedSource(source, artifactId) {\n if (!artifactId || !isSlexExpressionEnvelope(source)) {\n return source;\n }\n if (!(\"layout\" in source) && isRenderableSource(source)) {\n return {\n slex: typeof source.slex === \"string\" ? source.slex : undefined,\n namespace: `${artifactId}::${String(source.namespace || \"default\")}`,\n g: isRecord(source.g) ? source.g : {},\n layout: bareLayoutFromSource(source)\n };\n }\n return {\n ...source,\n namespace: `${artifactId}::${String(source.namespace || \"default\")}`\n };\n}\nfunction namespaceFromSource(source) {\n if (!isSlexExpressionEnvelope(source))\n return;\n return String(source.namespace || \"default\");\n}\nfunction compareDocumentOrder(a, b) {\n if (a === b)\n return 0;\n const position = a.compareDocumentPosition(b);\n if (position & Node.DOCUMENT_POSITION_FOLLOWING)\n return -1;\n if (position & Node.DOCUMENT_POSITION_PRECEDING)\n return 1;\n return 0;\n}\nfunction createSlexKitMarkdownRuntimeHost(initialOptions = {}) {\n let options = {\n mode: \"trusted\",\n secureFrame: true,\n policy: DEFAULT_POLICY,\n ...initialOptions\n };\n const cleanups = new Map;\n const artifactContainers = new Map;\n const artifactSources = new Map;\n const secureArtifactAnchors = new Map;\n const secureArtifactCleanups = new Map;\n const trustedArtifactNamespaces = new Map;\n function rememberTrustedArtifactNamespace(artifactId, source) {\n if (!artifactId)\n return;\n const namespace = namespaceFromSource(source);\n if (!namespace)\n return;\n let namespaces = trustedArtifactNamespaces.get(artifactId);\n if (!namespaces) {\n namespaces = new Set;\n trustedArtifactNamespaces.set(artifactId, namespaces);\n }\n namespaces.add(`${artifactId}::${namespace}`);\n }\n function disposeTrustedArtifactNamespaces(artifactId) {\n const namespaces = trustedArtifactNamespaces.get(artifactId);\n if (!namespaces)\n return;\n for (const namespace of namespaces)\n disposeNamespace(namespace);\n trustedArtifactNamespaces.delete(artifactId);\n }\n function composeSecureArtifactSource(artifactId) {\n const sources = artifactSources.get(artifactId);\n if (!sources)\n return \"\";\n const orderedSources = Array.from(sources.entries()).sort(([a], [b]) => compareDocumentOrder(a, b)).map(([, source]) => source);\n const serializedSources = JSON.stringify(orderedSources.map((source) => ({\n kind: typeof source === \"string\" ? \"script\" : \"json\",\n source: encodeURIComponent(typeof source === \"string\" ? source : JSON.stringify(source))\n })));\n const artifactPrefix = JSON.stringify(`${artifactId}::`);\n return `(() => {\n const __sources = ${serializedSources}.map((entry) => ({\n kind: entry.kind,\n source: decodeURIComponent(entry.source),\n }));\n const __isRecord = (value) => !!value && typeof value === \"object\" && !Array.isArray(value);\n const __merge = (target, source) => {\n if (!__isRecord(source)) return target;\n for (const [key, value] of Object.entries(source)) {\n if (__isRecord(value) && __isRecord(target[key])) __merge(target[key], value);\n else target[key] = value;\n }\n return target;\n };\n const __isRenderableTree = (value) => __isRecord(value) && Object.keys(value).some((key) => key.includes(\":\"));\n const __artifactPrefix = ${artifactPrefix};\n const __target = { slex: \"0.1\", namespace: __artifactPrefix + \"default\", g: {}, layout: {} };\n const __layouts = [];\n for (const __entry of __sources) {\n const __script = __entry.kind === \"json\" ? JSON.parse(__entry.source) : (0, eval)(\"(\" + __entry.source + \")\");\n if (!__isRecord(__script)) continue;\n if (\"slex\" in __script) __target.slex = String(__script.slex || \"0.1\");\n if (\"namespace\" in __script) __target.namespace = __artifactPrefix + String(__script.namespace || \"default\");\n if (__isRecord(__script.g)) __merge(__target.g, __script.g);\n if (__isRecord(__script.layout) && Object.keys(__script.layout).length > 0) __layouts.push(__script.layout);\n else if (!(\"namespace\" in __script) && !(\"g\" in __script) && !(\"layout\" in __script) && __isRenderableTree(__script)) {\n const { slex: __slex, ...__layout } = __script;\n __layouts.push(__layout);\n }\n }\n if (__layouts.length === 1) {\n __target.layout = { \"column:block_0\": Object.assign({}, __layouts[0], { id: \"slexkit-slot-slot_0\" }) };\n } else if (__layouts.length > 1) {\n __target.layout = {\n \"column:artifact\": Object.fromEntries(\n __layouts.map((layout, index) => [\"column:block_\" + index, Object.assign({}, layout, { id: \"slexkit-slot-slot_\" + index })]),\n ),\n };\n }\n return __target;\n })()`;\n }\n function addArtifactContainer(artifactId, container) {\n let containers = artifactContainers.get(artifactId);\n if (!containers) {\n containers = new Set;\n artifactContainers.set(artifactId, containers);\n }\n containers.add(container);\n }\n function addArtifactSource(block) {\n const artifactId = block.artifactId;\n let sources = artifactSources.get(artifactId);\n if (!sources) {\n sources = new Map;\n artifactSources.set(artifactId, sources);\n }\n sources.set(block.container, block.source);\n addArtifactContainer(artifactId, block.container);\n return artifactId;\n }\n function clearSecureSlot(container) {\n delete container.dataset.slexkitSecureArtifactSlot;\n container.replaceChildren();\n }\n function selectSecureArtifactAnchor(artifactId) {\n const containers = artifactContainers.get(artifactId);\n if (!containers?.size)\n return;\n return Array.from(containers).sort(compareDocumentOrder)[0];\n }\n function remountSecureArtifact(artifactId, theme) {\n const anchor = secureArtifactAnchors.get(artifactId);\n if (!anchor)\n return;\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n clearSecureSlot(anchor);\n const containers = artifactContainers.get(artifactId) ?? new Set;\n const orderedContainers = Array.from(containers).sort(compareDocumentOrder);\n for (const container of containers) {\n if (container === anchor)\n continue;\n clearSecureSlot(container);\n container.dataset.slexkitSecureArtifactSlot = \"true\";\n }\n const cleanup = mountSecureArtifact(composeSecureArtifactSource(artifactId), anchor, {\n theme,\n dir: options.dir,\n labels: options.labels,\n policy: options.policy ?? DEFAULT_POLICY,\n hostAdapter: options.hostAdapter,\n frame: options.secureFrame ?? true,\n artifactSlots: orderedContainers.map((container, index) => ({\n id: `slot_${index}`,\n container\n }))\n });\n secureArtifactCleanups.set(artifactId, cleanup);\n }\n function mountSecureBlock(block) {\n if (!block.artifactId) {\n const cleanup2 = mountSecureArtifact(block.source, block.container, {\n theme: block.theme ?? options.theme,\n dir: block.dir ?? options.dir,\n labels: block.labels ?? options.labels,\n policy: options.policy ?? DEFAULT_POLICY,\n hostAdapter: options.hostAdapter,\n frame: options.secureFrame ?? true\n });\n return remember(block, cleanup2);\n }\n const artifactId = addArtifactSource(block);\n const anchor = selectSecureArtifactAnchor(artifactId);\n if (anchor)\n secureArtifactAnchors.set(artifactId, anchor);\n remountSecureArtifact(artifactId, block.theme ?? options.theme);\n const cleanup = () => {\n artifactSources.get(artifactId)?.delete(block.container);\n artifactContainers.get(artifactId)?.delete(block.container);\n cleanups.delete(block.container);\n clearSecureSlot(block.container);\n const sources = artifactSources.get(artifactId);\n const containers = artifactContainers.get(artifactId);\n if (!sources?.size || !containers?.size) {\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n secureArtifactAnchors.delete(artifactId);\n artifactSources.delete(artifactId);\n artifactContainers.delete(artifactId);\n return;\n }\n if (secureArtifactAnchors.get(artifactId) === block.container) {\n const nextAnchor = selectSecureArtifactAnchor(artifactId);\n if (nextAnchor)\n secureArtifactAnchors.set(artifactId, nextAnchor);\n }\n remountSecureArtifact(artifactId, block.theme ?? options.theme);\n };\n cleanups.set(block.container, cleanup);\n return cleanup;\n }\n function remember(block, cleanup) {\n cleanups.set(block.container, cleanup);\n if (block.artifactId) {\n addArtifactContainer(block.artifactId, block.container);\n }\n return () => {\n cleanup();\n cleanups.delete(block.container);\n if (!block.artifactId)\n return;\n const containers = artifactContainers.get(block.artifactId);\n containers?.delete(block.container);\n if (containers?.size === 0)\n artifactContainers.delete(block.artifactId);\n };\n }\n function disposeBlock(container) {\n const cleanup = cleanups.get(container);\n if (!cleanup)\n return;\n cleanup();\n cleanups.delete(container);\n for (const [artifactId, containers] of artifactContainers) {\n containers.delete(container);\n artifactSources.get(artifactId)?.delete(container);\n if (secureArtifactAnchors.get(artifactId) === container) {\n const nextAnchor = selectSecureArtifactAnchor(artifactId);\n if (nextAnchor)\n secureArtifactAnchors.set(artifactId, nextAnchor);\n else\n secureArtifactAnchors.delete(artifactId);\n }\n if (containers.size === 0)\n artifactContainers.delete(artifactId);\n if (artifactSources.get(artifactId)?.size === 0)\n artifactSources.delete(artifactId);\n }\n }\n return {\n configure(nextOptions) {\n options = { ...options, ...nextOptions };\n },\n getMode() {\n return options.mode ?? \"trusted\";\n },\n mountBlock(block) {\n disposeBlock(block.container);\n block.container.replaceChildren();\n const mode = options.mode ?? \"trusted\";\n if (mode === \"secure\")\n return mountSecureBlock(block);\n const parsedSource = parseTrustedSource(block.source);\n rememberTrustedArtifactNamespace(block.artifactId, parsedSource);\n const trustedSource = scopedTrustedSource(parsedSource, block.artifactId);\n const stateOnly = block.stateOnly ?? isStateOnlySource(trustedSource);\n if (stateOnly) {\n const ok = ingest(trustedSource);\n if (!ok)\n throw new Error(\"Failed to parse Slex state block.\");\n return remember(block, () => {});\n }\n const theme = block.theme ?? options.theme;\n const cleanup = mount(trustedSource, block.container, {\n theme,\n dir: block.dir ?? options.dir,\n labels: block.labels ?? options.labels\n });\n return remember(block, cleanup);\n },\n disposeBlock,\n disposeArtifact(artifactId) {\n const containers = Array.from(artifactContainers.get(artifactId) ?? []);\n for (const container of containers)\n disposeBlock(container);\n secureArtifactCleanups.get(artifactId)?.();\n secureArtifactCleanups.delete(artifactId);\n secureArtifactAnchors.delete(artifactId);\n artifactContainers.delete(artifactId);\n artifactSources.delete(artifactId);\n disposeTrustedArtifactNamespaces(artifactId);\n },\n disposeAll() {\n for (const container of Array.from(cleanups.keys()))\n disposeBlock(container);\n for (const cleanup of Array.from(secureArtifactCleanups.values()))\n cleanup();\n secureArtifactCleanups.clear();\n secureArtifactAnchors.clear();\n artifactContainers.clear();\n artifactSources.clear();\n for (const artifactId of Array.from(trustedArtifactNamespaces.keys())) {\n disposeTrustedArtifactNamespaces(artifactId);\n }\n }\n };\n}\nvar globalMarkdownRuntimeHost;\nfunction installSlexKitMarkdownRuntimeHost(options = {}) {\n globalMarkdownRuntimeHost = createSlexKitMarkdownRuntimeHost(options);\n return globalMarkdownRuntimeHost;\n}\nfunction getSlexKitMarkdownRuntimeHost() {\n if (!globalMarkdownRuntimeHost) {\n globalMarkdownRuntimeHost = createSlexKitMarkdownRuntimeHost();\n }\n return globalMarkdownRuntimeHost;\n}\n\n// src/engine/index.ts\nvar defaultRuntimeUrl = typeof document !== \"undefined\" && typeof document.currentScript === \"object\" && document.currentScript && \"src\" in document.currentScript ? String(document.currentScript.src || \"\") : undefined;\nfunction setSlexKitRuntimeUrl(url) {\n defaultRuntimeUrl = url || undefined;\n}\nfunction getSlexKitRuntimeUrl() {\n return defaultRuntimeUrl;\n}\nfunction normalizeExpression(input) {\n if (!input || typeof input !== \"object\")\n return input;\n const hasProtocolMarker = \"slex\" in input;\n const hasEnvelopeField = \"namespace\" in input || \"g\" in input || \"layout\" in input;\n if (hasEnvelopeField)\n return input;\n const keys = Object.keys(input);\n if (keys.some((key) => key.includes(\":\"))) {\n const { slex, ...layout } = input;\n return {\n ...hasProtocolMarker ? { slex } : {},\n namespace: \"default\",\n g: {},\n layout\n };\n }\n return input;\n}\nfunction warnUnsupportedProtocol(expression) {\n if (expression.slex === undefined || expression.slex === SLEX_PROTOCOL_VERSION)\n return;\n console.warn(`[SlexKit] Slex protocol marker '${String(expression.slex)}' does not match supported protocol '${SLEX_PROTOCOL_VERSION}'.`);\n}\nfunction parseSourceOrExpression(input) {\n if (typeof input !== \"string\")\n return normalizeExpression(input);\n const parsed = parseSlexSource(input);\n if (!parsed.ok) {\n console.warn(\"[SlexKit] Failed to parse Slex source:\", parsed.error.message);\n return;\n }\n return normalizeExpression(parsed.value);\n}\nfunction applyExpression(expression) {\n warnUnsupportedProtocol(expression);\n const ns = expression.namespace || \"default\";\n const store = getStore(ns);\n if (expression.g) {\n try {\n deepMerge(store.g, expression.g);\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Merge error, replacing entire g:`, e.message);\n for (const k of Object.keys(store.g)) {\n delete store.g[k];\n }\n Object.assign(store.g, expression.g);\n }\n }\n if (expression.layout) {\n store.layouts = [expression.layout];\n }\n}\nfunction hasThemeToken(el, token) {\n return getComputedStyle(el).getPropertyValue(token).trim().length > 0;\n}\nfunction resolveThemeMode(container, requested = \"auto\") {\n if (requested !== \"auto\")\n return requested;\n if (container.closest(\".slexkit-theme-uno, .slexkit-theme-flowbite\"))\n return \"uno\";\n return hasThemeToken(container, \"--primary\") && hasThemeToken(container, \"--background\") ? \"host-shadcn\" : \"uno\";\n}\nfunction resolveColorMode(container) {\n const scoped = container.closest(\".dark, .light, [data-theme='dark'], [data-theme='light']\");\n if (scoped?.classList.contains(\"dark\") || scoped?.dataset.theme === \"dark\")\n return \"dark\";\n if (scoped?.classList.contains(\"light\") || scoped?.dataset.theme === \"light\")\n return \"light\";\n const doc = container.ownerDocument || document;\n const docEl = doc.documentElement;\n if (docEl.classList.contains(\"dark\") || docEl.dataset.theme === \"dark\")\n return \"dark\";\n if (docEl.classList.contains(\"light\") || docEl.dataset.theme === \"light\")\n return \"light\";\n const scheme = getComputedStyle(docEl).colorScheme || getComputedStyle(container).colorScheme;\n if (scheme.split(/\\s+/).includes(\"dark\"))\n return \"dark\";\n if (scheme.split(/\\s+/).includes(\"light\"))\n return \"light\";\n return;\n}\nfunction applyDocumentColorMode(doc, mode) {\n if (!mode)\n return;\n doc.documentElement.classList.toggle(\"dark\", mode === \"dark\");\n doc.documentElement.classList.toggle(\"light\", mode === \"light\");\n doc.documentElement.dataset.theme = mode;\n}\nfunction resolveDirection(container, requested = \"auto\") {\n if (requested === \"ltr\" || requested === \"rtl\")\n return requested;\n const inherited = container.closest(\"[dir]\")?.dir || container.ownerDocument?.documentElement?.dir;\n return inherited === \"rtl\" ? \"rtl\" : \"ltr\";\n}\nfunction mount(input, container, options = {}) {\n const expression = parseSourceOrExpression(input);\n if (!expression)\n return () => {};\n const ns = expression.namespace || \"default\";\n const store = getStore(ns);\n const ownerDocument = container.ownerDocument || document;\n applyExpression(expression);\n const oldCleanup = store.cleanups.get(container);\n if (oldCleanup)\n oldCleanup();\n const root = ownerDocument.createElement(\"div\");\n const theme = resolveThemeMode(container, options.theme);\n const dir = resolveDirection(container, options.dir);\n root.className = `slexkit-root slexkit-theme-${theme}`;\n root.dir = dir;\n root.dataset.namespace = ns;\n root.dataset.theme = theme;\n root.dataset.dir = dir;\n container.appendChild(root);\n store.roots.set(container, root);\n const cleanup = createRoot((dispose) => {\n const layoutRoot = ownerDocument.createElement(\"div\");\n layoutRoot.className = \"slex-layout\";\n root.appendChild(layoutRoot);\n renderTree(expression.layout ?? {}, layoutRoot, store.g, store.components, store.componentTypes, undefined, ns, options.api, {\n dir,\n labels: options.labels ?? {}\n });\n return () => {\n dispose();\n root.remove();\n store.roots.delete(container);\n store.cleanups.delete(container);\n };\n });\n store.cleanups.set(container, cleanup);\n return cleanup;\n}\nfunction disposeNamespace(namespace) {\n const ns = namespace || \"default\";\n const store = peekStore(ns);\n if (store) {\n for (const cleanup of Array.from(store.cleanups.values())) {\n try {\n cleanup();\n } catch (e) {\n console.warn(`[SlexKit][${ns}] Cleanup error while disposing namespace:`, e.message);\n }\n }\n for (const root of Array.from(store.roots.values())) {\n root.remove();\n }\n store.roots.clear();\n store.cleanups.clear();\n deleteStore(ns);\n }\n clearEvalCache(ns);\n}\nfunction mountSecureArtifact(input, container, options) {\n container.dataset.slexkitSecureRuntime = \"true\";\n let frameTarget;\n try {\n frameTarget = createSecureFrameTarget(input, container, options);\n } catch (error) {\n delete container.dataset.slexkitSecureRuntime;\n throw error;\n }\n if (frameTarget?.sandboxed) {\n return () => {\n frameTarget.dispose();\n delete container.dataset.slexkitSecureRuntime;\n };\n }\n if (!options.unsafeInlineExecution) {\n delete container.dataset.slexkitSecureRuntime;\n throw new Error(\"mountSecureArtifact requires a sandbox frame runtime URL. Use unsafeInlineExecution only for trusted inline execution.\");\n }\n const runtime = createSecureRuntime(options.policy, options.hostAdapter);\n const target = frameTarget?.target ?? container;\n const cleanup = mount(input, target, {\n theme: options.theme,\n dir: options.dir,\n labels: options.labels,\n api: runtime.api\n });\n return () => {\n cleanup();\n runtime.dispose();\n frameTarget?.dispose();\n delete container.dataset.slexkitSecureRuntime;\n };\n}\nfunction createSecureFrameTarget(input, container, mountOptions) {\n const frame = mountOptions.frame;\n if (!frame)\n return null;\n const ownerDocument = container.ownerDocument || document;\n const options = typeof frame === \"object\" ? frame : {};\n const iframe = ownerDocument.createElement(\"iframe\");\n iframe.className = options.className ?? \"slexkit-secure-frame\";\n iframe.title = options.title ?? \"SlexKit secure artifact\";\n iframe.setAttribute(\"data-slexkit-secure-frame\", \"true\");\n iframe.setAttribute(\"referrerpolicy\", \"no-referrer\");\n iframe.style.display = \"block\";\n iframe.style.width = \"100%\";\n iframe.style.border = \"0\";\n iframe.style.background = \"transparent\";\n const runtimeUrl = options.runtimeUrl ?? options.runnerUrl ?? defaultRuntimeUrl;\n if (runtimeUrl) {\n const resolvedRuntimeUrl = resolveRuntimeUrl(runtimeUrl);\n const styleUrl = options.styleUrl === false ? \"\" : options.styleUrl ?? defaultSecureFrameStyleUrl(resolvedRuntimeUrl);\n const resolvedStyleUrl = styleUrl ? resolveRuntimeUrl(styleUrl) : undefined;\n assertSandboxCloneable(input);\n iframe.setAttribute(\"sandbox\", secureSandboxAttribute(options));\n container.replaceChildren(iframe);\n const bridge = createSandboxBridge(input, container, iframe, mountOptions);\n iframe.srcdoc = secureRunnerSrcdoc(resolvedRuntimeUrl, resolvedStyleUrl);\n return bridge;\n }\n if (frame) {\n iframe.remove();\n throw new Error(\"SlexKit secure frame requires runtimeUrl or setSlexKitRuntimeUrl().\");\n }\n if (options.sandbox)\n iframe.setAttribute(\"sandbox\", options.sandbox);\n container.replaceChildren(iframe);\n const frameDocument = iframe.contentDocument;\n if (!frameDocument?.body) {\n iframe.remove();\n throw new Error(\"Unable to create SlexKit secure frame document.\");\n }\n frameDocument.open();\n frameDocument.write('<!doctype html><html><head></head><body><div id=\"slexkit-secure-root\"></div></body></html>');\n frameDocument.close();\n applyDocumentColorMode(frameDocument, resolveColorMode(container));\n const target = frameDocument.getElementById(\"slexkit-secure-root\");\n if (!target) {\n iframe.remove();\n throw new Error(\"Unable to create SlexKit secure frame root.\");\n }\n return {\n target,\n dispose: () => iframe.remove()\n };\n}\nfunction secureSandboxAttribute(options) {\n const sandbox = options.sandbox ?? \"allow-scripts\";\n const tokens = sandbox.split(/\\s+/).filter(Boolean);\n if (tokens.includes(\"allow-same-origin\") && !options.unsafeAllowSameOrigin) {\n throw new Error(\"SlexKit secure frames cannot use allow-same-origin unless unsafeAllowSameOrigin is explicitly enabled.\");\n }\n if (!tokens.includes(\"allow-scripts\")) {\n throw new Error(\"SlexKit secure frames require allow-scripts to run the runtime.\");\n }\n return tokens.join(\" \");\n}\nfunction resolveRuntimeUrl(runtimeUrl) {\n try {\n const base = typeof document !== \"undefined\" ? document.baseURI : undefined;\n return new URL(runtimeUrl, base).href;\n } catch {\n return runtimeUrl;\n }\n}\nfunction cspSourceForRuntime(runtimeUrl) {\n try {\n const parsed = new URL(runtimeUrl);\n if (parsed.protocol === \"blob:\")\n return \"blob:\";\n if (parsed.protocol === \"data:\")\n return \"data:\";\n return parsed.origin;\n } catch {\n return \"'self'\";\n }\n}\nfunction defaultSecureFrameStyleUrl(runtimeUrl) {\n try {\n const url = new URL(runtimeUrl);\n if (url.protocol === \"blob:\" || url.protocol === \"data:\")\n return \"\";\n url.pathname = url.pathname.replace(/[^/]+$/, \"slexkit.css\");\n url.search = \"\";\n url.hash = \"\";\n return url.href;\n } catch {\n return \"\";\n }\n}\nfunction escapeHtmlAttribute(value) {\n return value.replace(/&/g, \"&amp;\").replace(/\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\nfunction secureRunnerSrcdoc(runtimeUrl, styleUrl) {\n const nonce = randomToken(12);\n const styleSource = styleUrl ? ` ${cspSourceForRuntime(styleUrl)}` : \"\";\n const csp = [\n \"default-src 'none'\",\n `script-src 'nonce-${nonce}' 'unsafe-eval' ${cspSourceForRuntime(runtimeUrl)}`,\n \"connect-src 'none'\",\n \"img-src data: blob:\",\n `style-src 'unsafe-inline'${styleSource}`,\n \"font-src data:\",\n \"form-action 'none'\",\n \"base-uri 'none'\"\n ].join(\"; \");\n const style = \"html,body{margin:0;min-height:100%;overflow:hidden;}#slexkit-secure-root{min-height:100%;}\";\n const stylesheet = styleUrl ? `<link rel=\"stylesheet\" href=\"${escapeHtmlAttribute(styleUrl)}\">` : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"${escapeHtmlAttribute(csp)}\">${stylesheet}<style>${style}</style></head><body><div id=\"slexkit-secure-root\"></div><script type=\"module\" nonce=\"${nonce}\">import { startSlexKitSandboxRunner } from ${JSON.stringify(runtimeUrl)}; startSlexKitSandboxRunner();</script></body></html>`;\n}\nfunction secureFrameLoadTimeout(options) {\n const frame = options.frame;\n if (frame && typeof frame === \"object\" && typeof frame.loadTimeoutMs === \"number\") {\n return Math.max(0, frame.loadTimeoutMs);\n }\n return 8000;\n}\nfunction secureFrameMaxUnresponsiveMs(options) {\n const value = options.policy.execution?.maxUnresponsiveMs;\n return typeof value === \"number\" ? Math.max(0, value) : 0;\n}\nfunction secureFrameLoadError(runtimeUrl, phase, detail) {\n const phaseMessage = phase === \"ready\" ? \"The sandbox did not report that the runtime module loaded.\" : \"The sandbox loaded but did not confirm artifact mount.\";\n const suffix = detail ? `\nSandbox error: ${detail}` : \"\";\n return new Error(`SlexKit secure runtime failed to load.\n${phaseMessage}\nRuntime URL: ${runtimeUrl}\n` + `Check that this URL serves slexkit.runtime.js as an ES module with:\n` + `Access-Control-Allow-Origin: *\nContent-Type: text/javascript\n` + \"Do not fix this by adding allow-same-origin to the sandbox frame.\" + suffix);\n}\nfunction secureFrameHeartbeatError(runtimeUrl, elapsedMs) {\n return new Error(`SlexKit secure runtime stopped responding.\n` + `No sandbox heartbeat was received for ${Math.round(elapsedMs)} ms.\n` + `Runtime URL: ${runtimeUrl}\n` + \"The sandbox frame was terminated to avoid keeping unresponsive agent code alive.\");\n}\nfunction showSecureFrameError(container, iframe, error) {\n container.dataset.slexkitSecureStatus = \"error\";\n let alert = container.querySelector(\".slexkit-secure-error\");\n if (!alert) {\n alert = (container.ownerDocument || document).createElement(\"div\");\n alert.className = \"slexkit-secure-error\";\n alert.setAttribute(\"role\", \"alert\");\n iframe.after(alert);\n }\n alert.textContent = error.message;\n console.error(error.message);\n}\nfunction clearSecureFrameError(container) {\n delete container.dataset.slexkitSecureStatus;\n container.querySelector(\".slexkit-secure-error\")?.remove();\n}\nfunction assertSandboxCloneable(input) {\n if (typeof input === \"string\")\n return;\n const seen = new Set;\n const visit = (value) => {\n if (typeof value === \"function\") {\n throw new Error(\"Sandbox runner input cannot contain functions. Pass Slex source to execute functions inside the sandbox realm.\");\n }\n if (!value || typeof value !== \"object\")\n return;\n if (seen.has(value))\n return;\n seen.add(value);\n for (const item of Object.values(value))\n visit(item);\n };\n visit(input);\n}\nfunction createSandboxBridge(input, container, iframe, options) {\n const id = `secure_${randomToken(8)}`;\n const token = randomToken(24);\n const bridgeRuntime = createSecureRuntime(options.policy, options.hostAdapter);\n const runtimeUrl = typeof options.frame === \"object\" ? resolveRuntimeUrl(options.frame.runtimeUrl ?? options.frame.runnerUrl ?? defaultRuntimeUrl ?? \"\") : resolveRuntimeUrl(defaultRuntimeUrl ?? \"\");\n const loadTimeoutMs = secureFrameLoadTimeout(options);\n const artifactSlots = normalizeArtifactSlots(options.artifactSlots);\n let disposed = false;\n let mounted = false;\n let ready = false;\n let mountAcknowledged = false;\n let loadTimer;\n let heartbeatTimer;\n let slotSyncFrame;\n let slotSyncTimer;\n let lastHeartbeat = 0;\n const maxUnresponsiveMs = secureFrameMaxUnresponsiveMs(options);\n const ownerWindow = iframe.ownerDocument.defaultView ?? window;\n const slotStyleSnapshots = new Map;\n let adjustedAnchorPosition = false;\n const clearLoadTimer = () => {\n if (loadTimer === undefined)\n return;\n window.clearTimeout(loadTimer);\n loadTimer = undefined;\n };\n const clearHeartbeatTimer = () => {\n if (heartbeatTimer === undefined)\n return;\n window.clearInterval(heartbeatTimer);\n heartbeatTimer = undefined;\n };\n const failLoad = (phase, detail) => {\n if (disposed || mountAcknowledged)\n return;\n clearLoadTimer();\n showSecureFrameError(container, iframe, secureFrameLoadError(runtimeUrl, phase, detail));\n terminateFrame({ keepDiagnostic: true });\n };\n const failHeartbeat = () => {\n if (disposed || !mountAcknowledged || maxUnresponsiveMs <= 0)\n return;\n const elapsed = Date.now() - lastHeartbeat;\n if (elapsed < maxUnresponsiveMs)\n return;\n clearHeartbeatTimer();\n showSecureFrameError(container, iframe, secureFrameHeartbeatError(runtimeUrl, elapsed));\n terminateFrame({ keepDiagnostic: true });\n };\n const startHeartbeatWatchdog = () => {\n if (maxUnresponsiveMs <= 0 || heartbeatTimer !== undefined)\n return;\n lastHeartbeat = Date.now();\n heartbeatTimer = window.setInterval(failHeartbeat, Math.max(10, Math.min(1000, maxUnresponsiveMs / 2)));\n };\n const clearSlotSyncTimer = () => {\n if (slotSyncFrame !== undefined) {\n ownerWindow.cancelAnimationFrame(slotSyncFrame);\n slotSyncFrame = undefined;\n }\n if (slotSyncTimer !== undefined) {\n ownerWindow.clearTimeout(slotSyncTimer);\n slotSyncTimer = undefined;\n }\n };\n const syncArtifactSlotsNow = () => {\n slotSyncFrame = undefined;\n slotSyncTimer = undefined;\n if (!artifactSlots.length || disposed)\n return;\n const frameRect = iframe.getBoundingClientRect();\n const slots = artifactSlots.map((slot) => {\n const rect = slot.container.getBoundingClientRect();\n return {\n id: slot.id,\n left: rect.left - frameRect.left,\n top: rect.top - frameRect.top,\n width: rect.width,\n height: rect.height\n };\n });\n if (artifactSlots.length > 1) {\n const maxBottom = Math.max(1, ...slots.map((slot) => slot.top + slot.height));\n iframe.style.height = `${Math.ceil(maxBottom)}px`;\n }\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"slots\",\n id,\n token,\n slots\n }, \"*\");\n };\n const requestArtifactSlotSync = () => {\n if (!artifactSlots.length || disposed || slotSyncFrame !== undefined || slotSyncTimer !== undefined)\n return;\n if (typeof ownerWindow.requestAnimationFrame === \"function\") {\n slotSyncFrame = ownerWindow.requestAnimationFrame(syncArtifactSlotsNow);\n } else {\n slotSyncTimer = ownerWindow.setTimeout(syncArtifactSlotsNow, 0);\n }\n };\n const slotResizeObserver = artifactSlots.length && typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(requestArtifactSlotSync) : undefined;\n if (artifactSlots.length > 1) {\n slotStyleSnapshots.set(container, {\n minHeight: container.style.minHeight,\n position: container.style.position,\n secureSlotId: container.dataset.slexkitSecureArtifactSlotId\n });\n iframe.style.position = \"absolute\";\n iframe.style.inset = \"0 auto auto 0\";\n iframe.style.width = \"100%\";\n iframe.style.minHeight = \"1px\";\n iframe.style.border = \"0\";\n iframe.style.background = \"transparent\";\n iframe.style.zIndex = \"1\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n const computedAnchorPosition = ownerWindow.getComputedStyle(container).position;\n if (!computedAnchorPosition || computedAnchorPosition === \"static\") {\n container.style.position = \"relative\";\n adjustedAnchorPosition = true;\n }\n }\n for (const slot of artifactSlots) {\n if (!slotStyleSnapshots.has(slot.container)) {\n slotStyleSnapshots.set(slot.container, {\n minHeight: slot.container.style.minHeight,\n position: slot.container.style.position,\n secureSlotId: slot.container.dataset.slexkitSecureArtifactSlotId\n });\n }\n slot.container.dataset.slexkitSecureArtifactSlotId = slot.id;\n slotResizeObserver?.observe(slot.container);\n }\n if (artifactSlots.length) {\n ownerWindow.addEventListener(\"resize\", requestArtifactSlotSync);\n ownerWindow.addEventListener(\"scroll\", requestArtifactSlotSync, true);\n }\n if (loadTimeoutMs > 0) {\n loadTimer = window.setTimeout(() => {\n failLoad(ready ? \"mounted\" : \"ready\");\n }, loadTimeoutMs);\n }\n const postMount = () => {\n if (mounted)\n return;\n mounted = true;\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"mount\",\n id,\n token,\n input,\n policy: options.policy,\n theme: options.theme,\n colorMode: resolveColorMode(container),\n dir: options.dir,\n labels: options.labels\n }, \"*\");\n };\n const onMessage = (event) => {\n if (disposed || event.source !== iframe.contentWindow)\n return;\n const data = event.data;\n if (!data || data.channel !== \"slexkit-secure\")\n return;\n if (data.type === \"ready\") {\n ready = true;\n postMount();\n return;\n }\n if (data.type === \"mounted\" && data.id === id && data.token === token) {\n mountAcknowledged = true;\n lastHeartbeat = Date.now();\n clearLoadTimer();\n clearSecureFrameError(container);\n startHeartbeatWatchdog();\n syncArtifactSlotsNow();\n return;\n }\n if (data.type === \"heartbeat\" && data.id === id && data.token === token) {\n lastHeartbeat = Date.now();\n return;\n }\n if (data.type === \"slot-size\" && data.id === id && data.token === token && typeof data.slotId === \"string\") {\n const slot = artifactSlots.find((item) => item.id === data.slotId);\n if (slot && typeof data.height === \"number\" && Number.isFinite(data.height)) {\n const height = Math.max(0, Math.ceil(data.height));\n slot.container.style.minHeight = `${height}px`;\n if (artifactSlots.length === 1) {\n iframe.style.height = `${Math.max(1, height)}px`;\n }\n requestArtifactSlotSync();\n }\n return;\n }\n if (data.type === \"frame-size\" && data.id === id && data.token === token) {\n if (artifactSlots.length <= 1 && typeof data.height === \"number\" && Number.isFinite(data.height)) {\n iframe.style.height = `${Math.max(1, Math.ceil(data.height))}px`;\n }\n return;\n }\n if (data.type === \"error\" && (!data.id || data.id === id) && (!data.token || data.token === token)) {\n const error = data;\n failLoad(ready ? \"mounted\" : \"ready\", typeof error.error?.message === \"string\" ? error.error.message : undefined);\n return;\n }\n if (data.type !== \"fetch\" || data.id !== id || data.token !== token || typeof data.requestId !== \"string\")\n return;\n const request = validateSandboxFetchRequest(data.request);\n if (!request)\n return;\n bridgeRuntime.api.fetch(request.url, request).then((result) => {\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"fetch-result\",\n id,\n token,\n requestId: data.requestId,\n result\n }, \"*\");\n }).catch((error) => {\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"fetch-result\",\n id,\n token,\n requestId: data.requestId,\n error: serializeRuntimeError(error)\n }, \"*\");\n });\n };\n window.addEventListener(\"message\", onMessage);\n const terminateFrame = ({ keepDiagnostic = false } = {}) => {\n if (disposed)\n return;\n disposed = true;\n iframe.contentWindow?.postMessage({\n channel: \"slexkit-secure\",\n type: \"dispose\",\n id,\n token\n }, \"*\");\n clearLoadTimer();\n clearHeartbeatTimer();\n clearSlotSyncTimer();\n slotResizeObserver?.disconnect();\n if (artifactSlots.length) {\n ownerWindow.removeEventListener(\"resize\", requestArtifactSlotSync);\n ownerWindow.removeEventListener(\"scroll\", requestArtifactSlotSync, true);\n }\n for (const slot of artifactSlots) {\n const snapshot = slotStyleSnapshots.get(slot.container);\n if (snapshot) {\n if (snapshot.secureSlotId === undefined)\n delete slot.container.dataset.slexkitSecureArtifactSlotId;\n else\n slot.container.dataset.slexkitSecureArtifactSlotId = snapshot.secureSlotId;\n slot.container.style.minHeight = snapshot.minHeight;\n } else {\n delete slot.container.dataset.slexkitSecureArtifactSlotId;\n slot.container.style.removeProperty(\"min-height\");\n }\n }\n if (adjustedAnchorPosition)\n container.style.position = slotStyleSnapshots.get(container)?.position ?? \"\";\n window.removeEventListener(\"message\", onMessage);\n bridgeRuntime.dispose();\n iframe.remove();\n if (!keepDiagnostic)\n clearSecureFrameError(container);\n if (!container.hasChildNodes())\n container.replaceChildren();\n };\n return {\n sandboxed: true,\n dispose: () => terminateFrame()\n };\n}\nfunction normalizeArtifactSlots(slots) {\n if (!slots?.length)\n return [];\n const seen = new Set;\n const normalized = [];\n for (const slot of slots) {\n const id = String(slot.id || \"\").trim();\n if (!id || seen.has(id) || !slot.container)\n continue;\n seen.add(id);\n normalized.push({ id, container: slot.container });\n }\n return normalized;\n}\nfunction randomToken(bytes) {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.getRandomValues) {\n const values = new Uint8Array(bytes);\n cryptoApi.getRandomValues(values);\n return Array.from(values, (value) => value.toString(16).padStart(2, \"0\")).join(\"\");\n }\n return `${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;\n}\nfunction validateSandboxFetchRequest(value) {\n if (!value || typeof value !== \"object\")\n return null;\n const request = value;\n if (typeof request.url !== \"string\")\n return null;\n if (request.method !== \"GET\" && request.method !== \"POST\")\n return null;\n if (request.credentials !== \"omit\" && request.credentials !== \"same-origin\" && request.credentials !== \"include\")\n return null;\n if (typeof request.timeoutMs !== \"number\" || !Number.isFinite(request.timeoutMs) || request.timeoutMs <= 0)\n return null;\n if (request.headers !== undefined && !isStringRecord(request.headers))\n return null;\n return {\n url: request.url,\n method: request.method,\n headers: request.headers,\n body: request.body,\n credentials: request.credentials,\n timeoutMs: request.timeoutMs\n };\n}\nfunction isStringRecord(value) {\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return false;\n return Object.values(value).every((item) => typeof item === \"string\");\n}\nfunction ingest(input) {\n const expression = parseSourceOrExpression(input);\n if (!expression)\n return false;\n applyExpression(expression);\n return true;\n}\nfunction copyText(text) {\n if (navigator.clipboard?.writeText) {\n navigator.clipboard.writeText(text);\n return;\n }\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.opacity = \"0\";\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand(\"copy\");\n textarea.remove();\n}\nfunction mountBootPreview(source, host, options) {\n host.replaceChildren();\n const preview = document.createElement(\"div\");\n preview.className = \"slexkit-preview\";\n host.appendChild(preview);\n return mount(source, preview, options);\n}\nfunction addSourceControls(pre, host, remount) {\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"slexkit-source-toolbar\";\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"slexkit-source-button\";\n copyButton.textContent = \"Copy source\";\n copyButton.addEventListener(\"click\", () => copyText(pre.textContent || \"\"));\n const viewButton = document.createElement(\"button\");\n viewButton.type = \"button\";\n viewButton.className = \"slexkit-source-button\";\n viewButton.textContent = \"Hide source\";\n viewButton.addEventListener(\"click\", () => {\n pre.hidden = !pre.hidden;\n viewButton.textContent = pre.hidden ? \"View source\" : \"Hide source\";\n });\n const renderButton = document.createElement(\"button\");\n renderButton.type = \"button\";\n renderButton.className = \"slexkit-source-button\";\n renderButton.textContent = \"Re-render\";\n renderButton.addEventListener(\"click\", remount);\n toolbar.append(copyButton, viewButton, renderButton);\n host.parentNode?.insertBefore(toolbar, host);\n}\nfunction boot(options = {}) {\n const selector = options.selector || \"pre code.language-slex\";\n document.querySelectorAll(selector).forEach((el) => {\n if (el.dataset.slexkitBooted === \"true\")\n return;\n el.dataset.slexkitBooted = \"true\";\n const source = el.textContent || \"\";\n const pre = el.closest(\"pre\");\n const host = document.createElement(\"div\");\n host.className = \"slexkit-card\";\n if (pre)\n pre.parentNode.insertBefore(host, pre.nextSibling);\n else\n el.parentNode.insertBefore(host, el.nextSibling);\n let cleanup = mountBootPreview(source, host, { theme: options.theme, dir: options.dir, labels: options.labels });\n const remount = () => {\n cleanup();\n cleanup = mountBootPreview(el.textContent || \"\", host, { theme: options.theme, dir: options.dir, labels: options.labels });\n };\n if (pre && options.sourceControls !== false) {\n addSourceControls(pre, host, remount);\n }\n });\n}\n\n// src/engine/sandbox-runner.ts\nvar schedulingSnapshot = {\n setTimeout: typeof globalThis.setTimeout === \"function\" ? globalThis.setTimeout.bind(globalThis) : undefined,\n clearTimeout: typeof globalThis.clearTimeout === \"function\" ? globalThis.clearTimeout.bind(globalThis) : undefined,\n setInterval: typeof globalThis.setInterval === \"function\" ? globalThis.setInterval.bind(globalThis) : undefined,\n clearInterval: typeof globalThis.clearInterval === \"function\" ? globalThis.clearInterval.bind(globalThis) : undefined,\n requestAnimationFrame: typeof globalThis.requestAnimationFrame === \"function\" ? globalThis.requestAnimationFrame.bind(globalThis) : undefined,\n cancelAnimationFrame: typeof globalThis.cancelAnimationFrame === \"function\" ? globalThis.cancelAnimationFrame.bind(globalThis) : undefined\n};\nfunction isHostMessage(value) {\n return !!value && typeof value === \"object\" && value.channel === \"slexkit-secure\" && typeof value.type === \"string\";\n}\nfunction frameRoot() {\n let root = document.getElementById(\"slexkit-secure-root\");\n if (!root) {\n root = document.createElement(\"div\");\n root.id = \"slexkit-secure-root\";\n document.body.appendChild(root);\n }\n return root;\n}\nfunction applyColorMode(mode) {\n if (mode !== \"dark\" && mode !== \"light\")\n return;\n document.documentElement.classList.toggle(\"dark\", mode === \"dark\");\n document.documentElement.classList.toggle(\"light\", mode === \"light\");\n document.documentElement.dataset.theme = mode;\n}\nfunction post(message) {\n window.parent?.postMessage(message, \"*\");\n}\nfunction createBridgeAdapter(id, token, pending) {\n let nextRequest = 1;\n return {\n fetch(request) {\n const requestId = `${Date.now()}_${nextRequest++}`;\n post({\n channel: \"slexkit-secure\",\n type: \"fetch\",\n id,\n token,\n requestId,\n request\n });\n return new Promise((resolve, reject) => {\n pending.set(requestId, { resolve, reject });\n });\n },\n setTimeout(fn, ms) {\n if (!schedulingSnapshot.setTimeout) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_unavailable\", \"Native timer host is unavailable.\");\n }\n return schedulingSnapshot.setTimeout(fn, ms);\n },\n clearTimeout(id2) {\n schedulingSnapshot.clearTimeout?.(id2);\n },\n setInterval(fn, ms) {\n if (!schedulingSnapshot.setInterval) {\n throw new SlexKitRuntimeError(\"policy\", \"timer_unavailable\", \"Native interval host is unavailable.\");\n }\n return schedulingSnapshot.setInterval(fn, ms);\n },\n clearInterval(id2) {\n schedulingSnapshot.clearInterval?.(id2);\n },\n requestAnimationFrame(fn) {\n if (!schedulingSnapshot.requestAnimationFrame) {\n throw new SlexKitRuntimeError(\"policy\", \"animation_unavailable\", \"Native animation frame host is unavailable.\");\n }\n return schedulingSnapshot.requestAnimationFrame(fn);\n },\n cancelAnimationFrame(id2) {\n schedulingSnapshot.cancelAnimationFrame?.(id2);\n }\n };\n}\nfunction blockedNetworkError() {\n return new Error(\"Native network APIs are disabled inside the SlexKit sandbox. Use api.get(), api.post(), or api.fetch().\");\n}\nfunction defineBlockedGlobal(name, value) {\n try {\n Object.defineProperty(globalThis, name, {\n configurable: true,\n value\n });\n } catch {}\n}\nfunction hardenNetworkGlobals() {\n defineBlockedGlobal(\"fetch\", () => Promise.reject(blockedNetworkError()));\n defineBlockedGlobal(\"XMLHttpRequest\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"WebSocket\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"EventSource\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"Worker\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n defineBlockedGlobal(\"SharedWorker\", class {\n constructor() {\n throw blockedNetworkError();\n }\n });\n try {\n Object.defineProperty(navigator, \"sendBeacon\", {\n configurable: true,\n value: () => false\n });\n } catch {}\n}\nfunction blockedSchedulingError(name) {\n return new SlexKitRuntimeError(\"policy\", \"native_scheduling_disabled\", `Native ${name} is disabled inside the SlexKit sandbox. Use api.${name}().`);\n}\nfunction hardenSchedulingGlobals() {\n defineBlockedGlobal(\"setTimeout\", () => {\n throw blockedSchedulingError(\"setTimeout\");\n });\n defineBlockedGlobal(\"setInterval\", () => {\n throw blockedSchedulingError(\"setInterval\");\n });\n defineBlockedGlobal(\"requestAnimationFrame\", () => {\n throw blockedSchedulingError(\"raf\");\n });\n defineBlockedGlobal(\"clearTimeout\", () => {\n return;\n });\n defineBlockedGlobal(\"clearInterval\", () => {\n return;\n });\n defineBlockedGlobal(\"cancelAnimationFrame\", () => {\n return;\n });\n}\nvar canvasSnapshot = {\n getContext: typeof HTMLCanvasElement !== \"undefined\" ? HTMLCanvasElement.prototype.getContext : undefined,\n offscreenCanvas: typeof OffscreenCanvas !== \"undefined\" ? OffscreenCanvas : undefined\n};\nfunction canvasPolicyError(code, message) {\n return new SlexKitRuntimeError(\"policy\", code, message);\n}\nfunction assertSandboxCanvasPolicy(policy, width, height, contextId) {\n if (!policy.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n throw canvasPolicyError(\"canvas_size_invalid\", \"Canvas size must be positive finite numbers.\");\n }\n const pixels = Math.ceil(width) * Math.ceil(height);\n if (policy.maxPixels !== undefined && pixels > policy.maxPixels) {\n throw canvasPolicyError(\"canvas_too_large\", \"Canvas size exceeds the runtime policy limit.\");\n }\n if (contextId && policy.allowedContexts?.length && !policy.allowedContexts.includes(contextId)) {\n throw canvasPolicyError(\"canvas_context_blocked\", `Canvas context ${contextId} is not allowed.`);\n }\n}\nfunction hardenCanvasGlobals(policy) {\n if (typeof HTMLCanvasElement !== \"undefined\" && canvasSnapshot.getContext) {\n const contextCanvases = new WeakSet;\n let contextCanvasCount = 0;\n const canvasPolicy2 = policy.canvas;\n HTMLCanvasElement.prototype.getContext = function getContext(contextId, options) {\n if (!canvasPolicy2?.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n assertSandboxCanvasPolicy(canvasPolicy2, this.width, this.height, contextId);\n if (!contextCanvases.has(this)) {\n if (canvasPolicy2.maxCanvases !== undefined && contextCanvasCount >= canvasPolicy2.maxCanvases) {\n throw canvasPolicyError(\"canvas_limit\", \"Canvas limit exceeded.\");\n }\n contextCanvases.add(this);\n contextCanvasCount += 1;\n }\n return canvasSnapshot.getContext.call(this, contextId, options);\n };\n }\n if (canvasSnapshot.offscreenCanvas) {\n const OriginalOffscreenCanvas = canvasSnapshot.offscreenCanvas;\n defineBlockedGlobal(\"OffscreenCanvas\", class extends OriginalOffscreenCanvas {\n constructor(width, height) {\n const canvasPolicy2 = policy.canvas;\n if (!canvasPolicy2?.enabled) {\n throw canvasPolicyError(\"canvas_disabled\", \"Canvas access is disabled.\");\n }\n assertSandboxCanvasPolicy(canvasPolicy2, width, height);\n super(width, height);\n }\n });\n }\n}\nfunction startSlexKitSandboxRunner() {\n hardenNetworkGlobals();\n hardenSchedulingGlobals();\n const pendingFetches = new Map;\n let cleanup;\n let runtimeDispose;\n let activeId;\n let activeToken;\n let heartbeatTimer;\n let rootResizeObserver;\n let slotResizeObserver;\n function clearHeartbeat() {\n if (heartbeatTimer === undefined)\n return;\n schedulingSnapshot.clearInterval?.(heartbeatTimer);\n heartbeatTimer = undefined;\n }\n function startHeartbeat(policy, id, token) {\n clearHeartbeat();\n const intervalMs = Math.max(100, policy.execution?.heartbeatIntervalMs ?? 1000);\n if (!schedulingSnapshot.setInterval)\n return;\n heartbeatTimer = schedulingSnapshot.setInterval(() => {\n post({\n channel: \"slexkit-secure\",\n type: \"heartbeat\",\n id,\n token\n });\n }, intervalMs);\n }\n function dispose(id) {\n if (id && activeId && id !== activeId)\n return;\n clearHeartbeat();\n rootResizeObserver?.disconnect();\n rootResizeObserver = undefined;\n slotResizeObserver?.disconnect();\n slotResizeObserver = undefined;\n cleanup?.();\n runtimeDispose?.();\n for (const pending of pendingFetches.values()) {\n pending.reject(new Error(\"SlexKit sandbox runtime was disposed.\"));\n }\n pendingFetches.clear();\n cleanup = undefined;\n runtimeDispose = undefined;\n activeId = undefined;\n activeToken = undefined;\n const root = frameRoot();\n root.style.removeProperty(\"position\");\n root.style.removeProperty(\"min-height\");\n root.replaceChildren();\n }\n function slotElement(slotId) {\n return document.getElementById(`slexkit-slot-${slotId}`);\n }\n function reportSlotSize(slotId, element) {\n if (!activeId || !activeToken)\n return;\n const height = Math.max(element.scrollHeight, element.getBoundingClientRect().height);\n post({\n channel: \"slexkit-secure\",\n type: \"slot-size\",\n id: activeId,\n token: activeToken,\n slotId,\n height\n });\n }\n function reportFrameSize() {\n if (!activeId || !activeToken)\n return;\n const root = frameRoot();\n const rootRect = root.getBoundingClientRect();\n let contentBottom = rootRect.height;\n for (const child of root.querySelectorAll(\"*\")) {\n const rect = child.getBoundingClientRect();\n contentBottom = Math.max(contentBottom, rect.bottom - rootRect.top);\n }\n const height = Math.max(root.scrollHeight, root.getBoundingClientRect().height, contentBottom, document.body?.scrollHeight ?? 0, document.documentElement?.scrollHeight ?? 0, 1);\n post({\n channel: \"slexkit-secure\",\n type: \"frame-size\",\n id: activeId,\n token: activeToken,\n height\n });\n }\n function observeFrameSize() {\n rootResizeObserver?.disconnect();\n rootResizeObserver = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(() => reportFrameSize()) : undefined;\n const root = frameRoot();\n rootResizeObserver?.observe(root);\n for (const child of root.children) {\n rootResizeObserver?.observe(child);\n }\n reportFrameSize();\n schedulingSnapshot.requestAnimationFrame?.(() => reportFrameSize());\n }\n function applySlotRects(slots) {\n const root = frameRoot();\n const multiSlot = slots.length > 1;\n if (multiSlot) {\n const maxBottom = Math.max(1, ...slots.map((slot) => slot.top + slot.height));\n root.style.position = \"relative\";\n root.style.minHeight = `${Math.ceil(maxBottom)}px`;\n } else {\n root.style.removeProperty(\"position\");\n root.style.removeProperty(\"min-height\");\n }\n slotResizeObserver?.disconnect();\n slotResizeObserver = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver((entries) => {\n for (const entry of entries) {\n const element = entry.target;\n const slotId = element.dataset.slexkitSlotId;\n if (slotId)\n reportSlotSize(slotId, element);\n }\n }) : undefined;\n for (const slot of slots) {\n const element = slotElement(slot.id);\n if (!element)\n continue;\n element.dataset.slexkitSlotId = slot.id;\n element.style.boxSizing = \"border-box\";\n if (multiSlot) {\n element.style.position = \"absolute\";\n element.style.left = `${slot.left}px`;\n element.style.top = `${slot.top}px`;\n } else {\n element.style.removeProperty(\"position\");\n element.style.removeProperty(\"left\");\n element.style.removeProperty(\"top\");\n }\n if (slot.width > 0)\n element.style.width = `${slot.width}px`;\n slotResizeObserver?.observe(element);\n reportSlotSize(slot.id, element);\n }\n }\n async function mountArtifact(message) {\n dispose();\n activeId = message.id;\n activeToken = message.token;\n hardenCanvasGlobals(message.policy);\n applyColorMode(message.colorMode);\n const runtime = createSecureRuntime(message.policy, createBridgeAdapter(message.id, message.token, pendingFetches));\n runtimeDispose = runtime.dispose;\n cleanup = mount(message.input, frameRoot(), {\n theme: message.theme,\n dir: message.dir,\n labels: message.labels,\n api: runtime.api\n });\n startHeartbeat(message.policy, message.id, message.token);\n observeFrameSize();\n post({\n channel: \"slexkit-secure\",\n type: \"mounted\",\n id: message.id,\n token: message.token\n });\n }\n window.addEventListener(\"message\", (event) => {\n if (event.source !== window.parent || !isHostMessage(event.data))\n return;\n const message = event.data;\n try {\n if (message.type === \"mount\") {\n mountArtifact(message).catch((error) => {\n post({\n channel: \"slexkit-secure\",\n type: \"error\",\n id: message.id,\n token: message.token,\n error: serializeRuntimeError(error)\n });\n });\n } else if (message.type === \"dispose\") {\n if (activeToken && message.token !== activeToken)\n return;\n dispose(message.id);\n post({\n channel: \"slexkit-secure\",\n type: \"disposed\",\n id: message.id,\n token: message.token\n });\n } else if (message.type === \"fetch-result\") {\n const response = message;\n if (activeToken && response.token !== activeToken)\n return;\n const pending = pendingFetches.get(response.requestId);\n if (!pending)\n return;\n pendingFetches.delete(response.requestId);\n if (response.error)\n pending.reject(deserializeRuntimeError(response.error));\n else\n pending.resolve(response.result);\n } else if (message.type === \"slots\") {\n if (activeToken && message.token !== activeToken)\n return;\n applySlotRects(message.slots);\n }\n } catch (error) {\n post({\n channel: \"slexkit-secure\",\n type: \"error\",\n id: \"id\" in message ? message.id : undefined,\n token: activeToken,\n error: serializeRuntimeError(error)\n });\n }\n });\n post({\n channel: \"slexkit-secure\",\n type: \"ready\"\n });\n}\n\n// src/runtime.ts\nsetSlexKitRuntimeUrl(import.meta.url);\nvar mountApi = mount;\nvar ingestApi = ingest;\nvar bootApi = boot;\nvar disposeNamespaceApi = disposeNamespace;\nvar registerApi = register;\nvar getRendererApi = getRenderer;\nvar diagnoseSlexKitSourceApi = diagnoseSlexKitSource;\nvar SlexKitSyntaxErrorApi = SlexKitSyntaxError;\nvar formatSlexKitDiagnosticApi = formatSlexKitDiagnostic;\nvar mountSecureArtifactApi = mountSecureArtifact;\nvar parseSlexSourceApi = parseSlexSource;\nvar parseSlexKitDslApi = parseSlexKitDsl;\nvar validateSlexSourceApi = validateSlexSource;\nvar createSecureRuntimeApi = createSecureRuntime;\nvar SlexKitRuntimeErrorApi = SlexKitRuntimeError;\nvar getSlexKitRuntimeUrlApi = getSlexKitRuntimeUrl;\nvar setSlexKitRuntimeUrlApi = setSlexKitRuntimeUrl;\nvar createSlexKitMarkdownRuntimeHostApi = createSlexKitMarkdownRuntimeHost;\nvar getSlexKitMarkdownRuntimeHostApi = getSlexKitMarkdownRuntimeHost;\nvar installSlexKitMarkdownRuntimeHostApi = installSlexKitMarkdownRuntimeHost;\nvar slexkitStdApi = slexkitStd;\nvar attachComponentDisposerApi = attachComponentDisposer;\nvar configureComponentScopeApi = configureComponentScope;\nvar startSlexKitSandboxRunnerApi = startSlexKitSandboxRunner;\nvar getSlexKitInfoApi = getSlexKitInfo;\nexport {\n validateSlexSourceApi as validateSlexSource,\n startSlexKitSandboxRunnerApi as startSlexKitSandboxRunner,\n slexkitStdApi as slexkitStd,\n setSlexKitRuntimeUrlApi as setSlexKitRuntimeUrl,\n registerApi as register,\n parseSlexSourceApi as parseSlexSource,\n parseSlexKitDslApi as parseSlexKitDsl,\n mountSecureArtifactApi as mountSecureArtifact,\n mountApi as mount,\n installSlexKitMarkdownRuntimeHostApi as installSlexKitMarkdownRuntimeHost,\n ingestApi as ingest,\n getSlexKitRuntimeUrlApi as getSlexKitRuntimeUrl,\n getSlexKitMarkdownRuntimeHostApi as getSlexKitMarkdownRuntimeHost,\n getSlexKitInfoApi as getSlexKitInfo,\n getRendererApi as getRenderer,\n formatSlexKitDiagnosticApi as formatSlexKitDiagnostic,\n disposeNamespaceApi as disposeNamespace,\n diagnoseSlexKitSourceApi as diagnoseSlexKitSource,\n createSlexKitMarkdownRuntimeHostApi as createSlexKitMarkdownRuntimeHost,\n createSecureRuntimeApi as createSecureRuntime,\n configureComponentScopeApi as configureComponentScope,\n bootApi as boot,\n attachComponentDisposerApi as attachComponentDisposer,\n SlexKitSyntaxErrorApi as SlexKitSyntaxError,\n SlexKitRuntimeErrorApi as SlexKitRuntimeError,\n SLEX_PROTOCOL_VERSION,\n SLEXKIT_VERSION,\n SLEXKIT_COMPONENTS_VERSION\n};\n"
7
7
  ],
8
8
  "mappings": "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",
9
9
  "debugId": "47E6ACD49C36F18A64756E2164756E21",