claude-artifact-framework 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,14 @@
1
- var ArtifactKit=(()=>{var q=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ft=Object.getOwnPropertyNames;var dt=Object.prototype.hasOwnProperty;var ut=(e,t)=>{for(var a in t)q(e,a,{get:t[a],enumerable:!0})},mt=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ft(t))!dt.call(e,o)&&o!==a&&q(e,o,{get:()=>t[o],enumerable:!(n=lt(t,o))||n.enumerable});return e};var pt=e=>mt(q({},"__esModule",{value:!0}),e);var oa={};ut(oa,{contrast:()=>ee,createApp:()=>ct,createPersistedStore:()=>be,createSharedStore:()=>ge,createStore:()=>he,hasReact:()=>V,palette:()=>te,storage:()=>S,themeCss:()=>F,useReact:()=>ye});function I(){return typeof window<"u"&&typeof window.storage=="object"&&window.storage!==null}function me(e){return{async get(t,a=void 0){if(!I())return a;try{let n=await window.storage.get(t,e);if(n?.value===void 0||n?.value===null)return a;try{return JSON.parse(n.value)}catch{return n.value}}catch{return a}},async set(t,a,{raw:n=!1}={}){if(!I())throw new Error("window.storage is not available (is this a Code Artifact rather than a published Chat Artifact?)");let o=n?a:JSON.stringify(a);if(typeof o!="string")throw new Error("window.storage only accepts strings \u2014 the value must be JSON-serializable");return window.storage.set(t,o,e)},async delete(t){if(I())try{await window.storage.delete(t,e)}catch{}},async list(t){if(!I())return[];try{return(await window.storage.list(t,e))?.keys||[]}catch{return[]}}}}var S={...me(!1),shared:me(!0),available:I};function X(e){let t=e,a=new Set;function n(){return t}function o(i){t=typeof i=="function"?i(t):i,a.forEach(c=>c(t))}function s(i){return a.add(i),()=>a.delete(i)}return{get:n,set:o,subscribe:s}}function pe(e,t){let a;return(...n)=>{clearTimeout(a),a=setTimeout(()=>e(...n),t)}}function he(e){return X(e)}function be(e,t,{debounceMs:a=300}={}){let n=X(t),o=pe(i=>S.set(e,i),a),s=S.get(e,t).then(i=>n.set(i));return n.subscribe(o),{...n,ready:s}}function ge(e,t,{pollMs:a=2e3,debounceMs:n=300}={}){let o=X(t),s=pe(d=>S.shared.set(e,d),n),i=!1;o.subscribe(d=>{i||s(d)});async function c(){let d=await S.shared.get(e,t);JSON.stringify(d)!==JSON.stringify(o.get())&&(i=!0,o.set(d),i=!1)}let f=c(),l=setInterval(c,a);return{...o,ready:f,stop:()=>clearInterval(l)}}var L=typeof globalThis<"u"?globalThis.React:void 0;function ye(e){return L=e,e}function V(){return!!L}function we(){return M()}function M(){if(!L)throw new Error(`claude-artifact-framework: React not found. Hand it over once, before createApp:
1
+ var ArtifactKit=(()=>{var W=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var mt=Object.prototype.hasOwnProperty;var pt=(e,t)=>{for(var a in t)W(e,a,{get:t[a],enumerable:!0})},bt=(e,t,a,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ut(t))!mt.call(e,o)&&o!==a&&W(e,o,{get:()=>t[o],enumerable:!(n=dt(t,o))||n.enumerable});return e};var ht=e=>bt(W({},"__esModule",{value:!0}),e);var ia={};pt(ia,{contrast:()=>ee,createApp:()=>ft,createPersistedStore:()=>he,createSharedStore:()=>ge,createStore:()=>be,hasReact:()=>V,palette:()=>te,storage:()=>S,themeCss:()=>F,useReact:()=>ye});function I(){return typeof window<"u"&&typeof window.storage=="object"&&window.storage!==null}function me(e){return{async get(t,a=void 0){if(!I())return a;try{let n=await window.storage.get(t,e);if(n?.value===void 0||n?.value===null)return a;try{return JSON.parse(n.value)}catch{return n.value}}catch{return a}},async set(t,a,{raw:n=!1}={}){if(!I())throw new Error("window.storage is not available (is this a Code Artifact rather than a published Chat Artifact?)");let o=n?a:JSON.stringify(a);if(typeof o!="string")throw new Error("window.storage only accepts strings \u2014 the value must be JSON-serializable");return window.storage.set(t,o,e)},async delete(t){if(I())try{await window.storage.delete(t,e)}catch{}},async list(t){if(!I())return[];try{return(await window.storage.list(t,e))?.keys||[]}catch{return[]}}}}var S={...me(!1),shared:me(!0),available:I};function X(e){let t=e,a=new Set;function n(){return t}function o(i){t=typeof i=="function"?i(t):i,a.forEach(c=>c(t))}function s(i){return a.add(i),()=>a.delete(i)}return{get:n,set:o,subscribe:s}}function pe(e,t){let a;return(...n)=>{clearTimeout(a),a=setTimeout(()=>e(...n),t)}}function be(e){return X(e)}function he(e,t,{debounceMs:a=300}={}){let n=X(t),o=pe(i=>S.set(e,i),a),s=S.get(e,t).then(i=>n.set(i));return n.subscribe(o),{...n,ready:s}}function ge(e,t,{pollMs:a=2e3,debounceMs:n=300}={}){let o=X(t),s=pe(d=>S.shared.set(e,d),n),i=!1;o.subscribe(d=>{i||s(d)});async function c(){let d=await S.shared.get(e,t);JSON.stringify(d)!==JSON.stringify(o.get())&&(i=!0,o.set(d),i=!1)}let f=c(),l=setInterval(c,a);return{...o,ready:f,stop:()=>clearInterval(l)}}var L=typeof globalThis<"u"?globalThis.React:void 0;function ye(e){return L=e,e}function V(){return!!L}function we(){return M()}function M(){if(!L)throw new Error(`claude-artifact-framework: React not found. Hand it over once, before createApp:
2
2
 
3
3
  import React from "react";
4
4
  ArtifactKit.useReact(React);
5
- `);return L}var r=(...e)=>M().createElement(...e),j=(...e)=>M().useState(...e),A=(...e)=>M().useEffect(...e);var ke=(...e)=>M().useRef(...e),fa=L&&L.Component||class{render(){return M()}};var G="caf:data",ve="caf:viewer",xe="caf:view",Ne={screen:null,arg:null,stack:[],step:0,selected:null,tabs:{},collapsed:{}};function D(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Q(e,t){if(!D(e)||!D(t))return t===void 0?e:t;let a={...e};for(let n of Object.keys(t))a[n]=D(e[n])?Q(e[n],t[n]):t[n];return a}function $e(e,t){let a;return(...n)=>{clearTimeout(a),a=setTimeout(()=>e(...n),t)}}function Ee(e,{debounceMs:t=400,shared:a=!1,pollMs:n=2500}={}){let o=a?S.shared:S,s=Z(e),i={...Ne},c=!1,f=null,l=0,d=0,u=new Set,p=!1;function w(){p||(p=!0,Promise.resolve().then(()=>{p=!1;for(let b of u)b()}))}let g=$e(()=>{let b=l;Promise.resolve(o.set(G,s)).then(()=>{d=Math.max(d,b)}).catch(()=>{})},t),N=$e(()=>S.set(xe,i),t);a&&setInterval(async()=>{if(!(!c||l>d))try{let b=await o.get(G,void 0);b!==void 0&&JSON.stringify(b)!==JSON.stringify(s)&&(s=Q(e,b),w())}catch{}},n);let m=(async()=>{let[b,k,h]=await Promise.all([o.get(G,void 0),S.get(xe,void 0),S.get(ve,void 0)]);typeof h=="string"&&h?f=h:(f="v"+Math.random().toString(36).slice(2,10)+Math.random().toString(36).slice(2,6),S.set(ve,f).catch?.(()=>{})),b!==void 0&&(s=Q(e,b)),k!==void 0&&(i={...Ne,...k}),c=!0,w()})();function y(b){let k=b(s);k!==void 0&&(s=k),s={...s},l++,g(),w()}function v(b){i={...i,...b},N(),w()}return{ready:m,isHydrated:()=>c,getViewerId:()=>f,getData:()=>s,getView:()=>i,update:y,setView:v,go(b,k){v({stack:[...i.stack,{screen:i.screen,arg:i.arg}],screen:b,arg:k})},back(){let b=i.stack.slice(),k=b.pop()||{screen:null,arg:null};v({stack:b,screen:k.screen,arg:k.arg})},subscribe(b){return u.add(b),()=>u.delete(b)}}}function Z(e){if(Array.isArray(e))return e.map(Z);if(D(e)){let t={};for(let a of Object.keys(e))t[a]=Z(e[a]);return t}return e}function _(e,t,a){return Math.min(a,Math.max(t,e))}function Y(e){let t=String(e).replace("#","").trim();t.length===3&&(t=t.split("").map(n=>n+n).join(""));let a=parseInt(t,16);return Number.isFinite(a)?[a>>16&255,a>>8&255,a&255]:[59,110,246]}function ht(e){return"#"+e.map(t=>_(Math.round(t),0,255).toString(16).padStart(2,"0")).join("")}function je([e,t,a]){e/=255,t/=255,a/=255;let n=Math.max(e,t,a),o=Math.min(e,t,a),s=(n+o)/2,i=n-o,c=0,f=0;return i&&(f=s>.5?i/(2-n-o):i/(n+o),n===e?c=(t-a)/i+(t<a?6:0):n===t?c=(a-e)/i+2:c=(e-t)/i+4,c/=6),[c*360,f*100,s*100]}function bt(e,t,a){if(e=(e%360+360)%360/360,t=_(t,0,100)/100,a=_(a,0,100)/100,!t)return[a*255,a*255,a*255];let n=a<.5?a*(1+t):a+t-a*t,o=2*a-n,s=i=>(i<0&&(i+=1),i>1&&(i-=1),i<1/6?o+(n-o)*6*i:i<1/2?n:i<2/3?o+(n-o)*(2/3-i)*6:o);return[s(e+1/3)*255,s(e)*255,s(e-1/3)*255]}function x(e,t,a){return ht(bt(e,t,a))}function Se(e){let t=e.map(a=>(a/=255,a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)));return .2126*t[0]+.7152*t[1]+.0722*t[2]}function ee(e,t){let a=Se(Y(e)),n=Se(Y(t));return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function R(e,t,a,n,o,s){for(let i=o;i>=4&&i<=96;i+=s){let c=x(e,t,i);if(ee(c,a)>=n)return c}return x(e,t,s<0?24:82)}function te(e="#3b6ef6"){let[t,a]=je(Y(e)),n=_(a,30,88),o=_(n*.1,3,9),s=x(t,o*.4,100),i=x(t,o*1.4,13);return{light:{bg:x(t,o,96.5),surface:s,sunken:x(t,o,93),border:x(t,o,86),text:x(t,o*1.6,11),muted:x(t,o*1.2,41),accent:R(t,n,"#ffffff",4.5,54,-2),accentText:"#ffffff",danger:R(2,68,"#ffffff",4.5,54,-2),ok:R(148,62,"#ffffff",4.5,44,-2),warn:R(38,88,"#ffffff",4.5,44,-2)},dark:{bg:x(t,o*1.5,9),surface:i,sunken:x(t,o*1.5,7),border:x(t,o*1.3,24),text:x(t,o*.6,95),muted:x(t,o*.8,66),accent:R(t,_(n,40,80),i,4.5,62,2),accentText:x(t,o*2,8),danger:R(2,70,i,4.5,62,2),ok:R(148,55,i,4.5,62,2),warn:R(38,80,i,4.5,62,2)}}}function K(e){return Object.entries(e).map(([t,a])=>`--caf-${t}: ${a};`).join("")}function F(e){let t=te(e);return`
5
+ `);return L}var r=(...e)=>M().createElement(...e),$=(...e)=>M().useState(...e),A=(...e)=>M().useEffect(...e);var ke=(...e)=>M().useRef(...e),ua=L&&L.Component||class{render(){return M()}};var G="caf:data",ve="caf:viewer",xe="caf:view",Ne={screen:null,arg:null,stack:[],step:0,selected:null,tabs:{},collapsed:{}};function D(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Q(e,t){if(!D(e)||!D(t))return t===void 0?e:t;let a={...e};for(let n of Object.keys(t))a[n]=D(e[n])?Q(e[n],t[n]):t[n];return a}function $e(e,t){let a;return(...n)=>{clearTimeout(a),a=setTimeout(()=>e(...n),t)}}function Ee(e,{debounceMs:t=400,shared:a=!1,pollMs:n=2500}={}){let o=a?S.shared:S,s=Z(e),i={...Ne},c=!1,f=null,l=0,d=0,p=new Set,h=!1;function k(){h||(h=!0,Promise.resolve().then(()=>{h=!1;for(let u of p)u()}))}let g=$e(()=>{let u=l;Promise.resolve(o.set(G,s)).then(()=>{d=Math.max(d,u)}).catch(()=>{})},t),x=$e(()=>S.set(xe,i),t);a&&setInterval(async()=>{if(!(!c||l>d))try{let u=await o.get(G,void 0);u!==void 0&&JSON.stringify(u)!==JSON.stringify(s)&&(s=Q(e,u),k())}catch{}},n);let y=(async()=>{let[u,w,b]=await Promise.all([o.get(G,void 0),S.get(xe,void 0),S.get(ve,void 0)]);typeof b=="string"&&b?f=b:(f="v"+Math.random().toString(36).slice(2,10)+Math.random().toString(36).slice(2,6),S.set(ve,f).catch?.(()=>{})),u!==void 0&&(s=Q(e,u)),w!==void 0&&(i={...Ne,...w}),c=!0,k()})();function j(u){let w=u(s);w!==void 0&&(s=w),s={...s},l++,g(),k()}function m(u){i={...i,...u},x(),k()}return{ready:y,isHydrated:()=>c,getViewerId:()=>f,getData:()=>s,getView:()=>i,update:j,setView:m,go(u,w){m({stack:[...i.stack,{screen:i.screen,arg:i.arg}],screen:u,arg:w})},back(){let u=i.stack.slice(),w=u.pop()||{screen:null,arg:null};m({stack:u,screen:w.screen,arg:w.arg})},subscribe(u){return p.add(u),()=>p.delete(u)}}}function Z(e){if(Array.isArray(e))return e.map(Z);if(D(e)){let t={};for(let a of Object.keys(e))t[a]=Z(e[a]);return t}return e}function R(e,t,a){return Math.min(a,Math.max(t,e))}function Y(e){let t=String(e).replace("#","").trim();t.length===3&&(t=t.split("").map(n=>n+n).join(""));let a=parseInt(t,16);return Number.isFinite(a)?[a>>16&255,a>>8&255,a&255]:[59,110,246]}function gt(e){return"#"+e.map(t=>R(Math.round(t),0,255).toString(16).padStart(2,"0")).join("")}function je([e,t,a]){e/=255,t/=255,a/=255;let n=Math.max(e,t,a),o=Math.min(e,t,a),s=(n+o)/2,i=n-o,c=0,f=0;return i&&(f=s>.5?i/(2-n-o):i/(n+o),n===e?c=(t-a)/i+(t<a?6:0):n===t?c=(a-e)/i+2:c=(e-t)/i+4,c/=6),[c*360,f*100,s*100]}function yt(e,t,a){if(e=(e%360+360)%360/360,t=R(t,0,100)/100,a=R(a,0,100)/100,!t)return[a*255,a*255,a*255];let n=a<.5?a*(1+t):a+t-a*t,o=2*a-n,s=i=>(i<0&&(i+=1),i>1&&(i-=1),i<1/6?o+(n-o)*6*i:i<1/2?n:i<2/3?o+(n-o)*(2/3-i)*6:o);return[s(e+1/3)*255,s(e)*255,s(e-1/3)*255]}function v(e,t,a){return gt(yt(e,t,a))}function Se(e){let t=e.map(a=>(a/=255,a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4)));return .2126*t[0]+.7152*t[1]+.0722*t[2]}function ee(e,t){let a=Se(Y(e)),n=Se(Y(t));return(Math.max(a,n)+.05)/(Math.min(a,n)+.05)}function _(e,t,a,n,o,s){for(let i=o;i>=4&&i<=96;i+=s){let c=v(e,t,i);if(ee(c,a)>=n)return c}return v(e,t,s<0?24:82)}function te(e="#3b6ef6"){let[t,a]=je(Y(e)),n=R(a,30,88),o=R(n*.1,3,9),s=v(t,o*.4,100),i=v(t,o*1.4,13);return{light:{bg:v(t,o,96.5),surface:s,sunken:v(t,o,93),border:v(t,o,86),text:v(t,o*1.6,11),muted:v(t,o*1.2,41),accent:_(t,n,"#ffffff",4.5,54,-2),accentText:"#ffffff",danger:_(2,68,"#ffffff",4.5,54,-2),ok:_(148,62,"#ffffff",4.5,44,-2),warn:_(38,88,"#ffffff",4.5,44,-2)},dark:{bg:v(t,o*1.5,9),surface:i,sunken:v(t,o*1.5,7),border:v(t,o*1.3,24),text:v(t,o*.6,95),muted:v(t,o*.8,66),accent:_(t,R(n,40,80),i,4.5,62,2),accentText:v(t,o*2,8),danger:_(2,70,i,4.5,62,2),ok:_(148,55,i,4.5,62,2),warn:_(38,80,i,4.5,62,2)}}}function K(e){return Object.entries(e).map(([t,a])=>`--caf-${t}: ${a};`).join("")}function F(e){let t=te(e);return`
6
6
  :root { ${K(t.light)} }
7
7
  @media (prefers-color-scheme: dark) { :root { ${K(t.dark)} } }
8
8
  :root[data-theme="dark"] { ${K(t.dark)} }
9
9
  :root[data-theme="light"] { ${K(t.light)} }
10
- `}function Ae(e,t){let[a,n]=je(Y(e||"#3b6ef6")),o=_(n,45,70);return Array.from({length:t},(s,i)=>x((a+i*137.5)%360,o,52))}var ne=["system","greeting","placeholder","tools","model","maxTokens"],gt="claude-sonnet-4-6",yt=8;async function wt({model:e,maxTokens:t,system:a,messages:n,onText:o}){let s=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e,max_tokens:t,system:a,messages:n,stream:!0})});if(!s.ok||!s.body){let d="";try{let u=await s.json();d=u&&u.error&&u.error.message||JSON.stringify(u)}catch{d=await s.text().catch(()=>"")}throw new Error(`HTTP ${s.status}${d?": "+d:""}`)}let i=s.body.getReader(),c=new TextDecoder,f="",l="";for(;;){let{done:d,value:u}=await i.read();if(d)break;l+=c.decode(u,{stream:!0});let p=l.split(`
11
- `);l=p.pop();for(let w of p)if(w.startsWith("data: "))try{let g=JSON.parse(w.slice(6));g.type==="content_block_delta"&&g.delta&&g.delta.text&&(f+=g.delta.text,o&&o(f))}catch{}}return f}function kt(e){let t=e.match(/```tool_call\s*\n?([\s\S]*?)```/);if(!t)return null;try{let a=JSON.parse(t[1]);return Array.isArray(a)&&a.length?a:null}catch{return null}}function Ce(e){return e.replace(/```tool_call\s*\n?[\s\S]*?```/,"").trim()}function vt(e){return`
10
+ `}function Ae(e,t){let[a,n]=je(Y(e||"#3b6ef6")),o=R(n,45,70);return Array.from({length:t},(s,i)=>v((a+i*137.5)%360,o,52))}var ne=["system","greeting","placeholder","tools","model","maxTokens"],wt="claude-sonnet-4-6",kt=8;async function vt({model:e,maxTokens:t,system:a,messages:n,onText:o}){let s=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e,max_tokens:t,system:a,messages:n,stream:!0})});if(!s.ok||!s.body){let d="";try{let p=await s.json();d=p&&p.error&&p.error.message||JSON.stringify(p)}catch{d=await s.text().catch(()=>"")}throw new Error(`HTTP ${s.status}${d?": "+d:""}`)}let i=s.body.getReader(),c=new TextDecoder,f="",l="";for(;;){let{done:d,value:p}=await i.read();if(d)break;l+=c.decode(p,{stream:!0});let h=l.split(`
11
+ `);l=h.pop();for(let k of h)if(k.startsWith("data: "))try{let g=JSON.parse(k.slice(6));g.type==="content_block_delta"&&g.delta&&g.delta.text&&(f+=g.delta.text,o&&o(f))}catch{}}return f}function xt(e){let t=e.match(/```tool_call\s*\n?([\s\S]*?)```/);if(!t)return null;try{let a=JSON.parse(t[1]);return Array.isArray(a)&&a.length?a:null}catch{return null}}function Te(e){return e.replace(/```tool_call\s*\n?[\s\S]*?```/,"").trim()}function Nt(e){return`
12
12
 
13
13
  You have tools available:
14
14
  ${Object.entries(e).map(([a,n])=>`- ${a}: ${n.description}
@@ -21,15 +21,15 @@ This environment does not support native function calling. To use a tool, reply
21
21
  [{ "name": "tool_name", "input": { "param": "value" } }]
22
22
  \`\`\`
23
23
 
24
- You 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.`}function xt(e,t,a){return e.map(n=>{let o=t[n.name];if(!o)return{name:n.name,error:`unknown tool "${n.name}". Valid tools: ${Object.keys(t).join(", ")}`};try{let s=o.run(n.input||{},a);return{name:n.name,result:s===void 0?{ok:!0}:s}}catch(s){return{name:n.name,error:String(s&&s.message||s)}}})}var Te=e=>String(e).replace(/[&<>"]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[t]);function ae(e){let t=[],a=String(e).replace(/```[a-z]*\n?([\s\S]*?)```/g,(n,o)=>(t.push(o.replace(/\n$/,"")),"\0"+(t.length-1)+"\0"));return a=Te(a),a=a.replace(/`([^`]+)`/g,"<code>$1</code>"),a=a.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),a=a.replace(/(^|[^*])\*([^*\n]+)\*/g,"$1<em>$2</em>"),a=a.replace(/^#{1,3} (.+)$/gm,'<strong class="caf-md-h">$1</strong>'),a=a.replace(/^[-•*] (.+)$/gm,'<span class="caf-md-li">$1</span>'),a=a.replace(/^\d+\. (.+)$/gm,'<span class="caf-md-li caf-md-num">$1</span>'),a=a.replace(/\n/g,"<br>"),a=a.replace(/\u0000(\d+)\u0000/g,(n,o)=>'<pre class="caf-code">'+Te(t[Number(o)])+"</pre>"),a}function Nt({m:e}){return e.role==="tools"?r("div",{className:"caf-msg-tools"},`used: ${e.tools.join(", ")}`):e.role==="error"?r("div",{className:"caf-msg caf-msg-error"},r("strong",null,"The call failed"),r("span",null,e.content),r("span",{className:"caf-hint"},"Your message is kept \u2014 send again to retry.")):e.role==="user"?r("div",{className:"caf-msg caf-msg-user"},e.content):r("div",{className:"caf-msg caf-msg-assistant",dangerouslySetInnerHTML:{__html:ae(e.content)}})}function re({cfg:e,ctx:t,title:a}){let n=e,[o,s]=j(""),[i,c]=j(!1),[f,l]=j(null),d=ke(null),u=t.data.chat||{api:[],log:[]},p=u.log||[];A(()=>{d.current&&d.current.scrollIntoView({block:"end"})},[p.length,f]);async function w(){let g=o.trim();if(!g||i)return;s(""),c(!0);let N=[...u.api||[],{role:"user",content:g}],m=[...p,{role:"user",content:g}],y=()=>t.update(v=>{v.chat={api:N,log:m}});y();try{let v=(typeof n.system=="function"?n.system(t.data):n.system||"")+(n.tools?vt(n.tools):"");for(let b=0;b<yt;b++){let k=await wt({model:n.model||gt,maxTokens:n.maxTokens||2e3,system:v,messages:N,onText:C=>l(Ce(C))});N=[...N,{role:"assistant",content:k}];let h=Ce(k),E=n.tools?kt(k):null;if(!E){m=[...m,{role:"assistant",content:h||k}],y();break}let $=xt(E,n.tools,t);h&&(m=[...m,{role:"assistant",content:h}]),m=[...m,{role:"tools",tools:E.map(C=>C.name)}],N=[...N,{role:"user",content:`[TOOL_RESULT]
25
- ${JSON.stringify($)}
24
+ You 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.`}function $t(e,t,a){return e.map(n=>{let o=t[n.name];if(!o)return{name:n.name,error:`unknown tool "${n.name}". Valid tools: ${Object.keys(t).join(", ")}`};try{let s=o.run(n.input||{},a);return{name:n.name,result:s===void 0?{ok:!0}:s}}catch(s){return{name:n.name,error:String(s&&s.message||s)}}})}var Ce=e=>String(e).replace(/[&<>"]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[t]);function ae(e){let t=[],a=String(e).replace(/```[a-z]*\n?([\s\S]*?)```/g,(n,o)=>(t.push(o.replace(/\n$/,"")),"\0"+(t.length-1)+"\0"));return a=Ce(a),a=a.replace(/`([^`]+)`/g,"<code>$1</code>"),a=a.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),a=a.replace(/(^|[^*])\*([^*\n]+)\*/g,"$1<em>$2</em>"),a=a.replace(/^#{1,3} (.+)$/gm,'<strong class="caf-md-h">$1</strong>'),a=a.replace(/^[-•*] (.+)$/gm,'<span class="caf-md-li">$1</span>'),a=a.replace(/^\d+\. (.+)$/gm,'<span class="caf-md-li caf-md-num">$1</span>'),a=a.replace(/\n/g,"<br>"),a=a.replace(/\u0000(\d+)\u0000/g,(n,o)=>'<pre class="caf-code">'+Ce(t[Number(o)])+"</pre>"),a}function Et({m:e}){return e.role==="tools"?r("div",{className:"caf-msg-tools"},`used: ${e.tools.join(", ")}`):e.role==="error"?r("div",{className:"caf-msg caf-msg-error"},r("strong",null,"The call failed"),r("span",null,e.content),r("span",{className:"caf-hint"},"Your message is kept \u2014 send again to retry.")):e.role==="user"?r("div",{className:"caf-msg caf-msg-user"},e.content):r("div",{className:"caf-msg caf-msg-assistant",dangerouslySetInnerHTML:{__html:ae(e.content)}})}function re({cfg:e,ctx:t,title:a}){let n=e,[o,s]=$(""),[i,c]=$(!1),[f,l]=$(null),d=ke(null),p=t.data.chat||{api:[],log:[]},h=p.log||[];A(()=>{d.current&&d.current.scrollIntoView({block:"end"})},[h.length,f]);async function k(){let g=o.trim();if(!g||i)return;s(""),c(!0);let x=[...p.api||[],{role:"user",content:g}],y=[...h,{role:"user",content:g}],j=()=>t.update(m=>{m.chat={api:x,log:y}});j();try{let m=(typeof n.system=="function"?n.system(t.data):n.system||"")+(n.tools?Nt(n.tools):"");for(let u=0;u<kt;u++){let w=await vt({model:n.model||wt,maxTokens:n.maxTokens||2e3,system:m,messages:x,onText:T=>l(Te(T))});x=[...x,{role:"assistant",content:w}];let b=Te(w),E=n.tools?xt(w):null;if(!E){y=[...y,{role:"assistant",content:b||w}],j();break}let N=$t(E,n.tools,t);b&&(y=[...y,{role:"assistant",content:b}]),y=[...y,{role:"tools",tools:E.map(T=>T.name)}],x=[...x,{role:"user",content:`[TOOL_RESULT]
25
+ ${JSON.stringify(N)}
26
26
  [/TOOL_RESULT]
27
27
 
28
- Continue with this information. If you have everything you need, answer in natural language without further tool_call.`}],y(),l(null)}}catch(v){m=[...m,{role:"error",content:String(v&&v.message||v)}],y()}finally{l(null),c(!1)}}return r("div",{className:"caf-chat-panel"},r("div",{className:"caf-block caf-chat-log"},a?r("h2",{className:"caf-block-title"},a):null,n.greeting?r("div",{className:"caf-msg caf-msg-assistant",dangerouslySetInnerHTML:{__html:ae(n.greeting)}}):null,p.map((g,N)=>r(Nt,{key:N,m:g})),f!==null?r("div",{className:"caf-msg caf-msg-assistant caf-msg-live",dangerouslySetInnerHTML:{__html:ae(f||"\u2026")}}):null,i&&f===null?r("div",{className:"caf-msg-tools"},"thinking\u2026"):null,r("div",{ref:d})),r("div",{className:"caf-chat-input"},r("input",{value:o,placeholder:n.placeholder||"Message\u2026",disabled:i,enterKeyHint:"send",onChange:g=>s(g.target.value),onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),w())},"aria-label":"Message"}),r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:i||!o.trim(),onClick:w},"Send")))}function Oe({spec:e,ctx:t}){return r("div",{className:"caf-panel caf-panel-single"},r(re,{cfg:e.chat,ctx:t}))}var oe=["text","textarea","number","money","percent","check","date","select","file"];function T(e,t){if(e==null||e==="")return"\u2014";let a=Number(e);switch(t){case"money":return Number.isFinite(a)?a.toLocaleString(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2}):String(e);case"percent":return Number.isFinite(a)?`${a.toLocaleString(void 0,{maximumFractionDigits:2})}%`:String(e);case"number":return Number.isFinite(a)?a.toLocaleString(void 0,{maximumFractionDigits:2}):String(e);case"date":return e instanceof Date?e.toLocaleDateString():String(e);default:return String(e)}}function se(e,t){if(e.required&&(t===""||t===null||t===void 0))return"Required";if(t===""||t===null||t===void 0)return null;if(e.type==="number"||e.type==="money"||e.type==="percent"){let a=Number(t);if(!Number.isFinite(a))return"Must be a number";if(e.min!==void 0&&a<e.min)return`Must be at least ${e.min}`;if(e.max!==void 0&&a>e.max)return`Must be at most ${e.max}`}return null}function z({field:e,value:t,onChange:a,data:n}){let o=se(e,t),s=`caf-f-${e.key}`,i=e.type==="number"||e.type==="money"||e.type==="percent";if(e.type==="file")return r("div",{className:"caf-field"},r("label",{htmlFor:s},e.label||e.key),r("input",{id:s,type:"file",accept:e.accept,onChange:l=>a(l.target.files&&l.target.files[0]?l.target.files[0]:null)}),t&&t.name?r("small",{className:"caf-hint"},`${t.name} (${Math.round((t.size||0)/1024)} KB)${t.stale?" \u2014 re-pick after reload":""}`):e.hint?r("small",{className:"caf-hint"},e.hint):null);if(e.type==="check")return r("label",{className:"caf-check"},r("input",{id:s,type:"checkbox",checked:!!t,onChange:l=>a(l.target.checked)}),r("span",null,e.label||e.key));let c={id:s,value:t??"","aria-invalid":o?"true":void 0,onChange:l=>a(i?$t(l.target.value):l.target.value)},f;if(e.type==="textarea")f=r("textarea",{...c,rows:e.rows||3});else if(e.type==="select"){let l=typeof e.options=="function"?e.options(n)||[]:e.options||[];f=r("select",c,r("option",{value:""},e.placeholder||"Select\u2026"),l.map(d=>{let u=typeof d=="string"?d:d.value,p=typeof d=="string"?d:d.label;return r("option",{key:u,value:u},p)}))}else f=r("input",{...c,type:e.type==="date"?"date":i?"number":"text",min:e.min,max:e.max,step:e.step||(e.type==="money"||e.type==="percent"?"any":void 0),placeholder:e.placeholder});return r("div",{className:"caf-field"},r("label",{htmlFor:s},e.label||e.key),f,e.hint&&!o?r("small",{className:"caf-hint"},e.hint):null,o?r("small",{className:"caf-error"},o):null)}function $t(e){if(e==="")return"";let t=Number(e);return Number.isFinite(t)?t:e}function ie(e,t,a,n,o){if(a.type==="file"){e.files[t]=n||null;let s=n?{name:n.name,size:n.size,type:n.type}:null;e.update(i=>o(i,s));return}e.update(s=>o(s,n))}function Et({spec:e,ctx:t}){let a=e.fields||[];return r("div",{className:"caf-block caf-fields"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a.map(n=>r(z,{key:n.key,field:n,data:t.data,value:t.data[n.key],onChange:o=>ie(t,n.key,n,o,(s,i)=>{s[n.key]=i})})))}function St({spec:e,ctx:t}){let a=typeof e.output=="function"?e.output(t.data):e.output||[];return a.length?r("div",{className:"caf-block caf-output"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label||o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},T(n.value,n.format)),n.hint?r("small",{className:"caf-hint"},n.hint):null)))):r("div",{className:"caf-block caf-empty"},e.empty||"Nothing to show yet.")}function jt({spec:e,ctx:t}){let a=typeof e.banner=="string"?{title:e.banner}:e.banner||{},[n,o]=t.colors(2),s=a.image?`linear-gradient(rgba(0,0,0,0.35), rgba(0,0,0,0.35)), url(${JSON.stringify(a.image)}) center / cover`:`linear-gradient(135deg, ${n}, ${o})`;return r("div",{className:"caf-banner",style:{background:s}},a.title?r("h2",{className:"caf-banner-title"},a.title):null,a.subtitle?r("p",{className:"caf-banner-sub"},a.subtitle):null)}function At({spec:e}){let t=typeof e.image=="string"?{src:e.image}:e.image||{},a=typeof t.src=="string"&&t.src.trim().startsWith("<svg");return r("figure",{className:"caf-block caf-image"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a?r("div",{className:"caf-image-svg",dangerouslySetInnerHTML:{__html:t.src}}):r("img",{src:t.src,alt:t.caption||e.title||"",style:{objectFit:t.fit||"cover",maxHeight:t.height?`${t.height}px`:void 0}}),t.caption?r("figcaption",{className:"caf-hint"},t.caption):null)}function Ct({spec:e,ctx:t}){let a=typeof e.text=="function"?e.text(t.data):e.text;return r("div",{className:"caf-block caf-text"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("p",null,a))}function Tt({spec:e,ctx:t}){let a=(typeof e.list=="function"?e.list(t.data):e.list)||[],n=typeof e.title=="string"?e.title:null,o=typeof e.title=="function"?e.title:s=>s.title??s.name??s.label??s.text??String(s);return a.length?r("div",{className:"caf-block caf-list"},n?r("h2",{className:"caf-block-title"},n):null,a.map((s,i)=>r("button",{key:s.id??i,className:"caf-row",type:"button",onClick:e.onSelect?()=>e.onSelect(s,t):void 0},r("span",{className:"caf-row-title"},o(s)),e.subtitle?r("span",{className:"caf-row-sub"},e.subtitle(s)):null))):r("div",{className:"caf-block caf-empty"},e.empty||"Nothing here yet.")}var Re=["bar","line","donut"];function Ot({spec:e,ctx:t}){let a=typeof e.chart=="function"?e.chart(t.data):e.chart,n=a&&a.items||[];if(!n.length)return r("div",{className:"caf-block caf-empty"},e.empty||"No data to chart yet.");let o=a.type||"bar";if(!Re.includes(o))throw new Error(`unknown chart type "${o}". Valid types: ${Re.join(", ")}.`);let s=t.colors(n.length),i=o==="bar"?Rt(n,a,s):o==="line"?_t(n,a):Lt(n,a,s);return r("div",{className:"caf-block caf-chart"},e.title?r("h2",{className:"caf-block-title"},e.title):null,i)}function Rt(e,t,a){let n=Math.max(...e.map(o=>Number(o.value)||0),0)||1;return r("div",{className:"caf-bars"},e.map((o,s)=>r("div",{key:o.label??s,className:"caf-bar-row"},r("span",{className:"caf-bar-label"},o.label),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill",style:{width:`${Math.max(2,(Number(o.value)||0)/n*100)}%`,background:a[s]}})),r("span",{className:"caf-bar-value"},T(o.value,t.format)))))}function _t(e,t){let a=e.map(d=>Number(d.value)||0),n=Math.min(...a),s=Math.max(...a)-n||1,i=100,c=36,f=a.map((d,u)=>[a.length===1?i/2:u/(a.length-1)*i,c-3-(d-n)/s*(c-6)]),l=f[f.length-1];return r("div",{className:"caf-line"},r("svg",{viewBox:`0 0 ${i} ${c}`,className:"caf-line-svg",preserveAspectRatio:"none","aria-hidden":"true"},[.25,.5,.75].map(d=>r("line",{key:d,x1:0,x2:i,y1:c*d,y2:c*d,className:"caf-line-grid"})),r("polyline",{points:f.map(d=>d.join(",")).join(" "),className:"caf-line-path"}),r("circle",{cx:l[0],cy:l[1],r:1.6,className:"caf-line-dot"})),r("div",{className:"caf-line-meta"},r("span",{className:"caf-hint"},String(e[0].label??"")),r("span",{className:"caf-line-last"},T(a[a.length-1],t.format)),r("span",{className:"caf-hint"},String(e[e.length-1].label??""))))}function Lt(e,t,a){let n=e.reduce((c,f)=>c+(Number(f.value)||0),0)||1,o=15.9155,s=25,i=e.map((c,f)=>{let l=(Number(c.value)||0)/n*100,d=r("circle",{key:c.label??f,cx:21,cy:21,r:o,className:"caf-donut-seg",stroke:a[f],strokeDasharray:`${l} ${100-l}`,strokeDashoffset:s});return s-=l,d});return r("div",{className:"caf-donut"},r("svg",{viewBox:"0 0 42 42",className:"caf-donut-svg","aria-hidden":"true"},i),r("div",{className:"caf-donut-legend"},e.map((c,f)=>r("div",{key:c.label??f,className:"caf-legend-row"},r("span",{className:"caf-legend-swatch",style:{background:a[f]}}),r("span",{className:"caf-legend-label"},c.label),r("span",{className:"caf-legend-value"},T(c.value,t.format))))))}function Mt({spec:e,ctx:t}){let a=e.timer||{},n=Math.max(1,Math.round((a.minutes||0)*60+(a.seconds||0))||300),[o,s]=j(n),[i,c]=j(!1);A(()=>{if(!i)return;let u=setInterval(()=>s(p=>Math.max(0,p-1)),1e3);return()=>clearInterval(u)},[i]),A(()=>{o===0&&i&&(c(!1),typeof a.onDone=="function"&&t.update(u=>a.onDone(u)))},[o,i]);let f=String(Math.floor(o/60)).padStart(2,"0"),l=String(o%60).padStart(2,"0"),d=o===0;return r("div",{className:"caf-block caf-timer"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a.label?r("span",{className:"caf-hint"},a.label):null,r("div",{className:d?"caf-timer-time caf-timer-done":"caf-timer-time"},d?a.doneText||"Done!":`${f}:${l}`),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill caf-timer-fill",style:{width:`${o/n*100}%`}})),r("div",{className:"caf-timer-controls"},r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:d,onClick:()=>c(u=>!u)},i?"Pause":"Start"),r("button",{type:"button",className:"caf-btn",onClick:()=>{c(!1),s(n)}},"Reset")))}function zt({spec:e,ctx:t}){let n=(e.actions||[]).filter(o=>!o.when||o.when(t.data,t.viewerId));return r("div",{className:"caf-block caf-actions"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-actions-row"},n.map(o=>r("button",{key:o.label,type:"button",className:o.kind==="danger"?"caf-btn caf-btn-danger":o.kind==="primary"?"caf-btn caf-btn-primary":"caf-btn",onClick:()=>t.update(s=>o.run(s,t.viewerId))},o.label))))}function Bt({spec:e,ctx:t}){let a=e.custom(t),n=e.fill?"caf-block caf-block-fill":"caf-block";return typeof a=="string"?r("div",{className:n,dangerouslySetInnerHTML:{__html:a}}):r("div",{className:n},a)}var ce={fields:Et,output:St,text:Ct,list:Tt,chart:Ot,timer:Mt,actions:zt,banner:jt,image:At,chat:({spec:e,ctx:t})=>r(re,{cfg:e.chat,ctx:t,title:e.title}),custom:Bt},H=Object.keys(ce);function Le(e){return Object.entries(e.compute||{}).map(([t,a])=>[t,typeof a=="function"?{value:a}:a])}function P(e,t){if(!e.compute)return t;let a={...t};for(let[n,o]of Le(e))try{a[n]=o.value(t)}catch{a[n]=void 0}return a}function Me(e){let t={};for(let a of e)t[a.key]=a.value!==void 0?a.value:a.type==="check"?!1:"";return t}function le(){return"r"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function It({title:e,ctx:t}){let a=String(e).split(/\s+/).map(s=>s[0]).filter(Boolean).slice(0,2).join("").toUpperCase()||"?",n=0;for(let s of String(e))n=n*31+s.charCodeAt(0)>>>0;let o=t.colors(8);return r("span",{className:"caf-avatar",style:{background:o[n%o.length]}},a)}function _e(e,t){if(e.title)return e.title(t);let a=e.fields.find(o=>!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"),n=a&&t[a.key];return n===""||n===void 0||n===null?"(untitled)":String(n)}function ze({spec:e,records:t}){if(!e.summary)return null;let a=e.summary(t)||[];return a.length?r("div",{className:"caf-block caf-output"},r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label||o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},T(n.value,n.format)))))):null}function Be({spec:e,ctx:t}){let a=e.label||"item",[n,o]=j("");A(()=>{(t.data.records||[]).some(l=>l&&!l.id)&&t.update(l=>{for(let d of l.records||[])d&&!d.id&&(d.id=le())})});let s=t.data.records.map(l=>P(e,l));e.sort&&(s=s.slice().sort(e.sort));let i=s.length,c=n.trim().toLowerCase();e.search&&c&&(s=s.filter(l=>e.fields.some(d=>String(l[d.key]??"").toLowerCase().includes(c))));function f(){let l={id:le(),...Me(e.fields)};e.items&&(l.items=[]),t.update(d=>{d.records=[...d.records,l]}),t.go("record",l.id)}return r("div",{className:"caf-block caf-list"},r("div",{className:"caf-toolbar"},r("span",{className:"caf-count"},e.search&&c?`${s.length} of ${i}`:`${i} ${a}${i===1?"":"s"}`),r("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:f},`Add ${a}`)),e.search?r("input",{className:"caf-search",value:n,placeholder:`Search ${a}s\u2026`,"aria-label":"Search",onChange:l=>o(l.target.value)}):null,e.search&&c&&s.length===0&&i>0?r("div",{className:"caf-empty"},`Nothing matches "${n}".`):null,s.length===0?r("div",{className:"caf-empty"},e.empty||`No ${a}s yet. Add the first one.`):s.map(l=>r("div",{key:l.id,className:"caf-row-wrap"},r("button",{type:"button",className:e.avatar?"caf-row caf-row-avatar":"caf-row",onClick:()=>t.go("record",l.id)},e.avatar?r(It,{title:_e(e,l),ctx:t}):null,r("span",{className:"caf-row-main"},r("span",{className:"caf-row-title"},_e(e,l)),e.subtitle?r("span",{className:"caf-row-sub"},e.subtitle(l)):null)),e.actions?r("div",{className:"caf-row-actions"},e.actions.filter(d=>!d.when||d.when(l,t.viewerId)).map(d=>r("button",{key:d.label,type:"button",className:d.kind==="danger"?"caf-btn caf-btn-danger caf-btn-sm":"caf-btn caf-btn-sm",onClick:()=>t.update(u=>{let p=u.records.find(w=>w.id===l.id);p&&d.run(p,u,t.viewerId)})},d.label))):null)))}function Ie({spec:e,ctx:t,record:a}){let n=e.label||"item";function o(){t.update(s=>{s.records=s.records.filter(i=>i.id!==a.id)}),t.back()}return r("div",{className:"caf-block caf-fields"},r("div",{className:"caf-toolbar"},r("button",{type:"button",className:"caf-btn",onClick:t.back},"\u2039 Back"),r("button",{type:"button",className:"caf-btn caf-btn-danger",onClick:o},`Delete ${n}`)),e.fields.map(s=>r(z,{key:s.key,field:s,data:t.data,value:a[s.key],onChange:i=>t.update(c=>{let f=c.records.find(l=>l.id===a.id);f&&(f[s.key]=i)})})),e.items?r(Vt,{spec:e,ctx:t,record:a}):null,e.compute?r("div",{className:"caf-output-grid caf-computed"},Le(e).map(([s,i])=>{let c=P(e,a);return r("div",{key:s,className:"caf-stat"},r("span",{className:"caf-stat-label"},i.label||s),r("span",{className:"caf-stat-value"},T(c[s],i.format)))})):null)}function Vt({spec:e,ctx:t,record:a}){let n=e.items,o=n.label||"item";function s(c){t.update(f=>{let l=f.records.find(d=>d.id===a.id);l&&(Array.isArray(l.items)||(l.items=[]),c(l))})}let i=Array.isArray(a.items)?a.items:[];return r("div",{className:"caf-items"},r("div",{className:"caf-toolbar"},r("span",{className:"caf-count"},`${i.length} ${o}${i.length===1?"":"s"}`),r("button",{type:"button",className:"caf-btn caf-btn-sm",onClick:()=>s(c=>c.items.push({id:le(),...Me(n.fields)}))},`Add ${o}`)),i.length===0?r("div",{className:"caf-empty caf-empty-sm"},n.empty||`No ${o}s yet.`):i.map(c=>r("div",{key:c.id,className:"caf-item-row"},n.fields.map(f=>r(z,{key:f.key,field:f,data:t.data,value:c[f.key],onChange:l=>s(d=>{let u=d.items.find(p=>p.id===c.id);u&&(u[f.key]=l)})})),r("button",{type:"button",className:"caf-btn caf-btn-danger caf-btn-sm caf-item-remove","aria-label":`Remove ${o}`,onClick:()=>s(f=>{f.items=f.items.filter(l=>l.id!==c.id)})},"\u2715"))))}function Dt(e,t){return t==="records"?e:new Proxy(e,{get:(a,n,o)=>n==="records"?a[t]:Reflect.get(a,n,o),set:(a,n,o)=>Reflect.set(a,n==="records"?t:n,o),has:(a,n)=>n==="records"?t in a:n in a})}function Ve({spec:e,ctx:t}){let a=e.records,n=a.key||"records",o=Array.isArray(t.data[n])?t.data[n]:[],s="caf:rec:"+n,i=t.view.tabs?t.view.tabs[s]:void 0,c={...t,data:{...t.data,records:o},update:l=>t.update(d=>l(Dt(d,n))),go:(l,d)=>t.setTab(s,d),back:()=>t.setTab(s,void 0)},f=i?o.find(l=>l.id===i):null;return r("div",{className:"caf-records-block"},e.title?r("h2",{className:"caf-block-title"},e.title):null,f?r(Ie,{key:"d",spec:a,ctx:c,record:f}):[r(ze,{key:"s",spec:a,records:o.map(l=>P(a,l))}),r(Be,{key:"l",spec:a,ctx:c})])}function De({spec:e,ctx:t}){let a=e.records;if(t.view.screen==="record"){let n=t.data.records.find(o=>o.id===t.view.arg);if(n)return r("div",{className:"caf-panel caf-panel-single"},r(Ie,{spec:a,ctx:t,record:n}))}return r("div",{className:"caf-panel caf-panel-single"},r(ze,{spec:a,records:t.data.records.map(n=>P(a,n))}),r(Be,{spec:a,ctx:t}))}function Kt(e,t){return(e.fields||[]).some(a=>se(a,t[a.key])!==null)}function Yt({step:e,ctx:t}){let a=e.result(t.data)||[];return r("div",{className:"caf-block caf-output"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label??o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},T(n.value,n.format)),n.hint?r("small",{className:"caf-hint"},n.hint):null))),r("div",{className:"caf-step-nav"},r("button",{type:"button",className:"caf-btn",onClick:()=>t.setStep(0)},"Start over")))}function Ke({spec:e,ctx:t}){let a=e.steps,n=Math.min(Math.max(t.view.step||0,0),a.length-1),o=a[n],s=typeof o.result=="function",i=n===a.length-1;return r("div",{className:"caf-panel caf-panel-single"},r("div",{className:"caf-steps-progress"},r("span",{className:"caf-hint"},s?"Result":`Step ${n+1} of ${a.length}`),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill caf-steps-fill",style:{width:`${(n+1)/a.length*100}%`}}))),s?r(Yt,{step:o,ctx:t}):r("div",{className:"caf-block caf-fields"},o.title?r("h2",{className:"caf-block-title"},o.title):null,o.text?r("p",{className:"caf-step-text"},typeof o.text=="function"?o.text(t.data):o.text):null,(o.fields||[]).map(c=>r(z,{key:c.key,field:c,data:t.data,value:t.data[c.key],onChange:f=>ie(t,c.key,c,f,(l,d)=>{l[c.key]=d})})),r("div",{className:"caf-step-nav"},n>0?r("button",{type:"button",className:"caf-btn",onClick:()=>t.setStep(n-1)},"\u2039 Back"):r("span"),i?null:r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:Kt(o,t.data),onClick:()=>t.setStep(n+1)},"Next \u203A"))))}var Ye=["panel","records","steps","chat","workspace","documents"],Ft=["title","empty","wide","onSelect","subtitle","when","collapsible","fill","state","icon"],Fe=["logo","footer"],He=["image","title","subtitle"],Pe=["src","caption","fit","height"],Ue=["title","subtitle","theme","layout","blocks","records","steps","chat","data","shared","main","sidebar","libs","documents","machine","brand"],Je=["key","initial","states","events"],We=["after"],qe=["seconds","then","do"],Xe=["from","do","then"],Ge=["label","title","blocks","empty","types"],Qe=["label","fields","title","subtitle","sort","summary","empty","search","compute","items","actions","avatar"],Ze=["label","fields","empty"];function J(e,t){for(let a of e||[]){if(!a||!a.key)throw new Error(`claude-artifact-framework: every field in ${t} needs a \`key\`.`);if(a.type!==void 0&&!oe.includes(a.type))throw new Error(`claude-artifact-framework: field "${a.key}" in ${t} has unknown type "${a.type}". Valid types: ${oe.join(", ")}.`);if(a.type==="select"&&a.options!==void 0&&!Array.isArray(a.options)&&typeof a.options!="function")throw new Error(`claude-artifact-framework: field "${a.key}" in ${t}: \`options\` must be an array or a function of data returning one.`)}}function nt(e,t){if(!e||typeof e.system!="string"&&typeof e.system!="function")throw new Error(`claude-artifact-framework: ${t} needs \`{ system: "..." }\` (a string or a function of data).`);let a=Object.keys(e).filter(n=>!ne.includes(n));if(a.length)throw new Error(`claude-artifact-framework: ${t} has unknown keys (${a.join(", ")}). Valid keys: ${ne.join(", ")}.`);for(let[n,o]of Object.entries(e.tools||{}))if(!o||typeof o.description!="string"||typeof o.run!="function")throw new Error(`claude-artifact-framework: chat tool "${n}" needs a \`description\` string and a \`run(input, ctx)\` function.`)}var et=["label","run","when","kind"];function rt(e,t){if(!Array.isArray(e))throw new Error(`claude-artifact-framework: ${t} must be an array of { label, run }.`);e.forEach((a,n)=>{if(!a||typeof a.label!="string"||typeof a.run!="function")throw new Error(`claude-artifact-framework: ${t}[${n}] needs a \`label\` string and a \`run\` function.`);let o=Object.keys(a).filter(s=>!et.includes(s));if(o.length)throw new Error(`claude-artifact-framework: ${t}[${n}] has unknown keys (${o.join(", ")}). Valid keys: ${et.join(", ")}.`)})}function B(e){if(!Array.isArray(e))throw new Error("claude-artifact-framework: `blocks` must be an array.");e.forEach((t,a)=>{if(!t||typeof t!="object")throw new Error(`claude-artifact-framework: blocks[${a}] must be an object like { fields: [...] }.`);let n=Object.keys(t).filter(s=>!Ft.includes(s)),o=n.filter(s=>H.includes(s)||s==="tabs"||s==="records");if(o.length===0)throw new Error(`claude-artifact-framework: blocks[${a}] has no recognised block type (found: ${n.join(", ")||"nothing"}). Valid block types: ${[...H,"tabs","records"].join(", ")}.`);if(o.length>1)throw new Error(`claude-artifact-framework: blocks[${a}] declares more than one block type (${o.join(", ")}). Split them into separate entries of \`blocks\`.`);if(J(t.fields,`blocks[${a}]`),o[0]==="actions"&&rt(t.actions,`blocks[${a}].actions`),o[0]==="chat"&&nt(t.chat,`blocks[${a}].chat`),o[0]==="records"&&ot(t.records,`blocks[${a}].records`,!0),o[0]==="banner"&&typeof t.banner=="object"&&t.banner!==null){let s=Object.keys(t.banner).filter(i=>!He.includes(i));if(s.length)throw new Error(`claude-artifact-framework: blocks[${a}].banner has unknown keys (${s.join(", ")}). Valid keys: ${He.join(", ")}.`)}if(o[0]==="image"&&typeof t.image=="object"&&t.image!==null){let s=Object.keys(t.image).filter(i=>!Pe.includes(i));if(s.length)throw new Error(`claude-artifact-framework: blocks[${a}].image has unknown keys (${s.join(", ")}). Valid keys: ${Pe.join(", ")}.`)}if(t.icon!==void 0&&typeof t.icon!="string")throw new Error(`claude-artifact-framework: blocks[${a}].icon must be a string (an emoji works best).`);if(o[0]==="tabs"){let s=t.tabs;if(!Array.isArray(s)||s.length===0)throw new Error(`claude-artifact-framework: blocks[${a}].tabs needs an array of { label, blocks: [...] }.`);s.forEach((i,c)=>{if(!i||typeof i.label!="string"||!Array.isArray(i.blocks)||i.blocks.length===0)throw new Error(`claude-artifact-framework: tabs[${c}] needs a \`label\` string and a non-empty \`blocks\` array.`);if(i.blocks.some(f=>f&&f.tabs))throw new Error("claude-artifact-framework: tabs cannot nest inside tabs.");B(i.blocks)})}if(t.when!==void 0&&typeof t.when!="function")throw new Error(`claude-artifact-framework: blocks[${a}].when must be a function of data returning true/false.`);if(t.fill!==void 0&&o[0]!=="custom")throw new Error(`claude-artifact-framework: \`fill\` is only valid on custom blocks \u2014 blocks[${a}] is "${o[0]}".`)})}function Ht(e){let t=Object.keys(e).filter(s=>!Je.includes(s));if(t.length)throw new Error(`claude-artifact-framework: machine has unknown keys (${t.join(", ")}). Valid keys: ${Je.join(", ")}.`);if(e.key!==void 0&&(typeof e.key!="string"||!e.key))throw new Error("claude-artifact-framework: machine.key must be a non-empty string (where the current state lives in data).");let a=Object.keys(e.states||{});if(!a.length)throw new Error("claude-artifact-framework: machine needs `states: { nombre: {...} }` with at least one state.");let n=(s,i)=>{if(!a.includes(s))throw new Error(`claude-artifact-framework: ${i} names unknown state "${s}". Valid states: ${a.join(", ")}.`)};if(typeof e.initial!="string")throw new Error('claude-artifact-framework: machine needs `initial: "..."` naming the starting state.');n(e.initial,"machine.initial");for(let[s,i]of Object.entries(e.states)){let c=Object.keys(i||{}).filter(f=>!We.includes(f));if(c.length)throw new Error(`claude-artifact-framework: machine.states.${s} has unknown keys (${c.join(", ")}). Valid keys: ${We.join(", ")}.`);if(i&&i.after!==void 0){let f=i.after,l=Object.keys(f||{}).filter(d=>!qe.includes(d));if(l.length)throw new Error(`claude-artifact-framework: machine.states.${s}.after has unknown keys (${l.join(", ")}). Valid keys: ${qe.join(", ")}.`);if(typeof f.seconds!="number"||f.seconds<=0)throw new Error(`claude-artifact-framework: machine.states.${s}.after needs \`seconds\` > 0.`);if(typeof f.then!="string")throw new Error(`claude-artifact-framework: machine.states.${s}.after needs \`then: "estado"\`.`);if(n(f.then,`machine.states.${s}.after.then`),f.do!==void 0&&typeof f.do!="function")throw new Error(`claude-artifact-framework: machine.states.${s}.after.do must be a function of data.`)}}if(!Object.keys(e.events||{}).length)throw new Error("claude-artifact-framework: machine needs `events: { nombre: {...} }` \u2014 ctx.send() is the only way to move it.");for(let[s,i]of Object.entries(e.events)){let c=Object.keys(i||{}).filter(f=>!Xe.includes(f));if(c.length)throw new Error(`claude-artifact-framework: machine.events.${s} has unknown keys (${c.join(", ")}). Valid keys: ${Xe.join(", ")}.`);if(i.from!==void 0&&i.from!=="*")for(let f of[].concat(i.from))n(f,`machine.events.${s}.from`);if(typeof i.then=="string")n(i.then,`machine.events.${s}.then`);else if(i.then!==void 0&&typeof i.then!="function")throw new Error(`claude-artifact-framework: machine.events.${s}.then must be a state name or a function of data returning one.`);if(i.do!==void 0&&typeof i.do!="function")throw new Error(`claude-artifact-framework: machine.events.${s}.do must be a function (data, payload).`)}}function Pt(e){let t=Object.keys(e).filter(n=>!Ue.includes(n));if(t.length)throw new Error(`claude-artifact-framework: unknown top-level keys (${t.join(", ")}). Valid keys: ${Ue.join(", ")}.`);if(e.machine!==void 0&&Ht(e.machine),e.brand!==void 0){let n=Object.keys(e.brand||{}).filter(o=>!Fe.includes(o));if(n.length)throw new Error(`claude-artifact-framework: brand has unknown keys (${n.join(", ")}). Valid keys: ${Fe.join(", ")}.`);if(e.brand.logo!==void 0&&typeof e.brand.logo!="string")throw new Error("claude-artifact-framework: brand.logo must be a string \u2014 an emoji, an inline <svg>...</svg>, or an https URL. Omit it for an automatic monogram.")}if(e.libs!==void 0&&(!Array.isArray(e.libs)||e.libs.some(n=>typeof n!="string"||!/^https?:\/\//.test(n))))throw new Error("claude-artifact-framework: `libs` must be an array of https:// script URLs.");let a=e.layout||"panel";if(!Ye.includes(a))throw new Error(`claude-artifact-framework: unknown layout "${a}". Valid layouts: ${Ye.join(", ")}.`);if(a==="steps"){let n=e.steps;if(!Array.isArray(n)||n.length===0)throw new Error('claude-artifact-framework: layout "steps" needs `steps: [...]` with at least one step.');let o=["title","text","fields","result"],s=new Set;return n.forEach((i,c)=>{if(!i||typeof i!="object")throw new Error(`claude-artifact-framework: steps[${c}] must be an object.`);let f=Object.keys(i).filter(l=>!o.includes(l));if(f.length)throw new Error(`claude-artifact-framework: steps[${c}] has unknown keys (${f.join(", ")}). Valid keys: ${o.join(", ")}.`);if(!i.fields&&!i.text&&!i.result)throw new Error(`claude-artifact-framework: steps[${c}] needs \`fields\`, \`text\`, or \`result\`.`);J(i.fields,`steps[${c}]`);for(let l of i.fields||[]){if(s.has(l.key))throw new Error(`claude-artifact-framework: field key "${l.key}" appears in more than one step \u2014 keys share one data pool and must be unique.`);s.add(l.key)}}),a}if(a==="chat")return nt(e.chat,"chat"),a;if(a==="workspace"){if(!Array.isArray(e.main)||e.main.length===0)throw new Error('claude-artifact-framework: layout "workspace" needs `main: [...]` (an array of blocks). `sidebar: [...]` is optional.');if(B(e.main),e.sidebar!==void 0){if(!Array.isArray(e.sidebar))throw new Error("claude-artifact-framework: workspace `sidebar` must be an array of blocks.");B(e.sidebar)}let n=O([...e.main,...e.sidebar||[]]);if(n.filter(s=>s&&s.chat).length>1)throw new Error("claude-artifact-framework: only one chat block per app \u2014 the conversation persists under data.chat and there is exactly one.");return fe(n),a}if(a==="documents"){let n=e.documents;if(!n||typeof n!="object"||!n.blocks&&!n.types)throw new Error('claude-artifact-framework: layout "documents" needs `documents: { blocks: [...] }` (every document repeats the same blocks) or `documents: { types: {...} }` (each document is one of several kinds).');if(n.blocks&&n.types)throw new Error("claude-artifact-framework: documents takes `blocks` (uniform documents) OR `types` (typed documents) \u2014 not both.");let o=Object.keys(n).filter(i=>!Ge.includes(i));if(o.length)throw new Error(`claude-artifact-framework: documents has unknown keys (${o.join(", ")}). Valid keys: ${Ge.join(", ")}.`);if(n.title!==void 0&&typeof n.title!="function")throw new Error("claude-artifact-framework: documents.title must be a function of the document's data returning the tab label.");let s=(i,c)=>{B(i);let f=O(i);if(f.filter(l=>l&&l.chat).length>1)throw new Error(`claude-artifact-framework: only one chat block per document (${c}) \u2014 each document's conversation persists under its own data.chat and there is exactly one.`);fe(f)};if(n.blocks){if(!Array.isArray(n.blocks)||n.blocks.length===0)throw new Error("claude-artifact-framework: documents.blocks must be a non-empty array of blocks.");s(n.blocks,"documents.blocks")}else{let i=Object.keys(n.types||{});if(!i.length)throw new Error("claude-artifact-framework: documents.types needs at least one type, e.g. `types: { nota: { blocks: [...] } }`.");for(let c of i){let f=n.types[c],l=["label","title","blocks","empty","icon"],d=Object.keys(f||{}).filter(u=>!l.includes(u));if(d.length)throw new Error(`claude-artifact-framework: documents.types.${c} has unknown keys (${d.join(", ")}). Valid keys: ${l.join(", ")}.`);if(!f||!Array.isArray(f.blocks)||f.blocks.length===0)throw new Error(`claude-artifact-framework: documents.types.${c} needs a non-empty \`blocks\` array.`);if(f.title!==void 0&&typeof f.title!="function")throw new Error(`claude-artifact-framework: documents.types.${c}.title must be a function of the document's data.`);s(f.blocks,`documents.types.${c}`)}}return a}if(a==="records"){if(ot(e.records,"records",!1),e.blocks&&(B(e.blocks),O(e.blocks).some(n=>n&&n.records)))throw new Error("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.");return a}return B(e.blocks||[]),fe(O(e.blocks||[])),a}function ot(e,t,a){if(!e||!Array.isArray(e.fields)||e.fields.length===0)throw new Error(`claude-artifact-framework: ${t} needs \`records: { fields: [...] }\` \u2014 the same field declarations the fields block uses.`);let n=a?[...Qe,"key"]:Qe,o=Object.keys(e).filter(i=>!n.includes(i));if(o.length)throw new Error(`claude-artifact-framework: ${t} has unknown keys (${o.join(", ")}). Valid keys: ${n.join(", ")}.`);if(a&&e.key!==void 0&&(typeof e.key!="string"||!e.key))throw new Error(`claude-artifact-framework: ${t}.key must be a non-empty string naming the collection in data.`);if(J(e.fields,t),e.fields.some(i=>i.type==="file")||e.items&&e.items.fields.some(i=>i.type==="file"))throw new Error("claude-artifact-framework: `file` fields live in the flat data pool (panel blocks or steps) \u2014 they are not supported inside records or items.");let s=new Set;for(let i of e.fields){if(i.key==="id")throw new Error('claude-artifact-framework: "id" is reserved on records \u2014 the framework assigns it.');if(s.has(i.key))throw new Error(`claude-artifact-framework: duplicate ${t} field key "${i.key}".`);s.add(i.key)}if(e.actions&&rt(e.actions,`${t}.actions`),e.items){let i=Object.keys(e.items).filter(c=>!Ze.includes(c));if(i.length)throw new Error(`claude-artifact-framework: ${t}.items has unknown keys (${i.join(", ")}). Valid keys: ${Ze.join(", ")}.`);if(!Array.isArray(e.items.fields)||e.items.fields.length===0)throw new Error(`claude-artifact-framework: ${t}.items needs \`fields: [...]\` \u2014 the same field declarations as everywhere else.`);J(e.items.fields,`${t}.items`);for(let c of e.items.fields)if(c.key==="id")throw new Error('claude-artifact-framework: "id" is reserved on items \u2014 the framework assigns it.');if(s.has("items")||e.fields.some(c=>c.key==="items"))throw new Error(`claude-artifact-framework: a ${t} field cannot be named "items" when \`items\` is declared \u2014 that key holds the child collection.`)}for(let[i,c]of Object.entries(e.compute||{})){if(s.has(i)||i==="id"||e.items&&i==="items")throw new Error(`claude-artifact-framework: compute key "${i}" collides with a field key \u2014 computed values are derived, never stored.`);if(typeof c!="function"&&typeof(c&&c.value)!="function")throw new Error(`claude-artifact-framework: compute "${i}" must be a function of the record, or { label, format, value: (r) => ... }.`)}}function fe(e){let t=new Set;for(let a of e){if(!a||!a.records)continue;let n=a.records.key||"records";if(t.has(n))throw new Error(`claude-artifact-framework: two records blocks share the collection key "${n}" \u2014 give each a distinct \`key\`.`);t.add(n)}}function O(e){let t=[];for(let a of e||[])if(t.push(a),a&&Array.isArray(a.tabs))for(let n of a.tabs)t.push(...O(n.blocks));return t}function Ut(e){let t={...e.data||{}};if((e.layout||"panel")==="records"&&!Array.isArray(t.records)&&(t.records=[]),(e.layout||"panel")==="documents"&&!Array.isArray(t.docs)&&(t.docs=[]),e.machine){let o=e.machine.key||"fase";o in t||(t[o]=e.machine.initial)}let a=O([...e.blocks||[],...e.main||[],...e.sidebar||[]]);((e.layout||"panel")==="chat"||a.some(o=>o&&o.chat))&&!t.chat&&(t.chat={api:[],log:[]});for(let o of[...a,...e.steps||[]])for(let s of o.fields||[])s&&s.key!==void 0&&!(s.key in t)&&(t[s.key]=s.value!==void 0?s.value:s.type==="check"?!1:"");for(let o of a)if(o&&o.records){let s=o.records.key||"records";Array.isArray(t[s])||(t[s]=[])}return t}var de=null;function Jt(e){return de||(de=class extends e.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?r("div",{className:"caf-block caf-block-error"},r("strong",null,"This section failed to render"),r("code",null,String(this.state.error.message||this.state.error))):this.props.children}}),de}function Wt({spec:e,ctx:t}){let a=e.tabs,n=a.map(i=>i.label).join("|"),o=t.view.tabs?t.view.tabs[n]:void 0,s=Math.min(o===void 0?0:o,a.length-1);return r("div",{className:"caf-tabs"},r("div",{className:"caf-tabbar",role:"tablist"},a.map((i,c)=>r("button",{key:i.label,type:"button",role:"tab","aria-selected":c===s,className:c===s?"caf-tab caf-tab-active":"caf-tab",onClick:()=>t.setTab(n,c)},i.icon?`${i.icon} ${i.label}`:i.label))),r("div",{className:"caf-tabs-body"},a[s].blocks.map((i,c)=>r(W,{key:s+":"+c,block:i,ctx:t}))))}var qt={...ce,tabs:Wt,records:Ve},Xt=[...H,"tabs","records"];function W({block:e,ctx:t}){if(typeof e.when=="function"&&!e.when(t.data)||e.state!==void 0&&t.machine&&t.data[t.machine.key||"fase"]!==e.state)return null;e.icon&&typeof e.title=="string"&&(e={...e,title:`${e.icon} ${e.title}`});let a=Object.keys(e).find(c=>Xt.includes(c)),n=qt[a],o=r(Jt(t.React),null,r(n,{spec:e.collapsible?{...e,title:void 0}:e,ctx:t}));if(!e.collapsible)return o;let s=typeof e.title=="string"&&e.title?e.title:a,i=t.view.collapsed&&s in t.view.collapsed?t.view.collapsed[s]:e.collapsible==="collapsed";return r("div",{className:"caf-collapse"},r("button",{type:"button",className:"caf-collapse-head","aria-expanded":!i,onClick:()=>t.toggleCollapsed(s,!i)},r("span",null,e.title||a),r("span",{className:i?"caf-chevron caf-chevron-closed":"caf-chevron"},"\u25BE")),i?null:r("div",{className:"caf-collapse-body"},o))}function st({spec:e,ctx:t}){return r("div",{className:"caf-panel"},(e.blocks||[]).map((a,n)=>r("section",{key:n,className:a.wide||a.collapsible||a.banner?"caf-slot caf-slot-wide":"caf-slot"},r(W,{block:a,ctx:t}))))}function Gt({spec:e,ctx:t}){let a=t.view.screen==="record"&&(t.data.records||[]).some(n=>n.id===t.view.arg);return r("div",null,r(De,{spec:e,ctx:t}),!a&&Array.isArray(e.blocks)&&e.blocks.length?r("div",{className:"caf-panel caf-records-blocks"},e.blocks.map((n,o)=>r("section",{key:o,className:n.wide||n.collapsible||n.banner?"caf-slot caf-slot-wide":"caf-slot"},r(W,{block:n,ctx:t})))):null)}function Qt({spec:e,ctx:t}){let a=n=>(n||[]).map((o,s)=>r("section",{key:s,className:"caf-ws-slot"},r(W,{block:o,ctx:t})));return r("div",{className:"caf-workspace"},r("div",{className:"caf-ws-main"},a(e.main)),e.sidebar&&e.sidebar.length?r("div",{className:"caf-ws-side"},a(e.sidebar)):null)}function ue(e){let t={};for(let a of O(e.blocks)){for(let n of a.fields||[])n&&n.key!==void 0&&!(n.key in t)&&(t[n.key]=n.value!==void 0?n.value:n.type==="check"?!1:"");if(a.records){let n=a.records.key||"records";Array.isArray(t[n])||(t[n]=[])}}return t}function Zt(){return"d"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}var U="caf:doc";function ea(e,t,a){if(e.title)try{let n=e.title(t);if(n!=null&&n!=="")return String(n)}catch{}for(let n of O(e.blocks))for(let o of n.fields||[])if(!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"){let s=t[o.key];return s!==""&&s!==void 0&&s!==null?String(s):a||"(untitled)"}return a||"(untitled)"}function ta({spec:e,ctx:t}){let a=e.documents,n=a.label||"document",o=Array.isArray(t.data.docs)?t.data.docs:[],s=a.types||null,i=s?Object.keys(s):[],c=h=>s?s[h.type]:a,f=h=>{let E=s[h]||{};return(E.icon?E.icon+" ":"")+(E.label||h)},[l,d]=j(!1),u=t.view.tabs?t.view.tabs[U]:void 0,p=o.find(h=>h.id===u)||o[0];function w(h){let E=s?s[h]:a,$={id:Zt(),...s?{type:h}:{},data:ue(E)};t.update(C=>{C.docs=[...C.docs||[],$]}),t.setTab(U,$.id),d(!1)}function g(){if(!s)return w();if(i.length===1)return w(i[0]);d(h=>!h)}function N(h){let E=o.findIndex($=>$.id===h);if(t.update($=>{$.docs=$.docs.filter(C=>C.id!==h)}),delete t.files["doc:"+h],p&&p.id===h){let $=o[E+1]||o[E-1];$&&t.setTab(U,$.id)}}let m=s&&l?r("div",{className:"caf-doc-typemenu"},i.map(h=>r("button",{key:h,type:"button",className:"caf-btn caf-btn-sm",onClick:()=>w(h)},f(h)))):null;if(!p)return r("div",{className:"caf-panel caf-panel-single"},r("div",{className:"caf-block caf-empty"},r("p",null,a.empty||`No ${n}s yet. Create the first one.`),s?r("div",{className:"caf-doc-typemenu"},i.map(h=>r("button",{key:h,type:"button",className:"caf-btn caf-btn-primary",onClick:()=>w(h)},`New ${f(h)}`))):r("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:()=>w()},`New ${n}`)));let y=c(p);if(!y)return r("div",{className:"caf-documents"},r(tt,{docs:o,active:p,dspec:a,types:s,close:N,onAdd:g,label:n,ctx:t}),m,r("div",{className:"caf-block caf-block-error"},r("strong",null,`This ${n}'s type "${p.type}" no longer exists`),r("code",null,`valid types: ${i.join(", ")}`)));let b={...ue(y),...p.data},k={...t,data:b,update:h=>t.update(E=>{let $=(E.docs||[]).find(C=>C.id===p.id);$&&h($.data)}),files:t.files["doc:"+p.id]=t.files["doc:"+p.id]||{}};return r("div",{className:"caf-documents"},r(tt,{docs:o,active:p,dspec:a,types:s,close:N,onAdd:g,label:n,ctx:t}),m,r(st,{spec:{blocks:y.blocks},ctx:k}))}function tt({docs:e,active:t,dspec:a,types:n,close:o,onAdd:s,label:i,ctx:c}){let f=l=>{let d=n?n[l.type]:a;if(!d)return l.type;let u={...ue(d),...l.data},p=n?d.label||l.type:void 0;return ea(d,u,p)};return r("div",{className:"caf-tabbar",role:"tablist"},e.map(l=>r("span",{key:l.id,className:"caf-doc-tab"},r("button",{type:"button",role:"tab","aria-selected":l.id===t.id,className:l.id===t.id?"caf-tab caf-tab-active":"caf-tab",onClick:()=>c.setTab(U,l.id)},f(l)),r("button",{type:"button",className:"caf-doc-close","aria-label":`Close ${i}`,onClick:()=>o(l.id)},"\u2715"))),r("button",{type:"button",className:"caf-tab caf-doc-add","aria-label":`New ${i}`,onClick:s},"+"))}var aa={panel:st,records:Gt,steps:Ke,chat:Oe,workspace:Qt,documents:ta};function it(e){return new Promise((t,a)=>{let n=document.querySelector(`script[src="${e}"]`);if(n){if(n.dataset.cafReady==="1")return t();n.addEventListener("load",t),n.addEventListener("error",()=>a(new Error(`failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.onload=()=>{o.dataset.cafReady="1",t()},o.onerror=()=>{let s=e.match(/^(https:\/\/cdn\.jsdelivr\.net\/npm\/(?:@[^/]+\/)?[^/]+)\/.+/);s&&s[1]!==e?it(s[1]).then(t,()=>a(new Error(`failed to load ${e} (also tried package default ${s[1]})`))):a(new Error(`failed to load ${e}`))},document.head.appendChild(o)})}function at(e){let t=e.documents?e.documents.blocks||Object.values(e.documents.types||{}).flatMap(a=>a.blocks||[]):[];return O([...e.blocks||[],...e.main||[],...e.sidebar||[],...t])}function na(e,t,a,n){let o=e.events[a];if(!o)throw new Error(`claude-artifact-framework: unknown machine event "${a}". Valid events: ${Object.keys(e.events).join(", ")}.`);let s=e.key||"fase";t(i=>{let c=i[s],f=o.from===void 0?"*":o.from;if(f!=="*"&&![].concat(f).includes(c))return;o.do&&o.do(i,n);let l=typeof o.then=="function"?o.then(i):o.then;if(l!=null){if(!e.states[l])throw new Error(`claude-artifact-framework: machine event "${a}" resolved to unknown state "${l}". Valid states: ${Object.keys(e.states).join(", ")}.`);i[s]=l}})}function ct(e={}){let t=Pt(e);if(e.machine){let s=Object.keys(e.machine.states);for(let i of at(e))if(i&&i.state!==void 0&&!s.includes(i.state))throw new Error(`claude-artifact-framework: a block declares state: "${i.state}" but the machine's states are: ${s.join(", ")}.`)}else for(let s of at(e))if(s&&s.state!==void 0)throw new Error("claude-artifact-framework: `state:` on a block needs a `machine` declared at the top level.");let a=Ee(Ut(e),{shared:!!e.shared}),n=F(e.theme&&e.theme.seed)+ra,o={};return function(){if(!V())throw new Error(`claude-artifact-framework: React not found. Hand it over once, before rendering:
28
+ Continue with this information. If you have everything you need, answer in natural language without further tool_call.`}],j(),l(null)}}catch(m){y=[...y,{role:"error",content:String(m&&m.message||m)}],j()}finally{l(null),c(!1)}}return r("div",{className:"caf-chat-panel"},r("div",{className:"caf-block caf-chat-log"},a?r("h2",{className:"caf-block-title"},a):null,n.greeting?r("div",{className:"caf-msg caf-msg-assistant",dangerouslySetInnerHTML:{__html:ae(n.greeting)}}):null,h.map((g,x)=>r(Et,{key:x,m:g})),f!==null?r("div",{className:"caf-msg caf-msg-assistant caf-msg-live",dangerouslySetInnerHTML:{__html:ae(f||"\u2026")}}):null,i&&f===null?r("div",{className:"caf-msg-tools"},"thinking\u2026"):null,r("div",{ref:d})),r("div",{className:"caf-chat-input"},r("input",{value:o,placeholder:n.placeholder||"Message\u2026",disabled:i,enterKeyHint:"send",onChange:g=>s(g.target.value),onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),k())},"aria-label":"Message"}),r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:i||!o.trim(),onClick:k},"Send")))}function Oe({spec:e,ctx:t}){return r("div",{className:"caf-panel caf-panel-single"},r(re,{cfg:e.chat,ctx:t}))}var oe=["text","textarea","number","money","percent","check","date","select","file"];function C(e,t){if(e==null||e==="")return"\u2014";let a=Number(e);switch(t){case"money":return Number.isFinite(a)?a.toLocaleString(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2}):String(e);case"percent":return Number.isFinite(a)?`${a.toLocaleString(void 0,{maximumFractionDigits:2})}%`:String(e);case"number":return Number.isFinite(a)?a.toLocaleString(void 0,{maximumFractionDigits:2}):String(e);case"date":return e instanceof Date?e.toLocaleDateString():String(e);default:return String(e)}}function se(e,t){if(e.required&&(t===""||t===null||t===void 0))return"Required";if(t===""||t===null||t===void 0)return null;if(e.type==="number"||e.type==="money"||e.type==="percent"){let a=Number(t);if(!Number.isFinite(a))return"Must be a number";if(e.min!==void 0&&a<e.min)return`Must be at least ${e.min}`;if(e.max!==void 0&&a>e.max)return`Must be at most ${e.max}`}return null}function z({field:e,value:t,onChange:a,data:n}){let o=se(e,t),s=`caf-f-${e.key}`,i=e.type==="number"||e.type==="money"||e.type==="percent";if(e.type==="file")return r("div",{className:"caf-field"},r("label",{htmlFor:s},e.label||e.key),r("input",{id:s,type:"file",accept:e.accept,onChange:l=>a(l.target.files&&l.target.files[0]?l.target.files[0]:null)}),t&&t.name?r("small",{className:"caf-hint"},`${t.name} (${Math.round((t.size||0)/1024)} KB)${t.stale?" \u2014 re-pick after reload":""}`):e.hint?r("small",{className:"caf-hint"},e.hint):null);if(e.type==="check")return r("label",{className:"caf-check"},r("input",{id:s,type:"checkbox",checked:!!t,onChange:l=>a(l.target.checked)}),r("span",null,e.label||e.key));let c={id:s,value:t??"","aria-invalid":o?"true":void 0,onChange:l=>a(i?St(l.target.value):l.target.value)},f;if(e.type==="textarea")f=r("textarea",{...c,rows:e.rows||3});else if(e.type==="select"){let l=typeof e.options=="function"?e.options(n)||[]:e.options||[];f=r("select",c,r("option",{value:""},e.placeholder||"Select\u2026"),l.map(d=>{let p=typeof d=="string"?d:d.value,h=typeof d=="string"?d:d.label;return r("option",{key:p,value:p},h)}))}else f=r("input",{...c,type:e.type==="date"?"date":i?"number":"text",min:e.min,max:e.max,step:e.step||(e.type==="money"||e.type==="percent"?"any":void 0),placeholder:e.placeholder});return r("div",{className:"caf-field"},r("label",{htmlFor:s},e.label||e.key),f,e.hint&&!o?r("small",{className:"caf-hint"},e.hint):null,o?r("small",{className:"caf-error"},o):null)}function St(e){if(e==="")return"";let t=Number(e);return Number.isFinite(t)?t:e}function ie(e,t,a,n,o){if(a.type==="file"){e.files[t]=n||null;let s=n?{name:n.name,size:n.size,type:n.type}:null;e.update(i=>o(i,s));return}e.update(s=>o(s,n))}function jt({spec:e,ctx:t}){let a=e.fields||[];return r("div",{className:"caf-block caf-fields"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a.map(n=>r(z,{key:n.key,field:n,data:t.data,value:t.data[n.key],onChange:o=>ie(t,n.key,n,o,(s,i)=>{s[n.key]=i})})))}function At({spec:e,ctx:t}){let a=typeof e.output=="function"?e.output(t.data):e.output||[];return a.length?r("div",{className:"caf-block caf-output"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label||o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},C(n.value,n.format)),n.hint?r("small",{className:"caf-hint"},n.hint):null)))):r("div",{className:"caf-block caf-empty"},e.empty||"Nothing to show yet.")}function Tt({spec:e,ctx:t}){let a=typeof e.banner=="string"?{title:e.banner}:e.banner||{},[n,o]=t.colors(2),s=a.image?`linear-gradient(rgba(0,0,0,0.35), rgba(0,0,0,0.35)), url(${JSON.stringify(a.image)}) center / cover`:`linear-gradient(135deg, ${n}, ${o})`;return r("div",{className:"caf-banner",style:{background:s}},a.title?r("h2",{className:"caf-banner-title"},a.title):null,a.subtitle?r("p",{className:"caf-banner-sub"},a.subtitle):null)}function Ct({spec:e}){let t=typeof e.image=="string"?{src:e.image}:e.image||{},a=typeof t.src=="string"&&t.src.trim().startsWith("<svg");return r("figure",{className:"caf-block caf-image"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a?r("div",{className:"caf-image-svg",dangerouslySetInnerHTML:{__html:t.src}}):r("img",{src:t.src,alt:t.caption||e.title||"",style:{objectFit:t.fit||"cover",maxHeight:t.height?`${t.height}px`:void 0}}),t.caption?r("figcaption",{className:"caf-hint"},t.caption):null)}function Ot({spec:e,ctx:t}){let a=typeof e.text=="function"?e.text(t.data):e.text;return r("div",{className:"caf-block caf-text"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("p",null,a))}function _t({spec:e,ctx:t}){let a=(typeof e.list=="function"?e.list(t.data):e.list)||[],n=typeof e.title=="string"?e.title:null,o=typeof e.title=="function"?e.title:s=>s.title??s.name??s.label??s.text??String(s);return a.length?r("div",{className:"caf-block caf-list"},n?r("h2",{className:"caf-block-title"},n):null,a.map((s,i)=>r("button",{key:s.id??i,className:"caf-row",type:"button",onClick:e.onSelect?()=>e.onSelect(s,t):void 0},r("span",{className:"caf-row-title"},o(s)),e.subtitle?r("span",{className:"caf-row-sub"},e.subtitle(s)):null))):r("div",{className:"caf-block caf-empty"},e.empty||"Nothing here yet.")}var _e=["bar","line","donut"];function Rt({spec:e,ctx:t}){let a=typeof e.chart=="function"?e.chart(t.data):e.chart,n=a&&a.items||[];if(!n.length)return r("div",{className:"caf-block caf-empty"},e.empty||"No data to chart yet.");let o=a.type||"bar";if(!_e.includes(o))throw new Error(`unknown chart type "${o}". Valid types: ${_e.join(", ")}.`);let s=t.colors(n.length),i=o==="bar"?Lt(n,a,s):o==="line"?Mt(n,a):zt(n,a,s);return r("div",{className:"caf-block caf-chart"},e.title?r("h2",{className:"caf-block-title"},e.title):null,i)}function Lt(e,t,a){let n=Math.max(...e.map(o=>Number(o.value)||0),0)||1;return r("div",{className:"caf-bars"},e.map((o,s)=>r("div",{key:o.label??s,className:"caf-bar-row"},r("span",{className:"caf-bar-label"},o.label),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill",style:{width:`${Math.max(2,(Number(o.value)||0)/n*100)}%`,background:a[s]}})),r("span",{className:"caf-bar-value"},C(o.value,t.format)))))}function Mt(e,t){let a=e.map(d=>Number(d.value)||0),n=Math.min(...a),s=Math.max(...a)-n||1,i=100,c=36,f=a.map((d,p)=>[a.length===1?i/2:p/(a.length-1)*i,c-3-(d-n)/s*(c-6)]),l=f[f.length-1];return r("div",{className:"caf-line"},r("svg",{viewBox:`0 0 ${i} ${c}`,className:"caf-line-svg",preserveAspectRatio:"none","aria-hidden":"true"},[.25,.5,.75].map(d=>r("line",{key:d,x1:0,x2:i,y1:c*d,y2:c*d,className:"caf-line-grid"})),r("polyline",{points:f.map(d=>d.join(",")).join(" "),className:"caf-line-path"}),r("circle",{cx:l[0],cy:l[1],r:1.6,className:"caf-line-dot"})),r("div",{className:"caf-line-meta"},r("span",{className:"caf-hint"},String(e[0].label??"")),r("span",{className:"caf-line-last"},C(a[a.length-1],t.format)),r("span",{className:"caf-hint"},String(e[e.length-1].label??""))))}function zt(e,t,a){let n=e.reduce((c,f)=>c+(Number(f.value)||0),0)||1,o=15.9155,s=25,i=e.map((c,f)=>{let l=(Number(c.value)||0)/n*100,d=r("circle",{key:c.label??f,cx:21,cy:21,r:o,className:"caf-donut-seg",stroke:a[f],strokeDasharray:`${l} ${100-l}`,strokeDashoffset:s});return s-=l,d});return r("div",{className:"caf-donut"},r("svg",{viewBox:"0 0 42 42",className:"caf-donut-svg","aria-hidden":"true"},i),r("div",{className:"caf-donut-legend"},e.map((c,f)=>r("div",{key:c.label??f,className:"caf-legend-row"},r("span",{className:"caf-legend-swatch",style:{background:a[f]}}),r("span",{className:"caf-legend-label"},c.label),r("span",{className:"caf-legend-value"},C(c.value,t.format))))))}function Bt({spec:e,ctx:t}){let a=e.timer||{},n=Math.max(1,Math.round((a.minutes||0)*60+(a.seconds||0))||300),[o,s]=$(n),[i,c]=$(!1);A(()=>{if(!i)return;let p=setInterval(()=>s(h=>Math.max(0,h-1)),1e3);return()=>clearInterval(p)},[i]),A(()=>{o===0&&i&&(c(!1),typeof a.onDone=="function"&&t.update(p=>a.onDone(p)))},[o,i]);let f=String(Math.floor(o/60)).padStart(2,"0"),l=String(o%60).padStart(2,"0"),d=o===0;return r("div",{className:"caf-block caf-timer"},e.title?r("h2",{className:"caf-block-title"},e.title):null,a.label?r("span",{className:"caf-hint"},a.label):null,r("div",{className:d?"caf-timer-time caf-timer-done":"caf-timer-time"},d?a.doneText||"Done!":`${f}:${l}`),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill caf-timer-fill",style:{width:`${o/n*100}%`}})),r("div",{className:"caf-timer-controls"},r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:d,onClick:()=>c(p=>!p)},i?"Pause":"Start"),r("button",{type:"button",className:"caf-btn",onClick:()=>{c(!1),s(n)}},"Reset")))}function It({spec:e,ctx:t}){let n=(e.actions||[]).filter(o=>!o.when||o.when(t.data,t.viewerId));return r("div",{className:"caf-block caf-actions"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-actions-row"},n.map(o=>r("button",{key:o.label,type:"button",className:o.kind==="danger"?"caf-btn caf-btn-danger":o.kind==="primary"?"caf-btn caf-btn-primary":"caf-btn",onClick:()=>t.update(s=>o.run(s,t.viewerId))},o.label))))}function Vt({spec:e,ctx:t}){let a=e.custom(t),n=e.fill?"caf-block caf-block-fill caf-custom":"caf-block caf-custom";return typeof a=="string"?r("div",{className:n,dangerouslySetInnerHTML:{__html:a}}):r("div",{className:n},a)}var ce={fields:jt,output:At,text:Ot,list:_t,chart:Rt,timer:Bt,actions:It,banner:Tt,image:Ct,chat:({spec:e,ctx:t})=>r(re,{cfg:e.chat,ctx:t,title:e.title}),custom:Vt},H=Object.keys(ce);function Le(e){return Object.entries(e.compute||{}).map(([t,a])=>[t,typeof a=="function"?{value:a}:a])}function P(e,t){if(!e.compute)return t;let a={...t};for(let[n,o]of Le(e))try{a[n]=o.value(t)}catch{a[n]=void 0}return a}function Me(e){let t={};for(let a of e)t[a.key]=a.value!==void 0?a.value:a.type==="check"?!1:"";return t}function le(){return"r"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Dt({title:e,ctx:t}){let a=String(e).split(/\s+/).map(s=>s[0]).filter(Boolean).slice(0,2).join("").toUpperCase()||"?",n=0;for(let s of String(e))n=n*31+s.charCodeAt(0)>>>0;let o=t.colors(8);return r("span",{className:"caf-avatar",style:{background:o[n%o.length]}},a)}function Re(e,t){if(e.title)return e.title(t);let a=e.fields.find(o=>!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"),n=a&&t[a.key];return n===""||n===void 0||n===null?"(untitled)":String(n)}function ze({spec:e,records:t}){if(!e.summary)return null;let a=e.summary(t)||[];return a.length?r("div",{className:"caf-block caf-output"},r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label||o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},C(n.value,n.format)))))):null}function Be({spec:e,ctx:t}){let a=e.label||"item",[n,o]=$("");A(()=>{(t.data.records||[]).some(l=>l&&!l.id)&&t.update(l=>{for(let d of l.records||[])d&&!d.id&&(d.id=le())})});let s=t.data.records.map(l=>P(e,l));e.sort&&(s=s.slice().sort(e.sort));let i=s.length,c=n.trim().toLowerCase();e.search&&c&&(s=s.filter(l=>e.fields.some(d=>String(l[d.key]??"").toLowerCase().includes(c))));function f(){let l={id:le(),...Me(e.fields)};e.items&&(l.items=[]),t.update(d=>{d.records=[...d.records,l]}),t.go("record",l.id)}return r("div",{className:"caf-block caf-list"},r("div",{className:"caf-toolbar"},r("span",{className:"caf-count"},e.search&&c?`${s.length} of ${i}`:`${i} ${a}${i===1?"":"s"}`),r("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:f},`Add ${a}`)),e.search?r("input",{className:"caf-search",value:n,placeholder:`Search ${a}s\u2026`,"aria-label":"Search",onChange:l=>o(l.target.value)}):null,e.search&&c&&s.length===0&&i>0?r("div",{className:"caf-empty"},`Nothing matches "${n}".`):null,s.length===0?r("div",{className:"caf-empty"},e.empty||`No ${a}s yet. Add the first one.`):s.map(l=>r("div",{key:l.id,className:"caf-row-wrap"},r("button",{type:"button",className:e.avatar?"caf-row caf-row-avatar":"caf-row",onClick:()=>t.go("record",l.id)},e.avatar?r(Dt,{title:Re(e,l),ctx:t}):null,r("span",{className:"caf-row-main"},r("span",{className:"caf-row-title"},Re(e,l)),e.subtitle?r("span",{className:"caf-row-sub"},e.subtitle(l)):null)),e.actions?r("div",{className:"caf-row-actions"},e.actions.filter(d=>!d.when||d.when(l,t.viewerId)).map(d=>r("button",{key:d.label,type:"button",className:d.kind==="danger"?"caf-btn caf-btn-danger caf-btn-sm":"caf-btn caf-btn-sm",onClick:()=>t.update(p=>{let h=p.records.find(k=>k.id===l.id);h&&d.run(h,p,t.viewerId)})},d.label))):null)))}function Ie({spec:e,ctx:t,record:a}){let n=e.label||"item";function o(){t.update(s=>{s.records=s.records.filter(i=>i.id!==a.id)}),t.back()}return r("div",{className:"caf-block caf-fields"},r("div",{className:"caf-toolbar"},r("button",{type:"button",className:"caf-btn",onClick:t.back},"\u2039 Back"),r("button",{type:"button",className:"caf-btn caf-btn-danger",onClick:o},`Delete ${n}`)),e.fields.map(s=>r(z,{key:s.key,field:s,data:t.data,value:a[s.key],onChange:i=>t.update(c=>{let f=c.records.find(l=>l.id===a.id);f&&(f[s.key]=i)})})),e.items?r(Kt,{spec:e,ctx:t,record:a}):null,e.compute?r("div",{className:"caf-output-grid caf-computed"},Le(e).map(([s,i])=>{let c=P(e,a);return r("div",{key:s,className:"caf-stat"},r("span",{className:"caf-stat-label"},i.label||s),r("span",{className:"caf-stat-value"},C(c[s],i.format)))})):null)}function Kt({spec:e,ctx:t,record:a}){let n=e.items,o=n.label||"item";function s(c){t.update(f=>{let l=f.records.find(d=>d.id===a.id);l&&(Array.isArray(l.items)||(l.items=[]),c(l))})}let i=Array.isArray(a.items)?a.items:[];return r("div",{className:"caf-items"},r("div",{className:"caf-toolbar"},r("span",{className:"caf-count"},`${i.length} ${o}${i.length===1?"":"s"}`),r("button",{type:"button",className:"caf-btn caf-btn-sm",onClick:()=>s(c=>c.items.push({id:le(),...Me(n.fields)}))},`Add ${o}`)),i.length===0?r("div",{className:"caf-empty caf-empty-sm"},n.empty||`No ${o}s yet.`):i.map(c=>r("div",{key:c.id,className:"caf-item-row"},n.fields.map(f=>r(z,{key:f.key,field:f,data:t.data,value:c[f.key],onChange:l=>s(d=>{let p=d.items.find(h=>h.id===c.id);p&&(p[f.key]=l)})})),r("button",{type:"button",className:"caf-btn caf-btn-danger caf-btn-sm caf-item-remove","aria-label":`Remove ${o}`,onClick:()=>s(f=>{f.items=f.items.filter(l=>l.id!==c.id)})},"\u2715"))))}function Yt(e,t){return t==="records"?e:new Proxy(e,{get:(a,n,o)=>n==="records"?a[t]:Reflect.get(a,n,o),set:(a,n,o)=>Reflect.set(a,n==="records"?t:n,o),has:(a,n)=>n==="records"?t in a:n in a})}function Ve({spec:e,ctx:t}){let a=e.records,n=a.key||"records",o=Array.isArray(t.data[n])?t.data[n]:[],s="caf:rec:"+n,i=t.view.tabs?t.view.tabs[s]:void 0,c={...t,data:{...t.data,records:o},update:l=>t.update(d=>l(Yt(d,n))),go:(l,d)=>t.setTab(s,d),back:()=>t.setTab(s,void 0)},f=i?o.find(l=>l.id===i):null;return r("div",{className:"caf-records-block"},e.title?r("h2",{className:"caf-block-title"},e.title):null,f?r(Ie,{key:"d",spec:a,ctx:c,record:f}):[r(ze,{key:"s",spec:a,records:o.map(l=>P(a,l))}),r(Be,{key:"l",spec:a,ctx:c})])}function De({spec:e,ctx:t}){let a=e.records;if(t.view.screen==="record"){let n=t.data.records.find(o=>o.id===t.view.arg);if(n)return r("div",{className:"caf-panel caf-panel-single"},r(Ie,{spec:a,ctx:t,record:n}))}return r("div",{className:"caf-panel caf-panel-single"},r(ze,{spec:a,records:t.data.records.map(n=>P(a,n))}),r(Be,{spec:a,ctx:t}))}function Ft(e,t){return(e.fields||[]).some(a=>se(a,t[a.key])!==null)}function Ht({step:e,ctx:t}){let a=e.result(t.data)||[];return r("div",{className:"caf-block caf-output"},e.title?r("h2",{className:"caf-block-title"},e.title):null,r("div",{className:"caf-output-grid"},a.map((n,o)=>r("div",{key:n.label??o,className:n.big?"caf-stat caf-stat-big":"caf-stat"},r("span",{className:"caf-stat-label"},n.label),r("span",{className:"caf-stat-value"},C(n.value,n.format)),n.hint?r("small",{className:"caf-hint"},n.hint):null))),r("div",{className:"caf-step-nav"},r("button",{type:"button",className:"caf-btn",onClick:()=>t.setStep(0)},"Start over")))}function Ke({spec:e,ctx:t}){let a=e.steps,n=Math.min(Math.max(t.view.step||0,0),a.length-1),o=a[n],s=typeof o.result=="function",i=n===a.length-1;return r("div",{className:"caf-panel caf-panel-single"},r("div",{className:"caf-steps-progress"},r("span",{className:"caf-hint"},s?"Result":`Step ${n+1} of ${a.length}`),r("div",{className:"caf-bar-track"},r("div",{className:"caf-bar-fill caf-steps-fill",style:{width:`${(n+1)/a.length*100}%`}}))),s?r(Ht,{step:o,ctx:t}):r("div",{className:"caf-block caf-fields"},o.title?r("h2",{className:"caf-block-title"},o.title):null,o.text?r("p",{className:"caf-step-text"},typeof o.text=="function"?o.text(t.data):o.text):null,(o.fields||[]).map(c=>r(z,{key:c.key,field:c,data:t.data,value:t.data[c.key],onChange:f=>ie(t,c.key,c,f,(l,d)=>{l[c.key]=d})})),r("div",{className:"caf-step-nav"},n>0?r("button",{type:"button",className:"caf-btn",onClick:()=>t.setStep(n-1)},"\u2039 Back"):r("span"),i?null:r("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:Ft(o,t.data),onClick:()=>t.setStep(n+1)},"Next \u203A"))))}var Ye=["panel","records","steps","chat","workspace","documents"],Pt=["title","empty","wide","onSelect","subtitle","when","collapsible","fill","state","icon"],Fe=["logo","footer"],He=["image","title","subtitle"],Pe=["src","caption","fit","height"],Ue=["title","subtitle","theme","layout","blocks","records","steps","chat","data","shared","main","sidebar","libs","documents","machine","brand","mobile"],Je=["nav"],qe=["key","initial","states","events"],We=["after"],Xe=["seconds","then","do"],Ge=["from","do","then"],Qe=["label","title","blocks","empty","types"],Ze=["label","fields","title","subtitle","sort","summary","empty","search","compute","items","actions","avatar"],et=["label","fields","empty"];function J(e,t){for(let a of e||[]){if(!a||!a.key)throw new Error(`claude-artifact-framework: every field in ${t} needs a \`key\`.`);if(a.type!==void 0&&!oe.includes(a.type))throw new Error(`claude-artifact-framework: field "${a.key}" in ${t} has unknown type "${a.type}". Valid types: ${oe.join(", ")}.`);if(a.type==="select"&&a.options!==void 0&&!Array.isArray(a.options)&&typeof a.options!="function")throw new Error(`claude-artifact-framework: field "${a.key}" in ${t}: \`options\` must be an array or a function of data returning one.`)}}function rt(e,t){if(!e||typeof e.system!="string"&&typeof e.system!="function")throw new Error(`claude-artifact-framework: ${t} needs \`{ system: "..." }\` (a string or a function of data).`);let a=Object.keys(e).filter(n=>!ne.includes(n));if(a.length)throw new Error(`claude-artifact-framework: ${t} has unknown keys (${a.join(", ")}). Valid keys: ${ne.join(", ")}.`);for(let[n,o]of Object.entries(e.tools||{}))if(!o||typeof o.description!="string"||typeof o.run!="function")throw new Error(`claude-artifact-framework: chat tool "${n}" needs a \`description\` string and a \`run(input, ctx)\` function.`)}var tt=["label","run","when","kind"];function ot(e,t){if(!Array.isArray(e))throw new Error(`claude-artifact-framework: ${t} must be an array of { label, run }.`);e.forEach((a,n)=>{if(!a||typeof a.label!="string"||typeof a.run!="function")throw new Error(`claude-artifact-framework: ${t}[${n}] needs a \`label\` string and a \`run\` function.`);let o=Object.keys(a).filter(s=>!tt.includes(s));if(o.length)throw new Error(`claude-artifact-framework: ${t}[${n}] has unknown keys (${o.join(", ")}). Valid keys: ${tt.join(", ")}.`)})}function B(e){if(!Array.isArray(e))throw new Error("claude-artifact-framework: `blocks` must be an array.");e.forEach((t,a)=>{if(!t||typeof t!="object")throw new Error(`claude-artifact-framework: blocks[${a}] must be an object like { fields: [...] }.`);let n=Object.keys(t).filter(s=>!Pt.includes(s)),o=n.filter(s=>H.includes(s)||s==="tabs"||s==="records");if(o.length===0)throw new Error(`claude-artifact-framework: blocks[${a}] has no recognised block type (found: ${n.join(", ")||"nothing"}). Valid block types: ${[...H,"tabs","records"].join(", ")}.`);if(o.length>1)throw new Error(`claude-artifact-framework: blocks[${a}] declares more than one block type (${o.join(", ")}). Split them into separate entries of \`blocks\`.`);if(J(t.fields,`blocks[${a}]`),o[0]==="actions"&&ot(t.actions,`blocks[${a}].actions`),o[0]==="chat"&&rt(t.chat,`blocks[${a}].chat`),o[0]==="records"&&it(t.records,`blocks[${a}].records`,!0),o[0]==="banner"&&typeof t.banner=="object"&&t.banner!==null){let s=Object.keys(t.banner).filter(i=>!He.includes(i));if(s.length)throw new Error(`claude-artifact-framework: blocks[${a}].banner has unknown keys (${s.join(", ")}). Valid keys: ${He.join(", ")}.`)}if(o[0]==="image"&&typeof t.image=="object"&&t.image!==null){let s=Object.keys(t.image).filter(i=>!Pe.includes(i));if(s.length)throw new Error(`claude-artifact-framework: blocks[${a}].image has unknown keys (${s.join(", ")}). Valid keys: ${Pe.join(", ")}.`)}if(t.icon!==void 0&&typeof t.icon!="string")throw new Error(`claude-artifact-framework: blocks[${a}].icon must be a string (an emoji works best).`);if(o[0]==="tabs"){let s=t.tabs;if(!Array.isArray(s)||s.length===0)throw new Error(`claude-artifact-framework: blocks[${a}].tabs needs an array of { label, blocks: [...] }.`);s.forEach((i,c)=>{if(!i||typeof i.label!="string"||!Array.isArray(i.blocks)||i.blocks.length===0)throw new Error(`claude-artifact-framework: tabs[${c}] needs a \`label\` string and a non-empty \`blocks\` array.`);if(i.blocks.some(f=>f&&f.tabs))throw new Error("claude-artifact-framework: tabs cannot nest inside tabs.");B(i.blocks)})}if(t.when!==void 0&&typeof t.when!="function")throw new Error(`claude-artifact-framework: blocks[${a}].when must be a function of data returning true/false.`);if(t.fill!==void 0&&o[0]!=="custom")throw new Error(`claude-artifact-framework: \`fill\` is only valid on custom blocks \u2014 blocks[${a}] is "${o[0]}".`)})}function Ut(e){let t=Object.keys(e).filter(s=>!qe.includes(s));if(t.length)throw new Error(`claude-artifact-framework: machine has unknown keys (${t.join(", ")}). Valid keys: ${qe.join(", ")}.`);if(e.key!==void 0&&(typeof e.key!="string"||!e.key))throw new Error("claude-artifact-framework: machine.key must be a non-empty string (where the current state lives in data).");let a=Object.keys(e.states||{});if(!a.length)throw new Error("claude-artifact-framework: machine needs `states: { nombre: {...} }` with at least one state.");let n=(s,i)=>{if(!a.includes(s))throw new Error(`claude-artifact-framework: ${i} names unknown state "${s}". Valid states: ${a.join(", ")}.`)};if(typeof e.initial!="string")throw new Error('claude-artifact-framework: machine needs `initial: "..."` naming the starting state.');n(e.initial,"machine.initial");for(let[s,i]of Object.entries(e.states)){let c=Object.keys(i||{}).filter(f=>!We.includes(f));if(c.length)throw new Error(`claude-artifact-framework: machine.states.${s} has unknown keys (${c.join(", ")}). Valid keys: ${We.join(", ")}.`);if(i&&i.after!==void 0){let f=i.after,l=Object.keys(f||{}).filter(d=>!Xe.includes(d));if(l.length)throw new Error(`claude-artifact-framework: machine.states.${s}.after has unknown keys (${l.join(", ")}). Valid keys: ${Xe.join(", ")}.`);if(typeof f.seconds!="number"||f.seconds<=0)throw new Error(`claude-artifact-framework: machine.states.${s}.after needs \`seconds\` > 0.`);if(typeof f.then!="string")throw new Error(`claude-artifact-framework: machine.states.${s}.after needs \`then: "estado"\`.`);if(n(f.then,`machine.states.${s}.after.then`),f.do!==void 0&&typeof f.do!="function")throw new Error(`claude-artifact-framework: machine.states.${s}.after.do must be a function of data.`)}}if(!Object.keys(e.events||{}).length)throw new Error("claude-artifact-framework: machine needs `events: { nombre: {...} }` \u2014 ctx.send() is the only way to move it.");for(let[s,i]of Object.entries(e.events)){let c=Object.keys(i||{}).filter(f=>!Ge.includes(f));if(c.length)throw new Error(`claude-artifact-framework: machine.events.${s} has unknown keys (${c.join(", ")}). Valid keys: ${Ge.join(", ")}.`);if(i.from!==void 0&&i.from!=="*")for(let f of[].concat(i.from))n(f,`machine.events.${s}.from`);if(typeof i.then=="string")n(i.then,`machine.events.${s}.then`);else if(i.then!==void 0&&typeof i.then!="function")throw new Error(`claude-artifact-framework: machine.events.${s}.then must be a state name or a function of data returning one.`);if(i.do!==void 0&&typeof i.do!="function")throw new Error(`claude-artifact-framework: machine.events.${s}.do must be a function (data, payload).`)}}function st(e){for(let t of[e.blocks,e.main]){if(!Array.isArray(t))continue;let a=t.find(n=>n&&Array.isArray(n.tabs));if(a)return a}return null}function Jt(e){let t=Object.keys(e).filter(n=>!Ue.includes(n));if(t.length)throw new Error(`claude-artifact-framework: unknown top-level keys (${t.join(", ")}). Valid keys: ${Ue.join(", ")}.`);if(e.machine!==void 0&&Ut(e.machine),e.brand!==void 0){let n=Object.keys(e.brand||{}).filter(o=>!Fe.includes(o));if(n.length)throw new Error(`claude-artifact-framework: brand has unknown keys (${n.join(", ")}). Valid keys: ${Fe.join(", ")}.`);if(e.brand.logo!==void 0&&typeof e.brand.logo!="string")throw new Error("claude-artifact-framework: brand.logo must be a string \u2014 an emoji, an inline <svg>...</svg>, or an https URL. Omit it for an automatic monogram.")}if(e.libs!==void 0&&(!Array.isArray(e.libs)||e.libs.some(n=>typeof n!="string"||!/^https?:\/\//.test(n))))throw new Error("claude-artifact-framework: `libs` must be an array of https:// script URLs.");if(e.mobile!==void 0){let n=Object.keys(e.mobile||{}).filter(o=>!Je.includes(o));if(n.length)throw new Error(`claude-artifact-framework: mobile has unknown keys (${n.join(", ")}). Valid keys: ${Je.join(", ")}.`);if(e.mobile.nav!==void 0&&e.mobile.nav!=="bottom")throw new Error('claude-artifact-framework: mobile.nav only accepts "bottom" (omit `mobile` for the default top tab bar).');if(e.mobile.nav==="bottom"&&!st(e))throw new Error('claude-artifact-framework: mobile.nav: "bottom" moves a top-level `tabs` block\'s bar to the bottom of the phone screen \u2014 this spec has no top-level tabs block (in `blocks` or `main`) to move.')}let a=e.layout||"panel";if(!Ye.includes(a))throw new Error(`claude-artifact-framework: unknown layout "${a}". Valid layouts: ${Ye.join(", ")}.`);if(a==="steps"){let n=e.steps;if(!Array.isArray(n)||n.length===0)throw new Error('claude-artifact-framework: layout "steps" needs `steps: [...]` with at least one step.');let o=["title","text","fields","result"],s=new Set;return n.forEach((i,c)=>{if(!i||typeof i!="object")throw new Error(`claude-artifact-framework: steps[${c}] must be an object.`);let f=Object.keys(i).filter(l=>!o.includes(l));if(f.length)throw new Error(`claude-artifact-framework: steps[${c}] has unknown keys (${f.join(", ")}). Valid keys: ${o.join(", ")}.`);if(!i.fields&&!i.text&&!i.result)throw new Error(`claude-artifact-framework: steps[${c}] needs \`fields\`, \`text\`, or \`result\`.`);J(i.fields,`steps[${c}]`);for(let l of i.fields||[]){if(s.has(l.key))throw new Error(`claude-artifact-framework: field key "${l.key}" appears in more than one step \u2014 keys share one data pool and must be unique.`);s.add(l.key)}}),a}if(a==="chat")return rt(e.chat,"chat"),a;if(a==="workspace"){if(!Array.isArray(e.main)||e.main.length===0)throw new Error('claude-artifact-framework: layout "workspace" needs `main: [...]` (an array of blocks). `sidebar: [...]` is optional.');if(B(e.main),e.sidebar!==void 0){if(!Array.isArray(e.sidebar))throw new Error("claude-artifact-framework: workspace `sidebar` must be an array of blocks.");B(e.sidebar)}let n=O([...e.main,...e.sidebar||[]]);if(n.filter(s=>s&&s.chat).length>1)throw new Error("claude-artifact-framework: only one chat block per app \u2014 the conversation persists under data.chat and there is exactly one.");return fe(n),a}if(a==="documents"){let n=e.documents;if(!n||typeof n!="object"||!n.blocks&&!n.types)throw new Error('claude-artifact-framework: layout "documents" needs `documents: { blocks: [...] }` (every document repeats the same blocks) or `documents: { types: {...} }` (each document is one of several kinds).');if(n.blocks&&n.types)throw new Error("claude-artifact-framework: documents takes `blocks` (uniform documents) OR `types` (typed documents) \u2014 not both.");let o=Object.keys(n).filter(i=>!Qe.includes(i));if(o.length)throw new Error(`claude-artifact-framework: documents has unknown keys (${o.join(", ")}). Valid keys: ${Qe.join(", ")}.`);if(n.title!==void 0&&typeof n.title!="function")throw new Error("claude-artifact-framework: documents.title must be a function of the document's data returning the tab label.");let s=(i,c)=>{B(i);let f=O(i);if(f.filter(l=>l&&l.chat).length>1)throw new Error(`claude-artifact-framework: only one chat block per document (${c}) \u2014 each document's conversation persists under its own data.chat and there is exactly one.`);fe(f)};if(n.blocks){if(!Array.isArray(n.blocks)||n.blocks.length===0)throw new Error("claude-artifact-framework: documents.blocks must be a non-empty array of blocks.");s(n.blocks,"documents.blocks")}else{let i=Object.keys(n.types||{});if(!i.length)throw new Error("claude-artifact-framework: documents.types needs at least one type, e.g. `types: { nota: { blocks: [...] } }`.");for(let c of i){let f=n.types[c],l=["label","title","blocks","empty","icon"],d=Object.keys(f||{}).filter(p=>!l.includes(p));if(d.length)throw new Error(`claude-artifact-framework: documents.types.${c} has unknown keys (${d.join(", ")}). Valid keys: ${l.join(", ")}.`);if(!f||!Array.isArray(f.blocks)||f.blocks.length===0)throw new Error(`claude-artifact-framework: documents.types.${c} needs a non-empty \`blocks\` array.`);if(f.title!==void 0&&typeof f.title!="function")throw new Error(`claude-artifact-framework: documents.types.${c}.title must be a function of the document's data.`);s(f.blocks,`documents.types.${c}`)}}return a}if(a==="records"){if(it(e.records,"records",!1),e.blocks&&(B(e.blocks),O(e.blocks).some(n=>n&&n.records)))throw new Error("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.");return a}return B(e.blocks||[]),fe(O(e.blocks||[])),a}function it(e,t,a){if(!e||!Array.isArray(e.fields)||e.fields.length===0)throw new Error(`claude-artifact-framework: ${t} needs \`records: { fields: [...] }\` \u2014 the same field declarations the fields block uses.`);let n=a?[...Ze,"key"]:Ze,o=Object.keys(e).filter(i=>!n.includes(i));if(o.length)throw new Error(`claude-artifact-framework: ${t} has unknown keys (${o.join(", ")}). Valid keys: ${n.join(", ")}.`);if(a&&e.key!==void 0&&(typeof e.key!="string"||!e.key))throw new Error(`claude-artifact-framework: ${t}.key must be a non-empty string naming the collection in data.`);if(J(e.fields,t),e.fields.some(i=>i.type==="file")||e.items&&e.items.fields.some(i=>i.type==="file"))throw new Error("claude-artifact-framework: `file` fields live in the flat data pool (panel blocks or steps) \u2014 they are not supported inside records or items.");let s=new Set;for(let i of e.fields){if(i.key==="id")throw new Error('claude-artifact-framework: "id" is reserved on records \u2014 the framework assigns it.');if(s.has(i.key))throw new Error(`claude-artifact-framework: duplicate ${t} field key "${i.key}".`);s.add(i.key)}if(e.actions&&ot(e.actions,`${t}.actions`),e.items){let i=Object.keys(e.items).filter(c=>!et.includes(c));if(i.length)throw new Error(`claude-artifact-framework: ${t}.items has unknown keys (${i.join(", ")}). Valid keys: ${et.join(", ")}.`);if(!Array.isArray(e.items.fields)||e.items.fields.length===0)throw new Error(`claude-artifact-framework: ${t}.items needs \`fields: [...]\` \u2014 the same field declarations as everywhere else.`);J(e.items.fields,`${t}.items`);for(let c of e.items.fields)if(c.key==="id")throw new Error('claude-artifact-framework: "id" is reserved on items \u2014 the framework assigns it.');if(s.has("items")||e.fields.some(c=>c.key==="items"))throw new Error(`claude-artifact-framework: a ${t} field cannot be named "items" when \`items\` is declared \u2014 that key holds the child collection.`)}for(let[i,c]of Object.entries(e.compute||{})){if(s.has(i)||i==="id"||e.items&&i==="items")throw new Error(`claude-artifact-framework: compute key "${i}" collides with a field key \u2014 computed values are derived, never stored.`);if(typeof c!="function"&&typeof(c&&c.value)!="function")throw new Error(`claude-artifact-framework: compute "${i}" must be a function of the record, or { label, format, value: (r) => ... }.`)}}function fe(e){let t=new Set;for(let a of e){if(!a||!a.records)continue;let n=a.records.key||"records";if(t.has(n))throw new Error(`claude-artifact-framework: two records blocks share the collection key "${n}" \u2014 give each a distinct \`key\`.`);t.add(n)}}function O(e){let t=[];for(let a of e||[])if(t.push(a),a&&Array.isArray(a.tabs))for(let n of a.tabs)t.push(...O(n.blocks));return t}function qt(e){let t={...e.data||{}};if((e.layout||"panel")==="records"&&!Array.isArray(t.records)&&(t.records=[]),(e.layout||"panel")==="documents"&&!Array.isArray(t.docs)&&(t.docs=[]),e.machine){let o=e.machine.key||"fase";o in t||(t[o]=e.machine.initial)}let a=O([...e.blocks||[],...e.main||[],...e.sidebar||[]]);((e.layout||"panel")==="chat"||a.some(o=>o&&o.chat))&&!t.chat&&(t.chat={api:[],log:[]});for(let o of[...a,...e.steps||[]])for(let s of o.fields||[])s&&s.key!==void 0&&!(s.key in t)&&(t[s.key]=s.value!==void 0?s.value:s.type==="check"?!1:"");for(let o of a)if(o&&o.records){let s=o.records.key||"records";Array.isArray(t[s])||(t[s]=[])}return t}var de=null;function Wt(e){return de||(de=class extends e.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?r("div",{className:"caf-block caf-block-error"},r("strong",null,"This section failed to render"),r("code",null,String(this.state.error.message||this.state.error))):this.props.children}}),de}function Xt({spec:e,ctx:t,bottomNav:a}){let n=e.tabs,o=n.map(f=>f.label).join("|"),s=t.view.tabs?t.view.tabs[o]:void 0,i=Math.min(s===void 0?0:s,n.length-1),c=!!a&&t.viewport==="mobile";return r("div",{className:"caf-tabs"},r("div",{className:c?"caf-tabbar caf-tabbar-bottom":"caf-tabbar",role:"tablist"},n.map((f,l)=>r("button",{key:f.label,type:"button",role:"tab","aria-selected":l===i,className:l===i?"caf-tab caf-tab-active":"caf-tab",onClick:()=>t.setTab(o,l)},c&&f.icon?[r("span",{key:"i",className:"caf-tab-ico","aria-hidden":!0},f.icon),r("span",{key:"l",className:"caf-tab-lbl"},f.label)]:f.icon?`${f.icon} ${f.label}`:f.label))),r("div",{className:"caf-tabs-body"},n[i].blocks.map((f,l)=>r(q,{key:i+":"+l,block:f,ctx:t}))))}var Gt={...ce,tabs:Xt,records:Ve},Qt=[...H,"tabs","records"];function q({block:e,ctx:t}){if(typeof e.when=="function"&&!e.when(t.data)||e.state!==void 0&&t.machine&&t.data[t.machine.key||"fase"]!==e.state)return null;let a=t._navTabs!==void 0&&t._navTabs===e;e.icon&&typeof e.title=="string"&&(e={...e,title:`${e.icon} ${e.title}`});let n=Object.keys(e).find(f=>Qt.includes(f)),o=Gt[n],s=r(Wt(t.React),null,r(o,{spec:e.collapsible?{...e,title:void 0}:e,ctx:t,bottomNav:a}));if(!e.collapsible)return s;let i=typeof e.title=="string"&&e.title?e.title:n,c=t.view.collapsed&&i in t.view.collapsed?t.view.collapsed[i]:e.collapsible==="collapsed";return r("div",{className:"caf-collapse"},r("button",{type:"button",className:"caf-collapse-head","aria-expanded":!c,onClick:()=>t.toggleCollapsed(i,!c)},r("span",null,e.title||n),r("span",{className:c?"caf-chevron caf-chevron-closed":"caf-chevron"},"\u25BE")),c?null:r("div",{className:"caf-collapse-body"},s))}function ct({spec:e,ctx:t}){return r("div",{className:"caf-panel"},(e.blocks||[]).map((a,n)=>r("section",{key:n,className:a.wide||a.collapsible||a.banner?"caf-slot caf-slot-wide":"caf-slot"},r(q,{block:a,ctx:t}))))}function Zt({spec:e,ctx:t}){let a=t.view.screen==="record"&&(t.data.records||[]).some(n=>n.id===t.view.arg);return r("div",null,r(De,{spec:e,ctx:t}),!a&&Array.isArray(e.blocks)&&e.blocks.length?r("div",{className:"caf-panel caf-records-blocks"},e.blocks.map((n,o)=>r("section",{key:o,className:n.wide||n.collapsible||n.banner?"caf-slot caf-slot-wide":"caf-slot"},r(q,{block:n,ctx:t})))):null)}function ea({spec:e,ctx:t}){let a=n=>(n||[]).map((o,s)=>r("section",{key:s,className:"caf-ws-slot"},r(q,{block:o,ctx:t})));return r("div",{className:"caf-workspace"},r("div",{className:"caf-ws-main"},a(e.main)),e.sidebar&&e.sidebar.length?r("div",{className:"caf-ws-side"},a(e.sidebar)):null)}function ue(e){let t={};for(let a of O(e.blocks)){for(let n of a.fields||[])n&&n.key!==void 0&&!(n.key in t)&&(t[n.key]=n.value!==void 0?n.value:n.type==="check"?!1:"");if(a.records){let n=a.records.key||"records";Array.isArray(t[n])||(t[n]=[])}}return t}function ta(){return"d"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}var U="caf:doc";function aa(e,t,a){if(e.title)try{let n=e.title(t);if(n!=null&&n!=="")return String(n)}catch{}for(let n of O(e.blocks))for(let o of n.fields||[])if(!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"){let s=t[o.key];return s!==""&&s!==void 0&&s!==null?String(s):a||"(untitled)"}return a||"(untitled)"}function na({spec:e,ctx:t}){let a=e.documents,n=a.label||"document",o=Array.isArray(t.data.docs)?t.data.docs:[],s=a.types||null,i=s?Object.keys(s):[],c=b=>s?s[b.type]:a,f=b=>{let E=s[b]||{};return(E.icon?E.icon+" ":"")+(E.label||b)},[l,d]=$(!1),p=t.view.tabs?t.view.tabs[U]:void 0,h=o.find(b=>b.id===p)||o[0];function k(b){let E=s?s[b]:a,N={id:ta(),...s?{type:b}:{},data:ue(E)};t.update(T=>{T.docs=[...T.docs||[],N]}),t.setTab(U,N.id),d(!1)}function g(){if(!s)return k();if(i.length===1)return k(i[0]);d(b=>!b)}function x(b){let E=o.findIndex(N=>N.id===b);if(t.update(N=>{N.docs=N.docs.filter(T=>T.id!==b)}),delete t.files["doc:"+b],h&&h.id===b){let N=o[E+1]||o[E-1];N&&t.setTab(U,N.id)}}let y=s&&l?r("div",{className:"caf-doc-typemenu"},i.map(b=>r("button",{key:b,type:"button",className:"caf-btn caf-btn-sm",onClick:()=>k(b)},f(b)))):null;if(!h)return r("div",{className:"caf-panel caf-panel-single"},r("div",{className:"caf-block caf-empty"},r("p",null,a.empty||`No ${n}s yet. Create the first one.`),s?r("div",{className:"caf-doc-typemenu"},i.map(b=>r("button",{key:b,type:"button",className:"caf-btn caf-btn-primary",onClick:()=>k(b)},`New ${f(b)}`))):r("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:()=>k()},`New ${n}`)));let j=c(h);if(!j)return r("div",{className:"caf-documents"},r(at,{docs:o,active:h,dspec:a,types:s,close:x,onAdd:g,label:n,ctx:t}),y,r("div",{className:"caf-block caf-block-error"},r("strong",null,`This ${n}'s type "${h.type}" no longer exists`),r("code",null,`valid types: ${i.join(", ")}`)));let u={...ue(j),...h.data},w={...t,data:u,update:b=>t.update(E=>{let N=(E.docs||[]).find(T=>T.id===h.id);N&&b(N.data)}),files:t.files["doc:"+h.id]=t.files["doc:"+h.id]||{}};return r("div",{className:"caf-documents"},r(at,{docs:o,active:h,dspec:a,types:s,close:x,onAdd:g,label:n,ctx:t}),y,r(ct,{spec:{blocks:j.blocks},ctx:w}))}function at({docs:e,active:t,dspec:a,types:n,close:o,onAdd:s,label:i,ctx:c}){let f=l=>{let d=n?n[l.type]:a;if(!d)return l.type;let p={...ue(d),...l.data},h=n?d.label||l.type:void 0;return aa(d,p,h)};return r("div",{className:"caf-tabbar",role:"tablist"},e.map(l=>r("span",{key:l.id,className:"caf-doc-tab"},r("button",{type:"button",role:"tab","aria-selected":l.id===t.id,className:l.id===t.id?"caf-tab caf-tab-active":"caf-tab",onClick:()=>c.setTab(U,l.id)},f(l)),r("button",{type:"button",className:"caf-doc-close","aria-label":`Close ${i}`,onClick:()=>o(l.id)},"\u2715"))),r("button",{type:"button",className:"caf-tab caf-doc-add","aria-label":`New ${i}`,onClick:s},"+"))}var ra={panel:ct,records:Zt,steps:Ke,chat:Oe,workspace:ea,documents:na};function lt(e){return new Promise((t,a)=>{let n=document.querySelector(`script[src="${e}"]`);if(n){if(n.dataset.cafReady==="1")return t();n.addEventListener("load",t),n.addEventListener("error",()=>a(new Error(`failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.onload=()=>{o.dataset.cafReady="1",t()},o.onerror=()=>{let s=e.match(/^(https:\/\/cdn\.jsdelivr\.net\/npm\/(?:@[^/]+\/)?[^/]+)\/.+/);s&&s[1]!==e?lt(s[1]).then(t,()=>a(new Error(`failed to load ${e} (also tried package default ${s[1]})`))):a(new Error(`failed to load ${e}`))},document.head.appendChild(o)})}function nt(e){let t=e.documents?e.documents.blocks||Object.values(e.documents.types||{}).flatMap(a=>a.blocks||[]):[];return O([...e.blocks||[],...e.main||[],...e.sidebar||[],...t])}function oa(e,t,a,n){let o=e.events[a];if(!o)throw new Error(`claude-artifact-framework: unknown machine event "${a}". Valid events: ${Object.keys(e.events).join(", ")}.`);let s=e.key||"fase";t(i=>{let c=i[s],f=o.from===void 0?"*":o.from;if(f!=="*"&&![].concat(f).includes(c))return;o.do&&o.do(i,n);let l=typeof o.then=="function"?o.then(i):o.then;if(l!=null){if(!e.states[l])throw new Error(`claude-artifact-framework: machine event "${a}" resolved to unknown state "${l}". Valid states: ${Object.keys(e.states).join(", ")}.`);i[s]=l}})}function ft(e={}){let t=Jt(e);if(e.machine){let s=Object.keys(e.machine.states);for(let i of nt(e))if(i&&i.state!==void 0&&!s.includes(i.state))throw new Error(`claude-artifact-framework: a block declares state: "${i.state}" but the machine's states are: ${s.join(", ")}.`)}else for(let s of nt(e))if(s&&s.state!==void 0)throw new Error("claude-artifact-framework: `state:` on a block needs a `machine` declared at the top level.");let a=Ee(qt(e),{shared:!!e.shared}),n=F(e.theme&&e.theme.seed)+sa,o={};return function(){if(!V())throw new Error(`claude-artifact-framework: React not found. Hand it over once, before rendering:
29
29
 
30
30
  import React from "react";
31
31
  ArtifactKit.useReact(React);
32
- `);let[,i]=j(0),[c,f]=j(e.libs&&e.libs.length?"loading":"ready"),[l,d]=j(null);A(()=>{!e.libs||!e.libs.length||Promise.all(e.libs.map(it)).then(()=>f("ready"),m=>{d(String(m&&m.message||m)),f("error")})},[]),A(()=>{let m=a.subscribe(()=>i(y=>y+1));return a.isHydrated()&&i(y=>y+1),m},[]);let u=e.machine?a.getData()[e.machine.key||"fase"]:null;A(()=>{if(!e.machine||!a.isHydrated())return;let m=e.machine.states[u];if(!m||!m.after)return;let y=setTimeout(()=>{a.update(v=>{let b=e.machine.key||"fase";v[b]===u&&(m.after.do&&m.after.do(v),v[b]=m.after.then)})},m.after.seconds*1e3);return()=>clearTimeout(y)},[u,a.isHydrated()]);let p={React:we(),data:a.getData(),view:a.getView(),update:a.update,go:a.go,back:a.back,setStep:m=>a.setView({step:m}),files:o,viewerId:a.getViewerId(),setTab:(m,y)=>a.setView({tabs:{...a.getView().tabs,[m]:y}}),toggleCollapsed:(m,y)=>a.setView({collapsed:{...a.getView().collapsed,[m]:y}}),colors:m=>Ae(e.theme&&e.theme.seed,m),machine:e.machine||null,send:e.machine?(m,y)=>na(e.machine,a.update,m,y):()=>{throw new Error("claude-artifact-framework: ctx.send() needs a `machine` declared at the top level.")}},w=aa[t],g=e.brand&&e.brand.logo,N=e.brand?g&&g.trim().startsWith("<svg")?r("span",{className:"caf-logo caf-logo-svg",dangerouslySetInnerHTML:{__html:g}}):g&&/^https?:\/\//.test(g)?r("img",{className:"caf-logo",src:g,alt:""}):g?r("span",{className:"caf-logo caf-logo-emoji","aria-hidden":!0},g):r("span",{className:"caf-logo caf-logo-mono","aria-hidden":!0},(e.title||"?").split(/\s+/).map(m=>m[0]).filter(Boolean).slice(0,2).join("").toUpperCase()):null;return r("div",{className:`caf-root caf-layout-${t}`},r("style",{dangerouslySetInnerHTML:{__html:n}}),r("header",{className:e.brand?"caf-header caf-header-brand":"caf-header"},N,r("div",{className:"caf-header-text"},e.title?r("h1",null,e.title):null,e.subtitle?r("p",null,e.subtitle):null)),c==="error"?r("div",{className:"caf-block caf-block-error"},r("strong",null,"A library failed to load"),r("code",null,l)):!a.isHydrated()||c==="loading"?r("div",{className:"caf-block caf-loading"},c==="loading"?"Loading libraries\u2026":"Loading\u2026"):r(w,{spec:e,ctx:p}),e.brand&&e.brand.footer?r("footer",{className:"caf-footer"},e.brand.footer):null)}}var ra=`
32
+ `);let[,i]=$(0),[c,f]=$(()=>typeof window<"u"&&window.matchMedia("(max-width: 719px)").matches);A(()=>{let m=window.matchMedia("(max-width: 719px)"),u=w=>f(w.matches);return m.addEventListener("change",u),()=>m.removeEventListener("change",u)},[]);let[l,d]=$(e.libs&&e.libs.length?"loading":"ready"),[p,h]=$(null);A(()=>{!e.libs||!e.libs.length||Promise.all(e.libs.map(lt)).then(()=>d("ready"),m=>{h(String(m&&m.message||m)),d("error")})},[]),A(()=>{let m=a.subscribe(()=>i(u=>u+1));return a.isHydrated()&&i(u=>u+1),m},[]);let k=e.machine?a.getData()[e.machine.key||"fase"]:null;A(()=>{if(!e.machine||!a.isHydrated())return;let m=e.machine.states[k];if(!m||!m.after)return;let u=setTimeout(()=>{a.update(w=>{let b=e.machine.key||"fase";w[b]===k&&(m.after.do&&m.after.do(w),w[b]=m.after.then)})},m.after.seconds*1e3);return()=>clearTimeout(u)},[k,a.isHydrated()]);let g={React:we(),data:a.getData(),view:a.getView(),update:a.update,go:a.go,back:a.back,setStep:m=>a.setView({step:m}),files:o,viewerId:a.getViewerId(),setTab:(m,u)=>a.setView({tabs:{...a.getView().tabs,[m]:u}}),toggleCollapsed:(m,u)=>a.setView({collapsed:{...a.getView().collapsed,[m]:u}}),colors:m=>Ae(e.theme&&e.theme.seed,m),viewport:c?"mobile":"desktop",_navTabs:c&&e.mobile&&e.mobile.nav==="bottom"?st(e):null,machine:e.machine||null,send:e.machine?(m,u)=>oa(e.machine,a.update,m,u):()=>{throw new Error("claude-artifact-framework: ctx.send() needs a `machine` declared at the top level.")}},x=ra[t],y=e.brand&&e.brand.logo,j=e.brand?y&&y.trim().startsWith("<svg")?r("span",{className:"caf-logo caf-logo-svg",dangerouslySetInnerHTML:{__html:y}}):y&&/^https?:\/\//.test(y)?r("img",{className:"caf-logo",src:y,alt:""}):y?r("span",{className:"caf-logo caf-logo-emoji","aria-hidden":!0},y):r("span",{className:"caf-logo caf-logo-mono","aria-hidden":!0},(e.title||"?").split(/\s+/).map(m=>m[0]).filter(Boolean).slice(0,2).join("").toUpperCase()):null;return r("div",{className:`caf-root caf-layout-${t}${g._navTabs?" caf-has-bottomnav":""}`},r("style",{dangerouslySetInnerHTML:{__html:n}}),r("header",{className:e.brand?"caf-header caf-header-brand":"caf-header"},j,r("div",{className:"caf-header-text"},e.title?r("h1",null,e.title):null,e.subtitle?r("p",null,e.subtitle):null)),l==="error"?r("div",{className:"caf-block caf-block-error"},r("strong",null,"A library failed to load"),r("code",null,p)):!a.isHydrated()||l==="loading"?r("div",{className:"caf-block caf-loading"},l==="loading"?"Loading libraries\u2026":"Loading\u2026"):r(x,{spec:e,ctx:g}),e.brand&&e.brand.footer?r("footer",{className:"caf-footer"},e.brand.footer):null)}}var sa=`
33
33
  .caf-root {
34
34
  --caf-radius: 10px;
35
35
  --caf-control-radius: 7px; /* one radius for every control: buttons, inputs, rows */
@@ -273,5 +273,34 @@ Continue with this information. If you have everything you need, answer in natur
273
273
  .caf-block-error { border-color: var(--caf-danger); gap: 0.4rem; }
274
274
  .caf-block-error strong { font-size: 0.9rem; color: var(--caf-danger); }
275
275
  .caf-block-error code { font-size: 0.78rem; color: var(--caf-muted); word-break: break-word; }
276
- `;return pt(oa);})();
276
+ /* Never-clip guarantee: content inside a custom block that is wider than the
277
+ phone (column grids, week views) must scroll, not disappear off-screen. */
278
+ .caf-custom { overflow-x: auto; }
279
+ /* mobile.nav: "bottom" \u2014 the app-shell tab bar pinned to the thumb zone.
280
+ Tabs share the width evenly so every section stays visible; the root
281
+ reserves space so the bar never covers the end of the content. */
282
+ .caf-has-bottomnav { padding-bottom: 76px; }
283
+ .caf-tabbar-bottom {
284
+ position: fixed; bottom: 0; left: 0; right: 0; z-index: 40;
285
+ gap: 0; margin: 0; overflow-x: visible;
286
+ background: var(--caf-surface); border-top: 1px solid var(--caf-border); border-bottom: none;
287
+ padding: 0.25rem 0.4rem calc(0.3rem + env(safe-area-inset-bottom, 0px));
288
+ box-shadow: 0 -1px 6px rgba(0, 0, 0, 0.07);
289
+ }
290
+ .caf-tabbar-bottom .caf-tab {
291
+ flex: 1 1 0; min-width: 0; min-height: 48px;
292
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
293
+ gap: 0.15rem; padding: 0.25rem 0.2rem; margin-bottom: 0;
294
+ font-size: 0.66rem; border-bottom: none;
295
+ overflow: hidden; text-overflow: ellipsis;
296
+ }
297
+ .caf-tabbar-bottom .caf-tab-ico { font-size: 1.25rem; line-height: 1; }
298
+ .caf-tabbar-bottom .caf-tab-lbl { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
299
+ .caf-tabbar-bottom .caf-tab-active, .caf-tabbar-bottom .caf-tab-active:hover { border-bottom-color: transparent; }
300
+ /* Touch devices get tappable framework controls regardless of the spec. */
301
+ @media (pointer: coarse) {
302
+ .caf-btn, .caf-tab, .caf-field input, .caf-field select { min-height: 44px; }
303
+ .caf-btn-sm, .caf-doc-close, .caf-item-remove { min-height: 40px; }
304
+ }
305
+ `;return ht(ia);})();
277
306
  //# sourceMappingURL=index.global.js.map