@widgentic/designer 0.1.0 → 0.2.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.
- package/README.md +52 -0
- package/dist/action-designer.d.ts +8 -0
- package/dist/action-designer.d.ts.map +1 -1
- package/dist/action-designer.js +2 -1
- package/dist/action-designer.js.map +1 -1
- package/dist/browser/widgentic-designer.js +77 -71
- package/dist/browser/widgentic-designer.js.map +3 -3
- package/dist/dom.d.ts +18 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +112 -57
- package/dist/dom.js.map +1 -1
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +18 -10
- package/dist/element.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/schema-designer.d.ts +8 -0
- package/dist/schema-designer.d.ts.map +1 -1
- package/dist/schema-designer.js +3 -2
- package/dist/schema-designer.js.map +1 -1
- package/dist/shell.d.ts +8 -0
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +2 -1
- package/dist/shell.js.map +1 -1
- package/dist/theme-designer.d.ts +8 -0
- package/dist/theme-designer.d.ts.map +1 -1
- package/dist/theme-designer.js +2 -1
- package/dist/theme-designer.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
function It(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function cn(e,t={}){if(!It(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&&!It(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&&!It(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 Mt=new Set(["http","https","mailto","tel"]);function it(e){return e.replace(/[\u0000-\u0020]+/g,"")}function _t(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(it(e));if(t===null)return!0;let n=t[1];return n!==void 0&&Mt.has(n.toLowerCase())}function ln(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(it(e));if(t===null)return!1;let n=t[1];return n!==void 0&&Mt.has(n.toLowerCase())}var ar=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,dr=/^https?:\/\//i;function je(e){let t=it(e);return ar.test(t)||dr.test(t)}var cr=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function un(e){let t=it(e);if(!je(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return cr.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 _e={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 lr=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function ur(e){if(!(typeof e!="string"||e.length>256)&&!lr.test(e))try{return new RegExp(e)}catch{return}}function Ue(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function pn(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 pr(e,t){return typeof e=="string"?pn(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&pn(n,t)):!0}function gr(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function fr(e){return Array.isArray(e)?e.join(" | "):String(e)}function Se(e,t,n="data"){if(Array.isArray(e.enum)&&!gr(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&&!pr(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${fr(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=ur(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 ot(e,t){return e.includes("{value}")?e.split("{value}").join(t):e+t}function st(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||!ln(a)?r:q("a",{class:"wg-link",href:a,rel:"noopener noreferrer"},[r])}var mr=new Set(["avatar","thumb","hero"]);function at(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"&&mr.has(o)?je(t)?{src:t,shape:o}:null:o===!0?je(t)?{src:t,shape:r}:null:un(t)?{src:t,shape:r}:null}function dt(e,t,n){return q("img",{class:`wg-img wg-img-${n}`,src:t,alt:e,loading:"lazy",decoding:"async"})}function gn(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=at(l,u,e.hints,"thumb"),m;if(p)m=dt(l,p.src,p.shape);else{let w=te(u),f=r?.[l],b=typeof f=="string"?ot(f,w):w;m=st(l,u,e.hints,b)}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 fn(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=at(u,p,e.hints,"avatar"),w;if(m)w=dt(u,m.src,m.shape);else{let f=te(p),b=n?.[u],v=typeof b=="string"?ot(b,f):f;w=st(u,p,e.hints,v)}return q("td",{class:"wg-table-cell"},[w])}))))])}function mn(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=>hn(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 hr(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 hn(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"},[hr(e)])];return r&&o.push(q("ul",{class:"wg-tree-children"},e.children.map(a=>hn(a,t+1,n)))),q("li",i,o)}function wn(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 bn=20,wr=["stack","row","grid"],br=["none","sm","md","lg"],yr=4;function yn(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>bn)return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:`'items' holds ${t.length} sub-widgets; a group renders at most ${bn}.`}};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 vn(e,t){let n=re(e)?e:{},r=wr.some(a=>a===n.layout)?n.layout:"stack",i=br.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(yr,Math.max(1,Math.trunc(a)));o.push(`wg-cols-${g}`)}return q("div",{class:o.join(" ")},t)}function xn(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=>xn(o,t));return{tag:e.tag,...r!==void 0?{attrs:r}:{},...i!==void 0?{children:i}:{}}}var ct=class extends Error{code="DUPLICATE_KIND";kind;constructor(t){super(`Widget kind '${t}' is already registered.`),this.name="DuplicateKindError",this.kind=t}};function be(){let e=new Map,t=new Map,n={register(r,i,o){if(e.has(r))throw new ct(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=cn(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=yn(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(xn(p.node,`data.items.${l}`))}return{ok:!0,node:vn(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",gn,_e.card),n.register("table",fn,_e.table),n.register("tree",mn,_e.tree),n.register("custom",wn,_e.custom),n.register("group",r=>{let i=n.render(r);if(i.ok)return i.node;throw new Error(i.error.message)},_e.group),n}var Ht=/[;{}<>@\\]/,kn=/^-?[a-zA-Z][a-zA-Z-]*$/;function vr(e){if(Ht.test(e))return!1;let t=e.split(",").map(n=>n.trim());return t.length>0&&t.every(n=>n.includes(".wg-"))}function xr(e){return!Ht.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function Re(e){let t=[];for(let[n,r]of Object.entries(e)){if(!vr(n)||typeof r!="object"||r===null)continue;let i=[];for(let[o,a]of Object.entries(r))kn.test(o)&&(typeof a!="string"||!xr(a)||i.push(` ${o}: ${a};`));i.length>0&&t.push(`${n} {
|
|
1
|
+
function _t(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function un(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 pn(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 lr=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,ur=/^https?:\/\//i;function Re(e){let t=ot(e);return lr.test(t)||ur.test(t)}var pr=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function gn(e){let t=ot(e);if(!Re(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return pr.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 gr=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function fr(e){if(!(typeof e!="string"||e.length>256)&&!gr.test(e))try{return new RegExp(e)}catch{return}}function Ue(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function fn(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 mr(e,t){return typeof e=="string"?fn(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&fn(n,t)):!0}function hr(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function wr(e){return Array.isArray(e)?e.join(" | "):String(e)}function Se(e,t,n="data"){if(Array.isArray(e.enum)&&!hr(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&&!mr(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${wr(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=fr(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||!pn(a)?r:q("a",{class:"wg-link",href:a,rel:"noopener noreferrer"},[r])}var yr=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"&&yr.has(o)?Re(t)?{src:t,shape:o}:null:o===!0?Re(t)?{src:t,shape:r}:null:gn(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 mn(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 hn(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 wn(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=>yn(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 br(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 yn(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"},[br(e)])];return r&&o.push(q("ul",{class:"wg-tree-children"},e.children.map(a=>yn(a,t+1,n)))),q("li",i,o)}function bn(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 vn=20,vr=["stack","row","grid"],xr=["none","sm","md","lg"],kr=4;function xn(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>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(!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 kn(e,t){let n=re(e)?e:{},r=vr.some(a=>a===n.layout)?n.layout:"stack",i=xr.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(kr,Math.max(1,Math.trunc(a)));o.push(`wg-cols-${g}`)}return q("div",{class:o.join(" ")},t)}function En(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=>En(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=un(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=xn(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(En(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(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",mn,He.card),n.register("table",hn,He.table),n.register("tree",wn,He.tree),n.register("custom",bn,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=/[;{}<>@\\]/,Sn=/^-?[a-zA-Z][a-zA-Z-]*$/;function Er(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 Sr(e){return!zt.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function $e(e){let t=[];for(let[n,r]of Object.entries(e)){if(!Er(n)||typeof r!="object"||r===null)continue;let i=[];for(let[o,a]of Object.entries(r))Sn.test(o)&&(typeof a!="string"||!Sr(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."}}
|
|
6
|
-
${fe.map(e=>` --wg-${e}: ${
|
|
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."}},We=Object.fromEntries(Object.entries(ge).map(([e,t])=>[e,t.default])),fe=Object.keys(ge);function Ce(e){return!/[;{}<>]/.test(e)&&!/url\s*\(/i.test(e)&&!/expression\s*\(/i.test(e)}function O(e){return`var(--wg-${e}, ${We[e]})`}var Tr=`:root {
|
|
6
|
+
${fe.map(e=>` --wg-${e}: ${We[e]};`).join(`
|
|
7
7
|
`)}
|
|
8
|
-
}`,
|
|
9
|
-
${
|
|
8
|
+
}`,An=`
|
|
9
|
+
${Tr}
|
|
10
10
|
.wg-card, .wg-table, .wg-tree, .wg-custom, .wg-template {
|
|
11
11
|
font-family: ${O("font-family")};
|
|
12
12
|
font-size: ${O("font-size")};
|
|
@@ -174,9 +174,11 @@ ${kr}
|
|
|
174
174
|
.wg-gap-sm { gap: ${O("spacing-sm")}; }
|
|
175
175
|
.wg-gap-md { gap: ${O("spacing")}; }
|
|
176
176
|
.wg-gap-lg { gap: ${O("spacing-lg")}; }
|
|
177
|
-
`.trim(),En="data-widgentic";function Bt(e){if(e.head.querySelector(`style[${En}]`))return;let t=e.createElement("style");t.setAttribute(En,"base"),t.textContent=Sn,e.head.appendChild(t)}function Er(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Sr=new Set(fe),Jt=/^x-[a-z0-9][a-z0-9-]*$/;function Tr(e){return Object.keys(e).filter(t=>Jt.test(t))}function Tn(e){return`--wg-${e}`}function Pe(e){if(!Er(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!Sr.has(t)&&!Jt.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 Ar(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 Vt(e,t){let n=Ar(t),r=e.style;if(!r)return;for(let o of fe)r.removeProperty(Tn(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,...Tr(n)];for(let o of i){let a=n[o];typeof a=="string"&&We(a)&&r.setProperty(Tn(o),a)}}function x(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var lt=/^(?:on.*|srcdoc)$/i,ut=new Set(["script","iframe","frame","frameset","object","embed","style","link","meta","base","template","noscript"]),pt=/^data-wg-/i,An=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),Ut=64;var Dr=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===""||Dr.has(a)))return{base:r,up:i,index:!1,segments:o}}var gt=/^[a-z][a-z0-9-]{0,63}$/,ft=gt,ze=["replace","merge","patch"],Fe=["GET","POST"];function Q(e,t){return e===""?t:`${e}.${t}`}function V(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var Or=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Nr=new Set(["host","content-length","transfer-encoding","connection"]),Lr=new Set(["__proto__","constructor","prototype"]);function mt(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!Lr.has(t))}function jr(e,t){if(typeof e!="string")return x(e)&&typeof e.secret=="string"?gt.test(e.secret)?Object.keys(e).length!==1?V("A secret reference carries only 'secret'.",t):void 0:V(`Secret reference '${e.secret}' is not a valid secret name.`,t):V("Value must be a string or a { secret } reference.",t)}function zt(e){return!x(e)&&!Array.isArray(e)?!1:x(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(zt)}function Rr(e,t){if(typeof e!="string"||e.length===0)return V("'url' must be a non-empty string.",t);let n;try{n=new URL(e)}catch{return V(`'url' must be an absolute URL (got '${e}').`,t)}if(n.protocol!=="https:")return V("'url' must use https.",t);if(n.username!==""||n.password!=="")return V("'url' must not carry userinfo.",t);if(n.hash!=="")return V("'url' must not carry a fragment.",t)}function He(e,t="",n={}){if(!x(e))return V("Action definition must be an object.",t);if(e.kind==="prompt"){if(!Array.isArray(e.text))return V("'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 V(`Invalid data path '${o.bind}'.`,Q(t,`text.${i}`));continue}return V("Prompt segments are strings or { bind } objects.",Q(t,`text.${i}`))}return r>2e3?V(`Prompt text exceeds ${2e3} characters.`,Q(t,"text")):void 0}if(e.kind==="http"){if(!Fe.some(i=>i===e.method))return V("'method' must be GET or POST.",Q(t,"method"));let r=Rr(e.url,Q(t,"url"));if(r)return r;if(!x(e.input)||e.input.type!=="object")return V(`'input' must be a JSON Schema with type "object".`,Q(t,"input"));if(zt(e.input))return V("Secret references are allowed only in headers and query.",Q(t,"input"));if(!x(e.output))return V("'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 V(`'${i}' must be an object.`,Q(t,i));for(let[a,g]of Object.entries(o)){let c=Q(t,`${i}.${a}`);if(!Or.test(a))return V(`'${a}' is not a valid ${i==="headers"?"header":"parameter"} name.`,c);if(i==="headers"&&Nr.has(a.toLowerCase()))return V(`Header '${a}' is set by the transport and cannot be declared.`,c);let l=jr(g,c);if(l)return l}}}return}return V(`'kind' must be "prompt" or "http".`,Q(t,"kind"))}function $r(e,t){return typeof e.ref=="string"?t.resolve?.(e.ref):e.definition}function ht(e,t="",n={}){if(!x(e))return V("Action binding must be an object.",t);if("ref"in e){if(typeof e.ref!="string"||e.ref.length===0)return V("'ref' must name a shared action.",Q(t,"ref"));if("definition"in e)return V("A binding is either a { ref } or a { definition }, not both.",t);if(n.resolve&&n.resolve(e.ref)===void 0)return V(`Unknown action '${e.ref}'.`,Q(t,"ref"))}else if("definition"in e){let o=He(e.definition,Q(t,"definition"),{...n.isPath?{isPath:n.isPath}:{}});if(o)return o}else return V("A binding names a shared action ({ ref }) or carries an inline { definition }.",t);let i=$r(e,n);if(n.loadOnly&&i!==void 0&&(i.kind!=="http"||i.method!=="GET"))return V("'load' accepts only http GET actions.",t);if(e.input!==void 0){if(!x(e.input))return V("'input' must be an object.",Q(t,"input"));if(i?.kind==="prompt")return V("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 V(`Input field '${a}' is not declared by the action's input schema.`,c);if(typeof g=="string"){if(n.isPath&&!n.isPath(g))return V(`Invalid data path '${g}'.`,c);continue}if(x(g)&&"const"in g&&Object.keys(g).length===1){if(zt(g.const))return V("Secret references are allowed only in headers and query.",c);continue}return V("Input values are data paths or { const } literals.",c)}}if(e.output!==void 0){let o=Q(t,"output");if(!x(e.output))return V("'output' must be an object.",o);if(i?.kind==="prompt")return V("Prompt actions have no output.",o);let{mode:a,path:g,map:c}=e.output;if(a!==void 0&&!ze.some(l=>l===a))return V("'mode' must be replace, merge or patch.",Q(o,"mode"));if(a==="patch"){if(typeof g!="string"||!mt(g))return V("'patch' requires a valid data 'path'.",Q(o,"path"))}else if(g!==void 0)return V(`'path' is only meaningful with mode "patch".`,Q(o,"path"));if(c!==void 0){if(!x(c))return V("'map' must be an object of data paths.",Q(o,"map"));let l=Object.entries(c);if(l.length===0)return V("'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 V("A '.' target takes the whole projection and must be the only entry.",m)}else if(!mt(u))return V(`'${u}' is not a valid data path.`,m);if(typeof p!="string"||p!=="."&&!mt(p))return V("Map values are data paths into the response ('.' for the whole response).",m)}}}}function qe(e,t="load",n={}){return ht(e,t,{...n,loadOnly:!0})}function Ce(e,t){return e===""?t:`${e}.${t}`}function oe(e,t){return{code:"INVALID_TEMPLATE_NODE",message:e,path:t}}function wt(e,t){if(me(e)===void 0)return{code:"INVALID_PATH",message:`Invalid data path '${e}'.`,path:t}}function Be(e,t,n){if(n>Ut)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${Ut}.`,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):wt(e.bind,t);if("each"in e){if(typeof e.each!="string")return oe("'each' must be a string path.",t);let r=wt(e.each,t);if(r)return r;if(!("template"in e))return oe("'each' node requires a 'template'.",t);let i=Be(e.template,Ce(t,"template"),n+1);return i||("empty"in e&&e.empty!==void 0?Be(e.empty,Ce(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=wt(e.when,t);if(r)return r;if(!("template"in e))return oe("'when' node requires a 'template'.",t);let i=Be(e.template,Ce(t,"template"),n+1);return i||("else"in e&&e.else!==void 0?Be(e.else,Ce(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(ut.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=Ce(t,`attrs.${r}`);if(lt.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is not allowed in templates (event handlers and srcdoc).`,path:o};if(pt.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=wt(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=ht(e.action,Ce(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=Be(e.children[r],Ce(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=Be(e,"",0);return t?{ok:!1,error:t}:{ok:!0,template:e}}function Wr(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 Ge(e,t){let n=new Set;return Wr(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 Dn=5e4;function Pr(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(ut.has(e.tag.toLowerCase()))return[];r.remaining--;let a={};if(x(e.attrs))for(let[l,u]of Object.entries(e.attrs)){if(lt.test(l)||pt.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),b=Object.prototype.hasOwnProperty.call(u.map,f)?u.map[f]:void 0;p=typeof b=="string"?b: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(An.has(m)){let w=m==="src"&&e.tag.toLowerCase()==="img";if(!(_t(p)||w&&je(p)))continue}a[l]=p}x(e.action)&&(a["data-wg-action"]=JSON.stringify(Pr(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 yt(e,t={}){let n=t.maxNodes??Dn,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 Ie(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(Ie(r,t));return n}function Ft(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 Cr(e,t,n),n;let r=n.ownerDocument;if(!r||!n.parentNode)return n;let i=Ie(t,r);return n.parentNode.replaceChild(i,n),i}function Cr(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);Ir(e.children??[],t.children??[],n)}function Ir(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?Ft(g,c,l):n.appendChild(Ie(c,r)))}for(let a=o;a<t.length;a++){let g=t[a];g!==void 0&&n.appendChild(Ie(g,r))}for(let a=e.length-1;a>=o;a--){let g=i[a];g&&n.removeChild(g)}}function Kt(e,t,n={}){let r=n.catalog??be(),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 b=w.target?.closest?.("[data-wg-action]");if(!b||!t.contains(b))return;if(w.type==="keydown"){let S=w.key;if(S!=="Enter"&&S!==" "||b.tagName==="BUTTON"||b.tagName==="A")return}if(w.preventDefault(),c===void 0)return;let v=l(b);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 b=Ie(f.node,t.ownerDocument);t.replaceChildren(b),o=b}else o=Ft(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}}function ue(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 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 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 ye(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 qt(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 On="data-widgentic-designer";function De(e){if(e.head.querySelector(`style[${On}]`))return;let t=e.createElement("style");t.setAttribute(On,"chrome"),t.textContent=`
|
|
178
|
-
/* Chrome
|
|
179
|
-
|
|
177
|
+
`.trim(),Tn="data-widgentic";function Jt(e){if(e.head.querySelector(`style[${Tn}]`))return;let t=e.createElement("style");t.setAttribute(Tn,"base"),t.textContent=An,e.head.appendChild(t)}function Ar(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Dr=new Set(fe),Vt=/^x-[a-z0-9][a-z0-9-]*$/;function Or(e){return Object.keys(e).filter(t=>Vt.test(t))}function Dn(e){return`--wg-${e}`}function Pe(e){if(!Ar(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!Dr.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"||!Ce(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 Nr(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=Nr(t),r=e.style;if(!r)return;for(let o of fe)r.removeProperty(Dn(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,...Or(n)];for(let o of i){let a=n[o];typeof a=="string"&&Ce(a)&&r.setProperty(Dn(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,On=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),Kt=64;var Lr=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===""||Lr.has(a)))return{base:r,up:i,index:!1,segments:o}}var ft=/^[a-z][a-z0-9-]{0,63}$/,mt=ft,Ke=["replace","merge","patch"],Fe=["GET","POST"];function Q(e,t){return e===""?t:`${e}.${t}`}function J(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var jr=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Rr=new Set(["host","content-length","transfer-encoding","connection"]),$r=new Set(["__proto__","constructor","prototype"]);function ht(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!$r.has(t))}function Wr(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 Ft(e){return!x(e)&&!Array.isArray(e)?!1:x(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(Ft)}function Cr(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(!Fe.some(i=>i===e.method))return J("'method' must be GET or POST.",Q(t,"method"));let r=Cr(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(Ft(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(!jr.test(a))return J(`'${a}' is not a valid ${i==="headers"?"header":"parameter"} name.`,c);if(i==="headers"&&Rr.has(a.toLowerCase()))return J(`Header '${a}' is set by the transport and cannot be declared.`,c);let l=Wr(g,c);if(l)return l}}}return}return J(`'kind' must be "prompt" or "http".`,Q(t,"kind"))}function Pr(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=Pr(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(Ft(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&&!Ke.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>Kt)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${Kt}.`,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 Ir(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 Xe(e,t){let n=new Set;return Ir(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 Nn=5e4;function Mr(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 Ye(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?[]:Ye(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(...Ye(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?[]:Ye(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(On.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(Mr(e.action,i,t,n,o)));let g=Array.isArray(e.children)?e.children.flatMap((l,u)=>Ye(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??Nn,r=t;return i=>{let o={remaining:n,truncated:!1},a=[{scope:i.data}],g=Ye(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 _r(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 _r(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);Hr(e.children??[],t.children??[],n)}function Hr(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}}function ue(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 Xt(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 Br=["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"],zr=new Set(Br),Jr=/^(inherit|initial|unset|revert|revert-layer)$/i;function De(e,t){if(t!==void 0)for(let[n,r]of Object.entries(t))zr.has(n)&&(typeof r!="string"||Jr.test(r.trim())||e.style.setProperty(`--wgd-${n}`,r))}function jn(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 Ln="data-widgentic-designer";function Oe(e){if(e.head.querySelector(`style[${Ln}]`))return;let t=e.createElement("style");t.setAttribute(Ln,"chrome"),t.textContent=`
|
|
178
|
+
/* Chrome tokens (CHROME_TOKENS): light colours, overridden for dark below;
|
|
179
|
+
typography, shape and shadow are scheme-independent. A host overrides any
|
|
180
|
+
of them through options.chrome (inline on the root). Widget content inside
|
|
181
|
+
the preview keeps its own --wg-* theme tokens. */
|
|
180
182
|
.wgd-root {
|
|
181
183
|
--wgd-bg: #ffffff; --wgd-panel: #fbfcfe; --wgd-border: #d5dbe3;
|
|
182
184
|
--wgd-line: #e2e8f0; --wgd-text: #1f2430; --wgd-muted: #5b6472;
|
|
@@ -185,6 +187,10 @@ ${kr}
|
|
|
185
187
|
--wgd-hover: #eef2f7;
|
|
186
188
|
--wgd-hl-key: #0b5fa5; --wgd-hl-str: #0a7a3d; --wgd-hl-num: #b45309;
|
|
187
189
|
--wgd-hl-bool: #7c3aed; --wgd-hl-punct: #7a8494;
|
|
190
|
+
--wgd-font: system-ui, sans-serif; --wgd-font-mono: ui-monospace, monospace;
|
|
191
|
+
--wgd-font-size: 13px; --wgd-font-size-sm: 12px; --wgd-font-size-xs: 11px;
|
|
192
|
+
--wgd-radius-sm: 3px; --wgd-radius: 4px; --wgd-radius-lg: 6px; --wgd-gap: 16px;
|
|
193
|
+
--wgd-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);
|
|
188
194
|
}
|
|
189
195
|
@media (prefers-color-scheme: dark) {
|
|
190
196
|
.wgd-root:not([data-wgd-theme="light"]) {
|
|
@@ -206,7 +212,7 @@ ${kr}
|
|
|
206
212
|
--wgd-hl-key: #7aa2f7; --wgd-hl-str: #9ece6a; --wgd-hl-num: #ff9e64;
|
|
207
213
|
--wgd-hl-bool: #bb9af7; --wgd-hl-punct: #8b94a7;
|
|
208
214
|
}
|
|
209
|
-
.wgd-root { display: flex; gap:
|
|
215
|
+
.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); }
|
|
210
216
|
/* Any chrome class that sets display would silently defeat the hidden
|
|
211
217
|
attribute (learned live twice: the add menu, then the styles tree as a
|
|
212
218
|
tab pane). hidden always wins \u2014 scoped to the designer's own tree. */
|
|
@@ -218,7 +224,7 @@ ${kr}
|
|
|
218
224
|
.wgd-readonly .wgd-section-body[inert] { opacity: 0.75; }
|
|
219
225
|
/* Empty preview state \u2014 shown only when there has never been a valid
|
|
220
226
|
render to freeze on; a blank pane is the one state the contract bans. */
|
|
221
|
-
.wgd-preview-empty { color: var(--wgd-muted); font-style: italic; font-size:
|
|
227
|
+
.wgd-preview-empty { color: var(--wgd-muted); font-style: italic; font-size: var(--wgd-font-size-sm); }
|
|
222
228
|
.wgd-readonly [inert] .wgd-input,
|
|
223
229
|
.wgd-readonly [inert] .wgd-select,
|
|
224
230
|
.wgd-readonly [inert] .wgd-textarea,
|
|
@@ -234,62 +240,62 @@ ${kr}
|
|
|
234
240
|
.wgd-panels { flex: 1 1 460px; min-width: 340px; display: flex; flex-direction: column; gap: 8px; }
|
|
235
241
|
.wgd-side { flex: 1 1 420px; min-width: 320px; display: flex; flex-direction: column; gap: 8px; position: sticky; top: 8px; }
|
|
236
242
|
.wgd-preview-pane { display: flex; flex-direction: column; gap: 8px; }
|
|
237
|
-
.wgd-section { border: 1px solid var(--wgd-border); border-radius:
|
|
243
|
+
.wgd-section { border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius-lg); padding: 6px 10px; background: var(--wgd-panel); }
|
|
238
244
|
.wgd-section-title { cursor: pointer; font-weight: 600; }
|
|
239
245
|
.wgd-section-body { display: flex; flex-direction: column; gap: 8px; padding-top: 8px; }
|
|
240
246
|
.wgd-field { display: flex; flex-direction: column; gap: 2px; }
|
|
241
|
-
.wgd-field-label { color: var(--wgd-muted); font-size:
|
|
242
|
-
.wgd-input, .wgd-textarea, .wgd-select { font: inherit; padding: 4px 6px; border: 1px solid var(--wgd-border); border-radius:
|
|
247
|
+
.wgd-field-label { color: var(--wgd-muted); font-size: var(--wgd-font-size-sm); }
|
|
248
|
+
.wgd-input, .wgd-textarea, .wgd-select { font: inherit; padding: 4px 6px; border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius); background: var(--wgd-bg); color: var(--wgd-text); }
|
|
243
249
|
/* Textareas fill their panel regardless of the intrinsic cols width. */
|
|
244
|
-
.wgd-textarea { font-family:
|
|
245
|
-
.wgd-preview .wg-designer-action { position: relative; outline: 1px dashed var(--wgd-muted
|
|
246
|
-
.wgd-preview .wg-designer-action::after { content: "\u26A1 action"; position: absolute; top: -0.9em; right: 0; font:
|
|
247
|
-
.wgd-binding { display: flex; flex-direction: column; gap: 6px; padding: 6px 8px; border: 1px dashed var(--wgd-border
|
|
248
|
-
.wgd-binding-field { min-width: 8ch; font-family:
|
|
250
|
+
.wgd-textarea { font-family: var(--wgd-font-mono); white-space: pre; width: 100%; box-sizing: border-box; min-width: 0; resize: vertical; }
|
|
251
|
+
.wgd-preview .wg-designer-action { position: relative; outline: 1px dashed var(--wgd-muted); outline-offset: 2px; }
|
|
252
|
+
.wgd-preview .wg-designer-action::after { content: "\u26A1 action"; position: absolute; top: -0.9em; right: 0; font: calc(var(--wgd-font-size-xs) - 1px) var(--wgd-font); color: var(--wgd-muted); background: var(--wgd-panel); padding: 0 4px; border-radius: var(--wgd-radius-sm); pointer-events: none; }
|
|
253
|
+
.wgd-binding { display: flex; flex-direction: column; gap: 6px; padding: 6px 8px; border: 1px dashed var(--wgd-border); border-radius: var(--wgd-radius); margin: 4px 0; }
|
|
254
|
+
.wgd-binding-field { min-width: 8ch; font-family: var(--wgd-font-mono); font-size: var(--wgd-font-size-sm); }
|
|
249
255
|
.wgd-action-definition { display: flex; flex-direction: column; gap: 6px; }
|
|
250
256
|
.wgd-action-schema { display: flex; flex-direction: column; gap: 4px; padding: 4px 0; }
|
|
251
|
-
.wgd-test-output { font:
|
|
252
|
-
.wgd-diagnostic { color: var(--wgd-danger); font-size:
|
|
253
|
-
.wgd-banner { border: 1px solid var(--wgd-danger-line); background: var(--wgd-danger-bg); color: var(--wgd-danger); border-radius:
|
|
257
|
+
.wgd-test-output { font: var(--wgd-font-size-sm) var(--wgd-font-mono); white-space: pre-wrap; word-break: break-all; max-height: 240px; overflow: auto; margin: 6px 0 0; }
|
|
258
|
+
.wgd-diagnostic { color: var(--wgd-danger); font-size: var(--wgd-font-size-sm); white-space: pre-wrap; }
|
|
259
|
+
.wgd-banner { border: 1px solid var(--wgd-danger-line); background: var(--wgd-danger-bg); color: var(--wgd-danger); border-radius: var(--wgd-radius-lg); padding: 8px 10px; margin-bottom: 8px; }
|
|
254
260
|
/* The preview is the WIDGET's surface, not chrome: it establishes the
|
|
255
261
|
--wg-* context (like composePage does for page output) so widget content
|
|
256
262
|
\u2014 including custom kinds the base stylesheet doesn't color \u2014 never
|
|
257
263
|
inherits the designer's own text/background. */
|
|
258
|
-
.wgd-preview { border: 1px dashed var(--wgd-border); border-radius:
|
|
264
|
+
.wgd-preview { border: 1px dashed var(--wgd-border); border-radius: var(--wgd-radius-lg); padding: 16px; background: var(--wg-bg); color: var(--wg-fg); }
|
|
259
265
|
.wgd-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
|
|
260
|
-
.wgd-button { font: inherit; padding: 4px 10px; border: 1px solid var(--wgd-border); border-radius:
|
|
266
|
+
.wgd-button { font: inherit; padding: 4px 10px; border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius); background: var(--wgd-bg); color: var(--wgd-text); cursor: pointer; }
|
|
261
267
|
.wgd-button:hover { background: var(--wgd-hover); }
|
|
262
268
|
.wgd-tab-active { background: var(--wgd-accent-bg); border-color: var(--wgd-accent); }
|
|
263
269
|
/* Shared tree/editor chrome (JSON tree, schema builder/form, template tree) */
|
|
264
270
|
.wgd-jt-children, .wgd-children { margin-left: 10px; padding-left: 10px; border-left: 2px solid var(--wgd-line); display: flex; flex-direction: column; gap: 4px; }
|
|
265
271
|
.wgd-jt-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
|
|
266
272
|
.wgd-jt-entry { padding: 2px 0; }
|
|
267
|
-
.wgd-jt-key { font-family:
|
|
273
|
+
.wgd-jt-key { font-family: var(--wgd-font-mono); color: var(--wgd-muted); min-width: 2ch; }
|
|
268
274
|
.wgd-jt-keyinput, .wgd-jt-type { max-width: 12ch; }
|
|
269
|
-
.wgd-jt-summary { cursor: pointer; color: var(--wgd-muted); font-size:
|
|
270
|
-
.wgd-sf-object { border: 1px solid var(--wgd-line); border-radius:
|
|
275
|
+
.wgd-jt-summary { cursor: pointer; color: var(--wgd-muted); font-size: var(--wgd-font-size-sm); }
|
|
276
|
+
.wgd-sf-object { border: 1px solid var(--wgd-line); border-radius: var(--wgd-radius-lg); padding: 6px 10px; margin: 4px 0; }
|
|
271
277
|
/* Schema builder: property name + type + required on one row. */
|
|
272
278
|
.wgd-sb-node { margin-left: 8px; padding: 1px 0 1px 8px; border-left: 2px solid var(--wgd-line); }
|
|
273
279
|
.wgd-sb-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 1px 0; }
|
|
274
280
|
.wgd-sb-constraints { padding-left: 12px; }
|
|
275
|
-
.wgd-sb-label { color: var(--wgd-muted); font-size:
|
|
276
|
-
.wgd-sb-prop { flex: 1 1 auto; min-width: 6ch; font-family:
|
|
277
|
-
.wgd-sb-type { flex: 0 0 auto; max-width: 11ch; font-size:
|
|
278
|
-
.wgd-sb-req { display: flex; gap: 2px; align-items: center; color: var(--wgd-muted); font-size:
|
|
279
|
-
.wgd-sb-constraint { flex: 1 1 auto; min-width: 6ch; font-size:
|
|
281
|
+
.wgd-sb-label { color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); flex: 0 0 auto; }
|
|
282
|
+
.wgd-sb-prop { flex: 1 1 auto; min-width: 6ch; font-family: var(--wgd-font-mono); }
|
|
283
|
+
.wgd-sb-type { flex: 0 0 auto; max-width: 11ch; font-size: var(--wgd-font-size-sm); }
|
|
284
|
+
.wgd-sb-req { display: flex; gap: 2px; align-items: center; color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); flex: 0 0 auto; }
|
|
285
|
+
.wgd-sb-constraint { flex: 1 1 auto; min-width: 6ch; font-size: var(--wgd-font-size-sm); }
|
|
280
286
|
.wgd-sb-root { padding: 2px 0 2px 8px; border-left: 2px solid transparent; }
|
|
281
287
|
/* Schema builder: the template tree's flat discipline \u2014 chrome on
|
|
282
288
|
hover/focus only, removal revealed by the row, fitted type selects. */
|
|
283
|
-
.wgd-schemabuilder .wgd-input, .wgd-schemabuilder .wgd-select { padding: 1px 4px; font-size:
|
|
289
|
+
.wgd-schemabuilder .wgd-input, .wgd-schemabuilder .wgd-select { padding: 1px 4px; font-size: var(--wgd-font-size-sm); border-color: transparent; background: transparent; }
|
|
284
290
|
.wgd-schemabuilder .wgd-input:hover, .wgd-schemabuilder .wgd-select:hover,
|
|
285
291
|
.wgd-schemabuilder .wgd-input:focus, .wgd-schemabuilder .wgd-select:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
|
|
286
292
|
.wgd-schemabuilder .wgd-sb-type { flex: 0 0 auto; box-sizing: border-box; max-width: none; color: var(--wgd-accent); }
|
|
287
|
-
.wgd-schemabuilder .wgd-sb-prop { font-size:
|
|
288
|
-
.wgd-sb-row { border-radius:
|
|
293
|
+
.wgd-schemabuilder .wgd-sb-prop { font-size: var(--wgd-font-size-sm); color: var(--wgd-hl-key); }
|
|
294
|
+
.wgd-sb-row { border-radius: var(--wgd-radius-sm); }
|
|
289
295
|
.wgd-sb-row:hover { background: var(--wgd-hover); }
|
|
290
296
|
.wgd-sb-row > .wgd-icon { visibility: hidden; }
|
|
291
297
|
.wgd-sb-row:hover > .wgd-icon, .wgd-sb-row:focus-within > .wgd-icon { visibility: visible; }
|
|
292
|
-
.wgd-schemabuilder .wgd-button { font-size:
|
|
298
|
+
.wgd-schemabuilder .wgd-button { font-size: var(--wgd-font-size-xs); padding: 0 6px; border-color: transparent; color: var(--wgd-accent); background: none; }
|
|
293
299
|
.wgd-schemabuilder .wgd-button:hover { border-color: var(--wgd-border); background: var(--wgd-hover); }
|
|
294
300
|
.wgd-remove { color: var(--wgd-danger); }
|
|
295
301
|
/* Breathing room between a tab strip and its active pane. */
|
|
@@ -298,18 +304,18 @@ ${kr}
|
|
|
298
304
|
Controls stay flat (chrome appears on hover/focus) so a deep template
|
|
299
305
|
reads like the JSON it projects, not like a form. */
|
|
300
306
|
.wgd-node { padding: 0 0 0 4px; }
|
|
301
|
-
.wgd-node-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 1px 0; border-radius:
|
|
307
|
+
.wgd-node-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 1px 0; border-radius: var(--wgd-radius-sm); }
|
|
302
308
|
.wgd-node-row:hover { background: var(--wgd-hover); }
|
|
303
|
-
.wgd-node-badge { font-family:
|
|
309
|
+
.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; }
|
|
304
310
|
.wgd-node-icons { display: flex; gap: 2px; margin-left: auto; flex: 0 0 auto; visibility: hidden; }
|
|
305
311
|
.wgd-node-row:hover > .wgd-node-icons, .wgd-node-row:focus-within > .wgd-node-icons { visibility: visible; }
|
|
306
312
|
.wgd-node-value { flex: 1 1 auto; min-width: 4ch; }
|
|
307
|
-
.wgd-icon { font: inherit; font-size:
|
|
313
|
+
.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); }
|
|
308
314
|
.wgd-icon:hover { background: var(--wgd-hover); }
|
|
309
315
|
/* Compact controls: inside tree nodes, and wherever a section opts in with
|
|
310
316
|
.wgd-compact (the Load action editor mirrors an element's binding editor). */
|
|
311
317
|
.wgd-node .wgd-input, .wgd-node .wgd-select,
|
|
312
|
-
.wgd-compact .wgd-input, .wgd-compact .wgd-select { padding: 1px 4px; font-size:
|
|
318
|
+
.wgd-compact .wgd-input, .wgd-compact .wgd-select { padding: 1px 4px; font-size: var(--wgd-font-size-sm); border-color: transparent; background: transparent; }
|
|
313
319
|
.wgd-node .wgd-input:hover, .wgd-node .wgd-select:hover, .wgd-compact .wgd-input:hover, .wgd-compact .wgd-select:hover,
|
|
314
320
|
.wgd-node .wgd-input:focus, .wgd-node .wgd-select:focus, .wgd-compact .wgd-input:focus, .wgd-compact .wgd-select:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
|
|
315
321
|
.wgd-compact .wgd-binding { border: none; padding: 0; }
|
|
@@ -319,82 +325,82 @@ ${kr}
|
|
|
319
325
|
@keyframes wgd-spin { to { transform: rotate(360deg); } }
|
|
320
326
|
.wgd-tagwrap, .wgd-pathwrap { display: contents; }
|
|
321
327
|
/* Collapse chevron: every tree row reserves the column so values align. */
|
|
322
|
-
.wgd-chevron { flex: 0 0 auto; width: 16px; padding: 0; border: none; background: none; color: var(--wgd-muted); font-size:
|
|
328
|
+
.wgd-chevron { flex: 0 0 auto; width: 16px; padding: 0; border: none; background: none; color: var(--wgd-muted); font-size: calc(var(--wgd-font-size-xs) - 1px); cursor: pointer; }
|
|
323
329
|
.wgd-chevron-none { visibility: hidden; }
|
|
324
|
-
.wgd-node-summary { color: var(--wgd-muted); font-size:
|
|
330
|
+
.wgd-node-summary { color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); flex: 0 0 auto; }
|
|
325
331
|
/* Attrs vs children: attributes group under a dotted muted rail with
|
|
326
332
|
key-colored names; children keep the solid accent rail. */
|
|
327
333
|
.wgd-attrs { margin-left: 14px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
|
|
328
334
|
.wgd-attr-row { display: flex; gap: 4px; align-items: center; flex-wrap: nowrap; padding: 0; }
|
|
329
335
|
.wgd-attr-row > .wgd-icon { visibility: hidden; }
|
|
330
336
|
.wgd-attr-row:hover > .wgd-icon, .wgd-attr-row:focus-within > .wgd-icon { visibility: visible; }
|
|
331
|
-
.wgd-attr-name { font-family:
|
|
332
|
-
.wgd-attr-prefix { flex: 0 1 auto; min-width: 6ch; max-width: 10ch; font-family:
|
|
337
|
+
.wgd-attr-name { font-family: var(--wgd-font-mono); color: var(--wgd-hl-key); flex: 0 1 auto; min-width: 5ch; }
|
|
338
|
+
.wgd-attr-prefix { flex: 0 1 auto; min-width: 6ch; max-width: 10ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-str); }
|
|
333
339
|
.wgd-attr { display: flex; flex-direction: column; gap: 1px; }
|
|
334
340
|
/* Transform block under a bind attr: one more dotted level in. */
|
|
335
341
|
.wgd-attr-map { margin-left: 24px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
|
|
336
342
|
.wgd-attr-map-default { flex: 1 1 auto; min-width: 8ch; }
|
|
337
|
-
.wgd-attr-mode { flex: 0 0 auto; color: var(--wgd-muted); font-size:
|
|
343
|
+
.wgd-attr-mode { flex: 0 0 auto; color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); }
|
|
338
344
|
.wgd-children { margin-left: 14px; padding-left: 8px; border-left: 2px solid var(--wgd-accent-line); gap: 1px; }
|
|
339
345
|
.wgd-slot { display: flex; flex-direction: column; gap: 1px; }
|
|
340
|
-
.wgd-slot-label { color: var(--wgd-muted); font-size:
|
|
346
|
+
.wgd-slot-label { color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); font-style: italic; padding-left: 4px; }
|
|
341
347
|
/* Add menu: one toggle, options in a popover. */
|
|
342
348
|
.wgd-menuwrap { position: relative; display: inline-flex; }
|
|
343
349
|
.wgd-menu-toggle { color: var(--wgd-accent); }
|
|
344
|
-
.wgd-menu { position: absolute; top: 100%; left: 0; z-index: 10; min-width: 9ch; display: flex; flex-direction: column; background: var(--wgd-panel); border: 1px solid var(--wgd-border); border-radius:
|
|
350
|
+
.wgd-menu { position: absolute; top: 100%; left: 0; z-index: 10; min-width: 9ch; display: flex; flex-direction: column; background: var(--wgd-panel); border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius); box-shadow: var(--wgd-shadow); padding: 2px; }
|
|
345
351
|
/* An OPEN menu must not inherit the icons' hover-gated visibility:
|
|
346
352
|
visibility (unlike display) lets a child re-assert visible. */
|
|
347
353
|
.wgd-menu:not([hidden]) { visibility: visible; }
|
|
348
354
|
.wgd-menuwrap:has(> .wgd-menu:not([hidden])) { visibility: visible; }
|
|
349
355
|
/* Menus in the right-aligned icons area hang leftward, not off-panel. */
|
|
350
356
|
.wgd-node-icons .wgd-menu { left: auto; right: 0; }
|
|
351
|
-
.wgd-menu-item { font: inherit; font-size:
|
|
357
|
+
.wgd-menu-item { font: inherit; font-size: var(--wgd-font-size-sm); text-align: left; padding: 3px 8px; border: none; border-radius: var(--wgd-radius-sm); background: none; color: var(--wgd-text); cursor: pointer; white-space: nowrap; }
|
|
352
358
|
.wgd-menu-item:hover { background: var(--wgd-accent-bg); color: var(--wgd-accent); }
|
|
353
359
|
/* Styles tree: selector rows with declaration rows \u2014 the same flat
|
|
354
360
|
template-tree discipline (flat inputs, hover-revealed icons). */
|
|
355
361
|
.wgd-styles { display: flex; flex-direction: column; gap: 2px; }
|
|
356
|
-
.wgd-st-row { display: flex; gap: 4px; align-items: center; border-radius:
|
|
362
|
+
.wgd-st-row { display: flex; gap: 4px; align-items: center; border-radius: var(--wgd-radius-sm); }
|
|
357
363
|
.wgd-st-row:hover { background: var(--wgd-hover); }
|
|
358
364
|
.wgd-st-row:hover > .wgd-node-icons, .wgd-st-row:focus-within > .wgd-node-icons { visibility: visible; }
|
|
359
|
-
.wgd-styles .wgd-input { padding: 1px 4px; font-size:
|
|
365
|
+
.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; }
|
|
360
366
|
.wgd-styles .wgd-input:hover, .wgd-styles .wgd-input:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
|
|
361
367
|
.wgd-st-selector { flex: 1 1 auto; min-width: 8ch; color: var(--wgd-accent); }
|
|
362
368
|
.wgd-st-decls { margin-left: 14px; padding-left: 8px; border-left: 2px dotted var(--wgd-border); display: flex; flex-direction: column; gap: 1px; }
|
|
363
|
-
.wgd-st-decl { display: flex; gap: 2px; align-items: center; border-radius:
|
|
369
|
+
.wgd-st-decl { display: flex; gap: 2px; align-items: center; border-radius: var(--wgd-radius-sm); }
|
|
364
370
|
.wgd-st-decl:hover { background: var(--wgd-hover); }
|
|
365
371
|
.wgd-st-decl > .wgd-icon { visibility: hidden; }
|
|
366
372
|
.wgd-st-decl:hover > .wgd-icon, .wgd-st-decl:focus-within > .wgd-icon { visibility: visible; }
|
|
367
373
|
.wgd-st-prop { flex: 0 1 auto; min-width: 8ch; color: var(--wgd-hl-key); }
|
|
368
374
|
.wgd-st-value { flex: 1 1 auto; min-width: 8ch; }
|
|
369
375
|
.wgd-st-colon { color: var(--wgd-muted); flex: 0 0 auto; }
|
|
370
|
-
.wgd-st-add { font-size:
|
|
376
|
+
.wgd-st-add { font-size: var(--wgd-font-size-xs); padding: 0 6px; border-color: transparent; color: var(--wgd-accent); background: none; }
|
|
371
377
|
.wgd-st-add:hover { border-color: var(--wgd-border); background: var(--wgd-hover); }
|
|
372
378
|
/* Import and export stack as sibling sections with the column's rhythm. */
|
|
373
379
|
.wgd-io { display: flex; flex-direction: column; gap: 8px; }
|
|
374
380
|
/* Flat string\u2192string record rows (hints): mono keys, prose values. */
|
|
375
381
|
.wgd-record { display: flex; flex-direction: column; gap: 1px; }
|
|
376
|
-
.wgd-rec-row { display: flex; gap: 2px; align-items: center; border-radius:
|
|
382
|
+
.wgd-rec-row { display: flex; gap: 2px; align-items: center; border-radius: var(--wgd-radius-sm); }
|
|
377
383
|
.wgd-rec-row:hover { background: var(--wgd-hover); }
|
|
378
384
|
.wgd-rec-row > .wgd-icon { visibility: hidden; }
|
|
379
385
|
.wgd-rec-row:hover > .wgd-icon, .wgd-rec-row:focus-within > .wgd-icon { visibility: visible; }
|
|
380
|
-
.wgd-record .wgd-input { padding: 1px 4px; font-size:
|
|
386
|
+
.wgd-record .wgd-input { padding: 1px 4px; font-size: var(--wgd-font-size-sm); border-color: transparent; background: transparent; }
|
|
381
387
|
.wgd-record .wgd-input:hover, .wgd-record .wgd-input:focus { border-color: var(--wgd-border); background: var(--wgd-bg); }
|
|
382
|
-
.wgd-rec-key { flex: 0 1 auto; min-width: 8ch; font-family:
|
|
388
|
+
.wgd-rec-key { flex: 0 1 auto; min-width: 8ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-key); }
|
|
383
389
|
.wgd-rec-value { flex: 1 1 auto; min-width: 8ch; }
|
|
384
390
|
/* The tag select IS the element node's label: flat, accent, monospace.
|
|
385
391
|
Tag and path selects are width-fitted to their SELECTED value by the
|
|
386
392
|
panel (fitSelect), so carets hug the text \u2014 no flex stretching here. */
|
|
387
|
-
.wgd-node .wgd-tag { flex: 0 0 auto; font-family:
|
|
393
|
+
.wgd-node .wgd-tag { flex: 0 0 auto; font-family: var(--wgd-font-mono); font-size: var(--wgd-font-size-xs); color: var(--wgd-accent); background: var(--wgd-accent-bg); border: 1px solid transparent; border-radius: var(--wgd-radius-sm); padding: 0 4px; }
|
|
388
394
|
.wgd-node .wgd-tag:hover, .wgd-node .wgd-tag:focus { border-color: var(--wgd-accent-line); }
|
|
389
|
-
.wgd-node .wgd-path { flex: 0 1 auto; min-width: 6ch; max-width: 100%; font-family:
|
|
395
|
+
.wgd-node .wgd-path { flex: 0 1 auto; min-width: 6ch; max-width: 100%; font-family: var(--wgd-font-mono); }
|
|
390
396
|
.wgd-node .wgd-select { box-sizing: border-box; }
|
|
391
397
|
/* Theme panel: swatch beside each color token. */
|
|
392
398
|
/* Syntax coloring: <pre> layer behind a transparent-text textarea. Every
|
|
393
399
|
metric here must mirror .wgd-textarea or the glyphs drift apart. */
|
|
394
400
|
.wgd-hlwrap { position: relative; }
|
|
395
401
|
.wgd-hl, .wgd-hl-input {
|
|
396
|
-
font-family:
|
|
397
|
-
padding: 4px 6px; border: 1px solid transparent; border-radius:
|
|
402
|
+
font-family: var(--wgd-font-mono); font-size: var(--wgd-font-size); line-height: 1.45;
|
|
403
|
+
padding: 4px 6px; border: 1px solid transparent; border-radius: var(--wgd-radius);
|
|
398
404
|
box-sizing: border-box; white-space: pre; tab-size: 2; letter-spacing: normal;
|
|
399
405
|
}
|
|
400
406
|
.wgd-hl {
|
|
@@ -411,23 +417,23 @@ textarea.wgd-hl-input {
|
|
|
411
417
|
.wgd-hl-n { color: var(--wgd-hl-num); }
|
|
412
418
|
.wgd-hl-b { color: var(--wgd-hl-bool); }
|
|
413
419
|
.wgd-hl-p { color: var(--wgd-hl-punct); }
|
|
414
|
-
.wgd-swatch { flex: 0 0 auto; width: 26px; height: 22px; padding: 0; border: 1px solid var(--wgd-border); border-radius:
|
|
420
|
+
.wgd-swatch { flex: 0 0 auto; width: 26px; height: 22px; padding: 0; border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius); background: none; cursor: pointer; }
|
|
415
421
|
.wgd-token-row { display: flex; gap: 6px; align-items: center; }
|
|
416
|
-
.wgd-token-row .wgd-input { flex: 1 1 auto; min-width: 6ch; font-family:
|
|
422
|
+
.wgd-token-row .wgd-input { flex: 1 1 auto; min-width: 6ch; font-family: var(--wgd-font-mono); font-size: var(--wgd-font-size-sm); }
|
|
417
423
|
.wgd-token-ref { display: flex; flex-direction: column; gap: 2px; max-height: 220px; overflow-y: auto; margin-top: 4px; }
|
|
418
|
-
.wgd-token-ref-row { display: flex; gap: 6px; align-items: center; font-size:
|
|
419
|
-
.wgd-token-ref-swatch { flex: 0 0 auto; width: 14px; height: 14px; border: 1px solid var(--wgd-border); border-radius:
|
|
424
|
+
.wgd-token-ref-row { display: flex; gap: 6px; align-items: center; font-size: var(--wgd-font-size-xs); }
|
|
425
|
+
.wgd-token-ref-swatch { flex: 0 0 auto; width: 14px; height: 14px; border: 1px solid var(--wgd-border); border-radius: var(--wgd-radius-sm); }
|
|
420
426
|
.wgd-token-ref-noswatch { border-style: dashed; opacity: 0.35; }
|
|
421
|
-
.wgd-token-ref-name { font-family:
|
|
427
|
+
.wgd-token-ref-name { font-family: var(--wgd-font-mono); color: var(--wgd-accent); }
|
|
422
428
|
.wgd-token-ref-value { color: var(--wgd-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
423
429
|
.wgd-token-ref-details summary { cursor: pointer; }
|
|
424
|
-
`,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
|
|
425
|
-
`)),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=()=>{
|
|
430
|
+
`,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 Yt=/("(?:[^"\\]|\\.)*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|\b(true|false|null)\b|([{}[\],:])/g;function Vr(e){let t=[],n=0,r;for(Yt.lastIndex=0;(r=Yt.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=Yt.lastIndex;return n<e.length&&t.push({cls:"",text:e.slice(n)}),t}function Rn(e,t){let n=[];for(let r of Vr(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(`
|
|
431
|
+
`)),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=()=>{Rn(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&&Rn(t,e.value)}function Zt(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 Ur(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 Kr(e){return JSON.stringify(e.theme??{},null,2)}function Fr(e){let t;try{t=JSON.parse(e)}catch(r){return{ok:!1,errors:[`Invalid JSON: ${se(r)}`]}}let n=Zt(t);return n.length>0?{ok:!1,errors:n}:{ok:!0,definition:t}}function Qt(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 qr(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 Gr(e){return`import type { CustomWidget } from "./index.js";
|
|
426
432
|
|
|
427
|
-
export const ${
|
|
428
|
-
`}function
|
|
429
|
-
`);return}r.hidden=!0,r.textContent="",Yt(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",()=>_r(e.get())),n("Export theme JSON",()=>Hr(e.get())),n("Copy as TypeScript",()=>Vr(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 Ur=["string","number","boolean","null","object","array"];function Zt(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function zr(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 Fr(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 jn(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 Ur)w.append(s("option",{value:f},[f]));return w.value=Zt(p),w.addEventListener("change",()=>i(ve(n,m,zr(w.value,p)))),w}function g(p,m){let w=Zt(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 b=s("div",{class:"wgd-jt-row"},[p,a(m,w)]),v=Zt(m);if(v!=="object"&&v!=="array"&&b.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))),b.append(k)}let S=s("div",{class:"wgd-jt-entry"},[b]);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 b=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);b.addEventListener("click",()=>i(ve(n,[...m,p.length],""))),w.append(s("div",{class:"wgd-toolbar"},[b]))}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(Fr(n,m,v,k.value))),w.append(c(k,S,[...m,v],!0))}let b=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);b.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"},[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"} }`]),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 Rn=["object","array","string","number","integer","boolean","null","any"],$n=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 Rn)f.append(s("option",{value:T},[T]));let b=c.type,v=Array.isArray(b)?b.filter(T=>typeof T=="string"):void 0,S=v?.includes("null")??!1,k=typeof b=="string"?b:v?.find(T=>T!=="null")??(S?"null":"any");f.value=Rn.some(T=>T===k)?k:"any",ye(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)),$n.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 C=[];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))),C.push(s("span",{class:"wgd-sb-label"},["pattern"]),T)}let J=G(void 0);if($n.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()===""){J.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");J.hidden=!0,l(o(c,"enum",_))}catch(_){J.hidden=!1,J.textContent=`enum ignored: ${se(_)}`}}),C.push(s("span",{class:"wgd-sb-label"},["enum"]),T)}if(C.length>0&&w.push(s("div",{class:"wgd-sb-row wgd-sb-constraints"},C),J),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 y=s("input",{type:"text",class:"wgd-input wgd-sb-prop",placeholder:"property name"});y.value=M,y.addEventListener("change",()=>{let $=Object.entries(T).map(([W,D])=>W===M?[y.value,D]:[W,D]),H=_.map(W=>W===M?y.value:W);l(o(o(c,"properties",Object.fromEntries($)),"required",H.length>0?H:void 0))});let j=s("input",{type:"checkbox",title:"required"});j.checked=_.includes(M),j.addEventListener("change",()=>{let $=j.checked?[..._,M]:_.filter(H=>H!==M);l(o(c,"required",$.length>0?$:void 0))});let P=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);P.addEventListener("click",()=>{let{[M]:$,...H}=T;l(o(o(c,"properties",Object.keys(H).length>0?H:void 0),"required",_.filter(W=>W!==M).length>0?_.filter(W=>W!==M):void 0))}),F.append(a(x(E)?E:{},$=>l(o(c,"properties",{...T,[M]:$})),u+1,[y],[s("label",{class:"wgd-sb-req",title:"required"},[j,"req"]),P]))}let z=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);z.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"},[z])),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 xt(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})),b=s("button",{class:"wgd-icon",type:"button",title:"Remove entry"},["\u2715"]);return b.addEventListener("click",()=>{let{[p]:v,...S}=c;o(S)}),s("div",{class:"wgd-rec-row"},[w,s("span",{class:"wgd-st-colon"},[":"]),f,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 g(),{element:i,getValue:()=>r,setValue(c){i.contains(document.activeElement)||(r=c,g())}}}function Wn(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 Ye(e){if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];switch(Wn(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]=Ye(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 kt(e,t,n){let r=t??Ye(e),i=s("div",{class:"wgd-schemaform"});function o(u,p,m,w=!1){if(p.length===0)return m;let[f,...b]=p;if(Array.isArray(u)){let S=[...u];return b.length===0&&w?S.splice(f,1):S[f]=o(S[f],b,m,w),S}let v=x(u)?{...u}:{};return b.length===0&&w?delete v[f]:v[f]=o(v[f],b,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 b of u.enum)f.append(s("option",{value:JSON.stringify(b)},[JSON.stringify(b)]));return f.value=JSON.stringify(p??u.enum[0]),f.addEventListener("change",()=>a(m,JSON.parse(f.value))),c(w,f)}switch(Wn(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 b=Number(f.value);a(m,Number.isFinite(b)?b:0)}),c(w,f)}case"object":{let f=s("div",{class:"wgd-jt-children"}),b=x(u.properties)?u.properties:{},v=Array.isArray(u.required)?u.required:[],S=x(p)?p:{};for(let[k,N]of Object.entries(b)){if(!x(N))continue;let R=v.includes(k);f.append(g(N,S[k]??(R?Ye(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:{},b=Array.isArray(p)?p:[],v=s("div",{class:"wgd-jt-children"});b.forEach((k,N)=>{let R=s("div",{class:"wgd-jt-entry"},[g(f,k,[...m,N],`#${N}`)]),C=s("button",{class:"wgd-icon",type:"button",title:"Remove item"},["\u2715"]);C.addEventListener("click",()=>{r=o(r,[...m,N],void 0,!0),n(r),l()}),R.append(C),v.append(R)});let S=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);return S.addEventListener("click",()=>a([...m,b.length],Ye(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??Ye(e),l())}}}function Pn(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",b=>{let v=Object.entries(u).map(([S,k])=>S===c?[b,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]:b,...v}=u;i(v)});let f=Object.entries(l).map(([b,v])=>{let S=o(b,"property","wgd-input wgd-st-prop",R=>{let C=Object.entries(l).map(([J,T])=>J===b?[R,T]:[J,T]);i({...u,[c]:Object.fromEntries(C)})}),k=o(v,"value (no url(...), no ;)","wgd-input wgd-st-value",R=>{i({...u,[c]:{...l,[b]:R}})}),N=s("button",{class:"wgd-icon",type:"button",title:"Remove declaration"},["\u2715"]);return N.addEventListener("click",()=>{let{[b]:R,...C}=l;i({...u,[c]:C})}),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 Et(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}),Et(o,a,n,r+1)}}function St(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 Cn(e,t){if(e===void 0||t===void 0)return!1;let n=r=>r==="integer"?"number":r;return n(e)!==n(t)}function Ze(e){let t=[];return Et(e,"",t),t.map(n=>n.path)}var In="__custom__";function Mn(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function Hn(){return{kind:"http",method:"GET",url:"https://api.example.com/resource",input:{type:"object",properties:{}},output:{type:"object"}}}function Tt(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,ye(i),i.addEventListener("change",()=>r(i.value)),i}function pe(e){return s("span",{class:"wgd-field-label"},[e])}function Qe(e){let t=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return t.addEventListener("click",e),t}function At(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:In},["custom\u2026"])),o.value=e,ye(o);let c=ke(e,i,n,r);return c.hidden=!0,o.addEventListener("change",()=>{if(o.value===In){c.hidden=!1,c.focus();return}c.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,c])}function _n(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),b=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[b,S]}return[b,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 b=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,C])=>R===w?[k,C]:[R,C]);c(Object.fromEntries(N))},n.name),v=u(f,k=>c({...i,[w]:k})),S=Qe(()=>{let{[w]:k,...N}=i;c(N)});a.append(s("div",{class:"wgd-rec-row"},[b,...v,S]))}o.forEach((w,f)=>{let b=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=Qe(()=>{o.splice(f,1),p()});a.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[b,...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 Kr(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 b=[...n];b[l]=f==="bind"?{bind:"."}:"",i(b)}),m=ke(u?c.bind:c,"wgd-input wgd-rec-value",f=>{let b=[...n];b[l]=u?{bind:f}:f,i(b)},u?"data path":"text"),w=Qe(()=>i(n.filter((f,b)=>b!==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 Qt(e,t,n){let r=ie(e??Mn()),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(b,v){r=b,n(ie(r)),v==="all"?f():v==="schemas"&&m()}function u(b,v){let S=Ve(c()[v],R=>{l({...c(),[v]:R??{type:"object"}},"none")}),k=[pe(b),S.element],N=t.schemas??[];if(N.length>0){let R=he([{value:"",label:"copy a shared schema into this action\u2026"},...N.map(C=>({value:C.name}))],"","wgd-select",C=>{let J=N.find(T=>T.name===C);J&&l({...c(),[v]:ie(J.schema)},"schemas")});k.push(s("div",{class:"wgd-row"},[R,pe("(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 b=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"?Hn():Mn(),"all"));if(i.append(s("div",{class:"wgd-row"},[pe("Kind"),b])),r.kind==="prompt"){i.append(pe("Message (literals and bound values; the user reviews and sends it)"),Kr(r.text,k=>l({kind:"prompt",text:k},"none")));return}let v=he(Fe.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"},[pe("Method"),v]),s("label",{class:"wgd-field"},[pe("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 b=t.secretNames??[];a.append(pe("Headers"),_n(r.headers,b,{add:"+ header",name:"header"},v=>{let{headers:S,...k}=c();l(v===void 0?k:{...k,headers:v},"none")}),pe("Fixed query parameters"),_n(r.query,b,{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(b){r=ie(b),f()}}}function Dt(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 Tt(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"?(b(),v()):R==="input"?b():R==="output"&&v()}function m(N,R,C){return{...Tt(N)?{ref:N.ref}:{definition:N.definition},...R!==void 0&&Object.keys(R).length>0?{input:R}:{},...C!==void 0&&Object.keys(C).length>0?{output:C}:{}}}function w(){return["$index","$parent","$root",...Ze(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":Tt(r)?"shared":"inline",C=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:Hn()},"all")});if(i.append(s("div",{class:"wgd-row"},[C])),r===void 0)return;if(Tt(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)`})),z=he(F,T,"wgd-select wgd-binding-ref",M=>p(m({ref:M},l(),u()),"io"));i.append(s("div",{class:"wgd-row"},[pe("Action"),z]));return}let J=Qt(r.definition,t,T=>{p(m({definition:T},l(),u()),"io")});i.append(J.element)}function b(){o.replaceChildren();let N=c(r);if(r===void 0||N?.kind!=="http")return;let R=r,C=x(N.input.properties)?Object.keys(N.input.properties):[],J=t.scopePaths??Ze(t.getDataSchema?.()),T=[...new Set([...J,...w()])],_=l(),F=C.map(z=>{let M=_[z],E=x(M)&&"const"in M,y=he([{value:"path"},{value:"const"}],E?"const":"path","wgd-select wgd-attr-mode",$=>{p(m(R,{...l(),[z]:$==="const"?{const:""}:z},u()),"input")}),j=$=>{let H=l();if(E){let W;try{W=JSON.parse($)}catch{W=$}H[z]={const:W}}else $===""?delete H[z]:H[z]=$;p(m(R,H,u()),"none")},P=E?ke(JSON.stringify(M.const),"wgd-input wgd-rec-value",j,"JSON literal"):At(typeof M=="string"?M:"",T,j,"data path");return s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-rec-key wgd-binding-field"},[z]),y,P])});o.append(pe("Input mapping (field \u2190 data path or constant)"),C.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,C=u(),J=C.mode??"merge",T=he(ze.map(F=>({value:F})),J,"wgd-select",F=>{let z={...u(),mode:F};F!=="patch"&&delete z.path,p(m(R,l(),z),"output")}),_=[pe("Output"),T];J==="patch"&&_.push(ke(C.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,C,F=>{let z=u();F===void 0?delete z.map:z.map=F,p(m(R,l(),z),"none")}))}function S(N,R,C){let J=s("div",{class:"wgd-record wgd-output-map"}),T=ie(R.map??{}),_=[],F=t.getDataSchema?.(),z=(R.mode??"merge")==="patch"&&R.path?R.path:"",M=z===""?F:St(F,z),E=Ze(M),y=[".",...Ze(N.output)],j=G(void 0);j.classList.add("wgd-type-mismatch");function P(D){T=D,C(Object.keys(T).length>0?T:void 0),W()}function $(D){j.hidden=!1,j.textContent=D}function H(D,L){let d=At(D,E,L,"target data path","wgd-input wgd-rec-key");return d.classList.add("wgd-map-target"),d}function W(){J.replaceChildren();let D=[];for(let[d,h]of Object.entries(T)){let A=xe(St(M,d)),I=xe(St(N.output,h));Cn(I,A)&&D.push(`'${h}' is ${I} in the response but '${z?`${z}.`:""}${d}' is ${A} in the widget schema`);let B=H(d,Y=>{if(Y===d)return;if(Y===""||Object.hasOwn(T,Y)){$(`'${Y||"(empty)"}' is already a projection target.`);return}let ee=Object.entries(T).map(([ne,le])=>ne===d?[Y,le]:[ne,le]);P(Object.fromEntries(ee))}),U=At(h,y,Y=>P({...T,[d]:Y}),"response path");U.classList.add("wgd-map-source");let K=Qe(()=>{let{[d]:Y,...ee}=T;P(ee)});J.append(s("div",{class:"wgd-rec-row"},[B,s("span",{class:"wgd-st-colon"},["\u2190"]),U,K]))}_.forEach((d,h)=>{let A=H("",U=>{if(U!==""){if(Object.hasOwn(T,U)){$(`'${U}' is already a projection target.`);return}_.splice(h,1),P({...T,[U]:d.source})}}),I=At(d.source,y,U=>{d.source=U,W()},"response path");I.classList.add("wgd-map-source");let B=Qe(()=>{_.splice(h,1),W()});J.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:""}),W()}),j.hidden=D.length===0,j.textContent=D.length===0?"":`Type mismatch: ${D.join("; ")}.`,J.append(s("div",{class:"wgd-row"},[L]),j)}return W(),J}function k(){f(),b(),v()}return k(),{element:g,setValue(N){r=N===void 0?void 0:ie(N),k()}}}function Oe(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 qr=new Set(be().kinds());function Gr(e){if(!x(e))return[];let t=[];for(let[n,r]of Object.entries(e)){if(Re({[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"||Re({".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 Ot(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.":qr.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=Oe(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=Gr(e.descriptor?.styles),e.load!==void 0){let a=qe(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=Ge(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 Bn(e,t){let n=[];Et(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 Xr(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 Lt=Symbol("remove");function en(e){let t="";for(let n of e){let r=typeof n=="number"?`children.${n}`:n;t=t===""?r:`${t}.${r}`}return t}function jt(e,t,n){if(t.length===0)return n===Lt?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===Lt?o.splice(r,1):o[r]=jt(o[r],i,n),{...e,children:o}}if(!x(e))return e;if(i.length===0&&n===Lt){let{[r]:o,...a}=e;return a}return{...e,[r]:jt(e[r],i,n)}}function Jn(e,t,n,r){let i=t.length===0?e:Yr(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:jt(e,t,c)}function Yr(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 Nt={text:()=>"text",bind:()=>({bind:"."}),element:()=>({tag:"div",children:[]}),each:()=>({each:".",template:"item"}),when:()=>({when:".",template:"shown"})};function Vn(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(y=>({...y,template:E}))}function f(E,y){w(jt(e.get().template,E,y))}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 b(E,y,j="wgd-input wgd-node-value"){let P=s("input",{type:"text",class:j});return P.value=E,P.addEventListener("change",()=>y(P.value)),P}let v=new Set;function S(E,y,j,P,$,H,W,D){let L=en(y),d=P.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),z()})):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(W&&W.count>1){if(W.index>0){let K=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);K.addEventListener("click",()=>w(Jn(e.get().template,W.parent,W.index,W.index-1))),B.push(K)}if(W.index<W.count-1){let K=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);K.addEventListener("click",()=>w(Jn(e.get().template,W.parent,W.index,W.index+1))),B.push(K)}}if(H){let K=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);K.addEventListener("click",()=>y.length===0?w(""):f(y,Lt)),B.push(K)}B.length>0&&I.push(s("span",{class:"wgd-node-icons"},B));let U=[s("div",{class:"wgd-node-row"},I)];return $!==void 0&&U.push(G($)),h||U.push(...P),s("div",{class:"wgd-node","data-path":L},U)}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,y,j,P,$="wgd-input wgd-node-value"){let H=x(y)?Bn(y,j):[];if(H.length===0)return b(E,P,$);let W=s("select",{class:"wgd-select wgd-path"}),D=H.includes(E);for(let h of D?H:[E,...H])W.append(s("option",{value:h},[h===E&&!D?`${h} (off-schema)`:h]));W.append(s("option",{value:"__custom__"},["custom\u2026"])),W.value=E,ye(W);let L=b(E,P,$);L.hidden=!0,W.addEventListener("change",()=>{if(W.value==="__custom__"){L.hidden=!1,L.focus();return}L.hidden=!0,P(W.value)});let d=$.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${d}`},[W,L])}function R(E,y){let j=s("select",{class:"wgd-select wgd-tag"}),P=k.includes(E)?k:[E,...k];for(let H of P)j.append(s("option",{value:H},[H]));j.append(s("option",{value:"__custom__"},["custom\u2026"])),j.value=E,ye(j);let $=b(E,y,"wgd-input wgd-tag-custom");return $.hidden=!0,j.addEventListener("change",()=>{if(j.value==="__custom__"){$.hidden=!1,$.focus();return}$.hidden=!0,y(j.value)}),s("span",{class:"wgd-tagwrap"},[j,$])}function C(E,y,j,P,$,H,W){let D=[...y,j];if(P===void 0){let L=qt(`+ ${E}`,`Set '${E}' to a node`,Object.keys(Nt),d=>{let h=Nt[d];h&&f(D,h())});return $?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]),J(P,D,H,!$,void 0,W)])}function J(E,y,j,P=!0,$,H){let W=en(y),D=j!==void 0&&(j===W||(j.startsWith(W===""?"attrs.":`${W}.attrs.`)||j.startsWith(W===""?"action":`${W}.action`))&&x(E)&&typeof E.tag=="string")?T:void 0;if(typeof E=="string")return S("text",y,[b(E,L=>f(y,L))],[],D,P,$);if(!x(E))return S("invalid",y,[s("code",void 0,[JSON.stringify(E)])],[],D??"Not a template node.",P,$);if(typeof E.bind=="string")return S("bind",y,[N(E.bind,H,"bind",L=>f(y,{bind:L}))],[],D,P,$);if(typeof E.each=="string")return S("each",y,[N(E.each,H,"each",L=>f(y,{...E,each:L}))],[C("template",y,"template",E.template,!0,j,Xr(H,E.each)),C("empty",y,"empty",E.empty,!1,j,H)],D,P,$,{summary:E.empty!==void 0?"template \xB7 empty":"template"});if(typeof E.when=="string")return S("when",y,[N(E.when,H,"when",L=>f(y,{...E,when:L}))],[C("template",y,"template",E.template,!0,j,H),C("else",y,"else",E.else,!1,j,H)],D,P,$,{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,Y])=>{let ee=x(Y)&&typeof Y.bind=="string"?Y:{bind:""},ne=x(Y)&&typeof Y.bind=="string",le=ne?ee:void 0,Ee=X=>{let de={bind:X.bind};return X.map!==void 0?(de.map=X.map,X.default!==void 0&&X.default!==""&&(de.default=X.default)):X.prefix!==void 0&&X.prefix!==""&&(de.prefix=X.prefix),de},we=X=>{f(y,{...E,attrs:{...L,[K]:X}})},ir=b(K,X=>{let de=Object.entries(L).map(([Le,dn])=>Le===K?[X,dn]:[Le,dn]);f(y,{...E,attrs:Object.fromEntries(de)})},"wgd-input wgd-attr-name"),Ne=s("select",{class:"wgd-select wgd-attr-mode"});Ne.append(s("option",{value:"literal"},["literal"])),Ne.append(s("option",{value:"bind"},["bind"])),Ne.value=ne?"bind":"literal",ye(Ne);let sn=b(String(ne?"":Y),X=>we(X),"wgd-input wgd-attr-value"),or=ne?N(ee.bind,H,"bind",X=>we(Ee({...ee,bind:X})),"wgd-input wgd-attr-value"):sn;Ne.addEventListener("change",()=>{let X=ne?ee.bind:sn.value;we(Ne.value==="bind"?{bind:X||"."}:X)});let Wt=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);Wt.addEventListener("click",()=>{let{[K]:X,...de}=L;f(y,{...E,attrs:de})});let rt=[ir,Ne,or],Pt=le?.map!==void 0,sr=le?.prefix!==void 0&&le.prefix!=="";if(ne&&!Pt){let X=b(le?.prefix??"",de=>we(Ee({...ee,map:void 0,prefix:de})),"wgd-input wgd-attr-prefix");X.placeholder="prefix",X.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",rt.push(X)}if(ne&&!Pt&&!sr){let X=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);X.addEventListener("click",()=>we(Ee({...ee,prefix:void 0,map:{}}))),rt.push(s("span",{class:"wgd-node-icons"},[X,Wt]))}else rt.push(Wt);let an=s("div",{class:"wgd-attr-row"},rt),Ct=[an];if(ne&&Pt){let X=xt(ee.map,{key:"data value",value:"authored literal",add:"+ mapping"},Le=>{we(Le===void 0?{bind:ee.bind}:Ee({...ee,map:Le}))}),de=b(ee.default??"",Le=>we(Ee({...ee,default:Le})),"wgd-input wgd-attr-map-default");de.placeholder="default (on miss)",Ct.push(s("div",{class:"wgd-attr-map"},[X.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),de])]))}return Ct.length===1?an:s("div",{class:"wgd-attr"},Ct)}),A=Array.isArray(E.children)?E.children:[],I=qt("+","Add attribute or child node",["attribute",...d===void 0&&(E.tag==="button"||E.tag==="a")?["action"]:[],...Object.keys(Nt)],K=>{v.delete(en(y));let Y=Nt[K];if(K==="attribute")f(y,{...E,attrs:{...L,"":""}});else if(K==="action"){let ee=r.actions[0];f(y,{...E,action:ee!==void 0?{ref:ee.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else Y&&f([...y,A.length],Y())}),B=[];if(h.length>0&&B.push(s("div",{class:"wgd-attrs"},h)),d!==void 0){let K=x(H)?Bn(H,"when"):[],Y=Dt(d,{...r,scopePaths:K,getDataSchema:()=>Oe(e.get(),r.schemas)},le=>{if(le===void 0){let{action:Ee,...we}=E;f(y,we)}else f(y,{...E,action:le})}),ee=[s("span",{class:"wgd-slot-label"},["action"]),Y.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,Y)=>J(K,[...y,Y],j,!0,{parent:y,index:Y,count:A.length},H))));let U=[];return h.length>0&&U.push(`${h.length} attr${h.length===1?"":"s"}`),d!==void 0&&U.push("action"),A.length>0&&U.push(`${A.length} ${A.length===1?"child":"children"}`),S(void 0,y,[R(E.tag,K=>f(y,{...E,tag:K}))],B,D,P,$,{icons:[I],summary:U.join(" \xB7 ")})}return S("unknown",y,[s("code",void 0,[JSON.stringify(E)])],[],D??"Unknown template node form.",P,$)}let T,_,F;function z(){_!==void 0&&o.replaceChildren(J(_.template,[],F,!0,void 0,Oe(_,r.schemas)))}function M(E,y){T=y.template?`${y.template.code}: ${y.template.message}`:void 0,_=E,F=y.template?.path;let j=new Set(r.actions.map($=>$.name));i=new Set(Ge(E.template,E.load).filter($=>!j.has($)));let P=y.template?`${y.template.code}: ${y.template.message}`+(y.template.path!==void 0&&y.template.path!==""?` (at ${y.template.path})`:""):y.actionRefs;p.hidden=P===void 0,p.textContent=P??"",(!o.hidden||o.childNodes.length===0)&&z(),document.activeElement!==g&&(g.value=JSON.stringify(E.template,null,2),ce(g))}return t.push(()=>{}),{element:m,refresh:M,dispose:()=>m.remove()}}function Un(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 et(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 tt(e,t,n,r,i,o,a=6){let g=G(void 0),c=t(i.get()),l=vt(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=ue(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 zn(e,t,n=[],r=[],i={actions:[],secretNames:[],schemas:[]}){let o=[],a=[];function g(d,h,A){let I=Ae(d,h(e.get()),U=>e.update(K=>A(K,U))),B=ue(I,"input");return o.push(U=>{document.activeElement!==B&&(B.value=h(U))}),I}let c=G(void 0),l=xt(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"]),et([{label:"Tree",element:l.element},{label:"JSON",element:tt("",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=et([{label:"Builder",element:p.element},{label:"JSON",element:tt("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 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"}),S=G(void 0),k=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."])]);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=Oe(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){b.value!==h&&(b.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 C(d,h){let A=s("div"),I="",B;function U(K){let Y=Oe(K,r),ee=Y===void 0?"":JSON.stringify(Y);if(B!==void 0&&ee===I){B.setValue(d(K));return}I=ee;let ne=le=>e.update(Ee=>h(Ee,le));B=Y!==void 0&&x(Y)?kt(Y,d(K),ne):jn(d(K),ne),A.replaceChildren(B.element)}return U(e.get()),o.push(U),A}let J=G(void 0),T=Z("Sample data",[s("span",{class:"wgd-field-label"},["dataExample \u2014 ships with the widget as the example agents imitate"]),et([{label:"Edit",element:C(d=>d.descriptor.dataExample,(d,h)=>({...d,descriptor:{...d.descriptor,dataExample:h}}))},{label:"JSON",element:tt("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)}]),J],!1),_=G(void 0),F=Z("Data for preview",[s("span",{class:"wgd-field-label"},["Overrides dataExample in the preview only (not exported)"]),et([{label:"Edit",element:C(d=>d.sampleData,(d,h)=>({...d,sampleData:h}))},{label:"JSON",element:tt("Preview data (JSON)",d=>d.sampleData,(d,h)=>({...d,sampleData:h}),d=>{let{sampleData:h,...A}=d;return A},e,o,4)}]),_],!1),z=s("div"),M=Pn(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)",[et([{label:"Tree",element:M.element},{label:"JSON",element:tt("",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)}]),z]),y=Vn(e,o,{actionContext:i}),j=Un(e,o,n),P=G(void 0),$=Dt(e.get().load,{...i,loadOnly:!0,getDataSchema:()=>Oe(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=>{$.element.contains(document.activeElement)||$.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"},[$.element]),P],!1),W=Ln(e);F.classList.add("wgd-edit-only"),E.classList.add("wgd-edit-only"),t.left.append(u,R,T,y.element,H,W.element),t.right.append(F,E,j.element),a.push(y.dispose,j.dispose,W.dispose);function D(d){let h=Ot(d,{schemas:r,actions:i.actions});c.hidden=h.kind===void 0,P.hidden=h.load===void 0,P.textContent=h.load??"",c.textContent=h.kind??"",J.hidden=h.example===void 0,J.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),z.replaceChildren(...h.styles.map(A=>G(`${A.selector}${A.property?` \u2192 ${A.property}`:""}: ${A.message}`)));for(let A of o)A(d);y.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 Rt="designer-preview";function $t(e={}){Bt(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=be(),a=()=>({tag:"div",children:["\u2026"]});o.register(Rt,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=yt(w.template),b=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.",...b.dataExample!==void 0?{dataExample:b.dataExample}:{}})}catch{continue}x(b.styles)&&g.set(m.kind,Re(b.styles))}let c=o.kinds().filter(m=>m!==Rt),l;function u(m,w,f){let b=f===void 0||f===Rt;if(b&&!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="",b){let S=Te(m.template);if(!S.ok)return;let k=e.actions??[];a=yt(S.template,{actions:N=>k.find(R=>R.name===N)?.definition})}n.textContent=b?m.descriptor.styles?Re(m.descriptor.styles):"":g.get(f)??"",Vt(r,m.theme??{});let v={kind:b?Rt:f,data:b?m.sampleData??m.descriptor.dataExample??null:p(f)};l===void 0?l=Kt(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 Me(e){return JSON.parse(JSON.stringify(e))}function nt(){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 Fn(e){let t=Me(e??nt()),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=Me(o(Me(t))),i()},replace(o){n.length=0,t=Me(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 Kn(e,t={}){De(document);let n=t.initialWidget?Me({...t.initialWidget}):nt(),r=t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,i=Fn(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),e.appendChild(u);let p={actions:t.actions??[],secretNames:t.secretNames??[],schemas:t.schemas??[]},m=zn(i,{left:g,right:c},t.themes??[],t.schemas??[],p);function w(v){let S=Ot(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 b(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&&b(!0),{getDraft:()=>Me(i.get()),setReadOnly:b,loadWidget(v){let S=Xt(v);return S.length>0?{ok:!1,errors:S}:(Yt(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 qn=/^[a-zA-Z0-9._-]+$/;function Zr(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function Qr(e){let t=[];return x(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):qn.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 Gn(e,t={}){De(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):Zr(),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),e.appendChild(o);function a(){return JSON.parse(JSON.stringify(n))}function g(){for(let y of[...r])y(a())}let c=[],l=G(void 0);function u(y,j,P){let $=Ae(y,j(),P),H=ue($,"input");return c.push(()=>{document.activeElement!==H&&(H.value=j())}),$}let p=Z("Schema",[u("Name (id)",()=>n.name,y=>{n={...n,name:y};let j=y.trim()===""||!qn.test(y);l.hidden=!j,l.textContent=j?"Name must be non-empty using letters, digits, '.', '_' or '-'.":"",g()}),l,u("Label",()=>n.label??"",y=>{n={...n,label:y},g()}),u("Description",()=>n.description??"",y=>{n={...n,description:y},g()})]),m=Ve(n.schema,y=>{n={...n,schema:y??{}},v(),g()}),w=G(void 0),f=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),b=s("div",void 0,[f,w]);f.value=JSON.stringify(n.schema,null,2),f.addEventListener("input",()=>{try{let y=JSON.parse(f.value);if(!x(y))throw new Error("schema must be an object");w.hidden=!0,w.textContent="",n={...n,schema:y},m.setValue(y),g()}catch(y){w.hidden=!1,w.textContent=`Invalid JSON (schema keeps the last valid value): ${String(se(y))}`}});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"]);b.hidden=!0,S.addEventListener("click",()=>{m.element.hidden=!1,b.hidden=!0,S.classList.add("wgd-tab-active"),k.classList.remove("wgd-tab-active")}),k.addEventListener("click",()=>{m.element.hidden=!0,b.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,b]),R=G(void 0),C=s("textarea",{class:"wgd-textarea wgd-schema-import",rows:"6",spellcheck:"false"}),J=s("button",{class:"wgd-button",type:"button"},["Import"]);J.addEventListener("click",()=>{let y;try{y=JSON.parse(C.value)}catch(P){R.hidden=!1,R.textContent=`Invalid JSON: ${se(P)}`;return}let j=M(y);R.hidden=j.ok,R.textContent=j.ok?"":j.errors.join(`
|
|
430
|
-
`)});let T=Z("Import",[s("span",{class:"wgd-field-label"},["Import schema entry JSON ({ name, label?, description?, schema })"]),
|
|
431
|
-
`)});let
|
|
432
|
-
`)});let
|
|
433
|
+
export const ${qr(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)};
|
|
434
|
+
`}function $n(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=ue(i,"textarea");ae(o);let a=s("button",{class:"wgd-button",type:"button"},["Import"]);a.addEventListener("click",()=>{let u=Fr(o.value);if(!u.ok){r.hidden=!1,r.textContent=u.errors.join(`
|
|
435
|
+
`);return}r.hidden=!0,r.textContent="",Qt(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",()=>Ur(e.get())),n("Export theme JSON",()=>Kr(e.get())),n("Copy as TypeScript",()=>Gr(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 Xr=["string","number","boolean","null","object","array"];function en(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function Yr(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 Zr(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 Wn(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 Xr)w.append(s("option",{value:f},[f]));return w.value=en(p),w.addEventListener("change",()=>i(ve(n,m,Yr(w.value,p)))),w}function g(p,m){let w=en(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=en(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(Zr(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 Cn=["object","array","string","number","integer","boolean","null","any"],Pn=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 Cn)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=Cn.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)),Pn.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(Pn.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"):[],K=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 $=Object.entries(T).map(([W,D])=>W===M?[b.value,D]:[W,D]),H=_.map(W=>W===M?b.value:W);l(o(o(c,"properties",Object.fromEntries($)),"required",H.length>0?H:void 0))});let j=s("input",{type:"checkbox",title:"required"});j.checked=_.includes(M),j.addEventListener("change",()=>{let $=j.checked?[..._,M]:_.filter(H=>H!==M);l(o(c,"required",$.length>0?$:void 0))});let C=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);C.addEventListener("click",()=>{let{[M]:$,...H}=T;l(o(o(c,"properties",Object.keys(H).length>0?H:void 0),"required",_.filter(W=>W!==M).length>0?_.filter(W=>W!==M):void 0))}),K.append(a(x(E)?E:{},$=>l(o(c,"properties",{...T,[M]:$})),u+1,[b],[s("label",{class:"wgd-sb-req",title:"required"},[j,"req"]),C]))}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"}}))}),K.append(s("div",{class:"wgd-toolbar"},[U])),w.push(K)}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 In(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(In(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(In(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 Mn(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 _n(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 Hn="__custom__";function Bn(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function Jn(){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 pe(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:Hn},["custom\u2026"])),o.value=e,be(o);let c=ke(e,i,n,r);return c.hidden=!0,o.addEventListener("change",()=>{if(o.value===Hn){c.hidden=!1,c.focus();return}c.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,c])}function zn(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 Qr(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 tn(e,t,n){let r=ie(e??Bn()),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=[pe(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,pe("(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"?Jn():Bn(),"all"));if(i.append(s("div",{class:"wgd-row"},[pe("Kind"),y])),r.kind==="prompt"){i.append(pe("Message (literals and bound values; the user reviews and sends it)"),Qr(r.text,k=>l({kind:"prompt",text:k},"none")));return}let v=he(Fe.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"},[pe("Method"),v]),s("label",{class:"wgd-field"},[pe("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(pe("Headers"),zn(r.headers,y,{add:"+ header",name:"header"},v=>{let{headers:S,...k}=c();l(v===void 0?k:{...k,headers:v},"none")}),pe("Fixed query parameters"),zn(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:Jn()},"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),K=(_.includes(T)?_:[T,..._]).map(M=>({value:M,label:M===""?"(pick an action)":_.includes(M)?M:`${M} (unknown)`})),U=he(K,T,"wgd-select wgd-binding-ref",M=>p(m({ref:M},l(),u()),"io"));i.append(s("div",{class:"wgd-row"},[pe("Action"),U]));return}let z=tn(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(),K=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",$=>{p(m(R,{...l(),[U]:$==="const"?{const:""}:U},u()),"input")}),j=$=>{let H=l();if(E){let W;try{W=JSON.parse($)}catch{W=$}H[U]={const:W}}else $===""?delete H[U]:H[U]=$;p(m(R,H,u()),"none")},C=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,C])});o.append(pe("Input mapping (field \u2190 data path or constant)"),P.length>0?s("div",{class:"wgd-record"},K):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(Ke.map(K=>({value:K})),z,"wgd-select",K=>{let U={...u(),mode:K};K!=="patch"&&delete U.path,p(m(R,l(),U),"output")}),_=[pe("Output"),T];z==="patch"&&_.push(ke(P.path??"","wgd-input",K=>{p(m(R,l(),{...u(),path:K}),"output")},"data path to write at")),a.append(s("div",{class:"wgd-row"},_)),a.append(S(N,P,K=>{let U=u();K===void 0?delete U.map:U.map=K,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??{}),_=[],K=t.getDataSchema?.(),U=(R.mode??"merge")==="patch"&&R.path?R.path:"",M=U===""?K:Tt(K,U),E=Qe(M),b=[".",...Qe(N.output)],j=G(void 0);j.classList.add("wgd-type-mismatch");function C(D){T=D,P(Object.keys(T).length>0?T:void 0),W()}function $(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 W(){z.replaceChildren();let D=[];for(let[d,h]of Object.entries(T)){let A=xe(Tt(M,d)),I=xe(Tt(N.output,h));_n(I,A)&&D.push(`'${h}' is ${I} in the response but '${U?`${U}.`:""}${d}' is ${A} in the widget schema`);let B=H(d,Y=>{if(Y===d)return;if(Y===""||Object.hasOwn(T,Y)){$(`'${Y||"(empty)"}' is already a projection target.`);return}let ee=Object.entries(T).map(([ne,le])=>ne===d?[Y,le]:[ne,le]);C(Object.fromEntries(ee))}),V=Dt(h,b,Y=>C({...T,[d]:Y}),"response path");V.classList.add("wgd-map-source");let F=et(()=>{let{[d]:Y,...ee}=T;C(ee)});z.append(s("div",{class:"wgd-rec-row"},[B,s("span",{class:"wgd-st-colon"},["\u2190"]),V,F]))}_.forEach((d,h)=>{let A=H("",V=>{if(V!==""){if(Object.hasOwn(T,V)){$(`'${V}' is already a projection target.`);return}_.splice(h,1),C({...T,[V]:d.source})}}),I=Dt(d.source,b,V=>{d.source=V,W()},"response path");I.classList.add("wgd-map-source");let B=et(()=>{_.splice(h,1),W()});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:""}),W()}),j.hidden=D.length===0,j.textContent=D.length===0?"":`Type mismatch: ${D.join("; ")}.`,z.append(s("div",{class:"wgd-row"},[L]),j)}return W(),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 ei=new Set(ye().kinds());function ti(e){if(!x(e))return[];let t=[];for(let[n,r]of Object.entries(e)){if($e({[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"||$e({".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.":ei.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=ti(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=Xe(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 Vn(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 ni(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 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 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 Un(e,t,n,r){let i=t.length===0?e:ri(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 ri(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 Kn(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 C=s("input",{type:"text",class:j});return C.value=E,C.addEventListener("change",()=>b(C.value)),C}let v=new Set;function S(E,b,j,C,$,H,W,D){let L=nn(b),d=C.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(W&&W.count>1){if(W.index>0){let F=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);F.addEventListener("click",()=>w(Un(e.get().template,W.parent,W.index,W.index-1))),B.push(F)}if(W.index<W.count-1){let F=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);F.addEventListener("click",()=>w(Un(e.get().template,W.parent,W.index,W.index+1))),B.push(F)}}if(H){let F=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);F.addEventListener("click",()=>b.length===0?w(""):f(b,jt)),B.push(F)}B.length>0&&I.push(s("span",{class:"wgd-node-icons"},B));let V=[s("div",{class:"wgd-node-row"},I)];return $!==void 0&&V.push(G($)),h||V.push(...C),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,C,$="wgd-input wgd-node-value"){let H=x(b)?Vn(b,j):[];if(H.length===0)return y(E,C,$);let W=s("select",{class:"wgd-select wgd-path"}),D=H.includes(E);for(let h of D?H:[E,...H])W.append(s("option",{value:h},[h===E&&!D?`${h} (off-schema)`:h]));W.append(s("option",{value:"__custom__"},["custom\u2026"])),W.value=E,be(W);let L=y(E,C,$);L.hidden=!0,W.addEventListener("change",()=>{if(W.value==="__custom__"){L.hidden=!1,L.focus();return}L.hidden=!0,C(W.value)});let d=$.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${d}`},[W,L])}function R(E,b){let j=s("select",{class:"wgd-select wgd-tag"}),C=k.includes(E)?k:[E,...k];for(let H of C)j.append(s("option",{value:H},[H]));j.append(s("option",{value:"__custom__"},["custom\u2026"])),j.value=E,be(j);let $=y(E,b,"wgd-input wgd-tag-custom");return $.hidden=!0,j.addEventListener("change",()=>{if(j.value==="__custom__"){$.hidden=!1,$.focus();return}$.hidden=!0,b(j.value)}),s("span",{class:"wgd-tagwrap"},[j,$])}function P(E,b,j,C,$,H,W){let D=[...b,j];if(C===void 0){let L=Xt(`+ ${E}`,`Set '${E}' to a node`,Object.keys(Lt),d=>{let h=Lt[d];h&&f(D,h())});return $?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(C,D,H,!$,void 0,W)])}function z(E,b,j,C=!0,$,H){let W=nn(b),D=j!==void 0&&(j===W||(j.startsWith(W===""?"attrs.":`${W}.attrs.`)||j.startsWith(W===""?"action":`${W}.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,C,$);if(!x(E))return S("invalid",b,[s("code",void 0,[JSON.stringify(E)])],[],D??"Not a template node.",C,$);if(typeof E.bind=="string")return S("bind",b,[N(E.bind,H,"bind",L=>f(b,{bind:L}))],[],D,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,ni(H,E.each)),P("empty",b,"empty",E.empty,!1,j,H)],D,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,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(([F,Y])=>{let ee=x(Y)&&typeof Y.bind=="string"?Y:{bind:""},ne=x(Y)&&typeof Y.bind=="string",le=ne?ee:void 0,Ee=X=>{let de={bind:X.bind};return X.map!==void 0?(de.map=X.map,X.default!==void 0&&X.default!==""&&(de.default=X.default)):X.prefix!==void 0&&X.prefix!==""&&(de.prefix=X.prefix),de},we=X=>{f(b,{...E,attrs:{...L,[F]:X}})},ar=y(F,X=>{let de=Object.entries(L).map(([je,ln])=>je===F?[X,ln]:[je,ln]);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 dn=y(String(ne?"":Y),X=>we(X),"wgd-input wgd-attr-value"),dr=ne?N(ee.bind,H,"bind",X=>we(Ee({...ee,bind:X})),"wgd-input wgd-attr-value"):dn;Le.addEventListener("change",()=>{let X=ne?ee.bind:dn.value;we(Le.value==="bind"?{bind:X||"."}:X)});let Pt=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);Pt.addEventListener("click",()=>{let{[F]:X,...de}=L;f(b,{...E,attrs:de})});let it=[ar,Le,dr],It=le?.map!==void 0,cr=le?.prefix!==void 0&&le.prefix!=="";if(ne&&!It){let X=y(le?.prefix??"",de=>we(Ee({...ee,map:void 0,prefix:de})),"wgd-input wgd-attr-prefix");X.placeholder="prefix",X.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",it.push(X)}if(ne&&!It&&!cr){let X=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);X.addEventListener("click",()=>we(Ee({...ee,prefix:void 0,map:{}}))),it.push(s("span",{class:"wgd-node-icons"},[X,Pt]))}else it.push(Pt);let cn=s("div",{class:"wgd-attr-row"},it),Mt=[cn];if(ne&&It){let X=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"},[X.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),de])]))}return Mt.length===1?cn:s("div",{class:"wgd-attr"},Mt)}),A=Array.isArray(E.children)?E.children:[],I=Xt("+","Add attribute or child node",["attribute",...d===void 0&&(E.tag==="button"||E.tag==="a")?["action"]:[],...Object.keys(Lt)],F=>{v.delete(nn(b));let Y=Lt[F];if(F==="attribute")f(b,{...E,attrs:{...L,"":""}});else if(F==="action"){let ee=r.actions[0];f(b,{...E,action:ee!==void 0?{ref:ee.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else Y&&f([...b,A.length],Y())}),B=[];if(h.length>0&&B.push(s("div",{class:"wgd-attrs"},h)),d!==void 0){let F=x(H)?Vn(H,"when"):[],Y=Ot(d,{...r,scopePaths:F,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"]),Y.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((F,Y)=>z(F,[...b,Y],j,!0,{parent:b,index:Y,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,F=>f(b,{...E,tag:F}))],B,D,C,$,{icons:[I],summary:V.join(" \xB7 ")})}return S("unknown",b,[s("code",void 0,[JSON.stringify(E)])],[],D??"Unknown template node form.",C,$)}let T,_,K;function U(){_!==void 0&&o.replaceChildren(z(_.template,[],K,!0,void 0,Ne(_,r.schemas)))}function M(E,b){T=b.template?`${b.template.code}: ${b.template.message}`:void 0,_=E,K=b.template?.path;let j=new Set(r.actions.map($=>$.name));i=new Set(Xe(E.template,E.load).filter($=>!j.has($)));let C=b.template?`${b.template.code}: ${b.template.message}`+(b.template.path!==void 0&&b.template.path!==""?` (at ${b.template.path})`:""):b.actionRefs;p.hidden=C===void 0,p.textContent=C??"",(!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 Fn(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=ue(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(F=>A(F,V))),B=ue(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(F){let Y=Ne(F,r),ee=Y===void 0?"":JSON.stringify(Y);if(B!==void 0&&ee===I){B.setValue(d(F));return}I=ee;let ne=le=>e.update(Ee=>h(Ee,le));B=Y!==void 0&&x(Y)?Et(Y,d(F),ne):Wn(d(F),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),K=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=Mn(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=Kn(e,o,{actionContext:i}),j=Fn(e,o,n),C=G(void 0),$=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=>{$.element.contains(document.activeElement)||$.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"},[$.element]),C],!1),W=$n(e);K.classList.add("wgd-edit-only"),E.classList.add("wgd-edit-only"),t.left.append(u,R,T,b.element,H,W.element),t.right.append(K,E,j.element),a.push(b.dispose,j.dispose,W.dispose);function D(d){let h=Nt(d,{schemas:r,actions:i.actions});c.hidden=h.kind===void 0,C.hidden=h.load===void 0,C.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 $t="designer-preview";function Wt(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($t,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,$e(y.styles))}let c=o.kinds().filter(m=>m!==$t),l;function u(m,w,f){let y=f===void 0||f===$t;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?$e(m.descriptor.styles):"":g.get(f)??"",Ut(r,m.theme??{});let v={kind:y?$t: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 Gn(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 Xn(e,t={}){Oe(document);let n=t.initialWidget?_e({...t.initialWidget}):rt(),r=t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,i=Gn(r),o=new Set,a=Wt({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=Zt(v);return S.length>0?{ok:!1,errors:S}:(Qt(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 Yn=/^[a-zA-Z0-9._-]+$/;function ii(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function oi(e){let t=[];return x(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):Yn.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 Zn(e,t={}){Oe(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):ii(),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,C){let $=Ae(b,j(),C),H=ue($,"input");return c.push(()=>{document.activeElement!==H&&(H.value=j())}),$}let p=Z("Schema",[u("Name (id)",()=>n.name,b=>{n={...n,name:b};let j=b.trim()===""||!Yn.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(C){R.hidden=!1,R.textContent=`Invalid JSON: ${se(C)}`;return}let j=M(b);R.hidden=j.ok,R.textContent=j.ok?"":j.errors.join(`
|
|
436
|
+
`)});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"}),K=s("button",{class:"wgd-button wgd-add",type:"button"},["Export schema entry"]);K.addEventListener("click",()=>{_.value=JSON.stringify(a(),null,2),ce(_)});let U=Z("Export",[s("div",{class:"wgd-toolbar"},[K]),_]);U.classList.add("wgd-view-only"),i.append(p,N,T,U),ae(f),ae(P),ae(_);function M(b){let j=oi(b);if(j.length>0)return{ok:!1,errors:j};n=JSON.parse(JSON.stringify(b));for(let C of c)C();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(C=>!C.parentElement?.classList.contains("wgd-view-only"));for(let C of j)b?C.setAttribute("inert",""):C.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 si=ye().kinds(),ai=/^#[0-9a-f]{3}([0-9a-f]{3})?$/i,Qn=/^x-[a-z0-9][a-z0-9-]*$/;function di(e){if(!ai.test(e))return;if(e.length===7)return e.toLowerCase();let[,t,n,r]=e.toLowerCase();return`#${t}${t}${n}${n}${r}${r}`}function ci(){return{name:"my-theme",label:"My theme",tokens:{}}}function li(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 er(e,t={}){Oe(document);let n=t.initialTheme?JSON.parse(JSON.stringify(t.initialTheme)):ci(),r=new Set,i=Wt(t.widgets?{widgets:t.widgets}:{}),o=i.kinds.length>0?i.kinds:si,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=ue(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:We[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===""?We[D]:I;if(h!==void 0){let V=di(B);V!==void 0&&(h.value=V),h.style.background=Ce(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!==""&&!Ce(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])=>Qn.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(!Qn.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 F={...n.tokens};delete F[d],F[V]=h,n={...n,tokens:F},_(),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 K=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(`
|
|
437
|
+
`)});let C=Z("Import",[s("span",{class:"wgd-field-label"},["Import theme entry JSON"]),E,b,s("div",{class:"wgd-row"},[j])]),$=Z("Export",[s("div",{class:"wgd-toolbar"},[M]),U]);$.classList.add("wgd-view-only"),g.append(v,R,K,C,$);function H(D){let L=li(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 W(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&&W(!0),{getTheme:m,loadTheme:H,setReadOnly:W,subscribe(D){return r.add(D),()=>r.delete(D)},dispose(){r.clear(),i.dispose(),l.remove()}}}function ui(){return{name:"my-action",label:"My action",definition:{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}}function pi(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 gi(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 tr(e,t,n){let{[t]:r,...i}=e;return n===""?i:{...i,[t]:n}}function nr(e,t={}){Oe(document);let n=t.initialAction?ie(t.initialAction):ui(),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=ue(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=tr(n,"label",d),c()}),p("Description",()=>n.description??"",d=>{n=tr(n,"description",d),c()})]),w=G(void 0),f=tn(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]),K={},U;function M(){if(r===void 0)return;if(T.replaceChildren(),n.definition.kind!=="http"){U=void 0,K={},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&&(K={}),U=h;let A=Et(d.input,K,V=>{K=x(V)?V:{}});K=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,K).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(`
|
|
438
|
+
`)});let C=Z("Import",[s("span",{class:"wgd-field-label"},["Import action entry JSON ({ name, label?, description?, definition })"]),b,E,s("div",{class:"wgd-row"},[j])]),$=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",()=>{$.value=JSON.stringify(g(),null,2),ce($)});let W=Z("Export",[s("div",{class:"wgd-toolbar"},[H]),$]);W.classList.add("wgd-view-only"),o.append(m,z,...r===void 0?[]:[_],C,W),ae(v),ae(b),ae($);function D(d){let h=pi(d);if(h.length>0)return{ok:!1,errors:h};n=gi(d),K={};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 Ct(e){let t=e.getAttribute("appearance"),n=jn(e.getAttribute("chrome"));return{...t==="light"||t==="dark"?{appearance:t}:{},...n===void 0?{}:{chrome:n}}}var rr="widgentic-designer",ir="widgentic-theme-designer",or="widgentic-schema-designer",sr="widgentic-action-designer";function rn(e=rr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Xn(this,Ct(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 on(e=ir){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=er(this,Ct(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 sn(e=or){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Zn(this,Ct(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 an(e=sr){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=nr(this,Ct(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)}an();rn();sn();on();
|
|
433
439
|
//# sourceMappingURL=widgentic-designer.js.map
|