claude-artifact-framework 0.12.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/storage.js", "../src/state.js", "../src/react-runtime.js", "../src/appState.js", "../src/theme.js", "../src/chat.js", "../src/blocks.js", "../src/records.js", "../src/steps.js", "../src/app.js"],
4
- "sourcesContent": ["// storage.js \u2014 wrapper over window.storage (Chat Artifacts, published only).\n//\n// Verified empirically against the real runtime: get/set/delete/list all\n// take (key, shared = false) and return a Promise resolving to\n// { key, value, shared, \"@type\": \"...StorageXResponse\" }. Confirmed:\n// - values must be strings (a raw object throws \"Invalid payload content\")\n// - shared=true/false is a real, working scope switch\n// - failures (including \"key not found\") all throw the same generic\n// message with no distinguishing `code` \u2014 there is no reliable way to\n// tell \"empty\" from \"backend error\" from the error alone.\n\nfunction available() {\n return typeof window !== \"undefined\" && typeof window.storage === \"object\" && window.storage !== null;\n}\n\nfunction scope(shared) {\n return {\n async get(key, fallback = undefined) {\n if (!available()) return fallback;\n try {\n const res = await window.storage.get(key, shared);\n if (res?.value === undefined || res?.value === null) return fallback;\n try {\n return JSON.parse(res.value);\n } catch {\n return res.value; // not JSON \u2014 a plain string written via set(key, value, { raw: true })\n }\n } catch {\n // See file header: this same catch fires for \"key does not exist\"\n // and for a real backend failure. Treating both as \"no value\" is\n // the safer default for a read path, at the cost of hiding outages.\n return fallback;\n }\n },\n\n async set(key, value, { raw = false } = {}) {\n if (!available()) {\n throw new Error(\"window.storage is not available (is this a Code Artifact rather than a published Chat Artifact?)\");\n }\n const payload = raw ? value : JSON.stringify(value);\n if (typeof payload !== \"string\") {\n throw new Error(\"window.storage only accepts strings \u2014 the value must be JSON-serializable\");\n }\n return window.storage.set(key, payload, shared);\n },\n\n async delete(key) {\n if (!available()) return;\n try {\n await window.storage.delete(key, shared);\n } catch {\n // same ambiguity as get() \u2014 silently a no-op if the key never existed\n }\n },\n\n async list(prefix) {\n if (!available()) return [];\n try {\n const res = await window.storage.list(prefix, shared);\n return res?.keys || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n// storage.get/set/delete/list operate on the per-viewer (personal) scope.\n// storage.shared.* are the same four methods against the shared scope, where\n// every viewer of the artifact reads and writes the same state.\nexport const storage = { ...scope(false), shared: scope(true), available };\n", "// state.js \u2014 small reactive stores for artifact UI state, layered on storage.js.\n//\n// Three tiers, each a superset of the previous:\n// createStore in-memory only, no persistence\n// createPersistedStore loads from storage once, saves (debounced) on every\n// change \u2014 personal scope, single viewer\n// createSharedStore same, but polls storage.shared so every viewer of a\n// published artifact converges on the same state\n//\n// createSharedStore is last-write-wins with no merge: if two viewers change\n// the same key inside one poll window, whichever write lands last on the\n// server wins and the other is silently overwritten on the next poll. Fine\n// for \"everyone sees the same board/list\", not a CRDT.\n\nimport { storage } from \"./storage.js\";\n\nfunction makeStore(initialState) {\n let state = initialState;\n const subscribers = new Set();\n\n function get() {\n return state;\n }\n\n function set(next) {\n state = typeof next === \"function\" ? next(state) : next;\n subscribers.forEach((fn) => fn(state));\n }\n\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n return { get, set, subscribe };\n}\n\nfunction debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\nexport function createStore(initialState) {\n return makeStore(initialState);\n}\n\nexport function createPersistedStore(key, initialState, { debounceMs = 300 } = {}) {\n const store = makeStore(initialState);\n const persist = debounce((value) => storage.set(key, value), debounceMs);\n\n const ready = storage.get(key, initialState).then((loaded) => store.set(loaded));\n store.subscribe(persist);\n\n return { ...store, ready };\n}\n\nexport function createSharedStore(key, initialState, { pollMs = 2000, debounceMs = 300 } = {}) {\n const store = makeStore(initialState);\n const persist = debounce((value) => storage.shared.set(key, value), debounceMs);\n let applyingRemote = false;\n\n store.subscribe((value) => {\n if (!applyingRemote) persist(value);\n });\n\n async function poll() {\n const remote = await storage.shared.get(key, initialState);\n if (JSON.stringify(remote) === JSON.stringify(store.get())) return;\n applyingRemote = true;\n store.set(remote);\n applyingRemote = false;\n }\n\n const ready = poll();\n const timer = setInterval(poll, pollMs);\n\n return { ...store, ready, stop: () => clearInterval(timer) };\n}\n", "// react-runtime.js \u2014 how the framework gets hold of React.\n//\n// It must use the SAME React the host already loaded: a second copy on the\n// page makes every hook throw. But it must not depend on it with a static\n// `import React from \"react\"` either \u2014 a specifier the host can't resolve\n// kills the whole module at load time, before anything is left running to\n// report why.\n//\n// So React is resolved at runtime, from whichever of these is available:\n//\n// 1. globalThis.React \u2014 present when the host exposes it\n// 2. useReact(React) \u2014 the explicit hand-off\n//\n// The hand-off is one line and always available, because an artifact already\n// imports React for its own code:\n//\n// import React from \"react\";\n// ArtifactKit.useReact(React);\n//\n// Deliberately no dynamic import(\"react\") fallback: it would need top-level\n// await, which the IIFE build can't have, and it only pays off in a runtime\n// with a native import map \u2014 which is not the way artifacts load code.\n\nlet React = typeof globalThis !== \"undefined\" ? globalThis.React : undefined;\n\nexport function useReact(instance) {\n React = instance;\n return instance;\n}\n\nexport function hasReact() {\n return Boolean(React);\n}\n\n// The live instance, for the few places that need React itself rather than one\n// of its functions \u2014 `class extends React.Component`, most of all.\nexport function getReact() {\n return required();\n}\n\nfunction required() {\n if (!React) {\n throw new Error(\n \"claude-artifact-framework: React not found. Hand it over once, before createApp:\\n\\n\" +\n ' import React from \"react\";\\n' +\n \" ArtifactKit.useReact(React);\\n\"\n );\n }\n return React;\n}\n\n// Bound lazily, because modules import these at load time \u2014 which is before\n// useReact() can possibly have run.\nexport const createElement = (...args) => required().createElement(...args);\nexport const useState = (...args) => required().useState(...args);\nexport const useEffect = (...args) => required().useEffect(...args);\nexport const useMemo = (...args) => required().useMemo(...args);\nexport const useRef = (...args) => required().useRef(...args);\n\n// A class component is read as a value at module scope, so it can't be\n// deferred behind a call. This stand-in is only ever constructed if React was\n// still missing at render time, and it reports the same error then.\nexport const Component =\n (React && React.Component) ||\n class ReactMissing {\n render() {\n return required();\n }\n };\n\n// The default export mirrors `import React from \"react\"`, so the source files\n// can keep using React.createElement / React.useState unchanged.\nexport default {\n get createElement() { return required().createElement; },\n get Component() { return required().Component; },\n get useState() { return required().useState; },\n get useEffect() { return required().useEffect; },\n get useMemo() { return required().useMemo; },\n get useRef() { return required().useRef; },\n};\n", "// appState.js \u2014 the store behind createApp.\n//\n// Two states, and the split is the point:\n// data domain data only. Declared by the author, persisted whole in one write.\n// view navigation stack, selection, current step, form drafts, pending flags.\n// Owned by the framework, persisted under its own key, never declared\n// and never seen by the author.\n//\n// That split is why `data` needs no zones or transient markers: nothing that\n// would be wrong to restore (an open modal, a half-typed draft) ever lives in\n// it. It also removes every storage key as an invention point \u2014 the author\n// never names one.\n\nimport { storage } from \"./storage.js\";\n\nconst DATA_KEY = \"caf:data\";\nconst VIEWER_KEY = \"caf:viewer\";\nconst VIEW_KEY = \"caf:view\";\n\nconst EMPTY_VIEW = { screen: null, arg: null, stack: [], step: 0, selected: null, tabs: {}, collapsed: {} };\n\nfunction isPlainObject(v) {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\n// Stored values win, but only where they exist. A field the author added\n// after data was already saved simply falls through to its declared default,\n// which is what makes additive edits need no migration at all.\nfunction mergeDefaults(defaults, stored) {\n if (!isPlainObject(defaults) || !isPlainObject(stored)) {\n return stored === undefined ? defaults : stored;\n }\n const out = { ...defaults };\n for (const key of Object.keys(stored)) {\n out[key] = isPlainObject(defaults[key]) ? mergeDefaults(defaults[key], stored[key]) : stored[key];\n }\n return out;\n}\n\nfunction debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\n// With `shared: true` the DATA pool lives in the shared storage scope, so\n// every viewer of a published artifact converges on the same data (polled,\n// last-write-wins). View state \u2014 navigation, selection, the open record \u2014\n// stays personal ALWAYS: two people looking at the same list should not\n// fight over which screen is open.\nexport function createAppState(defaults, { debounceMs = 400, shared = false, pollMs = 2500 } = {}) {\n const dataStore = shared ? storage.shared : storage;\n let data = structuredCloneish(defaults);\n let view = { ...EMPTY_VIEW };\n let hydrated = false;\n let viewerId = null;\n // Counts update() calls so a poll never overwrites edits that haven't been\n // persisted yet: remote state only applies when we owe storage nothing.\n let writes = 0;\n let persistedWrites = 0;\n const listeners = new Set();\n\n // Notification is batched to a microtask: three mutations in a row produce\n // one render, not three. Persistence is separately debounced, because\n // writing to window.storage is async and must not run at typing speed.\n let queued = false;\n function notify() {\n if (queued) return;\n queued = true;\n Promise.resolve().then(() => {\n queued = false;\n for (const fn of listeners) fn();\n });\n }\n\n const persistData = debounce(() => {\n const at = writes;\n Promise.resolve(dataStore.set(DATA_KEY, data)).then(() => {\n persistedWrites = Math.max(persistedWrites, at);\n }).catch(() => {});\n }, debounceMs);\n const persistView = debounce(() => storage.set(VIEW_KEY, view), debounceMs);\n\n if (shared) {\n setInterval(async () => {\n if (!hydrated || writes > persistedWrites) return; // local edits in flight win\n try {\n const remote = await dataStore.get(DATA_KEY, undefined);\n if (remote !== undefined && JSON.stringify(remote) !== JSON.stringify(data)) {\n data = mergeDefaults(defaults, remote);\n notify();\n }\n } catch {\n // a failed poll just means we try again next tick\n }\n }, pollMs);\n }\n\n const ready = (async () => {\n const [storedData, storedView, storedViewer] = await Promise.all([\n dataStore.get(DATA_KEY, undefined),\n storage.get(VIEW_KEY, undefined),\n storage.get(VIEWER_KEY, undefined),\n ]);\n // A stable anonymous per-viewer id, ALWAYS in the personal scope \u2014 in a\n // shared app it lets declarations express \"one vote per person\" and\n // \"added by\", without any account system.\n if (typeof storedViewer === \"string\" && storedViewer) {\n viewerId = storedViewer;\n } else {\n viewerId = \"v\" + Math.random().toString(36).slice(2, 10) + Math.random().toString(36).slice(2, 6);\n storage.set(VIEWER_KEY, viewerId).catch?.(() => {});\n }\n if (storedData !== undefined) data = mergeDefaults(defaults, storedData);\n if (storedView !== undefined) view = { ...EMPTY_VIEW, ...storedView };\n hydrated = true;\n notify();\n })();\n\n function update(fn) {\n const result = fn(data);\n // Handlers may either mutate the draft or return a replacement.\n if (result !== undefined) data = result;\n data = { ...data };\n writes++;\n persistData();\n notify();\n }\n\n function setView(patch) {\n view = { ...view, ...patch };\n persistView();\n notify();\n }\n\n return {\n ready,\n isHydrated: () => hydrated,\n getViewerId: () => viewerId,\n getData: () => data,\n getView: () => view,\n update,\n setView,\n go(screen, arg) {\n setView({ stack: [...view.stack, { screen: view.screen, arg: view.arg }], screen, arg });\n },\n back() {\n const stack = view.stack.slice();\n const previous = stack.pop() || { screen: null, arg: null };\n setView({ stack, screen: previous.screen, arg: previous.arg });\n },\n subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\n// Defaults come from a literal in the declaration; a shallow structural copy\n// is enough and avoids depending on structuredClone being present.\nfunction structuredCloneish(value) {\n if (Array.isArray(value)) return value.map(structuredCloneish);\n if (isPlainObject(value)) {\n const out = {};\n for (const k of Object.keys(value)) out[k] = structuredCloneish(value[k]);\n return out;\n }\n return value;\n}\n", "// theme.js \u2014 derives a complete palette from a single seed colour.\n//\n// One token in, a full light+dark palette out, with contrast checked rather\n// than assumed. The point is that an app gets its own visual identity from\n// one line while structure stays shared, so apps built with this framework\n// don't all look alike.\n//\n// Neutrals carry a slight hue bias toward the seed instead of being pure\n// grey \u2014 a pure mid-grey reads as unconsidered.\n\nfunction clamp(n, lo, hi) {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction hexToRgb(hex) {\n let h = String(hex).replace(\"#\", \"\").trim();\n if (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n const n = parseInt(h, 16);\n if (!Number.isFinite(n)) return [59, 110, 246];\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(rgb) {\n return \"#\" + rgb.map((v) => clamp(Math.round(v), 0, 255).toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction rgbToHsl([r, g, b]) {\n r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n const d = max - min;\n let h = 0;\n let s = 0;\n if (d) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0);\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h /= 6;\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgb(h, s, l) {\n h = (((h % 360) + 360) % 360) / 360;\n s = clamp(s, 0, 100) / 100;\n l = clamp(l, 0, 100) / 100;\n if (!s) return [l * 255, l * 255, l * 255];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const channel = (t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n return [channel(h + 1 / 3) * 255, channel(h) * 255, channel(h - 1 / 3) * 255];\n}\n\nfunction hsl(h, s, l) {\n return rgbToHex(hslToRgb(h, s, l));\n}\n\nfunction luminance(rgb) {\n const a = rgb.map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n}\n\n// WCAG contrast ratio between two hex colours, 1 (identical) to 21 (max).\nexport function contrast(a, b) {\n const la = luminance(hexToRgb(a));\n const lb = luminance(hexToRgb(b));\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n// Walks lightness until the colour clears `min` contrast against `against`,\n// so the accent is guaranteed legible instead of merely hoped to be.\nfunction accentAt(h, s, against, min, from, step) {\n for (let l = from; l >= 4 && l <= 96; l += step) {\n const candidate = hsl(h, s, l);\n if (contrast(candidate, against) >= min) return candidate;\n }\n return hsl(h, s, step < 0 ? 24 : 82);\n}\n\nexport function palette(seed = \"#3b6ef6\") {\n const [h, rawSat] = rgbToHsl(hexToRgb(seed));\n const sat = clamp(rawSat, 30, 88);\n // Neutrals keep a trace of the seed's hue: chosen, not inherited.\n const tint = clamp(sat * 0.1, 3, 9);\n\n const lightSurface = hsl(h, tint * 0.4, 100);\n const darkSurface = hsl(h, tint * 1.4, 13);\n\n return {\n light: {\n bg: hsl(h, tint, 96.5),\n surface: lightSurface,\n sunken: hsl(h, tint, 93),\n border: hsl(h, tint, 86),\n text: hsl(h, tint * 1.6, 11),\n muted: hsl(h, tint * 1.2, 41),\n accent: accentAt(h, sat, \"#ffffff\", 4.5, 54, -2),\n accentText: \"#ffffff\",\n danger: accentAt(2, 68, \"#ffffff\", 4.5, 54, -2),\n ok: accentAt(148, 62, \"#ffffff\", 4.5, 44, -2),\n warn: accentAt(38, 88, \"#ffffff\", 4.5, 44, -2),\n },\n dark: {\n bg: hsl(h, tint * 1.5, 9),\n surface: darkSurface,\n sunken: hsl(h, tint * 1.5, 7),\n border: hsl(h, tint * 1.3, 24),\n text: hsl(h, tint * 0.6, 95),\n muted: hsl(h, tint * 0.8, 66),\n accent: accentAt(h, clamp(sat, 40, 80), darkSurface, 4.5, 62, 2),\n accentText: hsl(h, tint * 2, 8),\n danger: accentAt(2, 70, darkSurface, 4.5, 62, 2),\n ok: accentAt(148, 55, darkSurface, 4.5, 62, 2),\n warn: accentAt(38, 80, darkSurface, 4.5, 62, 2),\n },\n };\n}\n\nfunction vars(scheme) {\n return Object.entries(scheme)\n .map(([k, v]) => `--caf-${k}: ${v};`)\n .join(\"\");\n}\n\n// Both themes are styled through the same tokens, and the viewer's explicit\n// toggle (data-theme on the root) must beat the OS preference in both\n// directions \u2014 hence the two attribute blocks after the media query.\nexport function themeCss(seed) {\n const p = palette(seed);\n return `\n:root { ${vars(p.light)} }\n@media (prefers-color-scheme: dark) { :root { ${vars(p.dark)} } }\n:root[data-theme=\"dark\"] { ${vars(p.dark)} }\n:root[data-theme=\"light\"] { ${vars(p.light)} }\n`;\n}\n\n// Categorical series colors for charts, derived from the seed by golden-angle\n// hue rotation, so any number of segments stays distinguishable. Mid-tone\n// lightness reads on both the light and dark surface.\nexport function seriesColors(seed, n) {\n const [h0, s0] = rgbToHsl(hexToRgb(seed || \"#3b6ef6\"));\n const s = clamp(s0, 45, 70);\n return Array.from({ length: n }, (_, i) => hsl((h0 + i * 137.5) % 360, s, 52));\n}\n", "// chat.js \u2014 the conversation layout: tutors, advisors, generators, roleplay.\n//\n// Every piece of the network contract here is copied from code proven inside\n// the real artifact runtime (the PDF annotator), not designed on paper:\n//\n// endpoint fetch(\"https://api.anthropic.com/v1/messages\") with NO api\n// key \u2014 the artifact runtime proxies the call and injects auth.\n// streaming stream: true works; SSE parsed via content_block_delta.\n// tools the proxy does NOT support native function calling. Tools are\n// prompted: the model replies with a ```tool_call fenced block\n// holding a JSON array; results go back as a user message\n// tagged [TOOL_RESULT]; loop capped at 8 rounds.\n//\n// The author declares the system prompt and optionally tools that operate on\n// the app's data through ctx.update \u2014 a chat that can drive the app. The\n// framework owns everything that normally ships half-built: message state,\n// live streaming, the busy state, the tool loop, and errors as visible\n// bubbles instead of silent console noise.\n//\n// State split, same philosophy as data/view: `api` holds the exact messages\n// the API needs (including raw tool_call text and [TOOL_RESULT] payloads);\n// `log` holds what a human should see (stripped text, tool pills, errors).\n// Both persist under data.chat, so a conversation survives reload. The\n// in-flight streaming bubble is deliberately ephemeral local state.\n\nimport { createElement as h, useState, useEffect, useRef } from \"react\";\n\nexport const CHAT_KEYS = [\"system\", \"greeting\", \"placeholder\", \"tools\", \"model\", \"maxTokens\"];\n\n// Proven default through the artifact proxy.\nconst DEFAULT_MODEL = \"claude-sonnet-4-6\";\nconst MAX_ROUNDS = 8;\n\nasync function streamCall({ model, maxTokens, system, messages, onText }) {\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ model, max_tokens: maxTokens, system, messages, stream: true }),\n });\n if (!res.ok || !res.body) {\n let detail = \"\";\n try {\n const b = await res.json();\n detail = (b && b.error && b.error.message) || JSON.stringify(b);\n } catch {\n detail = await res.text().catch(() => \"\");\n }\n throw new Error(`HTTP ${res.status}${detail ? \": \" + detail : \"\"}`);\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let full = \"\";\n let buf = \"\"; // reassembles SSE events split across network chunks\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop();\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n try {\n const j = JSON.parse(line.slice(6));\n if (j.type === \"content_block_delta\" && j.delta && j.delta.text) {\n full += j.delta.text;\n if (onText) onText(full);\n }\n } catch {\n // non-JSON lines (pings, [DONE]) are expected \u2014 skip\n }\n }\n }\n return full;\n}\n\nexport function parseToolCalls(text) {\n const match = text.match(/```tool_call\\s*\\n?([\\s\\S]*?)```/);\n if (!match) return null;\n try {\n const calls = JSON.parse(match[1]);\n return Array.isArray(calls) && calls.length ? calls : null;\n } catch {\n return null;\n }\n}\n\nexport function stripToolCallBlock(text) {\n return text.replace(/```tool_call\\s*\\n?[\\s\\S]*?```/, \"\").trim();\n}\n\n// The instructions the model needs to use prompted tools. Appended to the\n// author's system prompt only when tools are declared.\nfunction toolProtocol(tools) {\n const list = Object.entries(tools)\n .map(([name, t]) => `- ${name}: ${t.description}\\n Input: ${JSON.stringify(t.input || {})}`)\n .join(\"\\n\");\n return `\n\nYou have tools available:\n${list}\n\nThis environment does not support native function calling. To use a tool, reply ONLY with a \\`\\`\\`tool_call code block containing a JSON array, with no other text in that turn. Example:\n\n\\`\\`\\`tool_call\n[{ \"name\": \"tool_name\", \"input\": { \"param\": \"value\" } }]\n\\`\\`\\`\n\nYou may include several calls in one array. NEVER invent a tool's result \u2014 emit the pure tool_call block and wait for the real result, which arrives in the next message tagged [TOOL_RESULT]. When you have everything you need, answer in natural language with no tool_call block.`;\n}\n\nfunction runTools(calls, tools, ctx) {\n return calls.map((call) => {\n const tool = tools[call.name];\n if (!tool) {\n // Fed back to the model, loud and in-band: it can correct itself on the\n // next round instead of hallucinating a result.\n return { name: call.name, error: `unknown tool \"${call.name}\". Valid tools: ${Object.keys(tools).join(\", \")}` };\n }\n try {\n const result = tool.run(call.input || {}, ctx);\n return { name: call.name, result: result === undefined ? { ok: true } : result };\n } catch (e) {\n return { name: call.name, error: String((e && e.message) || e) };\n }\n });\n}\n\n// Claude answers in markdown; showing raw asterisks makes every chat app\n// look broken. Minimal renderer: HTML is escaped FIRST, then a small set of\n// markdown forms is layered on, so model output can never inject markup.\nconst escHtml = (t) => String(t).replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" }[c]));\n\nexport function renderMarkdown(text) {\n const codeBlocks = [];\n let t = String(text).replace(/```[a-z]*\\n?([\\s\\S]*?)```/g, (m, code) => {\n codeBlocks.push(code.replace(/\\n$/, \"\"));\n return \"\\u0000\" + (codeBlocks.length - 1) + \"\\u0000\";\n });\n t = escHtml(t);\n t = t.replace(/`([^`]+)`/g, \"<code>$1</code>\");\n t = t.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n t = t.replace(/(^|[^*])\\*([^*\\n]+)\\*/g, \"$1<em>$2</em>\");\n t = t.replace(/^#{1,3} (.+)$/gm, '<strong class=\"caf-md-h\">$1</strong>');\n t = t.replace(/^[-\u2022*] (.+)$/gm, '<span class=\"caf-md-li\">$1</span>');\n t = t.replace(/^\\d+\\. (.+)$/gm, '<span class=\"caf-md-li caf-md-num\">$1</span>');\n t = t.replace(/\\n/g, \"<br>\");\n t = t.replace(/\\u0000(\\d+)\\u0000/g, (m, i) => '<pre class=\"caf-code\">' + escHtml(codeBlocks[Number(i)]) + \"</pre>\");\n return t;\n}\n\nfunction Bubble({ m }) {\n if (m.role === \"tools\") {\n return h(\"div\", { className: \"caf-msg-tools\" }, `used: ${m.tools.join(\", \")}`);\n }\n if (m.role === \"error\") {\n return h(\n \"div\",\n { className: \"caf-msg caf-msg-error\" },\n h(\"strong\", null, \"The call failed\"),\n h(\"span\", null, m.content),\n h(\"span\", { className: \"caf-hint\" }, \"Your message is kept \u2014 send again to retry.\")\n );\n }\n if (m.role === \"user\") return h(\"div\", { className: \"caf-msg caf-msg-user\" }, m.content);\n return h(\"div\", {\n className: \"caf-msg caf-msg-assistant\",\n dangerouslySetInnerHTML: { __html: renderMarkdown(m.content) },\n });\n}\n\n// The embeddable core: everything the chat layout does, as a single column\n// that can live in a workspace sidebar (or any block slot) as well as fill\n// the whole app. One conversation per app \u2014 it persists under data.chat.\nexport function ChatPanel({ cfg, ctx, title }) {\n const c = cfg;\n const [draft, setDraft] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [live, setLive] = useState(null);\n const endRef = useRef(null);\n\n const chat = ctx.data.chat || { api: [], log: [] };\n const log = chat.log || [];\n\n useEffect(() => {\n if (endRef.current) endRef.current.scrollIntoView({ block: \"end\" });\n }, [log.length, live]);\n\n async function send() {\n const text = draft.trim();\n if (!text || busy) return;\n setDraft(\"\");\n setBusy(true);\n\n // api/log are threaded locally through the loop; ctx.data would be stale\n // inside this closure after each update().\n let api = [...(chat.api || []), { role: \"user\", content: text }];\n let logNow = [...log, { role: \"user\", content: text }];\n const commit = () => ctx.update((d) => { d.chat = { api, log: logNow }; });\n commit();\n\n try {\n const system =\n (typeof c.system === \"function\" ? c.system(ctx.data) : c.system || \"\") +\n (c.tools ? toolProtocol(c.tools) : \"\");\n\n for (let round = 0; round < MAX_ROUNDS; round++) {\n const raw = await streamCall({\n model: c.model || DEFAULT_MODEL,\n maxTokens: c.maxTokens || 2000,\n system,\n messages: api,\n onText: (t) => setLive(stripToolCallBlock(t)),\n });\n\n api = [...api, { role: \"assistant\", content: raw }];\n const shown = stripToolCallBlock(raw);\n const calls = c.tools ? parseToolCalls(raw) : null;\n\n if (!calls) {\n logNow = [...logNow, { role: \"assistant\", content: shown || raw }];\n commit();\n break;\n }\n\n const results = runTools(calls, c.tools, ctx);\n if (shown) logNow = [...logNow, { role: \"assistant\", content: shown }];\n logNow = [...logNow, { role: \"tools\", tools: calls.map((x) => x.name) }];\n api = [\n ...api,\n {\n role: \"user\",\n content: `[TOOL_RESULT]\\n${JSON.stringify(results)}\\n[/TOOL_RESULT]\\n\\nContinue with this information. If you have everything you need, answer in natural language without further tool_call.`,\n },\n ];\n commit();\n setLive(null);\n }\n } catch (e) {\n logNow = [...logNow, { role: \"error\", content: String((e && e.message) || e) }];\n commit();\n } finally {\n setLive(null);\n setBusy(false);\n }\n }\n\n return h(\n \"div\",\n { className: \"caf-chat-panel\" },\n h(\n \"div\",\n { className: \"caf-block caf-chat-log\" },\n // Every other block opens with its title label \u2014 a chat card that\n // starts straight at a bubble was the one heading-less block on screen.\n title ? h(\"h2\", { className: \"caf-block-title\" }, title) : null,\n c.greeting\n ? h(\"div\", { className: \"caf-msg caf-msg-assistant\", dangerouslySetInnerHTML: { __html: renderMarkdown(c.greeting) } })\n : null,\n log.map((m, i) => h(Bubble, { key: i, m })),\n live !== null\n ? h(\"div\", { className: \"caf-msg caf-msg-assistant caf-msg-live\", dangerouslySetInnerHTML: { __html: renderMarkdown(live || \"\u2026\") } })\n : null,\n busy && live === null ? h(\"div\", { className: \"caf-msg-tools\" }, \"thinking\u2026\") : null,\n h(\"div\", { ref: endRef })\n ),\n // Deliberately NOT a <form>: the artifact iframe's sandbox lacks\n // allow-forms, so native form submission is blocked there \u2014 and on mobile\n // the keyboard's send key triggers exactly that implicit submission. A\n // plain div with onClick + Enter via onKeyDown never touches the native\n // form machinery, so it can't be sandboxed away.\n h(\n \"div\",\n { className: \"caf-chat-input\" },\n h(\"input\", {\n value: draft,\n placeholder: c.placeholder || \"Message\u2026\",\n disabled: busy,\n enterKeyHint: \"send\",\n onChange: (e) => setDraft(e.target.value),\n onKeyDown: (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n send();\n }\n },\n \"aria-label\": \"Message\",\n }),\n h(\n \"button\",\n { type: \"button\", className: \"caf-btn caf-btn-primary\", disabled: busy || !draft.trim(), onClick: send },\n \"Send\"\n )\n )\n );\n}\n\nexport function ChatLayout({ spec, ctx }) {\n return h(\"div\", { className: \"caf-panel caf-panel-single\" }, h(ChatPanel, { cfg: spec.chat, ctx }));\n}\n", "// blocks.js \u2014 the content blocks that fill a layout's slots.\n//\n// Every block is a plain React component taking (spec, ctx). Custom code from\n// the escape hatch implements exactly the same contract, which is why ejecting\n// one block never requires ejecting the app.\n//\n// Loading / empty / error are part of the contract rather than edge cases the\n// author opts into: a block that has nothing to show says so by default, so an\n// app can't ship a blank pane while it waits.\n\n// Bound lazily rather than snapshotted as `React.createElement`, because this\n// runs at module load \u2014 before the host has had a chance to hand React over.\nimport { createElement as h, useState, useEffect } from \"react\";\nimport { ChatPanel } from \"./chat.js\";\n\nconst FIELD_TYPES = [\"text\", \"textarea\", \"number\", \"money\", \"percent\", \"check\", \"date\", \"select\", \"file\"];\n\nexport function formatValue(value, format) {\n if (value === null || value === undefined || value === \"\") return \"\u2014\";\n const n = Number(value);\n switch (format) {\n case \"money\":\n return Number.isFinite(n)\n ? n.toLocaleString(undefined, { style: \"currency\", currency: \"USD\", maximumFractionDigits: 2 })\n : String(value);\n case \"percent\":\n return Number.isFinite(n) ? `${n.toLocaleString(undefined, { maximumFractionDigits: 2 })}%` : String(value);\n case \"number\":\n return Number.isFinite(n) ? n.toLocaleString(undefined, { maximumFractionDigits: 2 }) : String(value);\n case \"date\":\n return value instanceof Date ? value.toLocaleDateString() : String(value);\n default:\n return String(value);\n }\n}\n\n// Validation is derived from the field declaration, so the author gets it\n// without writing any: declaring a type and a range IS the validation.\nexport function validateField(field, value) {\n if (field.required && (value === \"\" || value === null || value === undefined)) {\n return \"Required\";\n }\n if (value === \"\" || value === null || value === undefined) return null;\n if (field.type === \"number\" || field.type === \"money\" || field.type === \"percent\") {\n const n = Number(value);\n if (!Number.isFinite(n)) return \"Must be a number\";\n if (field.min !== undefined && n < field.min) return `Must be at least ${field.min}`;\n if (field.max !== undefined && n > field.max) return `Must be at most ${field.max}`;\n }\n return null;\n}\n\nexport function Field({ field, value, onChange, data }) {\n const error = validateField(field, value);\n const id = `caf-f-${field.key}`;\n const numeric = field.type === \"number\" || field.type === \"money\" || field.type === \"percent\";\n\n if (field.type === \"file\") {\n // The File object itself lives at ctx.files[key] (in memory only \u2014 the\n // 5MB/key storage limit makes real files unpersistable); `data` gets\n // serializable metadata. After a reload the metadata survives but the\n // file must be picked again.\n return h(\n \"div\",\n { className: \"caf-field\" },\n h(\"label\", { htmlFor: id }, field.label || field.key),\n h(\"input\", {\n id,\n type: \"file\",\n accept: field.accept,\n onChange: (e) => onChange(e.target.files && e.target.files[0] ? e.target.files[0] : null),\n }),\n value && value.name\n ? h(\"small\", { className: \"caf-hint\" }, `${value.name} (${Math.round((value.size || 0) / 1024)} KB)${value.stale ? \" \u2014 re-pick after reload\" : \"\"}`)\n : field.hint\n ? h(\"small\", { className: \"caf-hint\" }, field.hint)\n : null\n );\n }\n\n if (field.type === \"check\") {\n return h(\n \"label\",\n { className: \"caf-check\" },\n h(\"input\", {\n id,\n type: \"checkbox\",\n checked: Boolean(value),\n onChange: (e) => onChange(e.target.checked),\n }),\n h(\"span\", null, field.label || field.key)\n );\n }\n\n const common = {\n id,\n value: value === null || value === undefined ? \"\" : value,\n \"aria-invalid\": error ? \"true\" : undefined,\n onChange: (e) => onChange(numeric ? toNumber(e.target.value) : e.target.value),\n };\n\n let control;\n if (field.type === \"textarea\") {\n control = h(\"textarea\", { ...common, rows: field.rows || 3 });\n } else if (field.type === \"select\") {\n // Options may be declared as a function of the app data, for selects\n // whose choices come from what the user has entered elsewhere.\n const options = typeof field.options === \"function\" ? field.options(data) || [] : field.options || [];\n control = h(\n \"select\",\n common,\n h(\"option\", { value: \"\" }, field.placeholder || \"Select\u2026\"),\n options.map((opt) => {\n const val = typeof opt === \"string\" ? opt : opt.value;\n const label = typeof opt === \"string\" ? opt : opt.label;\n return h(\"option\", { key: val, value: val }, label);\n })\n );\n } else {\n control = h(\"input\", {\n ...common,\n type: field.type === \"date\" ? \"date\" : numeric ? \"number\" : \"text\",\n min: field.min,\n max: field.max,\n step: field.step || (field.type === \"money\" || field.type === \"percent\" ? \"any\" : undefined),\n placeholder: field.placeholder,\n });\n }\n\n return h(\n \"div\",\n { className: \"caf-field\" },\n h(\"label\", { htmlFor: id }, field.label || field.key),\n control,\n field.hint && !error ? h(\"small\", { className: \"caf-hint\" }, field.hint) : null,\n error ? h(\"small\", { className: \"caf-error\" }, error) : null\n );\n}\n\nfunction toNumber(raw) {\n if (raw === \"\") return \"\";\n const n = Number(raw);\n return Number.isFinite(n) ? n : raw;\n}\n\n// One write path for every field container: file fields park the live File\n// at ctx.files[key] and store metadata; everything else writes the value.\nexport function writeField(ctx, key, field, v, setter) {\n if (field.type === \"file\") {\n ctx.files[key] = v || null;\n const meta = v ? { name: v.name, size: v.size, type: v.type } : null;\n ctx.update((d) => setter(d, meta));\n return;\n }\n ctx.update((d) => setter(d, v));\n}\n\nexport function FieldsBlock({ spec, ctx }) {\n const fields = spec.fields || [];\n return h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: ctx.data[field.key],\n onChange: (v) => writeField(ctx, field.key, field, v, (d, val) => { d[field.key] = val; }),\n })\n )\n );\n}\n\nexport function OutputBlock({ spec, ctx }) {\n const items = typeof spec.output === \"function\" ? spec.output(ctx.data) : spec.output || [];\n if (!items.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"Nothing to show yet.\");\n }\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label || i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format)),\n item.hint ? h(\"small\", { className: \"caf-hint\" }, item.hint) : null\n )\n )\n )\n );\n}\n\nexport function TextBlock({ spec, ctx }) {\n const body = typeof spec.text === \"function\" ? spec.text(ctx.data) : spec.text;\n return h(\n \"div\",\n { className: \"caf-block caf-text\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\"p\", null, body)\n );\n}\n\nexport function ListBlock({ spec, ctx }) {\n const rows = (typeof spec.list === \"function\" ? spec.list(ctx.data) : spec.list) || [];\n // `title` follows the same convention as every other block: a string is the\n // block heading. A function is the per-row title. Both are supported \u2014\n // making list the odd one out was an API inconsistency a blind test caught.\n const heading = typeof spec.title === \"string\" ? spec.title : null;\n const rowTitle = typeof spec.title === \"function\" ? spec.title : (r) => r.title ?? r.name ?? r.label ?? r.text ?? String(r);\n if (!rows.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"Nothing here yet.\");\n }\n return h(\n \"div\",\n { className: \"caf-block caf-list\" },\n heading ? h(\"h2\", { className: \"caf-block-title\" }, heading) : null,\n rows.map((row, i) =>\n h(\n \"button\",\n {\n key: row.id ?? i,\n className: \"caf-row\",\n type: \"button\",\n onClick: spec.onSelect ? () => spec.onSelect(row, ctx) : undefined,\n },\n h(\"span\", { className: \"caf-row-title\" }, rowTitle(row)),\n spec.subtitle ? h(\"span\", { className: \"caf-row-sub\" }, spec.subtitle(row)) : null\n )\n )\n );\n}\n\nconst CHART_TYPES = [\"bar\", \"line\", \"donut\"];\n\n// Charts share the output block's vocabulary \u2014 items of { label, value } plus\n// an optional format \u2014 so declaring one teaches nothing new. Colors come from\n// ctx.colors(n), derived from the theme seed, so a chart can't clash with the\n// app it lives in.\nexport function ChartBlock({ spec, ctx }) {\n const c = typeof spec.chart === \"function\" ? spec.chart(ctx.data) : spec.chart;\n const items = (c && c.items) || [];\n if (!items.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"No data to chart yet.\");\n }\n const type = c.type || \"bar\";\n if (!CHART_TYPES.includes(type)) {\n // Thrown, not swallowed: the block boundary turns this into a visible,\n // named error instead of an empty pane.\n throw new Error(`unknown chart type \"${type}\". Valid types: ${CHART_TYPES.join(\", \")}.`);\n }\n const colors = ctx.colors(items.length);\n const body =\n type === \"bar\" ? barChart(items, c, colors) : type === \"line\" ? lineChart(items, c) : donutChart(items, c, colors);\n return h(\n \"div\",\n { className: \"caf-block caf-chart\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n body\n );\n}\n\nfunction barChart(items, c, colors) {\n const max = Math.max(...items.map((it) => Number(it.value) || 0), 0) || 1;\n return h(\n \"div\",\n { className: \"caf-bars\" },\n items.map((it, i) =>\n h(\n \"div\",\n { key: it.label ?? i, className: \"caf-bar-row\" },\n h(\"span\", { className: \"caf-bar-label\" }, it.label),\n h(\n \"div\",\n { className: \"caf-bar-track\" },\n h(\"div\", {\n className: \"caf-bar-fill\",\n style: { width: `${Math.max(2, ((Number(it.value) || 0) / max) * 100)}%`, background: colors[i] },\n })\n ),\n h(\"span\", { className: \"caf-bar-value\" }, formatValue(it.value, c.format))\n )\n )\n );\n}\n\nfunction lineChart(items, c) {\n const values = items.map((it) => Number(it.value) || 0);\n const min = Math.min(...values);\n const max = Math.max(...values);\n const span = max - min || 1;\n const W = 100;\n const H = 36;\n const pts = values.map((v, i) => [\n values.length === 1 ? W / 2 : (i / (values.length - 1)) * W,\n H - 3 - ((v - min) / span) * (H - 6),\n ]);\n const last = pts[pts.length - 1];\n return h(\n \"div\",\n { className: \"caf-line\" },\n h(\n \"svg\",\n { viewBox: `0 0 ${W} ${H}`, className: \"caf-line-svg\", preserveAspectRatio: \"none\", \"aria-hidden\": \"true\" },\n [0.25, 0.5, 0.75].map((f) =>\n h(\"line\", { key: f, x1: 0, x2: W, y1: H * f, y2: H * f, className: \"caf-line-grid\" })\n ),\n h(\"polyline\", { points: pts.map((p) => p.join(\",\")).join(\" \"), className: \"caf-line-path\" }),\n h(\"circle\", { cx: last[0], cy: last[1], r: 1.6, className: \"caf-line-dot\" })\n ),\n h(\n \"div\",\n { className: \"caf-line-meta\" },\n h(\"span\", { className: \"caf-hint\" }, String(items[0].label ?? \"\")),\n h(\"span\", { className: \"caf-line-last\" }, formatValue(values[values.length - 1], c.format)),\n h(\"span\", { className: \"caf-hint\" }, String(items[items.length - 1].label ?? \"\"))\n )\n );\n}\n\nfunction donutChart(items, c, colors) {\n const total = items.reduce((s, it) => s + (Number(it.value) || 0), 0) || 1;\n const R = 15.9155; // circumference \u2248 100, so dash lengths are percentages\n let offset = 25; // start at 12 o'clock\n const segments = items.map((it, i) => {\n const pct = ((Number(it.value) || 0) / total) * 100;\n const seg = h(\"circle\", {\n key: it.label ?? i,\n cx: 21, cy: 21, r: R,\n className: \"caf-donut-seg\",\n stroke: colors[i],\n strokeDasharray: `${pct} ${100 - pct}`,\n strokeDashoffset: offset,\n });\n offset -= pct;\n return seg;\n });\n return h(\n \"div\",\n { className: \"caf-donut\" },\n h(\"svg\", { viewBox: \"0 0 42 42\", className: \"caf-donut-svg\", \"aria-hidden\": \"true\" }, segments),\n h(\n \"div\",\n { className: \"caf-donut-legend\" },\n items.map((it, i) =>\n h(\n \"div\",\n { key: it.label ?? i, className: \"caf-legend-row\" },\n h(\"span\", { className: \"caf-legend-swatch\", style: { background: colors[i] } }),\n h(\"span\", { className: \"caf-legend-label\" }, it.label),\n h(\"span\", { className: \"caf-legend-value\" }, formatValue(it.value, c.format))\n )\n )\n )\n );\n}\n\n// The interval is framework-owned and cleaned up on unmount \u2014 a leaked\n// setInterval is one of the classic half-built artifact bugs. The countdown\n// itself is deliberately ephemeral (local state); what the author declares is\n// what happens WHEN it finishes: onDone runs through update(), so its effects\n// persist like any other change.\nexport function TimerBlock({ spec, ctx }) {\n const t = spec.timer || {};\n const total = Math.max(1, Math.round((t.minutes || 0) * 60 + (t.seconds || 0)) || 300);\n const [left, setLeft] = useState(total);\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n if (!running) return;\n const id = setInterval(() => setLeft((prev) => Math.max(0, prev - 1)), 1000);\n return () => clearInterval(id);\n }, [running]);\n\n useEffect(() => {\n if (left === 0 && running) {\n setRunning(false);\n if (typeof t.onDone === \"function\") ctx.update((d) => t.onDone(d));\n }\n }, [left, running]);\n\n const mm = String(Math.floor(left / 60)).padStart(2, \"0\");\n const ss = String(left % 60).padStart(2, \"0\");\n const done = left === 0;\n\n return h(\n \"div\",\n { className: \"caf-block caf-timer\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n t.label ? h(\"span\", { className: \"caf-hint\" }, t.label) : null,\n h(\"div\", { className: done ? \"caf-timer-time caf-timer-done\" : \"caf-timer-time\" }, done ? (t.doneText || \"Done!\") : `${mm}:${ss}`),\n h(\"div\", { className: \"caf-bar-track\" }, h(\"div\", { className: \"caf-bar-fill caf-timer-fill\", style: { width: `${(left / total) * 100}%` } })),\n h(\n \"div\",\n { className: \"caf-timer-controls\" },\n h(\n \"button\",\n { type: \"button\", className: \"caf-btn caf-btn-primary\", disabled: done, onClick: () => setRunning((r) => !r) },\n running ? \"Pause\" : \"Start\"\n ),\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => { setRunning(false); setLeft(total); } }, \"Reset\")\n )\n );\n}\n\n// Declarative buttons that mutate data \u2014 the one-tap interactions (counters,\n// check-ins, +1s) that previously forced an escape to custom code.\nexport function ActionsBlock({ spec, ctx }) {\n const actions = spec.actions || [];\n const visible = actions.filter((a) => !a.when || a.when(ctx.data, ctx.viewerId));\n return h(\n \"div\",\n { className: \"caf-block caf-actions\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\n \"div\",\n { className: \"caf-actions-row\" },\n visible.map((a) =>\n h(\n \"button\",\n {\n key: a.label,\n type: \"button\",\n className:\n a.kind === \"danger\"\n ? \"caf-btn caf-btn-danger\"\n : a.kind === \"primary\"\n ? \"caf-btn caf-btn-primary\"\n : \"caf-btn\",\n onClick: () => ctx.update((d) => a.run(d, ctx.viewerId)),\n },\n a.label\n )\n )\n )\n );\n}\n\n// The escape hatch. Receives the same ctx every built-in block gets, so a\n// custom block keeps persistence, theming, navigation and the error boundary.\nexport function CustomBlock({ spec, ctx }) {\n const rendered = spec.custom(ctx);\n // `fill: true` frees the block from the card chrome so it can own a large\n // scrollable surface (a viewer, a canvas) \u2014 the workspace main-area case.\n const cls = spec.fill ? \"caf-block caf-block-fill\" : \"caf-block\";\n if (typeof rendered === \"string\") {\n return h(\"div\", { className: cls, dangerouslySetInnerHTML: { __html: rendered } });\n }\n return h(\"div\", { className: cls }, rendered);\n}\n\nexport const BLOCKS = {\n fields: FieldsBlock,\n output: OutputBlock,\n text: TextBlock,\n list: ListBlock,\n chart: ChartBlock,\n timer: TimerBlock,\n actions: ActionsBlock,\n chat: ({ spec, ctx }) => h(ChatPanel, { cfg: spec.chat, ctx, title: spec.title }),\n custom: CustomBlock,\n};\n\nexport const BLOCK_NAMES = Object.keys(BLOCKS);\nexport { FIELD_TYPES };\n", "// records.js \u2014 the \"list of things\" layout: expenses, habits, notes, todos.\n//\n// The author declares what a record IS (the same field declarations the\n// fields block uses) and optionally what the collection summarises to. The\n// whole CRUD lifecycle \u2014 list, add, edit, delete, empty state, selection,\n// navigation \u2014 is framework-owned, so none of it can be half-built.\n//\n// Two deliberate choices keep the state model tiny:\n//\n// add-then-edit \"Add\" creates the record from field defaults and navigates\n// straight into it. There is no separate draft object, so a\n// half-typed record can't be lost \u2014 it already exists.\n// edit-in-place Detail fields write into the record directly through\n// update(), so persistence and re-render are the same\n// debounced path every other block uses.\n//\n// Which record is open lives in view state (screen \"record\", arg = id), never\n// in data \u2014 restoring it on reload is correct, and deleting the open record\n// simply falls back to the list.\n\nimport { createElement as h, useState, useEffect } from \"react\";\nimport { Field, formatValue } from \"./blocks.js\";\n\n// Computed fields are derived at render time and never stored, so they can't\n// go stale. Accepts `{ subtotal: (r) => ... }` or\n// `{ subtotal: { label, format, value: (r) => ... } }`.\nfunction computedEntries(spec) {\n return Object.entries(spec.compute || {}).map(([k, v]) => [k, typeof v === \"function\" ? { value: v } : v]);\n}\n\nexport function withComputed(spec, rec) {\n if (!spec.compute) return rec;\n const out = { ...rec };\n for (const [key, c] of computedEntries(spec)) {\n try {\n out[key] = c.value(rec);\n } catch {\n out[key] = undefined;\n }\n }\n return out;\n}\n\nexport function recordDefaults(fields) {\n const rec = {};\n for (const f of fields) {\n rec[f.key] = f.value !== undefined ? f.value : f.type === \"check\" ? false : \"\";\n }\n return rec;\n}\n\n// Collision-proof enough for a per-user list; no coordination needed.\nfunction makeId() {\n return \"r\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nfunction rowTitle(spec, rec) {\n if (spec.title) return spec.title(rec);\n // Default: the first text-ish field, which is what a human would label by.\n const f = spec.fields.find((f) => !f.type || f.type === \"text\" || f.type === \"textarea\" || f.type === \"select\");\n const v = f && rec[f.key];\n return v === \"\" || v === undefined || v === null ? \"(untitled)\" : String(v);\n}\n\nfunction Summary({ spec, records }) {\n if (!spec.summary) return null;\n const items = spec.summary(records) || [];\n if (!items.length) return null;\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label || i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format))\n )\n )\n )\n );\n}\n\nfunction ListScreen({ spec, ctx }) {\n const label = spec.label || \"item\";\n const [query, setQuery] = useState(\"\");\n // Records can land in the collection without the framework's Add button \u2014\n // a chat tool, an author action, hand-written `data`. Assigning ids is the\n // framework's job (it's reserved), so complete any record missing one;\n // otherwise its row can never open a detail screen.\n useEffect(() => {\n if ((ctx.data.records || []).some((r) => r && !r.id)) {\n ctx.update((d) => {\n for (const r of d.records || []) if (r && !r.id) r.id = makeId();\n });\n }\n });\n let records = ctx.data.records.map((r) => withComputed(spec, r));\n if (spec.sort) records = records.slice().sort(spec.sort);\n const total = records.length;\n const q = query.trim().toLowerCase();\n if (spec.search && q) {\n records = records.filter((r) =>\n spec.fields.some((f) => String(r[f.key] ?? \"\").toLowerCase().includes(q))\n );\n }\n\n function add() {\n const rec = { id: makeId(), ...recordDefaults(spec.fields) };\n if (spec.items) rec.items = [];\n ctx.update((d) => {\n d.records = [...d.records, rec];\n });\n ctx.go(\"record\", rec.id);\n }\n\n return h(\n \"div\",\n { className: \"caf-block caf-list\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\n \"span\",\n { className: \"caf-count\" },\n spec.search && q ? `${records.length} of ${total}` : `${total} ${label}${total === 1 ? \"\" : \"s\"}`\n ),\n h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-primary\", onClick: add }, `Add ${label}`)\n ),\n spec.search\n ? h(\"input\", {\n className: \"caf-search\",\n value: query,\n placeholder: `Search ${label}s\u2026`,\n \"aria-label\": \"Search\",\n onChange: (e) => setQuery(e.target.value),\n })\n : null,\n spec.search && q && records.length === 0 && total > 0\n ? h(\"div\", { className: \"caf-empty\" }, `Nothing matches \"${query}\".`)\n : null,\n records.length === 0\n ? h(\"div\", { className: \"caf-empty\" }, spec.empty || `No ${label}s yet. Add the first one.`)\n : records.map((rec) =>\n h(\n \"div\",\n { key: rec.id, className: \"caf-row-wrap\" },\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-row\",\n onClick: () => ctx.go(\"record\", rec.id),\n },\n h(\"span\", { className: \"caf-row-title\" }, rowTitle(spec, rec)),\n spec.subtitle ? h(\"span\", { className: \"caf-row-sub\" }, spec.subtitle(rec)) : null\n ),\n spec.actions\n ? h(\n \"div\",\n { className: \"caf-row-actions\" },\n spec.actions\n .filter((a) => !a.when || a.when(rec, ctx.viewerId))\n .map((a) =>\n h(\n \"button\",\n {\n key: a.label,\n type: \"button\",\n className: a.kind === \"danger\" ? \"caf-btn caf-btn-danger caf-btn-sm\" : \"caf-btn caf-btn-sm\",\n onClick: () =>\n ctx.update((d) => {\n const live = d.records.find((x) => x.id === rec.id);\n if (live) a.run(live, d, ctx.viewerId);\n }),\n },\n a.label\n )\n )\n )\n : null\n )\n )\n );\n}\n\nfunction DetailScreen({ spec, ctx, record }) {\n const label = spec.label || \"item\";\n\n function remove() {\n ctx.update((d) => {\n d.records = d.records.filter((r) => r.id !== record.id);\n });\n ctx.back();\n }\n\n return h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: ctx.back }, \"\u2039 Back\"),\n h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-danger\", onClick: remove }, `Delete ${label}`)\n ),\n spec.fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: record[field.key],\n onChange: (v) =>\n ctx.update((d) => {\n const rec = d.records.find((r) => r.id === record.id);\n if (rec) rec[field.key] = v;\n }),\n })\n ),\n spec.items ? h(ItemsEditor, { spec, ctx, record }) : null,\n spec.compute\n ? h(\n \"div\",\n { className: \"caf-output-grid caf-computed\" },\n computedEntries(spec).map(([key, c]) => {\n const live = withComputed(spec, record);\n return h(\n \"div\",\n { key, className: \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, c.label || key),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(live[key], c.format))\n );\n })\n )\n : null\n );\n}\n\n// The child collection edits INLINE on the parent's detail screen \u2014 one\n// navigation level, no child screens. That bounds the feature honestly: items\n// are for small rows (2-4 fields), not for records that deserve their own\n// detail view.\nfunction ItemsEditor({ spec, ctx, record }) {\n const ispec = spec.items;\n const label = ispec.label || \"item\";\n\n function mutate(fn) {\n ctx.update((d) => {\n const rec = d.records.find((r) => r.id === record.id);\n if (!rec) return;\n if (!Array.isArray(rec.items)) rec.items = [];\n fn(rec);\n });\n }\n\n const items = Array.isArray(record.items) ? record.items : [];\n\n return h(\n \"div\",\n { className: \"caf-items\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\"span\", { className: \"caf-count\" }, `${items.length} ${label}${items.length === 1 ? \"\" : \"s\"}`),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-sm\",\n onClick: () => mutate((rec) => rec.items.push({ id: makeId(), ...recordDefaults(ispec.fields) })),\n },\n `Add ${label}`\n )\n ),\n items.length === 0\n ? h(\"div\", { className: \"caf-empty caf-empty-sm\" }, ispec.empty || `No ${label}s yet.`)\n : items.map((item) =>\n h(\n \"div\",\n { key: item.id, className: \"caf-item-row\" },\n ispec.fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: item[field.key],\n onChange: (v) =>\n mutate((rec) => {\n const it = rec.items.find((x) => x.id === item.id);\n if (it) it[field.key] = v;\n }),\n })\n ),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-danger caf-btn-sm caf-item-remove\",\n \"aria-label\": `Remove ${label}`,\n onClick: () => mutate((rec) => { rec.items = rec.items.filter((x) => x.id !== item.id); }),\n },\n \"\u2715\"\n )\n )\n )\n );\n}\n\n// The block form of records: the same list/detail/summary machinery embedded\n// wherever panel blocks go (panel, workspace panes, documents, tabs). The\n// collection lives in the enclosing data pool under `key` (default\n// \"records\"), so inside `documents` each document gets its own collection\n// for free. The open record is view state under a per-collection key \u2014\n// list/detail navigation without touching the app-level screen stack.\nfunction aliasRecords(d, key) {\n if (key === \"records\") return d;\n // The internal machinery reads and writes `d.records`; alias it onto the\n // author's collection key while leaving every other property untouched\n // (author actions receive this same object and see the real pool).\n return new Proxy(d, {\n get: (t, p, r) => (p === \"records\" ? t[key] : Reflect.get(t, p, r)),\n set: (t, p, v) => Reflect.set(t, p === \"records\" ? key : p, v),\n has: (t, p) => (p === \"records\" ? key in t : p in t),\n });\n}\n\nexport function RecordsBlock({ spec, ctx }) {\n const rspec = spec.records;\n const key = rspec.key || \"records\";\n const arr = Array.isArray(ctx.data[key]) ? ctx.data[key] : [];\n const stateKey = \"caf:rec:\" + key;\n const openId = ctx.view.tabs ? ctx.view.tabs[stateKey] : undefined;\n\n const scoped = {\n ...ctx,\n data: { ...ctx.data, records: arr },\n update: (fn) => ctx.update((d) => fn(aliasRecords(d, key))),\n go: (_screen, id) => ctx.setTab(stateKey, id),\n back: () => ctx.setTab(stateKey, undefined),\n };\n\n // A deleted or stale open record falls back to the list, never a blank pane.\n const record = openId ? arr.find((r) => r.id === openId) : null;\n\n return h(\n \"div\",\n { className: \"caf-records-block\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n record\n ? h(DetailScreen, { key: \"d\", spec: rspec, ctx: scoped, record })\n : [\n h(Summary, { key: \"s\", spec: rspec, records: arr.map((r) => withComputed(rspec, r)) }),\n h(ListScreen, { key: \"l\", spec: rspec, ctx: scoped }),\n ]\n );\n}\n\nexport function RecordsLayout({ spec, ctx }) {\n const rspec = spec.records;\n\n if (ctx.view.screen === \"record\") {\n const record = ctx.data.records.find((r) => r.id === ctx.view.arg);\n // The open record can vanish (deleted, or stale view state from an earlier\n // version of the data) \u2014 fall back to the list rather than a blank pane.\n if (record) {\n return h(\"div\", { className: \"caf-panel caf-panel-single\" }, h(DetailScreen, { spec: rspec, ctx, record }));\n }\n }\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(Summary, { spec: rspec, records: ctx.data.records.map((r) => withComputed(rspec, r)) }),\n h(ListScreen, { spec: rspec, ctx })\n );\n}\n", "// steps.js \u2014 the wizard layout: quizzes, assessments, staged calculators,\n// long forms, onboarding.\n//\n// The author declares the sequence; next/back/progress/result are\n// framework-owned. Three rules keep it un-breakable:\n//\n// one data pool step fields write into the same flat `data` every other\n// block uses, so a result step is just a function of data \u2014\n// no \"collect answers\" plumbing to half-build.\n// gated next Next is disabled while any field on the CURRENT step is\n// invalid; earlier steps are already valid by construction,\n// later ones aren't the user's problem yet.\n// resumable the current step lives in view state, so a reload lands\n// on the step the user was on, holding their answers.\n\nimport { createElement as h } from \"react\";\nimport { Field, validateField, formatValue, writeField } from \"./blocks.js\";\n\nfunction stepErrors(step, data) {\n return (step.fields || []).some((f) => validateField(f, data[f.key]) !== null);\n}\n\nfunction ResultScreen({ step, ctx }) {\n const items = step.result(ctx.data) || [];\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n step.title ? h(\"h2\", { className: \"caf-block-title\" }, step.title) : null,\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label ?? i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format)),\n item.hint ? h(\"small\", { className: \"caf-hint\" }, item.hint) : null\n )\n )\n ),\n h(\n \"div\",\n { className: \"caf-step-nav\" },\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => ctx.setStep(0) }, \"Start over\")\n )\n );\n}\n\nexport function StepsLayout({ spec, ctx }) {\n const steps = spec.steps;\n const i = Math.min(Math.max(ctx.view.step || 0, 0), steps.length - 1);\n const step = steps[i];\n const isResult = typeof step.result === \"function\";\n const isLast = i === steps.length - 1;\n\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(\n \"div\",\n { className: \"caf-steps-progress\" },\n h(\"span\", { className: \"caf-hint\" }, isResult ? \"Result\" : `Step ${i + 1} of ${steps.length}`),\n h(\n \"div\",\n { className: \"caf-bar-track\" },\n h(\"div\", { className: \"caf-bar-fill caf-steps-fill\", style: { width: `${((i + 1) / steps.length) * 100}%` } })\n )\n ),\n isResult\n ? h(ResultScreen, { step, ctx })\n : h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n step.title ? h(\"h2\", { className: \"caf-block-title\" }, step.title) : null,\n step.text ? h(\"p\", { className: \"caf-step-text\" }, typeof step.text === \"function\" ? step.text(ctx.data) : step.text) : null,\n (step.fields || []).map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: ctx.data[field.key],\n onChange: (v) => writeField(ctx, field.key, field, v, (d, val) => { d[field.key] = val; }),\n })\n ),\n h(\n \"div\",\n { className: \"caf-step-nav\" },\n i > 0\n ? h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => ctx.setStep(i - 1) }, \"\u2039 Back\")\n : h(\"span\"),\n !isLast\n ? h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-primary\",\n disabled: stepErrors(step, ctx.data),\n onClick: () => ctx.setStep(i + 1),\n },\n \"Next \u203A\"\n )\n : null\n )\n )\n );\n}\n", "// app.js \u2014 createApp: the whole framework's entry point.\n//\n// Returns a React component, so an artifact is `export default createApp({\u2026})`\n// with no mounting ceremony.\n//\n// Lifecycle, and deliberately only four stages:\n// hydrate read data + view from storage, merge over declared defaults\n// mount first render already holding real data, so there's no flash\n// run update() -> batched notify -> render, persistence debounced apart\n// error a boundary per block: one broken block shows its error, the rest live\n\nimport { createElement as h, useState, useEffect, hasReact, getReact } from \"react\";\nimport { createAppState } from \"./appState.js\";\nimport { themeCss, seriesColors } from \"./theme.js\";\nimport { BLOCKS, BLOCK_NAMES, FIELD_TYPES } from \"./blocks.js\";\nimport { RecordsLayout, RecordsBlock } from \"./records.js\";\nimport { StepsLayout } from \"./steps.js\";\nimport { ChatLayout, CHAT_KEYS } from \"./chat.js\";\n\nconst LAYOUTS = [\"panel\", \"records\", \"steps\", \"chat\", \"workspace\", \"documents\"];\nconst RESERVED = [\"title\", \"empty\", \"wide\", \"onSelect\", \"subtitle\", \"when\", \"collapsible\", \"fill\"];\n\n// Frontier models still invent identifiers a few percent of the time, so an\n// unknown name has to fail loudly and name the alternatives rather than\n// silently rendering nothing \u2014 a blank pane is indistinguishable from a bug.\nconst TOP_KEYS = [\"title\", \"subtitle\", \"theme\", \"layout\", \"blocks\", \"records\", \"steps\", \"chat\", \"data\", \"shared\", \"main\", \"sidebar\", \"libs\", \"documents\"];\n\nconst DOCUMENTS_KEYS = [\"label\", \"title\", \"blocks\", \"empty\"];\nconst RECORDS_KEYS = [\"label\", \"fields\", \"title\", \"subtitle\", \"sort\", \"summary\", \"empty\", \"search\", \"compute\", \"items\", \"actions\"];\nconst ITEMS_KEYS = [\"label\", \"fields\", \"empty\"];\n\n// An unknown field type used to fall through silently to a text input \u2014 the\n// exact quiet degradation the framework exists to prevent (a blind-tested\n// Haiku wrote \"checkbox\" for \"check\" and shipped a text field).\nfunction checkFields(fields, where) {\n for (const f of fields || []) {\n if (!f || !f.key) throw new Error(`claude-artifact-framework: every field in ${where} needs a \\`key\\`.`);\n if (f.type !== undefined && !FIELD_TYPES.includes(f.type)) {\n throw new Error(\n `claude-artifact-framework: field \"${f.key}\" in ${where} has unknown type \"${f.type}\". Valid types: ${FIELD_TYPES.join(\", \")}.`\n );\n }\n if (f.type === \"select\" && f.options !== undefined && !Array.isArray(f.options) && typeof f.options !== \"function\") {\n throw new Error(\n `claude-artifact-framework: field \"${f.key}\" in ${where}: \\`options\\` must be an array or a function of data returning one.`\n );\n }\n }\n}\n\nfunction checkChatConfig(c, where) {\n if (!c || (typeof c.system !== \"string\" && typeof c.system !== \"function\")) {\n throw new Error(\n `claude-artifact-framework: ${where} needs \\`{ system: \"...\" }\\` (a string or a function of data).`\n );\n }\n const unknown = Object.keys(c).filter((k) => !CHAT_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: ${where} has unknown keys (${unknown.join(\", \")}). Valid keys: ${CHAT_KEYS.join(\", \")}.`\n );\n }\n for (const [name, tool] of Object.entries(c.tools || {})) {\n if (!tool || typeof tool.description !== \"string\" || typeof tool.run !== \"function\") {\n throw new Error(\n `claude-artifact-framework: chat tool \"${name}\" needs a \\`description\\` string and a \\`run(input, ctx)\\` function.`\n );\n }\n }\n}\n\nconst ACTION_KEYS = [\"label\", \"run\", \"when\", \"kind\"];\n\nfunction checkActions(actions, where) {\n if (!Array.isArray(actions)) {\n throw new Error(`claude-artifact-framework: ${where} must be an array of { label, run }.`);\n }\n actions.forEach((a, i) => {\n if (!a || typeof a.label !== \"string\" || typeof a.run !== \"function\") {\n throw new Error(`claude-artifact-framework: ${where}[${i}] needs a \\`label\\` string and a \\`run\\` function.`);\n }\n const unknown = Object.keys(a).filter((k) => !ACTION_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: ${where}[${i}] has unknown keys (${unknown.join(\", \")}). Valid keys: ${ACTION_KEYS.join(\", \")}.`\n );\n }\n });\n}\n\nfunction checkBlocks(blocks) {\n if (!Array.isArray(blocks)) {\n throw new Error(\"claude-artifact-framework: `blocks` must be an array.\");\n }\n blocks.forEach((block, i) => {\n if (!block || typeof block !== \"object\") {\n throw new Error(`claude-artifact-framework: blocks[${i}] must be an object like { fields: [...] }.`);\n }\n const keys = Object.keys(block).filter((k) => !RESERVED.includes(k));\n const known = keys.filter((k) => BLOCK_NAMES.includes(k) || k === \"tabs\" || k === \"records\");\n if (known.length === 0) {\n throw new Error(\n `claude-artifact-framework: blocks[${i}] has no recognised block type (found: ${\n keys.join(\", \") || \"nothing\"\n }). Valid block types: ${[...BLOCK_NAMES, \"tabs\", \"records\"].join(\", \")}.`\n );\n }\n if (known.length > 1) {\n throw new Error(\n `claude-artifact-framework: blocks[${i}] declares more than one block type (${known.join(\n \", \"\n )}). Split them into separate entries of \\`blocks\\`.`\n );\n }\n checkFields(block.fields, `blocks[${i}]`);\n if (known[0] === \"actions\") checkActions(block.actions, `blocks[${i}].actions`);\n if (known[0] === \"chat\") checkChatConfig(block.chat, `blocks[${i}].chat`);\n if (known[0] === \"records\") checkRecordsSpec(block.records, `blocks[${i}].records`, true);\n if (known[0] === \"tabs\") {\n const tabs = block.tabs;\n if (!Array.isArray(tabs) || tabs.length === 0) {\n throw new Error(`claude-artifact-framework: blocks[${i}].tabs needs an array of { label, blocks: [...] }.`);\n }\n tabs.forEach((t, j) => {\n if (!t || typeof t.label !== \"string\" || !Array.isArray(t.blocks) || t.blocks.length === 0) {\n throw new Error(`claude-artifact-framework: tabs[${j}] needs a \\`label\\` string and a non-empty \\`blocks\\` array.`);\n }\n if (t.blocks.some((b) => b && b.tabs)) {\n throw new Error(\"claude-artifact-framework: tabs cannot nest inside tabs.\");\n }\n checkBlocks(t.blocks);\n });\n }\n if (block.when !== undefined && typeof block.when !== \"function\") {\n throw new Error(`claude-artifact-framework: blocks[${i}].when must be a function of data returning true/false.`);\n }\n if (block.fill !== undefined && known[0] !== \"custom\") {\n throw new Error(`claude-artifact-framework: \\`fill\\` is only valid on custom blocks \u2014 blocks[${i}] is \"${known[0]}\".`);\n }\n });\n}\n\nfunction validate(spec) {\n const unknownTop = Object.keys(spec).filter((k) => !TOP_KEYS.includes(k));\n if (unknownTop.length) {\n throw new Error(\n `claude-artifact-framework: unknown top-level keys (${unknownTop.join(\", \")}). Valid keys: ${TOP_KEYS.join(\", \")}.`\n );\n }\n if (spec.libs !== undefined) {\n if (!Array.isArray(spec.libs) || spec.libs.some((u) => typeof u !== \"string\" || !/^https?:\\/\\//.test(u))) {\n throw new Error(\"claude-artifact-framework: `libs` must be an array of https:// script URLs.\");\n }\n }\n const layout = spec.layout || \"panel\";\n if (!LAYOUTS.includes(layout)) {\n throw new Error(\n `claude-artifact-framework: unknown layout \"${layout}\". Valid layouts: ${LAYOUTS.join(\", \")}.`\n );\n }\n if (layout === \"steps\") {\n const steps = spec.steps;\n if (!Array.isArray(steps) || steps.length === 0) {\n throw new Error('claude-artifact-framework: layout \"steps\" needs `steps: [...]` with at least one step.');\n }\n const STEP_KEYS = [\"title\", \"text\", \"fields\", \"result\"];\n const seen = new Set();\n steps.forEach((st, i) => {\n if (!st || typeof st !== \"object\") {\n throw new Error(`claude-artifact-framework: steps[${i}] must be an object.`);\n }\n const unknown = Object.keys(st).filter((k) => !STEP_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: steps[${i}] has unknown keys (${unknown.join(\", \")}). Valid keys: ${STEP_KEYS.join(\", \")}.`\n );\n }\n if (!st.fields && !st.text && !st.result) {\n throw new Error(`claude-artifact-framework: steps[${i}] needs \\`fields\\`, \\`text\\`, or \\`result\\`.`);\n }\n checkFields(st.fields, `steps[${i}]`);\n for (const f of st.fields || []) {\n if (seen.has(f.key)) {\n throw new Error(\n `claude-artifact-framework: field key \"${f.key}\" appears in more than one step \u2014 keys share one data pool and must be unique.`\n );\n }\n seen.add(f.key);\n }\n });\n return layout;\n }\n if (layout === \"chat\") {\n checkChatConfig(spec.chat, \"chat\");\n return layout;\n }\n if (layout === \"workspace\") {\n if (!Array.isArray(spec.main) || spec.main.length === 0) {\n throw new Error(\n 'claude-artifact-framework: layout \"workspace\" needs `main: [...]` (an array of blocks). `sidebar: [...]` is optional.'\n );\n }\n checkBlocks(spec.main);\n if (spec.sidebar !== undefined) {\n if (!Array.isArray(spec.sidebar)) {\n throw new Error(\"claude-artifact-framework: workspace `sidebar` must be an array of blocks.\");\n }\n checkBlocks(spec.sidebar);\n }\n const wsFlat = flattenBlocks([...spec.main, ...(spec.sidebar || [])]);\n const chats = wsFlat.filter((b) => b && b.chat);\n if (chats.length > 1) {\n throw new Error(\n \"claude-artifact-framework: only one chat block per app \u2014 the conversation persists under data.chat and there is exactly one.\"\n );\n }\n checkRecordsBlockKeys(wsFlat);\n return layout;\n }\n if (layout === \"documents\") {\n const d = spec.documents;\n if (!d || !Array.isArray(d.blocks) || d.blocks.length === 0) {\n throw new Error(\n 'claude-artifact-framework: layout \"documents\" needs `documents: { blocks: [...] }` \u2014 the blocks every document repeats, each with its own data.'\n );\n }\n const unknownD = Object.keys(d).filter((k) => !DOCUMENTS_KEYS.includes(k));\n if (unknownD.length) {\n throw new Error(\n `claude-artifact-framework: documents has unknown keys (${unknownD.join(\", \")}). Valid keys: ${DOCUMENTS_KEYS.join(\", \")}.`\n );\n }\n if (d.title !== undefined && typeof d.title !== \"function\") {\n throw new Error(\"claude-artifact-framework: documents.title must be a function of the document's data returning the tab label.\");\n }\n checkBlocks(d.blocks);\n // Inside documents both chat and file are PER DOCUMENT: the scoped ctx\n // gives each document its own data.chat and its own ctx.files. One chat\n // block in the declaration = one conversation per document.\n const docFlat = flattenBlocks(d.blocks);\n const chats = docFlat.filter((b) => b && b.chat);\n if (chats.length > 1) {\n throw new Error(\n \"claude-artifact-framework: only one chat block per document \u2014 each document's conversation persists under its own data.chat and there is exactly one.\"\n );\n }\n checkRecordsBlockKeys(docFlat);\n return layout;\n }\n if (layout === \"records\") {\n checkRecordsSpec(spec.records, \"records\", false);\n if (spec.blocks) {\n checkBlocks(spec.blocks);\n if (flattenBlocks(spec.blocks).some((b) => b && b.records)) {\n throw new Error(\n 'claude-artifact-framework: a records BLOCK below a records LAYOUT is ambiguous \u2014 the layout already owns the collection. Use panel/workspace/documents to embed records blocks.'\n );\n }\n }\n return layout;\n }\n checkBlocks(spec.blocks || []);\n checkRecordsBlockKeys(flattenBlocks(spec.blocks || []));\n return layout;\n}\n\n// The records declaration is validated identically as a layout and as a\n// block; only the block form takes `key` (where the collection lives in the\n// enclosing pool \u2014 required for two collections to coexist).\nfunction checkRecordsSpec(r, where, allowKey) {\n if (!r || !Array.isArray(r.fields) || r.fields.length === 0) {\n throw new Error(\n `claude-artifact-framework: ${where} needs \\`records: { fields: [...] }\\` \u2014 the same field declarations the fields block uses.`\n );\n }\n const valid = allowKey ? [...RECORDS_KEYS, \"key\"] : RECORDS_KEYS;\n const unknownR = Object.keys(r).filter((k) => !valid.includes(k));\n if (unknownR.length) {\n throw new Error(\n `claude-artifact-framework: ${where} has unknown keys (${unknownR.join(\", \")}). Valid keys: ${valid.join(\", \")}.`\n );\n }\n if (allowKey && r.key !== undefined && (typeof r.key !== \"string\" || !r.key)) {\n throw new Error(`claude-artifact-framework: ${where}.key must be a non-empty string naming the collection in data.`);\n }\n checkFields(r.fields, where);\n if (r.fields.some((f) => f.type === \"file\") || (r.items && r.items.fields.some((f) => f.type === \"file\"))) {\n throw new Error(\n 'claude-artifact-framework: `file` fields live in the flat data pool (panel blocks or steps) \u2014 they are not supported inside records or items.'\n );\n }\n const seen = new Set();\n for (const f of r.fields) {\n if (f.key === \"id\") throw new Error('claude-artifact-framework: \"id\" is reserved on records \u2014 the framework assigns it.');\n if (seen.has(f.key)) throw new Error(`claude-artifact-framework: duplicate ${where} field key \"${f.key}\".`);\n seen.add(f.key);\n }\n if (r.actions) checkActions(r.actions, `${where}.actions`);\n if (r.items) {\n const unknownI = Object.keys(r.items).filter((k) => !ITEMS_KEYS.includes(k));\n if (unknownI.length) {\n throw new Error(\n `claude-artifact-framework: ${where}.items has unknown keys (${unknownI.join(\", \")}). Valid keys: ${ITEMS_KEYS.join(\", \")}.`\n );\n }\n if (!Array.isArray(r.items.fields) || r.items.fields.length === 0) {\n throw new Error(`claude-artifact-framework: ${where}.items needs \\`fields: [...]\\` \u2014 the same field declarations as everywhere else.`);\n }\n checkFields(r.items.fields, `${where}.items`);\n for (const f of r.items.fields) {\n if (f.key === \"id\") throw new Error('claude-artifact-framework: \"id\" is reserved on items \u2014 the framework assigns it.');\n }\n if (seen.has(\"items\") || r.fields.some((f) => f.key === \"items\")) {\n throw new Error(`claude-artifact-framework: a ${where} field cannot be named \"items\" when \\`items\\` is declared \u2014 that key holds the child collection.`);\n }\n }\n for (const [key, c] of Object.entries(r.compute || {})) {\n if (seen.has(key) || key === \"id\" || (r.items && key === \"items\")) {\n throw new Error(\n `claude-artifact-framework: compute key \"${key}\" collides with a field key \u2014 computed values are derived, never stored.`\n );\n }\n if (typeof c !== \"function\" && typeof (c && c.value) !== \"function\") {\n throw new Error(\n `claude-artifact-framework: compute \"${key}\" must be a function of the record, or { label, format, value: (r) => ... }.`\n );\n }\n }\n}\n\n// Two records blocks writing the same collection would silently fight.\nfunction checkRecordsBlockKeys(flatBlocks) {\n const seen = new Set();\n for (const b of flatBlocks) {\n if (!b || !b.records) continue;\n const k = b.records.key || \"records\";\n if (seen.has(k)) {\n throw new Error(\n `claude-artifact-framework: two records blocks share the collection key \"${k}\" \u2014 give each a distinct \\`key\\`.`\n );\n }\n seen.add(k);\n }\n}\n\n// Fields declare their own initial value, so the data shape is derived from\n// the declaration instead of being restated in a separate object. That removes\n// the key as an invention point: it is written exactly once.\n// Tabs hold blocks of their own, so every scan over \"all blocks\" (field\n// defaults, chat detection) has to see through them.\nfunction flattenBlocks(blocks) {\n const out = [];\n for (const b of blocks || []) {\n out.push(b);\n if (b && Array.isArray(b.tabs)) for (const t of b.tabs) out.push(...flattenBlocks(t.blocks));\n }\n return out;\n}\n\nfunction defaultsFrom(spec) {\n const data = { ...(spec.data || {}) };\n if ((spec.layout || \"panel\") === \"records\" && !Array.isArray(data.records)) {\n data.records = [];\n }\n if ((spec.layout || \"panel\") === \"documents\" && !Array.isArray(data.docs)) {\n data.docs = [];\n }\n const allBlocks = flattenBlocks([...(spec.blocks || []), ...(spec.main || []), ...(spec.sidebar || [])]);\n const hasChat = (spec.layout || \"panel\") === \"chat\" || allBlocks.some((b) => b && b.chat);\n if (hasChat && !data.chat) {\n data.chat = { api: [], log: [] };\n }\n for (const block of [...allBlocks, ...(spec.steps || [])]) {\n for (const field of block.fields || []) {\n if (field && field.key !== undefined && !(field.key in data)) {\n data[field.key] = field.value !== undefined ? field.value : field.type === \"check\" ? false : \"\";\n }\n }\n }\n for (const b of allBlocks) {\n if (b && b.records) {\n const k = b.records.key || \"records\";\n if (!Array.isArray(data[k])) data[k] = [];\n }\n }\n return data;\n}\n\n// Built on first use, not at module scope: `extends React.Component` needs a\n// real React, and at load time the host may not have handed one over yet.\nlet BlockBoundary = null;\n\nfunction boundary(React) {\n if (!BlockBoundary) {\n BlockBoundary = class extends React.Component {\n constructor(props) {\n super(props);\n this.state = { error: null };\n }\n static getDerivedStateFromError(error) {\n return { error };\n }\n render() {\n if (this.state.error) {\n return h(\n \"div\",\n { className: \"caf-block caf-block-error\" },\n h(\"strong\", null, \"This section failed to render\"),\n h(\"code\", null, String(this.state.error.message || this.state.error))\n );\n }\n return this.props.children;\n }\n };\n }\n return BlockBoundary;\n}\n\n// Tabs are defined here (not blocks.js) because they render other blocks \u2014\n// keeping the recursion in one file avoids an import cycle.\nfunction TabsBlock({ spec, ctx }) {\n const tabs = spec.tabs;\n const key = tabs.map((t) => t.label).join(\"|\");\n const stored = ctx.view.tabs ? ctx.view.tabs[key] : undefined;\n const active = Math.min(stored === undefined ? 0 : stored, tabs.length - 1);\n return h(\n \"div\",\n { className: \"caf-tabs\" },\n h(\n \"div\",\n { className: \"caf-tabbar\", role: \"tablist\" },\n tabs.map((t, i) =>\n h(\n \"button\",\n {\n key: t.label,\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": i === active,\n className: i === active ? \"caf-tab caf-tab-active\" : \"caf-tab\",\n onClick: () => ctx.setTab(key, i),\n },\n t.label\n )\n )\n ),\n h(\n \"div\",\n { className: \"caf-tabs-body\" },\n tabs[active].blocks.map((b, i) => h(Block, { key: active + \":\" + i, block: b, ctx }))\n )\n );\n}\n\nconst ALL_BLOCKS = { ...BLOCKS, tabs: TabsBlock, records: RecordsBlock };\nconst ALL_NAMES = [...BLOCK_NAMES, \"tabs\", \"records\"];\n\nfunction Block({ block, ctx }) {\n // `when` hides a block entirely \u2014 the primitive under conditional UIs.\n if (typeof block.when === \"function\" && !block.when(ctx.data)) return null;\n const name = Object.keys(block).find((k) => ALL_NAMES.includes(k));\n const Component = ALL_BLOCKS[name];\n const inner = h(\n boundary(ctx.React),\n null,\n h(Component, { spec: block.collapsible ? { ...block, title: undefined } : block, ctx })\n );\n if (!block.collapsible) return inner;\n // Collapsed state is framework-owned view state, keyed by the block's title\n // (its stable, human-visible identity), so it survives reload.\n const key = typeof block.title === \"string\" && block.title ? block.title : name;\n const collapsed =\n ctx.view.collapsed && key in ctx.view.collapsed ? ctx.view.collapsed[key] : block.collapsible === \"collapsed\";\n return h(\n \"div\",\n { className: \"caf-collapse\" },\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-collapse-head\",\n \"aria-expanded\": !collapsed,\n onClick: () => ctx.toggleCollapsed(key, !collapsed),\n },\n h(\"span\", null, block.title || name),\n h(\"span\", { className: collapsed ? \"caf-chevron caf-chevron-closed\" : \"caf-chevron\" }, \"\u25BE\")\n ),\n collapsed ? null : h(\"div\", { className: \"caf-collapse-body\" }, inner)\n );\n}\n\nfunction Panel({ spec, ctx }) {\n return h(\n \"div\",\n { className: \"caf-panel\" },\n (spec.blocks || []).map((block, i) =>\n h(\n \"section\",\n // A collapsible is always full-width: half-width accordions leave an\n // orphaned right edge on desktop and change width across breakpoints.\n { key: i, className: block.wide || block.collapsible ? \"caf-slot caf-slot-wide\" : \"caf-slot\" },\n h(Block, { block, ctx })\n )\n )\n );\n}\n\n// Records + extra blocks is a natural combo (a list with a chart of itself\n// below). Blocks render under the list, never under the detail screen, and\n// their functions receive the same data object as everywhere else \u2014 the\n// collection lives at d.records.\nfunction RecordsWithBlocks({ spec, ctx }) {\n const detailOpen =\n ctx.view.screen === \"record\" && (ctx.data.records || []).some((r) => r.id === ctx.view.arg);\n return h(\n \"div\",\n null,\n h(RecordsLayout, { spec, ctx }),\n !detailOpen && Array.isArray(spec.blocks) && spec.blocks.length\n ? h(\n \"div\",\n { className: \"caf-panel caf-records-blocks\" },\n spec.blocks.map((block, i) =>\n h(\n \"section\",\n // A collapsible is always full-width: half-width accordions leave an\n // orphaned right edge on desktop and change width across breakpoints.\n { key: i, className: block.wide || block.collapsible ? \"caf-slot caf-slot-wide\" : \"caf-slot\" },\n h(Block, { block, ctx })\n )\n )\n )\n : null\n );\n}\n\n// The \"content + copilot\" shape: a full-width main column and a sidebar.\n// Stacks vertically on narrow screens (sidebar after main).\nfunction WorkspaceLayout({ spec, ctx }) {\n const render = (blocks) =>\n (blocks || []).map((block, i) => h(\"section\", { key: i, className: \"caf-ws-slot\" }, h(Block, { block, ctx })));\n return h(\n \"div\",\n { className: \"caf-workspace\" },\n h(\"div\", { className: \"caf-ws-main\" }, render(spec.main)),\n spec.sidebar && spec.sidebar.length ? h(\"div\", { className: \"caf-ws-side\" }, render(spec.sidebar)) : null\n );\n}\n\n// documents \u2014 N parallel instances of the same mini-app, one per top tab.\n// Each document owns a full data pool; the blocks are declared once and see\n// ONLY the active document's data through a scoped ctx. Which document is\n// open lives in view state (personal, survives reload); the documents\n// themselves live in data.docs.\nfunction docDefaults(dspec) {\n const data = {};\n for (const block of flattenBlocks(dspec.blocks)) {\n for (const field of block.fields || []) {\n if (field && field.key !== undefined && !(field.key in data)) {\n data[field.key] = field.value !== undefined ? field.value : field.type === \"check\" ? false : \"\";\n }\n }\n if (block.records) {\n const k = block.records.key || \"records\";\n if (!Array.isArray(data[k])) data[k] = [];\n }\n }\n return data;\n}\n\nfunction docId() {\n return \"d\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nconst DOC_TAB_KEY = \"caf:doc\";\n\nfunction docTitle(dspec, data) {\n if (dspec.title) {\n try {\n const t = dspec.title(data);\n if (t !== undefined && t !== null && t !== \"\") return String(t);\n } catch {\n /* fall through to the default below */\n }\n }\n // Default: the first text-ish field \u2014 same convention records uses.\n for (const block of flattenBlocks(dspec.blocks)) {\n for (const f of block.fields || []) {\n if (!f.type || f.type === \"text\" || f.type === \"textarea\" || f.type === \"select\") {\n const v = data[f.key];\n if (v !== \"\" && v !== undefined && v !== null) return String(v);\n return \"(untitled)\";\n }\n }\n }\n return \"(untitled)\";\n}\n\nfunction DocumentsLayout({ spec, ctx }) {\n const dspec = spec.documents;\n const label = dspec.label || \"document\";\n const docs = Array.isArray(ctx.data.docs) ? ctx.data.docs : [];\n const defaults = docDefaults(dspec);\n\n const storedId = ctx.view.tabs ? ctx.view.tabs[DOC_TAB_KEY] : undefined;\n // A deleted or stale id falls back to the first document, never a blank pane.\n const active = docs.find((doc) => doc.id === storedId) || docs[0];\n\n function add() {\n const doc = { id: docId(), data: docDefaults(dspec) };\n ctx.update((d) => {\n d.docs = [...(d.docs || []), doc];\n });\n ctx.setTab(DOC_TAB_KEY, doc.id);\n }\n\n function close(id) {\n const idx = docs.findIndex((doc) => doc.id === id);\n ctx.update((d) => {\n d.docs = d.docs.filter((doc) => doc.id !== id);\n });\n delete ctx.files[\"doc:\" + id];\n if (active && active.id === id) {\n const next = docs[idx + 1] || docs[idx - 1];\n if (next) ctx.setTab(DOC_TAB_KEY, next.id);\n }\n }\n\n if (!active) {\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(\n \"div\",\n { className: \"caf-block caf-empty\" },\n h(\"p\", null, dspec.empty || `No ${label}s yet. Create the first one.`),\n h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-primary\", onClick: add }, `New ${label}`)\n )\n );\n }\n\n // Stored data merges over declared defaults, so a field added in a later\n // edit of the spec falls through to its default on older documents (B3).\n const activeData = { ...defaults, ...active.data };\n const scoped = {\n ...ctx,\n data: activeData,\n update: (fn) =>\n ctx.update((d) => {\n const doc = (d.docs || []).find((x) => x.id === active.id);\n if (doc) fn(doc.data);\n }),\n // Live File objects scoped per document: each doc gets its own sub-map,\n // so two documents with the same file field never collide. Like the flat\n // pool, the File itself is memory-only \u2014 metadata survives reload, the\n // file is re-picked per document.\n files: (ctx.files[\"doc:\" + active.id] = ctx.files[\"doc:\" + active.id] || {}),\n };\n\n return h(\n \"div\",\n { className: \"caf-documents\" },\n h(\n \"div\",\n { className: \"caf-tabbar\", role: \"tablist\" },\n docs.map((doc) =>\n h(\n \"span\",\n { key: doc.id, className: \"caf-doc-tab\" },\n h(\n \"button\",\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": doc.id === active.id,\n className: doc.id === active.id ? \"caf-tab caf-tab-active\" : \"caf-tab\",\n onClick: () => ctx.setTab(DOC_TAB_KEY, doc.id),\n },\n docTitle(dspec, { ...defaults, ...doc.data })\n ),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-doc-close\",\n \"aria-label\": `Close ${label}`,\n onClick: () => close(doc.id),\n },\n \"\u2715\"\n )\n )\n ),\n h(\"button\", { type: \"button\", className: \"caf-tab caf-doc-add\", \"aria-label\": `New ${label}`, onClick: add }, \"+\")\n ),\n h(Panel, { spec: { blocks: dspec.blocks }, ctx: scoped })\n );\n}\n\nconst LAYOUT_COMPONENTS = { panel: Panel, records: RecordsWithBlocks, steps: StepsLayout, chat: ChatLayout, workspace: WorkspaceLayout, documents: DocumentsLayout };\n\n// Deduped by src: two apps (or re-mounts) asking for the same lib share one\n// tag, mirroring how the PDF annotator loads pdf.js by hand.\nfunction loadScript(src) {\n return new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${src}\"]`);\n if (existing) {\n if (existing.dataset.cafReady === \"1\") return resolve();\n existing.addEventListener(\"load\", resolve);\n existing.addEventListener(\"error\", () => reject(new Error(`failed to load ${src}`)));\n return;\n }\n const tag = document.createElement(\"script\");\n tag.src = src;\n tag.onload = () => { tag.dataset.cafReady = \"1\"; resolve(); };\n tag.onerror = () => {\n // Models guess file paths inside packages and get them wrong more often\n // than they get versions wrong (measured: marked@13's UMD lives at\n // lib/marked.umd.js, not the root the model wrote). jsDelivr serves a\n // package's default build at the bare npm/<pkg>@<version> URL, so one\n // retry there absorbs the whole failure class.\n const m = src.match(/^(https:\\/\\/cdn\\.jsdelivr\\.net\\/npm\\/(?:@[^/]+\\/)?[^/]+)\\/.+/);\n if (m && m[1] !== src) {\n loadScript(m[1]).then(resolve, () => reject(new Error(`failed to load ${src} (also tried package default ${m[1]})`)));\n } else {\n reject(new Error(`failed to load ${src}`));\n }\n };\n document.head.appendChild(tag);\n });\n}\n\nexport function createApp(spec = {}) {\n const layout = validate(spec);\n const state = createAppState(defaultsFrom(spec), { shared: Boolean(spec.shared) });\n const css = themeCss(spec.theme && spec.theme.seed) + BASE_CSS;\n // Live File objects picked by `file` fields \u2014 in memory only, never persisted.\n const files = {};\n\n return function App() {\n if (!hasReact()) {\n throw new Error(\n \"claude-artifact-framework: React not found. Hand it over once, before rendering:\\n\\n\" +\n ' import React from \"react\";\\n' +\n \" ArtifactKit.useReact(React);\\n\"\n );\n }\n const [, force] = useState(0);\n const [libsState, setLibsState] = useState(spec.libs && spec.libs.length ? \"loading\" : \"ready\");\n const [libsError, setLibsError] = useState(null);\n useEffect(() => {\n if (!spec.libs || !spec.libs.length) return;\n Promise.all(spec.libs.map(loadScript)).then(\n () => setLibsState(\"ready\"),\n (e) => { setLibsError(String((e && e.message) || e)); setLibsState(\"error\"); }\n );\n }, []);\n useEffect(() => {\n const unsubscribe = state.subscribe(() => force((n) => n + 1));\n // Hydration can finish before this effect runs \u2014 its notify() then lands\n // on zero listeners and nothing ever re-renders. Re-check on subscribe,\n // so a mount that raced hydration still leaves the loading screen.\n if (state.isHydrated()) force((n) => n + 1);\n return unsubscribe;\n }, []);\n\n const ctx = {\n React: getReact(),\n data: state.getData(),\n view: state.getView(),\n update: state.update,\n go: state.go,\n back: state.back,\n setStep: (n) => state.setView({ step: n }),\n files,\n viewerId: state.getViewerId(),\n setTab: (key, i) => state.setView({ tabs: { ...state.getView().tabs, [key]: i } }),\n toggleCollapsed: (key, val) => state.setView({ collapsed: { ...state.getView().collapsed, [key]: val } }),\n colors: (n) => seriesColors(spec.theme && spec.theme.seed, n),\n };\n\n const Layout = LAYOUT_COMPONENTS[layout];\n\n return h(\n \"div\",\n // The layout class lets shared CSS follow the active container width \u2014\n // e.g. the header must share the workspace's wider axis, not panel's.\n { className: `caf-root caf-layout-${layout}` },\n h(\"style\", { dangerouslySetInnerHTML: { __html: css } }),\n h(\n \"header\",\n { className: \"caf-header\" },\n spec.title ? h(\"h1\", null, spec.title) : null,\n spec.subtitle ? h(\"p\", null, spec.subtitle) : null\n ),\n libsState === \"error\"\n ? h(\n \"div\",\n { className: \"caf-block caf-block-error\" },\n h(\"strong\", null, \"A library failed to load\"),\n h(\"code\", null, libsError)\n )\n : !state.isHydrated() || libsState === \"loading\"\n ? h(\"div\", { className: \"caf-block caf-loading\" }, libsState === \"loading\" ? \"Loading libraries\u2026\" : \"Loading\u2026\")\n : h(Layout, { spec, ctx })\n );\n };\n}\n\nconst BASE_CSS = `\n.caf-root {\n --caf-radius: 10px;\n --caf-control-radius: 7px; /* one radius for every control: buttons, inputs, rows */\n --caf-btn-pad-y: 0.45rem;\n --caf-btn-pad-x: 0.8rem;\n --caf-num-primary: 2.1rem; /* the one size for a block's dominant number */\n box-sizing: border-box;\n min-height: 100vh;\n padding: 2rem 1.25rem 4rem;\n background: var(--caf-bg);\n color: var(--caf-text);\n font-family: -apple-system, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n.caf-root *, .caf-root *::before, .caf-root *::after { box-sizing: inherit; }\n.caf-header { max-width: 760px; margin: 0 auto 1.5rem; }\n/* One left axis per screen: the header adopts the workspace's wider container. */\n.caf-layout-workspace .caf-header { max-width: 1200px; }\n.caf-header h1 { margin: 0; font-size: 1.5rem; font-weight: 650; letter-spacing: -0.01em; text-wrap: balance; }\n.caf-header p { margin: 0.4rem 0 0; color: var(--caf-muted); font-size: 0.95rem; line-height: 1.5; }\n/* Between-card air must beat within-card padding (1.1rem), or groups dissolve. */\n.caf-panel { max-width: 760px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 1.75rem 1rem; }\n.caf-slot { grid-column: span 2; min-width: 0; }\n@media (min-width: 720px) { .caf-slot { grid-column: span 1; } .caf-slot-wide { grid-column: span 2; } }\n.caf-block {\n background: var(--caf-surface);\n border: 1px solid var(--caf-border);\n border-radius: var(--caf-radius);\n padding: 1.1rem;\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n height: 100%;\n}\n.caf-block-title { margin: 0; font-size: 0.78rem; font-weight: 650; text-transform: uppercase; letter-spacing: 0.06em; color: var(--caf-muted); }\n.caf-field { display: flex; flex-direction: column; gap: 0.3rem; }\n/* A full size+weight step below .caf-block-title \u2014 the uppercase alone was\n not enough to tell \"card title\" from \"field label\" at a glance. */\n.caf-field label { font-size: 0.68rem; font-weight: 500; color: var(--caf-muted); }\n.caf-field input, .caf-field select, .caf-field textarea {\n font: inherit; font-size: 0.95rem; padding: 0.5rem 0.6rem;\n border-radius: var(--caf-control-radius); border: 1px solid var(--caf-border);\n background: var(--caf-sunken); color: var(--caf-text); width: 100%;\n}\n.caf-field input:focus-visible, .caf-field select:focus-visible, .caf-field textarea:focus-visible,\n.caf-row:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-field input[aria-invalid=\"true\"] { border-color: var(--caf-danger); }\n.caf-check { display: flex; align-items: center; gap: 0.5rem; font-size: 0.9rem; }\n.caf-hint { color: var(--caf-muted); font-size: 0.75rem; }\n.caf-error { color: var(--caf-danger); font-size: 0.75rem; font-weight: 600; }\n.caf-output-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 0.9rem 1.1rem; }\n/* Every stat shares one axis: label above value, both flush left. */\n.caf-stat { display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; }\n.caf-stat-label { color: var(--caf-muted); font-size: 0.78rem; font-weight: 600; letter-spacing: 0.02em; }\n.caf-stat-value { font-size: 1.05rem; font-weight: 650; font-variant-numeric: tabular-nums; }\n.caf-stat-big { grid-column: 1 / -1; }\n/* The divider exists to separate the hero from stats below it \u2014 alone in the\n grid it would be an orphaned rule, so it only renders when followed. */\n.caf-stat-big:not(:last-child) { padding-bottom: 0.5rem; border-bottom: 1px solid var(--caf-border); }\n.caf-stat-big .caf-stat-value { font-size: var(--caf-num-primary); font-weight: 700; letter-spacing: -0.02em; color: var(--caf-accent); line-height: 1.15; }\n.caf-list { padding: 0.4rem; gap: 0; }\n.caf-row {\n font: inherit; text-align: left; cursor: pointer;\n display: flex; flex-direction: column; gap: 0.15rem;\n padding: 0.65rem 0.7rem; border: none; border-radius: var(--caf-control-radius);\n background: transparent; color: inherit; width: 100%;\n}\n.caf-row:hover { background: var(--caf-sunken); }\n.caf-row-title { font-size: 0.92rem; font-weight: 550; }\n.caf-row-sub { font-size: 0.78rem; color: var(--caf-muted); }\n.caf-panel-single { grid-template-columns: 1fr; }\n.caf-panel-single .caf-slot, .caf-panel-single > * { grid-column: span 1; }\n/* Bottom padding matches the inter-row rhythm so the toolbar doesn't sit\n closer to the first row than rows sit to each other. */\n.caf-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; padding: 0.3rem 0.3rem 0.75rem; }\n.caf-count { font-size: 0.8rem; color: var(--caf-muted); font-variant-numeric: tabular-nums; }\n.caf-btn {\n font: inherit; font-size: 0.85rem; font-weight: 600; cursor: pointer;\n padding: var(--caf-btn-pad-y) var(--caf-btn-pad-x); border-radius: var(--caf-control-radius);\n border: 1px solid var(--caf-border); background: var(--caf-surface); color: var(--caf-text);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n.caf-btn:hover { filter: brightness(0.97); }\n.caf-btn:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-btn-primary { background: var(--caf-accent); border-color: var(--caf-accent); color: var(--caf-accentText); }\n.caf-btn-danger { background: transparent; border-color: var(--caf-danger); color: var(--caf-danger); }\n.caf-bars { display: flex; flex-direction: column; gap: 0.55rem; }\n.caf-bar-row { display: grid; grid-template-columns: minmax(60px, 30%) 1fr auto; align-items: center; gap: 0.6rem; }\n.caf-bar-label { font-size: 0.82rem; color: var(--caf-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.caf-bar-track { height: 8px; border-radius: 4px; background: var(--caf-sunken); overflow: hidden; }\n.caf-bar-fill { height: 100%; border-radius: 4px; background: var(--caf-accent); }\n.caf-bar-value { font-size: 0.82rem; font-weight: 600; font-variant-numeric: tabular-nums; }\n.caf-line-svg { width: 100%; height: 110px; display: block; }\n.caf-line-grid { stroke: var(--caf-border); stroke-width: 0.3; }\n.caf-line-path { fill: none; stroke: var(--caf-accent); stroke-width: 1.1; stroke-linejoin: round; stroke-linecap: round; }\n.caf-line-dot { fill: var(--caf-accent); }\n.caf-line-meta { display: flex; justify-content: space-between; align-items: baseline; gap: 0.6rem; }\n.caf-line-last { font-weight: 650; font-variant-numeric: tabular-nums; color: var(--caf-accent); }\n.caf-donut { display: flex; align-items: center; gap: 1.1rem; flex-wrap: wrap; }\n/* -3px optical correction: a circle beside flush-left text reads indented. */\n.caf-donut-svg { width: 110px; height: 110px; flex: none; transform: rotate(0.001deg); margin-left: -3px; }\n.caf-donut-seg { fill: none; stroke-width: 6; }\n/* Capped width keeps each value NEXT TO its label in wide cards \u2014 the pair\n must read as a pair regardless of container width. */\n.caf-donut-legend { display: flex; flex-direction: column; gap: 0.4rem; min-width: 0; flex: 1; max-width: 260px; }\n.caf-legend-row { display: flex; align-items: center; gap: 0.5rem; font-size: 0.84rem; }\n.caf-legend-swatch { width: 10px; height: 10px; border-radius: 3px; flex: none; }\n.caf-legend-label { color: var(--caf-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.caf-legend-value { margin-left: auto; font-weight: 600; font-variant-numeric: tabular-nums; }\n.caf-timer { align-items: center; text-align: center; }\n.caf-timer .caf-bar-track { width: 100%; }\n.caf-timer-time { font-size: var(--caf-num-primary); font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: -0.02em; color: var(--caf-accent); }\n.caf-timer-done { color: var(--caf-accent); }\n.caf-timer-fill { transition: width 0.9s linear; }\n.caf-timer-controls { display: flex; gap: 0.6rem; }\n.caf-btn:disabled { opacity: 0.45; cursor: not-allowed; }\n.caf-steps-progress { display: flex; flex-direction: column; gap: 0.35rem; margin-bottom: 0.2rem; }\n.caf-steps-fill { transition: width 0.25s ease; }\n.caf-step-text { margin: 0; color: var(--caf-muted); font-size: 0.92rem; line-height: 1.55; }\n.caf-step-nav { display: flex; justify-content: space-between; gap: 0.6rem; margin-top: 0.4rem; }\n.caf-chat-log { min-height: 320px; max-height: 62vh; overflow-y: auto; gap: 0.55rem; }\n.caf-msg { max-width: 85%; padding: 0.55rem 0.75rem; border-radius: 12px; font-size: 0.92rem; line-height: 1.5; white-space: pre-wrap; word-break: break-word; }\n.caf-msg-user { align-self: flex-end; background: var(--caf-accent); color: var(--caf-accentText); border-bottom-right-radius: 4px; }\n.caf-msg-assistant { align-self: flex-start; background: var(--caf-sunken); border-bottom-left-radius: 4px; }\n.caf-msg-live::after { content: \"\u258D\"; opacity: 0.6; }\n.caf-msg-tools { align-self: flex-start; font-size: 0.74rem; color: var(--caf-muted); padding: 0.15rem 0.55rem; border: 1px solid var(--caf-border); border-radius: 999px; }\n.caf-msg-error { align-self: stretch; max-width: none; display: flex; flex-direction: column; gap: 0.2rem; background: transparent; border: 1px solid var(--caf-danger); }\n.caf-msg-error strong { color: var(--caf-danger); font-size: 0.85rem; }\n.caf-chat-input {\n display: flex; gap: 0.6rem; margin-top: 1rem; padding: 0.6rem;\n background: var(--caf-surface); border: 1px solid var(--caf-border); border-radius: var(--caf-radius);\n}\n.caf-chat-input input { flex: 1; font: inherit; font-size: 0.95rem; padding: 0.55rem 0.7rem; border-radius: var(--caf-control-radius); border: 1px solid var(--caf-border); background: var(--caf-sunken); color: var(--caf-text); }\n.caf-chat-input input:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-search {\n font: inherit; font-size: 0.9rem; width: 100%;\n padding: 0.5rem 0.65rem; margin: 0 0 0.3rem;\n border-radius: 7px; border: 1px solid var(--caf-border);\n background: var(--caf-sunken); color: var(--caf-text);\n}\n.caf-search:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-computed { border-top: 1px solid var(--caf-border); padding-top: 0.7rem; }\n.caf-records-blocks { margin-top: 1rem; }\n.caf-row-wrap { display: flex; align-items: center; gap: 0.4rem; }\n.caf-row-wrap .caf-row { flex: 1; min-width: 0; }\n.caf-row-actions { display: flex; gap: 0.35rem; flex: none; padding-right: 0.3rem; }\n.caf-btn-sm { font-size: 0.78rem; padding: calc(var(--caf-btn-pad-y) * 0.67) calc(var(--caf-btn-pad-x) * 0.75); }\n.caf-items { display: flex; flex-direction: column; gap: 0.5rem; border-top: 1px solid var(--caf-border); padding-top: 0.7rem; }\n.caf-item-row { display: flex; align-items: flex-end; gap: 0.5rem; }\n.caf-item-row .caf-field { flex: 1; min-width: 0; }\n.caf-item-row .caf-field label { font-size: 0.68rem; }\n.caf-item-remove { flex: none; margin-bottom: 0.15rem; }\n.caf-empty-sm { padding: 0.6rem; font-size: 0.82rem; }\n.caf-actions-row { display: flex; flex-wrap: wrap; gap: 0.6rem; }\n.caf-code { background: var(--caf-sunken); border-radius: 6px; padding: 0.55rem 0.7rem; font-size: 0.8rem; overflow-x: auto; margin: 0.3rem 0; font-family: ui-monospace, monospace; }\n.caf-msg code { background: color-mix(in srgb, currentColor 12%, transparent); border-radius: 4px; padding: 0.05rem 0.3rem; font-size: 0.85em; font-family: ui-monospace, monospace; }\n.caf-md-h { display: block; margin-top: 0.3rem; }\n.caf-md-li { display: block; padding-left: 1rem; position: relative; }\n.caf-md-li::before { content: \"\u2022\"; position: absolute; left: 0.2rem; opacity: 0.6; }\n.caf-workspace { max-width: 1200px; margin: 0 auto; display: flex; gap: 1rem; align-items: flex-start; }\n.caf-ws-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1rem; }\n.caf-ws-side { width: 340px; flex: none; display: flex; flex-direction: column; gap: 1rem; position: sticky; top: 1rem; }\n.caf-ws-slot { min-width: 0; }\n.caf-chat-panel { display: flex; flex-direction: column; min-height: 0; }\n.caf-ws-side .caf-chat-log { max-height: calc(100vh - 220px); }\n@media (max-width: 900px) {\n .caf-workspace { flex-direction: column; align-items: stretch; }\n .caf-ws-side { width: 100%; position: static; }\n}\n.caf-tabs { display: flex; flex-direction: column; gap: 0.8rem; min-width: 0; }\n.caf-tabbar { display: flex; gap: 0.2rem; border-bottom: 1px solid var(--caf-border); overflow-x: auto; }\n.caf-tab {\n font: inherit; font-size: 0.85rem; font-weight: 600; cursor: pointer;\n padding: 0.45rem 0.8rem; border: none; background: none; color: var(--caf-muted);\n border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap;\n}\n.caf-tab:hover { color: var(--caf-text); }\n.caf-tab:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: -2px; }\n/* :hover on the active tab must not win the specificity race and mute it. */\n.caf-tab-active, .caf-tab-active:hover { color: var(--caf-accent); border-bottom-color: var(--caf-accent); }\n.caf-tabs-body { display: flex; flex-direction: column; gap: 0.8rem; }\n.caf-collapse { display: flex; flex-direction: column; gap: 0.5rem; min-width: 0; }\n.caf-collapse-head {\n /* Same treatment as .caf-block-title: a collapsible header IS a card title. */\n font: inherit; font-size: 0.78rem; font-weight: 650; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--caf-muted); cursor: pointer;\n display: flex; align-items: center; justify-content: space-between; gap: 0.6rem;\n padding: 0.7rem 1.1rem; border: 1px solid var(--caf-border); border-radius: var(--caf-radius);\n background: var(--caf-surface); width: 100%; text-align: left;\n}\n.caf-collapse-head { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); }\n.caf-collapse-head:hover { filter: brightness(0.97); }\n.caf-collapse-head:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n/* Accent chevron: the one interaction cue that distinguishes a collapsible\n header from a static card title without breaking their shared typography. */\n.caf-chevron { transition: transform 0.15s ease; color: var(--caf-accent); }\n.caf-documents { max-width: 760px; margin: 0 auto; display: flex; flex-direction: column; gap: 1rem; }\n.caf-doc-tab { display: inline-flex; align-items: center; }\n.caf-doc-tab .caf-tab { padding-right: 0.35rem; max-width: 180px; overflow: hidden; text-overflow: ellipsis; }\n.caf-doc-close {\n font: inherit; font-size: 0.7rem; cursor: pointer; border: none; background: none;\n color: var(--caf-muted); padding: 0.2rem 0.45rem 0.2rem 0.1rem; line-height: 1;\n}\n.caf-doc-close:hover { color: var(--caf-danger); }\n.caf-doc-add { font-size: 1rem; font-weight: 650; }\n.caf-empty .caf-btn { margin-top: 0.6rem; }\n.caf-records-block { display: flex; flex-direction: column; gap: 1rem; min-width: 0; }\n.caf-chevron-closed { transform: rotate(-90deg); }\n.caf-block-fill { border: none; background: transparent; padding: 0; overflow: auto; min-height: 320px; }\n.caf-empty, .caf-loading { color: var(--caf-muted); font-size: 0.9rem; text-align: center; padding: 1.6rem 1rem; }\n.caf-block-error { border-color: var(--caf-danger); gap: 0.4rem; }\n.caf-block-error strong { font-size: 0.9rem; color: var(--caf-danger); }\n.caf-block-error code { font-size: 0.78rem; color: var(--caf-muted); word-break: break-word; }\n`;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// storage.js \u2014 wrapper over window.storage (Chat Artifacts, published only).\n//\n// Verified empirically against the real runtime: get/set/delete/list all\n// take (key, shared = false) and return a Promise resolving to\n// { key, value, shared, \"@type\": \"...StorageXResponse\" }. Confirmed:\n// - values must be strings (a raw object throws \"Invalid payload content\")\n// - shared=true/false is a real, working scope switch\n// - failures (including \"key not found\") all throw the same generic\n// message with no distinguishing `code` \u2014 there is no reliable way to\n// tell \"empty\" from \"backend error\" from the error alone.\n\nfunction available() {\n return typeof window !== \"undefined\" && typeof window.storage === \"object\" && window.storage !== null;\n}\n\nfunction scope(shared) {\n return {\n async get(key, fallback = undefined) {\n if (!available()) return fallback;\n try {\n const res = await window.storage.get(key, shared);\n if (res?.value === undefined || res?.value === null) return fallback;\n try {\n return JSON.parse(res.value);\n } catch {\n return res.value; // not JSON \u2014 a plain string written via set(key, value, { raw: true })\n }\n } catch {\n // See file header: this same catch fires for \"key does not exist\"\n // and for a real backend failure. Treating both as \"no value\" is\n // the safer default for a read path, at the cost of hiding outages.\n return fallback;\n }\n },\n\n async set(key, value, { raw = false } = {}) {\n if (!available()) {\n throw new Error(\"window.storage is not available (is this a Code Artifact rather than a published Chat Artifact?)\");\n }\n const payload = raw ? value : JSON.stringify(value);\n if (typeof payload !== \"string\") {\n throw new Error(\"window.storage only accepts strings \u2014 the value must be JSON-serializable\");\n }\n return window.storage.set(key, payload, shared);\n },\n\n async delete(key) {\n if (!available()) return;\n try {\n await window.storage.delete(key, shared);\n } catch {\n // same ambiguity as get() \u2014 silently a no-op if the key never existed\n }\n },\n\n async list(prefix) {\n if (!available()) return [];\n try {\n const res = await window.storage.list(prefix, shared);\n return res?.keys || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n// storage.get/set/delete/list operate on the per-viewer (personal) scope.\n// storage.shared.* are the same four methods against the shared scope, where\n// every viewer of the artifact reads and writes the same state.\nexport const storage = { ...scope(false), shared: scope(true), available };\n", "// state.js \u2014 small reactive stores for artifact UI state, layered on storage.js.\n//\n// Three tiers, each a superset of the previous:\n// createStore in-memory only, no persistence\n// createPersistedStore loads from storage once, saves (debounced) on every\n// change \u2014 personal scope, single viewer\n// createSharedStore same, but polls storage.shared so every viewer of a\n// published artifact converges on the same state\n//\n// createSharedStore is last-write-wins with no merge: if two viewers change\n// the same key inside one poll window, whichever write lands last on the\n// server wins and the other is silently overwritten on the next poll. Fine\n// for \"everyone sees the same board/list\", not a CRDT.\n\nimport { storage } from \"./storage.js\";\n\nfunction makeStore(initialState) {\n let state = initialState;\n const subscribers = new Set();\n\n function get() {\n return state;\n }\n\n function set(next) {\n state = typeof next === \"function\" ? next(state) : next;\n subscribers.forEach((fn) => fn(state));\n }\n\n function subscribe(fn) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n return { get, set, subscribe };\n}\n\nfunction debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\nexport function createStore(initialState) {\n return makeStore(initialState);\n}\n\nexport function createPersistedStore(key, initialState, { debounceMs = 300 } = {}) {\n const store = makeStore(initialState);\n const persist = debounce((value) => storage.set(key, value), debounceMs);\n\n const ready = storage.get(key, initialState).then((loaded) => store.set(loaded));\n store.subscribe(persist);\n\n return { ...store, ready };\n}\n\nexport function createSharedStore(key, initialState, { pollMs = 2000, debounceMs = 300 } = {}) {\n const store = makeStore(initialState);\n const persist = debounce((value) => storage.shared.set(key, value), debounceMs);\n let applyingRemote = false;\n\n store.subscribe((value) => {\n if (!applyingRemote) persist(value);\n });\n\n async function poll() {\n const remote = await storage.shared.get(key, initialState);\n if (JSON.stringify(remote) === JSON.stringify(store.get())) return;\n applyingRemote = true;\n store.set(remote);\n applyingRemote = false;\n }\n\n const ready = poll();\n const timer = setInterval(poll, pollMs);\n\n return { ...store, ready, stop: () => clearInterval(timer) };\n}\n", "// react-runtime.js \u2014 how the framework gets hold of React.\n//\n// It must use the SAME React the host already loaded: a second copy on the\n// page makes every hook throw. But it must not depend on it with a static\n// `import React from \"react\"` either \u2014 a specifier the host can't resolve\n// kills the whole module at load time, before anything is left running to\n// report why.\n//\n// So React is resolved at runtime, from whichever of these is available:\n//\n// 1. globalThis.React \u2014 present when the host exposes it\n// 2. useReact(React) \u2014 the explicit hand-off\n//\n// The hand-off is one line and always available, because an artifact already\n// imports React for its own code:\n//\n// import React from \"react\";\n// ArtifactKit.useReact(React);\n//\n// Deliberately no dynamic import(\"react\") fallback: it would need top-level\n// await, which the IIFE build can't have, and it only pays off in a runtime\n// with a native import map \u2014 which is not the way artifacts load code.\n\nlet React = typeof globalThis !== \"undefined\" ? globalThis.React : undefined;\n\nexport function useReact(instance) {\n React = instance;\n return instance;\n}\n\nexport function hasReact() {\n return Boolean(React);\n}\n\n// The live instance, for the few places that need React itself rather than one\n// of its functions \u2014 `class extends React.Component`, most of all.\nexport function getReact() {\n return required();\n}\n\nfunction required() {\n if (!React) {\n throw new Error(\n \"claude-artifact-framework: React not found. Hand it over once, before createApp:\\n\\n\" +\n ' import React from \"react\";\\n' +\n \" ArtifactKit.useReact(React);\\n\"\n );\n }\n return React;\n}\n\n// Bound lazily, because modules import these at load time \u2014 which is before\n// useReact() can possibly have run.\nexport const createElement = (...args) => required().createElement(...args);\nexport const useState = (...args) => required().useState(...args);\nexport const useEffect = (...args) => required().useEffect(...args);\nexport const useMemo = (...args) => required().useMemo(...args);\nexport const useRef = (...args) => required().useRef(...args);\n\n// A class component is read as a value at module scope, so it can't be\n// deferred behind a call. This stand-in is only ever constructed if React was\n// still missing at render time, and it reports the same error then.\nexport const Component =\n (React && React.Component) ||\n class ReactMissing {\n render() {\n return required();\n }\n };\n\n// The default export mirrors `import React from \"react\"`, so the source files\n// can keep using React.createElement / React.useState unchanged.\nexport default {\n get createElement() { return required().createElement; },\n get Component() { return required().Component; },\n get useState() { return required().useState; },\n get useEffect() { return required().useEffect; },\n get useMemo() { return required().useMemo; },\n get useRef() { return required().useRef; },\n};\n", "// appState.js \u2014 the store behind createApp.\n//\n// Two states, and the split is the point:\n// data domain data only. Declared by the author, persisted whole in one write.\n// view navigation stack, selection, current step, form drafts, pending flags.\n// Owned by the framework, persisted under its own key, never declared\n// and never seen by the author.\n//\n// That split is why `data` needs no zones or transient markers: nothing that\n// would be wrong to restore (an open modal, a half-typed draft) ever lives in\n// it. It also removes every storage key as an invention point \u2014 the author\n// never names one.\n\nimport { storage } from \"./storage.js\";\n\nconst DATA_KEY = \"caf:data\";\nconst VIEWER_KEY = \"caf:viewer\";\nconst VIEW_KEY = \"caf:view\";\n\nconst EMPTY_VIEW = { screen: null, arg: null, stack: [], step: 0, selected: null, tabs: {}, collapsed: {} };\n\nfunction isPlainObject(v) {\n return v !== null && typeof v === \"object\" && !Array.isArray(v);\n}\n\n// Stored values win, but only where they exist. A field the author added\n// after data was already saved simply falls through to its declared default,\n// which is what makes additive edits need no migration at all.\nfunction mergeDefaults(defaults, stored) {\n if (!isPlainObject(defaults) || !isPlainObject(stored)) {\n return stored === undefined ? defaults : stored;\n }\n const out = { ...defaults };\n for (const key of Object.keys(stored)) {\n out[key] = isPlainObject(defaults[key]) ? mergeDefaults(defaults[key], stored[key]) : stored[key];\n }\n return out;\n}\n\nfunction debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\n// With `shared: true` the DATA pool lives in the shared storage scope, so\n// every viewer of a published artifact converges on the same data (polled,\n// last-write-wins). View state \u2014 navigation, selection, the open record \u2014\n// stays personal ALWAYS: two people looking at the same list should not\n// fight over which screen is open.\nexport function createAppState(defaults, { debounceMs = 400, shared = false, pollMs = 2500 } = {}) {\n const dataStore = shared ? storage.shared : storage;\n let data = structuredCloneish(defaults);\n let view = { ...EMPTY_VIEW };\n let hydrated = false;\n let viewerId = null;\n // Counts update() calls so a poll never overwrites edits that haven't been\n // persisted yet: remote state only applies when we owe storage nothing.\n let writes = 0;\n let persistedWrites = 0;\n const listeners = new Set();\n\n // Notification is batched to a microtask: three mutations in a row produce\n // one render, not three. Persistence is separately debounced, because\n // writing to window.storage is async and must not run at typing speed.\n let queued = false;\n function notify() {\n if (queued) return;\n queued = true;\n Promise.resolve().then(() => {\n queued = false;\n for (const fn of listeners) fn();\n });\n }\n\n const persistData = debounce(() => {\n const at = writes;\n Promise.resolve(dataStore.set(DATA_KEY, data)).then(() => {\n persistedWrites = Math.max(persistedWrites, at);\n }).catch(() => {});\n }, debounceMs);\n const persistView = debounce(() => storage.set(VIEW_KEY, view), debounceMs);\n\n if (shared) {\n setInterval(async () => {\n if (!hydrated || writes > persistedWrites) return; // local edits in flight win\n try {\n const remote = await dataStore.get(DATA_KEY, undefined);\n if (remote !== undefined && JSON.stringify(remote) !== JSON.stringify(data)) {\n data = mergeDefaults(defaults, remote);\n notify();\n }\n } catch {\n // a failed poll just means we try again next tick\n }\n }, pollMs);\n }\n\n const ready = (async () => {\n const [storedData, storedView, storedViewer] = await Promise.all([\n dataStore.get(DATA_KEY, undefined),\n storage.get(VIEW_KEY, undefined),\n storage.get(VIEWER_KEY, undefined),\n ]);\n // A stable anonymous per-viewer id, ALWAYS in the personal scope \u2014 in a\n // shared app it lets declarations express \"one vote per person\" and\n // \"added by\", without any account system.\n if (typeof storedViewer === \"string\" && storedViewer) {\n viewerId = storedViewer;\n } else {\n viewerId = \"v\" + Math.random().toString(36).slice(2, 10) + Math.random().toString(36).slice(2, 6);\n storage.set(VIEWER_KEY, viewerId).catch?.(() => {});\n }\n if (storedData !== undefined) data = mergeDefaults(defaults, storedData);\n if (storedView !== undefined) view = { ...EMPTY_VIEW, ...storedView };\n hydrated = true;\n notify();\n })();\n\n function update(fn) {\n const result = fn(data);\n // Handlers may either mutate the draft or return a replacement.\n if (result !== undefined) data = result;\n data = { ...data };\n writes++;\n persistData();\n notify();\n }\n\n function setView(patch) {\n view = { ...view, ...patch };\n persistView();\n notify();\n }\n\n return {\n ready,\n isHydrated: () => hydrated,\n getViewerId: () => viewerId,\n getData: () => data,\n getView: () => view,\n update,\n setView,\n go(screen, arg) {\n setView({ stack: [...view.stack, { screen: view.screen, arg: view.arg }], screen, arg });\n },\n back() {\n const stack = view.stack.slice();\n const previous = stack.pop() || { screen: null, arg: null };\n setView({ stack, screen: previous.screen, arg: previous.arg });\n },\n subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\n// Defaults come from a literal in the declaration; a shallow structural copy\n// is enough and avoids depending on structuredClone being present.\nfunction structuredCloneish(value) {\n if (Array.isArray(value)) return value.map(structuredCloneish);\n if (isPlainObject(value)) {\n const out = {};\n for (const k of Object.keys(value)) out[k] = structuredCloneish(value[k]);\n return out;\n }\n return value;\n}\n", "// theme.js \u2014 derives a complete palette from a single seed colour.\n//\n// One token in, a full light+dark palette out, with contrast checked rather\n// than assumed. The point is that an app gets its own visual identity from\n// one line while structure stays shared, so apps built with this framework\n// don't all look alike.\n//\n// Neutrals carry a slight hue bias toward the seed instead of being pure\n// grey \u2014 a pure mid-grey reads as unconsidered.\n\nfunction clamp(n, lo, hi) {\n return Math.min(hi, Math.max(lo, n));\n}\n\nfunction hexToRgb(hex) {\n let h = String(hex).replace(\"#\", \"\").trim();\n if (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n const n = parseInt(h, 16);\n if (!Number.isFinite(n)) return [59, 110, 246];\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\nfunction rgbToHex(rgb) {\n return \"#\" + rgb.map((v) => clamp(Math.round(v), 0, 255).toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nfunction rgbToHsl([r, g, b]) {\n r /= 255; g /= 255; b /= 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n const d = max - min;\n let h = 0;\n let s = 0;\n if (d) {\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0);\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n h /= 6;\n }\n return [h * 360, s * 100, l * 100];\n}\n\nfunction hslToRgb(h, s, l) {\n h = (((h % 360) + 360) % 360) / 360;\n s = clamp(s, 0, 100) / 100;\n l = clamp(l, 0, 100) / 100;\n if (!s) return [l * 255, l * 255, l * 255];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const channel = (t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n return [channel(h + 1 / 3) * 255, channel(h) * 255, channel(h - 1 / 3) * 255];\n}\n\nfunction hsl(h, s, l) {\n return rgbToHex(hslToRgb(h, s, l));\n}\n\nfunction luminance(rgb) {\n const a = rgb.map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n}\n\n// WCAG contrast ratio between two hex colours, 1 (identical) to 21 (max).\nexport function contrast(a, b) {\n const la = luminance(hexToRgb(a));\n const lb = luminance(hexToRgb(b));\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\n// Walks lightness until the colour clears `min` contrast against `against`,\n// so the accent is guaranteed legible instead of merely hoped to be.\nfunction accentAt(h, s, against, min, from, step) {\n for (let l = from; l >= 4 && l <= 96; l += step) {\n const candidate = hsl(h, s, l);\n if (contrast(candidate, against) >= min) return candidate;\n }\n return hsl(h, s, step < 0 ? 24 : 82);\n}\n\nexport function palette(seed = \"#3b6ef6\") {\n const [h, rawSat] = rgbToHsl(hexToRgb(seed));\n const sat = clamp(rawSat, 30, 88);\n // Neutrals keep a trace of the seed's hue: chosen, not inherited.\n const tint = clamp(sat * 0.1, 3, 9);\n\n const lightSurface = hsl(h, tint * 0.4, 100);\n const darkSurface = hsl(h, tint * 1.4, 13);\n\n return {\n light: {\n bg: hsl(h, tint, 96.5),\n surface: lightSurface,\n sunken: hsl(h, tint, 93),\n border: hsl(h, tint, 86),\n text: hsl(h, tint * 1.6, 11),\n muted: hsl(h, tint * 1.2, 41),\n accent: accentAt(h, sat, \"#ffffff\", 4.5, 54, -2),\n accentText: \"#ffffff\",\n danger: accentAt(2, 68, \"#ffffff\", 4.5, 54, -2),\n ok: accentAt(148, 62, \"#ffffff\", 4.5, 44, -2),\n warn: accentAt(38, 88, \"#ffffff\", 4.5, 44, -2),\n },\n dark: {\n bg: hsl(h, tint * 1.5, 9),\n surface: darkSurface,\n sunken: hsl(h, tint * 1.5, 7),\n border: hsl(h, tint * 1.3, 24),\n text: hsl(h, tint * 0.6, 95),\n muted: hsl(h, tint * 0.8, 66),\n accent: accentAt(h, clamp(sat, 40, 80), darkSurface, 4.5, 62, 2),\n accentText: hsl(h, tint * 2, 8),\n danger: accentAt(2, 70, darkSurface, 4.5, 62, 2),\n ok: accentAt(148, 55, darkSurface, 4.5, 62, 2),\n warn: accentAt(38, 80, darkSurface, 4.5, 62, 2),\n },\n };\n}\n\nfunction vars(scheme) {\n return Object.entries(scheme)\n .map(([k, v]) => `--caf-${k}: ${v};`)\n .join(\"\");\n}\n\n// Both themes are styled through the same tokens, and the viewer's explicit\n// toggle (data-theme on the root) must beat the OS preference in both\n// directions \u2014 hence the two attribute blocks after the media query.\nexport function themeCss(seed) {\n const p = palette(seed);\n return `\n:root { ${vars(p.light)} }\n@media (prefers-color-scheme: dark) { :root { ${vars(p.dark)} } }\n:root[data-theme=\"dark\"] { ${vars(p.dark)} }\n:root[data-theme=\"light\"] { ${vars(p.light)} }\n`;\n}\n\n// Categorical series colors for charts, derived from the seed by golden-angle\n// hue rotation, so any number of segments stays distinguishable. Mid-tone\n// lightness reads on both the light and dark surface.\nexport function seriesColors(seed, n) {\n const [h0, s0] = rgbToHsl(hexToRgb(seed || \"#3b6ef6\"));\n const s = clamp(s0, 45, 70);\n return Array.from({ length: n }, (_, i) => hsl((h0 + i * 137.5) % 360, s, 52));\n}\n", "// chat.js \u2014 the conversation layout: tutors, advisors, generators, roleplay.\n//\n// Every piece of the network contract here is copied from code proven inside\n// the real artifact runtime (the PDF annotator), not designed on paper:\n//\n// endpoint fetch(\"https://api.anthropic.com/v1/messages\") with NO api\n// key \u2014 the artifact runtime proxies the call and injects auth.\n// streaming stream: true works; SSE parsed via content_block_delta.\n// tools the proxy does NOT support native function calling. Tools are\n// prompted: the model replies with a ```tool_call fenced block\n// holding a JSON array; results go back as a user message\n// tagged [TOOL_RESULT]; loop capped at 8 rounds.\n//\n// The author declares the system prompt and optionally tools that operate on\n// the app's data through ctx.update \u2014 a chat that can drive the app. The\n// framework owns everything that normally ships half-built: message state,\n// live streaming, the busy state, the tool loop, and errors as visible\n// bubbles instead of silent console noise.\n//\n// State split, same philosophy as data/view: `api` holds the exact messages\n// the API needs (including raw tool_call text and [TOOL_RESULT] payloads);\n// `log` holds what a human should see (stripped text, tool pills, errors).\n// Both persist under data.chat, so a conversation survives reload. The\n// in-flight streaming bubble is deliberately ephemeral local state.\n\nimport { createElement as h, useState, useEffect, useRef } from \"react\";\n\nexport const CHAT_KEYS = [\"system\", \"greeting\", \"placeholder\", \"tools\", \"model\", \"maxTokens\"];\n\n// Proven default through the artifact proxy.\nconst DEFAULT_MODEL = \"claude-sonnet-4-6\";\nconst MAX_ROUNDS = 8;\n\nasync function streamCall({ model, maxTokens, system, messages, onText }) {\n const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ model, max_tokens: maxTokens, system, messages, stream: true }),\n });\n if (!res.ok || !res.body) {\n let detail = \"\";\n try {\n const b = await res.json();\n detail = (b && b.error && b.error.message) || JSON.stringify(b);\n } catch {\n detail = await res.text().catch(() => \"\");\n }\n throw new Error(`HTTP ${res.status}${detail ? \": \" + detail : \"\"}`);\n }\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let full = \"\";\n let buf = \"\"; // reassembles SSE events split across network chunks\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split(\"\\n\");\n buf = lines.pop();\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n try {\n const j = JSON.parse(line.slice(6));\n if (j.type === \"content_block_delta\" && j.delta && j.delta.text) {\n full += j.delta.text;\n if (onText) onText(full);\n }\n } catch {\n // non-JSON lines (pings, [DONE]) are expected \u2014 skip\n }\n }\n }\n return full;\n}\n\nexport function parseToolCalls(text) {\n const match = text.match(/```tool_call\\s*\\n?([\\s\\S]*?)```/);\n if (!match) return null;\n try {\n const calls = JSON.parse(match[1]);\n return Array.isArray(calls) && calls.length ? calls : null;\n } catch {\n return null;\n }\n}\n\nexport function stripToolCallBlock(text) {\n return text.replace(/```tool_call\\s*\\n?[\\s\\S]*?```/, \"\").trim();\n}\n\n// The instructions the model needs to use prompted tools. Appended to the\n// author's system prompt only when tools are declared.\nfunction toolProtocol(tools) {\n const list = Object.entries(tools)\n .map(([name, t]) => `- ${name}: ${t.description}\\n Input: ${JSON.stringify(t.input || {})}`)\n .join(\"\\n\");\n return `\n\nYou have tools available:\n${list}\n\nThis environment does not support native function calling. To use a tool, reply ONLY with a \\`\\`\\`tool_call code block containing a JSON array, with no other text in that turn. Example:\n\n\\`\\`\\`tool_call\n[{ \"name\": \"tool_name\", \"input\": { \"param\": \"value\" } }]\n\\`\\`\\`\n\nYou may include several calls in one array. NEVER invent a tool's result \u2014 emit the pure tool_call block and wait for the real result, which arrives in the next message tagged [TOOL_RESULT]. When you have everything you need, answer in natural language with no tool_call block.`;\n}\n\nfunction runTools(calls, tools, ctx) {\n return calls.map((call) => {\n const tool = tools[call.name];\n if (!tool) {\n // Fed back to the model, loud and in-band: it can correct itself on the\n // next round instead of hallucinating a result.\n return { name: call.name, error: `unknown tool \"${call.name}\". Valid tools: ${Object.keys(tools).join(\", \")}` };\n }\n try {\n const result = tool.run(call.input || {}, ctx);\n return { name: call.name, result: result === undefined ? { ok: true } : result };\n } catch (e) {\n return { name: call.name, error: String((e && e.message) || e) };\n }\n });\n}\n\n// Claude answers in markdown; showing raw asterisks makes every chat app\n// look broken. Minimal renderer: HTML is escaped FIRST, then a small set of\n// markdown forms is layered on, so model output can never inject markup.\nconst escHtml = (t) => String(t).replace(/[&<>\"]/g, (c) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\" }[c]));\n\nexport function renderMarkdown(text) {\n const codeBlocks = [];\n let t = String(text).replace(/```[a-z]*\\n?([\\s\\S]*?)```/g, (m, code) => {\n codeBlocks.push(code.replace(/\\n$/, \"\"));\n return \"\\u0000\" + (codeBlocks.length - 1) + \"\\u0000\";\n });\n t = escHtml(t);\n t = t.replace(/`([^`]+)`/g, \"<code>$1</code>\");\n t = t.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n t = t.replace(/(^|[^*])\\*([^*\\n]+)\\*/g, \"$1<em>$2</em>\");\n t = t.replace(/^#{1,3} (.+)$/gm, '<strong class=\"caf-md-h\">$1</strong>');\n t = t.replace(/^[-\u2022*] (.+)$/gm, '<span class=\"caf-md-li\">$1</span>');\n t = t.replace(/^\\d+\\. (.+)$/gm, '<span class=\"caf-md-li caf-md-num\">$1</span>');\n t = t.replace(/\\n/g, \"<br>\");\n t = t.replace(/\\u0000(\\d+)\\u0000/g, (m, i) => '<pre class=\"caf-code\">' + escHtml(codeBlocks[Number(i)]) + \"</pre>\");\n return t;\n}\n\nfunction Bubble({ m }) {\n if (m.role === \"tools\") {\n return h(\"div\", { className: \"caf-msg-tools\" }, `used: ${m.tools.join(\", \")}`);\n }\n if (m.role === \"error\") {\n return h(\n \"div\",\n { className: \"caf-msg caf-msg-error\" },\n h(\"strong\", null, \"The call failed\"),\n h(\"span\", null, m.content),\n h(\"span\", { className: \"caf-hint\" }, \"Your message is kept \u2014 send again to retry.\")\n );\n }\n if (m.role === \"user\") return h(\"div\", { className: \"caf-msg caf-msg-user\" }, m.content);\n return h(\"div\", {\n className: \"caf-msg caf-msg-assistant\",\n dangerouslySetInnerHTML: { __html: renderMarkdown(m.content) },\n });\n}\n\n// The embeddable core: everything the chat layout does, as a single column\n// that can live in a workspace sidebar (or any block slot) as well as fill\n// the whole app. One conversation per app \u2014 it persists under data.chat.\nexport function ChatPanel({ cfg, ctx, title }) {\n const c = cfg;\n const [draft, setDraft] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [live, setLive] = useState(null);\n const endRef = useRef(null);\n\n const chat = ctx.data.chat || { api: [], log: [] };\n const log = chat.log || [];\n\n useEffect(() => {\n if (endRef.current) endRef.current.scrollIntoView({ block: \"end\" });\n }, [log.length, live]);\n\n async function send() {\n const text = draft.trim();\n if (!text || busy) return;\n setDraft(\"\");\n setBusy(true);\n\n // api/log are threaded locally through the loop; ctx.data would be stale\n // inside this closure after each update().\n let api = [...(chat.api || []), { role: \"user\", content: text }];\n let logNow = [...log, { role: \"user\", content: text }];\n const commit = () => ctx.update((d) => { d.chat = { api, log: logNow }; });\n commit();\n\n try {\n const system =\n (typeof c.system === \"function\" ? c.system(ctx.data) : c.system || \"\") +\n (c.tools ? toolProtocol(c.tools) : \"\");\n\n for (let round = 0; round < MAX_ROUNDS; round++) {\n const raw = await streamCall({\n model: c.model || DEFAULT_MODEL,\n maxTokens: c.maxTokens || 2000,\n system,\n messages: api,\n onText: (t) => setLive(stripToolCallBlock(t)),\n });\n\n api = [...api, { role: \"assistant\", content: raw }];\n const shown = stripToolCallBlock(raw);\n const calls = c.tools ? parseToolCalls(raw) : null;\n\n if (!calls) {\n logNow = [...logNow, { role: \"assistant\", content: shown || raw }];\n commit();\n break;\n }\n\n const results = runTools(calls, c.tools, ctx);\n if (shown) logNow = [...logNow, { role: \"assistant\", content: shown }];\n logNow = [...logNow, { role: \"tools\", tools: calls.map((x) => x.name) }];\n api = [\n ...api,\n {\n role: \"user\",\n content: `[TOOL_RESULT]\\n${JSON.stringify(results)}\\n[/TOOL_RESULT]\\n\\nContinue with this information. If you have everything you need, answer in natural language without further tool_call.`,\n },\n ];\n commit();\n setLive(null);\n }\n } catch (e) {\n logNow = [...logNow, { role: \"error\", content: String((e && e.message) || e) }];\n commit();\n } finally {\n setLive(null);\n setBusy(false);\n }\n }\n\n return h(\n \"div\",\n { className: \"caf-chat-panel\" },\n h(\n \"div\",\n { className: \"caf-block caf-chat-log\" },\n // Every other block opens with its title label \u2014 a chat card that\n // starts straight at a bubble was the one heading-less block on screen.\n title ? h(\"h2\", { className: \"caf-block-title\" }, title) : null,\n c.greeting\n ? h(\"div\", { className: \"caf-msg caf-msg-assistant\", dangerouslySetInnerHTML: { __html: renderMarkdown(c.greeting) } })\n : null,\n log.map((m, i) => h(Bubble, { key: i, m })),\n live !== null\n ? h(\"div\", { className: \"caf-msg caf-msg-assistant caf-msg-live\", dangerouslySetInnerHTML: { __html: renderMarkdown(live || \"\u2026\") } })\n : null,\n busy && live === null ? h(\"div\", { className: \"caf-msg-tools\" }, \"thinking\u2026\") : null,\n h(\"div\", { ref: endRef })\n ),\n // Deliberately NOT a <form>: the artifact iframe's sandbox lacks\n // allow-forms, so native form submission is blocked there \u2014 and on mobile\n // the keyboard's send key triggers exactly that implicit submission. A\n // plain div with onClick + Enter via onKeyDown never touches the native\n // form machinery, so it can't be sandboxed away.\n h(\n \"div\",\n { className: \"caf-chat-input\" },\n h(\"input\", {\n value: draft,\n placeholder: c.placeholder || \"Message\u2026\",\n disabled: busy,\n enterKeyHint: \"send\",\n onChange: (e) => setDraft(e.target.value),\n onKeyDown: (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n send();\n }\n },\n \"aria-label\": \"Message\",\n }),\n h(\n \"button\",\n { type: \"button\", className: \"caf-btn caf-btn-primary\", disabled: busy || !draft.trim(), onClick: send },\n \"Send\"\n )\n )\n );\n}\n\nexport function ChatLayout({ spec, ctx }) {\n return h(\"div\", { className: \"caf-panel caf-panel-single\" }, h(ChatPanel, { cfg: spec.chat, ctx }));\n}\n", "// blocks.js \u2014 the content blocks that fill a layout's slots.\n//\n// Every block is a plain React component taking (spec, ctx). Custom code from\n// the escape hatch implements exactly the same contract, which is why ejecting\n// one block never requires ejecting the app.\n//\n// Loading / empty / error are part of the contract rather than edge cases the\n// author opts into: a block that has nothing to show says so by default, so an\n// app can't ship a blank pane while it waits.\n\n// Bound lazily rather than snapshotted as `React.createElement`, because this\n// runs at module load \u2014 before the host has had a chance to hand React over.\nimport { createElement as h, useState, useEffect } from \"react\";\nimport { ChatPanel } from \"./chat.js\";\n\nconst FIELD_TYPES = [\"text\", \"textarea\", \"number\", \"money\", \"percent\", \"check\", \"date\", \"select\", \"file\"];\n\nexport function formatValue(value, format) {\n if (value === null || value === undefined || value === \"\") return \"\u2014\";\n const n = Number(value);\n switch (format) {\n case \"money\":\n return Number.isFinite(n)\n ? n.toLocaleString(undefined, { style: \"currency\", currency: \"USD\", maximumFractionDigits: 2 })\n : String(value);\n case \"percent\":\n return Number.isFinite(n) ? `${n.toLocaleString(undefined, { maximumFractionDigits: 2 })}%` : String(value);\n case \"number\":\n return Number.isFinite(n) ? n.toLocaleString(undefined, { maximumFractionDigits: 2 }) : String(value);\n case \"date\":\n return value instanceof Date ? value.toLocaleDateString() : String(value);\n default:\n return String(value);\n }\n}\n\n// Validation is derived from the field declaration, so the author gets it\n// without writing any: declaring a type and a range IS the validation.\nexport function validateField(field, value) {\n if (field.required && (value === \"\" || value === null || value === undefined)) {\n return \"Required\";\n }\n if (value === \"\" || value === null || value === undefined) return null;\n if (field.type === \"number\" || field.type === \"money\" || field.type === \"percent\") {\n const n = Number(value);\n if (!Number.isFinite(n)) return \"Must be a number\";\n if (field.min !== undefined && n < field.min) return `Must be at least ${field.min}`;\n if (field.max !== undefined && n > field.max) return `Must be at most ${field.max}`;\n }\n return null;\n}\n\nexport function Field({ field, value, onChange, data }) {\n const error = validateField(field, value);\n const id = `caf-f-${field.key}`;\n const numeric = field.type === \"number\" || field.type === \"money\" || field.type === \"percent\";\n\n if (field.type === \"file\") {\n // The File object itself lives at ctx.files[key] (in memory only \u2014 the\n // 5MB/key storage limit makes real files unpersistable); `data` gets\n // serializable metadata. After a reload the metadata survives but the\n // file must be picked again.\n return h(\n \"div\",\n { className: \"caf-field\" },\n h(\"label\", { htmlFor: id }, field.label || field.key),\n h(\"input\", {\n id,\n type: \"file\",\n accept: field.accept,\n onChange: (e) => onChange(e.target.files && e.target.files[0] ? e.target.files[0] : null),\n }),\n value && value.name\n ? h(\"small\", { className: \"caf-hint\" }, `${value.name} (${Math.round((value.size || 0) / 1024)} KB)${value.stale ? \" \u2014 re-pick after reload\" : \"\"}`)\n : field.hint\n ? h(\"small\", { className: \"caf-hint\" }, field.hint)\n : null\n );\n }\n\n if (field.type === \"check\") {\n return h(\n \"label\",\n { className: \"caf-check\" },\n h(\"input\", {\n id,\n type: \"checkbox\",\n checked: Boolean(value),\n onChange: (e) => onChange(e.target.checked),\n }),\n h(\"span\", null, field.label || field.key)\n );\n }\n\n const common = {\n id,\n value: value === null || value === undefined ? \"\" : value,\n \"aria-invalid\": error ? \"true\" : undefined,\n onChange: (e) => onChange(numeric ? toNumber(e.target.value) : e.target.value),\n };\n\n let control;\n if (field.type === \"textarea\") {\n control = h(\"textarea\", { ...common, rows: field.rows || 3 });\n } else if (field.type === \"select\") {\n // Options may be declared as a function of the app data, for selects\n // whose choices come from what the user has entered elsewhere.\n const options = typeof field.options === \"function\" ? field.options(data) || [] : field.options || [];\n control = h(\n \"select\",\n common,\n h(\"option\", { value: \"\" }, field.placeholder || \"Select\u2026\"),\n options.map((opt) => {\n const val = typeof opt === \"string\" ? opt : opt.value;\n const label = typeof opt === \"string\" ? opt : opt.label;\n return h(\"option\", { key: val, value: val }, label);\n })\n );\n } else {\n control = h(\"input\", {\n ...common,\n type: field.type === \"date\" ? \"date\" : numeric ? \"number\" : \"text\",\n min: field.min,\n max: field.max,\n step: field.step || (field.type === \"money\" || field.type === \"percent\" ? \"any\" : undefined),\n placeholder: field.placeholder,\n });\n }\n\n return h(\n \"div\",\n { className: \"caf-field\" },\n h(\"label\", { htmlFor: id }, field.label || field.key),\n control,\n field.hint && !error ? h(\"small\", { className: \"caf-hint\" }, field.hint) : null,\n error ? h(\"small\", { className: \"caf-error\" }, error) : null\n );\n}\n\nfunction toNumber(raw) {\n if (raw === \"\") return \"\";\n const n = Number(raw);\n return Number.isFinite(n) ? n : raw;\n}\n\n// One write path for every field container: file fields park the live File\n// at ctx.files[key] and store metadata; everything else writes the value.\nexport function writeField(ctx, key, field, v, setter) {\n if (field.type === \"file\") {\n ctx.files[key] = v || null;\n const meta = v ? { name: v.name, size: v.size, type: v.type } : null;\n ctx.update((d) => setter(d, meta));\n return;\n }\n ctx.update((d) => setter(d, v));\n}\n\nexport function FieldsBlock({ spec, ctx }) {\n const fields = spec.fields || [];\n return h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: ctx.data[field.key],\n onChange: (v) => writeField(ctx, field.key, field, v, (d, val) => { d[field.key] = val; }),\n })\n )\n );\n}\n\nexport function OutputBlock({ spec, ctx }) {\n const items = typeof spec.output === \"function\" ? spec.output(ctx.data) : spec.output || [];\n if (!items.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"Nothing to show yet.\");\n }\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label || i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format)),\n item.hint ? h(\"small\", { className: \"caf-hint\" }, item.hint) : null\n )\n )\n )\n );\n}\n\nexport function TextBlock({ spec, ctx }) {\n const body = typeof spec.text === \"function\" ? spec.text(ctx.data) : spec.text;\n return h(\n \"div\",\n { className: \"caf-block caf-text\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\"p\", null, body)\n );\n}\n\nexport function ListBlock({ spec, ctx }) {\n const rows = (typeof spec.list === \"function\" ? spec.list(ctx.data) : spec.list) || [];\n // `title` follows the same convention as every other block: a string is the\n // block heading. A function is the per-row title. Both are supported \u2014\n // making list the odd one out was an API inconsistency a blind test caught.\n const heading = typeof spec.title === \"string\" ? spec.title : null;\n const rowTitle = typeof spec.title === \"function\" ? spec.title : (r) => r.title ?? r.name ?? r.label ?? r.text ?? String(r);\n if (!rows.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"Nothing here yet.\");\n }\n return h(\n \"div\",\n { className: \"caf-block caf-list\" },\n heading ? h(\"h2\", { className: \"caf-block-title\" }, heading) : null,\n rows.map((row, i) =>\n h(\n \"button\",\n {\n key: row.id ?? i,\n className: \"caf-row\",\n type: \"button\",\n onClick: spec.onSelect ? () => spec.onSelect(row, ctx) : undefined,\n },\n h(\"span\", { className: \"caf-row-title\" }, rowTitle(row)),\n spec.subtitle ? h(\"span\", { className: \"caf-row-sub\" }, spec.subtitle(row)) : null\n )\n )\n );\n}\n\nconst CHART_TYPES = [\"bar\", \"line\", \"donut\"];\n\n// Charts share the output block's vocabulary \u2014 items of { label, value } plus\n// an optional format \u2014 so declaring one teaches nothing new. Colors come from\n// ctx.colors(n), derived from the theme seed, so a chart can't clash with the\n// app it lives in.\nexport function ChartBlock({ spec, ctx }) {\n const c = typeof spec.chart === \"function\" ? spec.chart(ctx.data) : spec.chart;\n const items = (c && c.items) || [];\n if (!items.length) {\n return h(\"div\", { className: \"caf-block caf-empty\" }, spec.empty || \"No data to chart yet.\");\n }\n const type = c.type || \"bar\";\n if (!CHART_TYPES.includes(type)) {\n // Thrown, not swallowed: the block boundary turns this into a visible,\n // named error instead of an empty pane.\n throw new Error(`unknown chart type \"${type}\". Valid types: ${CHART_TYPES.join(\", \")}.`);\n }\n const colors = ctx.colors(items.length);\n const body =\n type === \"bar\" ? barChart(items, c, colors) : type === \"line\" ? lineChart(items, c) : donutChart(items, c, colors);\n return h(\n \"div\",\n { className: \"caf-block caf-chart\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n body\n );\n}\n\nfunction barChart(items, c, colors) {\n const max = Math.max(...items.map((it) => Number(it.value) || 0), 0) || 1;\n return h(\n \"div\",\n { className: \"caf-bars\" },\n items.map((it, i) =>\n h(\n \"div\",\n { key: it.label ?? i, className: \"caf-bar-row\" },\n h(\"span\", { className: \"caf-bar-label\" }, it.label),\n h(\n \"div\",\n { className: \"caf-bar-track\" },\n h(\"div\", {\n className: \"caf-bar-fill\",\n style: { width: `${Math.max(2, ((Number(it.value) || 0) / max) * 100)}%`, background: colors[i] },\n })\n ),\n h(\"span\", { className: \"caf-bar-value\" }, formatValue(it.value, c.format))\n )\n )\n );\n}\n\nfunction lineChart(items, c) {\n const values = items.map((it) => Number(it.value) || 0);\n const min = Math.min(...values);\n const max = Math.max(...values);\n const span = max - min || 1;\n const W = 100;\n const H = 36;\n const pts = values.map((v, i) => [\n values.length === 1 ? W / 2 : (i / (values.length - 1)) * W,\n H - 3 - ((v - min) / span) * (H - 6),\n ]);\n const last = pts[pts.length - 1];\n return h(\n \"div\",\n { className: \"caf-line\" },\n h(\n \"svg\",\n { viewBox: `0 0 ${W} ${H}`, className: \"caf-line-svg\", preserveAspectRatio: \"none\", \"aria-hidden\": \"true\" },\n [0.25, 0.5, 0.75].map((f) =>\n h(\"line\", { key: f, x1: 0, x2: W, y1: H * f, y2: H * f, className: \"caf-line-grid\" })\n ),\n h(\"polyline\", { points: pts.map((p) => p.join(\",\")).join(\" \"), className: \"caf-line-path\" }),\n h(\"circle\", { cx: last[0], cy: last[1], r: 1.6, className: \"caf-line-dot\" })\n ),\n h(\n \"div\",\n { className: \"caf-line-meta\" },\n h(\"span\", { className: \"caf-hint\" }, String(items[0].label ?? \"\")),\n h(\"span\", { className: \"caf-line-last\" }, formatValue(values[values.length - 1], c.format)),\n h(\"span\", { className: \"caf-hint\" }, String(items[items.length - 1].label ?? \"\"))\n )\n );\n}\n\nfunction donutChart(items, c, colors) {\n const total = items.reduce((s, it) => s + (Number(it.value) || 0), 0) || 1;\n const R = 15.9155; // circumference \u2248 100, so dash lengths are percentages\n let offset = 25; // start at 12 o'clock\n const segments = items.map((it, i) => {\n const pct = ((Number(it.value) || 0) / total) * 100;\n const seg = h(\"circle\", {\n key: it.label ?? i,\n cx: 21, cy: 21, r: R,\n className: \"caf-donut-seg\",\n stroke: colors[i],\n strokeDasharray: `${pct} ${100 - pct}`,\n strokeDashoffset: offset,\n });\n offset -= pct;\n return seg;\n });\n return h(\n \"div\",\n { className: \"caf-donut\" },\n h(\"svg\", { viewBox: \"0 0 42 42\", className: \"caf-donut-svg\", \"aria-hidden\": \"true\" }, segments),\n h(\n \"div\",\n { className: \"caf-donut-legend\" },\n items.map((it, i) =>\n h(\n \"div\",\n { key: it.label ?? i, className: \"caf-legend-row\" },\n h(\"span\", { className: \"caf-legend-swatch\", style: { background: colors[i] } }),\n h(\"span\", { className: \"caf-legend-label\" }, it.label),\n h(\"span\", { className: \"caf-legend-value\" }, formatValue(it.value, c.format))\n )\n )\n )\n );\n}\n\n// The interval is framework-owned and cleaned up on unmount \u2014 a leaked\n// setInterval is one of the classic half-built artifact bugs. The countdown\n// itself is deliberately ephemeral (local state); what the author declares is\n// what happens WHEN it finishes: onDone runs through update(), so its effects\n// persist like any other change.\nexport function TimerBlock({ spec, ctx }) {\n const t = spec.timer || {};\n const total = Math.max(1, Math.round((t.minutes || 0) * 60 + (t.seconds || 0)) || 300);\n const [left, setLeft] = useState(total);\n const [running, setRunning] = useState(false);\n\n useEffect(() => {\n if (!running) return;\n const id = setInterval(() => setLeft((prev) => Math.max(0, prev - 1)), 1000);\n return () => clearInterval(id);\n }, [running]);\n\n useEffect(() => {\n if (left === 0 && running) {\n setRunning(false);\n if (typeof t.onDone === \"function\") ctx.update((d) => t.onDone(d));\n }\n }, [left, running]);\n\n const mm = String(Math.floor(left / 60)).padStart(2, \"0\");\n const ss = String(left % 60).padStart(2, \"0\");\n const done = left === 0;\n\n return h(\n \"div\",\n { className: \"caf-block caf-timer\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n t.label ? h(\"span\", { className: \"caf-hint\" }, t.label) : null,\n h(\"div\", { className: done ? \"caf-timer-time caf-timer-done\" : \"caf-timer-time\" }, done ? (t.doneText || \"Done!\") : `${mm}:${ss}`),\n h(\"div\", { className: \"caf-bar-track\" }, h(\"div\", { className: \"caf-bar-fill caf-timer-fill\", style: { width: `${(left / total) * 100}%` } })),\n h(\n \"div\",\n { className: \"caf-timer-controls\" },\n h(\n \"button\",\n { type: \"button\", className: \"caf-btn caf-btn-primary\", disabled: done, onClick: () => setRunning((r) => !r) },\n running ? \"Pause\" : \"Start\"\n ),\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => { setRunning(false); setLeft(total); } }, \"Reset\")\n )\n );\n}\n\n// Declarative buttons that mutate data \u2014 the one-tap interactions (counters,\n// check-ins, +1s) that previously forced an escape to custom code.\nexport function ActionsBlock({ spec, ctx }) {\n const actions = spec.actions || [];\n const visible = actions.filter((a) => !a.when || a.when(ctx.data, ctx.viewerId));\n return h(\n \"div\",\n { className: \"caf-block caf-actions\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n h(\n \"div\",\n { className: \"caf-actions-row\" },\n visible.map((a) =>\n h(\n \"button\",\n {\n key: a.label,\n type: \"button\",\n className:\n a.kind === \"danger\"\n ? \"caf-btn caf-btn-danger\"\n : a.kind === \"primary\"\n ? \"caf-btn caf-btn-primary\"\n : \"caf-btn\",\n onClick: () => ctx.update((d) => a.run(d, ctx.viewerId)),\n },\n a.label\n )\n )\n )\n );\n}\n\n// The escape hatch. Receives the same ctx every built-in block gets, so a\n// custom block keeps persistence, theming, navigation and the error boundary.\nexport function CustomBlock({ spec, ctx }) {\n const rendered = spec.custom(ctx);\n // `fill: true` frees the block from the card chrome so it can own a large\n // scrollable surface (a viewer, a canvas) \u2014 the workspace main-area case.\n const cls = spec.fill ? \"caf-block caf-block-fill\" : \"caf-block\";\n if (typeof rendered === \"string\") {\n return h(\"div\", { className: cls, dangerouslySetInnerHTML: { __html: rendered } });\n }\n return h(\"div\", { className: cls }, rendered);\n}\n\nexport const BLOCKS = {\n fields: FieldsBlock,\n output: OutputBlock,\n text: TextBlock,\n list: ListBlock,\n chart: ChartBlock,\n timer: TimerBlock,\n actions: ActionsBlock,\n chat: ({ spec, ctx }) => h(ChatPanel, { cfg: spec.chat, ctx, title: spec.title }),\n custom: CustomBlock,\n};\n\nexport const BLOCK_NAMES = Object.keys(BLOCKS);\nexport { FIELD_TYPES };\n", "// records.js \u2014 the \"list of things\" layout: expenses, habits, notes, todos.\n//\n// The author declares what a record IS (the same field declarations the\n// fields block uses) and optionally what the collection summarises to. The\n// whole CRUD lifecycle \u2014 list, add, edit, delete, empty state, selection,\n// navigation \u2014 is framework-owned, so none of it can be half-built.\n//\n// Two deliberate choices keep the state model tiny:\n//\n// add-then-edit \"Add\" creates the record from field defaults and navigates\n// straight into it. There is no separate draft object, so a\n// half-typed record can't be lost \u2014 it already exists.\n// edit-in-place Detail fields write into the record directly through\n// update(), so persistence and re-render are the same\n// debounced path every other block uses.\n//\n// Which record is open lives in view state (screen \"record\", arg = id), never\n// in data \u2014 restoring it on reload is correct, and deleting the open record\n// simply falls back to the list.\n\nimport { createElement as h, useState, useEffect } from \"react\";\nimport { Field, formatValue } from \"./blocks.js\";\n\n// Computed fields are derived at render time and never stored, so they can't\n// go stale. Accepts `{ subtotal: (r) => ... }` or\n// `{ subtotal: { label, format, value: (r) => ... } }`.\nfunction computedEntries(spec) {\n return Object.entries(spec.compute || {}).map(([k, v]) => [k, typeof v === \"function\" ? { value: v } : v]);\n}\n\nexport function withComputed(spec, rec) {\n if (!spec.compute) return rec;\n const out = { ...rec };\n for (const [key, c] of computedEntries(spec)) {\n try {\n out[key] = c.value(rec);\n } catch {\n out[key] = undefined;\n }\n }\n return out;\n}\n\nexport function recordDefaults(fields) {\n const rec = {};\n for (const f of fields) {\n rec[f.key] = f.value !== undefined ? f.value : f.type === \"check\" ? false : \"\";\n }\n return rec;\n}\n\n// Collision-proof enough for a per-user list; no coordination needed.\nfunction makeId() {\n return \"r\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nfunction rowTitle(spec, rec) {\n if (spec.title) return spec.title(rec);\n // Default: the first text-ish field, which is what a human would label by.\n const f = spec.fields.find((f) => !f.type || f.type === \"text\" || f.type === \"textarea\" || f.type === \"select\");\n const v = f && rec[f.key];\n return v === \"\" || v === undefined || v === null ? \"(untitled)\" : String(v);\n}\n\nfunction Summary({ spec, records }) {\n if (!spec.summary) return null;\n const items = spec.summary(records) || [];\n if (!items.length) return null;\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label || i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format))\n )\n )\n )\n );\n}\n\nfunction ListScreen({ spec, ctx }) {\n const label = spec.label || \"item\";\n const [query, setQuery] = useState(\"\");\n // Records can land in the collection without the framework's Add button \u2014\n // a chat tool, an author action, hand-written `data`. Assigning ids is the\n // framework's job (it's reserved), so complete any record missing one;\n // otherwise its row can never open a detail screen.\n useEffect(() => {\n if ((ctx.data.records || []).some((r) => r && !r.id)) {\n ctx.update((d) => {\n for (const r of d.records || []) if (r && !r.id) r.id = makeId();\n });\n }\n });\n let records = ctx.data.records.map((r) => withComputed(spec, r));\n if (spec.sort) records = records.slice().sort(spec.sort);\n const total = records.length;\n const q = query.trim().toLowerCase();\n if (spec.search && q) {\n records = records.filter((r) =>\n spec.fields.some((f) => String(r[f.key] ?? \"\").toLowerCase().includes(q))\n );\n }\n\n function add() {\n const rec = { id: makeId(), ...recordDefaults(spec.fields) };\n if (spec.items) rec.items = [];\n ctx.update((d) => {\n d.records = [...d.records, rec];\n });\n ctx.go(\"record\", rec.id);\n }\n\n return h(\n \"div\",\n { className: \"caf-block caf-list\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\n \"span\",\n { className: \"caf-count\" },\n spec.search && q ? `${records.length} of ${total}` : `${total} ${label}${total === 1 ? \"\" : \"s\"}`\n ),\n h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-primary\", onClick: add }, `Add ${label}`)\n ),\n spec.search\n ? h(\"input\", {\n className: \"caf-search\",\n value: query,\n placeholder: `Search ${label}s\u2026`,\n \"aria-label\": \"Search\",\n onChange: (e) => setQuery(e.target.value),\n })\n : null,\n spec.search && q && records.length === 0 && total > 0\n ? h(\"div\", { className: \"caf-empty\" }, `Nothing matches \"${query}\".`)\n : null,\n records.length === 0\n ? h(\"div\", { className: \"caf-empty\" }, spec.empty || `No ${label}s yet. Add the first one.`)\n : records.map((rec) =>\n h(\n \"div\",\n { key: rec.id, className: \"caf-row-wrap\" },\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-row\",\n onClick: () => ctx.go(\"record\", rec.id),\n },\n h(\"span\", { className: \"caf-row-title\" }, rowTitle(spec, rec)),\n spec.subtitle ? h(\"span\", { className: \"caf-row-sub\" }, spec.subtitle(rec)) : null\n ),\n spec.actions\n ? h(\n \"div\",\n { className: \"caf-row-actions\" },\n spec.actions\n .filter((a) => !a.when || a.when(rec, ctx.viewerId))\n .map((a) =>\n h(\n \"button\",\n {\n key: a.label,\n type: \"button\",\n className: a.kind === \"danger\" ? \"caf-btn caf-btn-danger caf-btn-sm\" : \"caf-btn caf-btn-sm\",\n onClick: () =>\n ctx.update((d) => {\n const live = d.records.find((x) => x.id === rec.id);\n if (live) a.run(live, d, ctx.viewerId);\n }),\n },\n a.label\n )\n )\n )\n : null\n )\n )\n );\n}\n\nfunction DetailScreen({ spec, ctx, record }) {\n const label = spec.label || \"item\";\n\n function remove() {\n ctx.update((d) => {\n d.records = d.records.filter((r) => r.id !== record.id);\n });\n ctx.back();\n }\n\n return h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: ctx.back }, \"\u2039 Back\"),\n h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-danger\", onClick: remove }, `Delete ${label}`)\n ),\n spec.fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: record[field.key],\n onChange: (v) =>\n ctx.update((d) => {\n const rec = d.records.find((r) => r.id === record.id);\n if (rec) rec[field.key] = v;\n }),\n })\n ),\n spec.items ? h(ItemsEditor, { spec, ctx, record }) : null,\n spec.compute\n ? h(\n \"div\",\n { className: \"caf-output-grid caf-computed\" },\n computedEntries(spec).map(([key, c]) => {\n const live = withComputed(spec, record);\n return h(\n \"div\",\n { key, className: \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, c.label || key),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(live[key], c.format))\n );\n })\n )\n : null\n );\n}\n\n// The child collection edits INLINE on the parent's detail screen \u2014 one\n// navigation level, no child screens. That bounds the feature honestly: items\n// are for small rows (2-4 fields), not for records that deserve their own\n// detail view.\nfunction ItemsEditor({ spec, ctx, record }) {\n const ispec = spec.items;\n const label = ispec.label || \"item\";\n\n function mutate(fn) {\n ctx.update((d) => {\n const rec = d.records.find((r) => r.id === record.id);\n if (!rec) return;\n if (!Array.isArray(rec.items)) rec.items = [];\n fn(rec);\n });\n }\n\n const items = Array.isArray(record.items) ? record.items : [];\n\n return h(\n \"div\",\n { className: \"caf-items\" },\n h(\n \"div\",\n { className: \"caf-toolbar\" },\n h(\"span\", { className: \"caf-count\" }, `${items.length} ${label}${items.length === 1 ? \"\" : \"s\"}`),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-sm\",\n onClick: () => mutate((rec) => rec.items.push({ id: makeId(), ...recordDefaults(ispec.fields) })),\n },\n `Add ${label}`\n )\n ),\n items.length === 0\n ? h(\"div\", { className: \"caf-empty caf-empty-sm\" }, ispec.empty || `No ${label}s yet.`)\n : items.map((item) =>\n h(\n \"div\",\n { key: item.id, className: \"caf-item-row\" },\n ispec.fields.map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: item[field.key],\n onChange: (v) =>\n mutate((rec) => {\n const it = rec.items.find((x) => x.id === item.id);\n if (it) it[field.key] = v;\n }),\n })\n ),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-danger caf-btn-sm caf-item-remove\",\n \"aria-label\": `Remove ${label}`,\n onClick: () => mutate((rec) => { rec.items = rec.items.filter((x) => x.id !== item.id); }),\n },\n \"\u2715\"\n )\n )\n )\n );\n}\n\n// The block form of records: the same list/detail/summary machinery embedded\n// wherever panel blocks go (panel, workspace panes, documents, tabs). The\n// collection lives in the enclosing data pool under `key` (default\n// \"records\"), so inside `documents` each document gets its own collection\n// for free. The open record is view state under a per-collection key \u2014\n// list/detail navigation without touching the app-level screen stack.\nfunction aliasRecords(d, key) {\n if (key === \"records\") return d;\n // The internal machinery reads and writes `d.records`; alias it onto the\n // author's collection key while leaving every other property untouched\n // (author actions receive this same object and see the real pool).\n return new Proxy(d, {\n get: (t, p, r) => (p === \"records\" ? t[key] : Reflect.get(t, p, r)),\n set: (t, p, v) => Reflect.set(t, p === \"records\" ? key : p, v),\n has: (t, p) => (p === \"records\" ? key in t : p in t),\n });\n}\n\nexport function RecordsBlock({ spec, ctx }) {\n const rspec = spec.records;\n const key = rspec.key || \"records\";\n const arr = Array.isArray(ctx.data[key]) ? ctx.data[key] : [];\n const stateKey = \"caf:rec:\" + key;\n const openId = ctx.view.tabs ? ctx.view.tabs[stateKey] : undefined;\n\n const scoped = {\n ...ctx,\n data: { ...ctx.data, records: arr },\n update: (fn) => ctx.update((d) => fn(aliasRecords(d, key))),\n go: (_screen, id) => ctx.setTab(stateKey, id),\n back: () => ctx.setTab(stateKey, undefined),\n };\n\n // A deleted or stale open record falls back to the list, never a blank pane.\n const record = openId ? arr.find((r) => r.id === openId) : null;\n\n return h(\n \"div\",\n { className: \"caf-records-block\" },\n spec.title ? h(\"h2\", { className: \"caf-block-title\" }, spec.title) : null,\n record\n ? h(DetailScreen, { key: \"d\", spec: rspec, ctx: scoped, record })\n : [\n h(Summary, { key: \"s\", spec: rspec, records: arr.map((r) => withComputed(rspec, r)) }),\n h(ListScreen, { key: \"l\", spec: rspec, ctx: scoped }),\n ]\n );\n}\n\nexport function RecordsLayout({ spec, ctx }) {\n const rspec = spec.records;\n\n if (ctx.view.screen === \"record\") {\n const record = ctx.data.records.find((r) => r.id === ctx.view.arg);\n // The open record can vanish (deleted, or stale view state from an earlier\n // version of the data) \u2014 fall back to the list rather than a blank pane.\n if (record) {\n return h(\"div\", { className: \"caf-panel caf-panel-single\" }, h(DetailScreen, { spec: rspec, ctx, record }));\n }\n }\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(Summary, { spec: rspec, records: ctx.data.records.map((r) => withComputed(rspec, r)) }),\n h(ListScreen, { spec: rspec, ctx })\n );\n}\n", "// steps.js \u2014 the wizard layout: quizzes, assessments, staged calculators,\n// long forms, onboarding.\n//\n// The author declares the sequence; next/back/progress/result are\n// framework-owned. Three rules keep it un-breakable:\n//\n// one data pool step fields write into the same flat `data` every other\n// block uses, so a result step is just a function of data \u2014\n// no \"collect answers\" plumbing to half-build.\n// gated next Next is disabled while any field on the CURRENT step is\n// invalid; earlier steps are already valid by construction,\n// later ones aren't the user's problem yet.\n// resumable the current step lives in view state, so a reload lands\n// on the step the user was on, holding their answers.\n\nimport { createElement as h } from \"react\";\nimport { Field, validateField, formatValue, writeField } from \"./blocks.js\";\n\nfunction stepErrors(step, data) {\n return (step.fields || []).some((f) => validateField(f, data[f.key]) !== null);\n}\n\nfunction ResultScreen({ step, ctx }) {\n const items = step.result(ctx.data) || [];\n return h(\n \"div\",\n { className: \"caf-block caf-output\" },\n step.title ? h(\"h2\", { className: \"caf-block-title\" }, step.title) : null,\n h(\n \"div\",\n { className: \"caf-output-grid\" },\n items.map((item, i) =>\n h(\n \"div\",\n { key: item.label ?? i, className: item.big ? \"caf-stat caf-stat-big\" : \"caf-stat\" },\n h(\"span\", { className: \"caf-stat-label\" }, item.label),\n h(\"span\", { className: \"caf-stat-value\" }, formatValue(item.value, item.format)),\n item.hint ? h(\"small\", { className: \"caf-hint\" }, item.hint) : null\n )\n )\n ),\n h(\n \"div\",\n { className: \"caf-step-nav\" },\n h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => ctx.setStep(0) }, \"Start over\")\n )\n );\n}\n\nexport function StepsLayout({ spec, ctx }) {\n const steps = spec.steps;\n const i = Math.min(Math.max(ctx.view.step || 0, 0), steps.length - 1);\n const step = steps[i];\n const isResult = typeof step.result === \"function\";\n const isLast = i === steps.length - 1;\n\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(\n \"div\",\n { className: \"caf-steps-progress\" },\n h(\"span\", { className: \"caf-hint\" }, isResult ? \"Result\" : `Step ${i + 1} of ${steps.length}`),\n h(\n \"div\",\n { className: \"caf-bar-track\" },\n h(\"div\", { className: \"caf-bar-fill caf-steps-fill\", style: { width: `${((i + 1) / steps.length) * 100}%` } })\n )\n ),\n isResult\n ? h(ResultScreen, { step, ctx })\n : h(\n \"div\",\n { className: \"caf-block caf-fields\" },\n step.title ? h(\"h2\", { className: \"caf-block-title\" }, step.title) : null,\n step.text ? h(\"p\", { className: \"caf-step-text\" }, typeof step.text === \"function\" ? step.text(ctx.data) : step.text) : null,\n (step.fields || []).map((field) =>\n h(Field, {\n key: field.key,\n field,\n data: ctx.data,\n value: ctx.data[field.key],\n onChange: (v) => writeField(ctx, field.key, field, v, (d, val) => { d[field.key] = val; }),\n })\n ),\n h(\n \"div\",\n { className: \"caf-step-nav\" },\n i > 0\n ? h(\"button\", { type: \"button\", className: \"caf-btn\", onClick: () => ctx.setStep(i - 1) }, \"\u2039 Back\")\n : h(\"span\"),\n !isLast\n ? h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-btn caf-btn-primary\",\n disabled: stepErrors(step, ctx.data),\n onClick: () => ctx.setStep(i + 1),\n },\n \"Next \u203A\"\n )\n : null\n )\n )\n );\n}\n", "// app.js \u2014 createApp: the whole framework's entry point.\n//\n// Returns a React component, so an artifact is `export default createApp({\u2026})`\n// with no mounting ceremony.\n//\n// Lifecycle, and deliberately only four stages:\n// hydrate read data + view from storage, merge over declared defaults\n// mount first render already holding real data, so there's no flash\n// run update() -> batched notify -> render, persistence debounced apart\n// error a boundary per block: one broken block shows its error, the rest live\n\nimport { createElement as h, useState, useEffect, hasReact, getReact } from \"react\";\nimport { createAppState } from \"./appState.js\";\nimport { themeCss, seriesColors } from \"./theme.js\";\nimport { BLOCKS, BLOCK_NAMES, FIELD_TYPES } from \"./blocks.js\";\nimport { RecordsLayout, RecordsBlock } from \"./records.js\";\nimport { StepsLayout } from \"./steps.js\";\nimport { ChatLayout, CHAT_KEYS } from \"./chat.js\";\n\nconst LAYOUTS = [\"panel\", \"records\", \"steps\", \"chat\", \"workspace\", \"documents\"];\nconst RESERVED = [\"title\", \"empty\", \"wide\", \"onSelect\", \"subtitle\", \"when\", \"collapsible\", \"fill\"];\n\n// Frontier models still invent identifiers a few percent of the time, so an\n// unknown name has to fail loudly and name the alternatives rather than\n// silently rendering nothing \u2014 a blank pane is indistinguishable from a bug.\nconst TOP_KEYS = [\"title\", \"subtitle\", \"theme\", \"layout\", \"blocks\", \"records\", \"steps\", \"chat\", \"data\", \"shared\", \"main\", \"sidebar\", \"libs\", \"documents\"];\n\nconst DOCUMENTS_KEYS = [\"label\", \"title\", \"blocks\", \"empty\", \"types\"];\nconst RECORDS_KEYS = [\"label\", \"fields\", \"title\", \"subtitle\", \"sort\", \"summary\", \"empty\", \"search\", \"compute\", \"items\", \"actions\"];\nconst ITEMS_KEYS = [\"label\", \"fields\", \"empty\"];\n\n// An unknown field type used to fall through silently to a text input \u2014 the\n// exact quiet degradation the framework exists to prevent (a blind-tested\n// Haiku wrote \"checkbox\" for \"check\" and shipped a text field).\nfunction checkFields(fields, where) {\n for (const f of fields || []) {\n if (!f || !f.key) throw new Error(`claude-artifact-framework: every field in ${where} needs a \\`key\\`.`);\n if (f.type !== undefined && !FIELD_TYPES.includes(f.type)) {\n throw new Error(\n `claude-artifact-framework: field \"${f.key}\" in ${where} has unknown type \"${f.type}\". Valid types: ${FIELD_TYPES.join(\", \")}.`\n );\n }\n if (f.type === \"select\" && f.options !== undefined && !Array.isArray(f.options) && typeof f.options !== \"function\") {\n throw new Error(\n `claude-artifact-framework: field \"${f.key}\" in ${where}: \\`options\\` must be an array or a function of data returning one.`\n );\n }\n }\n}\n\nfunction checkChatConfig(c, where) {\n if (!c || (typeof c.system !== \"string\" && typeof c.system !== \"function\")) {\n throw new Error(\n `claude-artifact-framework: ${where} needs \\`{ system: \"...\" }\\` (a string or a function of data).`\n );\n }\n const unknown = Object.keys(c).filter((k) => !CHAT_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: ${where} has unknown keys (${unknown.join(\", \")}). Valid keys: ${CHAT_KEYS.join(\", \")}.`\n );\n }\n for (const [name, tool] of Object.entries(c.tools || {})) {\n if (!tool || typeof tool.description !== \"string\" || typeof tool.run !== \"function\") {\n throw new Error(\n `claude-artifact-framework: chat tool \"${name}\" needs a \\`description\\` string and a \\`run(input, ctx)\\` function.`\n );\n }\n }\n}\n\nconst ACTION_KEYS = [\"label\", \"run\", \"when\", \"kind\"];\n\nfunction checkActions(actions, where) {\n if (!Array.isArray(actions)) {\n throw new Error(`claude-artifact-framework: ${where} must be an array of { label, run }.`);\n }\n actions.forEach((a, i) => {\n if (!a || typeof a.label !== \"string\" || typeof a.run !== \"function\") {\n throw new Error(`claude-artifact-framework: ${where}[${i}] needs a \\`label\\` string and a \\`run\\` function.`);\n }\n const unknown = Object.keys(a).filter((k) => !ACTION_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: ${where}[${i}] has unknown keys (${unknown.join(\", \")}). Valid keys: ${ACTION_KEYS.join(\", \")}.`\n );\n }\n });\n}\n\nfunction checkBlocks(blocks) {\n if (!Array.isArray(blocks)) {\n throw new Error(\"claude-artifact-framework: `blocks` must be an array.\");\n }\n blocks.forEach((block, i) => {\n if (!block || typeof block !== \"object\") {\n throw new Error(`claude-artifact-framework: blocks[${i}] must be an object like { fields: [...] }.`);\n }\n const keys = Object.keys(block).filter((k) => !RESERVED.includes(k));\n const known = keys.filter((k) => BLOCK_NAMES.includes(k) || k === \"tabs\" || k === \"records\");\n if (known.length === 0) {\n throw new Error(\n `claude-artifact-framework: blocks[${i}] has no recognised block type (found: ${\n keys.join(\", \") || \"nothing\"\n }). Valid block types: ${[...BLOCK_NAMES, \"tabs\", \"records\"].join(\", \")}.`\n );\n }\n if (known.length > 1) {\n throw new Error(\n `claude-artifact-framework: blocks[${i}] declares more than one block type (${known.join(\n \", \"\n )}). Split them into separate entries of \\`blocks\\`.`\n );\n }\n checkFields(block.fields, `blocks[${i}]`);\n if (known[0] === \"actions\") checkActions(block.actions, `blocks[${i}].actions`);\n if (known[0] === \"chat\") checkChatConfig(block.chat, `blocks[${i}].chat`);\n if (known[0] === \"records\") checkRecordsSpec(block.records, `blocks[${i}].records`, true);\n if (known[0] === \"tabs\") {\n const tabs = block.tabs;\n if (!Array.isArray(tabs) || tabs.length === 0) {\n throw new Error(`claude-artifact-framework: blocks[${i}].tabs needs an array of { label, blocks: [...] }.`);\n }\n tabs.forEach((t, j) => {\n if (!t || typeof t.label !== \"string\" || !Array.isArray(t.blocks) || t.blocks.length === 0) {\n throw new Error(`claude-artifact-framework: tabs[${j}] needs a \\`label\\` string and a non-empty \\`blocks\\` array.`);\n }\n if (t.blocks.some((b) => b && b.tabs)) {\n throw new Error(\"claude-artifact-framework: tabs cannot nest inside tabs.\");\n }\n checkBlocks(t.blocks);\n });\n }\n if (block.when !== undefined && typeof block.when !== \"function\") {\n throw new Error(`claude-artifact-framework: blocks[${i}].when must be a function of data returning true/false.`);\n }\n if (block.fill !== undefined && known[0] !== \"custom\") {\n throw new Error(`claude-artifact-framework: \\`fill\\` is only valid on custom blocks \u2014 blocks[${i}] is \"${known[0]}\".`);\n }\n });\n}\n\nfunction validate(spec) {\n const unknownTop = Object.keys(spec).filter((k) => !TOP_KEYS.includes(k));\n if (unknownTop.length) {\n throw new Error(\n `claude-artifact-framework: unknown top-level keys (${unknownTop.join(\", \")}). Valid keys: ${TOP_KEYS.join(\", \")}.`\n );\n }\n if (spec.libs !== undefined) {\n if (!Array.isArray(spec.libs) || spec.libs.some((u) => typeof u !== \"string\" || !/^https?:\\/\\//.test(u))) {\n throw new Error(\"claude-artifact-framework: `libs` must be an array of https:// script URLs.\");\n }\n }\n const layout = spec.layout || \"panel\";\n if (!LAYOUTS.includes(layout)) {\n throw new Error(\n `claude-artifact-framework: unknown layout \"${layout}\". Valid layouts: ${LAYOUTS.join(\", \")}.`\n );\n }\n if (layout === \"steps\") {\n const steps = spec.steps;\n if (!Array.isArray(steps) || steps.length === 0) {\n throw new Error('claude-artifact-framework: layout \"steps\" needs `steps: [...]` with at least one step.');\n }\n const STEP_KEYS = [\"title\", \"text\", \"fields\", \"result\"];\n const seen = new Set();\n steps.forEach((st, i) => {\n if (!st || typeof st !== \"object\") {\n throw new Error(`claude-artifact-framework: steps[${i}] must be an object.`);\n }\n const unknown = Object.keys(st).filter((k) => !STEP_KEYS.includes(k));\n if (unknown.length) {\n throw new Error(\n `claude-artifact-framework: steps[${i}] has unknown keys (${unknown.join(\", \")}). Valid keys: ${STEP_KEYS.join(\", \")}.`\n );\n }\n if (!st.fields && !st.text && !st.result) {\n throw new Error(`claude-artifact-framework: steps[${i}] needs \\`fields\\`, \\`text\\`, or \\`result\\`.`);\n }\n checkFields(st.fields, `steps[${i}]`);\n for (const f of st.fields || []) {\n if (seen.has(f.key)) {\n throw new Error(\n `claude-artifact-framework: field key \"${f.key}\" appears in more than one step \u2014 keys share one data pool and must be unique.`\n );\n }\n seen.add(f.key);\n }\n });\n return layout;\n }\n if (layout === \"chat\") {\n checkChatConfig(spec.chat, \"chat\");\n return layout;\n }\n if (layout === \"workspace\") {\n if (!Array.isArray(spec.main) || spec.main.length === 0) {\n throw new Error(\n 'claude-artifact-framework: layout \"workspace\" needs `main: [...]` (an array of blocks). `sidebar: [...]` is optional.'\n );\n }\n checkBlocks(spec.main);\n if (spec.sidebar !== undefined) {\n if (!Array.isArray(spec.sidebar)) {\n throw new Error(\"claude-artifact-framework: workspace `sidebar` must be an array of blocks.\");\n }\n checkBlocks(spec.sidebar);\n }\n const wsFlat = flattenBlocks([...spec.main, ...(spec.sidebar || [])]);\n const chats = wsFlat.filter((b) => b && b.chat);\n if (chats.length > 1) {\n throw new Error(\n \"claude-artifact-framework: only one chat block per app \u2014 the conversation persists under data.chat and there is exactly one.\"\n );\n }\n checkRecordsBlockKeys(wsFlat);\n return layout;\n }\n if (layout === \"documents\") {\n const d = spec.documents;\n if (!d || typeof d !== \"object\" || (!d.blocks && !d.types)) {\n throw new Error(\n 'claude-artifact-framework: layout \"documents\" needs `documents: { blocks: [...] }` (every document repeats the same blocks) or `documents: { types: {...} }` (each document is one of several kinds).'\n );\n }\n if (d.blocks && d.types) {\n throw new Error(\n \"claude-artifact-framework: documents takes `blocks` (uniform documents) OR `types` (typed documents) \u2014 not both.\"\n );\n }\n const unknownD = Object.keys(d).filter((k) => !DOCUMENTS_KEYS.includes(k));\n if (unknownD.length) {\n throw new Error(\n `claude-artifact-framework: documents has unknown keys (${unknownD.join(\", \")}). Valid keys: ${DOCUMENTS_KEYS.join(\", \")}.`\n );\n }\n if (d.title !== undefined && typeof d.title !== \"function\") {\n throw new Error(\"claude-artifact-framework: documents.title must be a function of the document's data returning the tab label.\");\n }\n // Inside documents both chat and file are PER DOCUMENT: the scoped ctx\n // gives each document its own data.chat and its own ctx.files. One chat\n // block in the declaration = one conversation per document.\n const checkDocBlocks = (blocks, where) => {\n checkBlocks(blocks);\n const flat = flattenBlocks(blocks);\n if (flat.filter((b) => b && b.chat).length > 1) {\n throw new Error(\n `claude-artifact-framework: only one chat block per document (${where}) \u2014 each document's conversation persists under its own data.chat and there is exactly one.`\n );\n }\n checkRecordsBlockKeys(flat);\n };\n if (d.blocks) {\n if (!Array.isArray(d.blocks) || d.blocks.length === 0) {\n throw new Error(\"claude-artifact-framework: documents.blocks must be a non-empty array of blocks.\");\n }\n checkDocBlocks(d.blocks, \"documents.blocks\");\n } else {\n const names = Object.keys(d.types || {});\n if (!names.length) {\n throw new Error(\"claude-artifact-framework: documents.types needs at least one type, e.g. `types: { nota: { blocks: [...] } }`.\");\n }\n for (const name of names) {\n const t = d.types[name];\n const TYPE_KEYS = [\"label\", \"title\", \"blocks\", \"empty\"];\n const unknownT = Object.keys(t || {}).filter((k) => !TYPE_KEYS.includes(k));\n if (unknownT.length) {\n throw new Error(\n `claude-artifact-framework: documents.types.${name} has unknown keys (${unknownT.join(\", \")}). Valid keys: ${TYPE_KEYS.join(\", \")}.`\n );\n }\n if (!t || !Array.isArray(t.blocks) || t.blocks.length === 0) {\n throw new Error(`claude-artifact-framework: documents.types.${name} needs a non-empty \\`blocks\\` array.`);\n }\n if (t.title !== undefined && typeof t.title !== \"function\") {\n throw new Error(`claude-artifact-framework: documents.types.${name}.title must be a function of the document's data.`);\n }\n checkDocBlocks(t.blocks, `documents.types.${name}`);\n }\n }\n return layout;\n }\n if (layout === \"records\") {\n checkRecordsSpec(spec.records, \"records\", false);\n if (spec.blocks) {\n checkBlocks(spec.blocks);\n if (flattenBlocks(spec.blocks).some((b) => b && b.records)) {\n throw new Error(\n 'claude-artifact-framework: a records BLOCK below a records LAYOUT is ambiguous \u2014 the layout already owns the collection. Use panel/workspace/documents to embed records blocks.'\n );\n }\n }\n return layout;\n }\n checkBlocks(spec.blocks || []);\n checkRecordsBlockKeys(flattenBlocks(spec.blocks || []));\n return layout;\n}\n\n// The records declaration is validated identically as a layout and as a\n// block; only the block form takes `key` (where the collection lives in the\n// enclosing pool \u2014 required for two collections to coexist).\nfunction checkRecordsSpec(r, where, allowKey) {\n if (!r || !Array.isArray(r.fields) || r.fields.length === 0) {\n throw new Error(\n `claude-artifact-framework: ${where} needs \\`records: { fields: [...] }\\` \u2014 the same field declarations the fields block uses.`\n );\n }\n const valid = allowKey ? [...RECORDS_KEYS, \"key\"] : RECORDS_KEYS;\n const unknownR = Object.keys(r).filter((k) => !valid.includes(k));\n if (unknownR.length) {\n throw new Error(\n `claude-artifact-framework: ${where} has unknown keys (${unknownR.join(\", \")}). Valid keys: ${valid.join(\", \")}.`\n );\n }\n if (allowKey && r.key !== undefined && (typeof r.key !== \"string\" || !r.key)) {\n throw new Error(`claude-artifact-framework: ${where}.key must be a non-empty string naming the collection in data.`);\n }\n checkFields(r.fields, where);\n if (r.fields.some((f) => f.type === \"file\") || (r.items && r.items.fields.some((f) => f.type === \"file\"))) {\n throw new Error(\n 'claude-artifact-framework: `file` fields live in the flat data pool (panel blocks or steps) \u2014 they are not supported inside records or items.'\n );\n }\n const seen = new Set();\n for (const f of r.fields) {\n if (f.key === \"id\") throw new Error('claude-artifact-framework: \"id\" is reserved on records \u2014 the framework assigns it.');\n if (seen.has(f.key)) throw new Error(`claude-artifact-framework: duplicate ${where} field key \"${f.key}\".`);\n seen.add(f.key);\n }\n if (r.actions) checkActions(r.actions, `${where}.actions`);\n if (r.items) {\n const unknownI = Object.keys(r.items).filter((k) => !ITEMS_KEYS.includes(k));\n if (unknownI.length) {\n throw new Error(\n `claude-artifact-framework: ${where}.items has unknown keys (${unknownI.join(\", \")}). Valid keys: ${ITEMS_KEYS.join(\", \")}.`\n );\n }\n if (!Array.isArray(r.items.fields) || r.items.fields.length === 0) {\n throw new Error(`claude-artifact-framework: ${where}.items needs \\`fields: [...]\\` \u2014 the same field declarations as everywhere else.`);\n }\n checkFields(r.items.fields, `${where}.items`);\n for (const f of r.items.fields) {\n if (f.key === \"id\") throw new Error('claude-artifact-framework: \"id\" is reserved on items \u2014 the framework assigns it.');\n }\n if (seen.has(\"items\") || r.fields.some((f) => f.key === \"items\")) {\n throw new Error(`claude-artifact-framework: a ${where} field cannot be named \"items\" when \\`items\\` is declared \u2014 that key holds the child collection.`);\n }\n }\n for (const [key, c] of Object.entries(r.compute || {})) {\n if (seen.has(key) || key === \"id\" || (r.items && key === \"items\")) {\n throw new Error(\n `claude-artifact-framework: compute key \"${key}\" collides with a field key \u2014 computed values are derived, never stored.`\n );\n }\n if (typeof c !== \"function\" && typeof (c && c.value) !== \"function\") {\n throw new Error(\n `claude-artifact-framework: compute \"${key}\" must be a function of the record, or { label, format, value: (r) => ... }.`\n );\n }\n }\n}\n\n// Two records blocks writing the same collection would silently fight.\nfunction checkRecordsBlockKeys(flatBlocks) {\n const seen = new Set();\n for (const b of flatBlocks) {\n if (!b || !b.records) continue;\n const k = b.records.key || \"records\";\n if (seen.has(k)) {\n throw new Error(\n `claude-artifact-framework: two records blocks share the collection key \"${k}\" \u2014 give each a distinct \\`key\\`.`\n );\n }\n seen.add(k);\n }\n}\n\n// Fields declare their own initial value, so the data shape is derived from\n// the declaration instead of being restated in a separate object. That removes\n// the key as an invention point: it is written exactly once.\n// Tabs hold blocks of their own, so every scan over \"all blocks\" (field\n// defaults, chat detection) has to see through them.\nfunction flattenBlocks(blocks) {\n const out = [];\n for (const b of blocks || []) {\n out.push(b);\n if (b && Array.isArray(b.tabs)) for (const t of b.tabs) out.push(...flattenBlocks(t.blocks));\n }\n return out;\n}\n\nfunction defaultsFrom(spec) {\n const data = { ...(spec.data || {}) };\n if ((spec.layout || \"panel\") === \"records\" && !Array.isArray(data.records)) {\n data.records = [];\n }\n if ((spec.layout || \"panel\") === \"documents\" && !Array.isArray(data.docs)) {\n data.docs = [];\n }\n const allBlocks = flattenBlocks([...(spec.blocks || []), ...(spec.main || []), ...(spec.sidebar || [])]);\n const hasChat = (spec.layout || \"panel\") === \"chat\" || allBlocks.some((b) => b && b.chat);\n if (hasChat && !data.chat) {\n data.chat = { api: [], log: [] };\n }\n for (const block of [...allBlocks, ...(spec.steps || [])]) {\n for (const field of block.fields || []) {\n if (field && field.key !== undefined && !(field.key in data)) {\n data[field.key] = field.value !== undefined ? field.value : field.type === \"check\" ? false : \"\";\n }\n }\n }\n for (const b of allBlocks) {\n if (b && b.records) {\n const k = b.records.key || \"records\";\n if (!Array.isArray(data[k])) data[k] = [];\n }\n }\n return data;\n}\n\n// Built on first use, not at module scope: `extends React.Component` needs a\n// real React, and at load time the host may not have handed one over yet.\nlet BlockBoundary = null;\n\nfunction boundary(React) {\n if (!BlockBoundary) {\n BlockBoundary = class extends React.Component {\n constructor(props) {\n super(props);\n this.state = { error: null };\n }\n static getDerivedStateFromError(error) {\n return { error };\n }\n render() {\n if (this.state.error) {\n return h(\n \"div\",\n { className: \"caf-block caf-block-error\" },\n h(\"strong\", null, \"This section failed to render\"),\n h(\"code\", null, String(this.state.error.message || this.state.error))\n );\n }\n return this.props.children;\n }\n };\n }\n return BlockBoundary;\n}\n\n// Tabs are defined here (not blocks.js) because they render other blocks \u2014\n// keeping the recursion in one file avoids an import cycle.\nfunction TabsBlock({ spec, ctx }) {\n const tabs = spec.tabs;\n const key = tabs.map((t) => t.label).join(\"|\");\n const stored = ctx.view.tabs ? ctx.view.tabs[key] : undefined;\n const active = Math.min(stored === undefined ? 0 : stored, tabs.length - 1);\n return h(\n \"div\",\n { className: \"caf-tabs\" },\n h(\n \"div\",\n { className: \"caf-tabbar\", role: \"tablist\" },\n tabs.map((t, i) =>\n h(\n \"button\",\n {\n key: t.label,\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": i === active,\n className: i === active ? \"caf-tab caf-tab-active\" : \"caf-tab\",\n onClick: () => ctx.setTab(key, i),\n },\n t.label\n )\n )\n ),\n h(\n \"div\",\n { className: \"caf-tabs-body\" },\n tabs[active].blocks.map((b, i) => h(Block, { key: active + \":\" + i, block: b, ctx }))\n )\n );\n}\n\nconst ALL_BLOCKS = { ...BLOCKS, tabs: TabsBlock, records: RecordsBlock };\nconst ALL_NAMES = [...BLOCK_NAMES, \"tabs\", \"records\"];\n\nfunction Block({ block, ctx }) {\n // `when` hides a block entirely \u2014 the primitive under conditional UIs.\n if (typeof block.when === \"function\" && !block.when(ctx.data)) return null;\n const name = Object.keys(block).find((k) => ALL_NAMES.includes(k));\n const Component = ALL_BLOCKS[name];\n const inner = h(\n boundary(ctx.React),\n null,\n h(Component, { spec: block.collapsible ? { ...block, title: undefined } : block, ctx })\n );\n if (!block.collapsible) return inner;\n // Collapsed state is framework-owned view state, keyed by the block's title\n // (its stable, human-visible identity), so it survives reload.\n const key = typeof block.title === \"string\" && block.title ? block.title : name;\n const collapsed =\n ctx.view.collapsed && key in ctx.view.collapsed ? ctx.view.collapsed[key] : block.collapsible === \"collapsed\";\n return h(\n \"div\",\n { className: \"caf-collapse\" },\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-collapse-head\",\n \"aria-expanded\": !collapsed,\n onClick: () => ctx.toggleCollapsed(key, !collapsed),\n },\n h(\"span\", null, block.title || name),\n h(\"span\", { className: collapsed ? \"caf-chevron caf-chevron-closed\" : \"caf-chevron\" }, \"\u25BE\")\n ),\n collapsed ? null : h(\"div\", { className: \"caf-collapse-body\" }, inner)\n );\n}\n\nfunction Panel({ spec, ctx }) {\n return h(\n \"div\",\n { className: \"caf-panel\" },\n (spec.blocks || []).map((block, i) =>\n h(\n \"section\",\n // A collapsible is always full-width: half-width accordions leave an\n // orphaned right edge on desktop and change width across breakpoints.\n { key: i, className: block.wide || block.collapsible ? \"caf-slot caf-slot-wide\" : \"caf-slot\" },\n h(Block, { block, ctx })\n )\n )\n );\n}\n\n// Records + extra blocks is a natural combo (a list with a chart of itself\n// below). Blocks render under the list, never under the detail screen, and\n// their functions receive the same data object as everywhere else \u2014 the\n// collection lives at d.records.\nfunction RecordsWithBlocks({ spec, ctx }) {\n const detailOpen =\n ctx.view.screen === \"record\" && (ctx.data.records || []).some((r) => r.id === ctx.view.arg);\n return h(\n \"div\",\n null,\n h(RecordsLayout, { spec, ctx }),\n !detailOpen && Array.isArray(spec.blocks) && spec.blocks.length\n ? h(\n \"div\",\n { className: \"caf-panel caf-records-blocks\" },\n spec.blocks.map((block, i) =>\n h(\n \"section\",\n // A collapsible is always full-width: half-width accordions leave an\n // orphaned right edge on desktop and change width across breakpoints.\n { key: i, className: block.wide || block.collapsible ? \"caf-slot caf-slot-wide\" : \"caf-slot\" },\n h(Block, { block, ctx })\n )\n )\n )\n : null\n );\n}\n\n// The \"content + copilot\" shape: a full-width main column and a sidebar.\n// Stacks vertically on narrow screens (sidebar after main).\nfunction WorkspaceLayout({ spec, ctx }) {\n const render = (blocks) =>\n (blocks || []).map((block, i) => h(\"section\", { key: i, className: \"caf-ws-slot\" }, h(Block, { block, ctx })));\n return h(\n \"div\",\n { className: \"caf-workspace\" },\n h(\"div\", { className: \"caf-ws-main\" }, render(spec.main)),\n spec.sidebar && spec.sidebar.length ? h(\"div\", { className: \"caf-ws-side\" }, render(spec.sidebar)) : null\n );\n}\n\n// documents \u2014 N parallel instances of the same mini-app, one per top tab.\n// Each document owns a full data pool; the blocks are declared once and see\n// ONLY the active document's data through a scoped ctx. Which document is\n// open lives in view state (personal, survives reload); the documents\n// themselves live in data.docs.\nfunction docDefaults(dspec) {\n const data = {};\n for (const block of flattenBlocks(dspec.blocks)) {\n for (const field of block.fields || []) {\n if (field && field.key !== undefined && !(field.key in data)) {\n data[field.key] = field.value !== undefined ? field.value : field.type === \"check\" ? false : \"\";\n }\n }\n if (block.records) {\n const k = block.records.key || \"records\";\n if (!Array.isArray(data[k])) data[k] = [];\n }\n }\n return data;\n}\n\nfunction docId() {\n return \"d\" + Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nconst DOC_TAB_KEY = \"caf:doc\";\n\nfunction docTitle(dspec, data, untitled) {\n if (dspec.title) {\n try {\n const t = dspec.title(data);\n if (t !== undefined && t !== null && t !== \"\") return String(t);\n } catch {\n /* fall through to the default below */\n }\n }\n // Default: the first text-ish field \u2014 same convention records uses. Typed\n // documents fall back to their type label instead of \"(untitled)\".\n for (const block of flattenBlocks(dspec.blocks)) {\n for (const f of block.fields || []) {\n if (!f.type || f.type === \"text\" || f.type === \"textarea\" || f.type === \"select\") {\n const v = data[f.key];\n if (v !== \"\" && v !== undefined && v !== null) return String(v);\n return untitled || \"(untitled)\";\n }\n }\n }\n return untitled || \"(untitled)\";\n}\n\nfunction DocumentsLayout({ spec, ctx }) {\n const dspec = spec.documents;\n const label = dspec.label || \"document\";\n const docs = Array.isArray(ctx.data.docs) ? ctx.data.docs : [];\n // Typed documents: each doc records which kind it is (`doc.type`, on the\n // envelope \u2014 never inside the document's data) and renders ITS type's\n // blocks. Uniform documents are the one-type degenerate case.\n const types = dspec.types || null;\n const typeNames = types ? Object.keys(types) : [];\n const specFor = (doc) => (types ? types[doc.type] : dspec);\n const typeLabel = (name) => (types[name] && types[name].label) || name;\n const [picking, setPicking] = useState(false);\n\n const storedId = ctx.view.tabs ? ctx.view.tabs[DOC_TAB_KEY] : undefined;\n // A deleted or stale id falls back to the first document, never a blank pane.\n const active = docs.find((doc) => doc.id === storedId) || docs[0];\n\n function add(typeName) {\n const tspec = types ? types[typeName] : dspec;\n const doc = { id: docId(), ...(types ? { type: typeName } : {}), data: docDefaults(tspec) };\n ctx.update((d) => {\n d.docs = [...(d.docs || []), doc];\n });\n ctx.setTab(DOC_TAB_KEY, doc.id);\n setPicking(false);\n }\n\n // One type (or uniform) creates directly; several ask which kind first.\n function onAdd() {\n if (!types) return add();\n if (typeNames.length === 1) return add(typeNames[0]);\n setPicking((p) => !p);\n }\n\n function close(id) {\n const idx = docs.findIndex((doc) => doc.id === id);\n ctx.update((d) => {\n d.docs = d.docs.filter((doc) => doc.id !== id);\n });\n delete ctx.files[\"doc:\" + id];\n if (active && active.id === id) {\n const next = docs[idx + 1] || docs[idx - 1];\n if (next) ctx.setTab(DOC_TAB_KEY, next.id);\n }\n }\n\n const typePicker = types && picking\n ? h(\n \"div\",\n { className: \"caf-doc-typemenu\" },\n typeNames.map((name) =>\n h(\"button\", { key: name, type: \"button\", className: \"caf-btn caf-btn-sm\", onClick: () => add(name) }, typeLabel(name))\n )\n )\n : null;\n\n if (!active) {\n return h(\n \"div\",\n { className: \"caf-panel caf-panel-single\" },\n h(\n \"div\",\n { className: \"caf-block caf-empty\" },\n h(\"p\", null, dspec.empty || `No ${label}s yet. Create the first one.`),\n types\n ? h(\n \"div\",\n { className: \"caf-doc-typemenu\" },\n typeNames.map((name) =>\n h(\"button\", { key: name, type: \"button\", className: \"caf-btn caf-btn-primary\", onClick: () => add(name) }, `New ${typeLabel(name)}`)\n )\n )\n : h(\"button\", { type: \"button\", className: \"caf-btn caf-btn-primary\", onClick: () => add() }, `New ${label}`)\n )\n );\n }\n\n const aspec = specFor(active);\n // A document whose type was removed from the spec: loud, named, contained \u2014\n // the tab (and its \u2715) stays usable, the pane explains instead of crashing.\n if (!aspec) {\n return h(\n \"div\",\n { className: \"caf-documents\" },\n h(DocTabbar, { docs, active, dspec, types, close, onAdd, label, ctx }),\n typePicker,\n h(\n \"div\",\n { className: \"caf-block caf-block-error\" },\n h(\"strong\", null, `This ${label}'s type \"${active.type}\" no longer exists`),\n h(\"code\", null, `valid types: ${typeNames.join(\", \")}`)\n )\n );\n }\n const defaults = docDefaults(aspec);\n\n // Stored data merges over declared defaults, so a field added in a later\n // edit of the spec falls through to its default on older documents (B3).\n const activeData = { ...defaults, ...active.data };\n const scoped = {\n ...ctx,\n data: activeData,\n update: (fn) =>\n ctx.update((d) => {\n const doc = (d.docs || []).find((x) => x.id === active.id);\n if (doc) fn(doc.data);\n }),\n // Live File objects scoped per document: each doc gets its own sub-map,\n // so two documents with the same file field never collide. Like the flat\n // pool, the File itself is memory-only \u2014 metadata survives reload, the\n // file is re-picked per document.\n files: (ctx.files[\"doc:\" + active.id] = ctx.files[\"doc:\" + active.id] || {}),\n };\n\n return h(\n \"div\",\n { className: \"caf-documents\" },\n h(DocTabbar, { docs, active, dspec, types, close, onAdd, label, ctx }),\n typePicker,\n h(Panel, { spec: { blocks: aspec.blocks }, ctx: scoped })\n );\n}\n\nfunction DocTabbar({ docs, active, dspec, types, close, onAdd, label, ctx }) {\n const tabTitle = (doc) => {\n const tspec = types ? types[doc.type] : dspec;\n if (!tspec) return doc.type; // removed type: the name is the best label left\n const merged = { ...docDefaults(tspec), ...doc.data };\n const fallback = types ? (tspec.label || doc.type) : undefined;\n return docTitle(tspec, merged, fallback);\n };\n return h(\n \"div\",\n { className: \"caf-tabbar\", role: \"tablist\" },\n docs.map((doc) =>\n h(\n \"span\",\n { key: doc.id, className: \"caf-doc-tab\" },\n h(\n \"button\",\n {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": doc.id === active.id,\n className: doc.id === active.id ? \"caf-tab caf-tab-active\" : \"caf-tab\",\n onClick: () => ctx.setTab(DOC_TAB_KEY, doc.id),\n },\n tabTitle(doc)\n ),\n h(\n \"button\",\n {\n type: \"button\",\n className: \"caf-doc-close\",\n \"aria-label\": `Close ${label}`,\n onClick: () => close(doc.id),\n },\n \"\u2715\"\n )\n )\n ),\n h(\"button\", { type: \"button\", className: \"caf-tab caf-doc-add\", \"aria-label\": `New ${label}`, onClick: onAdd }, \"+\")\n );\n}\n\nconst LAYOUT_COMPONENTS = { panel: Panel, records: RecordsWithBlocks, steps: StepsLayout, chat: ChatLayout, workspace: WorkspaceLayout, documents: DocumentsLayout };\n\n// Deduped by src: two apps (or re-mounts) asking for the same lib share one\n// tag, mirroring how the PDF annotator loads pdf.js by hand.\nfunction loadScript(src) {\n return new Promise((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${src}\"]`);\n if (existing) {\n if (existing.dataset.cafReady === \"1\") return resolve();\n existing.addEventListener(\"load\", resolve);\n existing.addEventListener(\"error\", () => reject(new Error(`failed to load ${src}`)));\n return;\n }\n const tag = document.createElement(\"script\");\n tag.src = src;\n tag.onload = () => { tag.dataset.cafReady = \"1\"; resolve(); };\n tag.onerror = () => {\n // Models guess file paths inside packages and get them wrong more often\n // than they get versions wrong (measured: marked@13's UMD lives at\n // lib/marked.umd.js, not the root the model wrote). jsDelivr serves a\n // package's default build at the bare npm/<pkg>@<version> URL, so one\n // retry there absorbs the whole failure class.\n const m = src.match(/^(https:\\/\\/cdn\\.jsdelivr\\.net\\/npm\\/(?:@[^/]+\\/)?[^/]+)\\/.+/);\n if (m && m[1] !== src) {\n loadScript(m[1]).then(resolve, () => reject(new Error(`failed to load ${src} (also tried package default ${m[1]})`)));\n } else {\n reject(new Error(`failed to load ${src}`));\n }\n };\n document.head.appendChild(tag);\n });\n}\n\nexport function createApp(spec = {}) {\n const layout = validate(spec);\n const state = createAppState(defaultsFrom(spec), { shared: Boolean(spec.shared) });\n const css = themeCss(spec.theme && spec.theme.seed) + BASE_CSS;\n // Live File objects picked by `file` fields \u2014 in memory only, never persisted.\n const files = {};\n\n return function App() {\n if (!hasReact()) {\n throw new Error(\n \"claude-artifact-framework: React not found. Hand it over once, before rendering:\\n\\n\" +\n ' import React from \"react\";\\n' +\n \" ArtifactKit.useReact(React);\\n\"\n );\n }\n const [, force] = useState(0);\n const [libsState, setLibsState] = useState(spec.libs && spec.libs.length ? \"loading\" : \"ready\");\n const [libsError, setLibsError] = useState(null);\n useEffect(() => {\n if (!spec.libs || !spec.libs.length) return;\n Promise.all(spec.libs.map(loadScript)).then(\n () => setLibsState(\"ready\"),\n (e) => { setLibsError(String((e && e.message) || e)); setLibsState(\"error\"); }\n );\n }, []);\n useEffect(() => {\n const unsubscribe = state.subscribe(() => force((n) => n + 1));\n // Hydration can finish before this effect runs \u2014 its notify() then lands\n // on zero listeners and nothing ever re-renders. Re-check on subscribe,\n // so a mount that raced hydration still leaves the loading screen.\n if (state.isHydrated()) force((n) => n + 1);\n return unsubscribe;\n }, []);\n\n const ctx = {\n React: getReact(),\n data: state.getData(),\n view: state.getView(),\n update: state.update,\n go: state.go,\n back: state.back,\n setStep: (n) => state.setView({ step: n }),\n files,\n viewerId: state.getViewerId(),\n setTab: (key, i) => state.setView({ tabs: { ...state.getView().tabs, [key]: i } }),\n toggleCollapsed: (key, val) => state.setView({ collapsed: { ...state.getView().collapsed, [key]: val } }),\n colors: (n) => seriesColors(spec.theme && spec.theme.seed, n),\n };\n\n const Layout = LAYOUT_COMPONENTS[layout];\n\n return h(\n \"div\",\n // The layout class lets shared CSS follow the active container width \u2014\n // e.g. the header must share the workspace's wider axis, not panel's.\n { className: `caf-root caf-layout-${layout}` },\n h(\"style\", { dangerouslySetInnerHTML: { __html: css } }),\n h(\n \"header\",\n { className: \"caf-header\" },\n spec.title ? h(\"h1\", null, spec.title) : null,\n spec.subtitle ? h(\"p\", null, spec.subtitle) : null\n ),\n libsState === \"error\"\n ? h(\n \"div\",\n { className: \"caf-block caf-block-error\" },\n h(\"strong\", null, \"A library failed to load\"),\n h(\"code\", null, libsError)\n )\n : !state.isHydrated() || libsState === \"loading\"\n ? h(\"div\", { className: \"caf-block caf-loading\" }, libsState === \"loading\" ? \"Loading libraries\u2026\" : \"Loading\u2026\")\n : h(Layout, { spec, ctx })\n );\n };\n}\n\nconst BASE_CSS = `\n.caf-root {\n --caf-radius: 10px;\n --caf-control-radius: 7px; /* one radius for every control: buttons, inputs, rows */\n --caf-btn-pad-y: 0.45rem;\n --caf-btn-pad-x: 0.8rem;\n --caf-num-primary: 2.1rem; /* the one size for a block's dominant number */\n box-sizing: border-box;\n min-height: 100vh;\n padding: 2rem 1.25rem 4rem;\n background: var(--caf-bg);\n color: var(--caf-text);\n font-family: -apple-system, \"Segoe UI\", \"Helvetica Neue\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n}\n.caf-root *, .caf-root *::before, .caf-root *::after { box-sizing: inherit; }\n.caf-header { max-width: 760px; margin: 0 auto 1.5rem; }\n/* One left axis per screen: the header adopts the workspace's wider container. */\n.caf-layout-workspace .caf-header { max-width: 1200px; }\n.caf-header h1 { margin: 0; font-size: 1.5rem; font-weight: 650; letter-spacing: -0.01em; text-wrap: balance; }\n.caf-header p { margin: 0.4rem 0 0; color: var(--caf-muted); font-size: 0.95rem; line-height: 1.5; }\n/* Between-card air must beat within-card padding (1.1rem), or groups dissolve. */\n.caf-panel { max-width: 760px; margin: 0 auto; display: grid; grid-template-columns: 1fr 1fr; gap: 1.75rem 1rem; }\n.caf-slot { grid-column: span 2; min-width: 0; }\n@media (min-width: 720px) { .caf-slot { grid-column: span 1; } .caf-slot-wide { grid-column: span 2; } }\n.caf-block {\n background: var(--caf-surface);\n border: 1px solid var(--caf-border);\n border-radius: var(--caf-radius);\n padding: 1.1rem;\n display: flex;\n flex-direction: column;\n gap: 0.8rem;\n height: 100%;\n}\n.caf-block-title { margin: 0; font-size: 0.78rem; font-weight: 650; text-transform: uppercase; letter-spacing: 0.06em; color: var(--caf-muted); }\n.caf-field { display: flex; flex-direction: column; gap: 0.3rem; }\n/* A full size+weight step below .caf-block-title \u2014 the uppercase alone was\n not enough to tell \"card title\" from \"field label\" at a glance. */\n.caf-field label { font-size: 0.68rem; font-weight: 500; color: var(--caf-muted); }\n.caf-field input, .caf-field select, .caf-field textarea {\n font: inherit; font-size: 0.95rem; padding: 0.5rem 0.6rem;\n border-radius: var(--caf-control-radius); border: 1px solid var(--caf-border);\n background: var(--caf-sunken); color: var(--caf-text); width: 100%;\n}\n.caf-field input:focus-visible, .caf-field select:focus-visible, .caf-field textarea:focus-visible,\n.caf-row:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-field input[aria-invalid=\"true\"] { border-color: var(--caf-danger); }\n.caf-check { display: flex; align-items: center; gap: 0.5rem; font-size: 0.9rem; }\n.caf-hint { color: var(--caf-muted); font-size: 0.75rem; }\n.caf-error { color: var(--caf-danger); font-size: 0.75rem; font-weight: 600; }\n.caf-output-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 0.9rem 1.1rem; }\n/* Every stat shares one axis: label above value, both flush left. */\n.caf-stat { display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; }\n.caf-stat-label { color: var(--caf-muted); font-size: 0.78rem; font-weight: 600; letter-spacing: 0.02em; }\n.caf-stat-value { font-size: 1.05rem; font-weight: 650; font-variant-numeric: tabular-nums; }\n.caf-stat-big { grid-column: 1 / -1; }\n/* The divider exists to separate the hero from stats below it \u2014 alone in the\n grid it would be an orphaned rule, so it only renders when followed. */\n.caf-stat-big:not(:last-child) { padding-bottom: 0.5rem; border-bottom: 1px solid var(--caf-border); }\n.caf-stat-big .caf-stat-value { font-size: var(--caf-num-primary); font-weight: 700; letter-spacing: -0.02em; color: var(--caf-accent); line-height: 1.15; }\n.caf-list { padding: 0.4rem; gap: 0; }\n.caf-row {\n font: inherit; text-align: left; cursor: pointer;\n display: flex; flex-direction: column; gap: 0.15rem;\n padding: 0.65rem 0.7rem; border: none; border-radius: var(--caf-control-radius);\n background: transparent; color: inherit; width: 100%;\n}\n.caf-row:hover { background: var(--caf-sunken); }\n.caf-row-title { font-size: 0.92rem; font-weight: 550; }\n.caf-row-sub { font-size: 0.78rem; color: var(--caf-muted); }\n.caf-panel-single { grid-template-columns: 1fr; }\n.caf-panel-single .caf-slot, .caf-panel-single > * { grid-column: span 1; }\n/* Bottom padding matches the inter-row rhythm so the toolbar doesn't sit\n closer to the first row than rows sit to each other. */\n.caf-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; padding: 0.3rem 0.3rem 0.75rem; }\n.caf-count { font-size: 0.8rem; color: var(--caf-muted); font-variant-numeric: tabular-nums; }\n.caf-btn {\n font: inherit; font-size: 0.85rem; font-weight: 600; cursor: pointer;\n padding: var(--caf-btn-pad-y) var(--caf-btn-pad-x); border-radius: var(--caf-control-radius);\n border: 1px solid var(--caf-border); background: var(--caf-surface); color: var(--caf-text);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n}\n.caf-btn:hover { filter: brightness(0.97); }\n.caf-btn:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-btn-primary { background: var(--caf-accent); border-color: var(--caf-accent); color: var(--caf-accentText); }\n.caf-btn-danger { background: transparent; border-color: var(--caf-danger); color: var(--caf-danger); }\n.caf-bars { display: flex; flex-direction: column; gap: 0.55rem; }\n.caf-bar-row { display: grid; grid-template-columns: minmax(60px, 30%) 1fr auto; align-items: center; gap: 0.6rem; }\n.caf-bar-label { font-size: 0.82rem; color: var(--caf-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.caf-bar-track { height: 8px; border-radius: 4px; background: var(--caf-sunken); overflow: hidden; }\n.caf-bar-fill { height: 100%; border-radius: 4px; background: var(--caf-accent); }\n.caf-bar-value { font-size: 0.82rem; font-weight: 600; font-variant-numeric: tabular-nums; }\n.caf-line-svg { width: 100%; height: 110px; display: block; }\n.caf-line-grid { stroke: var(--caf-border); stroke-width: 0.3; }\n.caf-line-path { fill: none; stroke: var(--caf-accent); stroke-width: 1.1; stroke-linejoin: round; stroke-linecap: round; }\n.caf-line-dot { fill: var(--caf-accent); }\n.caf-line-meta { display: flex; justify-content: space-between; align-items: baseline; gap: 0.6rem; }\n.caf-line-last { font-weight: 650; font-variant-numeric: tabular-nums; color: var(--caf-accent); }\n.caf-donut { display: flex; align-items: center; gap: 1.1rem; flex-wrap: wrap; }\n/* -3px optical correction: a circle beside flush-left text reads indented. */\n.caf-donut-svg { width: 110px; height: 110px; flex: none; transform: rotate(0.001deg); margin-left: -3px; }\n.caf-donut-seg { fill: none; stroke-width: 6; }\n/* Capped width keeps each value NEXT TO its label in wide cards \u2014 the pair\n must read as a pair regardless of container width. */\n.caf-donut-legend { display: flex; flex-direction: column; gap: 0.4rem; min-width: 0; flex: 1; max-width: 260px; }\n.caf-legend-row { display: flex; align-items: center; gap: 0.5rem; font-size: 0.84rem; }\n.caf-legend-swatch { width: 10px; height: 10px; border-radius: 3px; flex: none; }\n.caf-legend-label { color: var(--caf-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.caf-legend-value { margin-left: auto; font-weight: 600; font-variant-numeric: tabular-nums; }\n.caf-timer { align-items: center; text-align: center; }\n.caf-timer .caf-bar-track { width: 100%; }\n.caf-timer-time { font-size: var(--caf-num-primary); font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: -0.02em; color: var(--caf-accent); }\n.caf-timer-done { color: var(--caf-accent); }\n.caf-timer-fill { transition: width 0.9s linear; }\n.caf-timer-controls { display: flex; gap: 0.6rem; }\n.caf-btn:disabled { opacity: 0.45; cursor: not-allowed; }\n.caf-steps-progress { display: flex; flex-direction: column; gap: 0.35rem; margin-bottom: 0.2rem; }\n.caf-steps-fill { transition: width 0.25s ease; }\n.caf-step-text { margin: 0; color: var(--caf-muted); font-size: 0.92rem; line-height: 1.55; }\n.caf-step-nav { display: flex; justify-content: space-between; gap: 0.6rem; margin-top: 0.4rem; }\n.caf-chat-log { min-height: 320px; max-height: 62vh; overflow-y: auto; gap: 0.55rem; }\n.caf-msg { max-width: 85%; padding: 0.55rem 0.75rem; border-radius: 12px; font-size: 0.92rem; line-height: 1.5; white-space: pre-wrap; word-break: break-word; }\n.caf-msg-user { align-self: flex-end; background: var(--caf-accent); color: var(--caf-accentText); border-bottom-right-radius: 4px; }\n.caf-msg-assistant { align-self: flex-start; background: var(--caf-sunken); border-bottom-left-radius: 4px; }\n.caf-msg-live::after { content: \"\u258D\"; opacity: 0.6; }\n.caf-msg-tools { align-self: flex-start; font-size: 0.74rem; color: var(--caf-muted); padding: 0.15rem 0.55rem; border: 1px solid var(--caf-border); border-radius: 999px; }\n.caf-msg-error { align-self: stretch; max-width: none; display: flex; flex-direction: column; gap: 0.2rem; background: transparent; border: 1px solid var(--caf-danger); }\n.caf-msg-error strong { color: var(--caf-danger); font-size: 0.85rem; }\n.caf-chat-input {\n display: flex; gap: 0.6rem; margin-top: 1rem; padding: 0.6rem;\n background: var(--caf-surface); border: 1px solid var(--caf-border); border-radius: var(--caf-radius);\n}\n.caf-chat-input input { flex: 1; font: inherit; font-size: 0.95rem; padding: 0.55rem 0.7rem; border-radius: var(--caf-control-radius); border: 1px solid var(--caf-border); background: var(--caf-sunken); color: var(--caf-text); }\n.caf-chat-input input:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-search {\n font: inherit; font-size: 0.9rem; width: 100%;\n padding: 0.5rem 0.65rem; margin: 0 0 0.3rem;\n border-radius: 7px; border: 1px solid var(--caf-border);\n background: var(--caf-sunken); color: var(--caf-text);\n}\n.caf-search:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n.caf-computed { border-top: 1px solid var(--caf-border); padding-top: 0.7rem; }\n.caf-records-blocks { margin-top: 1rem; }\n.caf-row-wrap { display: flex; align-items: center; gap: 0.4rem; }\n.caf-row-wrap .caf-row { flex: 1; min-width: 0; }\n.caf-row-actions { display: flex; gap: 0.35rem; flex: none; padding-right: 0.3rem; }\n.caf-btn-sm { font-size: 0.78rem; padding: calc(var(--caf-btn-pad-y) * 0.67) calc(var(--caf-btn-pad-x) * 0.75); }\n.caf-items { display: flex; flex-direction: column; gap: 0.5rem; border-top: 1px solid var(--caf-border); padding-top: 0.7rem; }\n.caf-item-row { display: flex; align-items: flex-end; gap: 0.5rem; }\n.caf-item-row .caf-field { flex: 1; min-width: 0; }\n.caf-item-row .caf-field label { font-size: 0.68rem; }\n.caf-item-remove { flex: none; margin-bottom: 0.15rem; }\n.caf-empty-sm { padding: 0.6rem; font-size: 0.82rem; }\n.caf-actions-row { display: flex; flex-wrap: wrap; gap: 0.6rem; }\n.caf-code { background: var(--caf-sunken); border-radius: 6px; padding: 0.55rem 0.7rem; font-size: 0.8rem; overflow-x: auto; margin: 0.3rem 0; font-family: ui-monospace, monospace; }\n.caf-msg code { background: color-mix(in srgb, currentColor 12%, transparent); border-radius: 4px; padding: 0.05rem 0.3rem; font-size: 0.85em; font-family: ui-monospace, monospace; }\n.caf-md-h { display: block; margin-top: 0.3rem; }\n.caf-md-li { display: block; padding-left: 1rem; position: relative; }\n.caf-md-li::before { content: \"\u2022\"; position: absolute; left: 0.2rem; opacity: 0.6; }\n.caf-workspace { max-width: 1200px; margin: 0 auto; display: flex; gap: 1rem; align-items: flex-start; }\n.caf-ws-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1rem; }\n.caf-ws-side { width: 340px; flex: none; display: flex; flex-direction: column; gap: 1rem; position: sticky; top: 1rem; }\n.caf-ws-slot { min-width: 0; }\n.caf-chat-panel { display: flex; flex-direction: column; min-height: 0; }\n.caf-ws-side .caf-chat-log { max-height: calc(100vh - 220px); }\n@media (max-width: 900px) {\n .caf-workspace { flex-direction: column; align-items: stretch; }\n .caf-ws-side { width: 100%; position: static; }\n}\n.caf-tabs { display: flex; flex-direction: column; gap: 0.8rem; min-width: 0; }\n.caf-tabbar { display: flex; gap: 0.2rem; border-bottom: 1px solid var(--caf-border); overflow-x: auto; }\n.caf-tab {\n font: inherit; font-size: 0.85rem; font-weight: 600; cursor: pointer;\n padding: 0.45rem 0.8rem; border: none; background: none; color: var(--caf-muted);\n border-bottom: 2px solid transparent; margin-bottom: -1px; white-space: nowrap;\n}\n.caf-tab:hover { color: var(--caf-text); }\n.caf-tab:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: -2px; }\n/* :hover on the active tab must not win the specificity race and mute it. */\n.caf-tab-active, .caf-tab-active:hover { color: var(--caf-accent); border-bottom-color: var(--caf-accent); }\n.caf-tabs-body { display: flex; flex-direction: column; gap: 0.8rem; }\n.caf-collapse { display: flex; flex-direction: column; gap: 0.5rem; min-width: 0; }\n.caf-collapse-head {\n /* Same treatment as .caf-block-title: a collapsible header IS a card title. */\n font: inherit; font-size: 0.78rem; font-weight: 650; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--caf-muted); cursor: pointer;\n display: flex; align-items: center; justify-content: space-between; gap: 0.6rem;\n padding: 0.7rem 1.1rem; border: 1px solid var(--caf-border); border-radius: var(--caf-radius);\n background: var(--caf-surface); width: 100%; text-align: left;\n}\n.caf-collapse-head { box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); }\n.caf-collapse-head:hover { filter: brightness(0.97); }\n.caf-collapse-head:focus-visible { outline: 2px solid var(--caf-accent); outline-offset: 1px; }\n/* Accent chevron: the one interaction cue that distinguishes a collapsible\n header from a static card title without breaking their shared typography. */\n.caf-chevron { transition: transform 0.15s ease; color: var(--caf-accent); }\n.caf-documents { max-width: 760px; margin: 0 auto; display: flex; flex-direction: column; gap: 1rem; }\n.caf-doc-tab { display: inline-flex; align-items: center; }\n.caf-doc-tab .caf-tab { padding-right: 0.35rem; max-width: 180px; overflow: hidden; text-overflow: ellipsis; }\n.caf-doc-close {\n font: inherit; font-size: 0.7rem; cursor: pointer; border: none; background: none;\n color: var(--caf-muted); padding: 0.2rem 0.45rem 0.2rem 0.1rem; line-height: 1;\n}\n.caf-doc-close:hover { color: var(--caf-danger); }\n.caf-doc-add { font-size: 1rem; font-weight: 650; }\n.caf-empty .caf-btn { margin-top: 0.6rem; }\n.caf-records-block { display: flex; flex-direction: column; gap: 1rem; min-width: 0; }\n.caf-doc-typemenu { display: flex; gap: 0.5rem; flex-wrap: wrap; }\n.caf-chevron-closed { transform: rotate(-90deg); }\n.caf-block-fill { border: none; background: transparent; padding: 0; overflow: auto; min-height: 320px; }\n.caf-empty, .caf-loading { color: var(--caf-muted); font-size: 0.9rem; text-align: center; padding: 1.6rem 1rem; }\n.caf-block-error { border-color: var(--caf-danger); gap: 0.4rem; }\n.caf-block-error strong { font-size: 0.9rem; color: var(--caf-danger); }\n.caf-block-error code { font-size: 0.78rem; color: var(--caf-muted); word-break: break-word; }\n`;\n"],
5
+ "mappings": "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",
6
6
  "names": ["debounce", "rowTitle", "f", "React", "Component"]
7
7
  }