@widgentic/designer 0.6.0 → 0.7.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,13 +1,13 @@
1
- function _t(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function gn(e,t={}){if(!_t(e))return{ok:!1,error:{code:"INVALID_TYPE",path:"",message:"Payload must be a plain object."}};if(!("kind"in e))return{ok:!1,error:{code:"MISSING_FIELD",path:"kind",message:"Payload is missing required field 'kind'."}};let n=e.kind;if(typeof n!="string")return{ok:!1,error:{code:"INVALID_TYPE",path:"kind",message:"Field 'kind' must be a string."}};if(n.length===0)return{ok:!1,error:{code:"MISSING_FIELD",path:"kind",message:"Field 'kind' must be a non-empty string."}};if(!("data"in e))return{ok:!1,error:{code:"MISSING_FIELD",path:"data",message:"Payload is missing required field 'data'."}};if("hints"in e&&e.hints!==void 0&&!_t(e.hints))return{ok:!1,error:{code:"INVALID_TYPE",path:"hints",message:"Field 'hints' must be an object when present."}};if("meta"in e&&e.meta!==void 0&&!_t(e.meta))return{ok:!1,error:{code:"INVALID_TYPE",path:"meta",message:"Field 'meta' must be an object when present."}};let{knownKinds:r}=t;return r&&r.size>0&&!r.has(n)?{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${n}'.`}}:{ok:!0,payload:e}}var Ht=new Set(["http","https","mailto","tel"]);function ot(e){return e.replace(/[\u0000-\u0020]+/g,"")}function Bt(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(ot(e));if(t===null)return!0;let n=t[1];return n!==void 0&&Ht.has(n.toLowerCase())}function fn(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(ot(e));if(t===null)return!1;let n=t[1];return n!==void 0&&Ht.has(n.toLowerCase())}var mr=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,hr=/^https?:\/\//i;function Re(e){let t=ot(e);return mr.test(t)||hr.test(t)}var wr=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function mn(e){let t=ot(e);if(!Re(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return wr.test(new URL(t).pathname)}catch{return!1}}function q(e,t,n){let r={tag:e};return t&&Object.keys(t).length>0&&(r.attrs=t),n&&n.length>0&&(r.children=n),r}var He={card:{description:"Key/value details for a single entity, with optional title and subtitle.",dataShape:"A plain object. `title`, `subtitle`, and `fields` are used when present; other entries become field key/value pairs. Primitives render as a single value line. `meta.title`/`meta.subtitle` fill in missing chrome. Send field values typed (e.g. price: 9.99, not '$9.99') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit. Field values that are image URLs render as images (see hints.images).",dataExample:{title:"Essence Mascara",subtitle:"beauty",fields:{price:9.99,rating:2.56,stock:99}},hints:{fieldFormat:"Record<fieldKey, pattern> \u2014 formats matching field values by substituting {value} in the pattern (e.g. { price: '${value}', rating: '{value} / 5' }); a pattern without {value} is prefixed to the value. Output is escaped like any text.",images:"Record<fieldKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 field values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: thumb); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text; image treatment wins over fieldFormat for the same key.",links:"Record<fieldKey, boolean | prefix> \u2014 true links a field whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same key. Links are never automatic \u2014 opt in per field."}},table:{description:"Rows and columns for arrays of records.",dataShape:"An array of records (plain objects). Columns are the union of record keys in first-seen order; missing cells render empty; non-array data becomes a single row. Cell values that are image URLs render as avatars (see hints.images). meta.title/meta.subtitle render as the table's caption. Send cell values typed (e.g. total: 11471334.78, not '11,471,334.78') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit.",dataExample:[{name:"Ada",role:"eng",avatar:"https://picsum.photos/id/64/64/64.jpg"},{name:"Lin",role:"ops",avatar:"https://picsum.photos/id/65/64/64.jpg"}],hints:{columns:"string[] \u2014 overrides column selection and order",fieldFormat:"Record<columnKey, pattern> \u2014 formats matching cell values by substituting {value} in the pattern (e.g. { total: '${value}' }); a pattern without {value} is prefixed to the value. Output is escaped like any text; image treatment wins for the same column.",links:"Record<columnKey, boolean | prefix> \u2014 true links cells whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same column. Links are never automatic \u2014 opt in per column.",images:"Record<columnKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 cell values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: avatar); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text."}},tree:{description:"Collapsible hierarchy of labeled nodes.",dataShape:"Nested `{ label, children[] }` nodes \u2014 a single root object or an array of them. Nodes without a usable `label` get a JSON fallback label. meta.title renders as a title line above the tree.",dataExample:{label:"root",children:[{label:"leaf",children:[]}]},hints:{expandDepth:"number \u2014 branches at depth < value start expanded (default: unlimited). Presentational only: the full subtree is always in the markup; `data-expanded` appears only on nodes with children, and the widgentic base stylesheet hides collapsed children via CSS."}},custom:{description:"Generic escape hatch: renders any data as pretty-printed JSON. Best for raw inspection and debugging \u2014 for human-legible output, reshape the data and use card, table, or tree instead (e.g. join values with their units: '24.4 \xB0C').",dataShape:"Any JSON value, rendered verbatim (value-exact, not byte-exact).",dataExample:{anything:["goes",42]}},group:{description:"Several widgets in one response \u2014 mixed kinds in a single layout container. Use ONE group render instead of repeated render calls when showing multiple widgets together.",dataShape:"{ items: [{ kind, data, hints?, meta? }, ...] } \u2014 each item is a full sub-widget rendered exactly as a top-level call would be (any listed kind except 'group'; groups do not nest). At most 20 items per group.",dataExample:{items:[{kind:"card",data:{title:"Ada",fields:{role:"eng"}}},{kind:"card",data:{title:"Lin",fields:{role:"ops"}}}]},hints:{layout:"'stack' | 'row' | 'grid' \u2014 how items sit together (default: stack). 'row' wraps; 'grid' uses equal columns.",gap:"'none' | 'sm' | 'md' | 'lg' \u2014 spacing between items (default: md).",columns:"number 1-4 \u2014 column count for layout: 'grid' (default: 2)."}}};var yr=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function br(e){if(!(typeof e!="string"||e.length>256)&&!yr.test(e))try{return new RegExp(e)}catch{return}}function Ue(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function hn(e,t){switch(e){case"object":return Ue(t);case"array":return Array.isArray(t);case"string":return typeof t=="string";case"number":return typeof t=="number";case"integer":return typeof t=="number"&&Number.isInteger(t);case"boolean":return typeof t=="boolean";case"null":return t===null;default:return!0}}function vr(e,t){return typeof e=="string"?hn(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&hn(n,t)):!0}function xr(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function kr(e){return Array.isArray(e)?e.join(" | "):String(e)}function Se(e,t,n="data"){if(Array.isArray(e.enum)&&!xr(e.enum,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must be one of the enumerated options.`};if(e.type!==void 0&&!vr(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${kr(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=br(e.pattern);if(r!==void 0&&!r.test(t.slice(0,1e4)))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must match pattern ${String(e.pattern)}.`}}if(Ue(t)){if(Array.isArray(e.required)){for(let r of e.required)if(typeof r=="string"&&!(r in t))return{code:"MISSING_FIELD",path:`${n}.${r}`,message:`Missing required property '${r}'.`}}if(Ue(e.properties)){for(let[r,i]of Object.entries(e.properties))if(r in t&&Ue(i)){let o=Se(i,t[r],`${n}.${r}`);if(o)return o}}}if(Array.isArray(t)&&Ue(e.items))for(let r=0;r<t.length;r++){let i=Se(e.items,t[r],`${n}.${r}`);if(i)return i}}function re(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function te(e){if(typeof e=="string")return e;if(e===void 0)return"";if(e===null||typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function st(e,t){return e.includes("{value}")?e.split("{value}").join(t):e+t}function at(e,t,n,r){let o=(re(n)&&re(n.links)?n.links:void 0)?.[e];if(typeof t!="string"||t==="")return r;let a=o===!0?t:typeof o=="string"?o+t:void 0;return a===void 0||!fn(a)?r:q("a",{class:"wg-link",href:a,rel:"noopener noreferrer"},[r])}var Er=new Set(["avatar","thumb","hero"]);function dt(e,t,n,r){if(typeof t!="string")return null;let o=(re(n?.images)?n.images:void 0)?.[e];return o===!1?null:typeof o=="string"&&Er.has(o)?Re(t)?{src:t,shape:o}:null:o===!0?Re(t)?{src:t,shape:r}:null:mn(t)?{src:t,shape:r}:null}function ct(e,t,n){return q("img",{class:`wg-img wg-img-${n}`,src:t,alt:e,loading:"lazy",decoding:"async"})}function wn(e){let{data:t,meta:n}=e,r=re(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,i,o,a=[],g;re(t)?(i=t.title,o=t.subtitle,re(t.fields)?a=Object.entries(t.fields):a=Object.entries(t).filter(([l])=>l!=="title"&&l!=="subtitle")):g=te(t),i===void 0&&(i=n?.title),o===void 0&&(o=n?.subtitle);let c=[];return i!==void 0&&c.push(q("div",{class:"wg-card-title"},[te(i)])),o!==void 0&&c.push(q("div",{class:"wg-card-subtitle"},[te(o)])),g!==void 0&&c.push(q("div",{class:"wg-card-value"},[g])),a.length>0&&c.push(q("dl",{class:"wg-card-fields"},a.map(([l,u])=>{let p=dt(l,u,e.hints,"thumb"),m;if(p)m=ct(l,p.src,p.shape);else{let w=te(u),f=r?.[l],y=typeof f=="string"?st(f,w):w;m=at(l,u,e.hints,y)}return q("div",{class:"wg-card-field"},[q("dt",{class:"wg-card-field-key"},[l]),q("dd",{class:"wg-card-field-value"},[m])])}))),q("div",{class:"wg-card"},c)}function yn(e){let t=Array.isArray(e.data)?e.data:[e.data],n=re(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,r=t.map(l=>re(l)?l:{value:l}),i=e.hints?.columns,o;if(Array.isArray(i)&&i.every(l=>typeof l=="string"))o=i;else{o=[];let l=new Set;for(let u of r)for(let p of Object.keys(u))l.has(p)||(l.add(p),o.push(p))}let a=[],g=e.meta?.title,c=e.meta?.subtitle;if(g!==void 0||c!==void 0){let l=[];g!==void 0&&l.push(q("span",{class:"wg-table-title"},[te(g)])),c!==void 0&&l.push(q("span",{class:"wg-table-subtitle"},[te(c)])),a.push(q("caption",{class:"wg-table-caption"},l))}return q("table",{class:"wg-table"},[...a,q("thead",{class:"wg-table-head"},[q("tr",void 0,o.map(l=>q("th",{class:"wg-table-header"},[l])))]),q("tbody",{class:"wg-table-body"},r.map(l=>q("tr",{class:"wg-table-row"},o.map(u=>{if(!(u in l))return q("td",{class:"wg-table-cell"},[""]);let p=l[u],m=dt(u,p,e.hints,"avatar"),w;if(m)w=ct(u,m.src,m.shape);else{let f=te(p),y=n?.[u],v=typeof y=="string"?st(y,f):f;w=at(u,p,e.hints,v)}return q("td",{class:"wg-table-cell"},[w])}))))])}function bn(e){let t=e.hints?.expandDepth,n=typeof t=="number"&&t>=0?t:1/0,r=Array.isArray(e.data)?e.data:[e.data],i=q("ul",{class:"wg-tree"},r.map(a=>vn(a,0,n))),o=e.meta?.title;return o===void 0?i:q("div",{class:"wg-tree-titled"},[q("div",{class:"wg-tree-title"},[te(o)]),i])}function Sr(e){if(re(e)){if(e.label!==void 0)return te(e.label);let{children:t,...n}=e;if(Object.keys(n).length>0)return te(n)}return te(e)}function vn(e,t,n){let r=re(e)&&Array.isArray(e.children)&&e.children.length>0,i=r?{class:"wg-tree-node","data-expanded":t<n?"true":"false"}:{class:"wg-tree-node"},o=[q("span",{class:"wg-tree-label"},[Sr(e)])];return r&&o.push(q("ul",{class:"wg-tree-children"},e.children.map(a=>vn(a,t+1,n)))),q("li",i,o)}function xn(e){let t;try{t=JSON.stringify(e.data,null,2)??String(e.data)}catch{t=String(e.data)}return q("pre",{class:"wg-custom"},[t])}var kn=20,Tr=["stack","row","grid"],Ar=["none","sm","md","lg"],Dr=4;function En(e){if(!re(e)||e.items===void 0)return{ok:!1,error:{code:"MISSING_FIELD",path:"data.items",message:"'group' data must be an object with an 'items' array."}};let t=e.items;if(!Array.isArray(t))return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:"'items' must be an array of sub-widgets."}};if(t.length>kn)return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:`'items' holds ${t.length} sub-widgets; a group renders at most ${kn}.`}};let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!re(i))return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}]`,message:"each item must be an object: { kind, data, hints?, meta? }."}};if(typeof i.kind!="string"||i.kind==="")return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}].kind`,message:"each item needs a widget kind (non-empty string)."}};if(i.kind==="group")return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}].kind`,message:"a 'group' cannot contain another 'group'."}};let o={kind:i.kind,data:i.data};i.hints!==void 0&&(o.hints=i.hints),i.meta!==void 0&&(o.meta=i.meta),n.push(o)}return{ok:!0,items:n}}function Sn(e,t){let n=re(e)?e:{},r=Tr.some(a=>a===n.layout)?n.layout:"stack",i=Ar.some(a=>a===n.gap)?n.gap:"md",o=["wg-group",`wg-group-${r}`,`wg-gap-${i}`];if(r==="grid"){let a=typeof n.columns=="number"&&Number.isFinite(n.columns)?n.columns:2,g=Math.min(Dr,Math.max(1,Math.trunc(a)));o.push(`wg-cols-${g}`)}return q("div",{class:o.join(" ")},t)}function Tn(e,t){if(typeof e=="string")return e;let n=e.attrs?.["data-wg-action"],r=e.attrs;if(typeof n=="string")try{let o=JSON.parse(n);typeof o=="object"&&o!==null&&(r={...e.attrs,"data-wg-action":JSON.stringify({...o,at:t})})}catch{}let i=e.children?.map(o=>Tn(o,t));return{tag:e.tag,...r!==void 0?{attrs:r}:{},...i!==void 0?{children:i}:{}}}var lt=class extends Error{code="DUPLICATE_KIND";kind;constructor(t){super(`Widget kind '${t}' is already registered.`),this.name="DuplicateKindError",this.kind=t}};function ye(){let e=new Map,t=new Map,n={register(r,i,o){if(e.has(r))throw new lt(r);e.set(r,i),t.set(r,{kind:r,description:o?.description??`Custom widget kind '${r}'.`,dataShape:o?.dataShape??"Defined by the registered renderer.",...o?.dataExample!==void 0?{dataExample:o.dataExample}:{},...o?.hints?{hints:o.hints}:{},...o?.dataSchema?{dataSchema:o.dataSchema}:{},...o?.styles?{styles:o.styles}:{}})},has:r=>e.has(r),resolve:r=>e.get(r),kinds:()=>[...e.keys()],describe:r=>t.get(r),list:()=>[...t.values()],render(r){let i=gn(r,{knownKinds:new Set(e.keys())});if(!i.ok)return i;let o=t.get(i.payload.kind)?.dataSchema;if(o){let g=Se(o,i.payload.data);if(g)return{ok:!1,error:g}}if(i.payload.kind==="group"){let g=En(i.payload.data);if(!g.ok)return g;let c=[];for(let l=0;l<g.items.length;l++){let u=g.items[l],p=n.render({kind:u.kind,data:u.data,...u.hints!==void 0?{hints:u.hints}:{},...u.meta!==void 0?{meta:u.meta}:{}});if(!p.ok){let m=p.error.path;return{ok:!1,error:{...p.error,path:`data.items[${l}]${m?`.${m}`:""}`}}}c.push(Tn(p.node,`data.items.${l}`))}return{ok:!0,node:Sn(i.payload.hints,c)}}let a=e.get(i.payload.kind);if(a===void 0)return{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${i.payload.kind}'.`}};try{return{ok:!0,node:a(i.payload)}}catch(g){return{ok:!1,error:{code:"RENDER_FAILED",path:"widget",message:`Renderer for kind '${i.payload.kind}' threw: ${g instanceof Error?g.message:String(g)}`}}}}};return n.register("card",wn,He.card),n.register("table",yn,He.table),n.register("tree",bn,He.tree),n.register("custom",xn,He.custom),n.register("group",r=>{let i=n.render(r);if(i.ok)return i.node;throw new Error(i.error.message)},He.group),n}var zt=/[;{}<>@\\]/,An=/^-?[a-zA-Z][a-zA-Z-]*$/;function Or(e){if(zt.test(e))return!1;let t=e.split(",").map(n=>n.trim());return t.length>0&&t.every(n=>n.includes(".wg-"))}function Nr(e){return!zt.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function Ce(e){let t=[];for(let[n,r]of Object.entries(e)){if(!Or(n)||typeof r!="object"||r===null)continue;let i=[];for(let[o,a]of Object.entries(r))An.test(o)&&(typeof a!="string"||!Nr(a)||i.push(` ${o}: ${a};`));i.length>0&&t.push(`${n} {
1
+ function an(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Wn(e,t={}){if(!an(e))return{ok:!1,error:{code:"INVALID_TYPE",path:"",message:"Payload must be a plain object."}};if(!("kind"in e))return{ok:!1,error:{code:"MISSING_FIELD",path:"kind",message:"Payload is missing required field 'kind'."}};let n=e.kind;if(typeof n!="string")return{ok:!1,error:{code:"INVALID_TYPE",path:"kind",message:"Field 'kind' must be a string."}};if(n.length===0)return{ok:!1,error:{code:"MISSING_FIELD",path:"kind",message:"Field 'kind' must be a non-empty string."}};if(!("data"in e))return{ok:!1,error:{code:"MISSING_FIELD",path:"data",message:"Payload is missing required field 'data'."}};if("hints"in e&&e.hints!==void 0&&!an(e.hints))return{ok:!1,error:{code:"INVALID_TYPE",path:"hints",message:"Field 'hints' must be an object when present."}};if("meta"in e&&e.meta!==void 0&&!an(e.meta))return{ok:!1,error:{code:"INVALID_TYPE",path:"meta",message:"Field 'meta' must be an object when present."}};let{knownKinds:r}=t;return r&&r.size>0&&!r.has(n)?{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${n}'.`}}:{ok:!0,payload:e}}var dn=new Set(["http","https","mailto","tel"]);function Tt(e){return e.replace(/[\u0000-\u0020]+/g,"")}function cn(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(Tt(e));if(t===null)return!0;let n=t[1];return n!==void 0&&dn.has(n.toLowerCase())}function _n(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(Tt(e));if(t===null)return!1;let n=t[1];return n!==void 0&&dn.has(n.toLowerCase())}var Kr=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,qr=/^https?:\/\//i;function Pe(e){let t=Tt(e);return Kr.test(t)||qr.test(t)}var Gr=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function In(e){let t=Tt(e);if(!Pe(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return Gr.test(new URL(t).pathname)}catch{return!1}}function K(e,t,n){let r={tag:e};return t&&Object.keys(t).length>0&&(r.attrs=t),n&&n.length>0&&(r.children=n),r}var ct={card:{description:"Key/value details for a single entity, with optional title and subtitle.",dataShape:"A plain object. `title`, `subtitle`, and `fields` are used when present; other entries become field key/value pairs. Primitives render as a single value line. `meta.title`/`meta.subtitle` fill in missing chrome. Send field values typed (e.g. price: 9.99, not '$9.99') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit. Field values that are image URLs render as images (see hints.images).",dataExample:{title:"Essence Mascara",subtitle:"beauty",fields:{price:9.99,rating:2.56,stock:99}},hints:{fieldFormat:"Record<fieldKey, pattern> \u2014 formats matching field values by substituting {value} in the pattern (e.g. { price: '${value}', rating: '{value} / 5' }); a pattern without {value} is prefixed to the value. Output is escaped like any text.",images:"Record<fieldKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 field values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: thumb); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text; image treatment wins over fieldFormat for the same key.",links:"Record<fieldKey, boolean | prefix> \u2014 true links a field whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same key. Links are never automatic \u2014 opt in per field."}},table:{description:"Rows and columns for arrays of records.",dataShape:"An array of records (plain objects). Columns are the union of record keys in first-seen order; missing cells render empty; non-array data becomes a single row. Cell values that are image URLs render as avatars (see hints.images). meta.title/meta.subtitle render as the table's caption. Send cell values typed (e.g. total: 11471334.78, not '11,471,334.78') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit.",dataExample:[{name:"Ada",role:"eng",avatar:"https://picsum.photos/id/64/64/64.jpg"},{name:"Lin",role:"ops",avatar:"https://picsum.photos/id/65/64/64.jpg"}],hints:{columns:"string[] \u2014 overrides column selection and order",fieldFormat:"Record<columnKey, pattern> \u2014 formats matching cell values by substituting {value} in the pattern (e.g. { total: '${value}' }); a pattern without {value} is prefixed to the value. Output is escaped like any text; image treatment wins for the same column.",links:"Record<columnKey, boolean | prefix> \u2014 true links cells whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same column. Links are never automatic \u2014 opt in per column.",images:"Record<columnKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 cell values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: avatar); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text."}},tree:{description:"Collapsible hierarchy of labeled nodes \u2014 a person can expand and collapse branches by click or keyboard.",dataShape:"Nested `{ label, icon?, children[] }` nodes \u2014 a single root object or an array of them. A node with children renders as a native disclosure that opens and closes; leaves are plain labels. Optional `icon` is ONE string per node, shown before the label: a data:image/* URI or an https URL ending in an image extension (.png, .jpg, .svg, ...) renders as a small decorative image; any other string \u2014 an emoji, a glyph, an extensionless URL \u2014 renders as text. Nodes without a usable `label` get a JSON fallback label (which excludes `children` and `icon`). meta.title renders as a title line above the tree.",dataExample:{label:"src",icon:"\u{1F4C1}",children:[{label:"index.ts",icon:"\u{1F4C4}",children:[]}]},hints:{expandDepth:"number \u2014 branches at depth < value START expanded (default: unlimited). Presentational only: the full subtree is always in the markup, and collapsing is the disclosure's own behavior. The value selects only the INITIAL state (the `open` attribute on branches); a visitor's own expand/collapse survives later re-renders."}},group:{description:"Several widgets in one response \u2014 mixed kinds in a single layout container. Use ONE group render instead of repeated render calls when showing multiple widgets together.",dataShape:"{ items: [{ kind, data, hints?, meta? }, ...] } \u2014 each item is a full sub-widget rendered exactly as a top-level call would be (any listed kind except 'group'; groups do not nest). At most 20 items per group.",dataExample:{items:[{kind:"card",data:{title:"Ada",fields:{role:"eng"}}},{kind:"card",data:{title:"Lin",fields:{role:"ops"}}}]},hints:{layout:"'stack' | 'row' | 'grid' \u2014 how items sit together (default: stack). 'row' wraps; 'grid' uses equal columns.",gap:"'none' | 'sm' | 'md' | 'lg' \u2014 spacing between items (default: md).",columns:"number 1-4 \u2014 column count for layout: 'grid' (default: 2)."}}};var Yr=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function Xr(e){if(!(typeof e!="string"||e.length>256)&&!Yr.test(e))try{return new RegExp(e)}catch{return}}function lt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Mn(e,t){switch(e){case"object":return lt(t);case"array":return Array.isArray(t);case"string":return typeof t=="string";case"number":return typeof t=="number";case"integer":return typeof t=="number"&&Number.isInteger(t);case"boolean":return typeof t=="boolean";case"null":return t===null;default:return!0}}function Zr(e,t){return typeof e=="string"?Mn(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&Mn(n,t)):!0}function Qr(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function ei(e){return Array.isArray(e)?e.join(" | "):String(e)}function De(e,t,n="data"){if(Array.isArray(e.enum)&&!Qr(e.enum,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must be one of the enumerated options.`};if(e.type!==void 0&&!Zr(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${ei(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=Xr(e.pattern);if(r!==void 0&&!r.test(t.slice(0,1e4)))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must match pattern ${String(e.pattern)}.`}}if(lt(t)){if(Array.isArray(e.required)){for(let r of e.required)if(typeof r=="string"&&!(r in t))return{code:"MISSING_FIELD",path:`${n}.${r}`,message:`Missing required property '${r}'.`}}if(lt(e.properties)){for(let[r,i]of Object.entries(e.properties))if(r in t&&lt(i)){let o=De(i,t[r],`${n}.${r}`);if(o)return o}}}if(Array.isArray(t)&&lt(e.items))for(let r=0;r<t.length;r++){let i=De(e.items,t[r],`${n}.${r}`);if(i)return i}}function oe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e){if(typeof e=="string")return e;if(e===void 0)return"";if(e===null||typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function At(e,t){return e.includes("{value}")?e.split("{value}").join(t):e+t}function Dt(e,t,n,r){let o=(oe(n)&&oe(n.links)?n.links:void 0)?.[e];if(typeof t!="string"||t==="")return r;let a=o===!0?t:typeof o=="string"?o+t:void 0;return a===void 0||!_n(a)?r:K("a",{class:"wg-link",href:a,rel:"noopener noreferrer"},[r])}var ti=["avatar","thumb","hero"],ni=new Set(ti);function qe(e,t,n,r){if(typeof t!="string")return null;let o=(oe(n?.images)?n.images:void 0)?.[e];return o===!1?null:typeof o=="string"&&ni.has(o)?Pe(t)?{src:t,shape:o}:null:o===!0?Pe(t)?{src:t,shape:r}:null:In(t)?{src:t,shape:r}:null}function Ge(e,t,n){return K("img",{class:`wg-img wg-img-${n}`,src:t,alt:e,loading:"lazy",decoding:"async"})}function Hn(e){let{data:t,meta:n}=e,r=oe(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,i,o,a=[],f;oe(t)?(i=t.title,o=t.subtitle,oe(t.fields)?a=Object.entries(t.fields):a=Object.entries(t).filter(([l])=>l!=="title"&&l!=="subtitle")):f=re(t),i===void 0&&(i=n?.title),o===void 0&&(o=n?.subtitle);let c=[];return i!==void 0&&c.push(K("div",{class:"wg-card-title"},[re(i)])),o!==void 0&&c.push(K("div",{class:"wg-card-subtitle"},[re(o)])),f!==void 0&&c.push(K("div",{class:"wg-card-value"},[f])),a.length>0&&c.push(K("dl",{class:"wg-card-fields"},a.map(([l,u])=>{let p=qe(l,u,e.hints,"thumb"),m;if(p)m=Ge(l,p.src,p.shape);else{let y=re(u),g=r?.[l],b=typeof g=="string"?At(g,y):y;m=Dt(l,u,e.hints,b)}return K("div",{class:"wg-card-field"},[K("dt",{class:"wg-card-field-key"},[l]),K("dd",{class:"wg-card-field-value"},[m])])}))),K("div",{class:"wg-card"},c)}function Fn(e){let t=Array.isArray(e.data)?e.data:[e.data],n=oe(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,r=t.map(l=>oe(l)?l:{value:l}),i=e.hints?.columns,o;if(Array.isArray(i)&&i.every(l=>typeof l=="string"))o=i;else{o=[];let l=new Set;for(let u of r)for(let p of Object.keys(u))l.has(p)||(l.add(p),o.push(p))}let a=[],f=e.meta?.title,c=e.meta?.subtitle;if(f!==void 0||c!==void 0){let l=[];f!==void 0&&l.push(K("span",{class:"wg-table-title"},[re(f)])),c!==void 0&&l.push(K("span",{class:"wg-table-subtitle"},[re(c)])),a.push(K("caption",{class:"wg-table-caption"},l))}return K("table",{class:"wg-table"},[...a,K("thead",{class:"wg-table-head"},[K("tr",void 0,o.map(l=>K("th",{class:"wg-table-header"},[l])))]),K("tbody",{class:"wg-table-body"},r.map(l=>K("tr",{class:"wg-table-row"},o.map(u=>{if(!(u in l))return K("td",{class:"wg-table-cell"},[""]);let p=l[u],m=qe(u,p,e.hints,"avatar"),y;if(m)y=Ge(u,m.src,m.shape);else{let g=re(p),b=n?.[u],v=typeof b=="string"?At(b,g):g;y=Dt(u,p,e.hints,v)}return K("td",{class:"wg-table-cell"},[y])}))))])}function Un(e){let t=e.hints?.expandDepth,n=typeof t=="number"&&!Number.isNaN(t)?Math.max(0,t):1/0,r=Array.isArray(e.data)?e.data:[e.data],i=K("ul",{class:"wg-tree"},r.map(a=>zn(a,0,n))),o=e.meta?.title;return o===void 0?i:K("div",{class:"wg-tree-titled"},[K("div",{class:"wg-tree-title"},[re(o)]),i])}function ri(e){if(oe(e)){if(e.label!==void 0)return re(e.label);let{children:t,icon:n,...r}=e;return re(r)}return re(e)}function ii(e){if(typeof e!="string")return;let t=qe("",e,void 0,"icon");return t!==null?Ge("",t.src,t.shape):K("span",{class:"wg-tree-icon"},[e])}function Bn(e){let t=oe(e)?ii(e.icon):void 0,n=ri(e);return t===void 0?[n]:[t,n]}var oi=64,si=e=>oe(e)&&Array.isArray(e.children)&&e.children.length>0?e.children:void 0;function zn(e,t,n){let r=t<oi?si(e):void 0;if(r===void 0)return K("li",{class:"wg-tree-node"},[K("span",{class:"wg-tree-label"},Bn(e))]);let i=t<n;return K("li",{class:"wg-tree-node"},[K("details",{class:"wg-tree-branch",...i?{open:""}:{}},[K("summary",{class:"wg-tree-label"},Bn(e)),K("ul",{class:"wg-tree-children"},r.map(o=>zn(o,t+1,n)))])])}var Vn=20,ai=["stack","row","grid"],di=["none","sm","md","lg"],ci=4;function Jn(e){if(!oe(e)||e.items===void 0)return{ok:!1,error:{code:"MISSING_FIELD",path:"data.items",message:"'group' data must be an object with an 'items' array."}};let t=e.items;if(!Array.isArray(t))return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:"'items' must be an array of sub-widgets."}};if(t.length>Vn)return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:`'items' holds ${t.length} sub-widgets; a group renders at most ${Vn}.`}};let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!oe(i))return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}]`,message:"each item must be an object: { kind, data, hints?, meta? }."}};if(typeof i.kind!="string"||i.kind==="")return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}].kind`,message:"each item needs a widget kind (non-empty string)."}};if(i.kind==="group")return{ok:!1,error:{code:"INVALID_TYPE",path:`data.items[${r}].kind`,message:"a 'group' cannot contain another 'group'."}};let o={kind:i.kind,data:i.data};i.hints!==void 0&&(o.hints=i.hints),i.meta!==void 0&&(o.meta=i.meta),n.push(o)}return{ok:!0,items:n}}function Kn(e,t){let n=oe(e)?e:{},r=ai.some(a=>a===n.layout)?n.layout:"stack",i=di.some(a=>a===n.gap)?n.gap:"md",o=["wg-group",`wg-group-${r}`,`wg-gap-${i}`];if(r==="grid"){let a=typeof n.columns=="number"&&Number.isFinite(n.columns)?n.columns:2,f=Math.min(ci,Math.max(1,Math.trunc(a)));o.push(`wg-cols-${f}`)}return K("div",{class:o.join(" ")},t)}function qn(e,t){if(typeof e=="string")return e;let n=e.attrs?.["data-wg-action"],r=e.attrs;if(typeof n=="string")try{let o=JSON.parse(n);typeof o=="object"&&o!==null&&(r={...e.attrs,"data-wg-action":JSON.stringify({...o,at:t})})}catch{}let i=e.children?.map(o=>qn(o,t));return{tag:e.tag,...r!==void 0?{attrs:r}:{},...i!==void 0?{children:i}:{}}}var Ot=class extends Error{code="DUPLICATE_KIND";kind;constructor(t){super(`Widget kind '${t}' is already registered.`),this.name="DuplicateKindError",this.kind=t}};function Ee(){let e=new Map,t=new Map,n={register(r,i,o){if(e.has(r))throw new Ot(r);e.set(r,i),t.set(r,{kind:r,description:o?.description??`Custom widget kind '${r}'.`,dataShape:o?.dataShape??"Defined by the registered renderer.",...o?.dataExample!==void 0?{dataExample:o.dataExample}:{},...o?.hints?{hints:o.hints}:{},...o?.dataSchema?{dataSchema:o.dataSchema}:{},...o?.styles?{styles:o.styles}:{}})},has:r=>e.has(r),resolve:r=>e.get(r),kinds:()=>[...e.keys()],describe:r=>t.get(r),list:()=>[...t.values()],render(r){let i=Wn(r,{knownKinds:new Set(e.keys())});if(!i.ok)return i;let o=t.get(i.payload.kind)?.dataSchema;if(o){let f=De(o,i.payload.data);if(f)return{ok:!1,error:f}}if(i.payload.kind==="group"){let f=Jn(i.payload.data);if(!f.ok)return f;let c=[];for(let l=0;l<f.items.length;l++){let u=f.items[l],p=n.render({kind:u.kind,data:u.data,...u.hints!==void 0?{hints:u.hints}:{},...u.meta!==void 0?{meta:u.meta}:{}});if(!p.ok){let m=p.error.path;return{ok:!1,error:{...p.error,path:`data.items[${l}]${m?`.${m}`:""}`}}}c.push(qn(p.node,`data.items.${l}`))}return{ok:!0,node:Kn(i.payload.hints,c)}}let a=e.get(i.payload.kind);if(a===void 0)return{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${i.payload.kind}'.`}};try{return{ok:!0,node:a(i.payload)}}catch(f){return{ok:!1,error:{code:"RENDER_FAILED",path:"widget",message:`Renderer for kind '${i.payload.kind}' threw: ${f instanceof Error?f.message:String(f)}`}}}}};return n.register("card",Hn,ct.card),n.register("table",Fn,ct.table),n.register("tree",Un,ct.tree),n.register("group",r=>{let i=n.render(r);if(i.ok)return i.node;throw new Error(i.error.message)},ct.group),n}var ln=/[;{}<>@\\]/,Gn=/^-?[a-zA-Z][a-zA-Z-]*$/;function li(e){if(ln.test(e))return!1;let t=e.split(",").map(n=>n.trim());return t.length>0&&t.every(n=>n.includes(".wg-"))}function ui(e){return!ln.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function We(e){let t=[];for(let[n,r]of Object.entries(e)){if(!li(n)||typeof r!="object"||r===null)continue;let i=[];for(let[o,a]of Object.entries(r))Gn.test(o)&&(typeof a!="string"||!ui(a)||i.push(` ${o}: ${a};`));i.length>0&&t.push(`${n} {
2
2
  ${i.join(`
3
3
  `)}
4
4
  }`)}return t.join(`
5
- `)}var ge={bg:{default:"#ffffff",type:"color",use:"Page background behind widgets."},surface:{default:"#ffffff",type:"color",fallback:"bg",use:"Widget panel background (cards, tables); falls back to bg when unset."},fg:{default:"#1f2430",type:"color",use:"Primary text."},muted:{default:"#6b7280",type:"color",use:"Secondary text: labels, captions, keys."},accent:{default:"#2563eb",type:"color",use:"Emphasis: titles, links, filled badges."},"accent-fg":{default:"#ffffff",type:"color",use:"Text drawn on an accent fill (filled badges and buttons)."},border:{default:"#e2e8f0",type:"color",use:"Hairlines: panel edges, row rules."},"border-width":{default:"1px",type:"dimension",use:"Width of those hairlines."},radius:{default:"6px",type:"dimension",use:"Default corner rounding."},"radius-sm":{default:"3px",type:"dimension",use:"Tight rounding: pills, chips, inline marks."},"radius-lg":{default:"12px",type:"dimension",use:"Generous rounding: hero media, large panels."},spacing:{default:"8px",type:"dimension",use:"Base spacing step."},"spacing-sm":{default:"4px",type:"dimension",use:"Half step: inline gaps inside a row."},"spacing-lg":{default:"16px",type:"dimension",use:"Double step: section separation."},"font-family":{default:"system-ui, -apple-system, 'Segoe UI', sans-serif",type:"font-family",use:"Body text family."},"font-mono":{default:"ui-monospace, SFMono-Regular, Menlo, monospace",type:"font-family",use:"Monospace family for code and raw JSON (the custom kind)."},"font-size":{default:"14px",type:"dimension",use:"Body text size."},"font-size-sm":{default:"12px",type:"dimension",use:"Small text: captions, stats, pills."},"font-size-lg":{default:"18px",type:"dimension",use:"Large text: widget titles."},"font-weight-bold":{default:"600",type:"font-weight",use:"Weight for titles and emphasized labels."},"line-height":{default:"1.45",type:"number",use:"Text density."},shadow:{default:"0 1px 3px rgba(0, 0, 0, 0.12)",type:"shadow",use:"Panel elevation."},danger:{default:"#b91c1c",type:"color",use:"Error status: fills and text (see .wg-status-danger)."},"danger-fg":{default:"#ffffff",type:"color",use:"Text on a danger fill."},success:{default:"#15803d",type:"color",use:"Success status (see .wg-status-success)."},"success-fg":{default:"#ffffff",type:"color",use:"Text on a success fill."},warning:{default:"#b45309",type:"color",use:"Warning status (see .wg-status-warning)."},"warning-fg":{default:"#ffffff",type:"color",use:"Text on a warning fill."},info:{default:"#0369a1",type:"color",use:"Informational status (see .wg-status-info)."},"info-fg":{default:"#ffffff",type:"color",use:"Text on an info fill."},"avatar-size":{default:"32px",type:"dimension",use:"Box of .wg-img-avatar images."},"thumb-size":{default:"48px",type:"dimension",use:"Box of .wg-img-thumb images."}},$e=Object.fromEntries(Object.entries(ge).map(([e,t])=>[e,t.default])),fe=Object.keys(ge);function We(e){return!/[;{}<>]/.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function O(e){return`var(--wg-${e}, ${$e[e]})`}var Lr=`:root {
6
- ${fe.map(e=>` --wg-${e}: ${$e[e]};`).join(`
5
+ `)}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ze=["number","currency","date"],Qe=e=>Ze.some(t=>t===e),_e=0,Ie=8,Me=["narrowSymbol","symbol","code"],et=e=>Me.some(t=>t===e),Nt=/^[A-Z]{3}$/,tt=["yyyy","MM","dd","HH","mm","ss"],Xn=" -/:.,T",Rt=40,un=new RegExp(`^[${Xn.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}yMdHms]*$`),Zn=1e11,Lt=/^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{2,8}){0,3}$/,Qn="en-US";function Ct(e){let t=[],n="",r=0,i=0;e:for(;i<e.length;){for(let a of tt)if(e.startsWith(a,i)){n!==""&&t.push({literal:n}),n="",t.push({token:a}),r+=1,i+=a.length;continue e}let o=e[i];if(/[A-Za-z]/.test(o))return;n+=o,i+=1}return n!==""&&t.push({literal:n}),r===0?void 0:t}function pn(e){try{return Intl.NumberFormat.supportedLocalesOf([e]).length>0}catch{return!1}}function pi(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e!="string")return;let t=e.trim();if(t==="")return;let n=Number(t);return Number.isFinite(n)?n:void 0}function fi(e){if(typeof e=="number")return Number.isFinite(e)?Math.abs(e)<Zn?e*1e3:e:void 0;if(typeof e!="string")return;let t=e.trim();if(t==="")return;let n=/^(\d{4}-\d{2}-\d{2})(?:[T ](\d{2}:\d{2}(?::\d{2})?)(?:\.(\d+))?(Z|[+-]\d{2}:?\d{2})?)?$/.exec(t);if(n===null)return;let[,r,i,o,a]=n,f=o===void 0?"":`.${o.slice(0,3)}`,c=i===void 0?"00:00:00":i.length===5?`${i}:00`:i,l=Date.parse(`${r}T${c}${f}${a??"Z"}`);return Number.isFinite(l)?l:void 0}var Ye=(e,t)=>String(e).padStart(t,"0");function gi(e,t){let n=new Date(e),r=i=>{switch(i){case"yyyy":return Ye(n.getUTCFullYear(),4);case"MM":return Ye(n.getUTCMonth()+1,2);case"dd":return Ye(n.getUTCDate(),2);case"HH":return Ye(n.getUTCHours(),2);case"mm":return Ye(n.getUTCMinutes(),2);case"ss":return Ye(n.getUTCSeconds(),2)}};return t.map(i=>"token"in i?r(i.token):i.literal).join("")}var mi=/[\u00A0\u202F\u2009]/g,Xe=e=>re(e);function $t(e){if(!k(e)||!Qe(e.type))return;if(e.type==="date")return typeof e.pattern=="string"?{type:"date",pattern:e.pattern}:void 0;let t=typeof e.decimals=="number"&&Number.isInteger(e.decimals)&&e.decimals>=_e&&e.decimals<=Ie?e.decimals:void 0,n=typeof e.locale=="string"&&Lt.test(e.locale)?e.locale:void 0,r={...t===void 0?{}:{decimals:t},...n===void 0?{}:{locale:n}};if(e.type==="number")return{type:"number",...r};if(!(typeof e.currency!="string"||!Nt.test(e.currency)))return{type:"currency",currency:e.currency,...et(e.currencyDisplay)?{currencyDisplay:e.currencyDisplay}:{},...r}}function hi(e){if(e.type==="date"){let i=Ct(e.pattern);return i===void 0?Xe:o=>{let a=fi(o);return a===void 0?Xe(o):gi(a,i)}}let t=e.locale??Qn,n=e.decimals===void 0?{}:{minimumFractionDigits:e.decimals,maximumFractionDigits:e.decimals},r;try{r=e.type==="number"?new Intl.NumberFormat(t,n):new Intl.NumberFormat(t,{style:"currency",currency:e.currency,currencyDisplay:e.currencyDisplay??"narrowSymbol",...n})}catch{return Xe}return i=>{let o=pi(i);return o===void 0?Xe(i):r.format(o).replace(mi," ")}}var Yn=new WeakMap;function er(e){if(!k(e))return Xe;let t=Yn.get(e);if(t!==void 0)return t;let n=$t(e),r=n===void 0?Xe:hi(n);return Yn.set(e,r),r}function jt(e,t){return er(t)(e)}var ve={bg:{default:"#ffffff",type:"color",use:"Page background behind widgets."},surface:{default:"#ffffff",type:"color",fallback:"bg",use:"Widget panel background (cards, tables); falls back to bg when unset."},fg:{default:"#1f2430",type:"color",use:"Primary text."},muted:{default:"#6b7280",type:"color",use:"Secondary text: labels, captions, keys."},accent:{default:"#2563eb",type:"color",use:"Emphasis: titles, links, filled badges."},"accent-fg":{default:"#ffffff",type:"color",use:"Text drawn on an accent fill (filled badges and buttons)."},border:{default:"#e2e8f0",type:"color",use:"Hairlines: panel edges, row rules."},"border-width":{default:"1px",type:"dimension",use:"Width of those hairlines."},radius:{default:"6px",type:"dimension",use:"Default corner rounding."},"radius-sm":{default:"3px",type:"dimension",use:"Tight rounding: pills, chips, inline marks."},"radius-lg":{default:"12px",type:"dimension",use:"Generous rounding: hero media, large panels."},spacing:{default:"8px",type:"dimension",use:"Base spacing step."},"spacing-sm":{default:"4px",type:"dimension",use:"Half step: inline gaps inside a row."},"spacing-lg":{default:"16px",type:"dimension",use:"Double step: section separation."},"font-family":{default:"system-ui, -apple-system, 'Segoe UI', sans-serif",type:"font-family",use:"Body text family."},"font-mono":{default:"ui-monospace, SFMono-Regular, Menlo, monospace",type:"font-family",use:"Monospace family for the wg-code block utility."},"font-size":{default:"14px",type:"dimension",use:"Body text size."},"font-size-sm":{default:"12px",type:"dimension",use:"Small text: captions, stats, pills."},"font-size-lg":{default:"18px",type:"dimension",use:"Large text: widget titles."},"font-weight-bold":{default:"600",type:"font-weight",use:"Weight for titles and emphasized labels."},"line-height":{default:"1.45",type:"number",use:"Text density."},shadow:{default:"0 1px 3px rgba(0, 0, 0, 0.12)",type:"shadow",use:"Panel elevation."},danger:{default:"#b91c1c",type:"color",use:"Error status: fills and text (see .wg-status-danger)."},"danger-fg":{default:"#ffffff",type:"color",use:"Text on a danger fill."},success:{default:"#15803d",type:"color",use:"Success status (see .wg-status-success)."},"success-fg":{default:"#ffffff",type:"color",use:"Text on a success fill."},warning:{default:"#b45309",type:"color",use:"Warning status (see .wg-status-warning)."},"warning-fg":{default:"#ffffff",type:"color",use:"Text on a warning fill."},info:{default:"#0369a1",type:"color",use:"Informational status (see .wg-status-info)."},"info-fg":{default:"#ffffff",type:"color",use:"Text on an info fill."},"avatar-size":{default:"32px",type:"dimension",use:"Box of .wg-img-avatar images."},"thumb-size":{default:"48px",type:"dimension",use:"Box of .wg-img-thumb images."}},He=Object.fromEntries(Object.entries(ve).map(([e,t])=>[e,t.default])),xe=Object.keys(ve);function Fe(e){return!/[;{}<>]/.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function O(e){return`var(--wg-${e}, ${He[e]})`}var wi=`:root {
6
+ ${xe.map(e=>` --wg-${e}: ${He[e]};`).join(`
7
7
  `)}
8
- }`,On=`
9
- ${Lr}
10
- .wg-card, .wg-table, .wg-tree, .wg-custom, .wg-template {
8
+ }`,fn="1.25em",nr=`
9
+ ${wi}
10
+ .wg-card, .wg-table, .wg-tree, .wg-code, .wg-template {
11
11
  font-family: ${O("font-family")};
12
12
  font-size: ${O("font-size")};
13
13
  line-height: ${O("line-height")};
@@ -76,10 +76,44 @@ ${Lr}
76
76
  .wg-tree-node {
77
77
  padding: ${O("spacing-sm")} 0;
78
78
  }
79
- .wg-tree-node[data-expanded="false"] > .wg-tree-children {
79
+ .wg-tree-label {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: ${O("spacing-sm")};
83
+ }
84
+ .wg-tree-branch > .wg-tree-label {
85
+ cursor: pointer;
86
+ list-style: none;
87
+ }
88
+ .wg-tree-branch > .wg-tree-label::-webkit-details-marker {
80
89
  display: none;
81
90
  }
82
- .wg-custom {
91
+ .wg-tree-branch > .wg-tree-label::before {
92
+ content: "";
93
+ flex: 0 0 auto;
94
+ width: 0;
95
+ height: 0;
96
+ border-left: 0.4em solid ${O("muted")};
97
+ border-top: 0.3em solid transparent;
98
+ border-bottom: 0.3em solid transparent;
99
+ }
100
+ .wg-tree-branch[open] > .wg-tree-label::before {
101
+ transform: rotate(90deg);
102
+ }
103
+ .wg-tree-icon {
104
+ flex: 0 0 auto;
105
+ width: ${fn};
106
+ text-align: center;
107
+ }
108
+ .wg-img-icon {
109
+ flex: 0 0 auto;
110
+ width: ${fn};
111
+ height: ${fn};
112
+ border-radius: ${O("radius-sm")};
113
+ }
114
+ /* Monospace block utility. No built-in emits it: it is a styling surface
115
+ template authors opt into, and what keeps the font-mono token consumed. */
116
+ .wg-code {
83
117
  font-family: ${O("font-mono")};
84
118
  background: var(--wg-surface, ${O("bg")});
85
119
  border: ${O("border-width")} solid ${O("border")};
@@ -174,22 +208,22 @@ ${Lr}
174
208
  .wg-gap-sm { gap: ${O("spacing-sm")}; }
175
209
  .wg-gap-md { gap: ${O("spacing")}; }
176
210
  .wg-gap-lg { gap: ${O("spacing-lg")}; }
177
- `.trim(),Dn="data-widgentic";function Jt(e){if(e.head.querySelector(`style[${Dn}]`))return;let t=e.createElement("style");t.setAttribute(Dn,"base"),t.textContent=On,e.head.appendChild(t)}function jr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Rr=new Set(fe),Vt=/^x-[a-z0-9][a-z0-9-]*$/;function Cr(e){return Object.keys(e).filter(t=>Vt.test(t))}function Nn(e){return`--wg-${e}`}function Pe(e){if(!jr(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!Rr.has(t)&&!Vt.test(t))return{ok:!1,error:{code:"UNKNOWN_TOKEN",message:`Unknown theme token '${t}'. Use a registry token, or a custom variable named 'x-<lowercase-kebab>'.`,token:t}};if(typeof n!="string"||!We(n))return{ok:!1,error:{code:"INVALID_TOKEN_VALUE",message:`Token '${t}' has an invalid or unsafe value.`,token:t}}}return{ok:!0,theme:e}}function $r(e){let t=e,n;for(let r of fe){let{fallback:i}=ge[r];if(i===void 0||typeof t[r]=="string")continue;let o=t[i];typeof o=="string"&&(n??={...t},n[r]=o)}return n??e}function Ut(e,t){let n=$r(t),r=e.style;if(!r)return;for(let o of fe)r.removeProperty(Nn(o));for(let o=r.length-1;o>=0;o--){let a=r.item(o);a.startsWith("--wg-x-")&&r.removeProperty(a)}let i=[...fe,...Cr(n)];for(let o of i){let a=n[o];typeof a=="string"&&We(a)&&r.setProperty(Nn(o),a)}}function x(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var ut=/^(?:on.*|srcdoc)$/i,pt=new Set(["script","iframe","frame","frameset","object","embed","style","link","meta","base","template","noscript"]),gt=/^data-wg-/i,Ln=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),Ft=64;var Wr=new Set(["$meta","$root","$parent","$index"]);function me(e){if(e===".")return{base:"scope",up:0,index:!1,segments:[]};let t=e.split("."),n=0,r="scope",i=0;if(t[0]==="$meta")r="meta",n=1;else if(t[0]==="$root")r="root",n=1;else for(;t[n]==="$parent";)i++,n++;let o=t.slice(n);if(o.length===1&&o[0]==="$index")return r!=="scope"?void 0:{base:r,up:i,index:!0,segments:[]};if(o.length===0)return r==="meta"?void 0:{base:r,up:i,index:!1,segments:[]};if(!o.some(a=>a===""||Wr.has(a)))return{base:r,up:i,index:!1,segments:o}}var ft=/^[a-z][a-z0-9-]{0,63}$/,mt=ft,Fe=["replace","merge","patch"],Ke=["GET","POST"];function Q(e,t){return e===""?t:`${e}.${t}`}function J(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var Pr=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Ir=new Set(["host","content-length","transfer-encoding","connection"]),Mr=new Set(["__proto__","constructor","prototype"]);function ht(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!Mr.has(t))}function _r(e,t){if(typeof e!="string")return x(e)&&typeof e.secret=="string"?ft.test(e.secret)?Object.keys(e).length!==1?J("A secret reference carries only 'secret'.",t):void 0:J(`Secret reference '${e.secret}' is not a valid secret name.`,t):J("Value must be a string or a { secret } reference.",t)}function Kt(e){return!x(e)&&!Array.isArray(e)?!1:x(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(Kt)}function Hr(e,t){if(typeof e!="string"||e.length===0)return J("'url' must be a non-empty string.",t);let n;try{n=new URL(e)}catch{return J(`'url' must be an absolute URL (got '${e}').`,t)}if(n.protocol!=="https:")return J("'url' must use https.",t);if(n.username!==""||n.password!=="")return J("'url' must not carry userinfo.",t);if(n.hash!=="")return J("'url' must not carry a fragment.",t)}function Be(e,t="",n={}){if(!x(e))return J("Action definition must be an object.",t);if(e.kind==="prompt"){if(!Array.isArray(e.text))return J("'text' must be an array of literals and { bind } segments.",Q(t,"text"));let r=0;for(let i=0;i<e.text.length;i++){let o=e.text[i];if(typeof o=="string"){r+=o.length;continue}if(x(o)&&typeof o.bind=="string"&&Object.keys(o).length===1){if(n.isPath&&!n.isPath(o.bind))return J(`Invalid data path '${o.bind}'.`,Q(t,`text.${i}`));continue}return J("Prompt segments are strings or { bind } objects.",Q(t,`text.${i}`))}return r>2e3?J(`Prompt text exceeds ${2e3} characters.`,Q(t,"text")):void 0}if(e.kind==="http"){if(!Ke.some(i=>i===e.method))return J("'method' must be GET or POST.",Q(t,"method"));let r=Hr(e.url,Q(t,"url"));if(r)return r;if(!x(e.input)||e.input.type!=="object")return J(`'input' must be a JSON Schema with type "object".`,Q(t,"input"));if(Kt(e.input))return J("Secret references are allowed only in headers and query.",Q(t,"input"));if(!x(e.output))return J("'output' must be a JSON Schema object.",Q(t,"output"));for(let i of["headers","query"]){let o=e[i];if(o!==void 0){if(!x(o))return J(`'${i}' must be an object.`,Q(t,i));for(let[a,g]of Object.entries(o)){let c=Q(t,`${i}.${a}`);if(!Pr.test(a))return J(`'${a}' is not a valid ${i==="headers"?"header":"parameter"} name.`,c);if(i==="headers"&&Ir.has(a.toLowerCase()))return J(`Header '${a}' is set by the transport and cannot be declared.`,c);let l=_r(g,c);if(l)return l}}}return}return J(`'kind' must be "prompt" or "http".`,Q(t,"kind"))}function Br(e,t){return typeof e.ref=="string"?t.resolve?.(e.ref):e.definition}function wt(e,t="",n={}){if(!x(e))return J("Action binding must be an object.",t);if("ref"in e){if(typeof e.ref!="string"||e.ref.length===0)return J("'ref' must name a shared action.",Q(t,"ref"));if("definition"in e)return J("A binding is either a { ref } or a { definition }, not both.",t);if(n.resolve&&n.resolve(e.ref)===void 0)return J(`Unknown action '${e.ref}'.`,Q(t,"ref"))}else if("definition"in e){let o=Be(e.definition,Q(t,"definition"),{...n.isPath?{isPath:n.isPath}:{}});if(o)return o}else return J("A binding names a shared action ({ ref }) or carries an inline { definition }.",t);let i=Br(e,n);if(n.loadOnly&&i!==void 0&&(i.kind!=="http"||i.method!=="GET"))return J("'load' accepts only http GET actions.",t);if(e.input!==void 0){if(!x(e.input))return J("'input' must be an object.",Q(t,"input"));if(i?.kind==="prompt")return J("Prompt actions take no input mapping.",Q(t,"input"));let o=i?.kind==="http"&&x(i.input.properties)?i.input.properties:void 0;for(let[a,g]of Object.entries(e.input)){let c=Q(t,`input.${a}`);if(o!==void 0&&!(a in o))return J(`Input field '${a}' is not declared by the action's input schema.`,c);if(typeof g=="string"){if(n.isPath&&!n.isPath(g))return J(`Invalid data path '${g}'.`,c);continue}if(x(g)&&"const"in g&&Object.keys(g).length===1){if(Kt(g.const))return J("Secret references are allowed only in headers and query.",c);continue}return J("Input values are data paths or { const } literals.",c)}}if(e.output!==void 0){let o=Q(t,"output");if(!x(e.output))return J("'output' must be an object.",o);if(i?.kind==="prompt")return J("Prompt actions have no output.",o);let{mode:a,path:g,map:c}=e.output;if(a!==void 0&&!Fe.some(l=>l===a))return J("'mode' must be replace, merge or patch.",Q(o,"mode"));if(a==="patch"){if(typeof g!="string"||!ht(g))return J("'patch' requires a valid data 'path'.",Q(o,"path"))}else if(g!==void 0)return J(`'path' is only meaningful with mode "patch".`,Q(o,"path"));if(c!==void 0){if(!x(c))return J("'map' must be an object of data paths.",Q(o,"map"));let l=Object.entries(c);if(l.length===0)return J("'map' must not be empty (omit it to take the whole response).",Q(o,"map"));for(let[u,p]of l){let m=Q(o,`map.${u}`);if(u==="."){if(l.length>1)return J("A '.' target takes the whole projection and must be the only entry.",m)}else if(!ht(u))return J(`'${u}' is not a valid data path.`,m);if(typeof p!="string"||p!=="."&&!ht(p))return J("Map values are data paths into the response ('.' for the whole response).",m)}}}}function Ge(e,t="load",n={}){return wt(e,t,{...n,loadOnly:!0})}function Ie(e,t){return e===""?t:`${e}.${t}`}function oe(e,t){return{code:"INVALID_TEMPLATE_NODE",message:e,path:t}}function yt(e,t){if(me(e)===void 0)return{code:"INVALID_PATH",message:`Invalid data path '${e}'.`,path:t}}function ze(e,t,n){if(n>Ft)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${Ft}.`,path:t};if(typeof e!="string"){if(!x(e))return oe("Template node must be a string or a plain object.",t);if("bind"in e)return typeof e.bind!="string"?oe("'bind' must be a string path.",t):yt(e.bind,t);if("each"in e){if(typeof e.each!="string")return oe("'each' must be a string path.",t);let r=yt(e.each,t);if(r)return r;if(!("template"in e))return oe("'each' node requires a 'template'.",t);let i=ze(e.template,Ie(t,"template"),n+1);return i||("empty"in e&&e.empty!==void 0?ze(e.empty,Ie(t,"empty"),n+1):void 0)}if("when"in e){if(typeof e.when!="string")return oe("'when' must be a string path.",t);let r=yt(e.when,t);if(r)return r;if(!("template"in e))return oe("'when' node requires a 'template'.",t);let i=ze(e.template,Ie(t,"template"),n+1);return i||("else"in e&&e.else!==void 0?ze(e.else,Ie(t,"else"),n+1):void 0)}if("tag"in e){if(typeof e.tag!="string"||e.tag.length===0)return oe("'tag' must be a non-empty string.",t);if(pt.has(e.tag.toLowerCase()))return{code:"FORBIDDEN_TAG",message:`Element '${e.tag}' is not allowed in templates (active or foreign content).`,path:t};if("attrs"in e&&e.attrs!==void 0){if(!x(e.attrs))return oe("'attrs' must be an object.",t);for(let[r,i]of Object.entries(e.attrs)){let o=Ie(t,`attrs.${r}`);if(ut.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is not allowed in templates (event handlers and srcdoc).`,path:o};if(gt.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is reserved for the renderer (data-wg-*); use an 'action' binding.`,path:o};if(typeof i!="string"){if(x(i)&&typeof i.bind=="string"){let a=yt(i.bind,o);if(a)return a;let g=i.map!==void 0,c=i.prefix!==void 0;if(g&&c)return oe(`Attribute '${r}' carries both 'map' and 'prefix' \u2014 one transform per value.`,o);if(g){if(!x(i.map)||Object.values(i.map).some(l=>typeof l!="string"))return oe(`Attribute '${r}': 'map' must be an object of string values.`,o);if(i.default!==void 0&&typeof i.default!="string")return oe(`Attribute '${r}': 'default' must be a string.`,o)}else if(i.default!==void 0)return oe(`Attribute '${r}': 'default' requires 'map'.`,o);if(c&&typeof i.prefix!="string")return oe(`Attribute '${r}': 'prefix' must be a string.`,o);continue}return oe(`Attribute '${r}' must be a string, { bind }, { bind, map, default? } or { bind, prefix } value.`,o)}}}if("action"in e&&e.action!==void 0){if(x(e.attrs)&&Object.keys(e.attrs).some(o=>o.toLowerCase()==="href"))return{code:"CONFLICTING_ATTRIBUTES",message:"An element carries 'href' or an 'action' binding, never both.",path:t};let i=wt(e.action,Ie(t,"action"),{isPath:o=>me(o)!==void 0});if(i)return{code:"INVALID_ACTION",message:i.message,path:i.path}}if("children"in e&&e.children!==void 0){if(!Array.isArray(e.children))return oe("'children' must be an array.",t);for(let r=0;r<e.children.length;r++){let i=ze(e.children[r],Ie(t,`children.${r}`),n+1);if(i)return i}}return}return oe("Unknown template node form (expected text, bind, tag, each, or when).",t)}}function Te(e){let t=ze(e,"",0);return t?{ok:!1,error:t}:{ok:!0,template:e}}function zr(e,t,n){let r=i=>{if(x(i)){x(i.action)&&n(i.action);for(let o of["template","empty","else"])i[o]!==void 0&&r(i[o]);if(Array.isArray(i.children))for(let o of i.children)r(o)}};r(e),x(t)&&n(t)}function Ye(e,t){let n=new Set;return zr(e,t,r=>{typeof r.ref=="string"&&n.add(r.ref)}),[...n]}function bt(e,t){return e===""?t:`${e}.${t}`}function Je(e,t,n){let r=me(e);if(r===void 0)return;let i;if(r.base==="meta")i=n;else if(r.base==="root")i=t[0]?.scope;else{let o=t.length-1-r.up;if(o<0)return;let a=t[o];if(a===void 0)return;if(r.index)return a.index;i=a.scope}for(let o of r.segments)if(Array.isArray(i)){let a=Number(o);i=Number.isInteger(a)?i[a]:void 0}else if(x(i))i=i[o];else return;return i}var jn=5e4;function Jr(e,t,n,r,i){let o="ref"in e&&typeof e.ref=="string"?i.actions?.(e.ref):"definition"in e&&x(e.definition)?e.definition:void 0;if(o===void 0||o.kind!=="prompt"&&o.kind!=="http"){let c={id:t,disabled:"unresolved"};return i.kind!==void 0&&(c.widget=i.kind),c}if(o.kind==="prompt"){let c="",l=Array.isArray(o.text)?o.text:[];for(let p of l)if(typeof p=="string"?c+=p:x(p)&&typeof p.bind=="string"&&(c+=te(Je(p.bind,n,r))),c.length>=2e3)break;let u={id:t,kind:"prompt",text:Array.from(c).slice(0,2e3).join("")};return i.kind!==void 0&&(u.widget=i.kind),u}let a={};if(x(e.input))for(let[c,l]of Object.entries(e.input)){let u;typeof l=="string"?u=Je(l,n,r):x(l)&&"const"in l&&(u=l.const),u!==void 0&&(a[c]=u)}let g={id:t,kind:"http",args:a};return i.httpDisabled!==void 0&&(g.disabled=i.httpDisabled),i.kind!==void 0&&(g.widget=i.kind),g}function Xe(e,t,n,r,i,o){if(r.remaining<=0)return r.truncated=!0,[];if(typeof e=="string")return r.remaining--,[e];if(!x(e))return[];if(typeof e.bind=="string")return r.remaining--,[te(Je(e.bind,t,n))];if(typeof e.each=="string"){let a=Je(e.each,t,n),g=Array.isArray(a)?a:[];if(g.length===0)return e.empty===void 0?[]:Xe(e.empty,t,n,r,bt(i,"empty"),o);let c=[],l=bt(i,"template");for(let u=0;u<g.length;u++){if(r.remaining<=0){r.truncated=!0;break}r.remaining--,t.push({scope:g[u],index:u}),c.push(...Xe(e.template,t,n,r,l,o)),t.pop()}return c}if(typeof e.when=="string"){let a=!!Je(e.when,t,n),g=a?e.template:e.else;return g===void 0?[]:Xe(g,t,n,r,bt(i,a?"template":"else"),o)}if(typeof e.tag=="string"&&e.tag.length>0){if(pt.has(e.tag.toLowerCase()))return[];r.remaining--;let a={};if(x(e.attrs))for(let[l,u]of Object.entries(e.attrs)){if(ut.test(l)||gt.test(l))continue;let p;if(typeof u=="string")p=u;else if(x(u)&&typeof u.bind=="string"){let w=Je(u.bind,t,n);if(x(u.map)){let f=te(w),y=Object.prototype.hasOwnProperty.call(u.map,f)?u.map[f]:void 0;p=typeof y=="string"?y:typeof u.default=="string"?u.default:""}else if(typeof u.prefix=="string"){let f=te(w);p=f===""?"":u.prefix+f}else p=te(w)}if(p===void 0)continue;let m=l.toLowerCase();if(Ln.has(m)){let w=m==="src"&&e.tag.toLowerCase()==="img";if(!(Bt(p)||w&&Re(p)))continue}a[l]=p}x(e.action)&&(a["data-wg-action"]=JSON.stringify(Jr(e.action,i,t,n,o)));let g=Array.isArray(e.children)?e.children.flatMap((l,u)=>Xe(l,t,n,r,bt(i,`children.${u}`),o)):[],c={tag:e.tag};return Object.keys(a).length>0&&(c.attrs=a),g.length>0&&(c.children=g),[c]}return[]}function vt(e,t={}){let n=t.maxNodes??jn,r=t;return i=>{let o={remaining:n,truncated:!1},a=[{scope:i.data}],g=Xe(e,a,i.meta,o,"",r);if(!o.truncated&&g.length===1){let l=g[0];if(l!==void 0)return l}let c={class:"wg-template"};return o.truncated&&(c["data-truncated"]="true"),{tag:"div",attrs:c,children:g}}}function Me(e,t){if(typeof e=="string")return t.createTextNode(e);let n=t.createElement(e.tag);if(e.attrs)for(let[r,i]of Object.entries(e.attrs))n.setAttribute(r,i);if(e.children)for(let r of e.children)n.appendChild(Me(r,t));return n}function qt(e,t,n){if(typeof e=="string"&&typeof t=="string")return e!==t&&(n.nodeValue=t),n;if(typeof e!="string"&&typeof t!="string"&&e.tag===t.tag&&n.nodeType===1)return Vr(e,t,n),n;let r=n.ownerDocument;if(!r||!n.parentNode)return n;let i=Me(t,r);return n.parentNode.replaceChild(i,n),i}function Vr(e,t,n){let r=e.attrs??{},i=t.attrs??{};for(let[o,a]of Object.entries(i))r[o]!==a&&n.setAttribute(o,a);for(let o of Object.keys(r))o in i||n.removeAttribute(o);Ur(e.children??[],t.children??[],n)}function Ur(e,t,n){let r=n.ownerDocument,i=[];for(let a=0;a<n.childNodes.length;a++){let g=n.childNodes[a];g&&i.push(g)}let o=Math.min(e.length,t.length);for(let a=0;a<o;a++){let g=e[a],c=t[a],l=i[a];g===void 0||c===void 0||(l?qt(g,c,l):n.appendChild(Me(c,r)))}for(let a=o;a<t.length;a++){let g=t[a];g!==void 0&&n.appendChild(Me(g,r))}for(let a=e.length-1;a>=o;a--){let g=i[a];g&&n.removeChild(g)}}function Gt(e,t,n={}){let r=n.catalog??ye(),i,o,a=!1,g,c=n.onAction;function l(w){try{let f=JSON.parse(w.getAttribute("data-wg-action")??"");if(typeof f=="object"&&f!==null&&typeof f.id=="string")return f}catch{}}function u(w){let y=w.target?.closest?.("[data-wg-action]");if(!y||!t.contains(y))return;if(w.type==="keydown"){let S=w.key;if(S!=="Enter"&&S!==" "||y.tagName==="BUTTON"||y.tagName==="A")return}if(w.preventDefault(),c===void 0)return;let v=l(y);v!==void 0&&c(v,g)}t.addEventListener("click",u),t.addEventListener("keydown",u);function p(w){if(a)throw new Error("Widget mount is disposed; create a new mount instead of updating.");let f=r.render(w);if(!f.ok)return f;if(i===void 0||o===void 0){let y=Me(f.node,t.ownerDocument);t.replaceChildren(y),o=y}else o=qt(i,f.node,o);return i=f.node,g=w,{ok:!0}}function m(){a||(a=!0,t.removeEventListener("click",u),t.removeEventListener("keydown",u),t.replaceChildren(),i=void 0,o=void 0,g=void 0)}return{initial:p(e),update:p,node:()=>i,dispose:m}}var Xt=["bg","panel","border","line","text","muted","accent","accent-bg","accent-line","danger","danger-bg","danger-line","hover","hl-key","hl-str","hl-num","hl-bool","hl-punct","font","font-mono","font-size","font-size-sm","font-size-xs","radius-sm","radius","radius-lg","gap","shadow"],Rn={font:"system-ui, sans-serif","font-mono":"ui-monospace, monospace","font-size":"13px","font-size-sm":"12px","font-size-xs":"11px"},Cn={light:{bg:"#f6fafc",panel:"#ffffff",border:"#6e95a6",line:"#e4ecf2",text:"#0b1b26",muted:"#56707f",accent:"#1e6f92","accent-bg":"#e3f1f7","accent-line":"#4b91ae",danger:"#b42318","danger-bg":"#fdf2f2","danger-line":"#c97572",hover:"#eef5f9","hl-key":"#1e6f92","hl-str":"#2e7d5b","hl-num":"#96620f","hl-bool":"#7a4fbf","hl-punct":"#56707f",...Rn,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(11, 27, 38, 0.35)"},dark:{bg:"#0b141b",panel:"#10202a",border:"#437082",line:"#1b2f3d",text:"#e6f0f5",muted:"#93a9b6",accent:"#8acbe6","accent-bg":"#14303d","accent-line":"#3e7e98",danger:"#f0a3a3","danger-bg":"#2a1a1c","danger-line":"#a3524f",hover:"#152a36","hl-key":"#8acbe6","hl-str":"#6cc79a","hl-num":"#e0b25a","hl-bool":"#bb9af7","hl-punct":"#93a9b6",...Rn,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(0, 0, 0, 0.7)"}};function Yt(e,t,n){return Xt.map(r=>`${n}${t}-${r}: ${e[r]};`).join(`
178
- `)}function $n(e,t={}){let n=t.prefix??"--wgd",r=t.selector??":root",i=t.darkMediaSelector??r,o=[`${r} {
179
- ${Yt(e.light,n," ")}
211
+ `.trim(),tr="data-widgentic";function gn(e){if(e.head.querySelector(`style[${tr}]`))return;let t=e.createElement("style");t.setAttribute(tr,"base"),t.textContent=nr,e.head.appendChild(t)}function yi(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var bi=new Set(xe),mn=/^x-[a-z0-9][a-z0-9-]*$/;function vi(e){return Object.keys(e).filter(t=>mn.test(t))}function rr(e){return`--wg-${e}`}function Be(e){if(!yi(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!bi.has(t)&&!mn.test(t))return{ok:!1,error:{code:"UNKNOWN_TOKEN",message:`Unknown theme token '${t}'. Use a registry token, or a custom variable named 'x-<lowercase-kebab>'.`,token:t}};if(typeof n!="string"||!Fe(n))return{ok:!1,error:{code:"INVALID_TOKEN_VALUE",message:`Token '${t}' has an invalid or unsafe value.`,token:t}}}return{ok:!0,theme:e}}function xi(e){let t=e,n;for(let r of xe){let{fallback:i}=ve[r];if(i===void 0||typeof t[r]=="string")continue;let o=t[i];typeof o=="string"&&(n??={...t},n[r]=o)}return n??e}function hn(e,t){let n=xi(t),r=e.style;if(!r)return;for(let o of xe)r.removeProperty(rr(o));for(let o=r.length-1;o>=0;o--){let a=r.item(o);a.startsWith("--wg-x-")&&r.removeProperty(a)}let i=[...xe,...vi(n)];for(let o of i){let a=n[o];typeof a=="string"&&Fe(a)&&r.setProperty(rr(o),a)}}var Pt=/^(?:on.*|srcdoc)$/i,Wt=new Set(["script","iframe","frame","frameset","object","embed","style","link","meta","base","template","noscript"]),_t=/^data-wg-/i,ir=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),wn=64;var ki=new Set(["$meta","$root","$parent","$index"]);function ke(e){if(e===".")return{base:"scope",up:0,index:!1,segments:[]};let t=e.split("."),n=0,r="scope",i=0;if(t[0]==="$meta")r="meta",n=1;else if(t[0]==="$root")r="root",n=1;else for(;t[n]==="$parent";)i++,n++;let o=t.slice(n);if(o.length===1&&o[0]==="$index")return r!=="scope"?void 0:{base:r,up:i,index:!0,segments:[]};if(o.length===0)return r==="meta"?void 0:{base:r,up:i,index:!1,segments:[]};if(!o.some(a=>a===""||ki.has(a)))return{base:r,up:i,index:!1,segments:o}}var It=/^[a-z][a-z0-9-]{0,63}$/,Mt=It,ut=["replace","merge","patch"],pt=["GET","POST"];function ne(e,t){return e===""?t:`${e}.${t}`}function z(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var Ei=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Si=new Set(["host","content-length","transfer-encoding","connection"]),Ti=new Set(["__proto__","constructor","prototype"]);function Ht(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!Ti.has(t))}function Ai(e,t){if(typeof e!="string")return k(e)&&typeof e.secret=="string"?It.test(e.secret)?Object.keys(e).length!==1?z("A secret reference carries only 'secret'.",t):void 0:z(`Secret reference '${e.secret}' is not a valid secret name.`,t):z("Value must be a string or a { secret } reference.",t)}function yn(e){return!k(e)&&!Array.isArray(e)?!1:k(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(yn)}function Di(e,t){if(typeof e!="string"||e.length===0)return z("'url' must be a non-empty string.",t);let n;try{n=new URL(e)}catch{return z(`'url' must be an absolute URL (got '${e}').`,t)}if(n.protocol!=="https:")return z("'url' must use https.",t);if(n.username!==""||n.password!=="")return z("'url' must not carry userinfo.",t);if(n.hash!=="")return z("'url' must not carry a fragment.",t)}function nt(e,t="",n={}){if(!k(e))return z("Action definition must be an object.",t);if(e.kind==="prompt"){if(!Array.isArray(e.text))return z("'text' must be an array of literals and { bind } segments.",ne(t,"text"));let r=0;for(let i=0;i<e.text.length;i++){let o=e.text[i];if(typeof o=="string"){r+=o.length;continue}if(k(o)&&typeof o.bind=="string"&&Object.keys(o).length===1){if(n.isPath&&!n.isPath(o.bind))return z(`Invalid data path '${o.bind}'.`,ne(t,`text.${i}`));continue}return z("Prompt segments are strings or { bind } objects.",ne(t,`text.${i}`))}return r>2e3?z(`Prompt text exceeds ${2e3} characters.`,ne(t,"text")):void 0}if(e.kind==="http"){if(!pt.some(i=>i===e.method))return z("'method' must be GET or POST.",ne(t,"method"));let r=Di(e.url,ne(t,"url"));if(r)return r;if(!k(e.input)||e.input.type!=="object")return z(`'input' must be a JSON Schema with type "object".`,ne(t,"input"));if(yn(e.input))return z("Secret references are allowed only in headers and query.",ne(t,"input"));if(!k(e.output))return z("'output' must be a JSON Schema object.",ne(t,"output"));for(let i of["headers","query"]){let o=e[i];if(o!==void 0){if(!k(o))return z(`'${i}' must be an object.`,ne(t,i));for(let[a,f]of Object.entries(o)){let c=ne(t,`${i}.${a}`);if(!Ei.test(a))return z(`'${a}' is not a valid ${i==="headers"?"header":"parameter"} name.`,c);if(i==="headers"&&Si.has(a.toLowerCase()))return z(`Header '${a}' is set by the transport and cannot be declared.`,c);let l=Ai(f,c);if(l)return l}}}return}return z(`'kind' must be "prompt" or "http".`,ne(t,"kind"))}function Oi(e,t){return typeof e.ref=="string"?t.resolve?.(e.ref):e.definition}function Ft(e,t="",n={}){if(!k(e))return z("Action binding must be an object.",t);if("ref"in e){if(typeof e.ref!="string"||e.ref.length===0)return z("'ref' must name a shared action.",ne(t,"ref"));if("definition"in e)return z("A binding is either a { ref } or a { definition }, not both.",t);if(n.resolve&&n.resolve(e.ref)===void 0)return z(`Unknown action '${e.ref}'.`,ne(t,"ref"))}else if("definition"in e){let o=nt(e.definition,ne(t,"definition"),{...n.isPath?{isPath:n.isPath}:{}});if(o)return o}else return z("A binding names a shared action ({ ref }) or carries an inline { definition }.",t);let i=Oi(e,n);if(n.loadOnly&&i!==void 0&&(i.kind!=="http"||i.method!=="GET"))return z("'load' accepts only http GET actions.",t);if(e.input!==void 0){if(!k(e.input))return z("'input' must be an object.",ne(t,"input"));if(i?.kind==="prompt")return z("Prompt actions take no input mapping.",ne(t,"input"));let o=i?.kind==="http"&&k(i.input.properties)?i.input.properties:void 0;for(let[a,f]of Object.entries(e.input)){let c=ne(t,`input.${a}`);if(o!==void 0&&!(a in o))return z(`Input field '${a}' is not declared by the action's input schema.`,c);if(typeof f=="string"){if(n.isPath&&!n.isPath(f))return z(`Invalid data path '${f}'.`,c);continue}if(k(f)&&"const"in f&&Object.keys(f).length===1){if(yn(f.const))return z("Secret references are allowed only in headers and query.",c);continue}return z("Input values are data paths or { const } literals.",c)}}if(e.output!==void 0){let o=ne(t,"output");if(!k(e.output))return z("'output' must be an object.",o);if(i?.kind==="prompt")return z("Prompt actions have no output.",o);let{mode:a,path:f,map:c}=e.output;if(a!==void 0&&!ut.some(l=>l===a))return z("'mode' must be replace, merge or patch.",ne(o,"mode"));if(a==="patch"){if(typeof f!="string"||!Ht(f))return z("'patch' requires a valid data 'path'.",ne(o,"path"))}else if(f!==void 0)return z(`'path' is only meaningful with mode "patch".`,ne(o,"path"));if(c!==void 0){if(!k(c))return z("'map' must be an object of data paths.",ne(o,"map"));let l=Object.entries(c);if(l.length===0)return z("'map' must not be empty (omit it to take the whole response).",ne(o,"map"));for(let[u,p]of l){let m=ne(o,`map.${u}`);if(u!=="."&&!Ht(u))return z(`'${u}' is not a valid data path.`,m);if(typeof p!="string"||p!=="."&&!Ht(p))return z("Map values are data paths into the response ('.' for the whole response).",m)}}}}function gt(e,t="load",n={}){return Ft(e,t,{...n,loadOnly:!0})}function Ue(e,t){return e===""?t:`${e}.${t}`}function ie(e,t){return{code:"INVALID_TEMPLATE_NODE",message:e,path:t}}function or(e,t,n){let r=i=>ie(`${t}: ${i}`,n);if(!k(e))return r("'format' must be an object.");if(!Qe(e.type))return r(`'format.type' must be one of ${Ze.join(", ")}.`);if(e.type==="date")return typeof e.pattern!="string"?r("'format.pattern' must be a string."):e.pattern.length===0||e.pattern.length>Rt?r(`'format.pattern' must be 1-${Rt} characters.`):un.test(e.pattern)?Ct(e.pattern)===void 0?r(`'format.pattern' must use at least one of ${tt.join(", ")} and no stray letters.`):void 0:r("'format.pattern' may contain only the date tokens and separators.");if(e.decimals!==void 0&&(typeof e.decimals!="number"||!Number.isInteger(e.decimals)||e.decimals<_e||e.decimals>Ie))return r(`'format.decimals' must be an integer ${_e}-${Ie}.`);if(e.locale!==void 0&&(typeof e.locale!="string"||!Lt.test(e.locale)||!pn(e.locale)))return r("'format.locale' must be a BCP-47 language tag this runtime knows.");if(e.type==="currency"){if(typeof e.currency!="string"||!Nt.test(e.currency))return r("'format.currency' must be a three-letter uppercase ISO-4217 code.");if(e.currencyDisplay!==void 0&&!et(e.currencyDisplay))return r(`'format.currencyDisplay' must be one of ${Me.join(", ")}.`)}return $t(e)===void 0?r("'format' is not a spec the engine accepts."):void 0}var sr=["map","prefix","format"];function mt(e){let t=sr.filter(n=>e[n]!==void 0);return t.length>1?"conflict":t[0]}function Bt(e,t){if(ke(e)===void 0)return{code:"INVALID_PATH",message:`Invalid data path '${e}'.`,path:t}}function rt(e,t,n){if(n>wn)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${wn}.`,path:t};if(typeof e!="string"){if(!k(e))return ie("Template node must be a string or a plain object.",t);if("bind"in e){if(typeof e.bind!="string")return ie("'bind' must be a string path.",t);let r=Bt(e.bind,t);return r||(e.map!==void 0&&e.format!==void 0?ie("A text bind carries either 'map' or 'format' \u2014 one transform per value.",t):e.map!==void 0?!k(e.map)||Object.values(e.map).some(i=>typeof i!="string")?ie("Bind: 'map' must be an object of string values.",t):e.default!==void 0&&typeof e.default!="string"?ie("Bind: 'default' must be a string.",t):void 0:e.default!==void 0?ie("Bind: 'default' requires 'map'.",t):e.format!==void 0?or(e.format,"Bind",t):void 0)}if("each"in e){if(typeof e.each!="string")return ie("'each' must be a string path.",t);let r=Bt(e.each,t);if(r)return r;if(!("template"in e))return ie("'each' node requires a 'template'.",t);let i=rt(e.template,Ue(t,"template"),n+1);return i||("empty"in e&&e.empty!==void 0?rt(e.empty,Ue(t,"empty"),n+1):void 0)}if("when"in e){if(typeof e.when!="string")return ie("'when' must be a string path.",t);let r=Bt(e.when,t);if(r)return r;if(!("template"in e))return ie("'when' node requires a 'template'.",t);let i=rt(e.template,Ue(t,"template"),n+1);return i||("else"in e&&e.else!==void 0?rt(e.else,Ue(t,"else"),n+1):void 0)}if("tag"in e){if(typeof e.tag!="string"||e.tag.length===0)return ie("'tag' must be a non-empty string.",t);if(Wt.has(e.tag.toLowerCase()))return{code:"FORBIDDEN_TAG",message:`Element '${e.tag}' is not allowed in templates (active or foreign content).`,path:t};if("attrs"in e&&e.attrs!==void 0){if(!k(e.attrs))return ie("'attrs' must be an object.",t);for(let[r,i]of Object.entries(e.attrs)){let o=Ue(t,`attrs.${r}`);if(Pt.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is not allowed in templates (event handlers and srcdoc).`,path:o};if(_t.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is reserved for the renderer (data-wg-*); use an 'action' binding.`,path:o};if(typeof i!="string"){if(k(i)&&typeof i.bind=="string"){let a=Bt(i.bind,o);if(a)return a;let f=mt(i),c=f==="map",l=f==="prefix",u=f==="format";if(f==="conflict")return ie(`Attribute '${r}' carries more than one of 'map', 'prefix' and 'format' \u2014 one transform per value.`,o);if(c){if(!k(i.map)||Object.values(i.map).some(p=>typeof p!="string"))return ie(`Attribute '${r}': 'map' must be an object of string values.`,o);if(i.default!==void 0&&typeof i.default!="string")return ie(`Attribute '${r}': 'default' must be a string.`,o)}else if(i.default!==void 0)return ie(`Attribute '${r}': 'default' requires 'map'.`,o);if(l&&typeof i.prefix!="string")return ie(`Attribute '${r}': 'prefix' must be a string.`,o);if(u){let p=or(i.format,`Attribute '${r}'`,o);if(p)return p}continue}return ie(`Attribute '${r}' must be a string, { bind }, { bind, map, default? }, { bind, prefix } or { bind, format } value.`,o)}}}if("action"in e&&e.action!==void 0){if(k(e.attrs)&&Object.keys(e.attrs).some(o=>o.toLowerCase()==="href"))return{code:"CONFLICTING_ATTRIBUTES",message:"An element carries 'href' or an 'action' binding, never both.",path:t};let i=Ft(e.action,Ue(t,"action"),{isPath:o=>ke(o)!==void 0});if(i)return{code:"INVALID_ACTION",message:i.message,path:i.path}}if("children"in e&&e.children!==void 0){if(!Array.isArray(e.children))return ie("'children' must be an array.",t);for(let r=0;r<e.children.length;r++){let i=rt(e.children[r],Ue(t,`children.${r}`),n+1);if(i)return i}}return}return ie("Unknown template node form (expected text, bind, tag, each, or when).",t)}}function Oe(e){let t=rt(e,"",0);return t?{ok:!1,error:t}:{ok:!0,template:e}}function Ni(e,t,n){let r=i=>{if(k(i)){k(i.action)&&n(i.action);for(let o of["template","empty","else"])i[o]!==void 0&&r(i[o]);if(Array.isArray(i.children))for(let o of i.children)r(o)}};r(e),k(t)&&n(t)}function ht(e,t){let n=new Set;return Ni(e,t,r=>{typeof r.ref=="string"&&n.add(r.ref)}),[...n]}function Ut(e,t){return e===""?t:`${e}.${t}`}function it(e,t,n){let r=ke(e);if(r===void 0)return;let i;if(r.base==="meta")i=n;else if(r.base==="root")i=t[0]?.scope;else{let o=t.length-1-r.up;if(o<0)return;let a=t[o];if(a===void 0)return;if(r.index)return a.index;i=a.scope}for(let o of r.segments)if(Array.isArray(i)){let a=Number(o);i=Number.isInteger(a)?i[a]:void 0}else if(k(i))i=i[o];else return;return i}var ar=5e4;function Ri(e,t,n,r,i){let o="ref"in e&&typeof e.ref=="string"?i.actions?.(e.ref):"definition"in e&&k(e.definition)?e.definition:void 0;if(o===void 0||o.kind!=="prompt"&&o.kind!=="http"){let c={id:t,disabled:"unresolved"};return i.kind!==void 0&&(c.widget=i.kind),c}if(o.kind==="prompt"){let c="",l=Array.isArray(o.text)?o.text:[];for(let p of l)if(typeof p=="string"?c+=p:k(p)&&typeof p.bind=="string"&&(c+=re(it(p.bind,n,r))),c.length>=2e3)break;let u={id:t,kind:"prompt",text:Array.from(c).slice(0,2e3).join("")};return i.kind!==void 0&&(u.widget=i.kind),u}let a={};if(k(e.input))for(let[c,l]of Object.entries(e.input)){let u;typeof l=="string"?u=it(l,n,r):k(l)&&"const"in l&&(u=l.const),u!==void 0&&(a[c]=u)}let f={id:t,kind:"http",args:a};return i.httpDisabled!==void 0&&(f.disabled=i.httpDisabled),i.kind!==void 0&&(f.widget=i.kind),f}function wt(e,t,n,r,i,o){if(r.remaining<=0)return r.truncated=!0,[];if(typeof e=="string")return r.remaining--,[e];if(!k(e))return[];if(typeof e.bind=="string"){r.remaining--;let a=it(e.bind,t,n);if(k(e.map)){let f=re(a),c=Object.prototype.hasOwnProperty.call(e.map,f)?e.map[f]:void 0;return[typeof c=="string"?c:typeof e.default=="string"?e.default:""]}return[jt(a,e.format)]}if(typeof e.each=="string"){let a=it(e.each,t,n),f=Array.isArray(a)?a:[];if(f.length===0)return e.empty===void 0?[]:wt(e.empty,t,n,r,Ut(i,"empty"),o);let c=[],l=Ut(i,"template");for(let u=0;u<f.length;u++){if(r.remaining<=0){r.truncated=!0;break}r.remaining--,t.push({scope:f[u],index:u}),c.push(...wt(e.template,t,n,r,l,o)),t.pop()}return c}if(typeof e.when=="string"){let a=!!it(e.when,t,n),f=a?e.template:e.else;return f===void 0?[]:wt(f,t,n,r,Ut(i,a?"template":"else"),o)}if(typeof e.tag=="string"&&e.tag.length>0){if(Wt.has(e.tag.toLowerCase()))return[];r.remaining--;let a={};if(k(e.attrs))for(let[l,u]of Object.entries(e.attrs)){if(Pt.test(l)||_t.test(l))continue;let p;if(typeof u=="string")p=u;else if(k(u)&&typeof u.bind=="string"){let y=it(u.bind,t,n);if(k(u.map)){let g=re(y),b=Object.prototype.hasOwnProperty.call(u.map,g)?u.map[g]:void 0;p=typeof b=="string"?b:typeof u.default=="string"?u.default:""}else if(typeof u.prefix=="string"){let g=re(y);p=g===""?"":u.prefix+g}else u.format!==void 0?p=jt(y,u.format):p=re(y)}if(p===void 0)continue;let m=l.toLowerCase();if(ir.has(m)){let y=m==="src"&&e.tag.toLowerCase()==="img";if(!(cn(p)||y&&Pe(p)))continue}a[l]=p}k(e.action)&&(a["data-wg-action"]=JSON.stringify(Ri(e.action,i,t,n,o)));let f=Array.isArray(e.children)?e.children.flatMap((l,u)=>wt(l,t,n,r,Ut(i,`children.${u}`),o)):[],c={tag:e.tag};return Object.keys(a).length>0&&(c.attrs=a),f.length>0&&(c.children=f),[c]}return[]}function zt(e,t={}){let n=t.maxNodes??ar,r=t;return i=>{let o={remaining:n,truncated:!1},a=[{scope:i.data}],f=wt(e,a,i.meta,o,"",r);if(!o.truncated&&f.length===1){let l=f[0];if(l!==void 0)return l}let c={class:"wg-template"};return o.truncated&&(c["data-truncated"]="true"),{tag:"div",attrs:c,children:f}}}function ze(e,t){if(typeof e=="string")return t.createTextNode(e);let n=t.createElement(e.tag);if(e.attrs)for(let[r,i]of Object.entries(e.attrs))n.setAttribute(r,i);if(e.children)for(let r of e.children)n.appendChild(ze(r,t));return n}function bn(e,t,n){if(typeof e=="string"&&typeof t=="string")return e!==t&&(n.nodeValue=t),n;if(typeof e!="string"&&typeof t!="string"&&e.tag===t.tag&&n.nodeType===1)return Li(e,t,n),n;let r=n.ownerDocument;if(!r||!n.parentNode)return n;let i=ze(t,r);return n.parentNode.replaceChild(i,n),i}function Li(e,t,n){let r=e.attrs??{},i=t.attrs??{};for(let[o,a]of Object.entries(i))r[o]!==a&&n.setAttribute(o,a);for(let o of Object.keys(r))o in i||n.removeAttribute(o);Ci(e.children??[],t.children??[],n)}function Ci(e,t,n){let r=n.ownerDocument,i=[];for(let a=0;a<n.childNodes.length;a++){let f=n.childNodes[a];f&&i.push(f)}let o=Math.min(e.length,t.length);for(let a=0;a<o;a++){let f=e[a],c=t[a],l=i[a];f===void 0||c===void 0||(l?bn(f,c,l):n.appendChild(ze(c,r)))}for(let a=o;a<t.length;a++){let f=t[a];f!==void 0&&n.appendChild(ze(f,r))}for(let a=e.length-1;a>=o;a--){let f=i[a];f&&n.removeChild(f)}}function vn(e,t,n={}){let r=n.catalog??Ee(),i,o,a=!1,f,c=n.onAction;function l(y){try{let g=JSON.parse(y.getAttribute("data-wg-action")??"");if(typeof g=="object"&&g!==null&&typeof g.id=="string")return g}catch{}}function u(y){let b=y.target?.closest?.("[data-wg-action]");if(!b||!t.contains(b))return;if(y.type==="keydown"){let T=y.key;if(T!=="Enter"&&T!==" "||b.tagName==="BUTTON"||b.tagName==="A")return}if(y.preventDefault(),c===void 0)return;let v=l(b);v!==void 0&&c(v,f)}t.addEventListener("click",u),t.addEventListener("keydown",u);function p(y){if(a)throw new Error("Widget mount is disposed; create a new mount instead of updating.");let g=r.render(y);if(!g.ok)return g;if(i===void 0||o===void 0){let b=ze(g.node,t.ownerDocument);t.replaceChildren(b),o=b}else o=bn(i,g.node,o);return i=g.node,f=y,{ok:!0}}function m(){a||(a=!0,t.removeEventListener("click",u),t.removeEventListener("keydown",u),t.replaceChildren(),i=void 0,o=void 0,f=void 0)}return{initial:p(e),update:p,node:()=>i,dispose:m}}var kn=["bg","panel","border","line","text","muted","accent","accent-bg","accent-line","danger","danger-bg","danger-line","hover","hl-key","hl-str","hl-num","hl-bool","hl-punct","font","font-mono","font-size","font-size-sm","font-size-xs","radius-sm","radius","radius-lg","gap","shadow"],dr={font:"system-ui, sans-serif","font-mono":"ui-monospace, monospace","font-size":"13px","font-size-sm":"12px","font-size-xs":"11px"},cr={light:{bg:"#f6fafc",panel:"#ffffff",border:"#6e95a6",line:"#e4ecf2",text:"#0b1b26",muted:"#56707f",accent:"#1e6f92","accent-bg":"#e3f1f7","accent-line":"#4b91ae",danger:"#b42318","danger-bg":"#fdf2f2","danger-line":"#c97572",hover:"#eef5f9","hl-key":"#1e6f92","hl-str":"#2e7d5b","hl-num":"#96620f","hl-bool":"#7a4fbf","hl-punct":"#56707f",...dr,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(11, 27, 38, 0.35)"},dark:{bg:"#0b141b",panel:"#10202a",border:"#437082",line:"#1b2f3d",text:"#e6f0f5",muted:"#93a9b6",accent:"#8acbe6","accent-bg":"#14303d","accent-line":"#3e7e98",danger:"#f0a3a3","danger-bg":"#2a1a1c","danger-line":"#a3524f",hover:"#152a36","hl-key":"#8acbe6","hl-str":"#6cc79a","hl-num":"#e0b25a","hl-bool":"#bb9af7","hl-punct":"#93a9b6",...dr,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(0, 0, 0, 0.7)"}};function xn(e,t,n){return kn.map(r=>`${n}${t}-${r}: ${e[r]};`).join(`
212
+ `)}function lr(e,t={}){let n=t.prefix??"--wgd",r=t.selector??":root",i=t.darkMediaSelector??r,o=[`${r} {
213
+ ${xn(e.light,n," ")}
180
214
  }`,`@media (prefers-color-scheme: dark) {
181
215
  ${i} {
182
- ${Yt(e.dark,n," ")}
216
+ ${xn(e.dark,n," ")}
183
217
  }
184
218
  }`];return t.darkSelector!==void 0&&o.push(`${t.darkSelector} {
185
- ${Yt(e.dark,n," ")}
219
+ ${xn(e.dark,n," ")}
186
220
  }`),o.join(`
187
- `)}function pe(e,t){let n=e.querySelector(t);if(n===null)throw new Error(`Designer chrome is missing a <${t}> element.`);return n}function s(e,t,n){let r=document.createElement(e);if(t)for(let[i,o]of Object.entries(t))r.setAttribute(i,o);if(n)for(let i of n)r.append(i);return r}function Ae(e,t,n){let r=s("input",{type:"text",class:"wgd-input"});return r.value=t,r.addEventListener("input",()=>n(r.value)),s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[e]),r])}function xt(e,t,n,r=6){let i=s("textarea",{class:"wgd-textarea",rows:String(r),spellcheck:"false"});return i.value=t,i.addEventListener("input",()=>n(i.value)),s("label",{class:"wgd-field"},[...e===""?[]:[s("span",{class:"wgd-field-label"},[e])],i])}function Z(e,t,n=!0){let r={class:"wgd-section"};return n&&(r.open=""),s("details",r,[s("summary",{class:"wgd-section-title"},[e]),s("div",{class:"wgd-section-body"},t)])}function be(e){let t=()=>{let n=e.options[e.selectedIndex]?.text??e.value;e.style.width=`calc(${Math.max(n.length,1)}ch + 1.2em + 18px)`};t(),e.addEventListener("change",t)}function Zt(e,t,n,r){let i=s("span",{class:"wgd-menuwrap"}),o=s("button",{class:"wgd-icon wgd-menu-toggle",type:"button",title:t},[e]),a=s("div",{class:"wgd-menu"});a.hidden=!0;let g=()=>{a.hidden=!0,document.removeEventListener("pointerdown",c,!0),document.removeEventListener("keydown",l,!0)},c=u=>{i.contains(u.target)||g()},l=u=>{u.key==="Escape"&&g()};o.addEventListener("click",()=>{if(!a.hidden){g();return}a.hidden=!1,document.addEventListener("pointerdown",c,!0),document.addEventListener("keydown",l,!0)});for(let u of n){let p=s("button",{class:"wgd-menu-item",type:"button"},[u]);p.addEventListener("click",()=>{g(),r(u)}),a.append(p)}return i.append(o,a),i}function G(e){let t=s("div",{class:"wgd-diagnostic"},e===void 0?[]:[e]);return e===void 0&&t.setAttribute("hidden",""),t}var Fr=new Set(Xt),Kr=/^(inherit|initial|unset|revert|revert-layer)$/i;function De(e,t){if(t!==void 0)for(let[n,r]of Object.entries(t))Fr.has(n)&&(typeof r!="string"||Kr.test(r.trim())||e.style.setProperty(`--wgd-${n}`,r))}function Pn(e){if(e!==null)try{let t=JSON.parse(e);return typeof t!="object"||t===null||Array.isArray(t)?void 0:t}catch{return}}var Wn="data-widgentic-designer";function Oe(e){if(e.head.querySelector(`style[${Wn}]`))return;let t=e.createElement("style");t.setAttribute(Wn,"chrome"),t.textContent=`
221
+ `)}function ye(e,t){let n=e.querySelector(t);if(n===null)throw new Error(`Designer chrome is missing a <${t}> element.`);return n}function s(e,t,n){let r=document.createElement(e);if(t)for(let[i,o]of Object.entries(t))r.setAttribute(i,o);if(n)for(let i of n)r.append(i);return r}function Ne(e,t,n){let r=s("input",{type:"text",class:"wgd-input"});return r.value=t,r.addEventListener("input",()=>n(r.value)),s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[e]),r])}function Vt(e,t,n,r=6){let i=s("textarea",{class:"wgd-textarea",rows:String(r),spellcheck:"false"});return i.value=t,i.addEventListener("input",()=>n(i.value)),s("label",{class:"wgd-field"},[...e===""?[]:[s("span",{class:"wgd-field-label"},[e])],i])}function X(e,t,n=!0){let r={class:"wgd-section"};return n&&(r.open=""),s("details",r,[s("summary",{class:"wgd-section-title"},[e]),s("div",{class:"wgd-section-body"},t)])}function pe(e,t,n,r,i){let o=s("select",{class:n,...i===void 0?{}:{title:i}});for(let a of e)o.append(s("option",{value:a.value},[a.label??a.value]));return o.value=t,Se(o),o.addEventListener("change",()=>r(o.value)),o}function Se(e){let t=()=>{let n=e.options[e.selectedIndex]?.text??e.value;e.style.width=`calc(${Math.max(n.length,1)}ch + 1.2em + 18px)`};t(),e.addEventListener("change",t)}function En(e,t,n,r){let i=s("span",{class:"wgd-menuwrap"}),o=s("button",{class:"wgd-icon wgd-menu-toggle",type:"button",title:t},[e]),a=s("div",{class:"wgd-menu"});a.hidden=!0;let f=()=>{a.hidden=!0,document.removeEventListener("pointerdown",c,!0),document.removeEventListener("keydown",l,!0)},c=u=>{i.contains(u.target)||f()},l=u=>{u.key==="Escape"&&f()};o.addEventListener("click",()=>{if(!a.hidden){f();return}a.hidden=!1,document.addEventListener("pointerdown",c,!0),document.addEventListener("keydown",l,!0)});for(let u of n){let p=s("button",{class:"wgd-menu-item",type:"button"},[u]);p.addEventListener("click",()=>{f(),r(u)}),a.append(p)}return i.append(o,a),i}function G(e){let t=s("div",{class:"wgd-diagnostic"},e===void 0?[]:[e]);return e===void 0&&t.setAttribute("hidden",""),t}var $i=new Set(kn),ji=/^(inherit|initial|unset|revert|revert-layer)$/i;function Re(e,t){if(t!==void 0)for(let[n,r]of Object.entries(t))$i.has(n)&&(typeof r!="string"||ji.test(r.trim())||e.style.setProperty(`--wgd-${n}`,r))}function pr(e){if(e!==null)try{let t=JSON.parse(e);return typeof t!="object"||t===null||Array.isArray(t)?void 0:t}catch{return}}var ur="data-widgentic-designer";function Le(e){if(e.head.querySelector(`style[${ur}]`))return;let t=e.createElement("style");t.setAttribute(ur,"chrome"),t.textContent=`
188
222
  /* Chrome tokens (CHROME_TOKENS), generated from CHROME_DEFAULTS so the
189
223
  exported palette IS the applied one. A host overrides any of them through
190
224
  options.chrome (inline on the root, which outranks these rules). Widget
191
225
  content inside the preview keeps its own --wg-* theme tokens. */
192
- ${$n(Cn,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="light"])',darkSelector:'.wgd-root[data-wgd-theme="dark"]'})}
226
+ ${lr(cr,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="light"])',darkSelector:'.wgd-root[data-wgd-theme="dark"]'})}
193
227
  .wgd-root { display: flex; gap: var(--wgd-gap); font-family: var(--wgd-font); font-size: var(--wgd-font-size); align-items: flex-start; color: var(--wgd-text); background: var(--wgd-bg); }
194
228
  /* Any chrome class that sets display would silently defeat the hidden
195
229
  attribute (learned live twice: the add menu, then the styles tree as a
@@ -286,7 +320,9 @@ ${$n(Cn,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="
286
320
  .wgd-node-row:hover { background: var(--wgd-hover); }
287
321
  .wgd-node-badge { font-family: var(--wgd-font-mono); font-size: var(--wgd-font-size-xs); color: var(--wgd-accent); background: var(--wgd-accent-bg); border-radius: var(--wgd-radius-sm); padding: 0 5px; flex: 0 0 auto; }
288
322
  .wgd-node-icons { display: flex; gap: 2px; margin-left: auto; flex: 0 0 auto; visibility: hidden; }
289
- .wgd-node-row:hover > .wgd-node-icons, .wgd-node-row:focus-within > .wgd-node-icons { visibility: visible; }
323
+ /* One reveal rule for every row type that hosts the icon group: a row that
324
+ is not listed here would carry present-but-invisible controls. */
325
+ :is(.wgd-node-row, .wgd-st-row, .wgd-attr-row):is(:hover, :focus-within) > .wgd-node-icons { visibility: visible; }
290
326
  .wgd-node-value { flex: 1 1 auto; min-width: 4ch; }
291
327
  .wgd-icon { font: inherit; font-size: var(--wgd-font-size-xs); line-height: 1.4; padding: 0 5px; border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius-sm); background: var(--wgd-bg); cursor: pointer; color: var(--wgd-muted); }
292
328
  .wgd-icon:hover { background: var(--wgd-hover); }
@@ -309,16 +345,19 @@ ${$n(Cn,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="
309
345
  /* Attrs vs children: attributes group under a dotted muted rail with
310
346
  key-colored names; children keep the solid accent rail. */
311
347
  .wgd-attrs { margin-left: 14px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
312
- .wgd-attr-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 0; }
348
+ .wgd-attr-row { display: flex; gap: 4px; align-items: center; flex-wrap: wrap; padding: 0; }
313
349
  .wgd-attr-row > .wgd-icon { visibility: hidden; }
314
- .wgd-attr-row:hover > .wgd-icon, .wgd-attr-row:focus-within > .wgd-icon { visibility: visible; }
350
+ .wgd-attr-row:is(:hover, :focus-within) > .wgd-icon { visibility: visible; }
315
351
  .wgd-attr-name { font-family: var(--wgd-font-mono); color: var(--wgd-hl-key); flex: 0 1 auto; min-width: 5ch; }
316
352
  .wgd-attr-prefix { flex: 0 1 auto; min-width: 6ch; max-width: 10ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-str); }
317
353
  .wgd-attr { display: flex; flex-direction: column; gap: 1px; }
318
354
  /* Transform block under a bind attr: one more dotted level in. */
319
355
  .wgd-attr-map { margin-left: 24px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
320
356
  .wgd-attr-map-default { flex: 1 1 auto; min-width: 8ch; }
321
- .wgd-attr-mode { flex: 0 0 auto; color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); }
357
+ .wgd-attr-mode, .wgd-format-type, .wgd-format-display { flex: 0 0 auto; color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); }
358
+ .wgd-format-decimals { flex: 0 0 auto; width: 4ch; min-width: 4ch; text-align: right; font-family: var(--wgd-font-mono); }
359
+ .wgd-format-currency { flex: 0 0 auto; width: 5ch; min-width: 5ch; text-transform: uppercase; font-family: var(--wgd-font-mono); }
360
+ .wgd-format-pattern { flex: 0 1 auto; min-width: 8ch; max-width: 16ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-str); }
322
361
  .wgd-children { margin-left: 14px; padding-left: 8px; border-left: 2px solid var(--wgd-accent-line); gap: 1px; }
323
362
  .wgd-slot { display: flex; flex-direction: column; gap: 1px; }
324
363
  .wgd-slot-label { color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); font-style: italic; padding-left: 4px; }
@@ -339,7 +378,6 @@ ${$n(Cn,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="
339
378
  .wgd-styles { display: flex; flex-direction: column; gap: 2px; }
340
379
  .wgd-st-row { display: flex; gap: 4px; align-items: center; border-radius: var(--wgd-radius-sm); }
341
380
  .wgd-st-row:hover { background: var(--wgd-hover); }
342
- .wgd-st-row:hover > .wgd-node-icons, .wgd-st-row:focus-within > .wgd-node-icons { visibility: visible; }
343
381
  .wgd-styles .wgd-input { padding: 1px 4px; font-size: var(--wgd-font-size-sm); font-family: var(--wgd-font-mono); border-color: transparent; background: transparent; }
344
382
  .wgd-styles .wgd-input:hover, .wgd-styles .wgd-input:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
345
383
  .wgd-st-selector { flex: 1 1 auto; min-width: 8ch; color: var(--wgd-accent); }
@@ -405,13 +443,13 @@ textarea.wgd-hl-input {
405
443
  .wgd-token-ref-name { font-family: var(--wgd-font-mono); color: var(--wgd-accent); }
406
444
  .wgd-token-ref-value { color: var(--wgd-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
407
445
  .wgd-token-ref-details summary { cursor: pointer; }
408
- `,e.head.appendChild(t)}function ie(e){return JSON.parse(JSON.stringify(e))}function se(e){return e instanceof Error?e.message:String(e)}var Qt=/("(?:[^"\\]|\\.)*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|\b(true|false|null)\b|([{}[\],:])/g;function qr(e){let t=[],n=0,r;for(Qt.lastIndex=0;(r=Qt.exec(e))!==null;)r.index>n&&t.push({cls:"",text:e.slice(n,r.index)}),r[1]!==void 0?r[2]!==void 0?(t.push({cls:"k",text:r[1]}),t.push({cls:"p",text:r[2]})):t.push({cls:"s",text:r[1]}):r[3]!==void 0?t.push({cls:"n",text:r[3]}):r[4]!==void 0?t.push({cls:"b",text:r[4]}):r[5]!==void 0&&t.push({cls:"p",text:r[5]}),n=Qt.lastIndex;return n<e.length&&t.push({cls:"",text:e.slice(n)}),t}function In(e,t){let n=[];for(let r of qr(t)){if(r.cls===""){n.push(document.createTextNode(r.text));continue}let i=document.createElement("span");i.className=`wgd-hl-${r.cls}`,i.textContent=r.text,n.push(i)}n.push(document.createTextNode(`
409
- `)),e.replaceChildren(...n)}function ae(e){let t=e.parentNode;if(t===null)return()=>{};let n=document.createElement("div");n.className="wgd-hlwrap";let r=document.createElement("pre");r.className="wgd-hl",r.setAttribute("aria-hidden","true"),t.insertBefore(n,e),n.append(r,e),e.classList.add("wgd-hl-input");let i=()=>{In(r,e.value),r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},o=()=>{r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},a=g=>{if(g.key!=="Tab"||g.shiftKey||e.readOnly)return;g.preventDefault();let{selectionStart:c,selectionEnd:l,value:u}=e;e.value=`${u.slice(0,c)} ${u.slice(l)}`,e.selectionStart=e.selectionEnd=c+2,e.dispatchEvent(new Event("input",{bubbles:!0}))};return e.addEventListener("input",i),e.addEventListener("scroll",o),e.addEventListener("keydown",a),i(),()=>{e.removeEventListener("input",i),e.removeEventListener("scroll",o),e.removeEventListener("keydown",a),e.classList.remove("wgd-hl-input"),n.replaceWith(e)}}function ce(e){let t=e.parentElement?.querySelector(".wgd-hl");t instanceof HTMLElement&&In(t,e.value)}function en(e){let t=[];if(!x(e))return["Definition must be an object."];(typeof e.kind!="string"||e.kind.trim()==="")&&t.push("'kind' must be a non-empty string.");let n=Te(e.template);if(n.ok||t.push(`template: ${n.error.code} \u2014 ${n.error.message}`),x(e.descriptor)?typeof e.descriptor.description!="string"&&t.push("'descriptor.description' must be a string."):t.push("'descriptor' must be an object."),e.load!==void 0){let r=Ge(e.load,"load",{isPath:i=>me(i)!==void 0});r&&t.push(`load: ${r.message} (at ${r.path})`)}return t}function Gr(e){let t={kind:e.kind,template:e.template,descriptor:e.descriptor,...e.load!==void 0?{load:e.load}:{}};return JSON.stringify(t,null,2)}function Yr(e){return JSON.stringify(e.theme??{},null,2)}function Xr(e){let t;try{t=JSON.parse(e)}catch(r){return{ok:!1,errors:[`Invalid JSON: ${se(r)}`]}}let n=en(t);return n.length>0?{ok:!1,errors:n}:{ok:!0,definition:t}}function tn(e,t){let n=e.get().theme;e.replace({kind:t.kind,template:t.template,descriptor:t.descriptor,...t.load!==void 0?{load:t.load}:{},...n!==void 0?{theme:n}:{}})}function Zr(e){return e.split(/[^a-zA-Z0-9]+/).filter(t=>t.length>0).map((t,n)=>n===0?t:t[0]?.toUpperCase()+t.slice(1)).join("")}function Qr(e){return`import type { CustomWidget } from "./index.js";
446
+ `,e.head.appendChild(t)}function se(e){return JSON.parse(JSON.stringify(e))}function de(e){return e instanceof Error?e.message:String(e)}var Sn=/("(?:[^"\\]|\\.)*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|\b(true|false|null)\b|([{}[\],:])/g;function Pi(e){let t=[],n=0,r;for(Sn.lastIndex=0;(r=Sn.exec(e))!==null;)r.index>n&&t.push({cls:"",text:e.slice(n,r.index)}),r[1]!==void 0?r[2]!==void 0?(t.push({cls:"k",text:r[1]}),t.push({cls:"p",text:r[2]})):t.push({cls:"s",text:r[1]}):r[3]!==void 0?t.push({cls:"n",text:r[3]}):r[4]!==void 0?t.push({cls:"b",text:r[4]}):r[5]!==void 0&&t.push({cls:"p",text:r[5]}),n=Sn.lastIndex;return n<e.length&&t.push({cls:"",text:e.slice(n)}),t}function fr(e,t){let n=[];for(let r of Pi(t)){if(r.cls===""){n.push(document.createTextNode(r.text));continue}let i=document.createElement("span");i.className=`wgd-hl-${r.cls}`,i.textContent=r.text,n.push(i)}n.push(document.createTextNode(`
447
+ `)),e.replaceChildren(...n)}function ce(e){let t=e.parentNode;if(t===null)return()=>{};let n=document.createElement("div");n.className="wgd-hlwrap";let r=document.createElement("pre");r.className="wgd-hl",r.setAttribute("aria-hidden","true"),t.insertBefore(n,e),n.append(r,e),e.classList.add("wgd-hl-input");let i=()=>{fr(r,e.value),r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},o=()=>{r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},a=f=>{if(f.key!=="Tab"||f.shiftKey||e.readOnly)return;f.preventDefault();let{selectionStart:c,selectionEnd:l,value:u}=e;e.value=`${u.slice(0,c)} ${u.slice(l)}`,e.selectionStart=e.selectionEnd=c+2,e.dispatchEvent(new Event("input",{bubbles:!0}))};return e.addEventListener("input",i),e.addEventListener("scroll",o),e.addEventListener("keydown",a),i(),()=>{e.removeEventListener("input",i),e.removeEventListener("scroll",o),e.removeEventListener("keydown",a),e.classList.remove("wgd-hl-input"),n.replaceWith(e)}}function ge(e){let t=e.parentElement?.querySelector(".wgd-hl");t instanceof HTMLElement&&fr(t,e.value)}function Tn(e){let t=[];if(!k(e))return["Definition must be an object."];(typeof e.kind!="string"||e.kind.trim()==="")&&t.push("'kind' must be a non-empty string.");let n=Oe(e.template);if(n.ok||t.push(`template: ${n.error.code} \u2014 ${n.error.message}`),k(e.descriptor)?typeof e.descriptor.description!="string"&&t.push("'descriptor.description' must be a string."):t.push("'descriptor' must be an object."),e.load!==void 0){let r=gt(e.load,"load",{isPath:i=>ke(i)!==void 0});r&&t.push(`load: ${r.message} (at ${r.path})`)}return t}function Wi(e){let t={kind:e.kind,template:e.template,descriptor:e.descriptor,...e.load!==void 0?{load:e.load}:{}};return JSON.stringify(t,null,2)}function _i(e){let t;try{t=JSON.parse(e)}catch(r){return{ok:!1,errors:[`Invalid JSON: ${de(r)}`]}}let n=Tn(t);return n.length>0?{ok:!1,errors:n}:{ok:!0,definition:t}}function An(e,t){let n=e.get().theme;e.replace({kind:t.kind,template:t.template,descriptor:t.descriptor,...t.load!==void 0?{load:t.load}:{},...n!==void 0?{theme:n}:{}})}function Ii(e){return e.split(/[^a-zA-Z0-9]+/).filter(t=>t.length>0).map((t,n)=>n===0?t:t[0]?.toUpperCase()+t.slice(1)).join("")}function Mi(e){return`import type { CustomWidget } from "./index.js";
410
448
 
411
- export const ${Zr(e.kind)||"custom"}Widget: CustomWidget = ${JSON.stringify({kind:e.kind,template:e.template,descriptor:e.descriptor,...e.load!==void 0?{load:e.load}:{}},null,2)};
412
- `}function Mn(e){let t=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"});function n(u,p){let m=s("button",{class:"wgd-button wgd-add",type:"button"},[u]);return m.addEventListener("click",()=>{t.value=p(),ce(t)}),m}let r=G(void 0),i=xt("Import widget JSON","",()=>{},5),o=pe(i,"textarea");ae(o);let a=s("button",{class:"wgd-button",type:"button"},["Import"]);a.addEventListener("click",()=>{let u=Xr(o.value);if(!u.ok){r.hidden=!1,r.textContent=u.errors.join(`
413
- `);return}r.hidden=!0,r.textContent="",tn(e,u.definition)});let g=Z("Import",[i,r,s("div",{class:"wgd-row"},[a])]),c=Z("Export",[s("div",{class:"wgd-row"},[n("Export widget JSON",()=>Gr(e.get())),n("Export theme JSON",()=>Yr(e.get())),n("Copy as TypeScript",()=>Qr(e.get()))]),t]);c.classList.add("wgd-view-only");let l=s("div",{class:"wgd-io"},[g,c]);return ae(t),{element:l,dispose:()=>l.remove()}}var ei=["string","number","boolean","null","object","array"];function nn(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function ti(e,t){switch(e){case"string":return typeof t=="number"||typeof t=="boolean"?String(t):"";case"number":{let n=Number(t);return Number.isFinite(n)?n:0}case"boolean":return t==="true"?!0:!!t&&t!=="false";case"null":return null;case"object":return{};case"array":return[]}}function ve(e,t,n,r=!1){if(t.length===0)return n;let[i,...o]=t;if(Array.isArray(e)){let a=[...e];return o.length===0&&r?a.splice(i,1):a[i]=ve(a[i],o,n,r),a}if(typeof e=="object"&&e!==null){let a={...e};return o.length===0&&r?delete a[i]:a[i]=ve(a[i],o,n,r),a}return e}function ni(e,t,n,r){let i=t.reduce((a,g)=>typeof a=="object"&&a!==null?a[g]:void 0,e);if(typeof i!="object"||i===null||Array.isArray(i))return e;let o=Object.entries(i).map(([a,g])=>a===n?[r,g]:[a,g]);return ve(e,t,Object.fromEntries(o))}function _n(e,t){let n=e,r=s("div",{class:"wgd-jsontree"});function i(p){n=p,u(),t(n)}function o(p,m,w){let f=m==="number"?Number.isFinite(Number(w))?Number(w):0:w;n=ve(n,p,f),t(n)}function a(p,m){let w=s("select",{class:"wgd-select wgd-jt-type"});for(let f of ei)w.append(s("option",{value:f},[f]));return w.value=nn(p),w.addEventListener("change",()=>i(ve(n,m,ti(w.value,p)))),w}function g(p,m){let w=nn(p);if(w==="boolean"){let f=s("input",{type:"checkbox"});return f.checked=p,f.addEventListener("change",()=>i(ve(n,m,f.checked))),f}if(w==="null")return s("code",void 0,["null"]);if(w==="string"||w==="number"){let f=s("input",{type:"text",class:"wgd-input"});return f.value=String(p),f.addEventListener("change",()=>o(m,w,f.value)),f}return s("span")}function c(p,m,w,f){let y=s("div",{class:"wgd-jt-row"},[p,a(m,w)]),v=nn(m);if(v!=="object"&&v!=="array"&&y.append(g(m,w)),f){let k=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);k.addEventListener("click",()=>i(ve(n,w,void 0,!0))),y.append(k)}let S=s("div",{class:"wgd-jt-entry"},[y]);return(v==="object"||v==="array")&&S.append(l(m,w)),S}function l(p,m){let w=s("div",{class:"wgd-jt-children"});if(Array.isArray(p)){p.forEach((v,S)=>{w.append(c(s("span",{class:"wgd-jt-key"},[String(S)]),v,[...m,S],!0))});let y=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);y.addEventListener("click",()=>i(ve(n,[...m,p.length],""))),w.append(s("div",{class:"wgd-toolbar"},[y]))}else if(typeof p=="object"&&p!==null){for(let[v,S]of Object.entries(p)){let k=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});k.value=v,k.addEventListener("change",()=>i(ni(n,m,v,k.value))),w.append(c(k,S,[...m,v],!0))}let y=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);y.addEventListener("click",()=>{let v=p,S="key";for(let k=1;S in v;k++)S=`key${k}`;i(ve(n,[...m,S],""))}),w.append(s("div",{class:"wgd-toolbar"},[y]))}return s("details",{class:"wgd-jt-branch",open:""},[s("summary",{class:"wgd-jt-summary"},[Array.isArray(p)?`[ ${p.length} item${p.length===1?"":"s"} ]`:`{ ${Object.keys(p).length} propert${Object.keys(p).length===1?"y":"ies"} }`]),w])}function u(){r.replaceChildren(c(s("span",{class:"wgd-jt-key"},["value"]),n,[],!1))}return u(),{element:r,getValue:()=>n,setValue(p){r.contains(document.activeElement)||(n=p,u())}}}var Hn=["object","array","string","number","integer","boolean","null","any"],Bn=new Set(["string","number","integer","any"]);function Ve(e,t){let n=e,r=s("div",{class:"wgd-schemabuilder"});function i(c,l=!0){n=c,t(n),l&&g()}function o(c,l,u){let p={...c};return u===void 0?delete p[l]:p[l]=u,p}function a(c,l,u,p=[],m=[]){let w=[],f=s("select",{class:"wgd-select wgd-sb-type"});for(let T of Hn)f.append(s("option",{value:T},[T]));let y=c.type,v=Array.isArray(y)?y.filter(T=>typeof T=="string"):void 0,S=v?.includes("null")??!1,k=typeof y=="string"?y:v?.find(T=>T!=="null")??(S?"null":"any");f.value=Hn.some(T=>T===k)?k:"any",be(f);let N=s("input",{type:"checkbox",title:"Also allows null"});N.checked=S,N.disabled=f.value==="any"||f.value==="null";function R(T,_){if(T!=="any")return _&&T!=="null"?[T,"null"]:T}N.addEventListener("change",()=>{l(o(c,"type",R(f.value,N.checked)))}),f.addEventListener("change",()=>{let T=o(c,"type",R(f.value,N.checked));f.value!=="object"&&(T=o(o(T,"properties",void 0),"required",void 0)),f.value!=="array"&&(T=o(T,"items",void 0)),f.value!=="string"&&(T=o(T,"pattern",void 0)),Bn.has(f.value)||(T=o(T,"enum",void 0)),l(T)}),w.push(s("div",{class:"wgd-sb-row"},[...p,f,s("label",{class:"wgd-sb-req wgd-sb-null",title:"Also allows null"},[N,"null"]),...m]));let P=[];if(f.value==="string"){let T=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:"pattern (regex, optional)"});T.value=typeof c.pattern=="string"?c.pattern:"",T.addEventListener("change",()=>l(o(c,"pattern",T.value===""?void 0:T.value))),P.push(s("span",{class:"wgd-sb-label"},["pattern"]),T)}let z=G(void 0);if(Bn.has(f.value)){let T=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:'enum ["a","b"] (optional)'});T.value=Array.isArray(c.enum)?JSON.stringify(c.enum):"",T.addEventListener("change",()=>{if(T.value.trim()===""){z.hidden=!0,l(o(c,"enum",void 0));return}try{let _=JSON.parse(T.value);if(!Array.isArray(_))throw new Error("must be a JSON array");z.hidden=!0,l(o(c,"enum",_))}catch(_){z.hidden=!1,z.textContent=`enum ignored: ${se(_)}`}}),P.push(s("span",{class:"wgd-sb-label"},["enum"]),T)}if(P.length>0&&w.push(s("div",{class:"wgd-sb-row wgd-sb-constraints"},P),z),f.value==="object"){let T=x(c.properties)?c.properties:{},_=Array.isArray(c.required)?c.required.filter(M=>typeof M=="string"):[],F=s("div",{class:"wgd-jt-children"});for(let[M,E]of Object.entries(T)){let b=s("input",{type:"text",class:"wgd-input wgd-sb-prop",placeholder:"property name"});b.value=M,b.addEventListener("change",()=>{let C=Object.entries(T).map(([$,D])=>$===M?[b.value,D]:[$,D]),H=_.map($=>$===M?b.value:$);l(o(o(c,"properties",Object.fromEntries(C)),"required",H.length>0?H:void 0))});let j=s("input",{type:"checkbox",title:"required"});j.checked=_.includes(M),j.addEventListener("change",()=>{let C=j.checked?[..._,M]:_.filter(H=>H!==M);l(o(c,"required",C.length>0?C:void 0))});let W=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);W.addEventListener("click",()=>{let{[M]:C,...H}=T;l(o(o(c,"properties",Object.keys(H).length>0?H:void 0),"required",_.filter($=>$!==M).length>0?_.filter($=>$!==M):void 0))}),F.append(a(x(E)?E:{},C=>l(o(c,"properties",{...T,[M]:C})),u+1,[b],[s("label",{class:"wgd-sb-req",title:"required"},[j,"req"]),W]))}let U=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);U.addEventListener("click",()=>{let M="field";for(let E=1;M in T;E++)M=`field${E}`;l(o(c,"properties",{...T,[M]:{type:"string"}}))}),F.append(s("div",{class:"wgd-toolbar"},[U])),w.push(F)}return f.value==="array"&&w.push(s("div",{class:"wgd-slot"},[a(x(c.items)?c.items:{},T=>l(o(c,"items",T)),u+1,[s("span",{class:"wgd-sb-label"},["items"])])])),s("div",{class:u===0?"wgd-sb-root":"wgd-sb-node"},w)}function g(){if(n===void 0){let l=s("button",{class:"wgd-button wgd-add",type:"button"},["+ add a data schema"]);l.addEventListener("click",()=>i({type:"object"})),r.replaceChildren(s("div",void 0,[s("span",{class:"wgd-sb-label"},["No schema \u2014 data is accepted leniently."]),s("div",{class:"wgd-toolbar"},[l])]));return}let c=s("button",{class:"wgd-button wgd-add wgd-remove",type:"button"},["remove schema"]);c.addEventListener("click",()=>i(void 0)),r.replaceChildren(a(n,l=>i(l),0),s("div",{class:"wgd-toolbar"},[c]))}return g(),{element:r,getValue:()=>n,setValue(c){r.contains(document.activeElement)||(n=c,g())}}}function kt(e,t,n){let r=e,i=s("div",{class:"wgd-record"});function o(c){r=Object.keys(c).length>0?c:void 0,n(r),g()}function a(c,l,u,p){let m=s("input",{type:"text",class:u,placeholder:l,spellcheck:"false"});return m.value=c,m.addEventListener("change",()=>p(m.value)),m}function g(){let c=r??{},l=Object.entries(c).map(([p,m])=>{let w=a(p,t.key,"wgd-input wgd-rec-key",v=>{let S=Object.entries(c).map(([k,N])=>k===p?[v,N]:[k,N]);o(Object.fromEntries(S))}),f=a(m,t.value,"wgd-input wgd-rec-value",v=>o({...c,[p]:v})),y=s("button",{class:"wgd-icon",type:"button",title:"Remove entry"},["\u2715"]);return y.addEventListener("click",()=>{let{[p]:v,...S}=c;o(S)}),s("div",{class:"wgd-rec-row"},[w,s("span",{class:"wgd-st-colon"},[":"]),f,y])}),u=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},[t.add]);u.addEventListener("click",()=>{let p="";for(let m=1;p in c;m++)p=`key${m}`;o({...c,[p]:""})}),i.replaceChildren(...l,s("div",{class:"wgd-toolbar"},[u]))}return g(),{element:i,getValue:()=>r,setValue(c){i.contains(document.activeElement)||(r=c,g())}}}function zn(e){let t=e.type;if(typeof t=="string")return t;if(Array.isArray(t)){let n=t.find(r=>typeof r=="string"&&r!=="null");if(typeof n=="string")return n;if(t.includes("null"))return"null"}}function Ze(e){if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];switch(zn(e)){case"object":{let t={};if(x(e.properties)&&Array.isArray(e.required))for(let n of e.required)typeof n=="string"&&x(e.properties[n])&&(t[n]=Ze(e.properties[n]));return t}case"array":return[];case"number":case"integer":return 0;case"boolean":return!1;case"null":return null;default:return""}}function Et(e,t,n){let r=t??Ze(e),i=s("div",{class:"wgd-schemaform"});function o(u,p,m,w=!1){if(p.length===0)return m;let[f,...y]=p;if(Array.isArray(u)){let S=[...u];return y.length===0&&w?S.splice(f,1):S[f]=o(S[f],y,m,w),S}let v=x(u)?{...u}:{};return y.length===0&&w?delete v[f]:v[f]=o(v[f],y,m,w),v}function a(u,p,m=!1){r=o(r,u,p),n(r),m&&l()}function g(u,p,m,w){if(Array.isArray(u.enum)){let f=s("select",{class:"wgd-select"});for(let y of u.enum)f.append(s("option",{value:JSON.stringify(y)},[JSON.stringify(y)]));return f.value=JSON.stringify(p??u.enum[0]),f.addEventListener("change",()=>a(m,JSON.parse(f.value))),c(w,f)}switch(zn(u)){case"boolean":{let f=s("input",{type:"checkbox"});return f.checked=p===!0,f.addEventListener("change",()=>a(m,f.checked)),c(w,f)}case"number":case"integer":{let f=s("input",{type:"number",class:"wgd-input"});return f.value=typeof p=="number"?String(p):"0",f.addEventListener("change",()=>{let y=Number(f.value);a(m,Number.isFinite(y)?y:0)}),c(w,f)}case"object":{let f=s("div",{class:"wgd-jt-children"}),y=x(u.properties)?u.properties:{},v=Array.isArray(u.required)?u.required:[],S=x(p)?p:{};for(let[k,N]of Object.entries(y)){if(!x(N))continue;let R=v.includes(k);f.append(g(N,S[k]??(R?Ze(N):void 0),[...m,k],R?`${k} *`:k))}return s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[w]),f])}case"array":{let f=x(u.items)?u.items:{},y=Array.isArray(p)?p:[],v=s("div",{class:"wgd-jt-children"});y.forEach((k,N)=>{let R=s("div",{class:"wgd-jt-entry"},[g(f,k,[...m,N],`#${N}`)]),P=s("button",{class:"wgd-icon",type:"button",title:"Remove item"},["\u2715"]);P.addEventListener("click",()=>{r=o(r,[...m,N],void 0,!0),n(r),l()}),R.append(P),v.append(R)});let S=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);return S.addEventListener("click",()=>a([...m,y.length],Ze(f),!0)),v.append(s("div",{class:"wgd-toolbar"},[S])),s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[w]),v])}default:{let f=s("input",{type:"text",class:"wgd-input"});return typeof u.pattern=="string"&&(f.setAttribute("placeholder",`pattern: ${u.pattern}`),f.setAttribute("title",`Must match ${u.pattern}`)),f.value=typeof p=="string"?p:p===void 0?"":String(p),f.addEventListener("change",()=>a(m,f.value)),c(w,f)}}}function c(u,p){return s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[u]),p])}function l(){i.replaceChildren(g(e,r,[],"data"))}return l(),{element:i,getValue:()=>r,setValue(u){i.contains(document.activeElement)||(r=u??Ze(e),l())}}}function Jn(e,t){let n=e,r=s("div",{class:"wgd-styles"});function i(c){n=Object.keys(c).length>0?c:void 0,t(n),g()}function o(c,l,u,p){let m=s("input",{type:"text",class:u,placeholder:l,spellcheck:"false"});return m.value=c,m.addEventListener("change",()=>p(m.value)),m}function a(c,l,u){let p=o(c,".wg-selector","wgd-input wgd-st-selector",y=>{let v=Object.entries(u).map(([S,k])=>S===c?[y,k]:[S,k]);i(Object.fromEntries(v))}),m=s("button",{class:"wgd-icon",type:"button",title:"Add declaration"},["+"]);m.addEventListener("click",()=>{i({...u,[c]:{...l,"":""}})});let w=s("button",{class:"wgd-icon",type:"button",title:"Remove selector"},["\u2715"]);w.addEventListener("click",()=>{let{[c]:y,...v}=u;i(v)});let f=Object.entries(l).map(([y,v])=>{let S=o(y,"property","wgd-input wgd-st-prop",R=>{let P=Object.entries(l).map(([z,T])=>z===y?[R,T]:[z,T]);i({...u,[c]:Object.fromEntries(P)})}),k=o(v,"value (no url(...), no ;)","wgd-input wgd-st-value",R=>{i({...u,[c]:{...l,[y]:R}})}),N=s("button",{class:"wgd-icon",type:"button",title:"Remove declaration"},["\u2715"]);return N.addEventListener("click",()=>{let{[y]:R,...P}=l;i({...u,[c]:P})}),s("div",{class:"wgd-st-decl"},[S,s("span",{class:"wgd-st-colon"},[":"]),k,N])});return s("div",{class:"wgd-st-rule"},[s("div",{class:"wgd-st-row"},[p,s("span",{class:"wgd-node-icons"},[m,w])]),s("div",{class:"wgd-st-decls"},f)])}function g(){let c=n??{},l=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},["+ selector"]);l.addEventListener("click",()=>{let u=".wg-";for(let p=1;u in c;p++)u=`.wg-${p}`;i({...c,[u]:{}})}),r.replaceChildren(...Object.entries(c).map(([u,p])=>a(u,x(p)?p:{},c)),s("div",{class:"wgd-toolbar"},[l]))}return g(),{element:r,getValue:()=>n,setValue(c){r.contains(document.activeElement)||(n=c,g())}}}function xe(e){if(!x(e))return;let t=e.type;if(typeof t=="string")return t;if(Array.isArray(t)){let n=t.find(r=>typeof r=="string"&&r!=="null");if(typeof n=="string")return n}}function St(e,t,n,r=0){if(!(!x(e)||r>3)&&!(xe(e)!=="object"||!x(e.properties)))for(let[i,o]of Object.entries(e.properties)){let a=t===""?i:`${t}.${i}`;n.push({path:a,schema:o}),St(o,a,n,r+1)}}function Tt(e,t){if(t===""||t===".")return e;let n=e;for(let r of t.split(".")){if(!x(n))return;if(xe(n)==="array"){if(n=x(n.items)?n.items:void 0,!/^\d+$/.test(r)){if(!x(n)||!x(n.properties))return;n=n.properties[r]}continue}if(!x(n.properties))return;n=n.properties[r]}return n}function Vn(e,t){if(e===void 0||t===void 0)return!1;let n=r=>r==="integer"?"number":r;return n(e)!==n(t)}function Qe(e){let t=[];return St(e,"",t),t.map(n=>n.path)}var Un="__custom__";function Fn(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function qn(){return{kind:"http",method:"GET",url:"https://api.example.com/resource",input:{type:"object",properties:{}},output:{type:"object"}}}function At(e){return"ref"in e&&typeof e.ref=="string"}function ke(e,t,n,r=""){let i=s("input",{type:"text",class:t,placeholder:r});return i.value=e,i.addEventListener("change",()=>n(i.value)),i}function he(e,t,n,r){let i=s("select",{class:n});for(let o of e)i.append(s("option",{value:o.value},[o.label??o.value]));return i.value=t,be(i),i.addEventListener("change",()=>r(i.value)),i}function ue(e){return s("span",{class:"wgd-field-label"},[e])}function et(e){let t=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return t.addEventListener("click",e),t}function Dt(e,t,n,r,i="wgd-input wgd-rec-value"){if(t.length===0)return ke(e,i,n,r);let o=s("select",{class:"wgd-select wgd-path"}),a=t.includes(e),g=a||e===""?t:[e,...t];o.append(s("option",{value:""},[r]));for(let l of g)o.append(s("option",{value:l},[l===e&&!a?`${l} (off-schema)`:l]));o.append(s("option",{value:Un},["custom\u2026"])),o.value=e,be(o);let c=ke(e,i,n,r);return c.hidden=!0,o.addEventListener("change",()=>{if(o.value===Un){c.hidden=!1,c.focus();return}c.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,c])}function Kn(e,t,n,r){let i=ie(e??{}),o=[],a=s("div",{class:"wgd-record wgd-headers"}),g=G(void 0);function c(m){i=m,r(Object.keys(i).length>0?i:void 0),p()}function l(m){g.hidden=!1,g.textContent=`'${m}' is already used; pick another ${n.name} name.`}function u(m,w){let f=x(m),y=he([{value:"literal"},{value:"secret"}],f?"secret":"literal","wgd-select wgd-attr-mode",v=>w(v==="secret"?{secret:t[0]??""}:""));if(f){let v=t.includes(m.secret)?t:[m.secret,...t],S=he(v.map(k=>({value:k,label:k===""?"(pick a secret)":k})),m.secret,"wgd-select wgd-secret",k=>w({secret:k}));return[y,S]}return[y,ke(m,"wgd-input wgd-rec-value",w,"value")]}function p(){a.replaceChildren(),g.hidden=!0;for(let[w,f]of Object.entries(i)){let y=ke(w,"wgd-input wgd-rec-key",k=>{if(k===w)return;if(k===""||Object.hasOwn(i,k)){l(k||"(empty)");return}let N=Object.entries(i).map(([R,P])=>R===w?[k,P]:[R,P]);c(Object.fromEntries(N))},n.name),v=u(f,k=>c({...i,[w]:k})),S=et(()=>{let{[w]:k,...N}=i;c(N)});a.append(s("div",{class:"wgd-rec-row"},[y,...v,S]))}o.forEach((w,f)=>{let y=ke("","wgd-input wgd-rec-key",k=>{if(k!==""){if(Object.hasOwn(i,k)){l(k);return}o.splice(f,1),c({...i,[k]:w.value})}},n.name),v=u(w.value,k=>{w.value=k,p()}),S=et(()=>{o.splice(f,1),p()});a.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[y,...v,S]))});let m=s("button",{class:"wgd-button wgd-add",type:"button"},[n.add]);m.addEventListener("click",()=>{o.push({value:""}),p()}),a.append(s("div",{class:"wgd-row"},[m]),g)}return p(),a}function ri(e,t){let n=ie(e),r=s("div",{class:"wgd-record wgd-segments"});function i(a){n=a,t(n),o()}function o(){r.replaceChildren(),n.forEach((c,l)=>{let u=typeof c!="string",p=he([{value:"text"},{value:"bind"}],u?"bind":"text","wgd-select wgd-attr-mode",f=>{let y=[...n];y[l]=f==="bind"?{bind:"."}:"",i(y)}),m=ke(u?c.bind:c,"wgd-input wgd-rec-value",f=>{let y=[...n];y[l]=u?{bind:f}:f,i(y)},u?"data path":"text"),w=et(()=>i(n.filter((f,y)=>y!==l)));r.append(s("div",{class:"wgd-rec-row"},[p,m,w]))});let a=s("button",{class:"wgd-button wgd-add",type:"button"},["+ text"]);a.addEventListener("click",()=>i([...n,""]));let g=s("button",{class:"wgd-button wgd-add",type:"button"},["+ bind"]);g.addEventListener("click",()=>i([...n,{bind:"."}])),r.append(s("div",{class:"wgd-row"},[a,g]))}return o(),r}function rn(e,t,n){let r=ie(e??Fn()),i=s("div",{class:"wgd-action-head"}),o=s("div",{class:"wgd-action-schemas"}),a=s("div",{class:"wgd-action-maps"}),g=s("div",{class:"wgd-action-definition"},[i,o,a]);function c(){return r}function l(y,v){r=y,n(ie(r)),v==="all"?f():v==="schemas"&&m()}function u(y,v){let S=Ve(c()[v],R=>{l({...c(),[v]:R??{type:"object"}},"none")}),k=[ue(y),S.element],N=t.schemas??[];if(N.length>0){let R=he([{value:"",label:"copy a shared schema into this action\u2026"},...N.map(P=>({value:P.name}))],"","wgd-select",P=>{let z=N.find(T=>T.name===P);z&&l({...c(),[v]:ie(z.schema)},"schemas")});k.push(s("div",{class:"wgd-row"},[R,ue("(a copy \u2014 later edits to the shared schema do not follow)")]))}return s("div",{class:"wgd-action-schema"},k)}function p(){i.replaceChildren();let y=he([{value:"prompt",label:"prompt \u2014 propose a message"},{value:"http",label:"http \u2014 call an API"}],r.kind,"wgd-select wgd-action-kind",k=>l(k==="http"?qn():Fn(),"all"));if(r.kind==="prompt"){i.append(s("div",{class:"wgd-row"},[ue("Kind"),y]),ue("Message (literals and bound values; the user reviews and sends it)"),ri(r.text,k=>l({kind:"prompt",text:k},"none")));return}let v=he(Ke.map(k=>({value:k})),r.method,"wgd-select",k=>l({...c(),method:k},"none")),S=ke(r.url,"wgd-input wgd-action-url",k=>l({...c(),url:k},"none"),"https://\u2026");i.append(s("div",{class:"wgd-row"},[ue("Kind"),y,ue("Method"),v]),s("label",{class:"wgd-field"},[ue("URL (https, fixed)"),S]))}function m(){o.replaceChildren(),r.kind==="http"&&o.append(u("Input schema (arguments; GET \u2192 query, POST \u2192 JSON body)","input"),u("Output schema (the response must satisfy it)","output"))}function w(){if(a.replaceChildren(),r.kind!=="http")return;let y=t.secretNames??[];a.append(ue("Headers"),Kn(r.headers,y,{add:"+ header",name:"header"},v=>{let{headers:S,...k}=c();l(v===void 0?k:{...k,headers:v},"none")}),ue("Fixed query parameters"),Kn(r.query,y,{add:"+ parameter",name:"parameter"},v=>{let{query:S,...k}=c();l(v===void 0?k:{...k,query:v},"none")}))}function f(){p(),m(),w()}return f(),{element:g,getValue:()=>ie(r),setValue(y){r=ie(y),f()}}}function Ot(e,t,n){let r=e===void 0?void 0:ie(e),i=s("div",{class:"wgd-binding-head"}),o=s("div",{class:"wgd-binding-input"}),a=s("div",{class:"wgd-binding-output"}),g=s("div",{class:"wgd-binding"},[i,o,a]);function c(N){if(N!==void 0)return At(N)?(t.actions??[]).find(R=>R.name===N.ref)?.definition:N.definition}let l=()=>ie(r?.input??{}),u=()=>ie(r?.output??{});function p(N,R){r=N,n(N===void 0?void 0:ie(N)),R==="all"?k():R==="io"?(y(),v()):R==="input"?y():R==="output"&&v()}function m(N,R,P){return{...At(N)?{ref:N.ref}:{definition:N.definition},...R!==void 0&&Object.keys(R).length>0?{input:R}:{},...P!==void 0&&Object.keys(P).length>0?{output:P}:{}}}function w(){return["$index","$parent","$root",...Qe(t.getDataSchema?.()).map(R=>`$root.${R}`)]}function f(){i.replaceChildren();let N=(t.actions??[]).filter(T=>!t.loadOnly||T.definition.kind==="http"&&T.definition.method==="GET"),R=r===void 0?"none":At(r)?"shared":"inline",P=he([{value:"none",label:t.loadOnly?"no load action":"no action"},{value:"shared",label:"shared action"},{value:"inline",label:"inline definition"}],R,"wgd-select wgd-binding-mode",T=>{p(T==="none"?void 0:T==="shared"?{ref:N[0]?.name??""}:{definition:qn()},"all")});if(i.append(s("div",{class:"wgd-row"},[P])),r===void 0)return;if(At(r)){let T=r.ref,_=N.map(M=>M.name),F=(_.includes(T)?_:[T,..._]).map(M=>({value:M,label:M===""?"(pick an action)":_.includes(M)?M:`${M} (unknown)`})),U=he(F,T,"wgd-select wgd-binding-ref",M=>p(m({ref:M},l(),u()),"io"));i.append(s("div",{class:"wgd-row"},[ue("Action"),U]));return}let z=rn(r.definition,t,T=>{p(m({definition:T},l(),u()),"io")});i.append(z.element)}function y(){o.replaceChildren();let N=c(r);if(r===void 0||N?.kind!=="http")return;let R=r,P=x(N.input.properties)?Object.keys(N.input.properties):[],z=t.scopePaths??Qe(t.getDataSchema?.()),T=[...new Set([...z,...w()])],_=l(),F=P.map(U=>{let M=_[U],E=x(M)&&"const"in M,b=he([{value:"path"},{value:"const"}],E?"const":"path","wgd-select wgd-attr-mode",C=>{p(m(R,{...l(),[U]:C==="const"?{const:""}:U},u()),"input")}),j=C=>{let H=l();if(E){let $;try{$=JSON.parse(C)}catch{$=C}H[U]={const:$}}else C===""?delete H[U]:H[U]=C;p(m(R,H,u()),"none")},W=E?ke(JSON.stringify(M.const),"wgd-input wgd-rec-value",j,"JSON literal"):Dt(typeof M=="string"?M:"",T,j,"data path");return s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-rec-key wgd-binding-field"},[U]),b,W])});o.append(ue("Input mapping (field \u2190 data path or constant)"),P.length>0?s("div",{class:"wgd-record"},F):s("div",{class:"wgd-diagnostic"},["The input schema declares no properties."]))}function v(){a.replaceChildren();let N=c(r);if(r===void 0||N?.kind!=="http")return;let R=r,P=u(),z=P.mode??"merge",T=he(Fe.map(F=>({value:F})),z,"wgd-select",F=>{let U={...u(),mode:F};F!=="patch"&&delete U.path,p(m(R,l(),U),"output")}),_=[ue("Output"),T];z==="patch"&&_.push(ke(P.path??"","wgd-input",F=>{p(m(R,l(),{...u(),path:F}),"output")},"data path to write at")),a.append(s("div",{class:"wgd-row"},_)),a.append(S(N,P,F=>{let U=u();F===void 0?delete U.map:U.map=F,p(m(R,l(),U),"none")}))}function S(N,R,P){let z=s("div",{class:"wgd-record wgd-output-map"}),T=ie(R.map??{}),_=[],F=t.getDataSchema?.(),U=(R.mode??"merge")==="patch"&&R.path?R.path:"",M=U===""?F:Tt(F,U),E=Qe(M),b=[".",...Qe(N.output)],j=G(void 0);j.classList.add("wgd-type-mismatch");function W(D){T=D,P(Object.keys(T).length>0?T:void 0),$()}function C(D){j.hidden=!1,j.textContent=D}function H(D,L){let d=Dt(D,E,L,"target data path","wgd-input wgd-rec-key");return d.classList.add("wgd-map-target"),d}function $(){z.replaceChildren();let D=[];for(let[d,h]of Object.entries(T)){let A=xe(Tt(M,d)),I=xe(Tt(N.output,h));Vn(I,A)&&D.push(`'${h}' is ${I} in the response but '${U?`${U}.`:""}${d}' is ${A} in the widget schema`);let B=H(d,X=>{if(X===d)return;if(X===""||Object.hasOwn(T,X)){C(`'${X||"(empty)"}' is already a projection target.`);return}let ee=Object.entries(T).map(([ne,le])=>ne===d?[X,le]:[ne,le]);W(Object.fromEntries(ee))}),V=Dt(h,b,X=>W({...T,[d]:X}),"response path");V.classList.add("wgd-map-source");let K=et(()=>{let{[d]:X,...ee}=T;W(ee)});z.append(s("div",{class:"wgd-rec-row"},[B,s("span",{class:"wgd-st-colon"},["\u2190"]),V,K]))}_.forEach((d,h)=>{let A=H("",V=>{if(V!==""){if(Object.hasOwn(T,V)){C(`'${V}' is already a projection target.`);return}_.splice(h,1),W({...T,[V]:d.source})}}),I=Dt(d.source,b,V=>{d.source=V,$()},"response path");I.classList.add("wgd-map-source");let B=et(()=>{_.splice(h,1),$()});z.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[A,s("span",{class:"wgd-st-colon"},["\u2190"]),I,B]))});let L=s("button",{class:"wgd-button wgd-add",type:"button"},["+ projection"]);L.addEventListener("click",()=>{_.push({source:""}),$()}),j.hidden=D.length===0,j.textContent=D.length===0?"":`Type mismatch: ${D.join("; ")}.`,z.append(s("div",{class:"wgd-row"},[L]),j)}return $(),z}function k(){f(),y(),v()}return k(),{element:g,setValue(N){r=N===void 0?void 0:ie(N),k()}}}function Ne(e,t=[]){let n=e.descriptor?.dataSchemaRef;if(typeof n=="string")return t.find(i=>i.name===n)?.schema;let r=e.descriptor?.dataSchema;return x(r)?r:void 0}var ii=new Set(ye().kinds());function oi(e){if(!x(e))return[];let t=[];for(let[n,r]of Object.entries(e)){if(Ce({[n]:{color:"red"}})===""){t.push({selector:n,message:"Selector would be skipped \u2014 every comma-separated part must target a .wg- class and avoid ;{}<>@\\."});continue}if(!x(r)){t.push({selector:n,message:"Declarations must be a property \u2192 value map."});continue}for(let[i,o]of Object.entries(r))(typeof o!="string"||Ce({".wg-probe":{[i]:o}})==="")&&t.push({selector:n,property:i,message:"Declaration would be skipped \u2014 unsafe property name or value (no url(), expression(), or ;{}<>@\\)."})}return t}function Nt(e,t={}){let n={styles:[],previewable:!1};typeof e.kind!="string"||e.kind.trim().length===0?n.kind="Kind must be a non-empty id.":ii.has(e.kind)&&(n.kind=`'${e.kind}' is a built-in kind \u2014 pick a distinct id.`);let r=Te(e.template);if(!r.ok){let a={code:r.error.code,message:r.error.message},g=r.error.path;typeof g=="string"&&(a.path=g),n.template=a}let i=e.descriptor?.dataSchemaRef;typeof i=="string"&&(e.descriptor?.dataSchema!==void 0?n.schemaRef="A descriptor carries 'dataSchema' OR 'dataSchemaRef', never both.":(t.schemas??[]).every(a=>a.name!==i)&&(n.schemaRef=`References unknown schema '${i}' \u2014 it is not among the supplied shared schemas.`));let o=Ne(e,t.schemas??[]);if(x(o)){if(e.descriptor.dataExample!==void 0){let a=Se(o,e.descriptor.dataExample);a&&(n.example=a)}if(e.sampleData!==void 0){let a=Se(o,e.sampleData);a&&(n.sample=a)}}if(n.styles=oi(e.descriptor?.styles),e.load!==void 0){let a=Ge(e.load,"load",{isPath:g=>me(g)!==void 0});a&&(n.load=`${a.message} (at ${a.path})`)}if(t.actions!==void 0){let a=new Set(t.actions.map(c=>c.name)),g=Ye(e.template,e.load).filter(c=>!a.has(c));g.length>0&&(n.actionRefs=`References unknown shared action${g.length===1?"":"s"} ${g.map(c=>`'${c}'`).join(", ")} \u2014 bound elements will render disabled.`)}if(e.theme!==void 0){let a=Pe(e.theme);a.ok||(n.theme=a.error)}return n.previewable=n.kind===void 0&&n.template===void 0,n}function Gn(e,t){let n=[];St(e,"",n);let r=new Set(["string","number","integer","boolean","null",void 0]),o=n.filter(({schema:a})=>{let g=xe(a);return t==="each"?g==="array":t==="bind"?r.has(g):!0}).map(a=>a.path);return t!=="each"&&r.has(xe(e))&&o.unshift("."),o}function si(e,t){if(!x(e)||t===".")return;let n=e;for(let r of t.split(".")){if(!x(n)||!x(n.properties))return;n=n.properties[r]}return x(n)&&xe(n)==="array"?n.items:void 0}var jt=Symbol("remove");function on(e){let t="";for(let n of e){let r=typeof n=="number"?`children.${n}`:n;t=t===""?r:`${t}.${r}`}return t}function Rt(e,t,n){if(t.length===0)return n===jt?void 0:n;let[r,...i]=t;if(typeof r=="number"){if(!x(e)||!Array.isArray(e.children))return e;let o=[...e.children];return i.length===0&&n===jt?o.splice(r,1):o[r]=Rt(o[r],i,n),{...e,children:o}}if(!x(e))return e;if(i.length===0&&n===jt){let{[r]:o,...a}=e;return a}return{...e,[r]:Rt(e[r],i,n)}}function Yn(e,t,n,r){let i=t.length===0?e:ai(e,t);if(!x(i)||!Array.isArray(i.children))return e;let o=[...i.children];if(n<0||r<0||n>=o.length||r>=o.length)return e;let[a,g]=[o[n],o[r]];o[n]=g,o[r]=a;let c={...i,children:o};return t.length===0?c:Rt(e,t,c)}function ai(e,t){let n=e;for(let r of t){if(!x(n))return;n=typeof r=="number"?Array.isArray(n.children)?n.children[r]:void 0:n[r]}return n}var Lt={text:()=>"text",bind:()=>({bind:"."}),element:()=>({tag:"div",children:[]}),each:()=>({each:".",template:"item"}),when:()=>({when:".",template:"shown"})};function Xn(e,t,n={}){let r=n.actionContext??{actions:[],secretNames:[],schemas:[]},i=new Set,o=s("div",{class:"wgd-tree"}),a=G(void 0),g=s("textarea",{class:"wgd-textarea wgd-template-json",rows:"14",spellcheck:"false"}),c=s("div",void 0,[g,a]);ae(g),c.hidden=!0;let l=s("button",{class:"wgd-button",type:"button"},["Tree"]),u=s("button",{class:"wgd-button",type:"button"},["JSON"]);l.addEventListener("click",()=>{o.hidden=!1,c.hidden=!0}),u.addEventListener("click",()=>{o.hidden=!0,c.hidden=!1});let p=G(void 0),m=s("details",{class:"wgd-section",open:""},[s("summary",{class:"wgd-section-title"},["Template"]),s("div",{class:"wgd-section-body"},[s("div",{class:"wgd-row"},[l,u]),p,o,c])]);function w(E){e.update(b=>({...b,template:E}))}function f(E,b){w(Rt(e.get().template,E,b))}g.addEventListener("input",()=>{try{let E=JSON.parse(g.value);a.hidden=!0,a.textContent="",w(E)}catch(E){a.hidden=!1,a.textContent=`Invalid JSON (template keeps the last valid value): ${String(se(E))}`}});function y(E,b,j="wgd-input wgd-node-value"){let W=s("input",{type:"text",class:j});return W.value=E,W.addEventListener("change",()=>b(W.value)),W}let v=new Set;function S(E,b,j,W,C,H,$,D){let L=on(b),d=W.length>0,h=d&&v.has(L),A;d?(A=s("button",{class:"wgd-chevron",type:"button",title:h?"Expand":"Collapse"},[h?"\u25B8":"\u25BE"]),A.addEventListener("click",()=>{h?v.delete(L):v.add(L),U()})):A=s("span",{class:"wgd-chevron wgd-chevron-none"});let I=E===void 0?[A,...j]:[A,s("span",{class:"wgd-node-badge"},[E]),...j];h&&D?.summary!==void 0&&I.push(s("span",{class:"wgd-node-summary"},[D.summary]));let B=[...D?.icons??[]];if($&&$.count>1){if($.index>0){let K=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);K.addEventListener("click",()=>w(Yn(e.get().template,$.parent,$.index,$.index-1))),B.push(K)}if($.index<$.count-1){let K=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);K.addEventListener("click",()=>w(Yn(e.get().template,$.parent,$.index,$.index+1))),B.push(K)}}if(H){let K=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);K.addEventListener("click",()=>b.length===0?w(""):f(b,jt)),B.push(K)}B.length>0&&I.push(s("span",{class:"wgd-node-icons"},B));let V=[s("div",{class:"wgd-node-row"},I)];return C!==void 0&&V.push(G(C)),h||V.push(...W),s("div",{class:"wgd-node","data-path":L},V)}let k=["div","span","p","section","article","header","footer","h1","h2","h3","h4","strong","em","small","code","pre","ul","ol","li","dl","dt","dd","table","thead","tbody","tr","th","td","img","a","figure","figcaption","hr","br","label"];function N(E,b,j,W,C="wgd-input wgd-node-value"){let H=x(b)?Gn(b,j):[];if(H.length===0)return y(E,W,C);let $=s("select",{class:"wgd-select wgd-path"}),D=H.includes(E);for(let h of D?H:[E,...H])$.append(s("option",{value:h},[h===E&&!D?`${h} (off-schema)`:h]));$.append(s("option",{value:"__custom__"},["custom\u2026"])),$.value=E,be($);let L=y(E,W,C);L.hidden=!0,$.addEventListener("change",()=>{if($.value==="__custom__"){L.hidden=!1,L.focus();return}L.hidden=!0,W($.value)});let d=C.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${d}`},[$,L])}function R(E,b){let j=s("select",{class:"wgd-select wgd-tag"}),W=k.includes(E)?k:[E,...k];for(let H of W)j.append(s("option",{value:H},[H]));j.append(s("option",{value:"__custom__"},["custom\u2026"])),j.value=E,be(j);let C=y(E,b,"wgd-input wgd-tag-custom");return C.hidden=!0,j.addEventListener("change",()=>{if(j.value==="__custom__"){C.hidden=!1,C.focus();return}C.hidden=!0,b(j.value)}),s("span",{class:"wgd-tagwrap"},[j,C])}function P(E,b,j,W,C,H,$){let D=[...b,j];if(W===void 0){let L=Zt(`+ ${E}`,`Set '${E}' to a node`,Object.keys(Lt),d=>{let h=Lt[d];h&&f(D,h())});return C?s("div",{class:"wgd-slot"},[G(`Missing required '${E}'.`),L]):s("div",{class:"wgd-slot wgd-slot-unset"},[L])}return s("div",{class:"wgd-slot"},[s("span",{class:"wgd-slot-label"},[E]),z(W,D,H,!C,void 0,$)])}function z(E,b,j,W=!0,C,H){let $=on(b),D=j!==void 0&&(j===$||(j.startsWith($===""?"attrs.":`${$}.attrs.`)||j.startsWith($===""?"action":`${$}.action`))&&x(E)&&typeof E.tag=="string")?T:void 0;if(typeof E=="string")return S("text",b,[y(E,L=>f(b,L))],[],D,W,C);if(!x(E))return S("invalid",b,[s("code",void 0,[JSON.stringify(E)])],[],D??"Not a template node.",W,C);if(typeof E.bind=="string")return S("bind",b,[N(E.bind,H,"bind",L=>f(b,{bind:L}))],[],D,W,C);if(typeof E.each=="string")return S("each",b,[N(E.each,H,"each",L=>f(b,{...E,each:L}))],[P("template",b,"template",E.template,!0,j,si(H,E.each)),P("empty",b,"empty",E.empty,!1,j,H)],D,W,C,{summary:E.empty!==void 0?"template \xB7 empty":"template"});if(typeof E.when=="string")return S("when",b,[N(E.when,H,"when",L=>f(b,{...E,when:L}))],[P("template",b,"template",E.template,!0,j,H),P("else",b,"else",E.else,!1,j,H)],D,W,C,{summary:E.else!==void 0?"template \xB7 else":"template"});if(typeof E.tag=="string"){let L=x(E.attrs)?E.attrs:{},d=x(E.action)?E.action:void 0,h=Object.entries(L).map(([K,X])=>{let ee=x(X)&&typeof X.bind=="string"?X:{bind:""},ne=x(X)&&typeof X.bind=="string",le=ne?ee:void 0,Ee=Y=>{let de={bind:Y.bind};return Y.map!==void 0?(de.map=Y.map,Y.default!==void 0&&Y.default!==""&&(de.default=Y.default)):Y.prefix!==void 0&&Y.prefix!==""&&(de.prefix=Y.prefix),de},we=Y=>{f(b,{...E,attrs:{...L,[K]:Y}})},pr=y(K,Y=>{let de=Object.entries(L).map(([je,pn])=>je===K?[Y,pn]:[je,pn]);f(b,{...E,attrs:Object.fromEntries(de)})},"wgd-input wgd-attr-name"),Le=s("select",{class:"wgd-select wgd-attr-mode"});Le.append(s("option",{value:"literal"},["literal"])),Le.append(s("option",{value:"bind"},["bind"])),Le.value=ne?"bind":"literal",be(Le);let ln=y(String(ne?"":X),Y=>we(Y),"wgd-input wgd-attr-value"),gr=ne?N(ee.bind,H,"bind",Y=>we(Ee({...ee,bind:Y})),"wgd-input wgd-attr-value"):ln;Le.addEventListener("change",()=>{let Y=ne?ee.bind:ln.value;we(Le.value==="bind"?{bind:Y||"."}:Y)});let Pt=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);Pt.addEventListener("click",()=>{let{[K]:Y,...de}=L;f(b,{...E,attrs:de})});let it=[pr,Le,gr],It=le?.map!==void 0,fr=le?.prefix!==void 0&&le.prefix!=="";if(ne&&!It){let Y=y(le?.prefix??"",de=>we(Ee({...ee,map:void 0,prefix:de})),"wgd-input wgd-attr-prefix");Y.placeholder="prefix",Y.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",it.push(Y)}if(ne&&!It&&!fr){let Y=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);Y.addEventListener("click",()=>we(Ee({...ee,prefix:void 0,map:{}}))),it.push(s("span",{class:"wgd-node-icons"},[Y,Pt]))}else it.push(Pt);let un=s("div",{class:"wgd-attr-row"},it),Mt=[un];if(ne&&It){let Y=kt(ee.map,{key:"data value",value:"authored literal",add:"+ mapping"},je=>{we(je===void 0?{bind:ee.bind}:Ee({...ee,map:je}))}),de=y(ee.default??"",je=>we(Ee({...ee,default:je})),"wgd-input wgd-attr-map-default");de.placeholder="default (on miss)",Mt.push(s("div",{class:"wgd-attr-map"},[Y.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),de])]))}return Mt.length===1?un:s("div",{class:"wgd-attr"},Mt)}),A=Array.isArray(E.children)?E.children:[],I=Zt("+","Add attribute or child node",["attribute",...d===void 0&&(E.tag==="button"||E.tag==="a")?["action"]:[],...Object.keys(Lt)],K=>{v.delete(on(b));let X=Lt[K];if(K==="attribute")f(b,{...E,attrs:{...L,"":""}});else if(K==="action"){let ee=r.actions[0];f(b,{...E,action:ee!==void 0?{ref:ee.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else X&&f([...b,A.length],X())}),B=[];if(h.length>0&&B.push(s("div",{class:"wgd-attrs"},h)),d!==void 0){let K=x(H)?Gn(H,"when"):[],X=Ot(d,{...r,scopePaths:K,getDataSchema:()=>Ne(e.get(),r.schemas)},le=>{if(le===void 0){let{action:Ee,...we}=E;f(b,we)}else f(b,{...E,action:le})}),ee=[s("span",{class:"wgd-slot-label"},["action"]),X.element],ne="ref"in d&&typeof d.ref=="string"?d.ref:void 0;ne!==void 0&&i.has(ne)&&ee.push(G(`Unknown shared action '${ne}' \u2014 this element renders disabled.`)),B.push(s("div",{class:"wgd-attrs wgd-node-action"},ee))}A.length>0&&B.push(s("div",{class:"wgd-children"},A.map((K,X)=>z(K,[...b,X],j,!0,{parent:b,index:X,count:A.length},H))));let V=[];return h.length>0&&V.push(`${h.length} attr${h.length===1?"":"s"}`),d!==void 0&&V.push("action"),A.length>0&&V.push(`${A.length} ${A.length===1?"child":"children"}`),S(void 0,b,[R(E.tag,K=>f(b,{...E,tag:K}))],B,D,W,C,{icons:[I],summary:V.join(" \xB7 ")})}return S("unknown",b,[s("code",void 0,[JSON.stringify(E)])],[],D??"Unknown template node form.",W,C)}let T,_,F;function U(){_!==void 0&&o.replaceChildren(z(_.template,[],F,!0,void 0,Ne(_,r.schemas)))}function M(E,b){T=b.template?`${b.template.code}: ${b.template.message}`:void 0,_=E,F=b.template?.path;let j=new Set(r.actions.map(C=>C.name));i=new Set(Ye(E.template,E.load).filter(C=>!j.has(C)));let W=b.template?`${b.template.code}: ${b.template.message}`+(b.template.path!==void 0&&b.template.path!==""?` (at ${b.template.path})`:""):b.actionRefs;p.hidden=W===void 0,p.textContent=W??"",(!o.hidden||o.childNodes.length===0)&&U(),document.activeElement!==g&&(g.value=JSON.stringify(E.template,null,2),ce(g))}return t.push(()=>{}),{element:m,refresh:M,dispose:()=>m.remove()}}function Zn(e,t,n=[]){let r=G(void 0),i=s("select",{class:"wgd-select wgd-theme-select"});i.append(s("option",{value:""},["(none \u2014 defaults)"]));for(let l of n)i.append(s("option",{value:l.name},[l.label??l.name]));i.addEventListener("change",()=>{let l=n.find(u=>u.name===i.value);e.update(u=>{if(l===void 0){let{theme:p,...m}=u;return m}return{...u,theme:l.tokens}})});let o=s("div",{class:"wgd-token-ref"});function a(l){o.replaceChildren();for(let[u,p]of Object.entries(ge)){let m=l?.[u]??p.default,w=s("div",{class:"wgd-token-ref-row",title:p.use},[p.type==="color"?s("span",{class:"wgd-token-ref-swatch",style:`background: ${m}`}):s("span",{class:"wgd-token-ref-swatch wgd-token-ref-noswatch"}),s("code",{class:"wgd-token-ref-name"},[`--wg-${u}`]),s("span",{class:"wgd-token-ref-value"},[m])]);o.append(w)}for(let[u,p]of Object.entries(l??{})){if(!u.startsWith("x-"))continue;let m=s("div",{class:"wgd-token-ref-row",title:"Custom variable"},[s("span",{class:"wgd-token-ref-swatch wgd-token-ref-noswatch"}),s("code",{class:"wgd-token-ref-name"},[`--wg-${u}`]),s("span",{class:"wgd-token-ref-value"},[p])]);o.append(m)}}a(e.get().theme),t.push(l=>{if(l.theme===void 0)i.value="";else{let u=n.find(p=>JSON.stringify(p.tokens)===JSON.stringify(l.theme));i.value=u?.name??""}a(l.theme)});let g=[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview theme"]),i]),s("span",{class:"wgd-field-label"},[n.length===0?"No themes supplied by the host \u2014 design themes in the theme designer.":"Themes come from the host; edit them in the theme designer."]),r,s("details",{class:"wgd-token-ref-details"},[s("summary",{class:"wgd-field-label"},["Theme tokens (reference for styles)"]),o])],c=Z("Preview",g);return{element:c,setDiagnostic(l){r.hidden=l===void 0,r.textContent=l??""},dispose:()=>c.remove()}}function tt(e){let t=e.map((n,r)=>{let i=s("button",{class:`wgd-button wgd-tab${r===0?" wgd-tab-active":""}`,type:"button"},[n.label]);return i.addEventListener("click",()=>{e.forEach((o,a)=>{o.element.hidden=a!==r,t[a]?.classList.toggle("wgd-tab-active",a===r)})}),n.element.hidden=r!==0,i});return s("div",{class:"wgd-tabs"},[s("div",{class:"wgd-row"},t),...e.map(n=>n.element)])}function nt(e,t,n,r,i,o,a=6){let g=G(void 0),c=t(i.get()),l=xt(e,c===void 0?"":JSON.stringify(c,null,2),p=>{if(p.trim()===""){g.hidden=!0,r&&i.update(m=>r(m));return}try{let m=JSON.parse(p);g.hidden=!0,g.textContent="",i.update(w=>n(w,m))}catch(m){g.hidden=!1,g.textContent=`Invalid JSON (draft keeps the last valid value): ${String(se(m))}`}},a),u=pe(l,"textarea");return ae(u),o.push(p=>{if(document.activeElement===u)return;let m=t(p);u.value=m===void 0?"":JSON.stringify(m,null,2),ce(u)}),s("div",void 0,[l,g])}function Qn(e,t,n=[],r=[],i={actions:[],secretNames:[],schemas:[]}){let o=[],a=[];function g(d,h,A){let I=Ae(d,h(e.get()),V=>e.update(K=>A(K,V))),B=pe(I,"input");return o.push(V=>{document.activeElement!==B&&(B.value=h(V))}),I}let c=G(void 0),l=kt(e.get().descriptor.hints,{key:"hint name",value:"what the hint does",add:"+ hint"},d=>e.update(h=>{if(d===void 0){let{hints:A,...I}=h.descriptor;return{...h,descriptor:I}}return{...h,descriptor:{...h.descriptor,hints:d}}}));o.push(d=>l.setValue(d.descriptor.hints));let u=Z("General",[g("Kind (id)",d=>d.kind,(d,h)=>({...d,kind:h})),c,g("Description",d=>d.descriptor.description??"",(d,h)=>({...d,descriptor:{...d.descriptor,description:h}})),g("Data shape (prose)",d=>d.descriptor.dataShape??"",(d,h)=>({...d,descriptor:{...d.descriptor,dataShape:h}})),s("div",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},["Hints"]),tt([{label:"Tree",element:l.element},{label:"JSON",element:nt("",d=>d.descriptor.hints,(d,h)=>{if(!x(h))return d;let A=Object.fromEntries(Object.entries(h).map(([I,B])=>[I,String(B)]));return{...d,descriptor:{...d.descriptor,hints:A}}},d=>{let{hints:h,...A}=d.descriptor;return{...d,descriptor:A}},e,o,3)}])])]),p=Ve(e.get().descriptor.dataSchema,d=>e.update(h=>{if(d===void 0){let{dataSchema:A,...I}=h.descriptor;return{...h,descriptor:I}}return{...h,descriptor:{...h.descriptor,dataSchema:d}}}));o.push(d=>p.setValue(d.descriptor.dataSchema));let m=tt([{label:"Builder",element:p.element},{label:"JSON",element:nt("dataSchema (JSON-Schema subset: type/properties/required/items/enum/pattern)",d=>d.descriptor.dataSchema,(d,h)=>x(h)?{...d,descriptor:{...d.descriptor,dataSchema:h}}:d,d=>{let{dataSchema:h,...A}=d.descriptor;return{...d,descriptor:A}},e,o)}]),w=s("select",{class:"wgd-select wgd-schema-mode"});w.append(s("option",{value:"inline"},["define inline"]));let f=s("option",{value:"shared"},["use shared"]);r.length===0&&(f.disabled=!0),w.append(f);let y=s("select",{class:"wgd-select wgd-schema-ref"});for(let d of r)y.append(s("option",{value:d.name},[d.label??d.name]));y.addEventListener("change",()=>{e.update(d=>({...d,descriptor:{...d.descriptor,dataSchemaRef:y.value}}))});let v=s("textarea",{class:"wgd-textarea wgd-schema-shared",rows:"10",readonly:"",spellcheck:"false"}),S=G(void 0),k=s("div",void 0,[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Shared schema"]),y]),v,s("span",{class:"wgd-field-label"},["Read-only here \u2014 edit shared schemas in the Data schemas section."])]);w.addEventListener("change",()=>{if(w.value==="shared"){let d=e.get().descriptor.dataSchemaRef??r[0]?.name??"";e.update(h=>{let{dataSchema:A,...I}=h.descriptor;return{...h,descriptor:{...I,dataSchemaRef:d}}})}else{let d=Ne(e.get(),r);e.update(h=>{let{dataSchemaRef:A,...I}=h.descriptor;return{...h,descriptor:{...I,dataSchema:d??{type:"object"}}}})}});function N(d){let h=d.descriptor.dataSchemaRef,A=typeof h=="string";if(w.value=A?"shared":"inline",m.hidden=A,k.hidden=!A,A){y.value!==h&&(y.value=h);let I=r.find(B=>B.name===h)?.schema;v.value=I===void 0?"":JSON.stringify(I,null,2),ce(v)}}o.push(N),N(e.get());let R=Z("Data schema",[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Source"]),w]),S,m,k],!1);ae(v);function P(d,h){let A=s("div"),I="",B;function V(K){let X=Ne(K,r),ee=X===void 0?"":JSON.stringify(X);if(B!==void 0&&ee===I){B.setValue(d(K));return}I=ee;let ne=le=>e.update(Ee=>h(Ee,le));B=X!==void 0&&x(X)?Et(X,d(K),ne):_n(d(K),ne),A.replaceChildren(B.element)}return V(e.get()),o.push(V),A}let z=G(void 0),T=Z("Sample data",[s("span",{class:"wgd-field-label"},["dataExample \u2014 ships with the widget as the example agents imitate"]),tt([{label:"Edit",element:P(d=>d.descriptor.dataExample,(d,h)=>({...d,descriptor:{...d.descriptor,dataExample:h}}))},{label:"JSON",element:nt("dataExample (JSON)",d=>d.descriptor.dataExample,(d,h)=>({...d,descriptor:{...d.descriptor,dataExample:h}}),d=>{let{dataExample:h,...A}=d.descriptor;return{...d,descriptor:A}},e,o)}]),z],!1),_=G(void 0),F=Z("Data for preview",[s("span",{class:"wgd-field-label"},["Overrides dataExample in the preview only (not exported)"]),tt([{label:"Edit",element:P(d=>d.sampleData,(d,h)=>({...d,sampleData:h}))},{label:"JSON",element:nt("Preview data (JSON)",d=>d.sampleData,(d,h)=>({...d,sampleData:h}),d=>{let{sampleData:h,...A}=d;return A},e,o,4)}]),_],!1),U=s("div"),M=Jn(e.get().descriptor.styles,d=>e.update(h=>{if(d===void 0){let{styles:A,...I}=h.descriptor;return{...h,descriptor:I}}return{...h,descriptor:{...h.descriptor,styles:d}}}));o.push(d=>M.setValue(d.descriptor.styles));let E=Z("Styles (.wg- selectors, guarded like the server)",[tt([{label:"Tree",element:M.element},{label:"JSON",element:nt("",d=>d.descriptor.styles,(d,h)=>x(h)?{...d,descriptor:{...d.descriptor,styles:h}}:d,d=>{let{styles:h,...A}=d.descriptor;return{...d,descriptor:A}},e,o)}]),U]),b=Xn(e,o,{actionContext:i}),j=Zn(e,o,n),W=G(void 0),C=Ot(e.get().load,{...i,loadOnly:!0,getDataSchema:()=>Ne(e.get(),r)},d=>e.update(h=>{if(d===void 0){let{load:A,...I}=h;return I}return{...h,load:d}}));o.push(d=>{C.element.contains(document.activeElement)||C.setValue(d.load)});let H=Z("Load action (http GET, runs once when the widget first renders in an Apps host)",[s("div",{class:"wgd-compact wgd-load"},[C.element]),W],!1),$=Mn(e);F.classList.add("wgd-edit-only"),E.classList.add("wgd-edit-only"),t.left.append(u,R,T,b.element,H,$.element),t.right.append(F,E,j.element),a.push(b.dispose,j.dispose,$.dispose);function D(d){let h=Nt(d,{schemas:r,actions:i.actions});c.hidden=h.kind===void 0,W.hidden=h.load===void 0,W.textContent=h.load??"",c.textContent=h.kind??"",z.hidden=h.example===void 0,z.textContent=h.example?`dataExample vs dataSchema: ${h.example.code} at ${h.example.path} \u2014 ${h.example.message}`:"",_.hidden=h.sample===void 0,_.textContent=h.sample?`sample vs dataSchema: ${h.sample.code} at ${h.sample.path} \u2014 ${h.sample.message}`:"",S.hidden=h.schemaRef===void 0,S.textContent=h.schemaRef??"",j.setDiagnostic(h.theme?`${h.theme.code}: ${h.theme.message}`:void 0),U.replaceChildren(...h.styles.map(A=>G(`${A.selector}${A.property?` \u2192 ${A.property}`:""}: ${A.message}`)));for(let A of o)A(d);b.refresh(d,h)}let L=e.subscribe(D);return a.push(L),D(e.get()),{dispose(){for(let d of a)d();t.left.replaceChildren(),t.right.replaceChildren()}}}var Ct="designer-preview";function $t(e={}){Jt(document);let t=s("div",{class:"wgd-banner"});t.hidden=!0;let n=s("style"),r=s("div",{class:"wgd-preview"}),i=s("div",{class:"wgd-preview-pane"},[t,n,r]),o=ye(),a=()=>({tag:"div",children:["\u2026"]});o.register(Ct,m=>a(m),{description:"Designer preview delegate.",dataShape:"Defined by the draft being designed."});let g=new Map;for(let m of e.widgets??[]){let w=Te(m.template);if(!w.ok||typeof m.kind!="string"||m.kind==="")continue;let f=vt(w.template),y=x(m.descriptor)?m.descriptor:{};try{o.register(m.kind,v=>f(v),{description:`Custom widget '${m.kind}' supplied for preview.`,dataShape:"Defined by the supplied definition.",...y.dataExample!==void 0?{dataExample:y.dataExample}:{}})}catch{continue}x(y.styles)&&g.set(m.kind,Ce(y.styles))}let c=o.kinds().filter(m=>m!==Ct),l;function u(m,w,f){let y=f===void 0||f===Ct;if(y&&!w.previewable){let S=w.kind??(w.template?`${w.template.code}: ${w.template.message}`+(w.template.path?` (at ${w.template.path})`:""):"Draft is not previewable.");if(t.hidden=!1,l===void 0){t.textContent=`Nothing to preview yet \u2014 ${S}`,r.replaceChildren(s("div",{class:"wgd-preview-empty"},["No preview: the draft has never been valid."]));return}t.textContent=`Preview frozen on the last valid draft \u2014 ${S}`;return}if(r.querySelector(".wgd-preview-empty")?.remove(),t.hidden=!0,t.textContent="",y){let S=Te(m.template);if(!S.ok)return;let k=e.actions??[];a=vt(S.template,{actions:N=>k.find(R=>R.name===N)?.definition})}n.textContent=y?m.descriptor.styles?Ce(m.descriptor.styles):"":g.get(f)??"",Ut(r,m.theme??{});let v={kind:y?Ct:f,data:y?m.sampleData??m.descriptor.dataExample??null:p(f)};l===void 0?l=Gt(v,r,{catalog:o}):l.update(v);for(let S of r.querySelectorAll("[data-wg-action]"))S.classList.add("wg-designer-action")}function p(m){return o.describe(m)?.dataExample??{value:"preview"}}return{pane:i,kinds:c,update:u,dispose(){l?.dispose(),l=void 0,i.replaceChildren()}}}function _e(e){return JSON.parse(JSON.stringify(e))}function rt(){return{kind:"my-widget",template:{tag:"div",attrs:{class:"wg-template"},children:[{tag:"h2",children:[{bind:"title"}]},{bind:"message"}]},descriptor:{description:"Describe what this widget is for.",dataShape:"{ title?, message }",dataExample:{title:"My widget",message:"Hello from the widgentic designer"},dataSchema:{type:"object",required:["message"],properties:{title:{type:"string"},message:{type:"string"}}}}}}function er(e){let t=_e(e??rt()),n=[],r=new Set;function i(){for(let o of[...r])o(t)}return{get:()=>t,update(o){n.push(t),n.length>50&&n.shift(),t=_e(o(_e(t))),i()},replace(o){n.length=0,t=_e(o),i()},undo(){let o=n.pop();return o===void 0?!1:(t=o,i(),!0)},subscribe(o){return r.add(o),()=>r.delete(o)}}}function tr(e,t={}){Oe(document);let n=t.initialWidget?_e({...t.initialWidget}):rt(),r=t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,i=er(r),o=new Set,a=$t({actions:t.actions??[]}),g=s("div",{class:"wgd-panels"}),c=s("div",{class:"wgd-preview-pane"}),l=s("div",{class:"wgd-side"},[a.pane,c]),u=s("div",{class:"wgd-root"},[g,l]);(t.appearance==="light"||t.appearance==="dark")&&u.setAttribute("data-wgd-theme",t.appearance),De(u,t.chrome),e.appendChild(u);let p={actions:t.actions??[],secretNames:t.secretNames??[],schemas:t.schemas??[]},m=Qn(i,{left:g,right:c},t.themes??[],t.schemas??[],p);function w(v){let S=Nt(v,{schemas:t.schemas??[],actions:t.actions??[]});a.update(v,S);for(let k of[...o])k(v,S)}let f=i.subscribe(w);w(i.get());function y(v){u.classList.toggle("wgd-readonly",v);let S=[...u.querySelectorAll(".wgd-panels .wgd-section-body, .wgd-edit-only > .wgd-section-body")].filter(k=>!k.parentElement?.classList.contains("wgd-view-only"));for(let k of S)v?k.setAttribute("inert",""):k.removeAttribute("inert")}return t.readOnly===!0&&y(!0),{getDraft:()=>_e(i.get()),setReadOnly:y,loadWidget(v){let S=en(v);return S.length>0?{ok:!1,errors:S}:(tn(i,v),{ok:!0})},loadTheme(v){let S=Pe(v);return S.ok?(i.update(k=>({...k,theme:S.theme})),{ok:!0}):{ok:!1,errors:[S.error.message]}},subscribe(v){return o.add(v),()=>o.delete(v)},dispose(){f(),m.dispose(),a.dispose(),o.clear(),u.remove()}}}var nr=/^[a-zA-Z0-9._-]+$/;function di(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function ci(e){let t=[];return x(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):nr.test(e.name)||t.push(`'${e.name}' is not a valid schema name \u2014 use letters, digits, '.', '_' or '-'.`),x(e.schema)||t.push("'schema' must be a plain object."),t):["Schema entry must be an object."]}function rr(e,t={}){Oe(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):di(),r=new Set,i=s("div",{class:"wgd-panels"}),o=s("div",{class:"wgd-root wgd-schema-designer"},[i]);(t.appearance==="light"||t.appearance==="dark")&&o.setAttribute("data-wgd-theme",t.appearance),De(o,t.chrome),e.appendChild(o);function a(){return JSON.parse(JSON.stringify(n))}function g(){for(let b of[...r])b(a())}let c=[],l=G(void 0);function u(b,j,W){let C=Ae(b,j(),W),H=pe(C,"input");return c.push(()=>{document.activeElement!==H&&(H.value=j())}),C}let p=Z("Schema",[u("Name (id)",()=>n.name,b=>{n={...n,name:b};let j=b.trim()===""||!nr.test(b);l.hidden=!j,l.textContent=j?"Name must be non-empty using letters, digits, '.', '_' or '-'.":"",g()}),l,u("Label",()=>n.label??"",b=>{n={...n,label:b},g()}),u("Description",()=>n.description??"",b=>{n={...n,description:b},g()})]),m=Ve(n.schema,b=>{n={...n,schema:b??{}},v(),g()}),w=G(void 0),f=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),y=s("div",void 0,[f,w]);f.value=JSON.stringify(n.schema,null,2),f.addEventListener("input",()=>{try{let b=JSON.parse(f.value);if(!x(b))throw new Error("schema must be an object");w.hidden=!0,w.textContent="",n={...n,schema:b},m.setValue(b),g()}catch(b){w.hidden=!1,w.textContent=`Invalid JSON (schema keeps the last valid value): ${String(se(b))}`}});function v(){document.activeElement!==f&&(f.value=JSON.stringify(n.schema,null,2),ce(f))}let S=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Builder"]),k=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);y.hidden=!0,S.addEventListener("click",()=>{m.element.hidden=!1,y.hidden=!0,S.classList.add("wgd-tab-active"),k.classList.remove("wgd-tab-active")}),k.addEventListener("click",()=>{m.element.hidden=!0,y.hidden=!1,k.classList.add("wgd-tab-active"),S.classList.remove("wgd-tab-active"),v()});let N=Z("Definition",[s("div",{class:"wgd-row"},[S,k]),m.element,y]),R=G(void 0),P=s("textarea",{class:"wgd-textarea wgd-schema-import",rows:"6",spellcheck:"false"}),z=s("button",{class:"wgd-button",type:"button"},["Import"]);z.addEventListener("click",()=>{let b;try{b=JSON.parse(P.value)}catch(W){R.hidden=!1,R.textContent=`Invalid JSON: ${se(W)}`;return}let j=M(b);R.hidden=j.ok,R.textContent=j.ok?"":j.errors.join(`
414
- `)});let T=Z("Import",[s("span",{class:"wgd-field-label"},["Import schema entry JSON ({ name, label?, description?, schema })"]),P,R,s("div",{class:"wgd-row"},[z])]),_=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),F=s("button",{class:"wgd-button wgd-add",type:"button"},["Export schema entry"]);F.addEventListener("click",()=>{_.value=JSON.stringify(a(),null,2),ce(_)});let U=Z("Export",[s("div",{class:"wgd-toolbar"},[F]),_]);U.classList.add("wgd-view-only"),i.append(p,N,T,U),ae(f),ae(P),ae(_);function M(b){let j=ci(b);if(j.length>0)return{ok:!1,errors:j};n=JSON.parse(JSON.stringify(b));for(let W of c)W();return l.hidden=!0,m.setValue(n.schema),v(),g(),{ok:!0}}function E(b){o.classList.toggle("wgd-readonly",b);let j=[...i.querySelectorAll(".wgd-section-body")].filter(W=>!W.parentElement?.classList.contains("wgd-view-only"));for(let W of j)b?W.setAttribute("inert",""):W.removeAttribute("inert")}return t.readOnly===!0&&E(!0),{getSchema:a,loadSchema:M,setReadOnly:E,subscribe(b){return r.add(b),()=>r.delete(b)},dispose(){r.clear(),o.remove()}}}var li=ye().kinds(),ui=/^#[0-9a-f]{3}([0-9a-f]{3})?$/i,ir=/^x-[a-z0-9][a-z0-9-]*$/;function pi(e){if(!ui.test(e))return;if(e.length===7)return e.toLowerCase();let[,t,n,r]=e.toLowerCase();return`#${t}${t}${n}${n}${r}${r}`}function gi(){return{name:"my-theme",label:"My theme",tokens:{}}}function fi(e){let t=[];if(typeof e!="object"||e===null||Array.isArray(e))return["Theme entry must be an object."];let n=e;(typeof n.name!="string"||n.name.trim()==="")&&t.push("'name' must be a non-empty string.");let r=Pe(n.tokens??{});return r.ok||t.push(`tokens: ${r.error.code} \u2014 ${r.error.message}`),t}function or(e,t={}){Oe(document);let n=t.initialTheme?JSON.parse(JSON.stringify(t.initialTheme)):gi(),r=new Set,i=$t(t.widgets?{widgets:t.widgets}:{}),o=i.kinds.length>0?i.kinds:li,a=o[0]??"card",g=s("div",{class:"wgd-panels"}),c=s("div",{class:"wgd-side"},[i.pane]),l=s("div",{class:"wgd-root wgd-theme-designer"},[g,c]);(t.appearance==="light"||t.appearance==="dark")&&l.setAttribute("data-wgd-theme",t.appearance),De(l,t.chrome),e.appendChild(l);function u(){return{...rt(),theme:n.tokens}}function p(){i.update(u(),{styles:[],previewable:!0},a);for(let D of[...r])D(m())}function m(){return JSON.parse(JSON.stringify(n))}function w(D,L){let d={...n.tokens};L===""?delete d[D]:d[D]=L,n={...n,tokens:d},p()}let f=[];function y(D,L,d){let h=Ae(D,L(),d),A=pe(h,"input");return f.push(()=>{document.activeElement!==A&&(A.value=L())}),h}let v=Z("Theme",[y("Name (id)",()=>n.name,D=>{n={...n,name:D},p()}),y("Label",()=>n.label??"",D=>{n={...n,label:D},p()}),y("Description",()=>n.description??"",D=>{n={...n,description:D},p()})]),S=s("select",{class:"wgd-select wgd-preview-kind"});for(let D of o)S.append(s("option",{value:D},[D]));S.value=a,S.addEventListener("change",()=>{a=S.value,p()}),c.prepend(s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview kind"]),S]));let k=[],N=[];for(let D of fe){let L=s("input",{type:"text",class:"wgd-input",placeholder:$e[D]});L.value=n.tokens[D]??"";let d=G(void 0),h=ge[D].type==="color"?s("input",{type:"color",class:"wgd-swatch",title:`Pick --wg-${D}`}):void 0,A=I=>{let B=I===""?$e[D]:I;if(h!==void 0){let V=pi(B);V!==void 0&&(h.value=V),h.style.background=We(B)?B:"transparent"}};A(L.value),h?.addEventListener("input",()=>{L.value=h.value,L.dispatchEvent(new Event("input",{bubbles:!0}))}),L.addEventListener("input",()=>{let I=L.value!==""&&!We(L.value);d.hidden=!I,d.textContent=I?"INVALID_TOKEN_VALUE: unsafe value withheld from the preview (no ;{}<> url() expression()).":"",A(L.value),w(D,L.value)}),k.push(()=>{document.activeElement!==L&&(L.value=n.tokens[D]??"",A(L.value))}),N.push(s("div",void 0,[s("label",{class:"wgd-field",title:ge[D].use},[s("span",{class:"wgd-field-label"},[`--wg-${D}`]),s("div",{class:"wgd-token-row"},h===void 0?[L]:[L,h])]),d]))}let R=Z("Tokens",N),P=s("div",{class:"wgd-jt-children"}),z=G(void 0);function T(){return Object.entries(n.tokens).filter(([D])=>ir.test(D))}function _(){let D=T().map(([d,h])=>{let A=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});A.value=d,A.addEventListener("change",()=>{let V=A.value;if(!ir.test(V)){z.hidden=!1,z.textContent=`'${V}' is not a valid custom name \u2014 use x-<lowercase-kebab>.`,A.value=d;return}z.hidden=!0;let K={...n.tokens};delete K[d],K[V]=h,n={...n,tokens:K},_(),p()});let I=s("input",{type:"text",class:"wgd-input"});I.value=h,I.addEventListener("input",()=>w(d,I.value));let B=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return B.addEventListener("click",()=>{w(d,""),_()}),s("div",{class:"wgd-attr-row"},[A,I,B])}),L=s("button",{class:"wgd-button wgd-add",type:"button"},["+ variable"]);L.addEventListener("click",()=>{let d="x-custom";for(let h=1;d in n.tokens;h++)d=`x-custom${h}`;w(d,"0"),_()}),P.replaceChildren(...D,s("div",{class:"wgd-toolbar"},[L]))}_();let F=Z("Custom variables (--wg-x-*)",[P,z]),U=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),M=s("button",{class:"wgd-button wgd-add",type:"button"},["Export theme entry"]);M.addEventListener("click",()=>{U.value=JSON.stringify(m(),null,2)});let E=s("textarea",{class:"wgd-textarea",rows:"5",spellcheck:"false"}),b=G(void 0),j=s("button",{class:"wgd-button",type:"button"},["Import"]);j.addEventListener("click",()=>{let D;try{D=JSON.parse(E.value)}catch(d){b.hidden=!1,b.textContent=`Invalid JSON: ${se(d)}`;return}let L=H(D);b.hidden=L.ok,b.textContent=L.ok?"":L.errors.join(`
415
- `)});let W=Z("Import",[s("span",{class:"wgd-field-label"},["Import theme entry JSON"]),E,b,s("div",{class:"wgd-row"},[j])]),C=Z("Export",[s("div",{class:"wgd-toolbar"},[M]),U]);C.classList.add("wgd-view-only"),g.append(v,R,F,W,C);function H(D){let L=fi(D);if(L.length>0)return{ok:!1,errors:L};n=JSON.parse(JSON.stringify(D));for(let d of f)d();for(let d of k)d();return _(),p(),{ok:!0}}p();function $(D){l.classList.toggle("wgd-readonly",D);let L=[...g.querySelectorAll(".wgd-section-body")].filter(d=>!d.parentElement?.classList.contains("wgd-view-only"));for(let d of L)D?d.setAttribute("inert",""):d.removeAttribute("inert")}return t.readOnly===!0&&$(!0),{getTheme:m,loadTheme:H,setReadOnly:$,subscribe(D){return r.add(D),()=>r.delete(D)},dispose(){r.clear(),i.dispose(),l.remove()}}}function mi(){return{name:"my-action",label:"My action",definition:{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}}function hi(e){let t=[];if(!x(e))return["Action entry must be an object."];(typeof e.name!="string"||!mt.test(e.name))&&t.push("'name' must be lowercase letters, digits and dashes, starting with a letter (max 64).");for(let r of["label","description"])e[r]!==void 0&&typeof e[r]!="string"&&t.push(`'${r}' must be a string when present.`);let n=Be(e.definition,"definition");return n&&t.push(`${n.message} (at ${n.path})`),t}function wi(e){let t={name:e.name,definition:ie(e.definition)};return typeof e.label=="string"&&e.label!==""&&(t.label=e.label),typeof e.description=="string"&&e.description!==""&&(t.description=e.description),t}function sr(e,t,n){let{[t]:r,...i}=e;return n===""?i:{...i,[t]:n}}function ar(e,t={}){Oe(document);let n=t.initialAction?ie(t.initialAction):mi(),r=t.testCall,i=new Set,o=s("div",{class:"wgd-panels"}),a=s("div",{class:"wgd-root wgd-action-designer"},[o]);(t.appearance==="light"||t.appearance==="dark")&&a.setAttribute("data-wgd-theme",t.appearance),De(a,t.chrome),e.appendChild(a);let g=()=>ie(n);function c(){for(let d of[...i])d(g())}let l=[],u=G(void 0);function p(d,h,A){let I=Ae(d,h(),A),B=pe(I,"input");return l.push(()=>{document.activeElement!==B&&(B.value=h())}),I}let m=Z("Action",[p("Name (id)",()=>n.name,d=>{n={...n,name:d};let h=!mt.test(d);u.hidden=!h,u.textContent=h?"Name must be lowercase letters, digits and dashes, starting with a letter.":"",c()}),u,p("Label",()=>n.label??"",d=>{n=sr(n,"label",d),c()}),p("Description",()=>n.description??"",d=>{n=sr(n,"description",d),c()})]),w=G(void 0),f=rn(n.definition,{...t.schemas?{schemas:t.schemas}:{},...t.secretNames?{secretNames:t.secretNames}:{}},d=>{n={...n,definition:d},k(),N(),M(),c()}),y=G(void 0),v=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),S=s("div",void 0,[v,y]);v.value=JSON.stringify(n.definition,null,2),v.addEventListener("input",()=>{try{let d=JSON.parse(v.value),h=Be(d,"definition");if(h)throw new Error(`${h.message} (at ${h.path})`);y.hidden=!0,y.textContent="",n={...n,definition:d},f.setValue(n.definition),N(),M(),c()}catch(d){y.hidden=!1,y.textContent=`Invalid (definition keeps the last valid value): ${se(d)}`}});function k(){document.activeElement!==v&&(v.value=JSON.stringify(n.definition,null,2),ce(v))}function N(){let d=Be(n.definition,"definition");w.hidden=d===void 0,w.textContent=d?`${d.message} (at ${d.path})`:""}N();let R=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Editor"]),P=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);S.hidden=!0,R.addEventListener("click",()=>{f.element.hidden=!1,S.hidden=!0,R.classList.add("wgd-tab-active"),P.classList.remove("wgd-tab-active")}),P.addEventListener("click",()=>{f.element.hidden=!0,S.hidden=!1,P.classList.add("wgd-tab-active"),R.classList.remove("wgd-tab-active"),k()});let z=Z("Definition",[s("div",{class:"wgd-row"},[R,P]),w,f.element,S]),T=s("div",{class:"wgd-action-test"}),_=Z("Test",[T]),F={},U;function M(){if(r===void 0)return;if(T.replaceChildren(),n.definition.kind!=="http"){U=void 0,F={},T.append(s("p",{class:"wgd-diagnostic"},["Prompt actions run in the host's composer; nothing to test."]));return}let d=n.definition,h=JSON.stringify(d.input);h!==U&&(F={}),U=h;let A=Et(d.input,F,V=>{F=x(V)?V:{}});F=x(A.getValue())?A.getValue():{};let I=s("pre",{class:"wgd-test-output"}),B=s("button",{class:"wgd-button wgd-add wgd-test-run",type:"button"},["Test call"]);B.addEventListener("click",()=>{B.disabled=!0,B.classList.add("wgd-busy"),B.setAttribute("aria-busy","true"),I.textContent="\u2026",r(d,F).then(V=>{I.textContent=typeof V=="string"?V:JSON.stringify(V,null,2)}).catch(V=>{I.textContent=`Test failed: ${V.message}`}).finally(()=>{B.disabled=!1,B.classList.remove("wgd-busy"),B.removeAttribute("aria-busy")})}),T.append(s("span",{class:"wgd-field-label"},["Arguments"]),A.element,s("div",{class:"wgd-row"},[B]),I)}M();let E=G(void 0),b=s("textarea",{class:"wgd-textarea wgd-action-import",rows:"6",spellcheck:"false"}),j=s("button",{class:"wgd-button",type:"button"},["Import"]);j.addEventListener("click",()=>{let d;try{d=JSON.parse(b.value)}catch(A){E.hidden=!1,E.textContent=`Invalid JSON: ${se(A)}`;return}let h=D(d);E.hidden=h.ok,E.textContent=h.ok?"":h.errors.join(`
416
- `)});let W=Z("Import",[s("span",{class:"wgd-field-label"},["Import action entry JSON ({ name, label?, description?, definition })"]),b,E,s("div",{class:"wgd-row"},[j])]),C=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),H=s("button",{class:"wgd-button wgd-add",type:"button"},["Export action entry"]);H.addEventListener("click",()=>{C.value=JSON.stringify(g(),null,2),ce(C)});let $=Z("Export",[s("div",{class:"wgd-toolbar"},[H]),C]);$.classList.add("wgd-view-only"),o.append(m,z,...r===void 0?[]:[_],W,$),ae(v),ae(b),ae(C);function D(d){let h=hi(d);if(h.length>0)return{ok:!1,errors:h};n=wi(d),F={};for(let A of l)A();return u.hidden=!0,f.setValue(n.definition),k(),N(),M(),c(),{ok:!0}}function L(d){a.classList.toggle("wgd-readonly",d);let h=[...o.querySelectorAll(".wgd-section-body")].filter(A=>!A.parentElement?.classList.contains("wgd-view-only"));for(let A of h)d?A.setAttribute("inert",""):A.removeAttribute("inert")}return t.readOnly===!0&&L(!0),{getAction:g,loadAction:D,setReadOnly:L,subscribe(d){return i.add(d),()=>i.delete(d)},dispose(){i.clear(),a.remove()}}}function Wt(e){let t=e.getAttribute("appearance"),n=Pn(e.getAttribute("chrome"));return{...t==="light"||t==="dark"?{appearance:t}:{},...n===void 0?{}:{chrome:n}}}var dr="widgentic-designer",cr="widgentic-theme-designer",lr="widgentic-schema-designer",ur="widgentic-action-designer";function sn(e=dr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=tr(this,Wt(this)),this.#t=this.#e.subscribe((r,i)=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{draft:r,diagnostics:i},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function an(e=cr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=or(this,Wt(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{theme:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function dn(e=lr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=rr(this,Wt(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{schema:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function cn(e=ur){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=ar(this,Wt(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{action:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}cn();sn();dn();an();
449
+ export const ${Ii(e.kind)||"custom"}Widget: CustomWidget = ${JSON.stringify({kind:e.kind,template:e.template,descriptor:e.descriptor,...e.load!==void 0?{load:e.load}:{}},null,2)};
450
+ `}function gr(e){let t=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"});function n(u,p){let m=s("button",{class:"wgd-button wgd-add",type:"button"},[u]);return m.addEventListener("click",()=>{t.value=p(),ge(t)}),m}let r=G(void 0),i=Vt("Import widget JSON","",()=>{},5),o=ye(i,"textarea");ce(o);let a=s("button",{class:"wgd-button",type:"button"},["Import"]);a.addEventListener("click",()=>{let u=_i(o.value);if(!u.ok){r.hidden=!1,r.textContent=u.errors.join(`
451
+ `);return}r.hidden=!0,r.textContent="",An(e,u.definition)});let f=X("Import",[i,r,s("div",{class:"wgd-row"},[a])]),c=X("Export",[s("div",{class:"wgd-row"},[n("Export widget entry",()=>Wi(e.get())),n("Copy as TypeScript",()=>Mi(e.get()))]),t]);c.classList.add("wgd-view-only");let l=s("div",{class:"wgd-io"},[f,c]);return ce(t),{element:l,dispose:()=>l.remove()}}var Hi=["string","number","boolean","null","object","array"];function Dn(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function Fi(e,t){switch(e){case"string":return typeof t=="number"||typeof t=="boolean"?String(t):"";case"number":{let n=Number(t);return Number.isFinite(n)?n:0}case"boolean":return t==="true"?!0:!!t&&t!=="false";case"null":return null;case"object":return{};case"array":return[]}}function Te(e,t,n,r=!1){if(t.length===0)return n;let[i,...o]=t;if(Array.isArray(e)){let a=[...e];return o.length===0&&r?a.splice(i,1):a[i]=Te(a[i],o,n,r),a}if(typeof e=="object"&&e!==null){let a={...e};return o.length===0&&r?delete a[i]:a[i]=Te(a[i],o,n,r),a}return e}function Bi(e,t,n,r){let i=t.reduce((a,f)=>typeof a=="object"&&a!==null?a[f]:void 0,e);if(typeof i!="object"||i===null||Array.isArray(i))return e;let o=Object.entries(i).map(([a,f])=>a===n?[r,f]:[a,f]);return Te(e,t,Object.fromEntries(o))}function mr(e,t){let n=e,r=s("div",{class:"wgd-jsontree"});function i(p){n=p,u(),t(n)}function o(p,m,y){let g=m==="number"?Number.isFinite(Number(y))?Number(y):0:y;n=Te(n,p,g),t(n)}function a(p,m){let y=s("select",{class:"wgd-select wgd-jt-type"});for(let g of Hi)y.append(s("option",{value:g},[g]));return y.value=Dn(p),y.addEventListener("change",()=>i(Te(n,m,Fi(y.value,p)))),y}function f(p,m){let y=Dn(p);if(y==="boolean"){let g=s("input",{type:"checkbox"});return g.checked=p,g.addEventListener("change",()=>i(Te(n,m,g.checked))),g}if(y==="null")return s("code",void 0,["null"]);if(y==="string"||y==="number"){let g=s("input",{type:"text",class:"wgd-input"});return g.value=String(p),g.addEventListener("change",()=>o(m,y,g.value)),g}return s("span")}function c(p,m,y,g){let b=s("div",{class:"wgd-jt-row"},[p,a(m,y)]),v=Dn(m);if(v!=="object"&&v!=="array"&&b.append(f(m,y)),g){let x=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);x.addEventListener("click",()=>i(Te(n,y,void 0,!0))),b.append(x)}let T=s("div",{class:"wgd-jt-entry"},[b]);return(v==="object"||v==="array")&&T.append(l(m,y)),T}function l(p,m){let y=s("div",{class:"wgd-jt-children"});if(Array.isArray(p)){p.forEach((v,T)=>{y.append(c(s("span",{class:"wgd-jt-key"},[String(T)]),v,[...m,T],!0))});let b=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);b.addEventListener("click",()=>i(Te(n,[...m,p.length],""))),y.append(s("div",{class:"wgd-toolbar"},[b]))}else if(typeof p=="object"&&p!==null){for(let[v,T]of Object.entries(p)){let x=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});x.value=v,x.addEventListener("change",()=>i(Bi(n,m,v,x.value))),y.append(c(x,T,[...m,v],!0))}let b=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);b.addEventListener("click",()=>{let v=p,T="key";for(let x=1;T in v;x++)T=`key${x}`;i(Te(n,[...m,T],""))}),y.append(s("div",{class:"wgd-toolbar"},[b]))}return s("details",{class:"wgd-jt-branch",open:""},[s("summary",{class:"wgd-jt-summary"},[Array.isArray(p)?`[ ${p.length} item${p.length===1?"":"s"} ]`:`{ ${Object.keys(p).length} propert${Object.keys(p).length===1?"y":"ies"} }`]),y])}function u(){r.replaceChildren(c(s("span",{class:"wgd-jt-key"},["value"]),n,[],!1))}return u(),{element:r,getValue:()=>n,setValue(p){r.contains(document.activeElement)||(n=p,u())}}}var hr=["object","array","string","number","integer","boolean","null","any"],wr=new Set(["string","number","integer","any"]);function ot(e,t){let n=e,r=s("div",{class:"wgd-schemabuilder"});function i(c,l=!0){n=c,t(n),l&&f()}function o(c,l,u){let p={...c};return u===void 0?delete p[l]:p[l]=u,p}function a(c,l,u,p=[],m=[]){let y=[],g=s("select",{class:"wgd-select wgd-sb-type"});for(let A of hr)g.append(s("option",{value:A},[A]));let b=c.type,v=Array.isArray(b)?b.filter(A=>typeof A=="string"):void 0,T=v?.includes("null")??!1,x=typeof b=="string"?b:v?.find(A=>A!=="null")??(T?"null":"any");g.value=hr.some(A=>A===x)?x:"any",Se(g);let N=s("input",{type:"checkbox",title:"Also allows null"});N.checked=T,N.disabled=g.value==="any"||g.value==="null";function C(A,M){if(A!=="any")return M&&A!=="null"?[A,"null"]:A}N.addEventListener("change",()=>{l(o(c,"type",C(g.value,N.checked)))}),g.addEventListener("change",()=>{let A=o(c,"type",C(g.value,N.checked));g.value!=="object"&&(A=o(o(A,"properties",void 0),"required",void 0)),g.value!=="array"&&(A=o(A,"items",void 0)),g.value!=="string"&&(A=o(A,"pattern",void 0)),wr.has(g.value)||(A=o(A,"enum",void 0)),l(A)}),y.push(s("div",{class:"wgd-sb-row"},[...p,g,s("label",{class:"wgd-sb-req wgd-sb-null",title:"Also allows null"},[N,"null"]),...m]));let I=[];if(g.value==="string"){let A=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:"pattern (regex, optional)"});A.value=typeof c.pattern=="string"?c.pattern:"",A.addEventListener("change",()=>l(o(c,"pattern",A.value===""?void 0:A.value))),I.push(s("span",{class:"wgd-sb-label"},["pattern"]),A)}let B=G(void 0);if(wr.has(g.value)){let A=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:'enum ["a","b"] (optional)'});A.value=Array.isArray(c.enum)?JSON.stringify(c.enum):"",A.addEventListener("change",()=>{if(A.value.trim()===""){B.hidden=!0,l(o(c,"enum",void 0));return}try{let M=JSON.parse(A.value);if(!Array.isArray(M))throw new Error("must be a JSON array");B.hidden=!0,l(o(c,"enum",M))}catch(M){B.hidden=!1,B.textContent=`enum ignored: ${de(M)}`}}),I.push(s("span",{class:"wgd-sb-label"},["enum"]),A)}if(I.length>0&&y.push(s("div",{class:"wgd-sb-row wgd-sb-constraints"},I),B),g.value==="object"){let A=k(c.properties)?c.properties:{},M=Array.isArray(c.required)?c.required.filter(W=>typeof W=="string"):[],V=s("div",{class:"wgd-jt-children"});for(let[W,Z]of Object.entries(A)){let w=s("input",{type:"text",class:"wgd-input wgd-sb-prop",placeholder:"property name"});w.value=W,w.addEventListener("change",()=>{let j=Object.entries(A).map(([_,S])=>_===W?[w.value,S]:[_,S]),P=M.map(_=>_===W?w.value:_);l(o(o(c,"properties",Object.fromEntries(j)),"required",P.length>0?P:void 0))});let E=s("input",{type:"checkbox",title:"required"});E.checked=M.includes(W),E.addEventListener("change",()=>{let j=E.checked?[...M,W]:M.filter(P=>P!==W);l(o(c,"required",j.length>0?j:void 0))});let R=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);R.addEventListener("click",()=>{let{[W]:j,...P}=A;l(o(o(c,"properties",Object.keys(P).length>0?P:void 0),"required",M.filter(_=>_!==W).length>0?M.filter(_=>_!==W):void 0))}),V.append(a(k(Z)?Z:{},j=>l(o(c,"properties",{...A,[W]:j})),u+1,[w],[s("label",{class:"wgd-sb-req",title:"required"},[E,"req"]),R]))}let J=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);J.addEventListener("click",()=>{let W="field";for(let Z=1;W in A;Z++)W=`field${Z}`;l(o(c,"properties",{...A,[W]:{type:"string"}}))}),V.append(s("div",{class:"wgd-toolbar"},[J])),y.push(V)}return g.value==="array"&&y.push(s("div",{class:"wgd-slot"},[a(k(c.items)?c.items:{},A=>l(o(c,"items",A)),u+1,[s("span",{class:"wgd-sb-label"},["items"])])])),s("div",{class:u===0?"wgd-sb-root":"wgd-sb-node"},y)}function f(){if(n===void 0){let l=s("button",{class:"wgd-button wgd-add",type:"button"},["+ add a data schema"]);l.addEventListener("click",()=>i({type:"object"})),r.replaceChildren(s("div",void 0,[s("span",{class:"wgd-sb-label"},["No schema \u2014 data is accepted leniently."]),s("div",{class:"wgd-toolbar"},[l])]));return}let c=s("button",{class:"wgd-button wgd-add wgd-remove",type:"button"},["remove schema"]);c.addEventListener("click",()=>i(void 0)),r.replaceChildren(a(n,l=>i(l),0),s("div",{class:"wgd-toolbar"},[c]))}return f(),{element:r,getValue:()=>n,setValue(c){r.contains(document.activeElement)||(n=c,f())}}}function yt(e,t,n){let r=e,i=s("div",{class:"wgd-record"});function o(c){r=Object.keys(c).length>0?c:void 0,n(r),f()}function a(c,l,u,p){let m=s("input",{type:"text",class:u,placeholder:l,spellcheck:"false"});return m.value=c,m.addEventListener("change",()=>p(m.value)),m}function f(){let c=r??{},l=Object.entries(c).map(([p,m])=>{let y=a(p,t.key,"wgd-input wgd-rec-key",v=>{let T=Object.entries(c).map(([x,N])=>x===p?[v,N]:[x,N]);o(Object.fromEntries(T))}),g=a(m,t.value,"wgd-input wgd-rec-value",v=>o({...c,[p]:v})),b=s("button",{class:"wgd-icon",type:"button",title:"Remove entry"},["\u2715"]);return b.addEventListener("click",()=>{let{[p]:v,...T}=c;o(T)}),s("div",{class:"wgd-rec-row"},[y,s("span",{class:"wgd-st-colon"},[":"]),g,b])}),u=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},[t.add]);u.addEventListener("click",()=>{let p="";for(let m=1;p in c;m++)p=`key${m}`;o({...c,[p]:""})}),i.replaceChildren(...l,s("div",{class:"wgd-toolbar"},[u]))}return f(),{element:i,getValue:()=>r,setValue(c){i.contains(document.activeElement)||(r=c,f())}}}function yr(e){let t=e.type;if(typeof t=="string")return t;if(Array.isArray(t)){let n=t.find(r=>typeof r=="string"&&r!=="null");if(typeof n=="string")return n;if(t.includes("null"))return"null"}}function bt(e){if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];switch(yr(e)){case"object":{let t={};if(k(e.properties)&&Array.isArray(e.required))for(let n of e.required)typeof n=="string"&&k(e.properties[n])&&(t[n]=bt(e.properties[n]));return t}case"array":return[];case"number":case"integer":return 0;case"boolean":return!1;case"null":return null;default:return""}}function Jt(e,t,n){let r=t??bt(e),i=s("div",{class:"wgd-schemaform"});function o(u,p,m,y=!1){if(p.length===0)return m;let[g,...b]=p;if(Array.isArray(u)){let T=[...u];return b.length===0&&y?T.splice(g,1):T[g]=o(T[g],b,m,y),T}let v=k(u)?{...u}:{};return b.length===0&&y?delete v[g]:v[g]=o(v[g],b,m,y),v}function a(u,p,m=!1){r=o(r,u,p),n(r),m&&l()}function f(u,p,m,y){if(Array.isArray(u.enum)){let g=s("select",{class:"wgd-select"});for(let b of u.enum)g.append(s("option",{value:JSON.stringify(b)},[JSON.stringify(b)]));return g.value=JSON.stringify(p??u.enum[0]),g.addEventListener("change",()=>a(m,JSON.parse(g.value))),c(y,g)}switch(yr(u)){case"boolean":{let g=s("input",{type:"checkbox"});return g.checked=p===!0,g.addEventListener("change",()=>a(m,g.checked)),c(y,g)}case"number":case"integer":{let g=s("input",{type:"number",class:"wgd-input"});return g.value=typeof p=="number"?String(p):"0",g.addEventListener("change",()=>{let b=Number(g.value);a(m,Number.isFinite(b)?b:0)}),c(y,g)}case"object":{let g=s("div",{class:"wgd-jt-children"}),b=k(u.properties)?u.properties:{},v=Array.isArray(u.required)?u.required:[],T=k(p)?p:{};for(let[x,N]of Object.entries(b)){if(!k(N))continue;let C=v.includes(x);g.append(f(N,T[x]??(C?bt(N):void 0),[...m,x],C?`${x} *`:x))}return s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[y]),g])}case"array":{let g=k(u.items)?u.items:{},b=Array.isArray(p)?p:[],v=s("div",{class:"wgd-jt-children"});b.forEach((x,N)=>{let C=s("div",{class:"wgd-jt-entry"},[f(g,x,[...m,N],`#${N}`)]),I=s("button",{class:"wgd-icon",type:"button",title:"Remove item"},["\u2715"]);I.addEventListener("click",()=>{r=o(r,[...m,N],void 0,!0),n(r),l()}),C.append(I),v.append(C)});let T=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);return T.addEventListener("click",()=>a([...m,b.length],bt(g),!0)),v.append(s("div",{class:"wgd-toolbar"},[T])),s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[y]),v])}default:{let g=s("input",{type:"text",class:"wgd-input"});return typeof u.pattern=="string"&&(g.setAttribute("placeholder",`pattern: ${u.pattern}`),g.setAttribute("title",`Must match ${u.pattern}`)),g.value=typeof p=="string"?p:p===void 0?"":String(p),g.addEventListener("change",()=>a(m,g.value)),c(y,g)}}}function c(u,p){return s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[u]),p])}function l(){i.replaceChildren(f(e,r,[],"data"))}return l(),{element:i,getValue:()=>r,setValue(u){i.contains(document.activeElement)||(r=u??bt(e),l())}}}function br(e,t){let n=e,r=s("div",{class:"wgd-styles"});function i(c){n=Object.keys(c).length>0?c:void 0,t(n),f()}function o(c,l,u,p){let m=s("input",{type:"text",class:u,placeholder:l,spellcheck:"false"});return m.value=c,m.addEventListener("change",()=>p(m.value)),m}function a(c,l,u){let p=o(c,".wg-selector","wgd-input wgd-st-selector",b=>{let v=Object.entries(u).map(([T,x])=>T===c?[b,x]:[T,x]);i(Object.fromEntries(v))}),m=s("button",{class:"wgd-icon",type:"button",title:"Add declaration"},["+"]);m.addEventListener("click",()=>{i({...u,[c]:{...l,"":""}})});let y=s("button",{class:"wgd-icon",type:"button",title:"Remove selector"},["\u2715"]);y.addEventListener("click",()=>{let{[c]:b,...v}=u;i(v)});let g=Object.entries(l).map(([b,v])=>{let T=o(b,"property","wgd-input wgd-st-prop",C=>{let I=Object.entries(l).map(([B,A])=>B===b?[C,A]:[B,A]);i({...u,[c]:Object.fromEntries(I)})}),x=o(v,"value (no url(...), no ;)","wgd-input wgd-st-value",C=>{i({...u,[c]:{...l,[b]:C}})}),N=s("button",{class:"wgd-icon",type:"button",title:"Remove declaration"},["\u2715"]);return N.addEventListener("click",()=>{let{[b]:C,...I}=l;i({...u,[c]:I})}),s("div",{class:"wgd-st-decl"},[T,s("span",{class:"wgd-st-colon"},[":"]),x,N])});return s("div",{class:"wgd-st-rule"},[s("div",{class:"wgd-st-row"},[p,s("span",{class:"wgd-node-icons"},[m,y])]),s("div",{class:"wgd-st-decls"},g)])}function f(){let c=n??{},l=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},["+ selector"]);l.addEventListener("click",()=>{let u=".wg-";for(let p=1;u in c;p++)u=`.wg-${p}`;i({...c,[u]:{}})}),r.replaceChildren(...Object.entries(c).map(([u,p])=>a(u,k(p)?p:{},c)),s("div",{class:"wgd-toolbar"},[l]))}return f(),{element:r,getValue:()=>n,setValue(c){r.contains(document.activeElement)||(n=c,f())}}}var vr=3;function fe(e){if(!k(e))return;let t=e.type;if(typeof t=="string")return t;if(Array.isArray(t)){let n=t.find(r=>typeof r=="string"&&r!=="null");if(typeof n=="string")return n}}function Kt(e,t,n,r=0){if(!(!k(e)||r>vr)&&!(fe(e)!=="object"||!k(e.properties)))for(let[i,o]of Object.entries(e.properties)){let a=t===""?i:`${t}.${i}`;n.push({path:a,schema:o}),Kt(o,a,n,r+1)}}function Ce(e){return k(e)&&fe(e)==="array"?e.items:e}function Ve(e,t){if(t===""||t===".")return e;let n=e;for(let r of t.split(".")){if(!k(n))return;if(fe(n)==="array"){if(!/^\d+$/.test(r))return;n=Ce(n);continue}if(!k(n.properties))return;n=n.properties[r]}return n}function Ui(e,t){if(e===void 0||t===void 0)return!1;let n=r=>r==="integer"?"number":r;return n(e)!==n(t)}function xr(e,t){let n=e,r=t;for(let a=0;a<vr&&!(fe(n)!=="array"||fe(r)!=="array");a++)n=Ce(n),r=Ce(r);let i=fe(n),o=fe(r);return Ui(i,o)?{source:i,target:o}:void 0}function st(e){let t=[];return Kt(e,"",t),t.map(n=>n.path)}var kr="__custom__";function Er(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function Tr(){return{kind:"http",method:"GET",url:"https://api.example.com/resource",input:{type:"object",properties:{}},output:{type:"object"}}}function qt(e){return"ref"in e&&typeof e.ref=="string"}function Ae(e,t,n,r=""){let i=s("input",{type:"text",class:t,placeholder:r});return i.value=e,i.addEventListener("change",()=>n(i.value)),i}function he(e){return s("span",{class:"wgd-field-label"},[e])}function vt(e){let t=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return t.addEventListener("click",e),t}function Gt(e,t,n,r,i="wgd-input wgd-rec-value"){if(t.length===0)return Ae(e,i,n,r);let o=s("select",{class:"wgd-select wgd-path"}),a=t.includes(e),f=a||e===""?t:[e,...t];o.append(s("option",{value:""},[r]));for(let l of f)o.append(s("option",{value:l},[l===e&&!a?`${l} (off-schema)`:l]));o.append(s("option",{value:kr},["custom\u2026"])),o.value=e,Se(o);let c=Ae(e,i,n,r);return c.hidden=!0,o.addEventListener("change",()=>{if(o.value===kr){c.hidden=!1,c.focus();return}c.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,c])}function Sr(e,t,n,r){let i=se(e??{}),o=[],a=s("div",{class:"wgd-record wgd-headers"}),f=G(void 0);function c(m){i=m,r(Object.keys(i).length>0?i:void 0),p()}function l(m){f.hidden=!1,f.textContent=`'${m}' is already used; pick another ${n.name} name.`}function u(m,y){let g=k(m),b=pe([{value:"literal"},{value:"secret"}],g?"secret":"literal","wgd-select wgd-attr-mode",v=>y(v==="secret"?{secret:t[0]??""}:""));if(g){let v=t.includes(m.secret)?t:[m.secret,...t],T=pe(v.map(x=>({value:x,label:x===""?"(pick a secret)":x})),m.secret,"wgd-select wgd-secret",x=>y({secret:x}));return[b,T]}return[b,Ae(m,"wgd-input wgd-rec-value",y,"value")]}function p(){a.replaceChildren(),f.hidden=!0;for(let[y,g]of Object.entries(i)){let b=Ae(y,"wgd-input wgd-rec-key",x=>{if(x===y)return;if(x===""||Object.hasOwn(i,x)){l(x||"(empty)");return}let N=Object.entries(i).map(([C,I])=>C===y?[x,I]:[C,I]);c(Object.fromEntries(N))},n.name),v=u(g,x=>c({...i,[y]:x})),T=vt(()=>{let{[y]:x,...N}=i;c(N)});a.append(s("div",{class:"wgd-rec-row"},[b,...v,T]))}o.forEach((y,g)=>{let b=Ae("","wgd-input wgd-rec-key",x=>{if(x!==""){if(Object.hasOwn(i,x)){l(x);return}o.splice(g,1),c({...i,[x]:y.value})}},n.name),v=u(y.value,x=>{y.value=x,p()}),T=vt(()=>{o.splice(g,1),p()});a.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[b,...v,T]))});let m=s("button",{class:"wgd-button wgd-add",type:"button"},[n.add]);m.addEventListener("click",()=>{o.push({value:""}),p()}),a.append(s("div",{class:"wgd-row"},[m]),f)}return p(),a}function zi(e,t){let n=se(e),r=s("div",{class:"wgd-record wgd-segments"});function i(a){n=a,t(n),o()}function o(){r.replaceChildren(),n.forEach((c,l)=>{let u=typeof c!="string",p=pe([{value:"text"},{value:"bind"}],u?"bind":"text","wgd-select wgd-attr-mode",g=>{let b=[...n];b[l]=g==="bind"?{bind:"."}:"",i(b)}),m=Ae(u?c.bind:c,"wgd-input wgd-rec-value",g=>{let b=[...n];b[l]=u?{bind:g}:g,i(b)},u?"data path":"text"),y=vt(()=>i(n.filter((g,b)=>b!==l)));r.append(s("div",{class:"wgd-rec-row"},[p,m,y]))});let a=s("button",{class:"wgd-button wgd-add",type:"button"},["+ text"]);a.addEventListener("click",()=>i([...n,""]));let f=s("button",{class:"wgd-button wgd-add",type:"button"},["+ bind"]);f.addEventListener("click",()=>i([...n,{bind:"."}])),r.append(s("div",{class:"wgd-row"},[a,f]))}return o(),r}function On(e,t,n){let r=se(e??Er()),i=s("div",{class:"wgd-action-head"}),o=s("div",{class:"wgd-action-schemas"}),a=s("div",{class:"wgd-action-maps"}),f=s("div",{class:"wgd-action-definition"},[i,o,a]);function c(){return r}function l(b,v){r=b,n(se(r)),v==="all"?g():v==="schemas"&&m()}function u(b,v){let T=ot(c()[v],C=>{l({...c(),[v]:C??{type:"object"}},"none")}),x=[he(b),T.element],N=t.schemas??[];if(N.length>0){let C=pe([{value:"",label:"copy a shared schema into this action\u2026"},...N.map(I=>({value:I.name}))],"","wgd-select",I=>{let B=N.find(A=>A.name===I);B&&l({...c(),[v]:se(B.schema)},"schemas")});x.push(s("div",{class:"wgd-row"},[C,he("(a copy \u2014 later edits to the shared schema do not follow)")]))}return s("div",{class:"wgd-action-schema"},x)}function p(){i.replaceChildren();let b=pe([{value:"prompt",label:"prompt \u2014 propose a message"},{value:"http",label:"http \u2014 call an API"}],r.kind,"wgd-select wgd-action-kind",x=>l(x==="http"?Tr():Er(),"all"));if(r.kind==="prompt"){i.append(s("div",{class:"wgd-row"},[he("Kind"),b]),he("Message (literals and bound values; the user reviews and sends it)"),zi(r.text,x=>l({kind:"prompt",text:x},"none")));return}let v=pe(pt.map(x=>({value:x})),r.method,"wgd-select",x=>l({...c(),method:x},"none")),T=Ae(r.url,"wgd-input wgd-action-url",x=>l({...c(),url:x},"none"),"https://\u2026");i.append(s("div",{class:"wgd-row"},[he("Kind"),b,he("Method"),v]),s("label",{class:"wgd-field"},[he("URL (https, fixed)"),T]))}function m(){o.replaceChildren(),r.kind==="http"&&o.append(u("Input schema (arguments; GET \u2192 query, POST \u2192 JSON body)","input"),u("Output schema (the response must satisfy it)","output"))}function y(){if(a.replaceChildren(),r.kind!=="http")return;let b=t.secretNames??[];a.append(he("Headers"),Sr(r.headers,b,{add:"+ header",name:"header"},v=>{let{headers:T,...x}=c();l(v===void 0?x:{...x,headers:v},"none")}),he("Fixed query parameters"),Sr(r.query,b,{add:"+ parameter",name:"parameter"},v=>{let{query:T,...x}=c();l(v===void 0?x:{...x,query:v},"none")}))}function g(){p(),m(),y()}return g(),{element:f,getValue:()=>se(r),setValue(b){r=se(b),g()}}}function Yt(e,t,n){let r=e===void 0?void 0:se(e),i=s("div",{class:"wgd-binding-head"}),o=s("div",{class:"wgd-binding-input"}),a=s("div",{class:"wgd-binding-output"}),f=s("div",{class:"wgd-binding"},[i,o,a]);function c(N){if(N!==void 0)return qt(N)?(t.actions??[]).find(C=>C.name===N.ref)?.definition:N.definition}let l=()=>se(r?.input??{}),u=()=>se(r?.output??{});function p(N,C){r=N,n(N===void 0?void 0:se(N)),C==="all"?x():C==="io"?(b(),v()):C==="input"?b():C==="output"&&v()}function m(N,C,I){return{...qt(N)?{ref:N.ref}:{definition:N.definition},...C!==void 0&&Object.keys(C).length>0?{input:C}:{},...I!==void 0&&Object.keys(I).length>0?{output:I}:{}}}function y(){return["$index","$parent","$root",...st(t.getDataSchema?.()).map(C=>`$root.${C}`)]}function g(){i.replaceChildren();let N=(t.actions??[]).filter(A=>!t.loadOnly||A.definition.kind==="http"&&A.definition.method==="GET"),C=r===void 0?"none":qt(r)?"shared":"inline",I=pe([{value:"none",label:t.loadOnly?"no load action":"no action"},{value:"shared",label:"shared action"},{value:"inline",label:"inline definition"}],C,"wgd-select wgd-binding-mode",A=>{p(A==="none"?void 0:A==="shared"?{ref:N[0]?.name??""}:{definition:Tr()},"all")});if(i.append(s("div",{class:"wgd-row"},[I])),r===void 0)return;if(qt(r)){let A=r.ref,M=N.map(W=>W.name),V=(M.includes(A)?M:[A,...M]).map(W=>({value:W,label:W===""?"(pick an action)":M.includes(W)?W:`${W} (unknown)`})),J=pe(V,A,"wgd-select wgd-binding-ref",W=>p(m({ref:W},l(),u()),"io"));i.append(s("div",{class:"wgd-row"},[he("Action"),J]));return}let B=On(r.definition,t,A=>{p(m({definition:A},l(),u()),"io")});i.append(B.element)}function b(){o.replaceChildren();let N=c(r);if(r===void 0||N?.kind!=="http")return;let C=r,I=k(N.input.properties)?Object.keys(N.input.properties):[],B=t.scopePaths??st(t.getDataSchema?.()),A=[...new Set([...B,...y()])],M=l(),V=I.map(J=>{let W=M[J],Z=k(W)&&"const"in W,w=pe([{value:"path"},{value:"const"}],Z?"const":"path","wgd-select wgd-attr-mode",j=>{p(m(C,{...l(),[J]:j==="const"?{const:""}:J},u()),"input")}),E=j=>{let P=l();if(Z){let _;try{_=JSON.parse(j)}catch{_=j}P[J]={const:_}}else j===""?delete P[J]:P[J]=j;p(m(C,P,u()),"none")},R=Z?Ae(JSON.stringify(W.const),"wgd-input wgd-rec-value",E,"JSON literal"):Gt(typeof W=="string"?W:"",A,E,"data path");return s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-rec-key wgd-binding-field"},[J]),w,R])});o.append(he("Input mapping (field \u2190 data path or constant)"),I.length>0?s("div",{class:"wgd-record"},V):s("div",{class:"wgd-diagnostic"},["The input schema declares no properties."]))}function v(){a.replaceChildren();let N=c(r);if(r===void 0||N?.kind!=="http")return;let C=r,I=u(),B=I.mode??"merge",A=pe(ut.map(V=>({value:V})),B,"wgd-select",V=>{let J={...u(),mode:V};V!=="patch"&&delete J.path,p(m(C,l(),J),"output")}),M=[he("Output"),A];B==="patch"&&M.push(Ae(I.path??"","wgd-input",V=>{p(m(C,l(),{...u(),path:V}),"output")},"data path to write at")),a.append(s("div",{class:"wgd-row"},M)),a.append(T(N,I,V=>{let J=u();V===void 0?delete J.map:J.map=V,p(m(C,l(),J),"none")}))}function T(N,C,I){let B=s("div",{class:"wgd-record wgd-output-map"}),A=se(C.map??{}),M=[],V=t.getDataSchema?.(),J=C.mode??"merge",W=J==="patch"&&C.path?C.path:"",Z=W===""?V:Ve(V,W),w=Ce(Z),E=[".",...st(w)],R=()=>A["."]===void 0?N.output:Ve(N.output,A["."]),j=()=>fe(R())==="array",P=()=>Ce(R()),_=[".",...st(N.output)],S=G(void 0);S.classList.add("wgd-type-mismatch");function $(L){A=L,I(Object.keys(A).length>0?A:void 0),D()}function d(L){S.hidden=!1,S.textContent=L}function h(L,F){let U=Gt(L,E,F,"target data path","wgd-input wgd-rec-key");return U.classList.add("wgd-map-target"),U}function D(){B.replaceChildren();let L=[],F=Object.keys(A).filter(H=>H!==".");j()&&J==="merge"&&F.length>0&&L.push("a list projects per item \u2014 use replace or patch; merge needs an object.");let U=[".",...st(P())];for(let[H,q]of Object.entries(A)){let Q=H==="."?_:U,ee=H==="."?void 0:xr(Ve(P(),q),Ve(w,H));ee&&L.push(`'${q}' is ${ee.source} in the response but '${W?`${W}.`:""}${H}' is ${ee.target} in the widget schema`);let le=h(H,be=>{if(be===H)return;if(be===""||Object.hasOwn(A,be)){d(`'${be||"(empty)"}' is already a projection target.`);return}let we=Object.entries(A).map(([at,St])=>at===H?[be,St]:[at,St]);$(Object.fromEntries(we))}),ae=Gt(q,Q,be=>$({...A,[H]:be}),"response path");ae.classList.add("wgd-map-source");let me=vt(()=>{let{[H]:be,...we}=A;$(we)});B.append(s("div",{class:"wgd-rec-row"},[le,s("span",{class:"wgd-st-colon"},["\u2190"]),ae,me]))}M.forEach((H,q)=>{let Q=h("",ae=>{if(ae!==""){if(Object.hasOwn(A,ae)){d(`'${ae}' is already a projection target.`);return}M.splice(q,1),$({...A,[ae]:H.source})}}),ee=Gt(H.source,U,ae=>{H.source=ae,D()},"response path");ee.classList.add("wgd-map-source");let le=vt(()=>{M.splice(q,1),D()});B.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[Q,s("span",{class:"wgd-st-colon"},["\u2190"]),ee,le]))});let te=s("button",{class:"wgd-button wgd-add",type:"button"},["+ projection"]);te.addEventListener("click",()=>{M.push({source:""}),D()}),S.hidden=L.length===0,S.textContent=L.length===0?"":`Type mismatch: ${L.join("; ")}.`,B.append(s("div",{class:"wgd-row"},[te]),S)}return D(),B}function x(){g(),b(),v()}return x(),{element:f,setValue(N){r=N===void 0?void 0:se(N),x()}}}function $e(e,t=[]){let n=e.descriptor?.dataSchemaRef;if(typeof n=="string")return t.find(i=>i.name===n)?.schema;let r=e.descriptor?.dataSchema;return k(r)?r:void 0}var Vi=new Set(Ee().kinds());function Ji(e){if(!k(e))return[];let t=[];for(let[n,r]of Object.entries(e)){if(We({[n]:{color:"red"}})===""){t.push({selector:n,message:"Selector would be skipped \u2014 every comma-separated part must target a .wg- class and avoid ;{}<>@\\."});continue}if(!k(r)){t.push({selector:n,message:"Declarations must be a property \u2192 value map."});continue}for(let[i,o]of Object.entries(r))(typeof o!="string"||We({".wg-probe":{[i]:o}})==="")&&t.push({selector:n,property:i,message:"Declaration would be skipped \u2014 unsafe property name or value (no url(), expression(), or ;{}<>@\\)."})}return t}function Xt(e,t={}){let n={styles:[],previewable:!1};typeof e.kind!="string"||e.kind.trim().length===0?n.kind="Kind must be a non-empty id.":Vi.has(e.kind)&&(n.kind=`'${e.kind}' is a built-in kind \u2014 pick a distinct id.`);let r=Oe(e.template);if(!r.ok){let a={code:r.error.code,message:r.error.message},f=r.error.path;typeof f=="string"&&(a.path=f),n.template=a}let i=e.descriptor?.dataSchemaRef;typeof i=="string"&&(e.descriptor?.dataSchema!==void 0?n.schemaRef="A descriptor carries 'dataSchema' OR 'dataSchemaRef', never both.":(t.schemas??[]).every(a=>a.name!==i)&&(n.schemaRef=`References unknown schema '${i}' \u2014 it is not among the supplied shared schemas.`));let o=$e(e,t.schemas??[]);if(k(o)){if(e.descriptor.dataExample!==void 0){let a=De(o,e.descriptor.dataExample);a&&(n.example=a)}if(e.sampleData!==void 0){let a=De(o,e.sampleData);a&&(n.sample=a)}}if(n.styles=Ji(e.descriptor?.styles),e.load!==void 0){let a=gt(e.load,"load",{isPath:f=>ke(f)!==void 0});a&&(n.load=`${a.message} (at ${a.path})`)}if(t.actions!==void 0){let a=new Set(t.actions.map(c=>c.name)),f=ht(e.template,e.load).filter(c=>!a.has(c));f.length>0&&(n.actionRefs=`References unknown shared action${f.length===1?"":"s"} ${f.map(c=>`'${c}'`).join(", ")} \u2014 bound elements will render disabled.`)}if(e.theme!==void 0){let a=Be(e.theme);a.ok||(n.theme=a.error)}return n.previewable=n.kind===void 0&&n.template===void 0,n}function Ar(e,t){if(fe(e)==="array")return["."];let n=[];Kt(e,"",n);let r=new Set(["string","number","integer","boolean","null",void 0]),o=n.filter(({schema:a})=>{let f=fe(a);return t==="each"?f==="array":t==="bind"?r.has(f):!0}).map(a=>a.path);return t!=="each"&&r.has(fe(e))&&o.unshift("."),o}function Ki(e,t){let n=Ve(e,t);return fe(n)==="array"?Ce(n):void 0}var Qt=Symbol("remove");function Nn(e){let t="";for(let n of e){let r=typeof n=="number"?`children.${n}`:n;t=t===""?r:`${t}.${r}`}return t}function en(e,t,n){if(t.length===0)return n===Qt?void 0:n;let[r,...i]=t;if(typeof r=="number"){if(!k(e)||!Array.isArray(e.children))return e;let o=[...e.children];return i.length===0&&n===Qt?o.splice(r,1):o[r]=en(o[r],i,n),{...e,children:o}}if(!k(e))return e;if(i.length===0&&n===Qt){let{[r]:o,...a}=e;return a}return{...e,[r]:en(e[r],i,n)}}function Dr(e,t,n,r){let i=t.length===0?e:qi(e,t);if(!k(i)||!Array.isArray(i.children))return e;let o=[...i.children];if(n<0||r<0||n>=o.length||r>=o.length)return e;let[a,f]=[o[n],o[r]];o[n]=f,o[r]=a;let c={...i,children:o};return t.length===0?c:en(e,t,c)}function qi(e,t){let n=e;for(let r of t){if(!k(n))return;n=typeof r=="number"?Array.isArray(n.children)?n.children[r]:void 0:n[r]}return n}var Zt={text:()=>"text",bind:()=>({bind:"."}),element:()=>({tag:"div",children:[]}),each:()=>({each:".",template:"item"}),when:()=>({when:".",template:"shown"})};function Or(e,t,n={}){let r=n.actionContext??{actions:[],secretNames:[],schemas:[]},i=new Set,o=s("div",{class:"wgd-tree"}),a=G(void 0),f=s("textarea",{class:"wgd-textarea wgd-template-json",rows:"14",spellcheck:"false"}),c=s("div",void 0,[f,a]);ce(f),c.hidden=!0;let l=s("button",{class:"wgd-button",type:"button"},["Tree"]),u=s("button",{class:"wgd-button",type:"button"},["JSON"]);l.addEventListener("click",()=>{o.hidden=!1,c.hidden=!0}),u.addEventListener("click",()=>{o.hidden=!0,c.hidden=!1});let p=G(void 0),m=s("details",{class:"wgd-section",open:""},[s("summary",{class:"wgd-section-title"},["Template"]),s("div",{class:"wgd-section-body"},[s("div",{class:"wgd-row"},[l,u]),p,o,c])]);function y(w){e.update(E=>({...E,template:w}))}function g(w,E){y(en(e.get().template,w,E))}f.addEventListener("input",()=>{try{let w=JSON.parse(f.value);a.hidden=!0,a.textContent="",y(w)}catch(w){a.hidden=!1,a.textContent=`Invalid JSON (template keeps the last valid value): ${String(de(w))}`}});function b(w,E,R="wgd-input wgd-node-value"){let j=s("input",{type:"text",class:R});return j.value=w,j.addEventListener("change",()=>E(j.value)),j}function v(w,E){let R=w!==void 0&&Qe(w.type)?w:void 0,j=pe([{value:"none",label:"raw"},...Ze.map(S=>({value:S}))],R===void 0?"none":R.type,"wgd-select wgd-format-type",S=>{E(S==="number"?{type:"number",decimals:2}:S==="currency"?{type:"currency",currency:"USD",decimals:2}:S==="date"?{type:"date",pattern:"yyyy-MM-dd"}:void 0)},"Present the bound value as a number, a currency amount or a date");if(R===void 0)return[j];let P=()=>{let S=b(R.decimals===void 0?"":String(R.decimals),$=>{let{decimals:d,...h}=R,D=Number($);E($===""?h:{...h,decimals:Number.isFinite(D)?D:$})},"wgd-input wgd-format-decimals");return S.placeholder="dec",S.title=`Decimal places (${_e}-${Ie})`,S};if(R.type==="currency"){let S=b(typeof R.currency=="string"?R.currency:"",d=>E({...R,currency:d.toUpperCase()}),"wgd-input wgd-format-currency");S.placeholder="CUR",S.title="ISO-4217 currency code, e.g. COP";let $=pe(Me.map(d=>({value:d})),et(R.currencyDisplay)?R.currencyDisplay:Me[0],"wgd-select wgd-format-display",d=>E({...R,currencyDisplay:d}),"How the currency names itself");return[j,S,P(),$]}if(R.type==="number")return[j,P()];let _=b(typeof R.pattern=="string"?R.pattern:"",S=>E({...R,pattern:S}),"wgd-input wgd-format-pattern");return _.placeholder="pattern",_.title=`Date pattern from ${tt.join(" ")} plus separators, e.g. dd-MM-yyyy HH:mm`,[j,_]}let T=new Set;function x(w,E,R,j,P,_,S,$){let d=Nn(E),h=j.length>0,D=h&&T.has(d),L;h?(L=s("button",{class:"wgd-chevron",type:"button",title:D?"Expand":"Collapse"},[D?"\u25B8":"\u25BE"]),L.addEventListener("click",()=>{D?T.delete(d):T.add(d),W()})):L=s("span",{class:"wgd-chevron wgd-chevron-none"});let F=w===void 0?[L,...R]:[L,s("span",{class:"wgd-node-badge"},[w]),...R];D&&$?.summary!==void 0&&F.push(s("span",{class:"wgd-node-summary"},[$.summary]));let U=[...$?.icons??[]];if(S&&S.count>1){if(S.index>0){let H=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);H.addEventListener("click",()=>y(Dr(e.get().template,S.parent,S.index,S.index-1))),U.push(H)}if(S.index<S.count-1){let H=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);H.addEventListener("click",()=>y(Dr(e.get().template,S.parent,S.index,S.index+1))),U.push(H)}}if(_){let H=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);H.addEventListener("click",()=>E.length===0?y(""):g(E,Qt)),U.push(H)}U.length>0&&F.push(s("span",{class:"wgd-node-icons"},U));let te=[s("div",{class:"wgd-node-row"},F)];return P!==void 0&&te.push(G(P)),D||te.push(...j),s("div",{class:"wgd-node","data-path":d},te)}let N=["div","span","p","section","article","header","footer","h1","h2","h3","h4","strong","em","small","code","pre","ul","ol","li","dl","dt","dd","table","thead","tbody","tr","th","td","img","a","figure","figcaption","hr","br","label"];function C(w,E,R,j,P="wgd-input wgd-node-value"){let _=k(E)?Ar(E,R):[];if(_.length===0)return b(w,j,P);let S=s("select",{class:"wgd-select wgd-path"}),$=_.includes(w);for(let D of $?_:[w,..._])S.append(s("option",{value:D},[D===w&&!$?`${D} (off-schema)`:D]));S.append(s("option",{value:"__custom__"},["custom\u2026"])),S.value=w,Se(S);let d=b(w,j,P);d.hidden=!0,S.addEventListener("change",()=>{if(S.value==="__custom__"){d.hidden=!1,d.focus();return}d.hidden=!0,j(S.value)});let h=P.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${h}`},[S,d])}function I(w,E){let R=s("select",{class:"wgd-select wgd-tag"}),j=N.includes(w)?N:[w,...N];for(let _ of j)R.append(s("option",{value:_},[_]));R.append(s("option",{value:"__custom__"},["custom\u2026"])),R.value=w,Se(R);let P=b(w,E,"wgd-input wgd-tag-custom");return P.hidden=!0,R.addEventListener("change",()=>{if(R.value==="__custom__"){P.hidden=!1,P.focus();return}P.hidden=!0,E(R.value)}),s("span",{class:"wgd-tagwrap"},[R,P])}function B(w,E,R,j,P,_,S){let $=[...E,R];if(j===void 0){let d=En(`+ ${w}`,`Set '${w}' to a node`,Object.keys(Zt),h=>{let D=Zt[h];D&&g($,D())});return P?s("div",{class:"wgd-slot"},[G(`Missing required '${w}'.`),d]):s("div",{class:"wgd-slot wgd-slot-unset"},[d])}return s("div",{class:"wgd-slot"},[s("span",{class:"wgd-slot-label"},[w]),A(j,$,_,!P,void 0,S)])}function A(w,E,R,j=!0,P,_){let S=Nn(E),$=R!==void 0&&(R===S||(R.startsWith(S===""?"attrs.":`${S}.attrs.`)||R.startsWith(S===""?"action":`${S}.action`))&&k(w)&&typeof w.tag=="string")?M:void 0;if(typeof w=="string")return x("text",E,[b(w,d=>g(E,d))],[],$,j,P);if(!k(w))return x("invalid",E,[s("code",void 0,[JSON.stringify(w)])],[],$??"Not a template node.",j,P);if(typeof w.bind=="string"){let d=w.bind,h=mt(w),D=k(w.format)?w.format:void 0,L=k(w.map)?w.map:void 0,F=q=>({bind:d,...q}),U=[C(d,_,"bind",q=>g(E,{...w,bind:q}))];(h===void 0||h==="format")&&U.push(...v(D,q=>g(E,q===void 0?{bind:d}:F({format:q}))));let te=[];if(h===void 0){let q=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored labels (e.g. status \u2192 text)"},["map"]);q.addEventListener("click",()=>g(E,F({map:{}}))),te.push(q)}let H=[];if(h==="map"){let q=yt(L,{key:"data value",value:"authored label",add:"+ mapping"},ee=>g(E,ee===void 0?{bind:d}:F({map:ee,...typeof w.default=="string"?{default:w.default}:{}}))),Q=b(typeof w.default=="string"?w.default:"",ee=>g(E,F({map:L??{},...ee===""?{}:{default:ee}})),"wgd-input wgd-attr-map-default");Q.placeholder="default (on miss)",H.push(s("div",{class:"wgd-attr-map"},[q.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),Q])]))}return x("bind",E,U,H,$,j,P,te.length>0?{icons:te}:void 0)}if(typeof w.each=="string")return x("each",E,[C(w.each,_,"each",d=>g(E,{...w,each:d}))],[B("template",E,"template",w.template,!0,R,Ki(_,w.each)),B("empty",E,"empty",w.empty,!1,R,_)],$,j,P,{summary:w.empty!==void 0?"template \xB7 empty":"template"});if(typeof w.when=="string")return x("when",E,[C(w.when,_,"when",d=>g(E,{...w,when:d}))],[B("template",E,"template",w.template,!0,R,_),B("else",E,"else",w.else,!1,R,_)],$,j,P,{summary:w.else!==void 0?"template \xB7 else":"template"});if(typeof w.tag=="string"){let d=k(w.attrs)?w.attrs:{},h=k(w.action)?w.action:void 0,D=Object.entries(d).map(([H,q])=>{let Q=k(q)&&typeof q.bind=="string"?q:{bind:""},ee=k(q)&&typeof q.bind=="string",le=ee?Q:void 0,ae=Y=>{let ue={bind:Y.bind};return Y.map!==void 0?(ue.map=Y.map,Y.default!==void 0&&Y.default!==""&&(ue.default=Y.default)):Y.prefix!==void 0&&Y.prefix!==""?ue.prefix=Y.prefix:Y.format!==void 0&&(ue.format=Y.format),ue},me=Y=>{g(E,{...w,attrs:{...d,[H]:Y}})},be=b(H,Y=>{let ue=Object.entries(d).map(([je,Pn])=>je===H?[Y,Pn]:[je,Pn]);g(E,{...w,attrs:Object.fromEntries(ue)})},"wgd-input wgd-attr-name"),we=s("select",{class:"wgd-select wgd-attr-mode"});we.append(s("option",{value:"literal"},["literal"])),we.append(s("option",{value:"bind"},["bind"])),we.value=ee?"bind":"literal",Se(we);let at=b(String(ee?"":q),Y=>me(Y),"wgd-input wgd-attr-value"),St=ee?C(Q.bind,_,"bind",Y=>me(ae({...Q,bind:Y})),"wgd-input wgd-attr-value"):at;we.addEventListener("change",()=>{let Y=ee?Q.bind:at.value;me(we.value==="bind"?{bind:Y||"."}:Y)});let on=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);on.addEventListener("click",()=>{let{[H]:Y,...ue}=d;g(E,{...w,attrs:ue})});let dt=[be,we,St],Ke=le===void 0?void 0:mt(le),Ur=k(le?.format)?le.format:void 0,zr=ee&&(Ke===void 0||Ke==="format"),Vr=ee&&(Ke===void 0||Ke==="prefix"),Jr=ee&&Ke===void 0;if(zr&&dt.push(...v(Ur,Y=>me(ae({...Q,format:Y})))),Vr){let Y=b(le?.prefix??"",ue=>me(ae({...Q,prefix:ue})),"wgd-input wgd-attr-prefix");Y.placeholder="prefix",Y.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",dt.push(Y)}if(Jr){let Y=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);Y.addEventListener("click",()=>me(ae({...Q,map:{}}))),dt.push(s("span",{class:"wgd-node-icons"},[Y,on]))}else dt.push(on);let jn=s("div",{class:"wgd-attr-row"},dt),sn=[jn];if(ee&&Ke==="map"){let Y=yt(Q.map,{key:"data value",value:"authored literal",add:"+ mapping"},je=>{me(je===void 0?{bind:Q.bind}:ae({...Q,map:je}))}),ue=b(Q.default??"",je=>me(ae({...Q,default:je})),"wgd-input wgd-attr-map-default");ue.placeholder="default (on miss)",sn.push(s("div",{class:"wgd-attr-map"},[Y.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),ue])]))}return sn.length===1?jn:s("div",{class:"wgd-attr"},sn)}),L=Array.isArray(w.children)?w.children:[],F=En("+","Add attribute or child node",["attribute",...h===void 0&&(w.tag==="button"||w.tag==="a")?["action"]:[],...Object.keys(Zt)],H=>{T.delete(Nn(E));let q=Zt[H];if(H==="attribute")g(E,{...w,attrs:{...d,"":""}});else if(H==="action"){let Q=r.actions[0];g(E,{...w,action:Q!==void 0?{ref:Q.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else q&&g([...E,L.length],q())}),U=[];if(D.length>0&&U.push(s("div",{class:"wgd-attrs"},D)),h!==void 0){let H=k(_)?Ar(_,"when"):[],q=Yt(h,{...r,scopePaths:H,getDataSchema:()=>$e(e.get(),r.schemas)},le=>{if(le===void 0){let{action:ae,...me}=w;g(E,me)}else g(E,{...w,action:le})}),Q=[s("span",{class:"wgd-slot-label"},["action"]),q.element],ee="ref"in h&&typeof h.ref=="string"?h.ref:void 0;ee!==void 0&&i.has(ee)&&Q.push(G(`Unknown shared action '${ee}' \u2014 this element renders disabled.`)),U.push(s("div",{class:"wgd-attrs wgd-node-action"},Q))}L.length>0&&U.push(s("div",{class:"wgd-children"},L.map((H,q)=>A(H,[...E,q],R,!0,{parent:E,index:q,count:L.length},_))));let te=[];return D.length>0&&te.push(`${D.length} attr${D.length===1?"":"s"}`),h!==void 0&&te.push("action"),L.length>0&&te.push(`${L.length} ${L.length===1?"child":"children"}`),x(void 0,E,[I(w.tag,H=>g(E,{...w,tag:H}))],U,$,j,P,{icons:[F],summary:te.join(" \xB7 ")})}return x("unknown",E,[s("code",void 0,[JSON.stringify(w)])],[],$??"Unknown template node form.",j,P)}let M,V,J;function W(){V!==void 0&&o.replaceChildren(A(V.template,[],J,!0,void 0,$e(V,r.schemas)))}function Z(w,E){M=E.template?`${E.template.code}: ${E.template.message}`:void 0,V=w,J=E.template?.path;let R=new Set(r.actions.map(P=>P.name));i=new Set(ht(w.template,w.load).filter(P=>!R.has(P)));let j=E.template?`${E.template.code}: ${E.template.message}`+(E.template.path!==void 0&&E.template.path!==""?` (at ${E.template.path})`:""):E.actionRefs;p.hidden=j===void 0,p.textContent=j??"",(!o.hidden||o.childNodes.length===0)&&W(),document.activeElement!==f&&(f.value=JSON.stringify(w.template,null,2),ge(f))}return t.push(()=>{}),{element:m,refresh:Z,dispose:()=>m.remove()}}function Nr(e,t,n=[]){let r=G(void 0),i=s("select",{class:"wgd-select wgd-theme-select"});i.append(s("option",{value:""},["(none \u2014 defaults)"]));for(let l of n)i.append(s("option",{value:l.name},[l.label??l.name]));i.addEventListener("change",()=>{let l=n.find(u=>u.name===i.value);e.update(u=>{if(l===void 0){let{theme:p,...m}=u;return m}return{...u,theme:l.tokens}})});let o=s("div",{class:"wgd-token-ref"});function a(l){o.replaceChildren();for(let[u,p]of Object.entries(ve)){let m=l?.[u]??p.default,y=s("div",{class:"wgd-token-ref-row",title:p.use},[p.type==="color"?s("span",{class:"wgd-token-ref-swatch",style:`background: ${m}`}):s("span",{class:"wgd-token-ref-swatch wgd-token-ref-noswatch"}),s("code",{class:"wgd-token-ref-name"},[`--wg-${u}`]),s("span",{class:"wgd-token-ref-value"},[m])]);o.append(y)}for(let[u,p]of Object.entries(l??{})){if(!u.startsWith("x-"))continue;let m=s("div",{class:"wgd-token-ref-row",title:"Custom variable"},[s("span",{class:"wgd-token-ref-swatch wgd-token-ref-noswatch"}),s("code",{class:"wgd-token-ref-name"},[`--wg-${u}`]),s("span",{class:"wgd-token-ref-value"},[p])]);o.append(m)}}a(e.get().theme),t.push(l=>{if(l.theme===void 0)i.value="";else{let u=n.find(p=>JSON.stringify(p.tokens)===JSON.stringify(l.theme));i.value=u?.name??""}a(l.theme)});let f=[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview theme"]),i]),s("span",{class:"wgd-field-label"},[n.length===0?"No themes supplied by the host \u2014 design themes in the theme designer.":"Themes come from the host; edit them in the theme designer."]),r,s("details",{class:"wgd-token-ref-details"},[s("summary",{class:"wgd-field-label"},["Theme tokens (reference for styles)"]),o])],c=X("Preview",f);return{element:c,setDiagnostic(l){r.hidden=l===void 0,r.textContent=l??""},dispose:()=>c.remove()}}function xt(e){let t=e.map((n,r)=>{let i=s("button",{class:`wgd-button wgd-tab${r===0?" wgd-tab-active":""}`,type:"button"},[n.label]);return i.addEventListener("click",()=>{e.forEach((o,a)=>{o.element.hidden=a!==r,t[a]?.classList.toggle("wgd-tab-active",a===r)})}),n.element.hidden=r!==0,i});return s("div",{class:"wgd-tabs"},[s("div",{class:"wgd-row"},t),...e.map(n=>n.element)])}function kt(e,t,n,r,i,o,a=6){let f=G(void 0),c=t(i.get()),l=Vt(e,c===void 0?"":JSON.stringify(c,null,2),p=>{if(p.trim()===""){f.hidden=!0,r&&i.update(m=>r(m));return}try{let m=JSON.parse(p);f.hidden=!0,f.textContent="",i.update(y=>n(y,m))}catch(m){f.hidden=!1,f.textContent=`Invalid JSON (draft keeps the last valid value): ${String(de(m))}`}},a),u=ye(l,"textarea");return ce(u),o.push(p=>{if(document.activeElement===u)return;let m=t(p);u.value=m===void 0?"":JSON.stringify(m,null,2),ge(u)}),s("div",void 0,[l,f])}function Rr(e,t,n=[],r=[],i={actions:[],secretNames:[],schemas:[]}){let o=[],a=[];function f(d,h,D){let L=Ne(d,h(e.get()),U=>e.update(te=>D(te,U))),F=ye(L,"input");return o.push(U=>{document.activeElement!==F&&(F.value=h(U))}),L}let c=G(void 0),l=yt(e.get().descriptor.hints,{key:"hint name",value:"what the hint does",add:"+ hint"},d=>e.update(h=>{if(d===void 0){let{hints:D,...L}=h.descriptor;return{...h,descriptor:L}}return{...h,descriptor:{...h.descriptor,hints:d}}}));o.push(d=>l.setValue(d.descriptor.hints));let u=X("General",[f("Kind (id)",d=>d.kind,(d,h)=>({...d,kind:h})),c,f("Description",d=>d.descriptor.description??"",(d,h)=>({...d,descriptor:{...d.descriptor,description:h}})),f("Data shape (prose)",d=>d.descriptor.dataShape??"",(d,h)=>({...d,descriptor:{...d.descriptor,dataShape:h}})),s("div",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},["Hints"]),xt([{label:"Tree",element:l.element},{label:"JSON",element:kt("",d=>d.descriptor.hints,(d,h)=>{if(!k(h))return d;let D=Object.fromEntries(Object.entries(h).map(([L,F])=>[L,String(F)]));return{...d,descriptor:{...d.descriptor,hints:D}}},d=>{let{hints:h,...D}=d.descriptor;return{...d,descriptor:D}},e,o,3)}])])]),p=ot(e.get().descriptor.dataSchema,d=>e.update(h=>{if(d===void 0){let{dataSchema:D,...L}=h.descriptor;return{...h,descriptor:L}}return{...h,descriptor:{...h.descriptor,dataSchema:d}}}));o.push(d=>p.setValue(d.descriptor.dataSchema));let m=xt([{label:"Builder",element:p.element},{label:"JSON",element:kt("dataSchema (JSON-Schema subset: type/properties/required/items/enum/pattern)",d=>d.descriptor.dataSchema,(d,h)=>k(h)?{...d,descriptor:{...d.descriptor,dataSchema:h}}:d,d=>{let{dataSchema:h,...D}=d.descriptor;return{...d,descriptor:D}},e,o)}]),y=s("select",{class:"wgd-select wgd-schema-mode"});y.append(s("option",{value:"inline"},["define inline"]));let g=s("option",{value:"shared"},["use shared"]);r.length===0&&(g.disabled=!0),y.append(g);let b=s("select",{class:"wgd-select wgd-schema-ref"});for(let d of r)b.append(s("option",{value:d.name},[d.label??d.name]));b.addEventListener("change",()=>{e.update(d=>({...d,descriptor:{...d.descriptor,dataSchemaRef:b.value}}))});let v=s("textarea",{class:"wgd-textarea wgd-schema-shared",rows:"10",readonly:"",spellcheck:"false"}),T=G(void 0),x=s("div",void 0,[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Shared schema"]),b]),v,s("span",{class:"wgd-field-label"},["Read-only here \u2014 edit shared schemas in the Data schemas section."])]);y.addEventListener("change",()=>{if(y.value==="shared"){let d=e.get().descriptor.dataSchemaRef??r[0]?.name??"";e.update(h=>{let{dataSchema:D,...L}=h.descriptor;return{...h,descriptor:{...L,dataSchemaRef:d}}})}else{let d=$e(e.get(),r);e.update(h=>{let{dataSchemaRef:D,...L}=h.descriptor;return{...h,descriptor:{...L,dataSchema:d??{type:"object"}}}})}});function N(d){let h=d.descriptor.dataSchemaRef,D=typeof h=="string";if(y.value=D?"shared":"inline",m.hidden=D,x.hidden=!D,D){b.value!==h&&(b.value=h);let L=r.find(F=>F.name===h)?.schema;v.value=L===void 0?"":JSON.stringify(L,null,2),ge(v)}}o.push(N),N(e.get());let C=X("Data schema",[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Source"]),y]),T,m,x],!1);ce(v);function I(d,h){let D=s("div"),L="",F;function U(te){let H=$e(te,r),q=H===void 0?"":JSON.stringify(H);if(F!==void 0&&q===L){F.setValue(d(te));return}L=q;let Q=ee=>e.update(le=>h(le,ee));F=H!==void 0&&k(H)?Jt(H,d(te),Q):mr(d(te),Q),D.replaceChildren(F.element)}return U(e.get()),o.push(U),D}let B=G(void 0),A=X("Sample data",[s("span",{class:"wgd-field-label"},["dataExample \u2014 ships with the widget as the example agents imitate"]),xt([{label:"Edit",element:I(d=>d.descriptor.dataExample,(d,h)=>({...d,descriptor:{...d.descriptor,dataExample:h}}))},{label:"JSON",element:kt("dataExample (JSON)",d=>d.descriptor.dataExample,(d,h)=>({...d,descriptor:{...d.descriptor,dataExample:h}}),d=>{let{dataExample:h,...D}=d.descriptor;return{...d,descriptor:D}},e,o)}]),B],!1),M=G(void 0),V=X("Data for preview",[s("span",{class:"wgd-field-label"},["Overrides dataExample in the preview only (not exported)"]),xt([{label:"Edit",element:I(d=>d.sampleData,(d,h)=>({...d,sampleData:h}))},{label:"JSON",element:kt("Preview data (JSON)",d=>d.sampleData,(d,h)=>({...d,sampleData:h}),d=>{let{sampleData:h,...D}=d;return D},e,o,4)}]),M],!1),J=s("div"),W=br(e.get().descriptor.styles,d=>e.update(h=>{if(d===void 0){let{styles:D,...L}=h.descriptor;return{...h,descriptor:L}}return{...h,descriptor:{...h.descriptor,styles:d}}}));o.push(d=>W.setValue(d.descriptor.styles));let Z=X("Styles (.wg- selectors only)",[xt([{label:"Tree",element:W.element},{label:"JSON",element:kt("",d=>d.descriptor.styles,(d,h)=>k(h)?{...d,descriptor:{...d.descriptor,styles:h}}:d,d=>{let{styles:h,...D}=d.descriptor;return{...d,descriptor:D}},e,o)}]),J]),w=Or(e,o,{actionContext:i}),E=Nr(e,o,n),R=G(void 0),j=Yt(e.get().load,{...i,loadOnly:!0,getDataSchema:()=>$e(e.get(),r)},d=>e.update(h=>{if(d===void 0){let{load:D,...L}=h;return L}return{...h,load:d}}));o.push(d=>{j.element.contains(document.activeElement)||j.setValue(d.load)});let P=X("Load action (http GET, runs once when the widget first renders in an Apps host)",[s("div",{class:"wgd-compact wgd-load"},[j.element]),R],!1),_=gr(e);V.classList.add("wgd-edit-only"),Z.classList.add("wgd-edit-only"),t.left.append(u,C,A,w.element,P,_.element),t.right.append(V,Z,E.element),a.push(w.dispose,E.dispose,_.dispose);function S(d){let h=Xt(d,{schemas:r,actions:i.actions});c.hidden=h.kind===void 0,R.hidden=h.load===void 0,R.textContent=h.load??"",c.textContent=h.kind??"",B.hidden=h.example===void 0,B.textContent=h.example?`dataExample vs dataSchema: ${h.example.code} at ${h.example.path} \u2014 ${h.example.message}`:"",M.hidden=h.sample===void 0,M.textContent=h.sample?`sample vs dataSchema: ${h.sample.code} at ${h.sample.path} \u2014 ${h.sample.message}`:"",T.hidden=h.schemaRef===void 0,T.textContent=h.schemaRef??"",E.setDiagnostic(h.theme?`${h.theme.code}: ${h.theme.message}`:void 0),J.replaceChildren(...h.styles.map(D=>G(`${D.selector}${D.property?` \u2192 ${D.property}`:""}: ${D.message}`)));for(let D of o)D(d);w.refresh(d,h)}let $=e.subscribe(S);return a.push($),S(e.get()),{dispose(){for(let d of a)d();t.left.replaceChildren(),t.right.replaceChildren()}}}var tn="designer-preview";function nn(e={}){gn(document);let t=s("div",{class:"wgd-banner"});t.hidden=!0;let n=s("style"),r=s("div",{class:"wgd-preview"}),i=s("div",{class:"wgd-preview-pane"},[t,n,r]),o=Ee(),a=()=>({tag:"div",children:["\u2026"]});o.register(tn,m=>a(m),{description:"Designer preview delegate.",dataShape:"Defined by the draft being designed."});let f=new Map;for(let m of e.widgets??[]){let y=Oe(m.template);if(!y.ok||typeof m.kind!="string"||m.kind==="")continue;let g=zt(y.template),b=k(m.descriptor)?m.descriptor:{};try{o.register(m.kind,v=>g(v),{description:`Custom widget '${m.kind}' supplied for preview.`,dataShape:"Defined by the supplied definition.",...b.dataExample!==void 0?{dataExample:b.dataExample}:{}})}catch{continue}k(b.styles)&&f.set(m.kind,We(b.styles))}let c=o.kinds().filter(m=>m!==tn),l;function u(m,y,g){let b=g===void 0||g===tn;if(b&&!y.previewable){let T=y.kind??(y.template?`${y.template.code}: ${y.template.message}`+(y.template.path?` (at ${y.template.path})`:""):"Draft is not previewable.");if(t.hidden=!1,l===void 0){t.textContent=`Nothing to preview yet \u2014 ${T}`,r.replaceChildren(s("div",{class:"wgd-preview-empty"},["No preview: the draft has never been valid."]));return}t.textContent=`Preview frozen on the last valid draft \u2014 ${T}`;return}if(r.querySelector(".wgd-preview-empty")?.remove(),t.hidden=!0,t.textContent="",b){let T=Oe(m.template);if(!T.ok)return;let x=e.actions??[];a=zt(T.template,{actions:N=>x.find(C=>C.name===N)?.definition})}n.textContent=b?m.descriptor.styles?We(m.descriptor.styles):"":f.get(g)??"",hn(r,m.theme??{});let v={kind:b?tn:g,data:b?m.sampleData??m.descriptor.dataExample??null:p(g)};l===void 0?l=vn(v,r,{catalog:o}):l.update(v);for(let T of r.querySelectorAll("[data-wg-action]"))T.classList.add("wg-designer-action")}function p(m){return o.describe(m)?.dataExample??{value:"preview"}}return{pane:i,kinds:c,update:u,dispose(){l?.dispose(),l=void 0,i.replaceChildren()}}}function Je(e){return JSON.parse(JSON.stringify(e))}function Et(){return{kind:"my-widget",template:{tag:"div",attrs:{class:"wg-template"},children:[{tag:"h2",children:[{bind:"title"}]},{bind:"message"}]},descriptor:{description:"Describe what this widget is for.",dataShape:"{ title?, message }",dataExample:{title:"My widget",message:"Hello from the widgentic designer"},dataSchema:{type:"object",required:["message"],properties:{title:{type:"string"},message:{type:"string"}}}}}}function Lr(e){let t=Je(e??Et()),n=[],r=new Set;function i(){for(let o of[...r])o(t)}return{get:()=>t,update(o){n.push(t),n.length>50&&n.shift(),t=Je(o(Je(t))),i()},replace(o){n.length=0,t=Je(o),i()},undo(){let o=n.pop();return o===void 0?!1:(t=o,i(),!0)},subscribe(o){return r.add(o),()=>r.delete(o)}}}function Cr(e,t={}){Le(document);let n=t.initialWidget?Je({...t.initialWidget}):Et(),r=t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,i=Lr(r),o=new Set,a=nn({actions:t.actions??[]}),f=s("div",{class:"wgd-panels"}),c=s("div",{class:"wgd-preview-pane"}),l=s("div",{class:"wgd-side"},[a.pane,c]),u=s("div",{class:"wgd-root"},[f,l]);(t.appearance==="light"||t.appearance==="dark")&&u.setAttribute("data-wgd-theme",t.appearance),Re(u,t.chrome),e.appendChild(u);let p={actions:t.actions??[],secretNames:t.secretNames??[],schemas:t.schemas??[]},m=Rr(i,{left:f,right:c},t.themes??[],t.schemas??[],p);function y(v){let T=Xt(v,{schemas:t.schemas??[],actions:t.actions??[]});a.update(v,T);for(let x of[...o])x(v,T)}let g=i.subscribe(y);y(i.get());function b(v){u.classList.toggle("wgd-readonly",v);let T=[...u.querySelectorAll(".wgd-panels .wgd-section-body, .wgd-edit-only > .wgd-section-body")].filter(x=>!x.parentElement?.classList.contains("wgd-view-only"));for(let x of T)v?x.setAttribute("inert",""):x.removeAttribute("inert")}return t.readOnly===!0&&b(!0),{getDraft:()=>Je(i.get()),setReadOnly:b,loadWidget(v){let T=Tn(v);return T.length>0?{ok:!1,errors:T}:(An(i,v),{ok:!0})},loadTheme(v){let T=Be(v);return T.ok?(i.update(x=>({...x,theme:T.theme})),{ok:!0}):{ok:!1,errors:[T.error.message]}},subscribe(v){return o.add(v),()=>o.delete(v)},dispose(){g(),m.dispose(),a.dispose(),o.clear(),u.remove()}}}var $r=/^[a-zA-Z0-9._-]+$/;function Gi(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function Yi(e){let t=[];return k(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):$r.test(e.name)||t.push(`'${e.name}' is not a valid schema name \u2014 use letters, digits, '.', '_' or '-'.`),k(e.schema)||t.push("'schema' must be a plain object."),t):["Schema entry must be an object."]}function jr(e,t={}){Le(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):Gi(),r=new Set,i=s("div",{class:"wgd-panels"}),o=s("div",{class:"wgd-root wgd-schema-designer"},[i]);(t.appearance==="light"||t.appearance==="dark")&&o.setAttribute("data-wgd-theme",t.appearance),Re(o,t.chrome),e.appendChild(o);function a(){return JSON.parse(JSON.stringify(n))}function f(){for(let w of[...r])w(a())}let c=[],l=G(void 0);function u(w,E,R){let j=Ne(w,E(),R),P=ye(j,"input");return c.push(()=>{document.activeElement!==P&&(P.value=E())}),j}let p=X("Schema",[u("Name (id)",()=>n.name,w=>{n={...n,name:w};let E=w.trim()===""||!$r.test(w);l.hidden=!E,l.textContent=E?"Name must be non-empty using letters, digits, '.', '_' or '-'.":"",f()}),l,u("Label",()=>n.label??"",w=>{n={...n,label:w},f()}),u("Description",()=>n.description??"",w=>{n={...n,description:w},f()})]),m=ot(n.schema,w=>{n={...n,schema:w??{}},v(),f()}),y=G(void 0),g=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),b=s("div",void 0,[g,y]);g.value=JSON.stringify(n.schema,null,2),g.addEventListener("input",()=>{try{let w=JSON.parse(g.value);if(!k(w))throw new Error("schema must be an object");y.hidden=!0,y.textContent="",n={...n,schema:w},m.setValue(w),f()}catch(w){y.hidden=!1,y.textContent=`Invalid JSON (schema keeps the last valid value): ${String(de(w))}`}});function v(){document.activeElement!==g&&(g.value=JSON.stringify(n.schema,null,2),ge(g))}let T=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Builder"]),x=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);b.hidden=!0,T.addEventListener("click",()=>{m.element.hidden=!1,b.hidden=!0,T.classList.add("wgd-tab-active"),x.classList.remove("wgd-tab-active")}),x.addEventListener("click",()=>{m.element.hidden=!0,b.hidden=!1,x.classList.add("wgd-tab-active"),T.classList.remove("wgd-tab-active"),v()});let N=X("Definition",[s("div",{class:"wgd-row"},[T,x]),m.element,b]),C=G(void 0),I=s("textarea",{class:"wgd-textarea wgd-schema-import",rows:"6",spellcheck:"false"}),B=s("button",{class:"wgd-button",type:"button"},["Import"]);B.addEventListener("click",()=>{let w;try{w=JSON.parse(I.value)}catch(R){C.hidden=!1,C.textContent=`Invalid JSON: ${de(R)}`;return}let E=W(w);C.hidden=E.ok,C.textContent=E.ok?"":E.errors.join(`
452
+ `)});let A=X("Import",[s("span",{class:"wgd-field-label"},["Import schema entry JSON ({ name, label?, description?, schema })"]),I,C,s("div",{class:"wgd-row"},[B])]),M=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),V=s("button",{class:"wgd-button wgd-add",type:"button"},["Export schema entry"]);V.addEventListener("click",()=>{M.value=JSON.stringify(a(),null,2),ge(M)});let J=X("Export",[s("div",{class:"wgd-toolbar"},[V]),M]);J.classList.add("wgd-view-only"),i.append(p,N,A,J),ce(g),ce(I),ce(M);function W(w){let E=Yi(w);if(E.length>0)return{ok:!1,errors:E};n=JSON.parse(JSON.stringify(w));for(let R of c)R();return l.hidden=!0,m.setValue(n.schema),v(),f(),{ok:!0}}function Z(w){o.classList.toggle("wgd-readonly",w);let E=[...i.querySelectorAll(".wgd-section-body")].filter(R=>!R.parentElement?.classList.contains("wgd-view-only"));for(let R of E)w?R.setAttribute("inert",""):R.removeAttribute("inert")}return t.readOnly===!0&&Z(!0),{getSchema:a,loadSchema:W,setReadOnly:Z,subscribe(w){return r.add(w),()=>r.delete(w)},dispose(){r.clear(),o.remove()}}}var Xi=Ee().kinds(),Zi=/^#[0-9a-f]{3}([0-9a-f]{3})?$/i,Pr=/^x-[a-z0-9][a-z0-9-]*$/;function Qi(e){if(!Zi.test(e))return;if(e.length===7)return e.toLowerCase();let[,t,n,r]=e.toLowerCase();return`#${t}${t}${n}${n}${r}${r}`}function eo(){return{name:"my-theme",label:"My theme",tokens:{}}}function to(e){let t=[];if(typeof e!="object"||e===null||Array.isArray(e))return["Theme entry must be an object."];let n=e;(typeof n.name!="string"||n.name.trim()==="")&&t.push("'name' must be a non-empty string.");let r=Be(n.tokens??{});return r.ok||t.push(`tokens: ${r.error.code} \u2014 ${r.error.message}`),t}function Wr(e,t={}){Le(document);let n=t.initialTheme?JSON.parse(JSON.stringify(t.initialTheme)):eo(),r=new Set,i=nn(t.widgets?{widgets:t.widgets}:{}),o=i.kinds.length>0?i.kinds:Xi,a=o[0]??"card",f=s("div",{class:"wgd-panels"}),c=s("div",{class:"wgd-side"},[i.pane]),l=s("div",{class:"wgd-root wgd-theme-designer"},[f,c]);(t.appearance==="light"||t.appearance==="dark")&&l.setAttribute("data-wgd-theme",t.appearance),Re(l,t.chrome),e.appendChild(l);function u(){return{...Et(),theme:n.tokens}}function p(){i.update(u(),{styles:[],previewable:!0},a);for(let S of[...r])S(m())}function m(){return JSON.parse(JSON.stringify(n))}function y(S,$){let d={...n.tokens};$===""?delete d[S]:d[S]=$,n={...n,tokens:d},p()}let g=[];function b(S,$,d){let h=Ne(S,$(),d),D=ye(h,"input");return g.push(()=>{document.activeElement!==D&&(D.value=$())}),h}let v=X("Theme",[b("Name (id)",()=>n.name,S=>{n={...n,name:S},p()}),b("Label",()=>n.label??"",S=>{n={...n,label:S},p()}),b("Description",()=>n.description??"",S=>{n={...n,description:S},p()})]),T=s("select",{class:"wgd-select wgd-preview-kind"});for(let S of o)T.append(s("option",{value:S},[S]));T.value=a,T.addEventListener("change",()=>{a=T.value,p()}),c.prepend(s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview kind"]),T]));let x=[],N=[];for(let S of xe){let $=s("input",{type:"text",class:"wgd-input",placeholder:He[S]});$.value=n.tokens[S]??"";let d=G(void 0),h=ve[S].type==="color"?s("input",{type:"color",class:"wgd-swatch",title:`Pick --wg-${S}`}):void 0,D=L=>{let F=L===""?He[S]:L;if(h!==void 0){let U=Qi(F);U!==void 0&&(h.value=U),h.style.background=Fe(F)?F:"transparent"}};D($.value),h?.addEventListener("input",()=>{$.value=h.value,$.dispatchEvent(new Event("input",{bubbles:!0}))}),$.addEventListener("input",()=>{let L=$.value!==""&&!Fe($.value);d.hidden=!L,d.textContent=L?"INVALID_TOKEN_VALUE: unsafe value withheld from the preview (no ;{}<> url() expression()).":"",D($.value),y(S,$.value)}),x.push(()=>{document.activeElement!==$&&($.value=n.tokens[S]??"",D($.value))}),N.push(s("div",void 0,[s("label",{class:"wgd-field",title:ve[S].use},[s("span",{class:"wgd-field-label"},[`--wg-${S}`]),s("div",{class:"wgd-token-row"},h===void 0?[$]:[$,h])]),d]))}let C=X("Tokens",N),I=s("div",{class:"wgd-jt-children"}),B=G(void 0);function A(){return Object.entries(n.tokens).filter(([S])=>Pr.test(S))}function M(){let S=A().map(([d,h])=>{let D=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});D.value=d,D.addEventListener("change",()=>{let U=D.value;if(!Pr.test(U)){B.hidden=!1,B.textContent=`'${U}' is not a valid custom name \u2014 use x-<lowercase-kebab>.`,D.value=d;return}B.hidden=!0;let te={...n.tokens};delete te[d],te[U]=h,n={...n,tokens:te},M(),p()});let L=s("input",{type:"text",class:"wgd-input"});L.value=h,L.addEventListener("input",()=>y(d,L.value));let F=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return F.addEventListener("click",()=>{y(d,""),M()}),s("div",{class:"wgd-attr-row"},[D,L,F])}),$=s("button",{class:"wgd-button wgd-add",type:"button"},["+ variable"]);$.addEventListener("click",()=>{let d="x-custom";for(let h=1;d in n.tokens;h++)d=`x-custom${h}`;y(d,"0"),M()}),I.replaceChildren(...S,s("div",{class:"wgd-toolbar"},[$]))}M();let V=X("Custom variables (--wg-x-*)",[I,B]),J=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),W=s("button",{class:"wgd-button wgd-add",type:"button"},["Export theme entry"]);W.addEventListener("click",()=>{J.value=JSON.stringify(m(),null,2)});let Z=s("textarea",{class:"wgd-textarea",rows:"5",spellcheck:"false"}),w=G(void 0),E=s("button",{class:"wgd-button",type:"button"},["Import"]);E.addEventListener("click",()=>{let S;try{S=JSON.parse(Z.value)}catch(d){w.hidden=!1,w.textContent=`Invalid JSON: ${de(d)}`;return}let $=P(S);w.hidden=$.ok,w.textContent=$.ok?"":$.errors.join(`
453
+ `)});let R=X("Import",[s("span",{class:"wgd-field-label"},["Import theme entry JSON"]),Z,w,s("div",{class:"wgd-row"},[E])]),j=X("Export",[s("div",{class:"wgd-toolbar"},[W]),J]);j.classList.add("wgd-view-only"),f.append(v,C,V,R,j);function P(S){let $=to(S);if($.length>0)return{ok:!1,errors:$};n=JSON.parse(JSON.stringify(S));for(let d of g)d();for(let d of x)d();return M(),p(),{ok:!0}}p();function _(S){l.classList.toggle("wgd-readonly",S);let $=[...f.querySelectorAll(".wgd-section-body")].filter(d=>!d.parentElement?.classList.contains("wgd-view-only"));for(let d of $)S?d.setAttribute("inert",""):d.removeAttribute("inert")}return t.readOnly===!0&&_(!0),{getTheme:m,loadTheme:P,setReadOnly:_,subscribe(S){return r.add(S),()=>r.delete(S)},dispose(){r.clear(),i.dispose(),l.remove()}}}function no(){return{name:"my-action",label:"My action",definition:{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}}function ro(e){let t=[];if(!k(e))return["Action entry must be an object."];(typeof e.name!="string"||!Mt.test(e.name))&&t.push("'name' must be lowercase letters, digits and dashes, starting with a letter (max 64).");for(let r of["label","description"])e[r]!==void 0&&typeof e[r]!="string"&&t.push(`'${r}' must be a string when present.`);let n=nt(e.definition,"definition");return n&&t.push(`${n.message} (at ${n.path})`),t}function io(e){let t={name:e.name,definition:se(e.definition)};return typeof e.label=="string"&&e.label!==""&&(t.label=e.label),typeof e.description=="string"&&e.description!==""&&(t.description=e.description),t}function _r(e,t,n){let{[t]:r,...i}=e;return n===""?i:{...i,[t]:n}}function Ir(e,t={}){Le(document);let n=t.initialAction?se(t.initialAction):no(),r=t.testCall,i=new Set,o=s("div",{class:"wgd-panels"}),a=s("div",{class:"wgd-root wgd-action-designer"},[o]);(t.appearance==="light"||t.appearance==="dark")&&a.setAttribute("data-wgd-theme",t.appearance),Re(a,t.chrome),e.appendChild(a);let f=()=>se(n);function c(){for(let d of[...i])d(f())}let l=[],u=G(void 0);function p(d,h,D){let L=Ne(d,h(),D),F=ye(L,"input");return l.push(()=>{document.activeElement!==F&&(F.value=h())}),L}let m=X("Action",[p("Name (id)",()=>n.name,d=>{n={...n,name:d};let h=!Mt.test(d);u.hidden=!h,u.textContent=h?"Name must be lowercase letters, digits and dashes, starting with a letter.":"",c()}),u,p("Label",()=>n.label??"",d=>{n=_r(n,"label",d),c()}),p("Description",()=>n.description??"",d=>{n=_r(n,"description",d),c()})]),y=G(void 0),g=On(n.definition,{...t.schemas?{schemas:t.schemas}:{},...t.secretNames?{secretNames:t.secretNames}:{}},d=>{n={...n,definition:d},x(),N(),W(),c()}),b=G(void 0),v=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),T=s("div",void 0,[v,b]);v.value=JSON.stringify(n.definition,null,2),v.addEventListener("input",()=>{try{let d=JSON.parse(v.value),h=nt(d,"definition");if(h)throw new Error(`${h.message} (at ${h.path})`);b.hidden=!0,b.textContent="",n={...n,definition:d},g.setValue(n.definition),N(),W(),c()}catch(d){b.hidden=!1,b.textContent=`Invalid (definition keeps the last valid value): ${de(d)}`}});function x(){document.activeElement!==v&&(v.value=JSON.stringify(n.definition,null,2),ge(v))}function N(){let d=nt(n.definition,"definition");y.hidden=d===void 0,y.textContent=d?`${d.message} (at ${d.path})`:""}N();let C=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Editor"]),I=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);T.hidden=!0,C.addEventListener("click",()=>{g.element.hidden=!1,T.hidden=!0,C.classList.add("wgd-tab-active"),I.classList.remove("wgd-tab-active")}),I.addEventListener("click",()=>{g.element.hidden=!0,T.hidden=!1,I.classList.add("wgd-tab-active"),C.classList.remove("wgd-tab-active"),x()});let B=X("Definition",[s("div",{class:"wgd-row"},[C,I]),y,g.element,T]),A=s("div",{class:"wgd-action-test"}),M=X("Test",[A]),V={},J;function W(){if(r===void 0)return;if(A.replaceChildren(),n.definition.kind!=="http"){J=void 0,V={},A.append(s("p",{class:"wgd-diagnostic"},["Prompt actions run in the host's composer; nothing to test."]));return}let d=n.definition,h=JSON.stringify(d.input);h!==J&&(V={}),J=h;let D=Jt(d.input,V,U=>{V=k(U)?U:{}});V=k(D.getValue())?D.getValue():{};let L=s("pre",{class:"wgd-test-output"}),F=s("button",{class:"wgd-button wgd-add wgd-test-run",type:"button"},["Test call"]);F.addEventListener("click",()=>{F.disabled=!0,F.classList.add("wgd-busy"),F.setAttribute("aria-busy","true"),L.textContent="\u2026",r(d,V).then(U=>{L.textContent=typeof U=="string"?U:JSON.stringify(U,null,2)}).catch(U=>{L.textContent=`Test failed: ${U.message}`}).finally(()=>{F.disabled=!1,F.classList.remove("wgd-busy"),F.removeAttribute("aria-busy")})}),A.append(s("span",{class:"wgd-field-label"},["Arguments"]),D.element,s("div",{class:"wgd-row"},[F]),L)}W();let Z=G(void 0),w=s("textarea",{class:"wgd-textarea wgd-action-import",rows:"6",spellcheck:"false"}),E=s("button",{class:"wgd-button",type:"button"},["Import"]);E.addEventListener("click",()=>{let d;try{d=JSON.parse(w.value)}catch(D){Z.hidden=!1,Z.textContent=`Invalid JSON: ${de(D)}`;return}let h=S(d);Z.hidden=h.ok,Z.textContent=h.ok?"":h.errors.join(`
454
+ `)});let R=X("Import",[s("span",{class:"wgd-field-label"},["Import action entry JSON ({ name, label?, description?, definition })"]),w,Z,s("div",{class:"wgd-row"},[E])]),j=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),P=s("button",{class:"wgd-button wgd-add",type:"button"},["Export action entry"]);P.addEventListener("click",()=>{j.value=JSON.stringify(f(),null,2),ge(j)});let _=X("Export",[s("div",{class:"wgd-toolbar"},[P]),j]);_.classList.add("wgd-view-only"),o.append(m,B,...r===void 0?[]:[M],R,_),ce(v),ce(w),ce(j);function S(d){let h=ro(d);if(h.length>0)return{ok:!1,errors:h};n=io(d),V={};for(let D of l)D();return u.hidden=!0,g.setValue(n.definition),x(),N(),W(),c(),{ok:!0}}function $(d){a.classList.toggle("wgd-readonly",d);let h=[...o.querySelectorAll(".wgd-section-body")].filter(D=>!D.parentElement?.classList.contains("wgd-view-only"));for(let D of h)d?D.setAttribute("inert",""):D.removeAttribute("inert")}return t.readOnly===!0&&$(!0),{getAction:f,loadAction:S,setReadOnly:$,subscribe(d){return i.add(d),()=>i.delete(d)},dispose(){i.clear(),a.remove()}}}function rn(e){let t=e.getAttribute("appearance"),n=pr(e.getAttribute("chrome"));return{...t==="light"||t==="dark"?{appearance:t}:{},...n===void 0?{}:{chrome:n}}}var Mr="widgentic-designer",Hr="widgentic-theme-designer",Fr="widgentic-schema-designer",Br="widgentic-action-designer";function Rn(e=Mr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Cr(this,rn(this)),this.#t=this.#e.subscribe((r,i)=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{draft:r,diagnostics:i},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function Ln(e=Hr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Wr(this,rn(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{theme:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function Cn(e=Fr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=jr(this,rn(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{schema:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}function $n(e=Br){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Ir(this,rn(this)),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{action:r},bubbles:!0}))}))}disconnectedCallback(){this.#t?.(),this.#e?.dispose(),this.#e=void 0,this.#t=void 0}get designer(){return this.#e}}customElements.define(e,t)}$n();Rn();Cn();Ln();
417
455
  //# sourceMappingURL=widgentic-designer.js.map