claude-artifact-framework 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.esm.js +19 -9
- package/dist/index.esm.js.map +2 -2
- package/dist/index.global.js +7 -7
- package/dist/index.global.js.map +2 -2
- package/package.json +1 -1
- package/src/chat.js +19 -9
package/dist/index.global.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
var ArtifactKit=(()=>{var P=Object.defineProperty;var
|
|
1
|
+
var ArtifactKit=(()=>{var P=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var je=Object.getOwnPropertyNames;var Oe=Object.prototype.hasOwnProperty;var Re=(e,a)=>{for(var t in a)P(e,t,{get:a[t],enumerable:!0})},Ae=(e,a,t,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let o of je(a))!Oe.call(e,o)&&o!==t&&P(e,o,{get:()=>a[o],enumerable:!(r=Te(a,o))||r.enumerable});return e};var Le=e=>Ae(P({},"__esModule",{value:!0}),e);var ht={};Re(ht,{contrast:()=>J,createApp:()=>$e,createPersistedStore:()=>ne,createSharedStore:()=>oe,createStore:()=>re,hasReact:()=>A,palette:()=>U,storage:()=>k,themeCss:()=>D,useReact:()=>se});function O(){return typeof window<"u"&&typeof window.storage=="object"&&window.storage!==null}function te(e){return{async get(a,t=void 0){if(!O())return t;try{let r=await window.storage.get(a,e);if(r?.value===void 0||r?.value===null)return t;try{return JSON.parse(r.value)}catch{return r.value}}catch{return t}},async set(a,t,{raw:r=!1}={}){if(!O())throw new Error("window.storage is not available (is this a Code Artifact rather than a published Chat Artifact?)");let o=r?t:JSON.stringify(t);if(typeof o!="string")throw new Error("window.storage only accepts strings \u2014 the value must be JSON-serializable");return window.storage.set(a,o,e)},async delete(a){if(O())try{await window.storage.delete(a,e)}catch{}},async list(a){if(!O())return[];try{return(await window.storage.list(a,e))?.keys||[]}catch{return[]}}}}var k={...te(!1),shared:te(!0),available:O};function I(e){let a=e,t=new Set;function r(){return a}function o(s){a=typeof s=="function"?s(a):s,t.forEach(i=>i(a))}function c(s){return t.add(s),()=>t.delete(s)}return{get:r,set:o,subscribe:c}}function ae(e,a){let t;return(...r)=>{clearTimeout(t),t=setTimeout(()=>e(...r),a)}}function re(e){return I(e)}function ne(e,a,{debounceMs:t=300}={}){let r=I(a),o=ae(s=>k.set(e,s),t),c=k.get(e,a).then(s=>r.set(s));return r.subscribe(o),{...r,ready:c}}function oe(e,a,{pollMs:t=2e3,debounceMs:r=300}={}){let o=I(a),c=ae(u=>k.shared.set(e,u),r),s=!1;o.subscribe(u=>{s||c(u)});async function i(){let u=await k.shared.get(e,a);JSON.stringify(u)!==JSON.stringify(o.get())&&(s=!0,o.set(u),s=!1)}let l=i(),f=setInterval(i,t);return{...o,ready:l,stop:()=>clearInterval(f)}}var T=typeof globalThis<"u"?globalThis.React:void 0;function se(e){return T=e,e}function A(){return!!T}function ce(){return j()}function j(){if(!T)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
|
|
5
|
+
`);return T}var n=(...e)=>j().createElement(...e),x=(...e)=>j().useState(...e),E=(...e)=>j().useEffect(...e);var ie=(...e)=>j().useRef(...e),vt=T&&T.Component||class{render(){return j()}};var Y="caf:data",le="caf:view",fe={screen:null,arg:null,stack:[],step:0,selected:null};function L(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function H(e,a){if(!L(e)||!L(a))return a===void 0?e:a;let t={...e};for(let r of Object.keys(a))t[r]=L(e[r])?H(e[r],a[r]):a[r];return t}function ue(e,a){let t;return(...r)=>{clearTimeout(t),t=setTimeout(()=>e(...r),a)}}function de(e,{debounceMs:a=400,shared:t=!1,pollMs:r=2500}={}){let o=t?k.shared:k,c=K(e),s={...fe},i=!1,l=0,f=0,u=new Set,m=!1;function y(){m||(m=!0,Promise.resolve().then(()=>{m=!1;for(let d of u)d()}))}let g=ue(()=>{let d=l;Promise.resolve(o.set(Y,c)).then(()=>{f=Math.max(f,d)}).catch(()=>{})},a),h=ue(()=>k.set(le,s),a);t&&setInterval(async()=>{if(!(!i||l>f))try{let d=await o.get(Y,void 0);d!==void 0&&JSON.stringify(d)!==JSON.stringify(c)&&(c=H(e,d),y())}catch{}},r);let w=(async()=>{let[d,b]=await Promise.all([o.get(Y,void 0),k.get(le,void 0)]);d!==void 0&&(c=H(e,d)),b!==void 0&&(s={...fe,...b}),i=!0,y()})();function C(d){let b=d(c);b!==void 0&&(c=b),c={...c},l++,g(),y()}function v(d){s={...s,...d},h(),y()}return{ready:w,isHydrated:()=>i,getData:()=>c,getView:()=>s,update:C,setView:v,go(d,b){v({stack:[...s.stack,{screen:s.screen,arg:s.arg}],screen:d,arg:b})},back(){let d=s.stack.slice(),b=d.pop()||{screen:null,arg:null};v({stack:d,screen:b.screen,arg:b.arg})},subscribe(d){return u.add(d),()=>u.delete(d)}}}function K(e){if(Array.isArray(e))return e.map(K);if(L(e)){let a={};for(let t of Object.keys(e))a[t]=K(e[t]);return a}return e}function $(e,a,t){return Math.min(t,Math.max(a,e))}function _(e){let a=String(e).replace("#","").trim();a.length===3&&(a=a.split("").map(r=>r+r).join(""));let t=parseInt(a,16);return Number.isFinite(t)?[t>>16&255,t>>8&255,t&255]:[59,110,246]}function Me(e){return"#"+e.map(a=>$(Math.round(a),0,255).toString(16).padStart(2,"0")).join("")}function pe([e,a,t]){e/=255,a/=255,t/=255;let r=Math.max(e,a,t),o=Math.min(e,a,t),c=(r+o)/2,s=r-o,i=0,l=0;return s&&(l=c>.5?s/(2-r-o):s/(r+o),r===e?i=(a-t)/s+(a<t?6:0):r===a?i=(t-e)/s+2:i=(e-a)/s+4,i/=6),[i*360,l*100,c*100]}function _e(e,a,t){if(e=(e%360+360)%360/360,a=$(a,0,100)/100,t=$(t,0,100)/100,!a)return[t*255,t*255,t*255];let r=t<.5?t*(1+a):t+a-t*a,o=2*t-r,c=s=>(s<0&&(s+=1),s>1&&(s-=1),s<1/6?o+(r-o)*6*s:s<1/2?r:s<2/3?o+(r-o)*(2/3-s)*6:o);return[c(e+1/3)*255,c(e)*255,c(e-1/3)*255]}function p(e,a,t){return Me(_e(e,a,t))}function me(e){let a=e.map(t=>(t/=255,t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)));return .2126*a[0]+.7152*a[1]+.0722*a[2]}function J(e,a){let t=me(_(e)),r=me(_(a));return(Math.max(t,r)+.05)/(Math.min(t,r)+.05)}function S(e,a,t,r,o,c){for(let s=o;s>=4&&s<=96;s+=c){let i=p(e,a,s);if(J(i,t)>=r)return i}return p(e,a,c<0?24:82)}function U(e="#3b6ef6"){let[a,t]=pe(_(e)),r=$(t,30,88),o=$(r*.1,3,9),c=p(a,o*.4,100),s=p(a,o*1.4,13);return{light:{bg:p(a,o,96.5),surface:c,sunken:p(a,o,93),border:p(a,o,86),text:p(a,o*1.6,11),muted:p(a,o*1.2,41),accent:S(a,r,"#ffffff",4.5,54,-2),accentText:"#ffffff",danger:S(2,68,"#ffffff",4.5,54,-2),ok:S(148,62,"#ffffff",4.5,44,-2),warn:S(38,88,"#ffffff",4.5,44,-2)},dark:{bg:p(a,o*1.5,9),surface:s,sunken:p(a,o*1.5,7),border:p(a,o*1.3,24),text:p(a,o*.6,95),muted:p(a,o*.8,66),accent:S(a,$(r,40,80),s,4.5,62,2),accentText:p(a,o*2,8),danger:S(2,70,s,4.5,62,2),ok:S(148,55,s,4.5,62,2),warn:S(38,80,s,4.5,62,2)}}}function M(e){return Object.entries(e).map(([a,t])=>`--caf-${a}: ${t};`).join("")}function D(e){let a=U(e);return`
|
|
6
6
|
:root { ${M(a.light)} }
|
|
7
7
|
@media (prefers-color-scheme: dark) { :root { ${M(a.dark)} } }
|
|
8
8
|
:root[data-theme="dark"] { ${M(a.dark)} }
|
|
9
9
|
:root[data-theme="light"] { ${M(a.light)} }
|
|
10
|
-
`}function ge(e,a){let[t,r]=pe(_(e||"#3b6ef6")),o=$(r,45,70);return Array.from({length:a},(c,s)=>p((t+s*137.5)%360,o,52))}var q=["text","textarea","number","money","percent","check","date","select"];function N(e,a){if(e==null||e==="")return"\u2014";let t=Number(e);switch(a){case"money":return Number.isFinite(t)?t.toLocaleString(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2}):String(e);case"percent":return Number.isFinite(t)?`${t.toLocaleString(void 0,{maximumFractionDigits:2})}%`:String(e);case"number":return Number.isFinite(t)?t.toLocaleString(void 0,{maximumFractionDigits:2}):String(e);case"date":return e instanceof Date?e.toLocaleDateString():String(e);default:return String(e)}}function W(e,a){if(e.required&&(a===""||a===null||a===void 0))return"Required";if(a===""||a===null||a===void 0)return null;if(e.type==="number"||e.type==="money"||e.type==="percent"){let t=Number(a);if(!Number.isFinite(t))return"Must be a number";if(e.min!==void 0&&t<e.min)return`Must be at least ${e.min}`;if(e.max!==void 0&&t>e.max)return`Must be at most ${e.max}`}return null}function R({field:e,value:a,onChange:t}){let r=W(e,a),o=`caf-f-${e.key}`,c=e.type==="number"||e.type==="money"||e.type==="percent";if(e.type==="check")return n("label",{className:"caf-check"},n("input",{id:o,type:"checkbox",checked:!!a,onChange:l=>t(l.target.checked)}),n("span",null,e.label||e.key));let s={id:o,value:a??"","aria-invalid":r?"true":void 0,onChange:l=>t(c?De(l.target.value):l.target.value)},i;return e.type==="textarea"?i=n("textarea",{...s,rows:e.rows||3}):e.type==="select"?i=n("select",s,n("option",{value:""},e.placeholder||"Select\u2026"),(e.options||[]).map(l=>{let f=typeof l=="string"?l:l.value,u=typeof l=="string"?l:l.label;return n("option",{key:f,value:f},u)})):i=n("input",{...s,type:e.type==="date"?"date":c?"number":"text",min:e.min,max:e.max,step:e.step||(e.type==="money"||e.type==="percent"?"any":void 0),placeholder:e.placeholder}),n("div",{className:"caf-field"},n("label",{htmlFor:o},e.label||e.key),i,e.hint&&!r?n("small",{className:"caf-hint"},e.hint):null,r?n("small",{className:"caf-error"},r):null)}function De(e){if(e==="")return"";let a=Number(e);return Number.isFinite(a)?a:e}function ze({spec:e,ctx:a}){let t=e.fields||[];return n("div",{className:"caf-block caf-fields"},e.title?n("h2",{className:"caf-block-title"},e.title):null,t.map(r=>n(R,{key:r.key,field:r,value:a.data[r.key],onChange:o=>a.update(c=>{c[r.key]=o})})))}function Be({spec:e,ctx:a}){let t=typeof e.output=="function"?e.output(a.data):e.output||[];return t.length?n("div",{className:"caf-block caf-output"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label||o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)),r.hint?n("small",{className:"caf-hint"},r.hint):null)))):n("div",{className:"caf-block caf-empty"},e.empty||"Nothing to show yet.")}function Ve({spec:e,ctx:a}){let t=typeof e.text=="function"?e.text(a.data):e.text;return n("div",{className:"caf-block caf-text"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("p",null,t))}function Fe({spec:e,ctx:a}){let t=(typeof e.list=="function"?e.list(a.data):e.list)||[];if(!t.length)return n("div",{className:"caf-block caf-empty"},e.empty||"Nothing here yet.");let r=e.title||(o=>o.title??o.name??o.label??String(o));return n("div",{className:"caf-block caf-list"},t.map((o,c)=>n("button",{key:o.id??c,className:"caf-row",type:"button",onClick:e.onSelect?()=>e.onSelect(o,a):void 0},n("span",{className:"caf-row-title"},r(o)),e.subtitle?n("span",{className:"caf-row-sub"},e.subtitle(o)):null)))}var he=["bar","line","donut"];function Pe({spec:e,ctx:a}){let t=typeof e.chart=="function"?e.chart(a.data):e.chart,r=t&&t.items||[];if(!r.length)return n("div",{className:"caf-block caf-empty"},e.empty||"No data to chart yet.");let o=t.type||"bar";if(!he.includes(o))throw new Error(`unknown chart type "${o}". Valid types: ${he.join(", ")}.`);let c=a.colors(r.length),s=o==="bar"?Ie(r,t,c):o==="line"?Ye(r,t):He(r,t,c);return n("div",{className:"caf-block caf-chart"},e.title?n("h2",{className:"caf-block-title"},e.title):null,s)}function Ie(e,a,t){let r=Math.max(...e.map(o=>Number(o.value)||0),0)||1;return n("div",{className:"caf-bars"},e.map((o,c)=>n("div",{key:o.label??c,className:"caf-bar-row"},n("span",{className:"caf-bar-label"},o.label),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill",style:{width:`${Math.max(2,(Number(o.value)||0)/r*100)}%`,background:t[c]}})),n("span",{className:"caf-bar-value"},N(o.value,a.format)))))}function Ye(e,a){let t=e.map(u=>Number(u.value)||0),r=Math.min(...t),c=Math.max(...t)-r||1,s=100,i=36,l=t.map((u,m)=>[t.length===1?s/2:m/(t.length-1)*s,i-3-(u-r)/c*(i-6)]),f=l[l.length-1];return n("div",{className:"caf-line"},n("svg",{viewBox:`0 0 ${s} ${i}`,className:"caf-line-svg",preserveAspectRatio:"none","aria-hidden":"true"},[.25,.5,.75].map(u=>n("line",{key:u,x1:0,x2:s,y1:i*u,y2:i*u,className:"caf-line-grid"})),n("polyline",{points:l.map(u=>u.join(",")).join(" "),className:"caf-line-path"}),n("circle",{cx:f[0],cy:f[1],r:1.6,className:"caf-line-dot"})),n("div",{className:"caf-line-meta"},n("span",{className:"caf-hint"},String(e[0].label??"")),n("span",{className:"caf-line-last"},N(t[t.length-1],a.format)),n("span",{className:"caf-hint"},String(e[e.length-1].label??""))))}function He(e,a,t){let r=e.reduce((i,l)=>i+(Number(l.value)||0),0)||1,o=15.9155,c=25,s=e.map((i,l)=>{let f=(Number(i.value)||0)/r*100,u=n("circle",{key:i.label??l,cx:21,cy:21,r:o,className:"caf-donut-seg",stroke:t[l],strokeDasharray:`${f} ${100-f}`,strokeDashoffset:c});return c-=f,u});return n("div",{className:"caf-donut"},n("svg",{viewBox:"0 0 42 42",className:"caf-donut-svg","aria-hidden":"true"},s),n("div",{className:"caf-donut-legend"},e.map((i,l)=>n("div",{key:i.label??l,className:"caf-legend-row"},n("span",{className:"caf-legend-swatch",style:{background:t[l]}}),n("span",{className:"caf-legend-label"},i.label),n("span",{className:"caf-legend-value"},N(i.value,a.format))))))}function Je({spec:e,ctx:a}){let t=e.timer||{},r=Math.max(1,Math.round((t.minutes||0)*60+(t.seconds||0))||300),[o,c]=x(r),[s,i]=x(!1);E(()=>{if(!s)return;let m=setInterval(()=>c(k=>Math.max(0,k-1)),1e3);return()=>clearInterval(m)},[s]),E(()=>{o===0&&s&&(i(!1),typeof t.onDone=="function"&&a.update(m=>t.onDone(m)))},[o,s]);let l=String(Math.floor(o/60)).padStart(2,"0"),f=String(o%60).padStart(2,"0"),u=o===0;return n("div",{className:"caf-block caf-timer"},e.title?n("h2",{className:"caf-block-title"},e.title):null,t.label?n("span",{className:"caf-hint"},t.label):null,n("div",{className:u?"caf-timer-time caf-timer-done":"caf-timer-time"},u?t.doneText||"Done!":`${l}:${f}`),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill caf-timer-fill",style:{width:`${o/r*100}%`}})),n("div",{className:"caf-timer-controls"},n("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:u,onClick:()=>i(m=>!m)},s?"Pause":"Start"),n("button",{type:"button",className:"caf-btn",onClick:()=>{i(!1),c(r)}},"Reset")))}function Ke({spec:e,ctx:a}){let t=e.custom(a);return typeof t=="string"?n("div",{className:"caf-block",dangerouslySetInnerHTML:{__html:t}}):n("div",{className:"caf-block"},t)}var Q={fields:ze,output:Be,text:Ve,list:Fe,chart:Pe,timer:Je,custom:Ke},z=Object.keys(Q);function be(e){return Object.entries(e.compute||{}).map(([a,t])=>[a,typeof t=="function"?{value:t}:t])}function X(e,a){if(!e.compute)return a;let t={...a};for(let[r,o]of be(e))try{t[r]=o.value(a)}catch{t[r]=void 0}return t}function Ue(e){let a={};for(let t of e)a[t.key]=t.value!==void 0?t.value:t.type==="check"?!1:"";return a}function qe(){return"r"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function We(e,a){if(e.title)return e.title(a);let t=e.fields.find(o=>!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"),r=t&&a[t.key];return r===""||r===void 0||r===null?"(untitled)":String(r)}function Qe({spec:e,records:a}){if(!e.summary)return null;let t=e.summary(a)||[];return t.length?n("div",{className:"caf-block caf-output"},n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label||o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)))))):null}function Xe({spec:e,ctx:a}){let t=e.label||"item",[r,o]=x(""),c=a.data.records.map(f=>X(e,f));e.sort&&(c=c.slice().sort(e.sort));let s=c.length,i=r.trim().toLowerCase();e.search&&i&&(c=c.filter(f=>e.fields.some(u=>String(f[u.key]??"").toLowerCase().includes(i))));function l(){let f={id:qe(),...Ue(e.fields)};a.update(u=>{u.records=[...u.records,f]}),a.go("record",f.id)}return n("div",{className:"caf-block caf-list"},n("div",{className:"caf-toolbar"},n("span",{className:"caf-count"},e.search&&i?`${c.length} of ${s}`:`${s} ${t}${s===1?"":"s"}`),n("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:l},`Add ${t}`)),e.search?n("input",{className:"caf-search",value:r,placeholder:`Search ${t}s\u2026`,"aria-label":"Search",onChange:f=>o(f.target.value)}):null,e.search&&i&&c.length===0&&s>0?n("div",{className:"caf-empty"},`Nothing matches "${r}".`):null,c.length===0?n("div",{className:"caf-empty"},e.empty||`No ${t}s yet. Add the first one.`):c.map(f=>n("button",{key:f.id,type:"button",className:"caf-row",onClick:()=>a.go("record",f.id)},n("span",{className:"caf-row-title"},We(e,f)),e.subtitle?n("span",{className:"caf-row-sub"},e.subtitle(f)):null)))}function Ge({spec:e,ctx:a,record:t}){let r=e.label||"item";function o(){a.update(c=>{c.records=c.records.filter(s=>s.id!==t.id)}),a.back()}return n("div",{className:"caf-block caf-fields"},n("div",{className:"caf-toolbar"},n("button",{type:"button",className:"caf-btn",onClick:a.back},"\u2039 Back"),n("button",{type:"button",className:"caf-btn caf-btn-danger",onClick:o},`Delete ${r}`)),e.fields.map(c=>n(R,{key:c.key,field:c,value:t[c.key],onChange:s=>a.update(i=>{let l=i.records.find(f=>f.id===t.id);l&&(l[c.key]=s)})})),e.compute?n("div",{className:"caf-output-grid caf-computed"},be(e).map(([c,s])=>{let i=X(e,t);return n("div",{key:c,className:"caf-stat"},n("span",{className:"caf-stat-label"},s.label||c),n("span",{className:"caf-stat-value"},N(i[c],s.format)))})):null)}function ye({spec:e,ctx:a}){let t=e.records;if(a.view.screen==="record"){let r=a.data.records.find(o=>o.id===a.view.arg);if(r)return n("div",{className:"caf-panel caf-panel-single"},n(Ge,{spec:t,ctx:a,record:r}))}return n("div",{className:"caf-panel caf-panel-single"},n(Qe,{spec:t,records:a.data.records.map(r=>X(t,r))}),n(Xe,{spec:t,ctx:a}))}function Ze(e,a){return(e.fields||[]).some(t=>W(t,a[t.key])!==null)}function et({step:e,ctx:a}){let t=e.result(a.data)||[];return n("div",{className:"caf-block caf-output"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label??o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)),r.hint?n("small",{className:"caf-hint"},r.hint):null))),n("div",{className:"caf-step-nav"},n("button",{type:"button",className:"caf-btn",onClick:()=>a.setStep(0)},"Start over")))}function ke({spec:e,ctx:a}){let t=e.steps,r=Math.min(Math.max(a.view.step||0,0),t.length-1),o=t[r],c=typeof o.result=="function",s=r===t.length-1;return n("div",{className:"caf-panel caf-panel-single"},n("div",{className:"caf-steps-progress"},n("span",{className:"caf-hint"},c?"Result":`Step ${r+1} of ${t.length}`),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill caf-steps-fill",style:{width:`${(r+1)/t.length*100}%`}}))),c?n(et,{step:o,ctx:a}):n("div",{className:"caf-block caf-fields"},o.title?n("h2",{className:"caf-block-title"},o.title):null,o.text?n("p",{className:"caf-step-text"},typeof o.text=="function"?o.text(a.data):o.text):null,(o.fields||[]).map(i=>n(R,{key:i.key,field:i,value:a.data[i.key],onChange:l=>a.update(f=>{f[i.key]=l})})),n("div",{className:"caf-step-nav"},r>0?n("button",{type:"button",className:"caf-btn",onClick:()=>a.setStep(r-1)},"\u2039 Back"):n("span"),s?null:n("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:Ze(o,a.data),onClick:()=>a.setStep(r+1)},"Next \u203A"))))}var G=["system","greeting","placeholder","tools","model","maxTokens"],tt="claude-sonnet-4-6",at=8;async function rt({model:e,maxTokens:a,system:t,messages:r,onText:o}){let c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e,max_tokens:a,system:t,messages:r,stream:!0})});if(!c.ok||!c.body){let u="";try{let m=await c.json();u=m&&m.error&&m.error.message||JSON.stringify(m)}catch{u=await c.text().catch(()=>"")}throw new Error(`HTTP ${c.status}${u?": "+u:""}`)}let s=c.body.getReader(),i=new TextDecoder,l="",f="";for(;;){let{done:u,value:m}=await s.read();if(u)break;f+=i.decode(m,{stream:!0});let k=f.split(`
|
|
11
|
-
`);f=
|
|
10
|
+
`}function ge(e,a){let[t,r]=pe(_(e||"#3b6ef6")),o=$(r,45,70);return Array.from({length:a},(c,s)=>p((t+s*137.5)%360,o,52))}var q=["text","textarea","number","money","percent","check","date","select"];function N(e,a){if(e==null||e==="")return"\u2014";let t=Number(e);switch(a){case"money":return Number.isFinite(t)?t.toLocaleString(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2}):String(e);case"percent":return Number.isFinite(t)?`${t.toLocaleString(void 0,{maximumFractionDigits:2})}%`:String(e);case"number":return Number.isFinite(t)?t.toLocaleString(void 0,{maximumFractionDigits:2}):String(e);case"date":return e instanceof Date?e.toLocaleDateString():String(e);default:return String(e)}}function W(e,a){if(e.required&&(a===""||a===null||a===void 0))return"Required";if(a===""||a===null||a===void 0)return null;if(e.type==="number"||e.type==="money"||e.type==="percent"){let t=Number(a);if(!Number.isFinite(t))return"Must be a number";if(e.min!==void 0&&t<e.min)return`Must be at least ${e.min}`;if(e.max!==void 0&&t>e.max)return`Must be at most ${e.max}`}return null}function R({field:e,value:a,onChange:t}){let r=W(e,a),o=`caf-f-${e.key}`,c=e.type==="number"||e.type==="money"||e.type==="percent";if(e.type==="check")return n("label",{className:"caf-check"},n("input",{id:o,type:"checkbox",checked:!!a,onChange:l=>t(l.target.checked)}),n("span",null,e.label||e.key));let s={id:o,value:a??"","aria-invalid":r?"true":void 0,onChange:l=>t(c?De(l.target.value):l.target.value)},i;return e.type==="textarea"?i=n("textarea",{...s,rows:e.rows||3}):e.type==="select"?i=n("select",s,n("option",{value:""},e.placeholder||"Select\u2026"),(e.options||[]).map(l=>{let f=typeof l=="string"?l:l.value,u=typeof l=="string"?l:l.label;return n("option",{key:f,value:f},u)})):i=n("input",{...s,type:e.type==="date"?"date":c?"number":"text",min:e.min,max:e.max,step:e.step||(e.type==="money"||e.type==="percent"?"any":void 0),placeholder:e.placeholder}),n("div",{className:"caf-field"},n("label",{htmlFor:o},e.label||e.key),i,e.hint&&!r?n("small",{className:"caf-hint"},e.hint):null,r?n("small",{className:"caf-error"},r):null)}function De(e){if(e==="")return"";let a=Number(e);return Number.isFinite(a)?a:e}function ze({spec:e,ctx:a}){let t=e.fields||[];return n("div",{className:"caf-block caf-fields"},e.title?n("h2",{className:"caf-block-title"},e.title):null,t.map(r=>n(R,{key:r.key,field:r,value:a.data[r.key],onChange:o=>a.update(c=>{c[r.key]=o})})))}function Be({spec:e,ctx:a}){let t=typeof e.output=="function"?e.output(a.data):e.output||[];return t.length?n("div",{className:"caf-block caf-output"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label||o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)),r.hint?n("small",{className:"caf-hint"},r.hint):null)))):n("div",{className:"caf-block caf-empty"},e.empty||"Nothing to show yet.")}function Ve({spec:e,ctx:a}){let t=typeof e.text=="function"?e.text(a.data):e.text;return n("div",{className:"caf-block caf-text"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("p",null,t))}function Fe({spec:e,ctx:a}){let t=(typeof e.list=="function"?e.list(a.data):e.list)||[];if(!t.length)return n("div",{className:"caf-block caf-empty"},e.empty||"Nothing here yet.");let r=e.title||(o=>o.title??o.name??o.label??String(o));return n("div",{className:"caf-block caf-list"},t.map((o,c)=>n("button",{key:o.id??c,className:"caf-row",type:"button",onClick:e.onSelect?()=>e.onSelect(o,a):void 0},n("span",{className:"caf-row-title"},r(o)),e.subtitle?n("span",{className:"caf-row-sub"},e.subtitle(o)):null)))}var he=["bar","line","donut"];function Pe({spec:e,ctx:a}){let t=typeof e.chart=="function"?e.chart(a.data):e.chart,r=t&&t.items||[];if(!r.length)return n("div",{className:"caf-block caf-empty"},e.empty||"No data to chart yet.");let o=t.type||"bar";if(!he.includes(o))throw new Error(`unknown chart type "${o}". Valid types: ${he.join(", ")}.`);let c=a.colors(r.length),s=o==="bar"?Ie(r,t,c):o==="line"?Ye(r,t):He(r,t,c);return n("div",{className:"caf-block caf-chart"},e.title?n("h2",{className:"caf-block-title"},e.title):null,s)}function Ie(e,a,t){let r=Math.max(...e.map(o=>Number(o.value)||0),0)||1;return n("div",{className:"caf-bars"},e.map((o,c)=>n("div",{key:o.label??c,className:"caf-bar-row"},n("span",{className:"caf-bar-label"},o.label),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill",style:{width:`${Math.max(2,(Number(o.value)||0)/r*100)}%`,background:t[c]}})),n("span",{className:"caf-bar-value"},N(o.value,a.format)))))}function Ye(e,a){let t=e.map(u=>Number(u.value)||0),r=Math.min(...t),c=Math.max(...t)-r||1,s=100,i=36,l=t.map((u,m)=>[t.length===1?s/2:m/(t.length-1)*s,i-3-(u-r)/c*(i-6)]),f=l[l.length-1];return n("div",{className:"caf-line"},n("svg",{viewBox:`0 0 ${s} ${i}`,className:"caf-line-svg",preserveAspectRatio:"none","aria-hidden":"true"},[.25,.5,.75].map(u=>n("line",{key:u,x1:0,x2:s,y1:i*u,y2:i*u,className:"caf-line-grid"})),n("polyline",{points:l.map(u=>u.join(",")).join(" "),className:"caf-line-path"}),n("circle",{cx:f[0],cy:f[1],r:1.6,className:"caf-line-dot"})),n("div",{className:"caf-line-meta"},n("span",{className:"caf-hint"},String(e[0].label??"")),n("span",{className:"caf-line-last"},N(t[t.length-1],a.format)),n("span",{className:"caf-hint"},String(e[e.length-1].label??""))))}function He(e,a,t){let r=e.reduce((i,l)=>i+(Number(l.value)||0),0)||1,o=15.9155,c=25,s=e.map((i,l)=>{let f=(Number(i.value)||0)/r*100,u=n("circle",{key:i.label??l,cx:21,cy:21,r:o,className:"caf-donut-seg",stroke:t[l],strokeDasharray:`${f} ${100-f}`,strokeDashoffset:c});return c-=f,u});return n("div",{className:"caf-donut"},n("svg",{viewBox:"0 0 42 42",className:"caf-donut-svg","aria-hidden":"true"},s),n("div",{className:"caf-donut-legend"},e.map((i,l)=>n("div",{key:i.label??l,className:"caf-legend-row"},n("span",{className:"caf-legend-swatch",style:{background:t[l]}}),n("span",{className:"caf-legend-label"},i.label),n("span",{className:"caf-legend-value"},N(i.value,a.format))))))}function Ke({spec:e,ctx:a}){let t=e.timer||{},r=Math.max(1,Math.round((t.minutes||0)*60+(t.seconds||0))||300),[o,c]=x(r),[s,i]=x(!1);E(()=>{if(!s)return;let m=setInterval(()=>c(y=>Math.max(0,y-1)),1e3);return()=>clearInterval(m)},[s]),E(()=>{o===0&&s&&(i(!1),typeof t.onDone=="function"&&a.update(m=>t.onDone(m)))},[o,s]);let l=String(Math.floor(o/60)).padStart(2,"0"),f=String(o%60).padStart(2,"0"),u=o===0;return n("div",{className:"caf-block caf-timer"},e.title?n("h2",{className:"caf-block-title"},e.title):null,t.label?n("span",{className:"caf-hint"},t.label):null,n("div",{className:u?"caf-timer-time caf-timer-done":"caf-timer-time"},u?t.doneText||"Done!":`${l}:${f}`),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill caf-timer-fill",style:{width:`${o/r*100}%`}})),n("div",{className:"caf-timer-controls"},n("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:u,onClick:()=>i(m=>!m)},s?"Pause":"Start"),n("button",{type:"button",className:"caf-btn",onClick:()=>{i(!1),c(r)}},"Reset")))}function Je({spec:e,ctx:a}){let t=e.custom(a);return typeof t=="string"?n("div",{className:"caf-block",dangerouslySetInnerHTML:{__html:t}}):n("div",{className:"caf-block"},t)}var Q={fields:ze,output:Be,text:Ve,list:Fe,chart:Pe,timer:Ke,custom:Je},z=Object.keys(Q);function be(e){return Object.entries(e.compute||{}).map(([a,t])=>[a,typeof t=="function"?{value:t}:t])}function X(e,a){if(!e.compute)return a;let t={...a};for(let[r,o]of be(e))try{t[r]=o.value(a)}catch{t[r]=void 0}return t}function Ue(e){let a={};for(let t of e)a[t.key]=t.value!==void 0?t.value:t.type==="check"?!1:"";return a}function qe(){return"r"+Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function We(e,a){if(e.title)return e.title(a);let t=e.fields.find(o=>!o.type||o.type==="text"||o.type==="textarea"||o.type==="select"),r=t&&a[t.key];return r===""||r===void 0||r===null?"(untitled)":String(r)}function Qe({spec:e,records:a}){if(!e.summary)return null;let t=e.summary(a)||[];return t.length?n("div",{className:"caf-block caf-output"},n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label||o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)))))):null}function Xe({spec:e,ctx:a}){let t=e.label||"item",[r,o]=x(""),c=a.data.records.map(f=>X(e,f));e.sort&&(c=c.slice().sort(e.sort));let s=c.length,i=r.trim().toLowerCase();e.search&&i&&(c=c.filter(f=>e.fields.some(u=>String(f[u.key]??"").toLowerCase().includes(i))));function l(){let f={id:qe(),...Ue(e.fields)};a.update(u=>{u.records=[...u.records,f]}),a.go("record",f.id)}return n("div",{className:"caf-block caf-list"},n("div",{className:"caf-toolbar"},n("span",{className:"caf-count"},e.search&&i?`${c.length} of ${s}`:`${s} ${t}${s===1?"":"s"}`),n("button",{type:"button",className:"caf-btn caf-btn-primary",onClick:l},`Add ${t}`)),e.search?n("input",{className:"caf-search",value:r,placeholder:`Search ${t}s\u2026`,"aria-label":"Search",onChange:f=>o(f.target.value)}):null,e.search&&i&&c.length===0&&s>0?n("div",{className:"caf-empty"},`Nothing matches "${r}".`):null,c.length===0?n("div",{className:"caf-empty"},e.empty||`No ${t}s yet. Add the first one.`):c.map(f=>n("button",{key:f.id,type:"button",className:"caf-row",onClick:()=>a.go("record",f.id)},n("span",{className:"caf-row-title"},We(e,f)),e.subtitle?n("span",{className:"caf-row-sub"},e.subtitle(f)):null)))}function Ge({spec:e,ctx:a,record:t}){let r=e.label||"item";function o(){a.update(c=>{c.records=c.records.filter(s=>s.id!==t.id)}),a.back()}return n("div",{className:"caf-block caf-fields"},n("div",{className:"caf-toolbar"},n("button",{type:"button",className:"caf-btn",onClick:a.back},"\u2039 Back"),n("button",{type:"button",className:"caf-btn caf-btn-danger",onClick:o},`Delete ${r}`)),e.fields.map(c=>n(R,{key:c.key,field:c,value:t[c.key],onChange:s=>a.update(i=>{let l=i.records.find(f=>f.id===t.id);l&&(l[c.key]=s)})})),e.compute?n("div",{className:"caf-output-grid caf-computed"},be(e).map(([c,s])=>{let i=X(e,t);return n("div",{key:c,className:"caf-stat"},n("span",{className:"caf-stat-label"},s.label||c),n("span",{className:"caf-stat-value"},N(i[c],s.format)))})):null)}function ye({spec:e,ctx:a}){let t=e.records;if(a.view.screen==="record"){let r=a.data.records.find(o=>o.id===a.view.arg);if(r)return n("div",{className:"caf-panel caf-panel-single"},n(Ge,{spec:t,ctx:a,record:r}))}return n("div",{className:"caf-panel caf-panel-single"},n(Qe,{spec:t,records:a.data.records.map(r=>X(t,r))}),n(Xe,{spec:t,ctx:a}))}function Ze(e,a){return(e.fields||[]).some(t=>W(t,a[t.key])!==null)}function et({step:e,ctx:a}){let t=e.result(a.data)||[];return n("div",{className:"caf-block caf-output"},e.title?n("h2",{className:"caf-block-title"},e.title):null,n("div",{className:"caf-output-grid"},t.map((r,o)=>n("div",{key:r.label??o,className:r.big?"caf-stat caf-stat-big":"caf-stat"},n("span",{className:"caf-stat-label"},r.label),n("span",{className:"caf-stat-value"},N(r.value,r.format)),r.hint?n("small",{className:"caf-hint"},r.hint):null))),n("div",{className:"caf-step-nav"},n("button",{type:"button",className:"caf-btn",onClick:()=>a.setStep(0)},"Start over")))}function ke({spec:e,ctx:a}){let t=e.steps,r=Math.min(Math.max(a.view.step||0,0),t.length-1),o=t[r],c=typeof o.result=="function",s=r===t.length-1;return n("div",{className:"caf-panel caf-panel-single"},n("div",{className:"caf-steps-progress"},n("span",{className:"caf-hint"},c?"Result":`Step ${r+1} of ${t.length}`),n("div",{className:"caf-bar-track"},n("div",{className:"caf-bar-fill caf-steps-fill",style:{width:`${(r+1)/t.length*100}%`}}))),c?n(et,{step:o,ctx:a}):n("div",{className:"caf-block caf-fields"},o.title?n("h2",{className:"caf-block-title"},o.title):null,o.text?n("p",{className:"caf-step-text"},typeof o.text=="function"?o.text(a.data):o.text):null,(o.fields||[]).map(i=>n(R,{key:i.key,field:i,value:a.data[i.key],onChange:l=>a.update(f=>{f[i.key]=l})})),n("div",{className:"caf-step-nav"},r>0?n("button",{type:"button",className:"caf-btn",onClick:()=>a.setStep(r-1)},"\u2039 Back"):n("span"),s?null:n("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:Ze(o,a.data),onClick:()=>a.setStep(r+1)},"Next \u203A"))))}var G=["system","greeting","placeholder","tools","model","maxTokens"],tt="claude-sonnet-4-6",at=8;async function rt({model:e,maxTokens:a,system:t,messages:r,onText:o}){let c=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e,max_tokens:a,system:t,messages:r,stream:!0})});if(!c.ok||!c.body){let u="";try{let m=await c.json();u=m&&m.error&&m.error.message||JSON.stringify(m)}catch{u=await c.text().catch(()=>"")}throw new Error(`HTTP ${c.status}${u?": "+u:""}`)}let s=c.body.getReader(),i=new TextDecoder,l="",f="";for(;;){let{done:u,value:m}=await s.read();if(u)break;f+=i.decode(m,{stream:!0});let y=f.split(`
|
|
11
|
+
`);f=y.pop();for(let g of y)if(g.startsWith("data: "))try{let h=JSON.parse(g.slice(6));h.type==="content_block_delta"&&h.delta&&h.delta.text&&(l+=h.delta.text,o&&o(l))}catch{}}return l}function nt(e){let a=e.match(/```tool_call\s*\n?([\s\S]*?)```/);if(!a)return null;try{let t=JSON.parse(a[1]);return Array.isArray(t)&&t.length?t:null}catch{return null}}function we(e){return e.replace(/```tool_call\s*\n?[\s\S]*?```/,"").trim()}function ot(e){return`
|
|
12
12
|
|
|
13
13
|
You have tools available:
|
|
14
14
|
${Object.entries(e).map(([t,r])=>`- ${t}: ${r.description}
|
|
@@ -21,11 +21,11 @@ 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 st(e,a,t){return e.map(r=>{let o=a[r.name];if(!o)return{name:r.name,error:`unknown tool "${r.name}". Valid tools: ${Object.keys(a).join(", ")}`};try{let c=o.run(r.input||{},t);return{name:r.name,result:c===void 0?{ok:!0}:c}}catch(c){return{name:r.name,error:String(c&&c.message||c)}}})}function ct({m:e}){return e.role==="tools"?n("div",{className:"caf-msg-tools"},`used: ${e.tools.join(", ")}`):e.role==="error"?n("div",{className:"caf-msg caf-msg-error"},n("strong",null,"The call failed"),n("span",null,e.content),n("span",{className:"caf-hint"},"Your message is kept \u2014 send again to retry.")):n("div",{className:e.role==="user"?"caf-msg caf-msg-user":"caf-msg caf-msg-assistant"},e.content)}function ve({spec:e,ctx:a}){let t=e.chat,[r,o]=x(""),[c,s]=x(!1),[i,l]=x(null),f=ie(null),u=a.data.chat||{api:[],log:[]},m=u.log||[];E(()=>{f.current&&f.current.scrollIntoView({block:"end"})},[m.length,i]);async function
|
|
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 st(e,a,t){return e.map(r=>{let o=a[r.name];if(!o)return{name:r.name,error:`unknown tool "${r.name}". Valid tools: ${Object.keys(a).join(", ")}`};try{let c=o.run(r.input||{},t);return{name:r.name,result:c===void 0?{ok:!0}:c}}catch(c){return{name:r.name,error:String(c&&c.message||c)}}})}function ct({m:e}){return e.role==="tools"?n("div",{className:"caf-msg-tools"},`used: ${e.tools.join(", ")}`):e.role==="error"?n("div",{className:"caf-msg caf-msg-error"},n("strong",null,"The call failed"),n("span",null,e.content),n("span",{className:"caf-hint"},"Your message is kept \u2014 send again to retry.")):n("div",{className:e.role==="user"?"caf-msg caf-msg-user":"caf-msg caf-msg-assistant"},e.content)}function ve({spec:e,ctx:a}){let t=e.chat,[r,o]=x(""),[c,s]=x(!1),[i,l]=x(null),f=ie(null),u=a.data.chat||{api:[],log:[]},m=u.log||[];E(()=>{f.current&&f.current.scrollIntoView({block:"end"})},[m.length,i]);async function y(){let g=r.trim();if(!g||c)return;o(""),s(!0);let h=[...u.api||[],{role:"user",content:g}],w=[...m,{role:"user",content:g}],C=()=>a.update(v=>{v.chat={api:h,log:w}});C();try{let v=(typeof t.system=="function"?t.system(a.data):t.system||"")+(t.tools?ot(t.tools):"");for(let d=0;d<at;d++){let b=await rt({model:t.model||tt,maxTokens:t.maxTokens||2e3,system:v,messages:h,onText:F=>l(we(F))});h=[...h,{role:"assistant",content:b}];let B=we(b),V=t.tools?nt(b):null;if(!V){w=[...w,{role:"assistant",content:B||b}],C();break}let Ce=st(V,t.tools,a);B&&(w=[...w,{role:"assistant",content:B}]),w=[...w,{role:"tools",tools:V.map(F=>F.name)}],h=[...h,{role:"user",content:`[TOOL_RESULT]
|
|
25
|
+
${JSON.stringify(Ce)}
|
|
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.`}],
|
|
28
|
+
Continue with this information. If you have everything you need, answer in natural language without further tool_call.`}],C(),l(null)}}catch(v){w=[...w,{role:"error",content:String(v&&v.message||v)}],C()}finally{l(null),s(!1)}}return n("div",{className:"caf-panel caf-panel-single"},n("div",{className:"caf-block caf-chat-log"},t.greeting?n("div",{className:"caf-msg caf-msg-assistant"},t.greeting):null,m.map((g,h)=>n(ct,{key:h,m:g})),i!==null?n("div",{className:"caf-msg caf-msg-assistant caf-msg-live"},i||"\u2026"):null,c&&i===null?n("div",{className:"caf-msg-tools"},"thinking\u2026"):null,n("div",{ref:f})),n("div",{className:"caf-chat-input"},n("input",{value:r,placeholder:t.placeholder||"Message\u2026",disabled:c,enterKeyHint:"send",onChange:g=>o(g.target.value),onKeyDown:g=>{g.key==="Enter"&&(g.preventDefault(),y())},"aria-label":"Message"}),n("button",{type:"button",className:"caf-btn caf-btn-primary",disabled:c||!r.trim(),onClick:y},"Send")))}var xe=["panel","records","steps","chat"],it=["title","empty","wide","onSelect","subtitle"],Ne=["title","subtitle","theme","layout","blocks","records","steps","chat","data","shared"];function ee(e,a){for(let t of e||[]){if(!t||!t.key)throw new Error(`claude-artifact-framework: every field in ${a} needs a \`key\`.`);if(t.type!==void 0&&!q.includes(t.type))throw new Error(`claude-artifact-framework: field "${t.key}" in ${a} has unknown type "${t.type}". Valid types: ${q.join(", ")}.`)}}function Se(e){if(!Array.isArray(e))throw new Error("claude-artifact-framework: `blocks` must be an array.");e.forEach((a,t)=>{if(!a||typeof a!="object")throw new Error(`claude-artifact-framework: blocks[${t}] must be an object like { fields: [...] }.`);let r=Object.keys(a).filter(c=>!it.includes(c)),o=r.filter(c=>z.includes(c));if(o.length===0)throw new Error(`claude-artifact-framework: blocks[${t}] has no recognised block type (found: ${r.join(", ")||"nothing"}). Valid block types: ${z.join(", ")}.`);if(o.length>1)throw new Error(`claude-artifact-framework: blocks[${t}] declares more than one block type (${o.join(", ")}). Split them into separate entries of \`blocks\`.`);ee(a.fields,`blocks[${t}]`)})}function lt(e){let a=Object.keys(e).filter(r=>!Ne.includes(r));if(a.length)throw new Error(`claude-artifact-framework: unknown top-level keys (${a.join(", ")}). Valid keys: ${Ne.join(", ")}.`);let t=e.layout||"panel";if(!xe.includes(t))throw new Error(`claude-artifact-framework: unknown layout "${t}". Valid layouts: ${xe.join(", ")}.`);if(t==="steps"){let r=e.steps;if(!Array.isArray(r)||r.length===0)throw new Error('claude-artifact-framework: layout "steps" needs `steps: [...]` with at least one step.');let o=["title","text","fields","result"],c=new Set;return r.forEach((s,i)=>{if(!s||typeof s!="object")throw new Error(`claude-artifact-framework: steps[${i}] must be an object.`);let l=Object.keys(s).filter(f=>!o.includes(f));if(l.length)throw new Error(`claude-artifact-framework: steps[${i}] has unknown keys (${l.join(", ")}). Valid keys: ${o.join(", ")}.`);if(!s.fields&&!s.text&&!s.result)throw new Error(`claude-artifact-framework: steps[${i}] needs \`fields\`, \`text\`, or \`result\`.`);ee(s.fields,`steps[${i}]`);for(let f of s.fields||[]){if(c.has(f.key))throw new Error(`claude-artifact-framework: field key "${f.key}" appears in more than one step \u2014 keys share one data pool and must be unique.`);c.add(f.key)}}),t}if(t==="chat"){let r=e.chat;if(!r||typeof r.system!="string"&&typeof r.system!="function")throw new Error('claude-artifact-framework: layout "chat" needs `chat: { system: "..." }` (a string or a function of data).');let o=Object.keys(r).filter(c=>!G.includes(c));if(o.length)throw new Error(`claude-artifact-framework: chat has unknown keys (${o.join(", ")}). Valid keys: ${G.join(", ")}.`);for(let[c,s]of Object.entries(r.tools||{}))if(!s||typeof s.description!="string"||typeof s.run!="function")throw new Error(`claude-artifact-framework: chat tool "${c}" needs a \`description\` string and a \`run(input, ctx)\` function.`);return t}if(t==="records"){let r=e.records;if(!r||!Array.isArray(r.fields)||r.fields.length===0)throw new Error('claude-artifact-framework: layout "records" needs `records: { fields: [...] }` \u2014 the same field declarations the fields block uses.');let o=["label","fields","title","subtitle","sort","summary","empty","search","compute"],c=Object.keys(r).filter(i=>!o.includes(i));if(c.length)throw new Error(`claude-artifact-framework: records has unknown keys (${c.join(", ")}). Valid keys: ${o.join(", ")}.`);ee(r.fields,"records");let s=new Set;for(let i of r.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 records field key "${i.key}".`);s.add(i.key)}e.blocks&&Se(e.blocks);for(let[i,l]of Object.entries(r.compute||{})){if(s.has(i)||i==="id")throw new Error(`claude-artifact-framework: compute key "${i}" collides with a field key \u2014 computed values are derived, never stored.`);if(typeof l!="function"&&typeof(l&&l.value)!="function")throw new Error(`claude-artifact-framework: compute "${i}" must be a function of the record, or { label, format, value: (r) => ... }.`)}return t}return Se(e.blocks||[]),t}function ft(e){let a={...e.data||{}};(e.layout||"panel")==="records"&&!Array.isArray(a.records)&&(a.records=[]),(e.layout||"panel")==="chat"&&!a.chat&&(a.chat={api:[],log:[]});for(let t of[...e.blocks||[],...e.steps||[]])for(let r of t.fields||[])r&&r.key!==void 0&&!(r.key in a)&&(a[r.key]=r.value!==void 0?r.value:r.type==="check"?!1:"");return a}var Z=null;function ut(e){return Z||(Z=class extends e.Component{constructor(a){super(a),this.state={error:null}}static getDerivedStateFromError(a){return{error:a}}render(){return this.state.error?n("div",{className:"caf-block caf-block-error"},n("strong",null,"This section failed to render"),n("code",null,String(this.state.error.message||this.state.error))):this.props.children}}),Z}function Ee({block:e,ctx:a}){let t=Object.keys(e).find(o=>z.includes(o)),r=Q[t];return n(ut(a.React),null,n(r,{spec:e,ctx:a}))}function dt({spec:e,ctx:a}){return n("div",{className:"caf-panel"},(e.blocks||[]).map((t,r)=>n("section",{key:r,className:t.wide?"caf-slot caf-slot-wide":"caf-slot"},n(Ee,{block:t,ctx:a}))))}function mt({spec:e,ctx:a}){let t=a.view.screen==="record"&&(a.data.records||[]).some(r=>r.id===a.view.arg);return n("div",null,n(ye,{spec:e,ctx:a}),!t&&Array.isArray(e.blocks)&&e.blocks.length?n("div",{className:"caf-panel caf-records-blocks"},e.blocks.map((r,o)=>n("section",{key:o,className:r.wide?"caf-slot caf-slot-wide":"caf-slot"},n(Ee,{block:r,ctx:a})))):null)}var pt={panel:dt,records:mt,steps:ke,chat:ve};function $e(e={}){let a=lt(e),t=de(ft(e),{shared:!!e.shared}),r=D(e.theme&&e.theme.seed)+gt;return function(){if(!A())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);
|