@widgentic/designer 0.8.0 → 0.12.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 +2 -1
- package/dist/browser/widgentic-designer.js +127 -97
- package/dist/browser/widgentic-designer.js.map +4 -4
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -1
- package/dist/browser.js.map +1 -1
- package/dist/dom.d.ts +5 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +23 -0
- package/dist/dom.js.map +1 -1
- package/dist/element.d.ts +9 -0
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +55 -0
- package/dist/element.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +8 -3
- package/dist/io.d.ts.map +1 -1
- package/dist/io.js +38 -8
- package/dist/io.js.map +1 -1
- package/dist/panels.d.ts.map +1 -1
- package/dist/panels.js +17 -54
- package/dist/panels.js.map +1 -1
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +23 -6
- package/dist/preview.js.map +1 -1
- package/dist/schema-designer.d.ts.map +1 -1
- package/dist/schema-designer.js +15 -7
- package/dist/schema-designer.js.map +1 -1
- package/dist/settings-designer.d.ts +37 -0
- package/dist/settings-designer.d.ts.map +1 -0
- package/dist/settings-designer.js +224 -0
- package/dist/settings-designer.js.map +1 -0
- package/dist/shell.d.ts +24 -0
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +39 -7
- package/dist/shell.js.map +1 -1
- package/dist/store.d.ts +9 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/styles-panel.d.ts +10 -0
- package/dist/styles-panel.d.ts.map +1 -0
- package/dist/styles-panel.js +79 -0
- package/dist/styles-panel.js.map +1 -0
- package/dist/template-panel.d.ts.map +1 -1
- package/dist/template-panel.js +82 -5
- package/dist/template-panel.js.map +1 -1
- package/dist/theme-designer.d.ts +7 -2
- package/dist/theme-designer.d.ts.map +1 -1
- package/dist/theme-designer.js +79 -15
- package/dist/theme-designer.js.map +1 -1
- package/dist/theme-panel.d.ts.map +1 -1
- package/dist/theme-panel.js +19 -12
- package/dist/theme-panel.js.map +1 -1
- package/dist/validate.d.ts +16 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +38 -7
- package/dist/validate.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,67 +1,68 @@
|
|
|
1
|
-
function cn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function In(e,t={}){if(!cn(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&&!cn(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&&!cn(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 ln=new Set(["http","https","mailto","tel"]);function At(e){return e.replace(/[\u0000-\u0020]+/g,"")}function un(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(At(e));if(t===null)return!0;let n=t[1];return n!==void 0&&ln.has(n.toLowerCase())}function Mn(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(At(e));if(t===null)return!1;let n=t[1];return n!==void 0&&ln.has(n.toLowerCase())}var Xr=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,Zr=/^https?:\/\//i;function We(e){let t=At(e);return Xr.test(t)||Zr.test(t)}var Qr=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function Hn(e){let t=At(e);if(!We(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return Qr.test(new URL(t).pathname)}catch{return!1}}function J(e,t,n,r){let i={tag:e};return t&&Object.keys(t).length>0&&(i.attrs=t),n&&n.length>0&&(i.children=n),r!==void 0&&(i.key=r),i}var lt={card:{description:"Key/value details for a single entity, with optional title and subtitle.",dataShape:"A plain object. `title`, `subtitle`, and `fields` are used when present; other entries become field key/value pairs. Primitives render as a single value line. `meta.title`/`meta.subtitle` fill in missing chrome. Send field values typed (e.g. price: 9.99, not '$9.99') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit. Field values that are image URLs render as images (see hints.images).",dataExample:{title:"Essence Mascara",subtitle:"beauty",fields:{price:9.99,rating:2.56,stock:99}},hints:{fieldFormat:"Record<fieldKey, pattern> \u2014 formats matching field values by substituting {value} in the pattern (e.g. { price: '${value}', rating: '{value} / 5' }); a pattern without {value} is prefixed to the value. Output is escaped like any text.",images:"Record<fieldKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 field values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: thumb); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text; image treatment wins over fieldFormat for the same key.",links:"Record<fieldKey, boolean | prefix> \u2014 true links a field whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same key. Links are never automatic \u2014 opt in per field."}},table:{description:"Rows and columns for arrays of records.",dataShape:"An array of records (plain objects). Columns are the union of record keys in first-seen order; missing cells render empty; non-array data becomes a single row. Cell values that are image URLs render as avatars (see hints.images). meta.title/meta.subtitle render as the table's caption. Send cell values typed (e.g. total: 11471334.78, not '11,471,334.78') and use hints.fieldFormat for display formatting \u2014 the payload keeps the typed value while the render gets its unit.",dataExample:[{name:"Ada",role:"eng",avatar:"https://picsum.photos/id/64/64/64.jpg"},{name:"Lin",role:"ops",avatar:"https://picsum.photos/id/65/64/64.jpg"}],hints:{columns:"string[] \u2014 overrides column selection and order",fieldFormat:"Record<columnKey, pattern> \u2014 formats matching cell values by substituting {value} in the pattern (e.g. { total: '${value}' }); a pattern without {value} is prefixed to the value. Output is escaped like any text; image treatment wins for the same column.",links:"Record<columnKey, boolean | prefix> \u2014 true links cells whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same column. Links are never automatic \u2014 opt in per column.",images:"Record<columnKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 cell values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: avatar); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text."}},tree:{description:"Collapsible hierarchy of labeled nodes \u2014 a person can expand and collapse branches by click or keyboard.",dataShape:"Nested `{ label, icon?, children[] }` nodes \u2014 a single root object or an array of them. A node with children renders as a native disclosure that opens and closes; leaves are plain labels. Optional `icon` is ONE string per node, shown before the label: a data:image/* URI or an https URL ending in an image extension (.png, .jpg, .svg, ...) renders as a small decorative image; any other string \u2014 an emoji, a glyph, an extensionless URL \u2014 renders as text. Nodes without a usable `label` get a JSON fallback label (which excludes `children` and `icon`). meta.title renders as a title line above the tree.",dataExample:{label:"src",icon:"\u{1F4C1}",children:[{label:"index.ts",icon:"\u{1F4C4}",children:[]}]},hints:{expandDepth:"number \u2014 branches at depth < value START expanded (default: unlimited). Presentational only: the full subtree is always in the markup, and collapsing is the disclosure's own behavior. The value selects only the INITIAL state (the `open` attribute on branches); a visitor's own expand/collapse survives later re-renders."}},group:{description:"Several widgets in one response \u2014 mixed kinds in a single layout container. Use ONE group render instead of repeated render calls when showing multiple widgets together.",dataShape:"{ items: [{ kind, data, hints?, meta? }, ...] } \u2014 each item is a full sub-widget rendered exactly as a top-level call would be (any listed kind except 'group'; groups do not nest). At most 20 items per group.",dataExample:{items:[{kind:"card",data:{title:"Ada",fields:{role:"eng"}}},{kind:"card",data:{title:"Lin",fields:{role:"ops"}}}]},hints:{layout:"'stack' | 'row' | 'grid' \u2014 how items sit together (default: stack). 'row' wraps; 'grid' uses equal columns.",gap:"'none' | 'sm' | 'md' | 'lg' \u2014 spacing between items (default: md).",columns:"number 1-4 \u2014 column count for layout: 'grid' (default: 2)."}}};var ei=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function ti(e){if(!(typeof e!="string"||e.length>256)&&!ei.test(e))try{return new RegExp(e)}catch{return}}function ut(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Fn(e,t){switch(e){case"object":return ut(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 ni(e,t){return typeof e=="string"?Fn(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&Fn(n,t)):!0}function ri(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function ii(e){return Array.isArray(e)?e.join(" | "):String(e)}function De(e,t,n="data"){if(Array.isArray(e.enum)&&!ri(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&&!ni(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${ii(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=ti(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(ut(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(ut(e.properties)){for(let[r,i]of Object.entries(e.properties))if(r in t&&ut(i)){let o=De(i,t[r],`${n}.${r}`);if(o)return o}}}if(Array.isArray(t)&&ut(e.items))for(let r=0;r<t.length;r++){let i=De(e.items,t[r],`${n}.${r}`);if(i)return i}}function se(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ie(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 Dt(e,t){return e.includes("{value}")?e.split("{value}").join(t):e+t}function Ot(e,t,n,r){let o=(se(n)&&se(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||!Mn(a)?r:J("a",{class:"wg-link",href:a,rel:"noopener noreferrer"},[r])}var oi=["avatar","thumb","hero"],si=new Set(oi);function Ge(e,t,n,r){if(typeof t!="string")return null;let o=(se(n?.images)?n.images:void 0)?.[e];return o===!1?null:typeof o=="string"&&si.has(o)?We(t)?{src:t,shape:o}:null:o===!0?We(t)?{src:t,shape:r}:null:Hn(t)?{src:t,shape:r}:null}function Ye(e,t,n){return J("img",{class:`wg-img wg-img-${n}`,src:t,alt:e,loading:"lazy",decoding:"async"})}function Bn(e){let{data:t,meta:n}=e,r=se(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,i,o,a=[],f;se(t)?(i=t.title,o=t.subtitle,se(t.fields)?a=Object.entries(t.fields):a=Object.entries(t).filter(([u])=>u!=="title"&&u!=="subtitle")):f=ie(t),i===void 0&&(i=n?.title),o===void 0&&(o=n?.subtitle);let d=[];return i!==void 0&&d.push(J("div",{class:"wg-card-title"},[ie(i)])),o!==void 0&&d.push(J("div",{class:"wg-card-subtitle"},[ie(o)])),f!==void 0&&d.push(J("div",{class:"wg-card-value"},[f])),a.length>0&&d.push(J("dl",{class:"wg-card-fields"},a.map(([u,l])=>{let p=Ge(u,l,e.hints,"thumb"),m;if(p)m=Ye(u,p.src,p.shape);else{let w=ie(l),g=r?.[u],y=typeof g=="string"?Dt(g,w):w;m=Ot(u,l,e.hints,y)}return J("div",{class:"wg-card-field"},[J("dt",{class:"wg-card-field-key"},[u]),J("dd",{class:"wg-card-field-value"},[m])])}))),J("div",{class:"wg-card"},d)}function Nt(e){let t=[],n=new Set;for(let r of e){if(!se(r))return;let i=r.id,o;if(typeof i=="string")o=i;else if(typeof i=="number"&&Number.isFinite(i))o=String(i);else return;if(n.has(o))return;n.add(o),t.push(o)}return t}function Un(e){let t=Array.isArray(e.data)?e.data:[e.data],n=se(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,r=t.map(l=>se(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 p of r)for(let m of Object.keys(p))l.has(m)||(l.add(m),o.push(m))}let a=Nt(r),f=[],d=e.meta?.title,u=e.meta?.subtitle;if(d!==void 0||u!==void 0){let l=[];d!==void 0&&l.push(J("span",{class:"wg-table-title"},[ie(d)])),u!==void 0&&l.push(J("span",{class:"wg-table-subtitle"},[ie(u)])),f.push(J("caption",{class:"wg-table-caption"},l))}return J("table",{class:"wg-table"},[...f,J("thead",{class:"wg-table-head"},[J("tr",void 0,o.map(l=>J("th",{class:"wg-table-header"},[l])))]),J("tbody",{class:"wg-table-body"},r.map((l,p)=>J("tr",{class:"wg-table-row"},o.map(m=>{if(!(m in l))return J("td",{class:"wg-table-cell"},[""]);let w=l[m],g=Ge(m,w,e.hints,"avatar"),y;if(g)y=Ye(m,g.src,g.shape);else{let v=ie(w),S=n?.[m],x=typeof S=="string"?Dt(S,v):v;y=Ot(m,w,e.hints,x)}return J("td",{class:"wg-table-cell"},[y])}),a?.[p])))])}function Vn(e){let t=e.hints?.expandDepth,n=typeof t=="number"&&!Number.isNaN(t)?Math.max(0,t):1/0,r=Array.isArray(e.data)?e.data:[e.data],i=J("ul",{class:"wg-tree"},Jn(r,0,n)),o=e.meta?.title;return o===void 0?i:J("div",{class:"wg-tree-titled"},[J("div",{class:"wg-tree-title"},[ie(o)]),i])}function ai(e){if(se(e)){if(e.label!==void 0)return ie(e.label);let{children:t,icon:n,...r}=e;return ie(r)}return ie(e)}function di(e){if(typeof e!="string")return;let t=Ge("",e,void 0,"icon");return t!==null?Ye("",t.src,t.shape):J("span",{class:"wg-tree-icon"},[e])}function zn(e){let t=se(e)?di(e.icon):void 0,n=ai(e);return t===void 0?[n]:[t,n]}var ci=64,li=e=>se(e)&&Array.isArray(e.children)&&e.children.length>0?e.children:void 0;function Jn(e,t,n){let r=Nt(e);return e.map((i,o)=>ui(i,t,n,r?.[o]))}function ui(e,t,n,r){let i=t<ci?li(e):void 0;if(i===void 0)return J("li",{class:"wg-tree-node"},[J("span",{class:"wg-tree-label"},zn(e))],r);let o=t<n;return J("li",{class:"wg-tree-node"},[J("details",{class:"wg-tree-branch",...o?{open:""}:{}},[J("summary",{class:"wg-tree-label"},zn(e)),J("ul",{class:"wg-tree-children"},Jn(i,t+1,n))])],r)}var Kn=20,pi=["stack","row","grid"],fi=["none","sm","md","lg"],gi=4;function qn(e){if(!se(e)||e.items===void 0)return{ok:!1,error:{code:"MISSING_FIELD",path:"data.items",message:"'group' data must be an object with an 'items' array."}};let t=e.items;if(!Array.isArray(t))return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:"'items' must be an array of sub-widgets."}};if(t.length>Kn)return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:`'items' holds ${t.length} sub-widgets; a group renders at most ${Kn}.`}};let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!se(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 Gn(e,t){let n=se(e)?e:{},r=pi.some(a=>a===n.layout)?n.layout:"stack",i=fi.some(a=>a===n.gap)?n.gap:"md",o=["wg-group",`wg-group-${r}`,`wg-gap-${i}`];if(r==="grid"){let a=typeof n.columns=="number"&&Number.isFinite(n.columns)?n.columns:2,f=Math.min(gi,Math.max(1,Math.trunc(a)));o.push(`wg-cols-${f}`)}return J("div",{class:o.join(" ")},t)}function Yn(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=>Yn(o,t));return{tag:e.tag,...r!==void 0?{attrs:r}:{},...i!==void 0?{children:i}:{}}}var Rt=class extends Error{code="DUPLICATE_KIND";kind;constructor(t){super(`Widget kind '${t}' is already registered.`),this.name="DuplicateKindError",this.kind=t}};function Se(){let e=new Map,t=new Map,n={register(r,i,o){if(e.has(r))throw new Rt(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,i={}){let o=In(r,{knownKinds:new Set(e.keys())});if(!o.ok)return o;let a=i.partialData===!0?void 0:t.get(o.payload.kind)?.dataSchema;if(a){let d=De(a,o.payload.data);if(d)return{ok:!1,error:d}}if(o.payload.kind==="group"){let d=qn(o.payload.data);if(!d.ok)return d;let u=[];for(let l=0;l<d.items.length;l++){let p=d.items[l],m=n.render({kind:p.kind,data:p.data,...p.hints!==void 0?{hints:p.hints}:{},...p.meta!==void 0?{meta:p.meta}:{}},i);if(!m.ok){let w=m.error.path;return{ok:!1,error:{...m.error,path:`data.items[${l}]${w?`.${w}`:""}`}}}u.push(Yn(m.node,`data.items.${l}`))}return{ok:!0,node:Gn(o.payload.hints,u)}}let f=e.get(o.payload.kind);if(f===void 0)return{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${o.payload.kind}'.`}};try{return{ok:!0,node:f(o.payload)}}catch(d){return{ok:!1,error:{code:"RENDER_FAILED",path:"widget",message:`Renderer for kind '${o.payload.kind}' threw: ${d instanceof Error?d.message:String(d)}`}}}}};return n.register("card",Bn,lt.card),n.register("table",Un,lt.table),n.register("tree",Vn,lt.tree),n.register("group",r=>{let i=n.render(r);if(i.ok)return i.node;throw new Error(i.error.message)},lt.group),n}var pn=/[;{}<>@\\]/,Xn=/^-?[a-zA-Z][a-zA-Z-]*$/;function mi(e){if(pn.test(e))return!1;let t=e.split(",").map(n=>n.trim());return t.length>0&&t.every(n=>n.includes(".wg-"))}function hi(e){return!pn.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(!mi(n)||typeof r!="object"||r===null)continue;let i=[];for(let[o,a]of Object.entries(r))Xn.test(o)&&(typeof a!="string"||!hi(a)||i.push(` ${o}: ${a};`));i.length>0&&t.push(`${n} {
|
|
2
|
-
${i.join(
|
|
1
|
+
function Bn(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Dr(e,t={}){if(!Bn(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&&!Bn(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&&!Bn(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 zn=new Set(["http","https","mailto","tel"]);function Gt(e){return e.replace(/[\u0000-\u0020]+/g,"")}function At(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(Gt(e));if(t===null)return!0;let n=t[1];return n!==void 0&&zn.has(n.toLowerCase())}function Or(e){let t=/^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(Gt(e));if(t===null)return!1;let n=t[1];return n!==void 0&&zn.has(n.toLowerCase())}var ro=/^data:image\/[a-z0-9.+-]+;base64,[a-z0-9+/=]*$/i,io=/^https?:\/\//i;function Ue(e){let t=Gt(e);return ro.test(t)||io.test(t)}var oo=/\.(png|jpe?g|gif|webp|avif|svg)$/i;function Nr(e){let t=Gt(e);if(!Ue(t))return!1;if(t.toLowerCase().startsWith("data:image/"))return!0;try{return oo.test(new URL(t).pathname)}catch{return!1}}var so=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function ao(e,t){if(e.length>253)return"the host is longer than 253 characters";let n=e.split(".");if(n.some(i=>i.length===0))return"the host has an empty label";if(n.every(i=>/^\d+$/.test(i)))return"an IP address cannot be declared, only a domain name";if(n.length<2)return t?"a wildcard needs at least two labels after it, as in *.example.com":"a single-label host such as localhost cannot be declared";if(n[n.length-1]==="localhost")return"a localhost name cannot be declared";if(/^\d+$/.test(n[n.length-1]??""))return"the last label is a number, so this is not a domain name";let r=n.find(i=>!so.test(i));if(r!==void 0)return`the label '${r}' is not 1-63 letters, digits or hyphens that start and end with a letter or digit`}function Vn(e){let t=e.trim();if(t.length===0)return{error:"it is empty"};if(/[\s;,'"`]/.test(t))return{error:"it contains a space, ';', ',' or a quote, which no domain holds"};if(/[^\x21-\x7e]/.test(t))return{error:"it has a non-ASCII character: enter the punycode (xn--) form"};let n=t.toLowerCase(),r=n;if(n.startsWith("https://"))r=n.slice(8);else if(/^[a-z][a-z0-9+.-]*:(?!\d+\/?$)/.test(n))return{error:"only https:// domains can be declared"};if(r.endsWith("/")&&(r=r.slice(0,-1)),r.includes("@"))return{error:"it carries a user name, which a domain cannot"};if(r.includes("/"))return{error:"it is a page, not a domain: drop the path"};if(r.includes("?")||r.includes("#"))return{error:"it carries a query or fragment, which a domain cannot"};if(r.startsWith("["))return{error:"an IP address cannot be declared, only a domain name"};if(r.includes(":"))return{error:"it names a port, which a domain cannot"};let i=r.startsWith("*."),o=i?r.slice(2):r;if(o.includes("*"))return{error:"a wildcard may only be the whole first label, as in *.example.com"};let d=ao(o,i);return d!==void 0?{error:d}:{origin:`https://${i?"*.":""}${o}`,host:o,wildcard:i}}function X(e,t,n,r){let i={tag:e};return t&&Object.keys(t).length>0&&(i.attrs=t),n&&n.length>0&&(i.children=n),r!==void 0&&(i.key=r),i}var Rr=`Labels are what the reader sees: write them in Title Case ("First Name", "Order Total") unless the user asks for another style or language, and keep the data's keys as they are.`,Dt={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). Each field is labelled by its key unless hints.labels names it.",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.",labels:"Record<fieldKey, string> \u2014 the label shown for a field instead of its key (also an image field's alt text); every other hint still names the key. "+Rr,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",labels:"Record<columnKey, string> \u2014 the header shown for a column instead of its key (also its images' alt text); every other hint, columns included, still names the key. "+Rr,fieldFormat:"Record<columnKey, pattern> \u2014 formats matching cell values by substituting {value} in the pattern (e.g. { total: '${value}' }); a pattern without {value} is prefixed to the value. Output is escaped like any text; image treatment wins for the same column.",links:"Record<columnKey, boolean | prefix> \u2014 true links cells whose value already IS an http(s)/mailto/tel URL; a prefix string composes the href while the display stays the clean value (e.g. { email: 'mailto:', phone: 'tel:' } shows a@b.c but links mailto:a@b.c). Unsafe compositions and non-strings stay plain text; image treatment wins for the same column. Links are never automatic \u2014 opt in per column.",images:"Record<columnKey, 'avatar' | 'thumb' | 'hero' | true | false> \u2014 cell values that are https image URLs (image extension) or data:image/* URIs auto-render as images (default shape: avatar); a shape forces image treatment (use for extensionless URLs), true forces the default shape, false keeps the URL as text. Unsafe sources always render as text."}},tree:{description:"Collapsible hierarchy of labeled nodes \u2014 a person can expand and collapse branches by click or keyboard.",dataShape:"Nested `{ label, icon?, children[] }` nodes \u2014 a single root object or an array of them. A node with children renders as a native disclosure that opens and closes; leaves are plain labels. Optional `icon` is ONE string per node, shown before the label: a data:image/* URI or an https URL ending in an image extension (.png, .jpg, .svg, ...) renders as a small decorative image; any other string \u2014 an emoji, a glyph, an extensionless URL \u2014 renders as text. Nodes without a usable `label` get a JSON fallback label (which excludes `children` and `icon`). meta.title renders as a title line above the tree.",dataExample:{label:"src",icon:"\u{1F4C1}",children:[{label:"index.ts",icon:"\u{1F4C4}",children:[]}]},hints:{expandDepth:"number \u2014 branches at depth < value START expanded (default: unlimited). Presentational only: the full subtree is always in the markup, and collapsing is the disclosure's own behavior. The value selects only the INITIAL state (the `open` attribute on branches); a visitor's own expand/collapse survives later re-renders."}},group:{description:"Several widgets in one response \u2014 mixed kinds in a single layout container. Use ONE group render instead of repeated render calls when showing multiple widgets together.",dataShape:"{ items: [{ kind, data, hints?, meta? }, ...] } \u2014 each item is a full sub-widget rendered exactly as a top-level call would be (any listed kind except 'group'; groups do not nest). At most 20 items per group.",dataExample:{items:[{kind:"card",data:{title:"Ada",fields:{role:"eng"}}},{kind:"card",data:{title:"Lin",fields:{role:"ops"}}}]},hints:{layout:"'stack' | 'row' | 'grid' \u2014 how items sit together (default: stack). 'row' wraps; 'grid' uses equal columns.",gap:"'none' | 'sm' | 'md' | 'lg' \u2014 spacing between items (default: md).",columns:"number 1-4 \u2014 column count for layout: 'grid' (default: 2)."}}};var co=/(\([^)]*[+*][^)]*\)|\[[^\]]*\][+*])[+*{]/;function _r(e){if(!(typeof e!="string"||e.length>256)&&!co.test(e))try{return new RegExp(e)}catch{return}}function _e(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Jn=["object","array","string","number","integer","boolean","null"];function Lr(e,t){switch(e){case"object":return _e(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 lo(e,t){return typeof e=="string"?Lr(e,t):Array.isArray(e)?e.some(n=>typeof n=="string"&&Lr(n,t)):!0}function uo(e,t){return e.some(n=>{if(n===t)return!0;try{return JSON.stringify(n)===JSON.stringify(t)}catch{return!1}})}function fo(e){return Array.isArray(e)?e.join(" | "):String(e)}function Ce(e,t,n="data"){if(Array.isArray(e.enum)&&!uo(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&&!lo(e.type,t))return{code:"INVALID_TYPE",path:n,message:`Value at '${n}' must have type ${fo(e.type)}.`};if(typeof t=="string"&&e.pattern!==void 0){let r=_r(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(_e(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(_e(e.properties)){for(let[r,i]of Object.entries(e.properties))if(r in t&&_e(i)){let o=Ce(i,t[r],`${n}.${r}`);if(o)return o}}}if(Array.isArray(t)&&_e(e.items))for(let r=0;r<t.length;r++){let i=Ce(e.items,t[r],`${n}.${r}`);if(i)return i}}function Be(e,t="schema"){let n=[],r=e.type;if(r!==void 0){let i=typeof r=="string"?[r]:Array.isArray(r)?r:void 0;if(i===void 0)n.push(`${t}.type: must be a type name or a list of them; it is ignored.`);else for(let o of i)(typeof o!="string"||!Jn.includes(o))&&n.push(`${t}.type: '${String(o)}' is not one of ${Jn.join(", ")}; it constrains nothing.`)}if(e.pattern!==void 0&&_r(e.pattern)===void 0&&n.push(`${t}.pattern: not run \u2014 it must be a valid regular expression of at most 256 characters without nested quantifiers.`),e.enum!==void 0&&!Array.isArray(e.enum)&&n.push(`${t}.enum: must be a list of values; it is ignored.`),e.required!==void 0&&!(Array.isArray(e.required)&&e.required.every(i=>typeof i=="string"))&&n.push(`${t}.required: must be a list of property names; it is ignored.`),e.properties!==void 0)if(!_e(e.properties))n.push(`${t}.properties: must be an object of schemas; it is ignored.`);else for(let[i,o]of Object.entries(e.properties))_e(o)?n.push(...Be(o,`${t}.properties.${i}`)):n.push(`${t}.properties.${i}: must be a schema object; it is ignored.`);return e.items!==void 0&&(_e(e.items)?n.push(...Be(e.items,`${t}.items`)):n.push(`${t}.items: must be a schema object; it is ignored.`)),n}function ae(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e){if(typeof e=="string")return e;if(e===void 0)return"";if(e===null||typeof e=="number"||typeof e=="boolean"||typeof e=="bigint")return String(e);try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Ot(e,t){let r=(ae(t)&&ae(t.labels)?t.labels:void 0)?.[e];return typeof r=="string"&&r.trim()!==""?r:e}function Xt(e,t){return e.includes("{value}")?e.split("{value}").join(t):e+t}function Zt(e,t,n,r){let o=(ae(n)&&ae(n.links)?n.links:void 0)?.[e];if(typeof t!="string"||t==="")return r;let d=o===!0?t:typeof o=="string"?o+t:void 0;return d===void 0||!Or(d)?r:X("a",{class:"wg-link",href:d,rel:"noopener noreferrer"},[r])}var po=["avatar","thumb","hero"],go=new Set(po);function st(e,t,n,r){if(typeof t!="string")return null;let o=(ae(n?.images)?n.images:void 0)?.[e];return o===!1?null:typeof o=="string"&&go.has(o)?Ue(t)?{src:t,shape:o}:null:o===!0?Ue(t)?{src:t,shape:r}:null:Nr(t)?{src:t,shape:r}:null}function at(e,t,n){return X("img",{class:`wg-img wg-img-${n}`,src:t,alt:e,loading:"lazy",decoding:"async"})}function Cr(e){let{data:t,meta:n}=e,r=ae(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,i,o,d=[],u;ae(t)?(i=t.title,o=t.subtitle,ae(t.fields)?d=Object.entries(t.fields):d=Object.entries(t).filter(([l])=>l!=="title"&&l!=="subtitle")):u=re(t),i===void 0&&(i=n?.title),o===void 0&&(o=n?.subtitle);let a=[];return i!==void 0&&a.push(X("div",{class:"wg-card-title"},[re(i)])),o!==void 0&&a.push(X("div",{class:"wg-card-subtitle"},[re(o)])),u!==void 0&&a.push(X("div",{class:"wg-card-value"},[u])),d.length>0&&a.push(X("dl",{class:"wg-card-fields"},d.map(([l,c])=>{let f=Ot(l,e.hints),h=st(l,c,e.hints,"thumb"),v;if(h)v=at(f,h.src,h.shape);else{let m=re(c),w=r?.[l],k=typeof w=="string"?Xt(w,m):m;v=Zt(l,c,e.hints,k)}return X("div",{class:"wg-card-field"},[X("dt",{class:"wg-card-field-key"},[f]),X("dd",{class:"wg-card-field-value"},[v])])}))),X("div",{class:"wg-card"},a)}function Qt(e){let t=[],n=new Set;for(let r of e){if(!ae(r))return;let i=r.id,o;if(typeof i=="string")o=i;else if(typeof i=="number"&&Number.isFinite(i))o=String(i);else return;if(n.has(o))return;n.add(o),t.push(o)}return t}function $r(e){let t=Array.isArray(e.data)?e.data:[e.data],n=ae(e.hints?.fieldFormat)?e.hints.fieldFormat:void 0,r=t.map(c=>ae(c)?c:{value:c}),i=e.hints?.columns,o;if(Array.isArray(i)&&i.every(c=>typeof c=="string"))o=i;else{o=[];let c=new Set;for(let f of r)for(let h of Object.keys(f))c.has(h)||(c.add(h),o.push(h))}let d=Qt(r),u=[],a=e.meta?.title,l=e.meta?.subtitle;if(a!==void 0||l!==void 0){let c=[];a!==void 0&&c.push(X("span",{class:"wg-table-title"},[re(a)])),l!==void 0&&c.push(X("span",{class:"wg-table-subtitle"},[re(l)])),u.push(X("caption",{class:"wg-table-caption"},c))}return X("table",{class:"wg-table"},[...u,X("thead",{class:"wg-table-head"},[X("tr",void 0,o.map(c=>X("th",{class:"wg-table-header"},[Ot(c,e.hints)])))]),X("tbody",{class:"wg-table-body"},r.map((c,f)=>X("tr",{class:"wg-table-row"},o.map(h=>{if(!(h in c))return X("td",{class:"wg-table-cell"},[""]);let v=c[h],m=st(h,v,e.hints,"avatar"),w;if(m)w=at(Ot(h,e.hints),m.src,m.shape);else{let k=re(v),N=n?.[h],y=typeof N=="string"?Xt(N,k):k;w=Zt(h,v,e.hints,y)}return X("td",{class:"wg-table-cell"},[w])}),d?.[f])))])}function Pr(e){let t=e.hints?.expandDepth,n=typeof t=="number"&&!Number.isNaN(t)?Math.max(0,t):1/0,r=Array.isArray(e.data)?e.data:[e.data],i=X("ul",{class:"wg-tree"},jr(r,0,n)),o=e.meta?.title;return o===void 0?i:X("div",{class:"wg-tree-titled"},[X("div",{class:"wg-tree-title"},[re(o)]),i])}function mo(e){if(ae(e)){if(e.label!==void 0)return re(e.label);let{children:t,icon:n,...r}=e;return re(r)}return re(e)}function ho(e){if(typeof e!="string")return;let t=st("",e,void 0,"icon");return t!==null?at("",t.src,t.shape):X("span",{class:"wg-tree-icon"},[e])}function Ir(e){let t=ae(e)?ho(e.icon):void 0,n=mo(e);return t===void 0?[n]:[t,n]}var wo=64,yo=e=>ae(e)&&Array.isArray(e.children)&&e.children.length>0?e.children:void 0;function jr(e,t,n){let r=Qt(e);return e.map((i,o)=>bo(i,t,n,r?.[o]))}function bo(e,t,n,r){let i=t<wo?yo(e):void 0;if(i===void 0)return X("li",{class:"wg-tree-node"},[X("span",{class:"wg-tree-label"},Ir(e))],r);let o=t<n;return X("li",{class:"wg-tree-node"},[X("details",{class:"wg-tree-branch",...o?{open:""}:{}},[X("summary",{class:"wg-tree-label"},Ir(e)),X("ul",{class:"wg-tree-children"},jr(i,t+1,n))])],r)}var Mr=20,vo=["stack","row","grid"],Eo=["none","sm","md","lg"],ko=4;function Wr(e){if(!ae(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>Mr)return{ok:!1,error:{code:"INVALID_TYPE",path:"data.items",message:`'items' holds ${t.length} sub-widgets; a group renders at most ${Mr}.`}};let n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!ae(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 Hr(e,t){let n=ae(e)?e:{},r=vo.some(d=>d===n.layout)?n.layout:"stack",i=Eo.some(d=>d===n.gap)?n.gap:"md",o=["wg-group",`wg-group-${r}`,`wg-gap-${i}`];if(r==="grid"){let d=typeof n.columns=="number"&&Number.isFinite(n.columns)?n.columns:2,u=Math.min(ko,Math.max(1,Math.trunc(d)));o.push(`wg-cols-${u}`)}return X("div",{class:o.join(" ")},t)}function Fr(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=>Fr(o,t));return{tag:e.tag,...r!==void 0?{attrs:r}:{},...i!==void 0?{children:i}:{}}}var en=class extends Error{code="DUPLICATE_KIND";kind;constructor(t){super(`Widget kind '${t}' is already registered.`),this.name="DuplicateKindError",this.kind=t}};function Oe(){let e=new Map,t=new Map,n={register(r,i,o){if(e.has(r))throw new en(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,i={}){let o=Dr(r,{knownKinds:new Set(e.keys())});if(!o.ok)return o;let d=i.partialData===!0?void 0:t.get(o.payload.kind)?.dataSchema;if(d){let a=Ce(d,o.payload.data);if(a)return{ok:!1,error:a}}if(o.payload.kind==="group"){let a=Wr(o.payload.data);if(!a.ok)return a;let l=[];for(let c=0;c<a.items.length;c++){let f=a.items[c],h=n.render({kind:f.kind,data:f.data,...f.hints!==void 0?{hints:f.hints}:{},...f.meta!==void 0?{meta:f.meta}:{}},i);if(!h.ok){let v=h.error.path;return{ok:!1,error:{...h.error,path:`data.items[${c}]${v?`.${v}`:""}`}}}l.push(Fr(h.node,`data.items.${c}`))}return{ok:!0,node:Hr(o.payload.hints,l)}}let u=e.get(o.payload.kind);if(u===void 0)return{ok:!1,error:{code:"UNKNOWN_KIND",path:"kind",message:`Unknown widget kind '${o.payload.kind}'.`}};try{return{ok:!0,node:u(o.payload)}}catch(a){return{ok:!1,error:{code:"RENDER_FAILED",path:"widget",message:`Renderer for kind '${o.payload.kind}' threw: ${a instanceof Error?a.message:String(a)}`}}}}};return n.register("card",Cr,Dt.card),n.register("table",$r,Dt.table),n.register("tree",Pr,Dt.tree),n.register("group",r=>{let i=n.render(r);if(i.ok)return i.node;throw new Error(i.error.message)},Dt.group),n}function x(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ur=e=>e===`
|
|
2
|
+
`||e==="\r"||e==="\f";function tn(e){let t=[],n=0,r;for(let i=0;i<e.length;i++){let o=e.charAt(i);r!==void 0?(t.push({char:o,depth:n,quoted:!0}),(o===r||Ur(o))&&(r=void 0)):o==='"'||o==="'"?(r=o,t.push({char:o,depth:n,quoted:!0})):o==="("||o==="["?(t.push({char:o,depth:n,quoted:!1}),n++):o===")"||o==="]"?(n=Math.max(0,n-1),t.push({char:o,depth:n,quoted:!1})):t.push({char:o,depth:n,quoted:!1})}return t}var xo=e=>e==="("||e===")"||e==="["||e==="]";function Nt(e){let t=[],n;for(let r=0;r<e.length;r++){let i=e.charAt(r);if(n!==void 0){if(Ur(i))return!1;i===n&&(n=void 0)}else if(i==='"'||i==="'")n=i;else if(i==="("||i==="[")t.push(i==="("?")":"]");else if((i===")"||i==="]")&&t.pop()!==i)return!1}return t.length===0&&n===void 0}function Rt(e,t){let n=[],r="";for(let{char:i,depth:o,quoted:d}of tn(e))o===0&&!d&&t(i)?(n.push(r.trim()),r=""):r+=i;return n.push(r.trim()),n.filter(i=>i.length>0)}function Br(e){return tn(e).filter(({char:t,depth:n,quoted:r})=>n===0&&!r&&!xo(t)).map(({char:t})=>t).join("")}function zr(e,t){return tn(e).findIndex(({char:n,depth:r,quoted:i})=>r===0&&!i&&t(n))}function Vr(e,t){let n=tn(e),r=[];for(let i=0;i<n.length;i++){let o=n[i];if(o===void 0||o.char!=="("||o.depth!==0||o.quoted)continue;let d=e.slice(0,i).toLowerCase();if(!t.some(a=>d.endsWith(`:${a}`)))continue;let u=i+1;for(;u<n.length;){let a=n[u];if(a!==void 0&&a.char===")"&&a.depth===0&&!a.quoted)break;u++}r.push(e.slice(i+1,u))}return r}var Lt=/[;{}<>@\\]/,dt=/^-?[a-zA-Z][a-zA-Z-]*$/;function ze(e){return x(e)?Object.values(e).every(t=>x(t)&&Object.values(t).every(n=>typeof n=="string")):!1}var Ve=["url(","expression(","image-set(","src("],Jr=/\/\*|\*\//;function So(e){return Ve.some(t=>new RegExp(`${t.slice(0,-1)}\\s*\\(`,"i").test(e))}var To=["is","where","matches","-webkit-any","-moz-any"],Kr=e=>/[\s>+~]/.test(e);function Ao(e,t){let n=Rt(e,r=>r===",");return n.length>0&&n.every(r=>qr(r,t))}var Do=16;function qr(e,t=0){return t>Do?!1:Rt(e,Kr).some(n=>Br(n).includes(".wg-")||Vr(n,To).some(r=>Ao(r,t+1)))}function Oo(e){if(Lt.test(e)||Jr.test(e)||!Nt(e))return!1;let t=Rt(e,n=>n===",");return t.length>0&&t.every(n=>!/^[>+~]/.test(n)&&qr(n))}function No(e){return!Lt.test(e)&&!Jr.test(e)&&Nt(e)&&!So(e)}function Ro(e,t){if(!/^(:root|html)(?![\w-])/i.test(e))return`:where(${t}) ${e}`;let n=zr(e,Kr),r=n===-1?e.length:n;return`${e.slice(0,r)}:where(${t})${e.slice(r)}`}function nn(e){return Kn(e,void 0)}function Kn(e,t){let n=[];for(let[r,i]of Object.entries(e)){if(!Oo(r)||typeof i!="object"||i===null)continue;let o=[];for(let[d,u]of Object.entries(i))dt.test(d)&&(typeof u!="string"||!No(u)||o.push(` ${d}: ${u};`));if(o.length>0){let d=t===void 0?r:Rt(r,u=>u===",").map(u=>Ro(u,t)).join(", ");n.push(`${d} {
|
|
3
|
+
${o.join(`
|
|
3
4
|
`)}
|
|
4
|
-
}`)}return
|
|
5
|
-
`)}
|
|
6
|
-
${
|
|
5
|
+
}`)}}return n.join(`
|
|
6
|
+
`)}var ve=/^[a-zA-Z0-9._-]+$/;var ct={selectors:"Every selector part (split on top-level commas) must be held to .wg- classes: one of its compounds names a .wg- class itself, or through :is() or :where() whose every argument does. A .wg- class only inside :not(), :has(), an attribute test or a string does not count, and no part may open with a combinator \u2014 e.g. '.wg-card .wg-xcard-head', '.wg-row:has(.wg-ok, .wg-warn)' or ':is(.wg-btn, .wg-link):hover'.",banned:`Selectors, properties, or values matching ${Lt.source}, holding a comment marker (/* or */) or an unclosed bracket or string, or calling ${Ve.join(", ")} are dropped.`,propertyNames:`Property names must match ${dt.source} (letters and hyphens, optionally leading '-'); anything else is dropped.`};var ut=["number","currency","date","count","join","truncate","pluralize"],qn=["count","join","pluralize"],ft=e=>ut.some(t=>t===e),Je=0,Ke=8,qe=["narrowSymbol","symbol","code"],pt=e=>qe.some(t=>t===e),on=/^[A-Z]{3}$/,gt=["yyyy","MM","dd","HH","mm","ss"],Yr=" -/:.,T",sn=40,Gn=new RegExp(`^[${Yr.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}yMdHms]*$`),Xr=1e11,an=/^[A-Za-z]{2,8}(?:-[A-Za-z0-9]{2,8}){0,3}$/,rn="en-US",$e=16,_t=", ",Ge=1,Ye=1e3,Xe=8,dn="\u2026",Ct=["zero","one","two","few","many","other"],cn=e=>Ct.some(t=>t===e),$t=80,mt="{count}",ln=e=>typeof e=="string"&&e.split(".").every(t=>t!==""&&!t.startsWith("$"));function un(e){let t=[],n="",r=0,i=0;e:for(;i<e.length;){for(let d of gt)if(e.startsWith(d,i)){n!==""&&t.push({literal:n}),n="",t.push({token:d}),r+=1,i+=d.length;continue e}let o=e[i];if(/[A-Za-z]/.test(o))return;n+=o,i+=1}return n!==""&&t.push({literal:n}),r===0?void 0:t}function Yn(e){try{return Intl.NumberFormat.supportedLocalesOf([e]).length>0}catch{return!1}}function Zr(e){if(typeof e=="number")return Number.isFinite(e)?e:void 0;if(typeof e!="string")return;let t=e.trim();if(t==="")return;let n=Number(t);return Number.isFinite(n)?n:void 0}function Lo(e){if(typeof e=="number")return Number.isFinite(e)?Math.abs(e)<Xr?e*1e3:e:void 0;if(typeof e!="string")return;let t=e.trim();if(t==="")return;let n=/^(\d{4}-\d{2}-\d{2})(?:[T ](\d{2}:\d{2}(?::\d{2})?)(?:\.(\d+))?(Z|[+-]\d{2}:?\d{2})?)?$/.exec(t);if(n===null)return;let[,r,i,o,d]=n,u=o===void 0?"":`.${o.slice(0,3)}`,a=i===void 0?"00:00:00":i.length===5?`${i}:00`:i,l=Date.parse(`${r}T${a}${u}${d??"Z"}`);return Number.isFinite(l)?l:void 0}var lt=(e,t)=>String(e).padStart(t,"0");function _o(e,t){let n=new Date(e),r=i=>{switch(i){case"yyyy":return lt(n.getUTCFullYear(),4);case"MM":return lt(n.getUTCMonth()+1,2);case"dd":return lt(n.getUTCDate(),2);case"HH":return lt(n.getUTCHours(),2);case"mm":return lt(n.getUTCMinutes(),2);case"ss":return lt(n.getUTCSeconds(),2)}};return t.map(i=>"token"in i?r(i.token):i.literal).join("")}var Qr=/[\u00A0\u202F\u2009]/g,ye=e=>re(e);function fn(e){if(!x(e)||!ft(e.type))return;if(e.type==="date")return typeof e.pattern=="string"?{type:"date",pattern:e.pattern}:void 0;let t=typeof e.locale=="string"&&an.test(e.locale)?e.locale:void 0,n=t===void 0?{}:{locale:t};if(e.type==="count")return{type:"count",...n};if(e.type==="join"){let o=d=>typeof d=="string"&&d.length<=$e;return{type:"join",...o(e.separator)?{separator:e.separator}:{},...o(e.last)?{last:e.last}:{},...ln(e.field)?{field:e.field}:{}}}if(e.type==="truncate"){if(typeof e.length!="number"||!Number.isInteger(e.length)||e.length<Ge||e.length>Ye)return;let o=typeof e.ellipsis=="string"&&e.ellipsis.length<=Xe?e.ellipsis:void 0;return{type:"truncate",length:e.length,...o===void 0?{}:{ellipsis:o}}}if(e.type==="pluralize"){if(!x(e.forms))return;let o={};for(let u of Ct){let a=e.forms[u];typeof a=="string"&&a.length<=$t&&(o[u]=a)}let d=o.other;return d===void 0?void 0:{type:"pluralize",forms:{...o,other:d},...n}}let r=typeof e.decimals=="number"&&Number.isInteger(e.decimals)&&e.decimals>=Je&&e.decimals<=Ke?e.decimals:void 0,i={...r===void 0?{}:{decimals:r},...t===void 0?{}:{locale:t}};if(e.type==="number")return{type:"number",...i};if(!(typeof e.currency!="string"||!on.test(e.currency)))return{type:"currency",currency:e.currency,...pt(e.currencyDisplay)?{currencyDisplay:e.currencyDisplay}:{},...i}}function Co(e){if(e.type==="join")return Po(e);if(e.type==="truncate")return jo(e);if(e.type==="count"||e.type==="pluralize"){let i=$o(e.locale??rn);return i===void 0?ye:e.type==="count"?o=>Array.isArray(o)?i(o.length):ye(o):Mo(e,i)}if(e.type==="date"){let i=un(e.pattern);return i===void 0?ye:o=>{let d=Lo(o);return d===void 0?ye(o):_o(d,i)}}let t=e.locale??rn,n=e.decimals===void 0?{}:{minimumFractionDigits:e.decimals,maximumFractionDigits:e.decimals},r;try{r=e.type==="number"?new Intl.NumberFormat(t,n):new Intl.NumberFormat(t,{style:"currency",currency:e.currency,currencyDisplay:e.currencyDisplay??"narrowSymbol",...n})}catch{return ye}return i=>{let o=Zr(i);return o===void 0?ye(i):r.format(o).replace(Qr," ")}}function $o(e){try{let t=new Intl.NumberFormat(e);return n=>t.format(n).replace(Qr," ")}catch{return}}function Io(e,t){let n=e;if(t!==void 0&&x(e))for(let r of t)if(Array.isArray(n)){let i=Number(r);n=Number.isInteger(i)?n[i]:void 0}else x(n)?n=n[r]:n=void 0;return n==null?"":re(n)}function Po(e){let t=e.separator??_t,n=e.field===void 0?void 0:e.field.split(".");return r=>{if(!Array.isArray(r))return ye(r);let i=r.map(o=>Io(o,n)).filter(o=>o!=="");return e.last===void 0||i.length<2?i.join(t):i.slice(0,-1).join(t)+e.last+i[i.length-1]}}function jo(e){let t=e.ellipsis??dn;return n=>{let r=re(n),i=Array.from(r);return i.length<=e.length?r:i.slice(0,e.length).join("").trimEnd()+t}}function Mo(e,t){let n;try{n=new Intl.PluralRules(e.locale??rn)}catch{return ye}return r=>{let i=Array.isArray(r)?r.length:Zr(r);if(i===void 0)return ye(r);let o=i===0&&e.forms.zero!==void 0?"zero":n.select(i);return((cn(o)?e.forms[o]:void 0)??e.forms.other).split(mt).join(t(i))}}var Gr=new WeakMap;function ei(e){if(!x(e))return ye;let t=Gr.get(e);if(t!==void 0)return t;let n=fn(e),r=n===void 0?ye:Co(n);return Gr.set(e,r),r}function pn(e,t){return ei(t)(e)}var Ee={bg:{default:"#ffffff",type:"color",use:"Page background behind widgets."},surface:{default:"#ffffff",type:"color",fallback:"bg",use:"Widget panel background (cards, tables); falls back to bg when unset."},fg:{default:"#1f2430",type:"color",use:"Primary text."},muted:{default:"#6b7280",type:"color",use:"Secondary text: labels, captions, keys."},accent:{default:"#2563eb",type:"color",use:"Emphasis: titles, links, filled badges."},"accent-fg":{default:"#ffffff",type:"color",use:"Text drawn on an accent fill (filled badges and buttons)."},border:{default:"#e2e8f0",type:"color",use:"Hairlines: panel edges, row rules."},"border-width":{default:"1px",type:"dimension",use:"Width of those hairlines."},radius:{default:"6px",type:"dimension",use:"Default corner rounding."},"radius-sm":{default:"3px",type:"dimension",use:"Tight rounding: pills, chips, inline marks."},"radius-lg":{default:"12px",type:"dimension",use:"Generous rounding: hero media, large panels."},spacing:{default:"8px",type:"dimension",use:"Base spacing step."},"spacing-sm":{default:"4px",type:"dimension",use:"Half step: inline gaps inside a row."},"spacing-lg":{default:"16px",type:"dimension",use:"Double step: section separation."},"font-family":{default:"system-ui, -apple-system, 'Segoe UI', sans-serif",type:"font-family",use:"Body text family."},"font-mono":{default:"ui-monospace, SFMono-Regular, Menlo, monospace",type:"font-family",use:"Monospace family for the wg-code block utility."},"font-size":{default:"14px",type:"dimension",use:"Body text size."},"font-size-sm":{default:"12px",type:"dimension",use:"Small text: captions, stats, pills."},"font-size-lg":{default:"18px",type:"dimension",use:"Large text: widget titles."},"font-weight-bold":{default:"600",type:"font-weight",use:"Weight for titles and emphasized labels."},"line-height":{default:"1.45",type:"number",use:"Text density."},shadow:{default:"0 1px 3px rgba(0, 0, 0, 0.12)",type:"shadow",use:"Panel elevation."},danger:{default:"#b91c1c",type:"color",use:"Error status: fills and text (see .wg-status-danger)."},"danger-fg":{default:"#ffffff",type:"color",use:"Text on a danger fill."},success:{default:"#15803d",type:"color",use:"Success status (see .wg-status-success)."},"success-fg":{default:"#ffffff",type:"color",use:"Text on a success fill."},warning:{default:"#b45309",type:"color",use:"Warning status (see .wg-status-warning)."},"warning-fg":{default:"#ffffff",type:"color",use:"Text on a warning fill."},info:{default:"#0369a1",type:"color",use:"Informational status (see .wg-status-info)."},"info-fg":{default:"#ffffff",type:"color",use:"Text on an info fill."},"avatar-size":{default:"32px",type:"dimension",use:"Box of .wg-img-avatar images."},"thumb-size":{default:"48px",type:"dimension",use:"Box of .wg-img-thumb images."}},Ze=Object.fromEntries(Object.entries(Ee).map(([e,t])=>[e,t.default])),ke=Object.keys(Ee),Xn=/[;{}<>\\]/;function Qe(e){return!Xn.test(e)&&Nt(e)&&!/\/\*|\*\//.test(e)&&!Ve.some(t=>new RegExp(`${t.slice(0,-1)}\\s*\\(`,"i").test(e))}var Zn=`Token values are plain CSS values. Rejected: anything matching ${Xn.source}, a comment marker (/* or */), an unclosed bracket or string, and calls to ${Ve.join(", ")} (case-insensitive, whitespace-tolerant). Keep values to colors, lengths, and font stacks.`;function _(e){return`var(--wg-${e}, ${Ze[e]})`}var Wo=`:root {
|
|
7
|
+
${ke.map(e=>` --wg-${e}: ${Ze[e]};`).join(`
|
|
7
8
|
`)}
|
|
8
|
-
}`,
|
|
9
|
-
${
|
|
9
|
+
}`,Qn="1.25em",ni=`
|
|
10
|
+
${Wo}
|
|
10
11
|
.wg-card, .wg-table, .wg-tree, .wg-code, .wg-template {
|
|
11
|
-
font-family: ${
|
|
12
|
-
font-size: ${
|
|
13
|
-
line-height: ${
|
|
14
|
-
color: ${
|
|
12
|
+
font-family: ${_("font-family")};
|
|
13
|
+
font-size: ${_("font-size")};
|
|
14
|
+
line-height: ${_("line-height")};
|
|
15
|
+
color: ${_("fg")};
|
|
15
16
|
}
|
|
16
17
|
.wg-card {
|
|
17
|
-
background: var(--wg-surface, ${
|
|
18
|
-
border: ${
|
|
19
|
-
border-radius: ${
|
|
20
|
-
box-shadow: ${
|
|
21
|
-
padding: ${
|
|
18
|
+
background: var(--wg-surface, ${_("bg")});
|
|
19
|
+
border: ${_("border-width")} solid ${_("border")};
|
|
20
|
+
border-radius: ${_("radius-lg")};
|
|
21
|
+
box-shadow: ${_("shadow")};
|
|
22
|
+
padding: ${_("spacing-lg")};
|
|
22
23
|
}
|
|
23
24
|
.wg-card-title {
|
|
24
|
-
color: ${
|
|
25
|
-
font-size: ${
|
|
26
|
-
font-weight: ${
|
|
27
|
-
margin-bottom: ${
|
|
25
|
+
color: ${_("accent")};
|
|
26
|
+
font-size: ${_("font-size-lg")};
|
|
27
|
+
font-weight: ${_("font-weight-bold")};
|
|
28
|
+
margin-bottom: ${_("spacing")};
|
|
28
29
|
}
|
|
29
30
|
.wg-card-subtitle {
|
|
30
|
-
color: ${
|
|
31
|
-
font-size: ${
|
|
32
|
-
margin-bottom: ${
|
|
31
|
+
color: ${_("muted")};
|
|
32
|
+
font-size: ${_("font-size-sm")};
|
|
33
|
+
margin-bottom: ${_("spacing")};
|
|
33
34
|
}
|
|
34
35
|
.wg-card-fields {
|
|
35
36
|
margin: 0;
|
|
36
37
|
}
|
|
37
38
|
.wg-card-field {
|
|
38
39
|
display: flex;
|
|
39
|
-
gap: ${
|
|
40
|
-
padding: ${
|
|
40
|
+
gap: ${_("spacing")};
|
|
41
|
+
padding: ${_("spacing-sm")} 0;
|
|
41
42
|
}
|
|
42
43
|
.wg-card-field-key {
|
|
43
|
-
color: ${
|
|
44
|
+
color: ${_("muted")};
|
|
44
45
|
}
|
|
45
46
|
.wg-card-field-value {
|
|
46
47
|
margin: 0;
|
|
47
48
|
}
|
|
48
49
|
.wg-table {
|
|
49
|
-
background: var(--wg-surface, ${
|
|
50
|
-
border: ${
|
|
51
|
-
border-radius: ${
|
|
50
|
+
background: var(--wg-surface, ${_("bg")});
|
|
51
|
+
border: ${_("border-width")} solid ${_("border")};
|
|
52
|
+
border-radius: ${_("radius")};
|
|
52
53
|
border-collapse: collapse;
|
|
53
54
|
}
|
|
54
55
|
.wg-table-header {
|
|
55
|
-
color: ${
|
|
56
|
-
font-size: ${
|
|
57
|
-
font-weight: ${
|
|
56
|
+
color: ${_("muted")};
|
|
57
|
+
font-size: ${_("font-size-sm")};
|
|
58
|
+
font-weight: ${_("font-weight-bold")};
|
|
58
59
|
text-align: left;
|
|
59
|
-
border-bottom: calc(${
|
|
60
|
-
padding: ${
|
|
60
|
+
border-bottom: calc(${_("border-width")} * 2) solid ${_("border")};
|
|
61
|
+
padding: ${_("spacing")};
|
|
61
62
|
}
|
|
62
63
|
.wg-table-cell {
|
|
63
|
-
border-bottom: ${
|
|
64
|
-
padding: ${
|
|
64
|
+
border-bottom: ${_("border-width")} solid ${_("border")};
|
|
65
|
+
padding: ${_("spacing")};
|
|
65
66
|
}
|
|
66
67
|
.wg-tree {
|
|
67
68
|
list-style: none;
|
|
@@ -70,16 +71,16 @@ ${ki}
|
|
|
70
71
|
}
|
|
71
72
|
.wg-tree-children {
|
|
72
73
|
list-style: none;
|
|
73
|
-
padding-left: ${
|
|
74
|
-
border-left: ${
|
|
74
|
+
padding-left: ${_("spacing-lg")};
|
|
75
|
+
border-left: ${_("border-width")} solid ${_("border")};
|
|
75
76
|
}
|
|
76
77
|
.wg-tree-node {
|
|
77
|
-
padding: ${
|
|
78
|
+
padding: ${_("spacing-sm")} 0;
|
|
78
79
|
}
|
|
79
80
|
.wg-tree-label {
|
|
80
81
|
display: flex;
|
|
81
82
|
align-items: center;
|
|
82
|
-
gap: ${
|
|
83
|
+
gap: ${_("spacing-sm")};
|
|
83
84
|
}
|
|
84
85
|
.wg-tree-branch > .wg-tree-label {
|
|
85
86
|
cursor: pointer;
|
|
@@ -93,7 +94,7 @@ ${ki}
|
|
|
93
94
|
flex: 0 0 auto;
|
|
94
95
|
width: 0;
|
|
95
96
|
height: 0;
|
|
96
|
-
border-left: 0.4em solid ${
|
|
97
|
+
border-left: 0.4em solid ${_("muted")};
|
|
97
98
|
border-top: 0.3em solid transparent;
|
|
98
99
|
border-bottom: 0.3em solid transparent;
|
|
99
100
|
}
|
|
@@ -102,84 +103,101 @@ ${ki}
|
|
|
102
103
|
}
|
|
103
104
|
.wg-tree-icon {
|
|
104
105
|
flex: 0 0 auto;
|
|
105
|
-
width: ${
|
|
106
|
+
width: ${Qn};
|
|
106
107
|
text-align: center;
|
|
107
108
|
}
|
|
108
109
|
.wg-img-icon {
|
|
109
110
|
flex: 0 0 auto;
|
|
110
|
-
width: ${
|
|
111
|
-
height: ${
|
|
112
|
-
border-radius: ${
|
|
111
|
+
width: ${Qn};
|
|
112
|
+
height: ${Qn};
|
|
113
|
+
border-radius: ${_("radius-sm")};
|
|
113
114
|
}
|
|
114
115
|
/* Monospace block utility. No built-in emits it: it is a styling surface
|
|
115
116
|
template authors opt into, and what keeps the font-mono token consumed. */
|
|
116
117
|
.wg-code {
|
|
117
|
-
font-family: ${
|
|
118
|
-
background: var(--wg-surface, ${
|
|
119
|
-
border: ${
|
|
120
|
-
border-radius: ${
|
|
121
|
-
padding: ${
|
|
118
|
+
font-family: ${_("font-mono")};
|
|
119
|
+
background: var(--wg-surface, ${_("bg")});
|
|
120
|
+
border: ${_("border-width")} solid ${_("border")};
|
|
121
|
+
border-radius: ${_("radius")};
|
|
122
|
+
padding: ${_("spacing")};
|
|
122
123
|
overflow: auto;
|
|
123
124
|
}
|
|
124
125
|
.wg-status {
|
|
125
126
|
display: inline-block;
|
|
126
|
-
padding: 0 ${
|
|
127
|
-
border-radius: ${
|
|
128
|
-
font-size: ${
|
|
129
|
-
font-weight: ${
|
|
130
|
-
}
|
|
131
|
-
.wg-status-danger { background: ${
|
|
132
|
-
.wg-status-success { background: ${
|
|
133
|
-
.wg-status-warning { background: ${
|
|
134
|
-
.wg-status-info { background: ${
|
|
135
|
-
.wg-status-accent { background: ${
|
|
127
|
+
padding: 0 ${_("spacing-sm")};
|
|
128
|
+
border-radius: ${_("radius-sm")};
|
|
129
|
+
font-size: ${_("font-size-sm")};
|
|
130
|
+
font-weight: ${_("font-weight-bold")};
|
|
131
|
+
}
|
|
132
|
+
.wg-status-danger { background: ${_("danger")}; color: ${_("danger-fg")}; }
|
|
133
|
+
.wg-status-success { background: ${_("success")}; color: ${_("success-fg")}; }
|
|
134
|
+
.wg-status-warning { background: ${_("warning")}; color: ${_("warning-fg")}; }
|
|
135
|
+
.wg-status-info { background: ${_("info")}; color: ${_("info-fg")}; }
|
|
136
|
+
.wg-status-accent { background: ${_("accent")}; color: ${_("accent-fg")}; }
|
|
136
137
|
.wg-img {
|
|
137
138
|
object-fit: cover;
|
|
138
139
|
vertical-align: middle;
|
|
139
|
-
background: ${
|
|
140
|
+
background: ${_("border")};
|
|
140
141
|
}
|
|
141
142
|
.wg-img-avatar {
|
|
142
|
-
width: ${
|
|
143
|
-
height: ${
|
|
143
|
+
width: ${_("avatar-size")};
|
|
144
|
+
height: ${_("avatar-size")};
|
|
144
145
|
border-radius: 50%;
|
|
145
146
|
}
|
|
146
147
|
.wg-img-thumb {
|
|
147
|
-
width: ${
|
|
148
|
-
height: ${
|
|
149
|
-
border-radius: ${
|
|
148
|
+
width: ${_("thumb-size")};
|
|
149
|
+
height: ${_("thumb-size")};
|
|
150
|
+
border-radius: ${_("radius")};
|
|
150
151
|
}
|
|
151
152
|
.wg-img-hero {
|
|
152
153
|
display: block;
|
|
153
154
|
width: 100%;
|
|
154
155
|
max-width: 100%;
|
|
155
156
|
height: auto;
|
|
156
|
-
border-radius: ${
|
|
157
|
+
border-radius: ${_("radius")};
|
|
157
158
|
}
|
|
158
159
|
.wg-table-caption {
|
|
159
160
|
caption-side: top;
|
|
160
161
|
text-align: left;
|
|
161
|
-
padding-bottom: ${
|
|
162
|
+
padding-bottom: ${_("spacing")};
|
|
162
163
|
}
|
|
163
164
|
.wg-table-title {
|
|
164
165
|
display: block;
|
|
165
|
-
color: ${
|
|
166
|
-
font-size: ${
|
|
167
|
-
font-weight: ${
|
|
168
|
-
margin-bottom: ${
|
|
166
|
+
color: ${_("accent")};
|
|
167
|
+
font-size: ${_("font-size-lg")};
|
|
168
|
+
font-weight: ${_("font-weight-bold")};
|
|
169
|
+
margin-bottom: ${_("spacing-sm")};
|
|
169
170
|
}
|
|
170
171
|
.wg-table-subtitle {
|
|
171
172
|
display: block;
|
|
172
|
-
color: ${
|
|
173
|
-
font-size: ${
|
|
173
|
+
color: ${_("muted")};
|
|
174
|
+
font-size: ${_("font-size-sm")};
|
|
174
175
|
}
|
|
175
176
|
.wg-tree-title {
|
|
176
|
-
color: ${
|
|
177
|
-
font-size: ${
|
|
178
|
-
font-weight: ${
|
|
179
|
-
margin-bottom: ${
|
|
177
|
+
color: ${_("accent")};
|
|
178
|
+
font-size: ${_("font-size-lg")};
|
|
179
|
+
font-weight: ${_("font-weight-bold")};
|
|
180
|
+
margin-bottom: ${_("spacing")};
|
|
180
181
|
}
|
|
181
182
|
.wg-link {
|
|
182
|
-
color: ${
|
|
183
|
+
color: ${_("accent")};
|
|
184
|
+
text-decoration: underline;
|
|
185
|
+
}
|
|
186
|
+
.wg-md p, .wg-md ul, .wg-md ol {
|
|
187
|
+
margin: 0 0 ${_("spacing")};
|
|
188
|
+
}
|
|
189
|
+
.wg-md > :last-child {
|
|
190
|
+
margin-bottom: 0;
|
|
191
|
+
}
|
|
192
|
+
.wg-md ul, .wg-md ol {
|
|
193
|
+
padding-left: 1.5em;
|
|
194
|
+
}
|
|
195
|
+
.wg-md code {
|
|
196
|
+
font-family: ${_("font-mono")};
|
|
197
|
+
font-size: 0.9em;
|
|
198
|
+
}
|
|
199
|
+
.wg-md a {
|
|
200
|
+
color: ${_("accent")};
|
|
183
201
|
text-decoration: underline;
|
|
184
202
|
}
|
|
185
203
|
.wg-group {
|
|
@@ -205,25 +223,30 @@ ${ki}
|
|
|
205
223
|
.wg-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
|
|
206
224
|
.wg-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
|
|
207
225
|
.wg-gap-none { gap: 0; }
|
|
208
|
-
.wg-gap-sm { gap: ${
|
|
209
|
-
.wg-gap-md { gap: ${
|
|
210
|
-
.wg-gap-lg { gap: ${
|
|
211
|
-
`.trim(),rr="data-widgentic";function hn(e){if(e.head.querySelector(`style[${rr}]`))return;let t=e.createElement("style");t.setAttribute(rr,"base"),t.textContent=ir,e.head.appendChild(t)}function Ei(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Si=new Set(ve),wn=/^x-[a-z0-9][a-z0-9-]*$/;function Ti(e){return Object.keys(e).filter(t=>wn.test(t))}function or(e){return`--wg-${e}`}function Ue(e){if(!Ei(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!Si.has(t)&&!wn.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"||!Be(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 Ai(e){let t=e,n;for(let r of ve){let{fallback:i}=be[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 yn(e,t){let n=Ai(t),r=e.style;if(!r)return;for(let o of ve)r.removeProperty(or(o));for(let o=r.length-1;o>=0;o--){let a=r.item(o);a.startsWith("--wg-x-")&&r.removeProperty(a)}let i=[...ve,...Ti(n)];for(let o of i){let a=n[o];typeof a=="string"&&Be(a)&&r.setProperty(or(o),a)}}var _t=/^(?:on.*|srcdoc)$/i,It=new Set(["script","iframe","frame","frameset","object","embed","style","link","meta","base","template","noscript"]),Mt=/^data-wg-/i,sr=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),bn=64;var Di=new Set(["$meta","$root","$parent","$index"]);function xe(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===""||Di.has(a)))return{base:r,up:i,index:!1,segments:o}}var Ht=/^[a-z][a-z0-9-]{0,63}$/,Ft=Ht,pt=["replace","merge","patch"],ft=["GET","POST"];function re(e,t){return e===""?t:`${e}.${t}`}function B(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var Oi=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Ni=new Set(["host","content-length","transfer-encoding","connection"]),Ri=new Set(["__proto__","constructor","prototype"]);function Bt(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!Ri.has(t))}function Li(e,t){if(typeof e!="string")return k(e)&&typeof e.secret=="string"?Ht.test(e.secret)?Object.keys(e).length!==1?B("A secret reference carries only 'secret'.",t):void 0:B(`Secret reference '${e.secret}' is not a valid secret name.`,t):B("Value must be a string or a { secret } reference.",t)}function vn(e){return!k(e)&&!Array.isArray(e)?!1:k(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(vn)}function Ci(e,t){if(typeof e!="string"||e.length===0)return B("'url' must be a non-empty string.",t);let n;try{n=new URL(e)}catch{return B(`'url' must be an absolute URL (got '${e}').`,t)}if(n.protocol!=="https:")return B("'url' must use https.",t);if(n.username!==""||n.password!=="")return B("'url' must not carry userinfo.",t);if(n.hash!=="")return B("'url' must not carry a fragment.",t)}function rt(e,t="",n={}){if(!k(e))return B("Action definition must be an object.",t);if(e.kind==="prompt"){if(!Array.isArray(e.text))return B("'text' must be an array of literals and { bind } segments.",re(t,"text"));let r=0;for(let i=0;i<e.text.length;i++){let o=e.text[i];if(typeof o=="string"){r+=o.length;continue}if(k(o)&&typeof o.bind=="string"&&Object.keys(o).length===1){if(n.isPath&&!n.isPath(o.bind))return B(`Invalid data path '${o.bind}'.`,re(t,`text.${i}`));continue}return B("Prompt segments are strings or { bind } objects.",re(t,`text.${i}`))}return r>2e3?B(`Prompt text exceeds ${2e3} characters.`,re(t,"text")):void 0}if(e.kind==="http"){if(!ft.some(i=>i===e.method))return B("'method' must be GET or POST.",re(t,"method"));let r=Ci(e.url,re(t,"url"));if(r)return r;if(!k(e.input)||e.input.type!=="object")return B(`'input' must be a JSON Schema with type "object".`,re(t,"input"));if(vn(e.input))return B("Secret references are allowed only in headers and query.",re(t,"input"));if(!k(e.output))return B("'output' must be a JSON Schema object.",re(t,"output"));for(let i of["headers","query"]){let o=e[i];if(o!==void 0){if(!k(o))return B(`'${i}' must be an object.`,re(t,i));for(let[a,f]of Object.entries(o)){let d=re(t,`${i}.${a}`);if(!Oi.test(a))return B(`'${a}' is not a valid ${i==="headers"?"header":"parameter"} name.`,d);if(i==="headers"&&Ni.has(a.toLowerCase()))return B(`Header '${a}' is set by the transport and cannot be declared.`,d);let u=Li(f,d);if(u)return u}}}return}return B(`'kind' must be "prompt" or "http".`,re(t,"kind"))}function $i(e,t){return typeof e.ref=="string"?t.resolve?.(e.ref):e.definition}function Ut(e,t="",n={}){if(!k(e))return B("Action binding must be an object.",t);if("ref"in e){if(typeof e.ref!="string"||e.ref.length===0)return B("'ref' must name a shared action.",re(t,"ref"));if("definition"in e)return B("A binding is either a { ref } or a { definition }, not both.",t);if(n.resolve&&n.resolve(e.ref)===void 0)return B(`Unknown action '${e.ref}'.`,re(t,"ref"))}else if("definition"in e){let o=rt(e.definition,re(t,"definition"),{...n.isPath?{isPath:n.isPath}:{}});if(o)return o}else return B("A binding names a shared action ({ ref }) or carries an inline { definition }.",t);let i=$i(e,n);if(n.loadOnly&&i!==void 0&&(i.kind!=="http"||i.method!=="GET"))return B("'load' accepts only http GET actions.",t);if(e.input!==void 0){if(!k(e.input))return B("'input' must be an object.",re(t,"input"));if(i?.kind==="prompt")return B("Prompt actions take no input mapping.",re(t,"input"));let o=i?.kind==="http"&&k(i.input.properties)?i.input.properties:void 0;for(let[a,f]of Object.entries(e.input)){let d=re(t,`input.${a}`);if(o!==void 0&&!(a in o))return B(`Input field '${a}' is not declared by the action's input schema.`,d);if(typeof f=="string"){if(n.isPath&&!n.isPath(f))return B(`Invalid data path '${f}'.`,d);continue}if(k(f)&&"const"in f&&Object.keys(f).length===1){if(vn(f.const))return B("Secret references are allowed only in headers and query.",d);continue}return B("Input values are data paths or { const } literals.",d)}}if(e.output!==void 0){let o=re(t,"output");if(!k(e.output))return B("'output' must be an object.",o);if(i?.kind==="prompt")return B("Prompt actions have no output.",o);let{mode:a,path:f,map:d}=e.output;if(a!==void 0&&!pt.some(u=>u===a))return B("'mode' must be replace, merge or patch.",re(o,"mode"));if(a==="patch"){if(typeof f!="string"||!Bt(f))return B("'patch' requires a valid data 'path'.",re(o,"path"))}else if(f!==void 0)return B(`'path' is only meaningful with mode "patch".`,re(o,"path"));if(d!==void 0){if(!k(d))return B("'map' must be an object of data paths.",re(o,"map"));let u=Object.entries(d);if(u.length===0)return B("'map' must not be empty (omit it to take the whole response).",re(o,"map"));for(let[l,p]of u){let m=re(o,`map.${l}`);if(l!=="."&&!Bt(l))return B(`'${l}' is not a valid data path.`,m);if(typeof p!="string"||p!=="."&&!Bt(p))return B("Map values are data paths into the response ('.' for the whole response).",m)}}}}function mt(e,t="load",n={}){return Ut(e,t,{...n,loadOnly:!0})}function ze(e,t){return e===""?t:`${e}.${t}`}function oe(e,t){return{code:"INVALID_TEMPLATE_NODE",message:e,path:t}}function ar(e,t,n){let r=i=>oe(`${t}: ${i}`,n);if(!k(e))return r("'format' must be an object.");if(!et(e.type))return r(`'format.type' must be one of ${Qe.join(", ")}.`);if(e.type==="date")return typeof e.pattern!="string"?r("'format.pattern' must be a string."):e.pattern.length===0||e.pattern.length>Ct?r(`'format.pattern' must be 1-${Ct} characters.`):fn.test(e.pattern)?jt(e.pattern)===void 0?r(`'format.pattern' must use at least one of ${nt.join(", ")} and no stray letters.`):void 0:r("'format.pattern' may contain only the date tokens and separators.");if(e.decimals!==void 0&&(typeof e.decimals!="number"||!Number.isInteger(e.decimals)||e.decimals<Ie||e.decimals>Me))return r(`'format.decimals' must be an integer ${Ie}-${Me}.`);if(e.locale!==void 0&&(typeof e.locale!="string"||!$t.test(e.locale)||!gn(e.locale)))return r("'format.locale' must be a BCP-47 language tag this runtime knows.");if(e.type==="currency"){if(typeof e.currency!="string"||!Lt.test(e.currency))return r("'format.currency' must be a three-letter uppercase ISO-4217 code.");if(e.currencyDisplay!==void 0&&!tt(e.currencyDisplay))return r(`'format.currencyDisplay' must be one of ${He.join(", ")}.`)}return Pt(e)===void 0?r("'format' is not a spec the engine accepts."):void 0}var dr=["map","prefix","format"];function wt(e){let t=dr.filter(n=>e[n]!==void 0);return t.length>1?"conflict":t[0]}function ht(e,t){if(xe(e)===void 0)return{code:"INVALID_PATH",message:`Invalid data path '${e}'.`,path:t}}function it(e,t,n){if(n>bn)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${bn}.`,path:t};if(typeof e!="string"){if(!k(e))return oe("Template node must be a string or a plain object.",t);if("bind"in e){if(typeof e.bind!="string")return oe("'bind' must be a string path.",t);let r=ht(e.bind,t);return r||(e.map!==void 0&&e.format!==void 0?oe("A text bind carries either 'map' or 'format' \u2014 one transform per value.",t):e.map!==void 0?!k(e.map)||Object.values(e.map).some(i=>typeof i!="string")?oe("Bind: 'map' must be an object of string values.",t):e.default!==void 0&&typeof e.default!="string"?oe("Bind: 'default' must be a string.",t):void 0:e.default!==void 0?oe("Bind: 'default' requires 'map'.",t):e.format!==void 0?ar(e.format,"Bind",t):void 0)}if("each"in e){if(typeof e.each!="string")return oe("'each' must be a string path.",t);let r=ht(e.each,t);if(r)return r;if("key"in e&&e.key!==void 0){if(typeof e.key!="string")return oe("'key' must be a string path.",t);let o=ht(e.key,t);if(o)return o}if(!("template"in e))return oe("'each' node requires a 'template'.",t);let i=it(e.template,ze(t,"template"),n+1);return i||("empty"in e&&e.empty!==void 0?it(e.empty,ze(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=ht(e.when,t);if(r)return r;if(!("template"in e))return oe("'when' node requires a 'template'.",t);let i=it(e.template,ze(t,"template"),n+1);return i||("else"in e&&e.else!==void 0?it(e.else,ze(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(It.has(e.tag.toLowerCase()))return{code:"FORBIDDEN_TAG",message:`Element '${e.tag}' is not allowed in templates (active or foreign content).`,path:t};if("attrs"in e&&e.attrs!==void 0){if(!k(e.attrs))return oe("'attrs' must be an object.",t);for(let[r,i]of Object.entries(e.attrs)){let o=ze(t,`attrs.${r}`);if(_t.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is not allowed in templates (event handlers and srcdoc).`,path:o};if(Mt.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is reserved for the renderer (data-wg-*); use an 'action' binding.`,path:o};if(typeof i!="string"){if(k(i)&&typeof i.bind=="string"){let a=ht(i.bind,o);if(a)return a;let f=wt(i),d=f==="map",u=f==="prefix",l=f==="format";if(f==="conflict")return oe(`Attribute '${r}' carries more than one of 'map', 'prefix' and 'format' \u2014 one transform per value.`,o);if(d){if(!k(i.map)||Object.values(i.map).some(p=>typeof p!="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(u&&typeof i.prefix!="string")return oe(`Attribute '${r}': 'prefix' must be a string.`,o);if(l){let p=ar(i.format,`Attribute '${r}'`,o);if(p)return p}continue}return oe(`Attribute '${r}' must be a string, { bind }, { bind, map, default? }, { bind, prefix } or { bind, format } value.`,o)}}}if("action"in e&&e.action!==void 0){if(k(e.attrs)&&Object.keys(e.attrs).some(o=>o.toLowerCase()==="href"))return{code:"CONFLICTING_ATTRIBUTES",message:"An element carries 'href' or an 'action' binding, never both.",path:t};let i=Ut(e.action,ze(t,"action"),{isPath:o=>xe(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=it(e.children[r],ze(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 Oe(e){let t=it(e,"",0);return t?{ok:!1,error:t}:{ok:!0,template:e}}function ji(e,t,n){let r=i=>{if(k(i)){k(i.action)&&n(i.action);for(let o of["template","empty","else"])i[o]!==void 0&&r(i[o]);if(Array.isArray(i.children))for(let o of i.children)r(o)}};r(e),k(t)&&n(t)}function yt(e,t){let n=new Set;return ji(e,t,r=>{typeof r.ref=="string"&&n.add(r.ref)}),[...n]}function zt(e,t){return e===""?t:`${e}.${t}`}function Ve(e,t,n){let r=xe(e);if(r===void 0)return;let i;if(r.base==="meta")i=n;else if(r.base==="root")i=t[0]?.scope;else{let o=t.length-1-r.up;if(o<0)return;let a=t[o];if(a===void 0)return;if(r.index)return a.index;i=a.scope}for(let o of r.segments)if(Array.isArray(i)){let a=Number(o);i=Number.isInteger(a)?i[a]:void 0}else if(k(i))i=i[o];else return;return i}function Pi(e){if(typeof e=="string")return e;if(typeof e=="number"&&Number.isFinite(e))return String(e)}var cr=5e4;function Wi(e,t,n,r,i){let o="ref"in e&&typeof e.ref=="string"?i.actions?.(e.ref):"definition"in e&&k(e.definition)?e.definition:void 0;if(o===void 0||o.kind!=="prompt"&&o.kind!=="http"){let d={id:t,disabled:"unresolved"};return i.kind!==void 0&&(d.widget=i.kind),d}if(o.kind==="prompt"){let d="",u=Array.isArray(o.text)?o.text:[];for(let p of u)if(typeof p=="string"?d+=p:k(p)&&typeof p.bind=="string"&&(d+=ie(Ve(p.bind,n,r))),d.length>=2e3)break;let l={id:t,kind:"prompt",text:Array.from(d).slice(0,2e3).join("")};return i.kind!==void 0&&(l.widget=i.kind),l}let a={};if(k(e.input))for(let[d,u]of Object.entries(e.input)){let l;typeof u=="string"?l=Ve(u,n,r):k(u)&&"const"in u&&(l=u.const),l!==void 0&&(a[d]=l)}let f={id:t,kind:"http",args:a};return i.httpDisabled!==void 0&&(f.disabled=i.httpDisabled),i.kind!==void 0&&(f.widget=i.kind),f}function bt(e,t,n,r,i,o){if(r.remaining<=0)return r.truncated=!0,[];if(typeof e=="string")return r.remaining--,[e];if(!k(e))return[];if(typeof e.bind=="string"){r.remaining--;let a=Ve(e.bind,t,n);if(k(e.map)){let f=ie(a),d=Object.prototype.hasOwnProperty.call(e.map,f)?e.map[f]:void 0;return[typeof d=="string"?d:typeof e.default=="string"?e.default:""]}return[Wt(a,e.format)]}if(typeof e.each=="string"){let a=Ve(e.each,t,n),f=Array.isArray(a)?a:[];if(f.length===0)return e.empty===void 0?[]:bt(e.empty,t,n,r,zt(i,"empty"),o);let d=[],u=zt(i,"template"),l=typeof e.key=="string"?e.key:void 0;for(let p=0;p<f.length;p++){if(r.remaining<=0){r.truncated=!0;break}r.remaining--,t.push({scope:f[p],index:p});let m=bt(e.template,t,n,r,u,o),w=m.length===1?m[0]:void 0;if(l!==void 0&&w!==void 0&&typeof w!="string"){let g=Pi(Ve(l,t,n));g!==void 0&&(m[0]={...w,key:g})}d.push(...m),t.pop()}return d}if(typeof e.when=="string"){let a=!!Ve(e.when,t,n),f=a?e.template:e.else;return f===void 0?[]:bt(f,t,n,r,zt(i,a?"template":"else"),o)}if(typeof e.tag=="string"&&e.tag.length>0){if(It.has(e.tag.toLowerCase()))return[];r.remaining--;let a={};if(k(e.attrs))for(let[u,l]of Object.entries(e.attrs)){if(_t.test(u)||Mt.test(u))continue;let p;if(typeof l=="string")p=l;else if(k(l)&&typeof l.bind=="string"){let w=Ve(l.bind,t,n);if(k(l.map)){let g=ie(w),y=Object.prototype.hasOwnProperty.call(l.map,g)?l.map[g]:void 0;p=typeof y=="string"?y:typeof l.default=="string"?l.default:""}else if(typeof l.prefix=="string"){let g=ie(w);p=g===""?"":l.prefix+g}else l.format!==void 0?p=Wt(w,l.format):p=ie(w)}if(p===void 0)continue;let m=u.toLowerCase();if(sr.has(m)){let w=m==="src"&&e.tag.toLowerCase()==="img";if(!(un(p)||w&&We(p)))continue}a[u]=p}k(e.action)&&(a["data-wg-action"]=JSON.stringify(Wi(e.action,i,t,n,o)));let f=Array.isArray(e.children)?e.children.flatMap((u,l)=>bt(u,t,n,r,zt(i,`children.${l}`),o)):[],d={tag:e.tag};return Object.keys(a).length>0&&(d.attrs=a),f.length>0&&(d.children=f),[d]}return[]}function Vt(e,t={}){let n=t.maxNodes??cr,r=t;return i=>{let o={remaining:n,truncated:!1},a=[{scope:i.data}],f=bt(e,a,i.meta,o,"",r);if(!o.truncated&&f.length===1){let u=f[0];if(u!==void 0)return u}let d={class:"wg-template"};return o.truncated&&(d["data-truncated"]="true"),{tag:"div",attrs:d,children:f}}}function Ne(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(Ne(r,t));return n}function Jt(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 _i(e,t,n),n;let r=n.ownerDocument;if(!r||!n.parentNode)return n;let i=Ne(t,r);return n.parentNode.replaceChild(i,n),i}function _i(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);Mi(e.children??[],t.children??[],n)}function lr(e){let t=new Map;for(let n=0;n<e.length;n++){let r=e[n];if(r===void 0||typeof r=="string"||typeof r.key!="string"||t.has(r.key))return;t.set(r.key,n)}return t}function Ii(e,t,n,r,i){let o=i.ownerDocument,a=new Set,f=t.map(d=>{let u=d.key===void 0?void 0:n.get(d.key),l=u===void 0?void 0:e[u],p=u===void 0?void 0:r[u];return u===void 0||l===void 0||p===void 0?Ne(d,o):(a.add(u),Jt(l,d,p))});r.forEach((d,u)=>{!a.has(u)&&d.parentNode===i&&i.removeChild(d)}),f.forEach((d,u)=>{let l=i.childNodes[u]??null;d!==l&&i.insertBefore(d,l)})}function Mi(e,t,n){let r=n.ownerDocument,i=[];for(let f=0;f<n.childNodes.length;f++){let d=n.childNodes[f];d&&i.push(d)}let o=lr(e);if(o!==void 0&&lr(t)!==void 0){let f=t.filter(d=>typeof d!="string");Ii(e,f,o,i,n);return}let a=Math.min(e.length,t.length);for(let f=0;f<a;f++){let d=e[f],u=t[f],l=i[f];d===void 0||u===void 0||(l?Jt(d,u,l):n.appendChild(Ne(u,r)))}for(let f=a;f<t.length;f++){let d=t[f];d!==void 0&&n.appendChild(Ne(d,r))}for(let f=e.length-1;f>=a;f--){let d=i[f];d&&n.removeChild(d)}}function xn(e,t,n={}){let r=n.catalog??Se(),i,o,a=!1,f,d=n.onAction;function u(w){try{let g=JSON.parse(w.getAttribute("data-wg-action")??"");if(typeof g=="object"&&g!==null&&typeof g.id=="string")return g}catch{}}function l(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(),d===void 0)return;let v=u(y);v!==void 0&&d(v,f)}t.addEventListener("click",l),t.addEventListener("keydown",l);function p(w){if(a)throw new Error("Widget mount is disposed; create a new mount instead of updating.");let g=r.render(w);if(!g.ok)return g;if(i===void 0||o===void 0){let y=Ne(g.node,t.ownerDocument);t.replaceChildren(y),o=y}else o=Jt(i,g.node,o);return i=g.node,f=w,{ok:!0}}function m(){a||(a=!0,t.removeEventListener("click",l),t.removeEventListener("keydown",l),t.replaceChildren(),i=void 0,o=void 0,f=void 0)}return{initial:p(e),update:p,node:()=>i,dispose:m}}var En=["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"],ur={font:"system-ui, sans-serif","font-mono":"ui-monospace, monospace","font-size":"13px","font-size-sm":"12px","font-size-xs":"11px"},pr={light:{bg:"#f6fafc",panel:"#ffffff",border:"#6e95a6",line:"#e4ecf2",text:"#0b1b26",muted:"#56707f",accent:"#1e6f92","accent-bg":"#e3f1f7","accent-line":"#4b91ae",danger:"#b42318","danger-bg":"#fdf2f2","danger-line":"#c97572",hover:"#eef5f9","hl-key":"#1e6f92","hl-str":"#2e7d5b","hl-num":"#96620f","hl-bool":"#7a4fbf","hl-punct":"#56707f",...ur,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(11, 27, 38, 0.35)"},dark:{bg:"#0b141b",panel:"#10202a",border:"#437082",line:"#1b2f3d",text:"#e6f0f5",muted:"#93a9b6",accent:"#8acbe6","accent-bg":"#14303d","accent-line":"#3e7e98",danger:"#f0a3a3","danger-bg":"#2a1a1c","danger-line":"#a3524f",hover:"#152a36","hl-key":"#8acbe6","hl-str":"#6cc79a","hl-num":"#e0b25a","hl-bool":"#bb9af7","hl-punct":"#93a9b6",...ur,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(0, 0, 0, 0.7)"}};function kn(e,t,n){return En.map(r=>`${n}${t}-${r}: ${e[r]};`).join(`
|
|
212
|
-
`)
|
|
213
|
-
|
|
226
|
+
.wg-gap-sm { gap: ${_("spacing-sm")}; }
|
|
227
|
+
.wg-gap-md { gap: ${_("spacing")}; }
|
|
228
|
+
.wg-gap-lg { gap: ${_("spacing-lg")}; }
|
|
229
|
+
`.trim(),ti="data-widgentic";function er(e){if(e.head.querySelector(`style[${ti}]`))return;let t=e.createElement("style");t.setAttribute(ti,"base"),t.textContent=ni,e.head.appendChild(t)}function Ho(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Fo=new Set(ke),tr=/^x-[a-z0-9][a-z0-9-]*$/;function Uo(e){return Object.keys(e).filter(t=>tr.test(t))}function ri(e){return`--wg-${e}`}function Ne(e){if(!Ho(e))return{ok:!1,error:{code:"INVALID_THEME",message:"Theme must be a plain object."}};for(let[t,n]of Object.entries(e)){if(!Fo.has(t)&&!tr.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"||!Qe(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 Bo(e){let t=e,n;for(let r of ke){let{fallback:i}=Ee[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 nr(e,t){let n=Bo(t),r=e.style;if(!r)return;for(let o of ke)r.removeProperty(ri(o));for(let o=r.length-1;o>=0;o--){let d=r.item(o);d.startsWith("--wg-x-")&&r.removeProperty(d)}let i=[...ke,...Uo(n)];for(let o of i){let d=n[o];typeof d=="string"&&Qe(d)&&r.setProperty(ri(o),d)}}var rr={bg:"#0f131c",surface:"#161b26",fg:"#e5e9f0",muted:"#8b93a7",accent:"#7aa2f7","accent-fg":"#0f131c",border:"#2a3140",shadow:"0 1px 3px rgba(0, 0, 0, 0.6)",danger:"#f0a3a3",success:"#8fd19e",warning:"#e8b878",info:"#7cc4e8"};var gn=class extends Error{code="DUPLICATE_THEME";theme;constructor(t){super(`Theme '${t}' is already registered.`),this.name="DuplicateThemeError",this.theme=t}},et=class extends Error{code;theme;constructor(t,n,r){super(`Theme '${t}' is invalid: ${r}`),this.name="InvalidThemeEntryError",this.code=n,this.theme=t}};function zo(e){let t={};for(let[n,r]of Object.entries(e??{}))t[n]={...r};return t}function ir(){let e=new Map,t={light:"light",dark:"dark"},n={register(r){if(typeof r?.name!="string"||r.name.trim()==="")throw new et(String(r?.name),"INVALID_NAME","name must be a non-empty string.");if(e.has(r.name))throw new gn(r.name);let i=Ne(r.tokens??{});if(!i.ok)throw new et(r.name,i.error.code,i.error.message);if(r.styles!==void 0&&!ze(r.styles))throw new et(r.name,"INVALID_THEME","styles must map selectors to objects of property/value strings.");let o=zo(r.styles),d={name:r.name,tokens:i.theme};Object.keys(o).length>0&&(d.styles=o),r.label!==void 0&&(d.label=r.label),r.description!==void 0&&(d.description=r.description),e.set(r.name,d)},get:r=>e.get(r),list:()=>[...e.values()],names:()=>[...e.keys()],setDefault(r,i){if(!e.has(i))throw new et(i,"UNKNOWN_THEME","it is not registered, so it cannot be a default.");t[r]=i},getDefault(r){let i=e.get(t[r]);if(i===void 0)throw new Error(`No ${r} default theme is registered.`);return i},defaults:()=>({...t})};return n.register({name:"light",label:"Light",description:"The built-in defaults \u2014 no tokens set.",tokens:{}}),n.register({name:"dark",label:"Dark",description:"Shipped dark preset with a lifted surface.",tokens:rr}),n}function or(e,t){return Kn(e,t)}var mn=/^(?:on.*|srcdoc)$/i,hn=new Set(["script","iframe","frame","frameset","object","embed","style","link","meta","base","template","noscript"]),wn=/^data-wg-/i,ii=new Set(["href","src","action","formaction","xlink:href","data","poster","ping"]),sr=64;var Vo=new Set(["$meta","$root","$parent","$index"]);function xe(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(d=>d===""||Vo.has(d)))return{base:r,up:i,index:!1,segments:o}}var yn=/^[a-z][a-z0-9-]{0,63}$/,bn=yn,It=["replace","merge","patch"],Pt=["GET","POST"];function ie(e,t){return e===""?t:`${e}.${t}`}function G(e,t){return{code:"INVALID_ACTION",message:e,path:t}}var Jo=/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,Ko=new Set(["host","content-length","transfer-encoding","connection"]),qo=new Set(["__proto__","constructor","prototype"]);function vn(e){return e===""?!1:e.split(".").every(t=>t!==""&&!t.startsWith("$")&&!qo.has(t))}function Go(e,t){if(typeof e!="string")return x(e)&&typeof e.secret=="string"?yn.test(e.secret)?Object.keys(e).length!==1?G("A secret reference carries only 'secret'.",t):void 0:G(`Secret reference '${e.secret}' is not a valid secret name.`,t):G("Value must be a string or a { secret } reference.",t)}function ar(e){return!x(e)&&!Array.isArray(e)?!1:x(e)&&typeof e.secret=="string"?!0:(Array.isArray(e)?e:Object.values(e)).some(ar)}function Yo(e,t){if(typeof e!="string"||e.length===0)return G("'url' must be a non-empty string.",t);let n;try{n=new URL(e)}catch{return G(`'url' must be an absolute URL (got '${e}').`,t)}if(n.protocol!=="https:")return G("'url' must use https.",t);if(n.username!==""||n.password!=="")return G("'url' must not carry userinfo.",t);if(n.hash!=="")return G("'url' must not carry a fragment.",t)}function ht(e,t="",n={}){if(!x(e))return G("Action definition must be an object.",t);if(e.kind==="prompt"){if(!Array.isArray(e.text))return G("'text' must be an array of literals and { bind } segments.",ie(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 G(`Invalid data path '${o.bind}'.`,ie(t,`text.${i}`));continue}return G("Prompt segments are strings or { bind } objects.",ie(t,`text.${i}`))}return r>2e3?G(`Prompt text exceeds ${2e3} characters.`,ie(t,"text")):void 0}if(e.kind==="http"){if(!Pt.some(i=>i===e.method))return G("'method' must be GET or POST.",ie(t,"method"));let r=Yo(e.url,ie(t,"url"));if(r)return r;if(!x(e.input)||e.input.type!=="object")return G(`'input' must be a JSON Schema with type "object".`,ie(t,"input"));if(ar(e.input))return G("Secret references are allowed only in headers and query.",ie(t,"input"));if(!x(e.output))return G("'output' must be a JSON Schema object.",ie(t,"output"));for(let i of["headers","query"]){let o=e[i];if(o!==void 0){if(!x(o))return G(`'${i}' must be an object.`,ie(t,i));for(let[d,u]of Object.entries(o)){let a=ie(t,`${i}.${d}`);if(!Jo.test(d))return G(`'${d}' is not a valid ${i==="headers"?"header":"parameter"} name.`,a);if(i==="headers"&&Ko.has(d.toLowerCase()))return G(`Header '${d}' is set by the transport and cannot be declared.`,a);let l=Go(u,a);if(l)return l}}}return}return G(`'kind' must be "prompt" or "http".`,ie(t,"kind"))}function Xo(e,t){return typeof e.ref=="string"?t.resolve?.(e.ref):e.definition}function En(e,t="",n={}){if(!x(e))return G("Action binding must be an object.",t);if("ref"in e){if(typeof e.ref!="string"||e.ref.length===0)return G("'ref' must name a shared action.",ie(t,"ref"));if("definition"in e)return G("A binding is either a { ref } or a { definition }, not both.",t);if(n.resolve&&n.resolve(e.ref)===void 0)return G(`Unknown action '${e.ref}'.`,ie(t,"ref"))}else if("definition"in e){let o=ht(e.definition,ie(t,"definition"),{...n.isPath?{isPath:n.isPath}:{}});if(o)return o}else return G("A binding names a shared action ({ ref }) or carries an inline { definition }.",t);let i=Xo(e,n);if(n.loadOnly&&i!==void 0&&(i.kind!=="http"||i.method!=="GET"))return G("'load' accepts only http GET actions.",t);if(e.input!==void 0){if(!x(e.input))return G("'input' must be an object.",ie(t,"input"));if(i?.kind==="prompt")return G("Prompt actions take no input mapping.",ie(t,"input"));let o=i?.kind==="http"&&x(i.input.properties)?i.input.properties:void 0;for(let[d,u]of Object.entries(e.input)){let a=ie(t,`input.${d}`);if(o!==void 0&&!(d in o))return G(`Input field '${d}' is not declared by the action's input schema.`,a);if(typeof u=="string"){if(n.isPath&&!n.isPath(u))return G(`Invalid data path '${u}'.`,a);continue}if(x(u)&&"const"in u&&Object.keys(u).length===1){if(ar(u.const))return G("Secret references are allowed only in headers and query.",a);continue}return G("Input values are data paths or { const } literals.",a)}}if(e.output!==void 0){let o=ie(t,"output");if(!x(e.output))return G("'output' must be an object.",o);if(i?.kind==="prompt")return G("Prompt actions have no output.",o);let{mode:d,path:u,map:a}=e.output;if(d!==void 0&&!It.some(l=>l===d))return G("'mode' must be replace, merge or patch.",ie(o,"mode"));if(d==="patch"){if(typeof u!="string"||!vn(u))return G("'patch' requires a valid data 'path'.",ie(o,"path"))}else if(u!==void 0)return G(`'path' is only meaningful with mode "patch".`,ie(o,"path"));if(a!==void 0){if(!x(a))return G("'map' must be an object of data paths.",ie(o,"map"));let l=Object.entries(a);if(l.length===0)return G("'map' must not be empty (omit it to take the whole response).",ie(o,"map"));for(let[c,f]of l){let h=ie(o,`map.${c}`);if(c!=="."&&!vn(c))return G(`'${c}' is not a valid data path.`,h);if(typeof f!="string"||f!=="."&&!vn(f))return G("Map values are data paths into the response ('.' for the whole response).",h)}}}}function Mt(e,t="load",n={}){return En(e,t,{...n,loadOnly:!0})}function tt(e,t){return e===""?t:`${e}.${t}`}function oe(e,t){return{code:"INVALID_TEMPLATE_NODE",message:e,path:t}}function oi(e,t,n){let r=i=>oe(`${t}: ${i}`,n);if(!x(e))return r("'format' must be an object.");if(!ft(e.type))return r(`'format.type' must be one of ${ut.join(", ")}.`);if(e.type==="date")return typeof e.pattern!="string"?r("'format.pattern' must be a string."):e.pattern.length===0||e.pattern.length>sn?r(`'format.pattern' must be 1-${sn} characters.`):Gn.test(e.pattern)?un(e.pattern)===void 0?r(`'format.pattern' must use at least one of ${gt.join(", ")} and no stray letters.`):void 0:r("'format.pattern' may contain only the date tokens and separators.");if(e.type==="join"){for(let i of["separator","last"]){let o=e[i];if(o!==void 0&&(typeof o!="string"||o.length>$e))return r(`'format.${i}' must be a string of at most ${$e} characters.`)}return e.field!==void 0&&!ln(e.field)?r("'format.field' must be a plain dotted path read in each item, such as 'name' or 'owner.name'."):void 0}if(e.type==="truncate")return typeof e.length!="number"||!Number.isInteger(e.length)||e.length<Ge||e.length>Ye?r(`'format.length' must be an integer ${Ge}-${Ye}.`):e.ellipsis!==void 0&&(typeof e.ellipsis!="string"||e.ellipsis.length>Xe)?r(`'format.ellipsis' must be a string of at most ${Xe} characters.`):void 0;if(e.type==="pluralize"){if(!x(e.forms))return r("'format.forms' must be an object of plural forms.");for(let[i,o]of Object.entries(e.forms)){if(!cn(i))return r(`'format.forms' keys must be plural categories: ${Ct.join(", ")}.`);if(typeof o!="string"||o.length>$t)return r(`'format.forms.${i}' must be a string of at most ${$t} characters.`)}if(e.forms.other===void 0)return r("'format.forms' must carry an 'other' form.")}if(e.decimals!==void 0&&(typeof e.decimals!="number"||!Number.isInteger(e.decimals)||e.decimals<Je||e.decimals>Ke))return r(`'format.decimals' must be an integer ${Je}-${Ke}.`);if(e.locale!==void 0&&(typeof e.locale!="string"||!an.test(e.locale)||!Yn(e.locale)))return r("'format.locale' must be a BCP-47 language tag this runtime knows.");if(e.type==="currency"){if(typeof e.currency!="string"||!on.test(e.currency))return r("'format.currency' must be a three-letter uppercase ISO-4217 code.");if(e.currencyDisplay!==void 0&&!pt(e.currencyDisplay))return r(`'format.currencyDisplay' must be one of ${qe.join(", ")}.`)}return fn(e)===void 0?r("'format' is not a spec the engine accepts."):void 0}var si=["map","prefix","format"];function Ht(e){let t=si.filter(n=>e[n]!==void 0);return t.length>1?"conflict":t[0]}function Wt(e,t){if(xe(e)===void 0)return{code:"INVALID_PATH",message:`Invalid data path '${e}'.`,path:t}}function wt(e,t,n){if(n>sr)return{code:"TEMPLATE_TOO_DEEP",message:`Template exceeds the maximum nesting depth of ${sr}.`,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){if(typeof e.bind!="string")return oe("'bind' must be a string path.",t);let r=Wt(e.bind,t);if(r)return r;if(e.markdown!==void 0){if(typeof e.markdown!="boolean")return oe("Bind: 'markdown' must be true or false.",t);if(e.markdown&&(e.map!==void 0||e.format!==void 0))return oe("A text bind carries one of 'map', 'format' and 'markdown' \u2014 one transform per value.",t)}return e.map!==void 0&&e.format!==void 0?oe("A text bind carries either 'map' or 'format' \u2014 one transform per value.",t):e.map!==void 0?!x(e.map)||Object.values(e.map).some(i=>typeof i!="string")?oe("Bind: 'map' must be an object of string values.",t):e.default!==void 0&&typeof e.default!="string"?oe("Bind: 'default' must be a string.",t):void 0:e.default!==void 0?oe("Bind: 'default' requires 'map'.",t):e.format!==void 0?oi(e.format,"Bind",t):void 0}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("key"in e&&e.key!==void 0){if(typeof e.key!="string")return oe("'key' must be a string path.",t);let o=Wt(e.key,t);if(o)return o}if(!("template"in e))return oe("'each' node requires a 'template'.",t);let i=wt(e.template,tt(t,"template"),n+1);return i||("empty"in e&&e.empty!==void 0?wt(e.empty,tt(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=wt(e.template,tt(t,"template"),n+1);return i||("else"in e&&e.else!==void 0?wt(e.else,tt(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(hn.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=tt(t,`attrs.${r}`);if(mn.test(r))return{code:"FORBIDDEN_ATTRIBUTE",message:`Attribute '${r}' is not allowed in templates (event handlers and srcdoc).`,path:o};if(wn.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 d=Wt(i.bind,o);if(d)return d;if(i.markdown!==void 0)return oe(`Attribute '${r}': 'markdown' is a text-bind mode; an attribute value cannot carry it.`,o);let u=Ht(i),a=u==="map",l=u==="prefix",c=u==="format";if(u==="conflict")return oe(`Attribute '${r}' carries more than one of 'map', 'prefix' and 'format' \u2014 one transform per value.`,o);if(a){if(!x(i.map)||Object.values(i.map).some(f=>typeof f!="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(l&&typeof i.prefix!="string")return oe(`Attribute '${r}': 'prefix' must be a string.`,o);if(c){let f=oi(i.format,`Attribute '${r}'`,o);if(f)return f}continue}return oe(`Attribute '${r}' must be a string, { bind }, { bind, map, default? }, { bind, prefix } or { bind, format } value.`,o)}}}if("action"in e&&e.action!==void 0){if(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=En(e.action,tt(t,"action"),{isPath:o=>xe(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=wt(e.children[r],tt(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 Ie(e){let t=wt(e,"",0);return t?{ok:!1,error:t}:{ok:!0,template:e}}function Zo(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 Ft(e,t){let n=new Set;return Zo(e,t,r=>{typeof r.ref=="string"&&n.add(r.ref)}),[...n]}var Qo=2e4;var es=/^\s*[-*+][ \t]+(.*)$/,ts=/^\s*(\d{1,9})[.)][ \t]+(.*)$/,ns=/^\s*(`{3,}|~{3,})/;function rs(e){let t=[],n,r=e.split(`
|
|
230
|
+
`);for(let i=0;i<r.length;i++){let o=r[i],d=ns.exec(o)?.[1];if(d!==void 0){let l=new RegExp(`^\\s*${d[0]==="`"?"`":"~"}{${d.length},}\\s*$`),c=[o];for(;++i<r.length&&(c.push(r[i]),!l.test(r[i])););t.push({kind:"literal",lines:c}),n=void 0;continue}if(o.trim()===""){n=void 0;continue}let u=es.exec(o),a=u===null?ts.exec(o):null;if(u!==null||a!==null){let l=u!==null?"ul":"ol",c=(u!==null?u[1]:a?.[2])??"";(n===void 0||n.kind!==l)&&(n={kind:l,start:a===null?1:Number(a[1]),items:[]},t.push(n)),n.items.push([c.trim()]);continue}n===void 0&&(n={kind:"p",lines:[]},t.push(n)),n.kind==="p"?n.lines.push(o.trim()):n.items[n.items.length-1]?.push(o.trim())}return t}var is=new Set("\\`*_[]()#+-.!{}<>|~\"'"),kn=e=>e===void 0||/\s/.test(e),yt=e=>e!==void 0&&/[!-/:-@[-`{-~\u2000-\u206f\u2e00-\u2e7f]/.test(e);function ai(e){let t=[];for(let n of e){let r=n.kind==="node"?n.node:n.kind==="text"?n.value:n.char.repeat(n.count),i=t[t.length-1];typeof r=="string"&&typeof i=="string"?t[t.length-1]=i+r:r!==""&&t.push(r)}return t}function os(e){let t=new Map;for(let r=0;r<e.length;){if(e[r]!=="`"){r++;continue}let i=r;for(;e[i]==="`";)i++;let o=t.get(i-r)??[];o.push(r),t.set(i-r,o),r=i}let n=new Map;return(r,i)=>{let o=t.get(r)??[],d=n.get(r)??0;for(;d<o.length&&o[d]<i;)d++;return n.set(r,d),d<o.length?o[d]:-1}}var ss=1e3,as=2048;function di(e,t){let n=0,r=t,i=Math.min(e.length,t+ss);for(;r<i;r++){let a=e[r];if(a==="\\"){r++;continue}if(a==="[")n++;else if(a==="]"&&--n===0)break}if(r>=i||e[r+1]!=="(")return;let o=Math.min(e.length,r+2+as),d=r+2;for(let a=0;d<o;d++)if(e[d]==="(")a++;else if(e[d]===")"&&a--===0)break;if(d>=o)return;let u=e.slice(r+2,d);if(!(u===""||/\s/.test(u)))return{label:e.slice(t+1,r),url:u,end:d+1}}function dr(e,t){let n=[],r={"*":[],_:[]},i=a=>{let l=n[n.length-1];l?.kind==="text"?l.value+=a:n.push({kind:"text",value:a})},o=a=>n.push({kind:"node",node:a}),d=os(e),u=0;for(;u<e.length;){let a=e[u];if(a==="\\"&&u+1<e.length&&is.has(e[u+1])){i(e[u+1]),u+=2;continue}if(a===`
|
|
231
|
+
`){o({tag:"br"}),u++;continue}if(a==="`"){let l=u;for(;e[l]==="`";)l++;let c=d(l-u,l);if(c===-1){i(e.slice(u,l)),u=l;continue}let f=e.slice(l,c).replace(/\n/g," ");f.length>2&&f.startsWith(" ")&&f.endsWith(" ")&&f.trim()!==""&&(f=f.slice(1,-1)),o(f===""?{tag:"code"}:{tag:"code",children:[f]}),u=c+(l-u);continue}if(a==="!"&&e[u+1]==="["&&t){let l=di(e,u+1);if(l!==void 0){i(e.slice(u,l.end)),u=l.end;continue}}if(a==="["&&t){let l=di(e,u);if(l!==void 0){let c=dr(l.label,!1),f=l.url.trim();if(At(f)){let h={tag:"a",attrs:{href:f,rel:"noopener noreferrer"}};c.length>0&&(h.children=c),o(h)}else for(let h of c)typeof h=="string"?i(h):o(h);u=l.end;continue}}if(a==="*"||a==="_"){let l=a,c=u;for(;e[c]===l;)c++;let f=e[u-1],h=e[c],v=!kn(h)&&(!yt(h)||kn(f)||yt(f)),m=!kn(f)&&(!yt(f)||kn(h)||yt(h)),w=l==="*"?v:v&&(!m||yt(f)),k=l==="*"?m:m&&(!v||yt(h)),N=c-u;if(k){let y=r[l];for(;N>0;){for(;y.length>0&&y[y.length-1].count===0;)y.pop();let A=y[y.length-1];if(A===void 0)break;let R=A.count>=2&&N>=2?2:1,W=n.splice(A.index+1),U=r[l==="*"?"_":"*"];for(;U.length>0&&U[U.length-1].index>A.index;)U.pop();let D=ai(W);A.count-=R,N-=R,A.count===0&&(n.pop(),y.pop());let L={tag:R===2?"strong":"em"};D.length>0&&(L.children=D),o(L)}}if(N>0)if(w){let y={kind:"delim",char:l,count:N,canOpen:w,canClose:k,index:n.length};n.push(y),r[l].push(y)}else i(l.repeat(N));u=c;continue}i(a),u++}return ai(n)}function ci(e,t){if(t.remaining<=0){t.truncated=!0;return}if(t.remaining--,typeof e=="string"||e.children===void 0)return e;let n=[];for(let i of e.children){let o=ci(i,t);if(o===void 0)break;n.push(o)}let r={...e};return n.length>0?r.children=n:delete r.children,r}var bt=(e,t,n)=>{let r={tag:e};return n!==void 0&&(r.attrs=n),t.length>0&&(r.children=t),r};function li(e,t){let n=e.replace(/\r\n?/g,`
|
|
232
|
+
`);if(n.trim()==="")return[];let r;n.length>Qo?r=[bt("p",[n])]:r=rs(n).map(o=>{if(o.kind==="p")return bt("p",dr(o.lines.join(`
|
|
233
|
+
`),!0));if(o.kind==="literal")return bt("p",o.lines.flatMap((u,a)=>[...a===0?[]:[{tag:"br"}],...u===""?[]:[u]]));let d=o.items.map(u=>bt("li",dr(u.join(`
|
|
234
|
+
`),!0)));return bt(o.kind,d,o.kind==="ol"&&o.start!==1?{start:String(o.start)}:void 0)});let i=ci(bt("div",r,{class:"wg-md"}),t);return i===void 0?[]:[i]}function xn(e,t){return e===""?t:`${e}.${t}`}function Pe(e,t,n){let r=xe(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 d=t[o];if(d===void 0)return;if(r.index)return d.index;i=d.scope}for(let o of r.segments)if(Array.isArray(i)){let d=Number(o);i=Number.isInteger(d)?i[d]:void 0}else if(x(i))i=i[o];else return;return i}function ds(e){if(typeof e=="string")return e;if(typeof e=="number"&&Number.isFinite(e))return String(e)}var ui=5e4;function cs(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 a={id:t,disabled:"unresolved"};return i.kind!==void 0&&(a.widget=i.kind),a}if(o.kind==="prompt"){let a="",l=Array.isArray(o.text)?o.text:[];for(let f of l)if(typeof f=="string"?a+=f:x(f)&&typeof f.bind=="string"&&(a+=re(Pe(f.bind,n,r))),a.length>=2e3)break;let c={id:t,kind:"prompt",text:Array.from(a).slice(0,2e3).join("")};return i.kind!==void 0&&(c.widget=i.kind),c}let d={};if(x(e.input))for(let[a,l]of Object.entries(e.input)){let c;typeof l=="string"?c=Pe(l,n,r):x(l)&&"const"in l&&(c=l.const),c!==void 0&&(d[a]=c)}let u={id:t,kind:"http",args:d};return i.httpDisabled!==void 0&&(u.disabled=i.httpDisabled),i.kind!==void 0&&(u.widget=i.kind),u}function Ut(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"){if(e.markdown===!0)return li(re(Pe(e.bind,t,n)),r);r.remaining--;let d=Pe(e.bind,t,n);if(x(e.map)){let u=re(d),a=Object.prototype.hasOwnProperty.call(e.map,u)?e.map[u]:void 0;return[typeof a=="string"?a:typeof e.default=="string"?e.default:""]}return[pn(d,e.format)]}if(typeof e.each=="string"){let d=Pe(e.each,t,n),u=Array.isArray(d)?d:[];if(u.length===0)return e.empty===void 0?[]:Ut(e.empty,t,n,r,xn(i,"empty"),o);let a=[],l=xn(i,"template"),c=typeof e.key=="string"?e.key:void 0;for(let f=0;f<u.length;f++){if(r.remaining<=0){r.truncated=!0;break}r.remaining--,t.push({scope:u[f],index:f});let h=Ut(e.template,t,n,r,l,o),v=h.length===1?h[0]:void 0;if(c!==void 0&&v!==void 0&&typeof v!="string"){let m=ds(Pe(c,t,n));m!==void 0&&(h[0]={...v,key:m})}a.push(...h),t.pop()}return a}if(typeof e.when=="string"){let d=!!Pe(e.when,t,n),u=d?e.template:e.else;return u===void 0?[]:Ut(u,t,n,r,xn(i,d?"template":"else"),o)}if(typeof e.tag=="string"&&e.tag.length>0){if(hn.has(e.tag.toLowerCase()))return[];r.remaining--;let d={};if(x(e.attrs))for(let[l,c]of Object.entries(e.attrs)){if(mn.test(l)||wn.test(l))continue;let f;if(typeof c=="string")f=c;else if(x(c)&&typeof c.bind=="string"){let v=Pe(c.bind,t,n);if(x(c.map)){let m=re(v),w=Object.prototype.hasOwnProperty.call(c.map,m)?c.map[m]:void 0;f=typeof w=="string"?w:typeof c.default=="string"?c.default:""}else if(typeof c.prefix=="string"){let m=re(v);f=m===""?"":c.prefix+m}else c.format!==void 0?f=pn(v,c.format):f=re(v)}if(f===void 0)continue;let h=l.toLowerCase();if(ii.has(h)){let v=h==="src"&&e.tag.toLowerCase()==="img";if(!(At(f)||v&&Ue(f)))continue}d[l]=f}x(e.action)&&(d["data-wg-action"]=JSON.stringify(cs(e.action,i,t,n,o)));let u=Array.isArray(e.children)?e.children.flatMap((l,c)=>Ut(l,t,n,r,xn(i,`children.${c}`),o)):[],a={tag:e.tag};return Object.keys(d).length>0&&(a.attrs=d),u.length>0&&(a.children=u),[a]}return[]}function Sn(e,t={}){let n=t.maxNodes??ui,r=t;return i=>{let o={remaining:n,truncated:!1},d=[{scope:i.data}],u=Ut(e,d,i.meta,o,"",r);if(!o.truncated&&u.length===1){let l=u[0];if(l!==void 0)return l}let a={class:"wg-template"};return o.truncated&&(a["data-truncated"]="true"),{tag:"div",attrs:a,children:u}}}function je(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(je(r,t));return n}function Tn(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 ls(e,t,n),n;let r=n.ownerDocument;if(!r||!n.parentNode)return n;let i=je(t,r);return n.parentNode.replaceChild(i,n),i}function ls(e,t,n){let r=e.attrs??{},i=t.attrs??{};for(let[o,d]of Object.entries(i))r[o]!==d&&n.setAttribute(o,d);for(let o of Object.keys(r))o in i||n.removeAttribute(o);fs(e.children??[],t.children??[],n)}function fi(e){let t=new Map;for(let n=0;n<e.length;n++){let r=e[n];if(r===void 0||typeof r=="string"||typeof r.key!="string"||t.has(r.key))return;t.set(r.key,n)}return t}function us(e,t,n,r,i){let o=i.ownerDocument,d=new Set,u=t.map(a=>{let l=a.key===void 0?void 0:n.get(a.key),c=l===void 0?void 0:e[l],f=l===void 0?void 0:r[l];return l===void 0||c===void 0||f===void 0?je(a,o):(d.add(l),Tn(c,a,f))});r.forEach((a,l)=>{!d.has(l)&&a.parentNode===i&&i.removeChild(a)}),u.forEach((a,l)=>{let c=i.childNodes[l]??null;a!==c&&i.insertBefore(a,c)})}function fs(e,t,n){let r=n.ownerDocument,i=[];for(let u=0;u<n.childNodes.length;u++){let a=n.childNodes[u];a&&i.push(a)}let o=fi(e);if(o!==void 0&&fi(t)!==void 0){let u=t.filter(a=>typeof a!="string");us(e,u,o,i,n);return}let d=Math.min(e.length,t.length);for(let u=0;u<d;u++){let a=e[u],l=t[u],c=i[u];a===void 0||l===void 0||(c?Tn(a,l,c):n.appendChild(je(l,r)))}for(let u=d;u<t.length;u++){let a=t[u];a!==void 0&&n.appendChild(je(a,r))}for(let u=e.length-1;u>=d;u--){let a=i[u];a&&n.removeChild(a)}}function cr(e,t,n={}){let r=n.catalog??Oe(),i,o,d=!1,u,a=n.onAction;function l(v){try{let m=JSON.parse(v.getAttribute("data-wg-action")??"");if(typeof m=="object"&&m!==null&&typeof m.id=="string")return m}catch{}}function c(v){let w=v.target?.closest?.("[data-wg-action]");if(!w||!t.contains(w))return;if(v.type==="keydown"){let N=v.key;if(N!=="Enter"&&N!==" "||w.tagName==="BUTTON"||w.tagName==="A")return}if(v.preventDefault(),a===void 0)return;let k=l(w);k!==void 0&&a(k,u)}t.addEventListener("click",c),t.addEventListener("keydown",c);function f(v){if(d)throw new Error("Widget mount is disposed; create a new mount instead of updating.");let m=r.render(v);if(!m.ok)return m;if(i===void 0||o===void 0){let w=je(m.node,t.ownerDocument);t.replaceChildren(w),o=w}else o=Tn(i,m.node,o);return i=m.node,u=v,{ok:!0}}function h(){d||(d=!0,t.removeEventListener("click",c),t.removeEventListener("keydown",c),t.replaceChildren(),i=void 0,o=void 0,u=void 0)}return{initial:f(e),update:f,node:()=>i,dispose:h}}var ur=["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"],pi={font:"system-ui, sans-serif","font-mono":"ui-monospace, monospace","font-size":"13px","font-size-sm":"12px","font-size-xs":"11px"},gi={light:{bg:"#f6fafc",panel:"#ffffff",border:"#6e95a6",line:"#e4ecf2",text:"#0b1b26",muted:"#56707f",accent:"#1e6f92","accent-bg":"#e3f1f7","accent-line":"#4b91ae",danger:"#b42318","danger-bg":"#fdf2f2","danger-line":"#c97572",hover:"#eef5f9","hl-key":"#1e6f92","hl-str":"#2e7d5b","hl-num":"#96620f","hl-bool":"#7a4fbf","hl-punct":"#56707f",...pi,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(11, 27, 38, 0.35)"},dark:{bg:"#0b141b",panel:"#10202a",border:"#437082",line:"#1b2f3d",text:"#e6f0f5",muted:"#93a9b6",accent:"#8acbe6","accent-bg":"#14303d","accent-line":"#3e7e98",danger:"#f0a3a3","danger-bg":"#2a1a1c","danger-line":"#a3524f",hover:"#152a36","hl-key":"#8acbe6","hl-str":"#6cc79a","hl-num":"#e0b25a","hl-bool":"#bb9af7","hl-punct":"#93a9b6",...pi,"radius-sm":"4px",radius:"6px","radius-lg":"8px",gap:"16px",shadow:"0 8px 24px -12px rgba(0, 0, 0, 0.7)"}};function lr(e,t,n){return ur.map(r=>`${n}${t}-${r}: ${e[r]};`).join(`
|
|
235
|
+
`)}function mi(e,t={}){let n=t.prefix??"--wgd",r=t.selector??":root",i=t.darkMediaSelector??r,o=[`${r} {
|
|
236
|
+
${lr(e.light,n," ")}
|
|
214
237
|
}`,`@media (prefers-color-scheme: dark) {
|
|
215
238
|
${i} {
|
|
216
|
-
${
|
|
239
|
+
${lr(e.dark,n," ")}
|
|
217
240
|
}
|
|
218
241
|
}`];return t.darkSelector!==void 0&&o.push(`${t.darkSelector} {
|
|
219
|
-
${
|
|
242
|
+
${lr(e.dark,n," ")}
|
|
220
243
|
}`),o.join(`
|
|
221
|
-
`)}function
|
|
244
|
+
`)}function he(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 Me(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 Q(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 ge(e,t,n,r,i){let o=s("select",{class:n,...i===void 0?{}:{title:i}});for(let d of e)o.append(s("option",{value:d.value},[d.label??d.value]));return o.value=t,Se(o),o.addEventListener("change",()=>r(o.value)),o}function Se(e){let t=()=>{let n=e.options[e.selectedIndex]?.text??e.value;e.style.width=`calc(${Math.max(n.length,1)}ch + 1.2em + 18px)`};t(),e.addEventListener("change",t)}function fr(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]),d=s("div",{class:"wgd-menu"});d.hidden=!0;let u=()=>{d.hidden=!0,document.removeEventListener("pointerdown",a,!0),document.removeEventListener("keydown",l,!0)},a=c=>{i.contains(c.target)||u()},l=c=>{c.key==="Escape"&&u()};o.addEventListener("click",()=>{if(!d.hidden){u();return}d.hidden=!1,document.addEventListener("pointerdown",a,!0),document.addEventListener("keydown",l,!0)});for(let c of n){let f=s("button",{class:"wgd-menu-item",type:"button"},[c]);f.addEventListener("click",()=>{u(),r(c)}),d.append(f)}return i.append(o,d),i}function K(e){let t=s("div",{class:"wgd-diagnostic"},e===void 0?[]:[e]);return e===void 0&&t.setAttribute("hidden",""),t}var ps=new Set(ur),gs=/^(inherit|initial|unset|revert|revert-layer)$/i;function Te(e,t){if(t!==void 0)for(let[n,r]of Object.entries(t))ps.has(n)&&(typeof r!="string"||gs.test(r.trim())||e.style.setProperty(`--wgd-${n}`,r))}function wi(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 hi="data-widgentic-designer";function Ae(e){if(e.head.querySelector(`style[${hi}]`))return;let t=e.createElement("style");t.setAttribute(hi,"chrome"),t.textContent=`
|
|
222
245
|
/* Chrome tokens (CHROME_TOKENS), generated from CHROME_DEFAULTS so the
|
|
223
246
|
exported palette IS the applied one. A host overrides any of them through
|
|
224
247
|
options.chrome (inline on the root, which outranks these rules). Widget
|
|
225
248
|
content inside the preview keeps its own --wg-* theme tokens. */
|
|
226
|
-
${
|
|
249
|
+
${mi(gi,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="light"])',darkSelector:'.wgd-root[data-wgd-theme="dark"]'})}
|
|
227
250
|
.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); }
|
|
228
251
|
/* Any chrome class that sets display would silently defeat the hidden
|
|
229
252
|
attribute (learned live twice: the add menu, then the styles tree as a
|
|
@@ -358,6 +381,11 @@ ${fr(pr,{selector:".wgd-root",darkMediaSelector:'.wgd-root:not([data-wgd-theme="
|
|
|
358
381
|
.wgd-format-decimals { flex: 0 0 auto; width: 4ch; min-width: 4ch; text-align: right; font-family: var(--wgd-font-mono); }
|
|
359
382
|
.wgd-format-currency { flex: 0 0 auto; width: 5ch; min-width: 5ch; text-transform: uppercase; font-family: var(--wgd-font-mono); }
|
|
360
383
|
.wgd-format-pattern { flex: 0 1 auto; min-width: 8ch; max-width: 16ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-str); }
|
|
384
|
+
.wgd-format-separator, .wgd-format-last, .wgd-format-ellipsis { flex: 0 0 auto; width: 6ch; min-width: 6ch; font-family: var(--wgd-font-mono); color: var(--wgd-hl-str); }
|
|
385
|
+
.wgd-format-length { flex: 0 0 auto; width: 5ch; min-width: 5ch; text-align: right; font-family: var(--wgd-font-mono); }
|
|
386
|
+
.wgd-format-field { flex: 0 1 auto; min-width: 6ch; max-width: 12ch; font-family: var(--wgd-font-mono); }
|
|
387
|
+
.wgd-format-form { flex: 0 1 auto; min-width: 7ch; max-width: 14ch; color: var(--wgd-hl-str); }
|
|
388
|
+
.wgd-md-toggle { flex: 0 0 auto; font-size: var(--wgd-font-size-xs); color: var(--wgd-accent); background: none; border: 1px solid currentColor; border-radius: var(--wgd-radius); padding: 0 6px; cursor: pointer; }
|
|
361
389
|
.wgd-children { margin-left: 14px; padding-left: 8px; border-left: 2px solid var(--wgd-accent-line); gap: 1px; }
|
|
362
390
|
.wgd-slot { display: flex; flex-direction: column; gap: 1px; }
|
|
363
391
|
.wgd-slot-label { color: var(--wgd-muted); font-size: var(--wgd-font-size-xs); font-style: italic; padding-left: 4px; }
|
|
@@ -443,13 +471,15 @@ textarea.wgd-hl-input {
|
|
|
443
471
|
.wgd-token-ref-name { font-family: var(--wgd-font-mono); color: var(--wgd-accent); }
|
|
444
472
|
.wgd-token-ref-value { color: var(--wgd-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
445
473
|
.wgd-token-ref-details summary { cursor: pointer; }
|
|
446
|
-
`,e.head.appendChild(t)}function
|
|
447
|
-
`)),e.replaceChildren(...n)}function ue(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=()=>{
|
|
474
|
+
`,e.head.appendChild(t)}function nt(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,d)=>{o.element.hidden=d!==r,t[d]?.classList.toggle("wgd-tab-active",d===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 de(e){return JSON.parse(JSON.stringify(e))}function le(e){return e instanceof Error?e.message:String(e)}function We(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 ms=new Set(Oe().kinds());function pr(e){if(!ve.test(e))return`INVALID_IDENTIFIER \u2014 '${e}' may use letters, digits, '.', '_' or '-' only.`;if(ms.has(e))return`RESERVED_KIND \u2014 '${e}' is a built-in kind; give the widget its own kind.`}function Bt(e){if(!x(e))return[];let t=[];for(let[n,r]of Object.entries(e)){if(nn({[n]:{color:"red"}})===""){t.push({selector:n,message:`Selector would be skipped. ${ct.selectors} ${ct.banned}`});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"||nn({".wg-probe":{[i]:o}})==="")&&t.push({selector:n,property:i,message:dt.test(i)?typeof o!="string"?"Value would be skipped: it must be a string.":`Value would be skipped. ${ct.banned}`:`Property would be skipped. ${ct.propertyNames}`})}return t}function An(e,t={}){let n={styles:[],previewable:!1};if(typeof e.kind!="string"||e.kind.trim().length===0)n.kind="Kind must be a non-empty id.";else{let a=pr(e.kind);a!==void 0&&(n.kind=a)}let r=e.descriptor?.dataShape;(typeof r!="string"||r.trim()==="")&&(n.dataShape="Data shape is empty \u2014 agents listing this widget will see a placeholder instead of the data it expects.");let i=e.descriptor?.dataSchema;if(x(i)){let a=Be(i,"dataSchema");a.length>0&&(n.dataSchema=a)}let o=Ie(e.template);if(!o.ok){let a={code:o.error.code,message:o.error.message},l=o.error.path;typeof l=="string"&&(a.path=l),n.template=a}let d=e.descriptor?.dataSchemaRef;typeof d=="string"&&(e.descriptor?.dataSchema!==void 0?n.schemaRef="A descriptor carries 'dataSchema' OR 'dataSchemaRef', never both.":t.schemas!==void 0&&t.schemas.every(a=>a.name!==d)&&(n.schemaRef=`References unknown schema '${d}' \u2014 it is not among the supplied shared schemas.`));let u=We(e,t.schemas??[]);if(x(u)){if(e.descriptor.dataExample!==void 0){let a=Ce(u,e.descriptor.dataExample);a&&(n.example=a)}if(e.sampleData!==void 0){let a=Ce(u,e.sampleData);a&&(n.sample=a)}}if(n.styles=Bt(e.descriptor?.styles),e.load!==void 0){let a=Mt(e.load,"load",{isPath:l=>xe(l)!==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)),l=Ft(e.template,e.load).filter(c=>!a.has(c));l.length>0&&(n.actionRefs=`References unknown shared action${l.length===1?"":"s"} ${l.map(c=>`'${c}'`).join(", ")} \u2014 bound elements will render disabled.`)}if(e.theme!==void 0){let a=Ne(e.theme);a.ok||(n.theme=a.error)}return n.previewable=n.kind===void 0&&n.template===void 0,n}var gr=/("(?:[^"\\]|\\.)*")(\s*:)?|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|\b(true|false|null)\b|([{}[\],:])/g;function hs(e){let t=[],n=0,r;for(gr.lastIndex=0;(r=gr.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=gr.lastIndex;return n<e.length&&t.push({cls:"",text:e.slice(n)}),t}function yi(e,t){let n=[];for(let r of hs(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(`
|
|
475
|
+
`)),e.replaceChildren(...n)}function ue(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=()=>{yi(r,e.value),r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},o=()=>{r.scrollTop=e.scrollTop,r.scrollLeft=e.scrollLeft},d=u=>{if(u.key!=="Tab"||u.shiftKey||e.readOnly)return;u.preventDefault();let{selectionStart:a,selectionEnd:l,value:c}=e;e.value=`${c.slice(0,a)} ${c.slice(l)}`,e.selectionStart=e.selectionEnd=a+2,e.dispatchEvent(new Event("input",{bubbles:!0}))};return e.addEventListener("input",i),e.addEventListener("scroll",o),e.addEventListener("keydown",d),i(),()=>{e.removeEventListener("input",i),e.removeEventListener("scroll",o),e.removeEventListener("keydown",d),e.classList.remove("wgd-hl-input"),n.replaceWith(e)}}function fe(e){let t=e.parentElement?.querySelector(".wgd-hl");t instanceof HTMLElement&&yi(t,e.value)}function Dn(e,t){let n=[];if(!x(e))return["Definition must be an object."];if(typeof e.kind!="string"||e.kind.trim()==="")n.push("'kind' must be a non-empty string.");else if(e.kind!==t){let i=pr(e.kind);i!==void 0&&n.push(`kind: ${i}`)}let r=Ie(e.template);if(r.ok||n.push(`template: ${r.error.code} \u2014 ${r.error.message}`),!x(e.descriptor))n.push("'descriptor' must be an object.");else if(typeof e.descriptor.description!="string")n.push("'descriptor.description' must be a string.");else{let{dataSchema:i,dataSchemaRef:o}=e.descriptor;i!==void 0&&o!==void 0?n.push("descriptor: INVALID_SHAPE \u2014 carries 'dataSchema' and 'dataSchemaRef'; keep one."):i!==void 0&&!x(i)?n.push("descriptor: INVALID_SHAPE \u2014 'dataSchema' must be a schema object."):o!==void 0&&(typeof o!="string"||!ve.test(o))&&n.push("descriptor: INVALID_SHAPE \u2014 'dataSchemaRef' must be a valid schema name: letters, digits, '.', '_' or '-'.")}if(e.load!==void 0){let i=Mt(e.load,"load",{isPath:o=>xe(o)!==void 0});i&&n.push(`load: ${i.message} (at ${i.path})`)}return n}function ws(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 ys(e,t){let n;try{n=JSON.parse(e)}catch(i){return{ok:!1,errors:[`Invalid JSON: ${le(i)}`]}}let r=Dn(n,t);return r.length>0?{ok:!1,errors:r}:{ok:!0,definition:n}}function mr(e,t){let{theme:n,themeStyles:r,previewTheme:i}=e.get();e.replace({kind:t.kind,template:t.template,descriptor:t.descriptor,...t.load!==void 0?{load:t.load}:{},...n!==void 0?{theme:n}:{},...r!==void 0?{themeStyles:r}:{},...i!==void 0?{previewTheme:i}:{}})}function bs(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 vs(e){return`import type { CustomWidget } from "./index.js";
|
|
448
476
|
|
|
449
|
-
export const ${
|
|
450
|
-
`}function
|
|
451
|
-
`);return}r.hidden=!0,r.textContent="",Dn(e,l.definition)});let f=ee("Import",[i,r,s("div",{class:"wgd-row"},[a])]),d=ee("Export",[s("div",{class:"wgd-row"},[n("Export widget entry",()=>Ui(e.get())),n("Copy as TypeScript",()=>Ji(e.get()))]),t]);d.classList.add("wgd-view-only");let u=s("div",{class:"wgd-io"},[f,d]);return ue(t),{element:u,dispose:()=>u.remove()}}var Ki=["string","number","boolean","null","object","array"];function On(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function qi(e,t){switch(e){case"string":return typeof t=="number"||typeof t=="boolean"?String(t):"";case"number":{let n=Number(t);return Number.isFinite(n)?n:0}case"boolean":return t==="true"?!0:!!t&&t!=="false";case"null":return null;case"object":return{};case"array":return[]}}function Te(e,t,n,r=!1){if(t.length===0)return n;let[i,...o]=t;if(Array.isArray(e)){let a=[...e];return o.length===0&&r?a.splice(i,1):a[i]=Te(a[i],o,n,r),a}if(typeof e=="object"&&e!==null){let a={...e};return o.length===0&&r?delete a[i]:a[i]=Te(a[i],o,n,r),a}return e}function Gi(e,t,n,r){let i=t.reduce((a,f)=>typeof a=="object"&&a!==null?a[f]:void 0,e);if(typeof i!="object"||i===null||Array.isArray(i))return e;let o=Object.entries(i).map(([a,f])=>a===n?[r,f]:[a,f]);return Te(e,t,Object.fromEntries(o))}function yr(e,t){let n=e,r=s("div",{class:"wgd-jsontree"});function i(p){n=p,l(),t(n)}function o(p,m,w){let g=m==="number"?Number.isFinite(Number(w))?Number(w):0:w;n=Te(n,p,g),t(n)}function a(p,m){let w=s("select",{class:"wgd-select wgd-jt-type"});for(let g of Ki)w.append(s("option",{value:g},[g]));return w.value=On(p),w.addEventListener("change",()=>i(Te(n,m,qi(w.value,p)))),w}function f(p,m){let w=On(p);if(w==="boolean"){let g=s("input",{type:"checkbox"});return g.checked=p,g.addEventListener("change",()=>i(Te(n,m,g.checked))),g}if(w==="null")return s("code",void 0,["null"]);if(w==="string"||w==="number"){let g=s("input",{type:"text",class:"wgd-input"});return g.value=String(p),g.addEventListener("change",()=>o(m,w,g.value)),g}return s("span")}function d(p,m,w,g){let y=s("div",{class:"wgd-jt-row"},[p,a(m,w)]),v=On(m);if(v!=="object"&&v!=="array"&&y.append(f(m,w)),g){let x=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);x.addEventListener("click",()=>i(Te(n,w,void 0,!0))),y.append(x)}let S=s("div",{class:"wgd-jt-entry"},[y]);return(v==="object"||v==="array")&&S.append(u(m,w)),S}function u(p,m){let w=s("div",{class:"wgd-jt-children"});if(Array.isArray(p)){p.forEach((v,S)=>{w.append(d(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(Te(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 x=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});x.value=v,x.addEventListener("change",()=>i(Gi(n,m,v,x.value))),w.append(d(x,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 x=1;S in v;x++)S=`key${x}`;i(Te(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 l(){r.replaceChildren(d(s("span",{class:"wgd-jt-key"},["value"]),n,[],!1))}return l(),{element:r,getValue:()=>n,setValue(p){r.contains(document.activeElement)||(n=p,l())}}}var br=["object","array","string","number","integer","boolean","null","any"],vr=new Set(["string","number","integer","any"]);function ot(e,t){let n=e,r=s("div",{class:"wgd-schemabuilder"});function i(d,u=!0){n=d,t(n),u&&f()}function o(d,u,l){let p={...d};return l===void 0?delete p[u]:p[u]=l,p}function a(d,u,l,p=[],m=[]){let w=[],g=s("select",{class:"wgd-select wgd-sb-type"});for(let A of br)g.append(s("option",{value:A},[A]));let y=d.type,v=Array.isArray(y)?y.filter(A=>typeof A=="string"):void 0,S=v?.includes("null")??!1,x=typeof y=="string"?y:v?.find(A=>A!=="null")??(S?"null":"any");g.value=br.some(A=>A===x)?x:"any",ke(g);let C=s("input",{type:"checkbox",title:"Also allows null"});C.checked=S,C.disabled=g.value==="any"||g.value==="null";function $(A,H){if(A!=="any")return H&&A!=="null"?[A,"null"]:A}C.addEventListener("change",()=>{u(o(d,"type",$(g.value,C.checked)))}),g.addEventListener("change",()=>{let A=o(d,"type",$(g.value,C.checked));g.value!=="object"&&(A=o(o(A,"properties",void 0),"required",void 0)),g.value!=="array"&&(A=o(A,"items",void 0)),g.value!=="string"&&(A=o(A,"pattern",void 0)),vr.has(g.value)||(A=o(A,"enum",void 0)),u(A)}),w.push(s("div",{class:"wgd-sb-row"},[...p,g,s("label",{class:"wgd-sb-req wgd-sb-null",title:"Also allows null"},[C,"null"]),...m]));let M=[];if(g.value==="string"){let A=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:"pattern (regex, optional)"});A.value=typeof d.pattern=="string"?d.pattern:"",A.addEventListener("change",()=>u(o(d,"pattern",A.value===""?void 0:A.value))),M.push(s("span",{class:"wgd-sb-label"},["pattern"]),A)}let U=q(void 0);if(vr.has(g.value)){let A=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:'enum ["a","b"] (optional)'});A.value=Array.isArray(d.enum)?JSON.stringify(d.enum):"",A.addEventListener("change",()=>{if(A.value.trim()===""){U.hidden=!0,u(o(d,"enum",void 0));return}try{let H=JSON.parse(A.value);if(!Array.isArray(H))throw new Error("must be a JSON array");U.hidden=!0,u(o(d,"enum",H))}catch(H){U.hidden=!1,U.textContent=`enum ignored: ${le(H)}`}}),M.push(s("span",{class:"wgd-sb-label"},["enum"]),A)}if(M.length>0&&w.push(s("div",{class:"wgd-sb-row wgd-sb-constraints"},M),U),g.value==="object"){let A=k(d.properties)?d.properties:{},H=Array.isArray(d.required)?d.required.filter(_=>typeof _=="string"):[],V=s("div",{class:"wgd-jt-children"});for(let[_,Q]of Object.entries(A)){let W=s("input",{type:"text",class:"wgd-input wgd-sb-prop",placeholder:"property name"});W.value=_,W.addEventListener("change",()=>{let L=Object.entries(A).map(([P,N])=>P===_?[W.value,N]:[P,N]),j=H.map(P=>P===_?W.value:P);u(o(o(d,"properties",Object.fromEntries(L)),"required",j.length>0?j:void 0))});let b=s("input",{type:"checkbox",title:"required"});b.checked=H.includes(_),b.addEventListener("change",()=>{let L=b.checked?[...H,_]:H.filter(j=>j!==_);u(o(d,"required",L.length>0?L:void 0))});let E=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);E.addEventListener("click",()=>{let{[_]:L,...j}=A;u(o(o(d,"properties",Object.keys(j).length>0?j:void 0),"required",H.filter(P=>P!==_).length>0?H.filter(P=>P!==_):void 0))}),V.append(a(k(Q)?Q:{},L=>u(o(d,"properties",{...A,[_]:L})),l+1,[W],[s("label",{class:"wgd-sb-req",title:"required"},[b,"req"]),E]))}let z=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);z.addEventListener("click",()=>{let _="field";for(let Q=1;_ in A;Q++)_=`field${Q}`;u(o(d,"properties",{...A,[_]:{type:"string"}}))}),V.append(s("div",{class:"wgd-toolbar"},[z])),w.push(V)}return g.value==="array"&&w.push(s("div",{class:"wgd-slot"},[a(k(d.items)?d.items:{},A=>u(o(d,"items",A)),l+1,[s("span",{class:"wgd-sb-label"},["items"])])])),s("div",{class:l===0?"wgd-sb-root":"wgd-sb-node"},w)}function f(){if(n===void 0){let u=s("button",{class:"wgd-button wgd-add",type:"button"},["+ add a data schema"]);u.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"},[u])]));return}let d=s("button",{class:"wgd-button wgd-add wgd-remove",type:"button"},["remove schema"]);d.addEventListener("click",()=>i(void 0)),r.replaceChildren(a(n,u=>i(u),0),s("div",{class:"wgd-toolbar"},[d]))}return f(),{element:r,getValue:()=>n,setValue(d){r.contains(document.activeElement)||(n=d,f())}}}function vt(e,t,n){let r=e,i=s("div",{class:"wgd-record"});function o(d){r=Object.keys(d).length>0?d:void 0,n(r),f()}function a(d,u,l,p){let m=s("input",{type:"text",class:l,placeholder:u,spellcheck:"false"});return m.value=d,m.addEventListener("change",()=>p(m.value)),m}function f(){let d=r??{},u=Object.entries(d).map(([p,m])=>{let w=a(p,t.key,"wgd-input wgd-rec-key",v=>{let S=Object.entries(d).map(([x,C])=>x===p?[v,C]:[x,C]);o(Object.fromEntries(S))}),g=a(m,t.value,"wgd-input wgd-rec-value",v=>o({...d,[p]:v})),y=s("button",{class:"wgd-icon",type:"button",title:"Remove entry"},["\u2715"]);return y.addEventListener("click",()=>{let{[p]:v,...S}=d;o(S)}),s("div",{class:"wgd-rec-row"},[w,s("span",{class:"wgd-st-colon"},[":"]),g,y])}),l=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},[t.add]);l.addEventListener("click",()=>{let p="";for(let m=1;p in d;m++)p=`key${m}`;o({...d,[p]:""})}),i.replaceChildren(...u,s("div",{class:"wgd-toolbar"},[l]))}return f(),{element:i,getValue:()=>r,setValue(d){i.contains(document.activeElement)||(r=d,f())}}}function xr(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 xt(e){if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];switch(xr(e)){case"object":{let t={};if(k(e.properties)&&Array.isArray(e.required))for(let n of e.required)typeof n=="string"&&k(e.properties[n])&&(t[n]=xt(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 qt(e,t,n){let r=t??xt(e),i=s("div",{class:"wgd-schemaform"});function o(l,p,m,w=!1){if(p.length===0)return m;let[g,...y]=p;if(Array.isArray(l)){let S=[...l];return y.length===0&&w?S.splice(g,1):S[g]=o(S[g],y,m,w),S}let v=k(l)?{...l}:{};return y.length===0&&w?delete v[g]:v[g]=o(v[g],y,m,w),v}function a(l,p,m=!1){r=o(r,l,p),n(r),m&&u()}function f(l,p,m,w){if(Array.isArray(l.enum)){let g=s("select",{class:"wgd-select"});for(let y of l.enum)g.append(s("option",{value:JSON.stringify(y)},[JSON.stringify(y)]));return g.value=JSON.stringify(p??l.enum[0]),g.addEventListener("change",()=>a(m,JSON.parse(g.value))),d(w,g)}switch(xr(l)){case"boolean":{let g=s("input",{type:"checkbox"});return g.checked=p===!0,g.addEventListener("change",()=>a(m,g.checked)),d(w,g)}case"number":case"integer":{let g=s("input",{type:"number",class:"wgd-input"});return g.value=typeof p=="number"?String(p):"0",g.addEventListener("change",()=>{let y=Number(g.value);a(m,Number.isFinite(y)?y:0)}),d(w,g)}case"object":{let g=s("div",{class:"wgd-jt-children"}),y=k(l.properties)?l.properties:{},v=Array.isArray(l.required)?l.required:[],S=k(p)?p:{};for(let[x,C]of Object.entries(y)){if(!k(C))continue;let $=v.includes(x);g.append(f(C,S[x]??($?xt(C):void 0),[...m,x],$?`${x} *`:x))}return s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[w]),g])}case"array":{let g=k(l.items)?l.items:{},y=Array.isArray(p)?p:[],v=s("div",{class:"wgd-jt-children"});y.forEach((x,C)=>{let $=s("div",{class:"wgd-jt-entry"},[f(g,x,[...m,C],`#${C}`)]),M=s("button",{class:"wgd-icon",type:"button",title:"Remove item"},["\u2715"]);M.addEventListener("click",()=>{r=o(r,[...m,C],void 0,!0),n(r),u()}),$.append(M),v.append($)});let S=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);return S.addEventListener("click",()=>a([...m,y.length],xt(g),!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 g=s("input",{type:"text",class:"wgd-input"});return typeof l.pattern=="string"&&(g.setAttribute("placeholder",`pattern: ${l.pattern}`),g.setAttribute("title",`Must match ${l.pattern}`)),g.value=typeof p=="string"?p:p===void 0?"":String(p),g.addEventListener("change",()=>a(m,g.value)),d(w,g)}}}function d(l,p){return s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[l]),p])}function u(){i.replaceChildren(f(e,r,[],"data"))}return u(),{element:i,getValue:()=>r,setValue(l){i.contains(document.activeElement)||(r=l??xt(e),u())}}}function kr(e,t){let n=e,r=s("div",{class:"wgd-styles"});function i(d){n=Object.keys(d).length>0?d:void 0,t(n),f()}function o(d,u,l,p){let m=s("input",{type:"text",class:l,placeholder:u,spellcheck:"false"});return m.value=d,m.addEventListener("change",()=>p(m.value)),m}function a(d,u,l){let p=o(d,".wg-selector","wgd-input wgd-st-selector",y=>{let v=Object.entries(l).map(([S,x])=>S===d?[y,x]:[S,x]);i(Object.fromEntries(v))}),m=s("button",{class:"wgd-icon",type:"button",title:"Add declaration"},["+"]);m.addEventListener("click",()=>{i({...l,[d]:{...u,"":""}})});let w=s("button",{class:"wgd-icon",type:"button",title:"Remove selector"},["\u2715"]);w.addEventListener("click",()=>{let{[d]:y,...v}=l;i(v)});let g=Object.entries(u).map(([y,v])=>{let S=o(y,"property","wgd-input wgd-st-prop",$=>{let M=Object.entries(u).map(([U,A])=>U===y?[$,A]:[U,A]);i({...l,[d]:Object.fromEntries(M)})}),x=o(v,"value (no url(...), no ;)","wgd-input wgd-st-value",$=>{i({...l,[d]:{...u,[y]:$}})}),C=s("button",{class:"wgd-icon",type:"button",title:"Remove declaration"},["\u2715"]);return C.addEventListener("click",()=>{let{[y]:$,...M}=u;i({...l,[d]:M})}),s("div",{class:"wgd-st-decl"},[S,s("span",{class:"wgd-st-colon"},[":"]),x,C])});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"},g)])}function f(){let d=n??{},u=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},["+ selector"]);u.addEventListener("click",()=>{let l=".wg-";for(let p=1;l in d;p++)l=`.wg-${p}`;i({...d,[l]:{}})}),r.replaceChildren(...Object.entries(d).map(([l,p])=>a(l,k(p)?p:{},d)),s("div",{class:"wgd-toolbar"},[u]))}return f(),{element:r,getValue:()=>n,setValue(d){r.contains(document.activeElement)||(n=d,f())}}}var Er=3;function ge(e){if(!k(e))return;let t=e.type;if(typeof t=="string")return t;if(Array.isArray(t)){let n=t.find(r=>typeof r=="string"&&r!=="null");if(typeof n=="string")return n}}function Gt(e,t,n,r=0){if(!(!k(e)||r>Er)&&!(ge(e)!=="object"||!k(e.properties)))for(let[i,o]of Object.entries(e.properties)){let a=t===""?i:`${t}.${i}`;n.push({path:a,schema:o}),Gt(o,a,n,r+1)}}function $e(e){return k(e)&&ge(e)==="array"?e.items:e}function Je(e,t){if(t===""||t===".")return e;let n=e;for(let r of t.split(".")){if(!k(n))return;if(ge(n)==="array"){if(!/^\d+$/.test(r))return;n=$e(n);continue}if(!k(n.properties))return;n=n.properties[r]}return n}function Yi(e,t){if(e===void 0||t===void 0)return!1;let n=r=>r==="integer"?"number":r;return n(e)!==n(t)}function Sr(e,t){let n=e,r=t;for(let a=0;a<Er&&!(ge(n)!=="array"||ge(r)!=="array");a++)n=$e(n),r=$e(r);let i=ge(n),o=ge(r);return Yi(i,o)?{source:i,target:o}:void 0}function st(e){let t=[];return Gt(e,"",t),t.map(n=>n.path)}var Tr="__custom__";function Ar(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function Or(){return{kind:"http",method:"GET",url:"https://api.example.com/resource",input:{type:"object",properties:{}},output:{type:"object"}}}function Yt(e){return"ref"in e&&typeof e.ref=="string"}function Ae(e,t,n,r=""){let i=s("input",{type:"text",class:t,placeholder:r});return i.value=e,i.addEventListener("change",()=>n(i.value)),i}function he(e){return s("span",{class:"wgd-field-label"},[e])}function kt(e){let t=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return t.addEventListener("click",e),t}function Xt(e,t,n,r,i="wgd-input wgd-rec-value"){if(t.length===0)return Ae(e,i,n,r);let o=s("select",{class:"wgd-select wgd-path"}),a=t.includes(e),f=a||e===""?t:[e,...t];o.append(s("option",{value:""},[r]));for(let u of f)o.append(s("option",{value:u},[u===e&&!a?`${u} (off-schema)`:u]));o.append(s("option",{value:Tr},["custom\u2026"])),o.value=e,ke(o);let d=Ae(e,i,n,r);return d.hidden=!0,o.addEventListener("change",()=>{if(o.value===Tr){d.hidden=!1,d.focus();return}d.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,d])}function Dr(e,t,n,r){let i=ce(e??{}),o=[],a=s("div",{class:"wgd-record wgd-headers"}),f=q(void 0);function d(m){i=m,r(Object.keys(i).length>0?i:void 0),p()}function u(m){f.hidden=!1,f.textContent=`'${m}' is already used; pick another ${n.name} name.`}function l(m,w){let g=k(m),y=fe([{value:"literal"},{value:"secret"}],g?"secret":"literal","wgd-select wgd-attr-mode",v=>w(v==="secret"?{secret:t[0]??""}:""));if(g){let v=t.includes(m.secret)?t:[m.secret,...t],S=fe(v.map(x=>({value:x,label:x===""?"(pick a secret)":x})),m.secret,"wgd-select wgd-secret",x=>w({secret:x}));return[y,S]}return[y,Ae(m,"wgd-input wgd-rec-value",w,"value")]}function p(){a.replaceChildren(),f.hidden=!0;for(let[w,g]of Object.entries(i)){let y=Ae(w,"wgd-input wgd-rec-key",x=>{if(x===w)return;if(x===""||Object.hasOwn(i,x)){u(x||"(empty)");return}let C=Object.entries(i).map(([$,M])=>$===w?[x,M]:[$,M]);d(Object.fromEntries(C))},n.name),v=l(g,x=>d({...i,[w]:x})),S=kt(()=>{let{[w]:x,...C}=i;d(C)});a.append(s("div",{class:"wgd-rec-row"},[y,...v,S]))}o.forEach((w,g)=>{let y=Ae("","wgd-input wgd-rec-key",x=>{if(x!==""){if(Object.hasOwn(i,x)){u(x);return}o.splice(g,1),d({...i,[x]:w.value})}},n.name),v=l(w.value,x=>{w.value=x,p()}),S=kt(()=>{o.splice(g,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]),f)}return p(),a}function Xi(e,t){let n=ce(e),r=s("div",{class:"wgd-record wgd-segments"});function i(a){n=a,t(n),o()}function o(){r.replaceChildren(),n.forEach((d,u)=>{let l=typeof d!="string",p=fe([{value:"text"},{value:"bind"}],l?"bind":"text","wgd-select wgd-attr-mode",g=>{let y=[...n];y[u]=g==="bind"?{bind:"."}:"",i(y)}),m=Ae(l?d.bind:d,"wgd-input wgd-rec-value",g=>{let y=[...n];y[u]=l?{bind:g}:g,i(y)},l?"data path":"text"),w=kt(()=>i(n.filter((g,y)=>y!==u)));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 f=s("button",{class:"wgd-button wgd-add",type:"button"},["+ bind"]);f.addEventListener("click",()=>i([...n,{bind:"."}])),r.append(s("div",{class:"wgd-row"},[a,f]))}return o(),r}function Nn(e,t,n){let r=ce(e??Ar()),i=s("div",{class:"wgd-action-head"}),o=s("div",{class:"wgd-action-schemas"}),a=s("div",{class:"wgd-action-maps"}),f=s("div",{class:"wgd-action-definition"},[i,o,a]);function d(){return r}function u(y,v){r=y,n(ce(r)),v==="all"?g():v==="schemas"&&m()}function l(y,v){let S=ot(d()[v],$=>{u({...d(),[v]:$??{type:"object"}},"none")}),x=[he(y),S.element],C=t.schemas??[];if(C.length>0){let $=fe([{value:"",label:"copy a shared schema into this action\u2026"},...C.map(M=>({value:M.name}))],"","wgd-select",M=>{let U=C.find(A=>A.name===M);U&&u({...d(),[v]:ce(U.schema)},"schemas")});x.push(s("div",{class:"wgd-row"},[$,he("(a copy \u2014 later edits to the shared schema do not follow)")]))}return s("div",{class:"wgd-action-schema"},x)}function p(){i.replaceChildren();let y=fe([{value:"prompt",label:"prompt \u2014 propose a message"},{value:"http",label:"http \u2014 call an API"}],r.kind,"wgd-select wgd-action-kind",x=>u(x==="http"?Or():Ar(),"all"));if(r.kind==="prompt"){i.append(s("div",{class:"wgd-row"},[he("Kind"),y]),he("Message (literals and bound values; the user reviews and sends it)"),Xi(r.text,x=>u({kind:"prompt",text:x},"none")));return}let v=fe(ft.map(x=>({value:x})),r.method,"wgd-select",x=>u({...d(),method:x},"none")),S=Ae(r.url,"wgd-input wgd-action-url",x=>u({...d(),url:x},"none"),"https://\u2026");i.append(s("div",{class:"wgd-row"},[he("Kind"),y,he("Method"),v]),s("label",{class:"wgd-field"},[he("URL (https, fixed)"),S]))}function m(){o.replaceChildren(),r.kind==="http"&&o.append(l("Input schema (arguments; GET \u2192 query, POST \u2192 JSON body)","input"),l("Output schema (the response must satisfy it)","output"))}function w(){if(a.replaceChildren(),r.kind!=="http")return;let y=t.secretNames??[];a.append(he("Headers"),Dr(r.headers,y,{add:"+ header",name:"header"},v=>{let{headers:S,...x}=d();u(v===void 0?x:{...x,headers:v},"none")}),he("Fixed query parameters"),Dr(r.query,y,{add:"+ parameter",name:"parameter"},v=>{let{query:S,...x}=d();u(v===void 0?x:{...x,query:v},"none")}))}function g(){p(),m(),w()}return g(),{element:f,getValue:()=>ce(r),setValue(y){r=ce(y),g()}}}function Zt(e,t,n){let r=e===void 0?void 0:ce(e),i=s("div",{class:"wgd-binding-head"}),o=s("div",{class:"wgd-binding-input"}),a=s("div",{class:"wgd-binding-output"}),f=s("div",{class:"wgd-binding"},[i,o,a]);function d(C){if(C!==void 0)return Yt(C)?(t.actions??[]).find($=>$.name===C.ref)?.definition:C.definition}let u=()=>ce(r?.input??{}),l=()=>ce(r?.output??{});function p(C,$){r=C,n(C===void 0?void 0:ce(C)),$==="all"?x():$==="io"?(y(),v()):$==="input"?y():$==="output"&&v()}function m(C,$,M){return{...Yt(C)?{ref:C.ref}:{definition:C.definition},...$!==void 0&&Object.keys($).length>0?{input:$}:{},...M!==void 0&&Object.keys(M).length>0?{output:M}:{}}}function w(){return["$index","$parent","$root",...st(t.getDataSchema?.()).map($=>`$root.${$}`)]}function g(){i.replaceChildren();let C=(t.actions??[]).filter(A=>!t.loadOnly||A.definition.kind==="http"&&A.definition.method==="GET"),$=r===void 0?"none":Yt(r)?"shared":"inline",M=fe([{value:"none",label:t.loadOnly?"no load action":"no action"},{value:"shared",label:"shared action"},{value:"inline",label:"inline definition"}],$,"wgd-select wgd-binding-mode",A=>{p(A==="none"?void 0:A==="shared"?{ref:C[0]?.name??""}:{definition:Or()},"all")});if(i.append(s("div",{class:"wgd-row"},[M])),r===void 0)return;if(Yt(r)){let A=r.ref,H=C.map(_=>_.name),V=(H.includes(A)?H:[A,...H]).map(_=>({value:_,label:_===""?"(pick an action)":H.includes(_)?_:`${_} (unknown)`})),z=fe(V,A,"wgd-select wgd-binding-ref",_=>p(m({ref:_},u(),l()),"io"));i.append(s("div",{class:"wgd-row"},[he("Action"),z]));return}let U=Nn(r.definition,t,A=>{p(m({definition:A},u(),l()),"io")});i.append(U.element)}function y(){o.replaceChildren();let C=d(r);if(r===void 0||C?.kind!=="http")return;let $=r,M=k(C.input.properties)?Object.keys(C.input.properties):[],U=t.scopePaths??st(t.getDataSchema?.()),A=[...new Set([...U,...w()])],H=u(),V=M.map(z=>{let _=H[z],Q=k(_)&&"const"in _,W=fe([{value:"path"},{value:"const"}],Q?"const":"path","wgd-select wgd-attr-mode",L=>{p(m($,{...u(),[z]:L==="const"?{const:""}:z},l()),"input")}),b=L=>{let j=u();if(Q){let P;try{P=JSON.parse(L)}catch{P=L}j[z]={const:P}}else L===""?delete j[z]:j[z]=L;p(m($,j,l()),"none")},E=Q?Ae(JSON.stringify(_.const),"wgd-input wgd-rec-value",b,"JSON literal"):Xt(typeof _=="string"?_:"",A,b,"data path");return s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-rec-key wgd-binding-field"},[z]),W,E])});o.append(he("Input mapping (field \u2190 data path or constant)"),M.length>0?s("div",{class:"wgd-record"},V):s("div",{class:"wgd-diagnostic"},["The input schema declares no properties."]))}function v(){a.replaceChildren();let C=d(r);if(r===void 0||C?.kind!=="http")return;let $=r,M=l(),U=M.mode??"merge",A=fe(pt.map(V=>({value:V})),U,"wgd-select",V=>{let z={...l(),mode:V};V!=="patch"&&delete z.path,p(m($,u(),z),"output")}),H=[he("Output"),A];U==="patch"&&H.push(Ae(M.path??"","wgd-input",V=>{p(m($,u(),{...l(),path:V}),"output")},"data path to write at")),a.append(s("div",{class:"wgd-row"},H)),a.append(S(C,M,V=>{let z=l();V===void 0?delete z.map:z.map=V,p(m($,u(),z),"none")}))}function S(C,$,M){let U=s("div",{class:"wgd-record wgd-output-map"}),A=ce($.map??{}),H=[],V=t.getDataSchema?.(),z=$.mode??"merge",_=z==="patch"&&$.path?$.path:"",Q=_===""?V:Je(V,_),W=$e(Q),b=[".",...st(W)],E=()=>A["."]===void 0?C.output:Je(C.output,A["."]),L=()=>ge(E())==="array",j=()=>$e(E()),P=[".",...st(C.output)],N=q(void 0);N.classList.add("wgd-type-mismatch");function D(O){A=O,M(Object.keys(A).length>0?A:void 0),T()}function c(O){N.hidden=!1,N.textContent=O}function h(O,I){let F=Xt(O,b,I,"target data path","wgd-input wgd-rec-key");return F.classList.add("wgd-map-target"),F}function T(){U.replaceChildren();let O=[],I=Object.keys(A).filter(G=>G!==".");L()&&z==="merge"&&I.length>0&&O.push("a list projects per item \u2014 use replace or patch; merge needs an object.");let F=[".",...st(j())];for(let[G,K]of Object.entries(A)){let X=G==="."?P:F,Z=G==="."?void 0:Sr(Je(j(),K),Je(W,G));Z&&O.push(`'${K}' is ${Z.source} in the response but '${_?`${_}.`:""}${G}' is ${Z.target} in the widget schema`);let ne=h(G,ae=>{if(ae===G)return;if(ae===""||Object.hasOwn(A,ae)){c(`'${ae||"(empty)"}' is already a projection target.`);return}let at=Object.entries(A).map(([ye,dt])=>ye===G?[ae,dt]:[ye,dt]);D(Object.fromEntries(at))}),de=Xt(K,X,ae=>D({...A,[G]:ae}),"response path");de.classList.add("wgd-map-source");let Ee=kt(()=>{let{[G]:ae,...at}=A;D(at)});U.append(s("div",{class:"wgd-rec-row"},[ne,s("span",{class:"wgd-st-colon"},["\u2190"]),de,Ee]))}H.forEach((G,K)=>{let X=h("",de=>{if(de!==""){if(Object.hasOwn(A,de)){c(`'${de}' is already a projection target.`);return}H.splice(K,1),D({...A,[de]:G.source})}}),Z=Xt(G.source,F,de=>{G.source=de,T()},"response path");Z.classList.add("wgd-map-source");let ne=kt(()=>{H.splice(K,1),T()});U.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[X,s("span",{class:"wgd-st-colon"},["\u2190"]),Z,ne]))});let te=s("button",{class:"wgd-button wgd-add",type:"button"},["+ projection"]);te.addEventListener("click",()=>{H.push({source:""}),T()}),N.hidden=O.length===0,N.textContent=O.length===0?"":`Type mismatch: ${O.join("; ")}.`,U.append(s("div",{class:"wgd-row"},[te]),N)}return T(),U}function x(){g(),y(),v()}return x(),{element:f,setValue(C){r=C===void 0?void 0:ce(C),x()}}}function je(e,t=[]){let n=e.descriptor?.dataSchemaRef;if(typeof n=="string")return t.find(i=>i.name===n)?.schema;let r=e.descriptor?.dataSchema;return k(r)?r:void 0}var Zi=new Set(Se().kinds());function Qi(e){if(!k(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(!k(r)){t.push({selector:n,message:"Declarations must be a property \u2192 value map."});continue}for(let[i,o]of Object.entries(r))(typeof o!="string"||_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 Qt(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.":Zi.has(e.kind)&&(n.kind=`'${e.kind}' is a built-in kind \u2014 pick a distinct id.`);let r=Oe(e.template);if(!r.ok){let a={code:r.error.code,message:r.error.message},f=r.error.path;typeof f=="string"&&(a.path=f),n.template=a}let i=e.descriptor?.dataSchemaRef;typeof i=="string"&&(e.descriptor?.dataSchema!==void 0?n.schemaRef="A descriptor carries 'dataSchema' OR 'dataSchemaRef', never both.":(t.schemas??[]).every(a=>a.name!==i)&&(n.schemaRef=`References unknown schema '${i}' \u2014 it is not among the supplied shared schemas.`));let o=je(e,t.schemas??[]);if(k(o)){if(e.descriptor.dataExample!==void 0){let a=De(o,e.descriptor.dataExample);a&&(n.example=a)}if(e.sampleData!==void 0){let a=De(o,e.sampleData);a&&(n.sample=a)}}if(n.styles=Qi(e.descriptor?.styles),e.load!==void 0){let a=mt(e.load,"load",{isPath:f=>xe(f)!==void 0});a&&(n.load=`${a.message} (at ${a.path})`)}if(t.actions!==void 0){let a=new Set(t.actions.map(d=>d.name)),f=yt(e.template,e.load).filter(d=>!a.has(d));f.length>0&&(n.actionRefs=`References unknown shared action${f.length===1?"":"s"} ${f.map(d=>`'${d}'`).join(", ")} \u2014 bound elements will render disabled.`)}if(e.theme!==void 0){let a=Ue(e.theme);a.ok||(n.theme=a.error)}return n.previewable=n.kind===void 0&&n.template===void 0,n}function Rn(e,t){if(ge(e)==="array")return["."];let n=[];Gt(e,"",n);let r=new Set(["string","number","integer","boolean","null",void 0]),o=n.filter(({schema:a})=>{let f=ge(a);return t==="each"?f==="array":t==="bind"?r.has(f):!0}).map(a=>a.path);return t!=="each"&&r.has(ge(e))&&o.unshift("."),o}function Nr(e,t){let n=Je(e,t);return ge(n)==="array"?$e(n):void 0}var tn=Symbol("remove");function Ln(e){let t="";for(let n of e){let r=typeof n=="number"?`children.${n}`:n;t=t===""?r:`${t}.${r}`}return t}function nn(e,t,n){if(t.length===0)return n===tn?void 0:n;let[r,...i]=t;if(typeof r=="number"){if(!k(e)||!Array.isArray(e.children))return e;let o=[...e.children];return i.length===0&&n===tn?o.splice(r,1):o[r]=nn(o[r],i,n),{...e,children:o}}if(!k(e))return e;if(i.length===0&&n===tn){let{[r]:o,...a}=e;return a}return{...e,[r]:nn(e[r],i,n)}}function Rr(e,t,n,r){let i=t.length===0?e:eo(e,t);if(!k(i)||!Array.isArray(i.children))return e;let o=[...i.children];if(n<0||r<0||n>=o.length||r>=o.length)return e;let[a,f]=[o[n],o[r]];o[n]=f,o[r]=a;let d={...i,children:o};return t.length===0?d:nn(e,t,d)}function eo(e,t){let n=e;for(let r of t){if(!k(n))return;n=typeof r=="number"?Array.isArray(n.children)?n.children[r]:void 0:n[r]}return n}var en={text:()=>"text",bind:()=>({bind:"."}),element:()=>({tag:"div",children:[]}),each:()=>({each:".",template:"item"}),when:()=>({when:".",template:"shown"})};function Lr(e,t,n={}){let r=n.actionContext??{actions:[],secretNames:[],schemas:[]},i=new Set,o=s("div",{class:"wgd-tree"}),a=q(void 0),f=s("textarea",{class:"wgd-textarea wgd-template-json",rows:"14",spellcheck:"false"}),d=s("div",void 0,[f,a]);ue(f),d.hidden=!0;let u=s("button",{class:"wgd-button",type:"button"},["Tree"]),l=s("button",{class:"wgd-button",type:"button"},["JSON"]);u.addEventListener("click",()=>{o.hidden=!1,d.hidden=!0}),l.addEventListener("click",()=>{o.hidden=!0,d.hidden=!1});let p=q(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"},[u,l]),p,o,d])]);function w(b){e.update(E=>({...E,template:b}))}function g(b,E){w(nn(e.get().template,b,E))}f.addEventListener("input",()=>{try{let b=JSON.parse(f.value);a.hidden=!0,a.textContent="",w(b)}catch(b){a.hidden=!1,a.textContent=`Invalid JSON (template keeps the last valid value): ${String(le(b))}`}});function y(b,E,L="wgd-input wgd-node-value"){let j=s("input",{type:"text",class:L});return j.value=b,j.addEventListener("change",()=>E(j.value)),j}function v(b,E){let L=b!==void 0&&et(b.type)?b:void 0,j=fe([{value:"none",label:"raw"},...Qe.map(D=>({value:D}))],L===void 0?"none":L.type,"wgd-select wgd-format-type",D=>{E(D==="number"?{type:"number",decimals:2}:D==="currency"?{type:"currency",currency:"USD",decimals:2}:D==="date"?{type:"date",pattern:"yyyy-MM-dd"}:void 0)},"Present the bound value as a number, a currency amount or a date");if(L===void 0)return[j];let P=()=>{let D=y(L.decimals===void 0?"":String(L.decimals),c=>{let{decimals:h,...T}=L,O=Number(c);E(c===""?T:{...T,decimals:Number.isFinite(O)?O:c})},"wgd-input wgd-format-decimals");return D.placeholder="dec",D.title=`Decimal places (${Ie}-${Me})`,D};if(L.type==="currency"){let D=y(typeof L.currency=="string"?L.currency:"",h=>E({...L,currency:h.toUpperCase()}),"wgd-input wgd-format-currency");D.placeholder="CUR",D.title="ISO-4217 currency code, e.g. COP";let c=fe(He.map(h=>({value:h})),tt(L.currencyDisplay)?L.currencyDisplay:He[0],"wgd-select wgd-format-display",h=>E({...L,currencyDisplay:h}),"How the currency names itself");return[j,D,P(),c]}if(L.type==="number")return[j,P()];let N=y(typeof L.pattern=="string"?L.pattern:"",D=>E({...L,pattern:D}),"wgd-input wgd-format-pattern");return N.placeholder="pattern",N.title=`Date pattern from ${nt.join(" ")} plus separators, e.g. dd-MM-yyyy HH:mm`,[j,N]}let S=new Set;function x(b,E,L,j,P,N,D,c){let h=Ln(E),T=j.length>0,O=T&&S.has(h),I;T?(I=s("button",{class:"wgd-chevron",type:"button",title:O?"Expand":"Collapse"},[O?"\u25B8":"\u25BE"]),I.addEventListener("click",()=>{O?S.delete(h):S.add(h),Q()})):I=s("span",{class:"wgd-chevron wgd-chevron-none"});let F=b===void 0?[I,...L]:[I,s("span",{class:"wgd-node-badge"},[b]),...L];O&&c?.summary!==void 0&&F.push(s("span",{class:"wgd-node-summary"},[c.summary]));let te=[...c?.icons??[]];if(D&&D.count>1){if(D.index>0){let K=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);K.addEventListener("click",()=>w(Rr(e.get().template,D.parent,D.index,D.index-1))),te.push(K)}if(D.index<D.count-1){let K=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);K.addEventListener("click",()=>w(Rr(e.get().template,D.parent,D.index,D.index+1))),te.push(K)}}if(N){let K=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);K.addEventListener("click",()=>E.length===0?w(""):g(E,tn)),te.push(K)}te.length>0&&F.push(s("span",{class:"wgd-node-icons"},te));let G=[s("div",{class:"wgd-node-row"},F)];return P!==void 0&&G.push(q(P)),O||G.push(...j),s("div",{class:"wgd-node","data-path":h},G)}let C=["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 $(b,E,L,j,P="wgd-input wgd-node-value"){let N=k(E)?Rn(E,L):[];if(N.length===0)return y(b,j,P);let D=s("select",{class:"wgd-select wgd-path"}),c=N.includes(b);for(let O of c?N:[b,...N])D.append(s("option",{value:O},[O===b&&!c?`${O} (off-schema)`:O]));D.append(s("option",{value:"__custom__"},["custom\u2026"])),D.value=b,ke(D);let h=y(b,j,P);h.hidden=!0,D.addEventListener("change",()=>{if(D.value==="__custom__"){h.hidden=!1,h.focus();return}h.hidden=!0,j(D.value)});let T=P.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${T}`},[D,h])}function M(b,E,L){let j=b??"",P=O=>L(O===""?void 0:O),N="Optional item key (e.g. id): a reordered list keeps each item's state",D=k(E)?Rn(E,"bind"):[];if(D.length===0){let O=y(j,P,"wgd-input wgd-each-key");return O.placeholder="key path",O.title=N,O}let c=s("select",{class:"wgd-select wgd-each-key",title:N}),h=j===""||D.includes(j);c.append(s("option",{value:""},["no key"]));for(let O of h?D:[j,...D])c.append(s("option",{value:O},[O===j&&!h?`${O} (off-schema)`:O]));c.append(s("option",{value:"__custom__"},["custom\u2026"])),c.value=j,ke(c);let T=y(j,P,"wgd-input wgd-each-key");return T.hidden=!0,c.addEventListener("change",()=>{if(c.value==="__custom__"){T.hidden=!1,T.focus();return}T.hidden=!0,P(c.value)}),s("span",{class:"wgd-pathwrap"},[c,T])}function U(b,E){let L=s("select",{class:"wgd-select wgd-tag"}),j=C.includes(b)?C:[b,...C];for(let N of j)L.append(s("option",{value:N},[N]));L.append(s("option",{value:"__custom__"},["custom\u2026"])),L.value=b,ke(L);let P=y(b,E,"wgd-input wgd-tag-custom");return P.hidden=!0,L.addEventListener("change",()=>{if(L.value==="__custom__"){P.hidden=!1,P.focus();return}P.hidden=!0,E(L.value)}),s("span",{class:"wgd-tagwrap"},[L,P])}function A(b,E,L,j,P,N,D){let c=[...E,L];if(j===void 0){let h=Sn(`+ ${b}`,`Set '${b}' to a node`,Object.keys(en),T=>{let O=en[T];O&&g(c,O())});return P?s("div",{class:"wgd-slot"},[q(`Missing required '${b}'.`),h]):s("div",{class:"wgd-slot wgd-slot-unset"},[h])}return s("div",{class:"wgd-slot"},[s("span",{class:"wgd-slot-label"},[b]),H(j,c,N,!P,void 0,D)])}function H(b,E,L,j=!0,P,N){let D=Ln(E),c=L!==void 0&&(L===D||(L.startsWith(D===""?"attrs.":`${D}.attrs.`)||L.startsWith(D===""?"action":`${D}.action`))&&k(b)&&typeof b.tag=="string")?V:void 0;if(typeof b=="string")return x("text",E,[y(b,h=>g(E,h))],[],c,j,P);if(!k(b))return x("invalid",E,[s("code",void 0,[JSON.stringify(b)])],[],c??"Not a template node.",j,P);if(typeof b.bind=="string"){let h=b.bind,T=wt(b),O=k(b.format)?b.format:void 0,I=k(b.map)?b.map:void 0,F=X=>({bind:h,...X}),te=[$(h,N,"bind",X=>g(E,{...b,bind:X}))];(T===void 0||T==="format")&&te.push(...v(O,X=>g(E,X===void 0?{bind:h}:F({format:X}))));let G=[];if(T===void 0){let X=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored labels (e.g. status \u2192 text)"},["map"]);X.addEventListener("click",()=>g(E,F({map:{}}))),G.push(X)}let K=[];if(T==="map"){let X=vt(I,{key:"data value",value:"authored label",add:"+ mapping"},ne=>g(E,ne===void 0?{bind:h}:F({map:ne,...typeof b.default=="string"?{default:b.default}:{}}))),Z=y(typeof b.default=="string"?b.default:"",ne=>g(E,F({map:I??{},...ne===""?{}:{default:ne}})),"wgd-input wgd-attr-map-default");Z.placeholder="default (on miss)",K.push(s("div",{class:"wgd-attr-map"},[X.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),Z])]))}return x("bind",E,te,K,c,j,P,G.length>0?{icons:G}:void 0)}if(typeof b.each=="string"){let h=b.each,{each:T,key:O,...I}=b;return x("each",E,[$(h,N,"each",F=>g(E,{...b,each:F})),s("span",{class:"wgd-st-colon"},["key"]),M(typeof b.key=="string"?b.key:void 0,Nr(N,h),F=>g(E,{each:h,...F===void 0?{}:{key:F},...I}))],[A("template",E,"template",b.template,!0,L,Nr(N,b.each)),A("empty",E,"empty",b.empty,!1,L,N)],c,j,P,{summary:b.empty!==void 0?"template \xB7 empty":"template"})}if(typeof b.when=="string")return x("when",E,[$(b.when,N,"when",h=>g(E,{...b,when:h}))],[A("template",E,"template",b.template,!0,L,N),A("else",E,"else",b.else,!1,L,N)],c,j,P,{summary:b.else!==void 0?"template \xB7 else":"template"});if(typeof b.tag=="string"){let h=k(b.attrs)?b.attrs:{},T=k(b.action)?b.action:void 0,O=Object.entries(h).map(([K,X])=>{let Z=k(X)&&typeof X.bind=="string"?X:{bind:""},ne=k(X)&&typeof X.bind=="string",de=ne?Z:void 0,Ee=Y=>{let pe={bind:Y.bind};return Y.map!==void 0?(pe.map=Y.map,Y.default!==void 0&&Y.default!==""&&(pe.default=Y.default)):Y.prefix!==void 0&&Y.prefix!==""?pe.prefix=Y.prefix:Y.format!==void 0&&(pe.format=Y.format),pe},ae=Y=>{g(E,{...b,attrs:{...h,[K]:Y}})},at=y(K,Y=>{let pe=Object.entries(h).map(([Pe,_n])=>Pe===K?[Y,_n]:[Pe,_n]);g(E,{...b,attrs:Object.fromEntries(pe)})},"wgd-input wgd-attr-name"),ye=s("select",{class:"wgd-select wgd-attr-mode"});ye.append(s("option",{value:"literal"},["literal"])),ye.append(s("option",{value:"bind"},["bind"])),ye.value=ne?"bind":"literal",ke(ye);let dt=y(String(ne?"":X),Y=>ae(Y),"wgd-input wgd-attr-value"),Jr=ne?$(Z.bind,N,"bind",Y=>ae(Ee({...Z,bind:Y})),"wgd-input wgd-attr-value"):dt;ye.addEventListener("change",()=>{let Y=ne?Z.bind:dt.value;ae(ye.value==="bind"?{bind:Y||"."}:Y)});let an=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);an.addEventListener("click",()=>{let{[K]:Y,...pe}=h;g(E,{...b,attrs:pe})});let ct=[at,ye,Jr],qe=de===void 0?void 0:wt(de),Kr=k(de?.format)?de.format:void 0,qr=ne&&(qe===void 0||qe==="format"),Gr=ne&&(qe===void 0||qe==="prefix"),Yr=ne&&qe===void 0;if(qr&&ct.push(...v(Kr,Y=>ae(Ee({...Z,format:Y})))),Gr){let Y=y(de?.prefix??"",pe=>ae(Ee({...Z,prefix:pe})),"wgd-input wgd-attr-prefix");Y.placeholder="prefix",Y.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",ct.push(Y)}if(Yr){let Y=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);Y.addEventListener("click",()=>ae(Ee({...Z,map:{}}))),ct.push(s("span",{class:"wgd-node-icons"},[Y,an]))}else ct.push(an);let Wn=s("div",{class:"wgd-attr-row"},ct),dn=[Wn];if(ne&&qe==="map"){let Y=vt(Z.map,{key:"data value",value:"authored literal",add:"+ mapping"},Pe=>{ae(Pe===void 0?{bind:Z.bind}:Ee({...Z,map:Pe}))}),pe=y(Z.default??"",Pe=>ae(Ee({...Z,default:Pe})),"wgd-input wgd-attr-map-default");pe.placeholder="default (on miss)",dn.push(s("div",{class:"wgd-attr-map"},[Y.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),pe])]))}return dn.length===1?Wn:s("div",{class:"wgd-attr"},dn)}),I=Array.isArray(b.children)?b.children:[],F=Sn("+","Add attribute or child node",["attribute",...T===void 0&&(b.tag==="button"||b.tag==="a")?["action"]:[],...Object.keys(en)],K=>{S.delete(Ln(E));let X=en[K];if(K==="attribute")g(E,{...b,attrs:{...h,"":""}});else if(K==="action"){let Z=r.actions[0];g(E,{...b,action:Z!==void 0?{ref:Z.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else X&&g([...E,I.length],X())}),te=[];if(O.length>0&&te.push(s("div",{class:"wgd-attrs"},O)),T!==void 0){let K=k(N)?Rn(N,"when"):[],X=Zt(T,{...r,scopePaths:K,getDataSchema:()=>je(e.get(),r.schemas)},de=>{if(de===void 0){let{action:Ee,...ae}=b;g(E,ae)}else g(E,{...b,action:de})}),Z=[s("span",{class:"wgd-slot-label"},["action"]),X.element],ne="ref"in T&&typeof T.ref=="string"?T.ref:void 0;ne!==void 0&&i.has(ne)&&Z.push(q(`Unknown shared action '${ne}' \u2014 this element renders disabled.`)),te.push(s("div",{class:"wgd-attrs wgd-node-action"},Z))}I.length>0&&te.push(s("div",{class:"wgd-children"},I.map((K,X)=>H(K,[...E,X],L,!0,{parent:E,index:X,count:I.length},N))));let G=[];return O.length>0&&G.push(`${O.length} attr${O.length===1?"":"s"}`),T!==void 0&&G.push("action"),I.length>0&&G.push(`${I.length} ${I.length===1?"child":"children"}`),x(void 0,E,[U(b.tag,K=>g(E,{...b,tag:K}))],te,c,j,P,{icons:[F],summary:G.join(" \xB7 ")})}return x("unknown",E,[s("code",void 0,[JSON.stringify(b)])],[],c??"Unknown template node form.",j,P)}let V,z,_;function Q(){z!==void 0&&o.replaceChildren(H(z.template,[],_,!0,void 0,je(z,r.schemas)))}function W(b,E){V=E.template?`${E.template.code}: ${E.template.message}`:void 0,z=b,_=E.template?.path;let L=new Set(r.actions.map(P=>P.name));i=new Set(yt(b.template,b.load).filter(P=>!L.has(P)));let j=E.template?`${E.template.code}: ${E.template.message}`+(E.template.path!==void 0&&E.template.path!==""?` (at ${E.template.path})`:""):E.actionRefs;p.hidden=j===void 0,p.textContent=j??"",(!o.hidden||o.childNodes.length===0)&&Q(),document.activeElement!==f&&(f.value=JSON.stringify(b.template,null,2),me(f))}return t.push(()=>{}),{element:m,refresh:W,dispose:()=>m.remove()}}function Cr(e,t,n=[]){let r=q(void 0),i=s("select",{class:"wgd-select wgd-theme-select"});i.append(s("option",{value:""},["(none \u2014 defaults)"]));for(let u of n)i.append(s("option",{value:u.name},[u.label??u.name]));i.addEventListener("change",()=>{let u=n.find(l=>l.name===i.value);e.update(l=>{if(u===void 0){let{theme:p,...m}=l;return m}return{...l,theme:u.tokens}})});let o=s("div",{class:"wgd-token-ref"});function a(u){o.replaceChildren();for(let[l,p]of Object.entries(be)){let m=u?.[l]??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-${l}`]),s("span",{class:"wgd-token-ref-value"},[m])]);o.append(w)}for(let[l,p]of Object.entries(u??{})){if(!l.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-${l}`]),s("span",{class:"wgd-token-ref-value"},[p])]);o.append(m)}}a(e.get().theme),t.push(u=>{if(u.theme===void 0)i.value="";else{let l=n.find(p=>JSON.stringify(p.tokens)===JSON.stringify(u.theme));i.value=l?.name??""}a(u.theme)});let f=[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview theme"]),i]),s("span",{class:"wgd-field-label"},[n.length===0?"No themes supplied by the host \u2014 design themes in the theme designer.":"Themes come from the host; edit them in the theme designer."]),r,s("details",{class:"wgd-token-ref-details"},[s("summary",{class:"wgd-field-label"},["Theme tokens (reference for styles)"]),o])],d=ee("Preview",f);return{element:d,setDiagnostic(u){r.hidden=u===void 0,r.textContent=u??""},dispose:()=>d.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 St(e,t,n,r,i,o,a=6){let f=q(void 0),d=t(i.get()),u=Kt(e,d===void 0?"":JSON.stringify(d,null,2),p=>{if(p.trim()===""){f.hidden=!0,r&&i.update(m=>r(m));return}try{let m=JSON.parse(p);f.hidden=!0,f.textContent="",i.update(w=>n(w,m))}catch(m){f.hidden=!1,f.textContent=`Invalid JSON (draft keeps the last valid value): ${String(le(m))}`}},a),l=we(u,"textarea");return ue(l),o.push(p=>{if(document.activeElement===l)return;let m=t(p);l.value=m===void 0?"":JSON.stringify(m,null,2),me(l)}),s("div",void 0,[u,f])}function $r(e,t,n=[],r=[],i={actions:[],secretNames:[],schemas:[]}){let o=[],a=[];function f(c,h,T){let O=Re(c,h(e.get()),F=>e.update(te=>T(te,F))),I=we(O,"input");return o.push(F=>{document.activeElement!==I&&(I.value=h(F))}),O}let d=q(void 0),u=vt(e.get().descriptor.hints,{key:"hint name",value:"what the hint does",add:"+ hint"},c=>e.update(h=>{if(c===void 0){let{hints:T,...O}=h.descriptor;return{...h,descriptor:O}}return{...h,descriptor:{...h.descriptor,hints:c}}}));o.push(c=>u.setValue(c.descriptor.hints));let l=ee("General",[f("Kind (id)",c=>c.kind,(c,h)=>({...c,kind:h})),d,f("Description",c=>c.descriptor.description??"",(c,h)=>({...c,descriptor:{...c.descriptor,description:h}})),f("Data shape (prose)",c=>c.descriptor.dataShape??"",(c,h)=>({...c,descriptor:{...c.descriptor,dataShape:h}})),s("div",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},["Hints"]),Et([{label:"Tree",element:u.element},{label:"JSON",element:St("",c=>c.descriptor.hints,(c,h)=>{if(!k(h))return c;let T=Object.fromEntries(Object.entries(h).map(([O,I])=>[O,String(I)]));return{...c,descriptor:{...c.descriptor,hints:T}}},c=>{let{hints:h,...T}=c.descriptor;return{...c,descriptor:T}},e,o,3)}])])]),p=ot(e.get().descriptor.dataSchema,c=>e.update(h=>{if(c===void 0){let{dataSchema:T,...O}=h.descriptor;return{...h,descriptor:O}}return{...h,descriptor:{...h.descriptor,dataSchema:c}}}));o.push(c=>p.setValue(c.descriptor.dataSchema));let m=Et([{label:"Builder",element:p.element},{label:"JSON",element:St("dataSchema (JSON-Schema subset: type/properties/required/items/enum/pattern)",c=>c.descriptor.dataSchema,(c,h)=>k(h)?{...c,descriptor:{...c.descriptor,dataSchema:h}}:c,c=>{let{dataSchema:h,...T}=c.descriptor;return{...c,descriptor:T}},e,o)}]),w=s("select",{class:"wgd-select wgd-schema-mode"});w.append(s("option",{value:"inline"},["define inline"]));let g=s("option",{value:"shared"},["use shared"]);r.length===0&&(g.disabled=!0),w.append(g);let y=s("select",{class:"wgd-select wgd-schema-ref"});for(let c of r)y.append(s("option",{value:c.name},[c.label??c.name]));y.addEventListener("change",()=>{e.update(c=>({...c,descriptor:{...c.descriptor,dataSchemaRef:y.value}}))});let v=s("textarea",{class:"wgd-textarea wgd-schema-shared",rows:"10",readonly:"",spellcheck:"false"}),S=q(void 0),x=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 c=e.get().descriptor.dataSchemaRef??r[0]?.name??"";e.update(h=>{let{dataSchema:T,...O}=h.descriptor;return{...h,descriptor:{...O,dataSchemaRef:c}}})}else{let c=je(e.get(),r);e.update(h=>{let{dataSchemaRef:T,...O}=h.descriptor;return{...h,descriptor:{...O,dataSchema:c??{type:"object"}}}})}});function C(c){let h=c.descriptor.dataSchemaRef,T=typeof h=="string";if(w.value=T?"shared":"inline",m.hidden=T,x.hidden=!T,T){y.value!==h&&(y.value=h);let O=r.find(I=>I.name===h)?.schema;v.value=O===void 0?"":JSON.stringify(O,null,2),me(v)}}o.push(C),C(e.get());let $=ee("Data schema",[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Source"]),w]),S,m,x],!1);ue(v);function M(c,h){let T=s("div"),O="",I;function F(te){let G=je(te,r),K=G===void 0?"":JSON.stringify(G);if(I!==void 0&&K===O){I.setValue(c(te));return}O=K;let X=Z=>e.update(ne=>h(ne,Z));I=G!==void 0&&k(G)?qt(G,c(te),X):yr(c(te),X),T.replaceChildren(I.element)}return F(e.get()),o.push(F),T}let U=q(void 0),A=ee("Sample data",[s("span",{class:"wgd-field-label"},["dataExample \u2014 ships with the widget as the example agents imitate"]),Et([{label:"Edit",element:M(c=>c.descriptor.dataExample,(c,h)=>({...c,descriptor:{...c.descriptor,dataExample:h}}))},{label:"JSON",element:St("dataExample (JSON)",c=>c.descriptor.dataExample,(c,h)=>({...c,descriptor:{...c.descriptor,dataExample:h}}),c=>{let{dataExample:h,...T}=c.descriptor;return{...c,descriptor:T}},e,o)}]),U],!1),H=q(void 0),V=ee("Data for preview",[s("span",{class:"wgd-field-label"},["Overrides dataExample in the preview only (not exported)"]),Et([{label:"Edit",element:M(c=>c.sampleData,(c,h)=>({...c,sampleData:h}))},{label:"JSON",element:St("Preview data (JSON)",c=>c.sampleData,(c,h)=>({...c,sampleData:h}),c=>{let{sampleData:h,...T}=c;return T},e,o,4)}]),H],!1),z=s("div"),_=kr(e.get().descriptor.styles,c=>e.update(h=>{if(c===void 0){let{styles:T,...O}=h.descriptor;return{...h,descriptor:O}}return{...h,descriptor:{...h.descriptor,styles:c}}}));o.push(c=>_.setValue(c.descriptor.styles));let Q=ee("Styles (.wg- selectors only)",[Et([{label:"Tree",element:_.element},{label:"JSON",element:St("",c=>c.descriptor.styles,(c,h)=>k(h)?{...c,descriptor:{...c.descriptor,styles:h}}:c,c=>{let{styles:h,...T}=c.descriptor;return{...c,descriptor:T}},e,o)}]),z]),W=Lr(e,o,{actionContext:i}),b=Cr(e,o,n),E=q(void 0),L=Zt(e.get().load,{...i,loadOnly:!0,getDataSchema:()=>je(e.get(),r)},c=>e.update(h=>{if(c===void 0){let{load:T,...O}=h;return O}return{...h,load:c}}));o.push(c=>{L.element.contains(document.activeElement)||L.setValue(c.load)});let j=ee("Load action (http GET, runs once when the widget first renders in an Apps host)",[s("div",{class:"wgd-compact wgd-load"},[L.element]),E],!1),P=wr(e);V.classList.add("wgd-edit-only"),Q.classList.add("wgd-edit-only"),t.left.append(l,$,A,W.element,j,P.element),t.right.append(V,Q,b.element),a.push(W.dispose,b.dispose,P.dispose);function N(c){let h=Qt(c,{schemas:r,actions:i.actions});d.hidden=h.kind===void 0,E.hidden=h.load===void 0,E.textContent=h.load??"",d.textContent=h.kind??"",U.hidden=h.example===void 0,U.textContent=h.example?`dataExample vs dataSchema: ${h.example.code} at ${h.example.path} \u2014 ${h.example.message}`:"",H.hidden=h.sample===void 0,H.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??"",b.setDiagnostic(h.theme?`${h.theme.code}: ${h.theme.message}`:void 0),z.replaceChildren(...h.styles.map(T=>q(`${T.selector}${T.property?` \u2192 ${T.property}`:""}: ${T.message}`)));for(let T of o)T(c);W.refresh(c,h)}let D=e.subscribe(N);return a.push(D),N(e.get()),{dispose(){for(let c of a)c();t.left.replaceChildren(),t.right.replaceChildren()}}}var rn="designer-preview";function on(e={}){hn(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=Se(),a=()=>({tag:"div",children:["\u2026"]});o.register(rn,m=>a(m),{description:"Designer preview delegate.",dataShape:"Defined by the draft being designed."});let f=new Map;for(let m of e.widgets??[]){let w=Oe(m.template);if(!w.ok||typeof m.kind!="string"||m.kind==="")continue;let g=Vt(w.template),y=k(m.descriptor)?m.descriptor:{};try{o.register(m.kind,v=>g(v),{description:`Custom widget '${m.kind}' supplied for preview.`,dataShape:"Defined by the supplied definition.",...y.dataExample!==void 0?{dataExample:y.dataExample}:{}})}catch{continue}k(y.styles)&&f.set(m.kind,_e(y.styles))}let d=o.kinds().filter(m=>m!==rn),u;function l(m,w,g){let y=g===void 0||g===rn;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,u===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=Oe(m.template);if(!S.ok)return;let x=e.actions??[];a=Vt(S.template,{actions:C=>x.find($=>$.name===C)?.definition})}n.textContent=y?m.descriptor.styles?_e(m.descriptor.styles):"":f.get(g)??"",yn(r,m.theme??{});let v={kind:y?rn:g,data:y?m.sampleData??m.descriptor.dataExample??null:p(g)};u===void 0?u=xn(v,r,{catalog:o}):u.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:d,update:l,dispose(){u?.dispose(),u=void 0,i.replaceChildren()}}}function Ke(e){return JSON.parse(JSON.stringify(e))}function Tt(){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 jr(e){let t=Ke(e??Tt()),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=Ke(o(Ke(t))),i()},replace(o){n.length=0,t=Ke(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 Pr(e,t={}){Ce(document);let n=t.initialWidget?Ke({...t.initialWidget}):Tt(),r=t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,i=jr(r),o=new Set,a=on({actions:t.actions??[]}),f=s("div",{class:"wgd-panels"}),d=s("div",{class:"wgd-preview-pane"}),u=s("div",{class:"wgd-side"},[a.pane,d]),l=s("div",{class:"wgd-root"},[f,u]);(t.appearance==="light"||t.appearance==="dark")&&l.setAttribute("data-wgd-theme",t.appearance),Le(l,t.chrome),e.appendChild(l);let p={actions:t.actions??[],secretNames:t.secretNames??[],schemas:t.schemas??[]},m=$r(i,{left:f,right:d},t.themes??[],t.schemas??[],p);function w(v){let S=Qt(v,{schemas:t.schemas??[],actions:t.actions??[]});a.update(v,S);for(let x of[...o])x(v,S)}let g=i.subscribe(w);w(i.get());function y(v){l.classList.toggle("wgd-readonly",v);let S=[...l.querySelectorAll(".wgd-panels .wgd-section-body, .wgd-edit-only > .wgd-section-body")].filter(x=>!x.parentElement?.classList.contains("wgd-view-only"));for(let x of S)v?x.setAttribute("inert",""):x.removeAttribute("inert")}return t.readOnly===!0&&y(!0),{getDraft:()=>Ke(i.get()),setReadOnly:y,loadWidget(v){let S=An(v);return S.length>0?{ok:!1,errors:S}:(Dn(i,v),{ok:!0})},loadTheme(v){let S=Ue(v);return S.ok?(i.update(x=>({...x,theme:S.theme})),{ok:!0}):{ok:!1,errors:[S.error.message]}},subscribe(v){return o.add(v),()=>o.delete(v)},dispose(){g(),m.dispose(),a.dispose(),o.clear(),l.remove()}}}var Wr=/^[a-zA-Z0-9._-]+$/;function to(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function no(e){let t=[];return k(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):Wr.test(e.name)||t.push(`'${e.name}' is not a valid schema name \u2014 use letters, digits, '.', '_' or '-'.`),k(e.schema)||t.push("'schema' must be a plain object."),t):["Schema entry must be an object."]}function _r(e,t={}){Ce(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):to(),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),Le(o,t.chrome),e.appendChild(o);function a(){return JSON.parse(JSON.stringify(n))}function f(){for(let W of[...r])W(a())}let d=[],u=q(void 0);function l(W,b,E){let L=Re(W,b(),E),j=we(L,"input");return d.push(()=>{document.activeElement!==j&&(j.value=b())}),L}let p=ee("Schema",[l("Name (id)",()=>n.name,W=>{n={...n,name:W};let b=W.trim()===""||!Wr.test(W);u.hidden=!b,u.textContent=b?"Name must be non-empty using letters, digits, '.', '_' or '-'.":"",f()}),u,l("Label",()=>n.label??"",W=>{n={...n,label:W},f()}),l("Description",()=>n.description??"",W=>{n={...n,description:W},f()})]),m=ot(n.schema,W=>{n={...n,schema:W??{}},v(),f()}),w=q(void 0),g=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),y=s("div",void 0,[g,w]);g.value=JSON.stringify(n.schema,null,2),g.addEventListener("input",()=>{try{let W=JSON.parse(g.value);if(!k(W))throw new Error("schema must be an object");w.hidden=!0,w.textContent="",n={...n,schema:W},m.setValue(W),f()}catch(W){w.hidden=!1,w.textContent=`Invalid JSON (schema keeps the last valid value): ${String(le(W))}`}});function v(){document.activeElement!==g&&(g.value=JSON.stringify(n.schema,null,2),me(g))}let S=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Builder"]),x=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"),x.classList.remove("wgd-tab-active")}),x.addEventListener("click",()=>{m.element.hidden=!0,y.hidden=!1,x.classList.add("wgd-tab-active"),S.classList.remove("wgd-tab-active"),v()});let C=ee("Definition",[s("div",{class:"wgd-row"},[S,x]),m.element,y]),$=q(void 0),M=s("textarea",{class:"wgd-textarea wgd-schema-import",rows:"6",spellcheck:"false"}),U=s("button",{class:"wgd-button",type:"button"},["Import"]);U.addEventListener("click",()=>{let W;try{W=JSON.parse(M.value)}catch(E){$.hidden=!1,$.textContent=`Invalid JSON: ${le(E)}`;return}let b=_(W);$.hidden=b.ok,$.textContent=b.ok?"":b.errors.join(`
|
|
452
|
-
`)});let
|
|
453
|
-
`)}
|
|
454
|
-
`)});let
|
|
477
|
+
export const ${bs(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)};
|
|
478
|
+
`}function bi(e){let t=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"});function n(c,f){let h=s("button",{class:"wgd-button wgd-add",type:"button"},[c]);return h.addEventListener("click",()=>{t.value=f(),fe(t)}),h}let r=K(void 0),i=vt("Import widget JSON","",()=>{},5),o=he(i,"textarea");ue(o);let d=s("button",{class:"wgd-button",type:"button"},["Import"]);d.addEventListener("click",()=>{let c=ys(o.value,e.get().kind);if(!c.ok){r.hidden=!1,r.textContent=c.errors.join(`
|
|
479
|
+
`);return}r.hidden=!0,r.textContent="",mr(e,c.definition)});let u=Q("Import",[i,r,s("div",{class:"wgd-row"},[d])]),a=Q("Export",[s("div",{class:"wgd-row"},[n("Export widget entry",()=>ws(e.get())),n("Copy as TypeScript",()=>vs(e.get()))]),t]);a.classList.add("wgd-view-only");let l=s("div",{class:"wgd-io"},[u,a]);return ue(t),{element:l,dispose:()=>l.remove()}}var Es=["string","number","boolean","null","object","array"];function hr(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function ks(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 Re(e,t,n,r=!1){if(t.length===0)return n;let[i,...o]=t;if(Array.isArray(e)){let d=[...e];return o.length===0&&r?d.splice(i,1):d[i]=Re(d[i],o,n,r),d}if(typeof e=="object"&&e!==null){let d={...e};return o.length===0&&r?delete d[i]:d[i]=Re(d[i],o,n,r),d}return e}function xs(e,t,n,r){let i=t.reduce((d,u)=>typeof d=="object"&&d!==null?d[u]:void 0,e);if(typeof i!="object"||i===null||Array.isArray(i))return e;let o=Object.entries(i).map(([d,u])=>d===n?[r,u]:[d,u]);return Re(e,t,Object.fromEntries(o))}function vi(e,t){let n=e,r=s("div",{class:"wgd-jsontree"});function i(f){n=f,c(),t(n)}function o(f,h,v){let m=h==="number"?Number.isFinite(Number(v))?Number(v):0:v;n=Re(n,f,m),t(n)}function d(f,h){let v=s("select",{class:"wgd-select wgd-jt-type"});for(let m of Es)v.append(s("option",{value:m},[m]));return v.value=hr(f),v.addEventListener("change",()=>i(Re(n,h,ks(v.value,f)))),v}function u(f,h){let v=hr(f);if(v==="boolean"){let m=s("input",{type:"checkbox"});return m.checked=f,m.addEventListener("change",()=>i(Re(n,h,m.checked))),m}if(v==="null")return s("code",void 0,["null"]);if(v==="string"||v==="number"){let m=s("input",{type:"text",class:"wgd-input"});return m.value=String(f),m.addEventListener("change",()=>o(h,v,m.value)),m}return s("span")}function a(f,h,v,m){let w=s("div",{class:"wgd-jt-row"},[f,d(h,v)]),k=hr(h);if(k!=="object"&&k!=="array"&&w.append(u(h,v)),m){let y=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);y.addEventListener("click",()=>i(Re(n,v,void 0,!0))),w.append(y)}let N=s("div",{class:"wgd-jt-entry"},[w]);return(k==="object"||k==="array")&&N.append(l(h,v)),N}function l(f,h){let v=s("div",{class:"wgd-jt-children"});if(Array.isArray(f)){f.forEach((k,N)=>{v.append(a(s("span",{class:"wgd-jt-key"},[String(N)]),k,[...h,N],!0))});let w=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);w.addEventListener("click",()=>i(Re(n,[...h,f.length],""))),v.append(s("div",{class:"wgd-toolbar"},[w]))}else if(typeof f=="object"&&f!==null){for(let[k,N]of Object.entries(f)){let y=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});y.value=k,y.addEventListener("change",()=>i(xs(n,h,k,y.value))),v.append(a(y,N,[...h,k],!0))}let w=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);w.addEventListener("click",()=>{let k=f,N="key";for(let y=1;N in k;y++)N=`key${y}`;i(Re(n,[...h,N],""))}),v.append(s("div",{class:"wgd-toolbar"},[w]))}return s("details",{class:"wgd-jt-branch",open:""},[s("summary",{class:"wgd-jt-summary"},[Array.isArray(f)?`[ ${f.length} item${f.length===1?"":"s"} ]`:`{ ${Object.keys(f).length} propert${Object.keys(f).length===1?"y":"ies"} }`]),v])}function c(){r.replaceChildren(a(s("span",{class:"wgd-jt-key"},["value"]),n,[],!1))}return c(),{element:r,getValue:()=>n,setValue(f){r.contains(document.activeElement)||(n=f,c())}}}var Ei=["object","array","string","number","integer","boolean","null","any"],ki=new Set(["string","number","integer","any"]);function Et(e,t){let n=e,r=s("div",{class:"wgd-schemabuilder"});function i(a,l=!0){n=a,t(n),l&&u()}function o(a,l,c){let f={...a};return c===void 0?delete f[l]:f[l]=c,f}function d(a,l,c,f=[],h=[]){let v=[],m=s("select",{class:"wgd-select wgd-sb-type"});for(let D of Ei)m.append(s("option",{value:D},[D]));let w=a.type,k=Array.isArray(w)?w.filter(D=>typeof D=="string"):void 0,N=k?.includes("null")??!1,y=typeof w=="string"?w:k?.find(D=>D!=="null")??(N?"null":"any");m.value=Ei.some(D=>D===y)?y:"any",Se(m);let A=s("input",{type:"checkbox",title:"Also allows null"});A.checked=N,A.disabled=m.value==="any"||m.value==="null";function R(D,L){if(D!=="any")return L&&D!=="null"?[D,"null"]:D}A.addEventListener("change",()=>{l(o(a,"type",R(m.value,A.checked)))}),m.addEventListener("change",()=>{let D=o(a,"type",R(m.value,A.checked));m.value!=="object"&&(D=o(o(D,"properties",void 0),"required",void 0)),m.value!=="array"&&(D=o(D,"items",void 0)),m.value!=="string"&&(D=o(D,"pattern",void 0)),ki.has(m.value)||(D=o(D,"enum",void 0)),l(D)}),v.push(s("div",{class:"wgd-sb-row"},[...f,m,s("label",{class:"wgd-sb-req wgd-sb-null",title:"Also allows null"},[A,"null"]),...h]));let W=[];if(m.value==="string"){let D=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:"pattern (regex, optional)"});D.value=typeof a.pattern=="string"?a.pattern:"",D.addEventListener("change",()=>l(o(a,"pattern",D.value===""?void 0:D.value))),W.push(s("span",{class:"wgd-sb-label"},["pattern"]),D)}let U=K(void 0);if(ki.has(m.value)){let D=s("input",{type:"text",class:"wgd-input wgd-sb-constraint",placeholder:'enum ["a","b"] (optional)'});D.value=Array.isArray(a.enum)?JSON.stringify(a.enum):"",D.addEventListener("change",()=>{if(D.value.trim()===""){U.hidden=!0,l(o(a,"enum",void 0));return}try{let L=JSON.parse(D.value);if(!Array.isArray(L))throw new Error("must be a JSON array");U.hidden=!0,l(o(a,"enum",L))}catch(L){U.hidden=!1,U.textContent=`enum ignored: ${le(L)}`}}),W.push(s("span",{class:"wgd-sb-label"},["enum"]),D)}if(W.length>0&&v.push(s("div",{class:"wgd-sb-row wgd-sb-constraints"},W),U),m.value==="object"){let D=x(a.properties)?a.properties:{},L=Array.isArray(a.required)?a.required.filter($=>typeof $=="string"):[],j=s("div",{class:"wgd-jt-children"});for(let[$,V]of Object.entries(D)){let ee=s("input",{type:"text",class:"wgd-input wgd-sb-prop",placeholder:"property name"});ee.value=$,ee.addEventListener("change",()=>{let O=Object.entries(D).map(([P,H])=>P===$?[ee.value,H]:[P,H]),C=L.map(P=>P===$?ee.value:P);l(o(o(a,"properties",Object.fromEntries(O)),"required",C.length>0?C:void 0))});let T=s("input",{type:"checkbox",title:"required"});T.checked=L.includes($),T.addEventListener("change",()=>{let O=T.checked?[...L,$]:L.filter(C=>C!==$);l(o(a,"required",O.length>0?O:void 0))});let b=s("button",{class:"wgd-icon",type:"button",title:"Remove property"},["\u2715"]);b.addEventListener("click",()=>{let{[$]:O,...C}=D;l(o(o(a,"properties",Object.keys(C).length>0?C:void 0),"required",L.filter(P=>P!==$).length>0?L.filter(P=>P!==$):void 0))}),j.append(d(x(V)?V:{},O=>l(o(a,"properties",{...D,[$]:O})),c+1,[ee],[s("label",{class:"wgd-sb-req",title:"required"},[T,"req"]),b]))}let M=s("button",{class:"wgd-button wgd-add",type:"button"},["+ property"]);M.addEventListener("click",()=>{let $="field";for(let V=1;$ in D;V++)$=`field${V}`;l(o(a,"properties",{...D,[$]:{type:"string"}}))}),j.append(s("div",{class:"wgd-toolbar"},[M])),v.push(j)}return m.value==="array"&&v.push(s("div",{class:"wgd-slot"},[d(x(a.items)?a.items:{},D=>l(o(a,"items",D)),c+1,[s("span",{class:"wgd-sb-label"},["items"])])])),s("div",{class:c===0?"wgd-sb-root":"wgd-sb-node"},v)}function u(){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 a=s("button",{class:"wgd-button wgd-add wgd-remove",type:"button"},["remove schema"]);a.addEventListener("click",()=>i(void 0)),r.replaceChildren(d(n,l=>i(l),0),s("div",{class:"wgd-toolbar"},[a]))}return u(),{element:r,getValue:()=>n,setValue(a){r.contains(document.activeElement)||(n=a,u())}}}function zt(e,t,n){let r=e,i=s("div",{class:"wgd-record"});function o(a){r=Object.keys(a).length>0?a:void 0,n(r),u()}function d(a,l,c,f){let h=s("input",{type:"text",class:c,placeholder:l,spellcheck:"false"});return h.value=a,h.addEventListener("change",()=>f(h.value)),h}function u(){let a=r??{},l=Object.entries(a).map(([f,h])=>{let v=d(f,t.key,"wgd-input wgd-rec-key",k=>{let N=Object.entries(a).map(([y,A])=>y===f?[k,A]:[y,A]);o(Object.fromEntries(N))}),m=d(h,t.value,"wgd-input wgd-rec-value",k=>o({...a,[f]:k})),w=s("button",{class:"wgd-icon",type:"button",title:"Remove entry"},["\u2715"]);return w.addEventListener("click",()=>{let{[f]:k,...N}=a;o(N)}),s("div",{class:"wgd-rec-row"},[v,s("span",{class:"wgd-st-colon"},[":"]),m,w])}),c=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},[t.add]);c.addEventListener("click",()=>{let f="";for(let h=1;f in a;h++)f=`key${h}`;o({...a,[f]:""})}),i.replaceChildren(...l,s("div",{class:"wgd-toolbar"},[c]))}return u(),{element:i,getValue:()=>r,setValue(a){i.contains(document.activeElement)||(r=a,u())}}}function xi(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 Vt(e){if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];switch(xi(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]=Vt(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 On(e,t,n){let r=t??Vt(e),i=s("div",{class:"wgd-schemaform"});function o(c,f,h,v=!1){if(f.length===0)return h;let[m,...w]=f;if(Array.isArray(c)){let N=[...c];return w.length===0&&v?N.splice(m,1):N[m]=o(N[m],w,h,v),N}let k=x(c)?{...c}:{};return w.length===0&&v?delete k[m]:k[m]=o(k[m],w,h,v),k}function d(c,f,h=!1){r=o(r,c,f),n(r),h&&l()}function u(c,f,h,v){if(Array.isArray(c.enum)){let m=s("select",{class:"wgd-select"});for(let w of c.enum)m.append(s("option",{value:JSON.stringify(w)},[JSON.stringify(w)]));return m.value=JSON.stringify(f??c.enum[0]),m.addEventListener("change",()=>d(h,JSON.parse(m.value))),a(v,m)}switch(xi(c)){case"boolean":{let m=s("input",{type:"checkbox"});return m.checked=f===!0,m.addEventListener("change",()=>d(h,m.checked)),a(v,m)}case"number":case"integer":{let m=s("input",{type:"number",class:"wgd-input"});return m.value=typeof f=="number"?String(f):"0",m.addEventListener("change",()=>{let w=Number(m.value);d(h,Number.isFinite(w)?w:0)}),a(v,m)}case"object":{let m=s("div",{class:"wgd-jt-children"}),w=x(c.properties)?c.properties:{},k=Array.isArray(c.required)?c.required:[],N=x(f)?f:{};for(let[y,A]of Object.entries(w)){if(!x(A))continue;let R=k.includes(y);m.append(u(A,N[y]??(R?Vt(A):void 0),[...h,y],R?`${y} *`:y))}return s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[v]),m])}case"array":{let m=x(c.items)?c.items:{},w=Array.isArray(f)?f:[],k=s("div",{class:"wgd-jt-children"});w.forEach((y,A)=>{let R=s("div",{class:"wgd-jt-entry"},[u(m,y,[...h,A],`#${A}`)]),W=s("button",{class:"wgd-icon",type:"button",title:"Remove item"},["\u2715"]);W.addEventListener("click",()=>{r=o(r,[...h,A],void 0,!0),n(r),l()}),R.append(W),k.append(R)});let N=s("button",{class:"wgd-button wgd-add",type:"button"},["+ item"]);return N.addEventListener("click",()=>d([...h,w.length],Vt(m),!0)),k.append(s("div",{class:"wgd-toolbar"},[N])),s("fieldset",{class:"wgd-sf-object"},[s("legend",{class:"wgd-field-label"},[v]),k])}default:{let m=s("input",{type:"text",class:"wgd-input"});return typeof c.pattern=="string"&&(m.setAttribute("placeholder",`pattern: ${c.pattern}`),m.setAttribute("title",`Must match ${c.pattern}`)),m.value=typeof f=="string"?f:f===void 0?"":String(f),m.addEventListener("change",()=>d(h,m.value)),a(v,m)}}}function a(c,f){return s("label",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},[c]),f])}function l(){i.replaceChildren(u(e,r,[],"data"))}return l(),{element:i,getValue:()=>r,setValue(c){i.contains(document.activeElement)||(r=c??Vt(e),l())}}}function Si(e,t){let n=e,r=s("div",{class:"wgd-styles"});function i(a){n=Object.keys(a).length>0?a:void 0,t(n),u()}function o(a,l,c,f){let h=s("input",{type:"text",class:c,placeholder:l,spellcheck:"false"});return h.value=a,h.addEventListener("change",()=>f(h.value)),h}function d(a,l,c){let f=o(a,".wg-selector","wgd-input wgd-st-selector",w=>{let k=Object.entries(c).map(([N,y])=>N===a?[w,y]:[N,y]);i(Object.fromEntries(k))}),h=s("button",{class:"wgd-icon",type:"button",title:"Add declaration"},["+"]);h.addEventListener("click",()=>{i({...c,[a]:{...l,"":""}})});let v=s("button",{class:"wgd-icon",type:"button",title:"Remove selector"},["\u2715"]);v.addEventListener("click",()=>{let{[a]:w,...k}=c;i(k)});let m=Object.entries(l).map(([w,k])=>{let N=o(w,"property","wgd-input wgd-st-prop",R=>{let W=Object.entries(l).map(([U,D])=>U===w?[R,D]:[U,D]);i({...c,[a]:Object.fromEntries(W)})}),y=o(k,"value (no url(...), no ;)","wgd-input wgd-st-value",R=>{i({...c,[a]:{...l,[w]:R}})}),A=s("button",{class:"wgd-icon",type:"button",title:"Remove declaration"},["\u2715"]);return A.addEventListener("click",()=>{let{[w]:R,...W}=l;i({...c,[a]:W})}),s("div",{class:"wgd-st-decl"},[N,s("span",{class:"wgd-st-colon"},[":"]),y,A])});return s("div",{class:"wgd-st-rule"},[s("div",{class:"wgd-st-row"},[f,s("span",{class:"wgd-node-icons"},[h,v])]),s("div",{class:"wgd-st-decls"},m)])}function u(){let a=n??{},l=s("button",{class:"wgd-button wgd-add wgd-st-add",type:"button"},["+ selector"]);l.addEventListener("click",()=>{let c=".wg-";for(let f=1;c in a;f++)c=`.wg-${f}`;i({...a,[c]:{}})}),r.replaceChildren(...Object.entries(a).map(([c,f])=>d(c,x(f)?f:{},a)),s("div",{class:"wgd-toolbar"},[l]))}return u(),{element:r,getValue:()=>n,setValue(a){r.contains(document.activeElement)||(n=a,u())}}}function Nn(e,t){let n=Si(e,l=>{d(l),t(l)}),r=K(void 0),i=vt("",e===void 0?"":JSON.stringify(e,null,2),l=>{if(l.trim()===""){r.hidden=!0,n.setValue(void 0),t(void 0);return}try{let c=JSON.parse(l);if(r.hidden=!0,r.textContent="",!ze(c)){r.hidden=!1,r.textContent="Styles must map selectors to objects of property/value strings (the last valid value is kept).";return}let f=Object.keys(c).length>0?c:void 0;n.setValue(f),t(f)}catch(c){r.hidden=!1,r.textContent=`Invalid JSON (the last valid value is kept): ${le(c)}`}}),o=he(i,"textarea");ue(o);function d(l){document.activeElement!==o&&(o.value=l===void 0?"":JSON.stringify(l,null,2),fe(o),r.hidden=!0,r.textContent="")}let u=s("div");return{element:Q("Styles (.wg- selectors only)",[nt([{label:"Tree",element:n.element},{label:"JSON",element:s("div",void 0,[i,r])}]),u]),setValue(l){n.setValue(l),d(l)},setIssues(l){u.replaceChildren(...l.map(c=>K(`${c.selector}${c.property?` \u2192 ${c.property}`:""}: ${c.message}`)))}}}var Ti=3;function me(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 Rn(e,t,n,r=0){if(!(!x(e)||r>Ti)&&!(me(e)!=="object"||!x(e.properties)))for(let[i,o]of Object.entries(e.properties)){let d=t===""?i:`${t}.${i}`;n.push({path:d,schema:o}),Rn(o,d,n,r+1)}}function He(e){return x(e)&&me(e)==="array"?e.items:e}function rt(e,t){if(t===""||t===".")return e;let n=e;for(let r of t.split(".")){if(!x(n))return;if(me(n)==="array"){if(!/^\d+$/.test(r))return;n=He(n);continue}if(!x(n.properties))return;n=n.properties[r]}return n}function Ss(e,t){if(e===void 0||t===void 0)return!1;let n=r=>r==="integer"?"number":r;return n(e)!==n(t)}function Ai(e,t){let n=e,r=t;for(let d=0;d<Ti&&!(me(n)!=="array"||me(r)!=="array");d++)n=He(n),r=He(r);let i=me(n),o=me(r);return Ss(i,o)?{source:i,target:o}:void 0}function kt(e){let t=[];return Rn(e,"",t),t.map(n=>n.path)}var Di="__custom__";function Oi(){return{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}function Ri(){return{kind:"http",method:"GET",url:"https://api.example.com/resource",input:{type:"object",properties:{}},output:{type:"object"}}}function Ln(e){return"ref"in e&&typeof e.ref=="string"}function Le(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 we(e){return s("span",{class:"wgd-field-label"},[e])}function Jt(e){let t=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return t.addEventListener("click",e),t}function _n(e,t,n,r,i="wgd-input wgd-rec-value"){if(t.length===0)return Le(e,i,n,r);let o=s("select",{class:"wgd-select wgd-path"}),d=t.includes(e),u=d||e===""?t:[e,...t];o.append(s("option",{value:""},[r]));for(let l of u)o.append(s("option",{value:l},[l===e&&!d?`${l} (off-schema)`:l]));o.append(s("option",{value:Di},["custom\u2026"])),o.value=e,Se(o);let a=Le(e,i,n,r);return a.hidden=!0,o.addEventListener("change",()=>{if(o.value===Di){a.hidden=!1,a.focus();return}a.hidden=!0,n(o.value)}),s("span",{class:"wgd-pathwrap"},[o,a])}function Ni(e,t,n,r){let i=de(e??{}),o=[],d=s("div",{class:"wgd-record wgd-headers"}),u=K(void 0);function a(h){i=h,r(Object.keys(i).length>0?i:void 0),f()}function l(h){u.hidden=!1,u.textContent=`'${h}' is already used; pick another ${n.name} name.`}function c(h,v){let m=x(h),w=ge([{value:"literal"},{value:"secret"}],m?"secret":"literal","wgd-select wgd-attr-mode",k=>v(k==="secret"?{secret:t[0]??""}:""));if(m){let k=t.includes(h.secret)?t:[h.secret,...t],N=ge(k.map(y=>({value:y,label:y===""?"(pick a secret)":y})),h.secret,"wgd-select wgd-secret",y=>v({secret:y}));return[w,N]}return[w,Le(h,"wgd-input wgd-rec-value",v,"value")]}function f(){d.replaceChildren(),u.hidden=!0;for(let[v,m]of Object.entries(i)){let w=Le(v,"wgd-input wgd-rec-key",y=>{if(y===v)return;if(y===""||Object.hasOwn(i,y)){l(y||"(empty)");return}let A=Object.entries(i).map(([R,W])=>R===v?[y,W]:[R,W]);a(Object.fromEntries(A))},n.name),k=c(m,y=>a({...i,[v]:y})),N=Jt(()=>{let{[v]:y,...A}=i;a(A)});d.append(s("div",{class:"wgd-rec-row"},[w,...k,N]))}o.forEach((v,m)=>{let w=Le("","wgd-input wgd-rec-key",y=>{if(y!==""){if(Object.hasOwn(i,y)){l(y);return}o.splice(m,1),a({...i,[y]:v.value})}},n.name),k=c(v.value,y=>{v.value=y,f()}),N=Jt(()=>{o.splice(m,1),f()});d.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[w,...k,N]))});let h=s("button",{class:"wgd-button wgd-add",type:"button"},[n.add]);h.addEventListener("click",()=>{o.push({value:""}),f()}),d.append(s("div",{class:"wgd-row"},[h]),u)}return f(),d}function Ts(e,t){let n=de(e),r=s("div",{class:"wgd-record wgd-segments"});function i(d){n=d,t(n),o()}function o(){r.replaceChildren(),n.forEach((a,l)=>{let c=typeof a!="string",f=ge([{value:"text"},{value:"bind"}],c?"bind":"text","wgd-select wgd-attr-mode",m=>{let w=[...n];w[l]=m==="bind"?{bind:"."}:"",i(w)}),h=Le(c?a.bind:a,"wgd-input wgd-rec-value",m=>{let w=[...n];w[l]=c?{bind:m}:m,i(w)},c?"data path":"text"),v=Jt(()=>i(n.filter((m,w)=>w!==l)));r.append(s("div",{class:"wgd-rec-row"},[f,h,v]))});let d=s("button",{class:"wgd-button wgd-add",type:"button"},["+ text"]);d.addEventListener("click",()=>i([...n,""]));let u=s("button",{class:"wgd-button wgd-add",type:"button"},["+ bind"]);u.addEventListener("click",()=>i([...n,{bind:"."}])),r.append(s("div",{class:"wgd-row"},[d,u]))}return o(),r}function wr(e,t,n){let r=de(e??Oi()),i=s("div",{class:"wgd-action-head"}),o=s("div",{class:"wgd-action-schemas"}),d=s("div",{class:"wgd-action-maps"}),u=s("div",{class:"wgd-action-definition"},[i,o,d]);function a(){return r}function l(w,k){r=w,n(de(r)),k==="all"?m():k==="schemas"&&h()}function c(w,k){let N=Et(a()[k],R=>{l({...a(),[k]:R??{type:"object"}},"none")}),y=[we(w),N.element],A=t.schemas??[];if(A.length>0){let R=ge([{value:"",label:"copy a shared schema into this action\u2026"},...A.map(W=>({value:W.name}))],"","wgd-select",W=>{let U=A.find(D=>D.name===W);U&&l({...a(),[k]:de(U.schema)},"schemas")});y.push(s("div",{class:"wgd-row"},[R,we("(a copy \u2014 later edits to the shared schema do not follow)")]))}return s("div",{class:"wgd-action-schema"},y)}function f(){i.replaceChildren();let w=ge([{value:"prompt",label:"prompt \u2014 propose a message"},{value:"http",label:"http \u2014 call an API"}],r.kind,"wgd-select wgd-action-kind",y=>l(y==="http"?Ri():Oi(),"all"));if(r.kind==="prompt"){i.append(s("div",{class:"wgd-row"},[we("Kind"),w]),we("Message (literals and bound values; the user reviews and sends it)"),Ts(r.text,y=>l({kind:"prompt",text:y},"none")));return}let k=ge(Pt.map(y=>({value:y})),r.method,"wgd-select",y=>l({...a(),method:y},"none")),N=Le(r.url,"wgd-input wgd-action-url",y=>l({...a(),url:y},"none"),"https://\u2026");i.append(s("div",{class:"wgd-row"},[we("Kind"),w,we("Method"),k]),s("label",{class:"wgd-field"},[we("URL (https, fixed)"),N]))}function h(){o.replaceChildren(),r.kind==="http"&&o.append(c("Input schema (arguments; GET \u2192 query, POST \u2192 JSON body)","input"),c("Output schema (the response must satisfy it)","output"))}function v(){if(d.replaceChildren(),r.kind!=="http")return;let w=t.secretNames??[];d.append(we("Headers"),Ni(r.headers,w,{add:"+ header",name:"header"},k=>{let{headers:N,...y}=a();l(k===void 0?y:{...y,headers:k},"none")}),we("Fixed query parameters"),Ni(r.query,w,{add:"+ parameter",name:"parameter"},k=>{let{query:N,...y}=a();l(k===void 0?y:{...y,query:k},"none")}))}function m(){f(),h(),v()}return m(),{element:u,getValue:()=>de(r),setValue(w){r=de(w),m()}}}function Cn(e,t,n){let r=e===void 0?void 0:de(e),i=s("div",{class:"wgd-binding-head"}),o=s("div",{class:"wgd-binding-input"}),d=s("div",{class:"wgd-binding-output"}),u=s("div",{class:"wgd-binding"},[i,o,d]);function a(A){if(A!==void 0)return Ln(A)?(t.actions??[]).find(R=>R.name===A.ref)?.definition:A.definition}let l=()=>de(r?.input??{}),c=()=>de(r?.output??{});function f(A,R){r=A,n(A===void 0?void 0:de(A)),R==="all"?y():R==="io"?(w(),k()):R==="input"?w():R==="output"&&k()}function h(A,R,W){return{...Ln(A)?{ref:A.ref}:{definition:A.definition},...R!==void 0&&Object.keys(R).length>0?{input:R}:{},...W!==void 0&&Object.keys(W).length>0?{output:W}:{}}}function v(){return["$index","$parent","$root",...kt(t.getDataSchema?.()).map(R=>`$root.${R}`)]}function m(){i.replaceChildren();let A=(t.actions??[]).filter(D=>!t.loadOnly||D.definition.kind==="http"&&D.definition.method==="GET"),R=r===void 0?"none":Ln(r)?"shared":"inline",W=ge([{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",D=>{f(D==="none"?void 0:D==="shared"?{ref:A[0]?.name??""}:{definition:Ri()},"all")});if(i.append(s("div",{class:"wgd-row"},[W])),r===void 0)return;if(Ln(r)){let D=r.ref,L=A.map($=>$.name),j=(L.includes(D)?L:[D,...L]).map($=>({value:$,label:$===""?"(pick an action)":L.includes($)?$:`${$} (unknown)`})),M=ge(j,D,"wgd-select wgd-binding-ref",$=>f(h({ref:$},l(),c()),"io"));i.append(s("div",{class:"wgd-row"},[we("Action"),M]));return}let U=wr(r.definition,t,D=>{f(h({definition:D},l(),c()),"io")});i.append(U.element)}function w(){o.replaceChildren();let A=a(r);if(r===void 0||A?.kind!=="http")return;let R=r,W=x(A.input.properties)?Object.keys(A.input.properties):[],U=t.scopePaths??kt(t.getDataSchema?.()),D=[...new Set([...U,...v()])],L=l(),j=W.map(M=>{let $=L[M],V=x($)&&"const"in $,ee=ge([{value:"path"},{value:"const"}],V?"const":"path","wgd-select wgd-attr-mode",O=>{f(h(R,{...l(),[M]:O==="const"?{const:""}:M},c()),"input")}),T=O=>{let C=l();if(V){let P;try{P=JSON.parse(O)}catch{P=O}C[M]={const:P}}else O===""?delete C[M]:C[M]=O;f(h(R,C,c()),"none")},b=V?Le(JSON.stringify($.const),"wgd-input wgd-rec-value",T,"JSON literal"):_n(typeof $=="string"?$:"",D,T,"data path");return s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-rec-key wgd-binding-field"},[M]),ee,b])});o.append(we("Input mapping (field \u2190 data path or constant)"),W.length>0?s("div",{class:"wgd-record"},j):s("div",{class:"wgd-diagnostic"},["The input schema declares no properties."]))}function k(){d.replaceChildren();let A=a(r);if(r===void 0||A?.kind!=="http")return;let R=r,W=c(),U=W.mode??"merge",D=ge(It.map(j=>({value:j})),U,"wgd-select",j=>{let M={...c(),mode:j};j!=="patch"&&delete M.path,f(h(R,l(),M),"output")}),L=[we("Output"),D];U==="patch"&&L.push(Le(W.path??"","wgd-input",j=>{f(h(R,l(),{...c(),path:j}),"output")},"data path to write at")),d.append(s("div",{class:"wgd-row"},L)),d.append(N(A,W,j=>{let M=c();j===void 0?delete M.map:M.map=j,f(h(R,l(),M),"none")}))}function N(A,R,W){let U=s("div",{class:"wgd-record wgd-output-map"}),D=de(R.map??{}),L=[],j=t.getDataSchema?.(),M=R.mode??"merge",$=M==="patch"&&R.path?R.path:"",V=$===""?j:rt(j,$),ee=He(V),T=[".",...kt(ee)],b=()=>D["."]===void 0?A.output:rt(A.output,D["."]),O=()=>me(b())==="array",C=()=>He(b()),P=[".",...kt(A.output)],H=K(void 0);H.classList.add("wgd-type-mismatch");function B(S){D=S,W(Object.keys(D).length>0?D:void 0),E()}function g(S){H.hidden=!1,H.textContent=S}function p(S,I){let F=_n(S,T,I,"target data path","wgd-input wgd-rec-key");return F.classList.add("wgd-map-target"),F}function E(){U.replaceChildren();let S=[],I=Object.keys(D).filter(J=>J!==".");O()&&M==="merge"&&I.length>0&&S.push("a list projects per item \u2014 use replace or patch; merge needs an object.");let F=[".",...kt(C())];for(let[J,z]of Object.entries(D)){let te=J==="."?P:F,q=J==="."?void 0:Ai(rt(C(),z),rt(ee,J));q&&S.push(`'${z}' is ${q.source} in the response but '${$?`${$}.`:""}${J}' is ${q.target} in the widget schema`);let ne=p(J,ce=>{if(ce===J)return;if(ce===""||Object.hasOwn(D,ce)){g(`'${ce||"(empty)"}' is already a projection target.`);return}let xt=Object.entries(D).map(([be,St])=>be===J?[ce,St]:[be,St]);B(Object.fromEntries(xt))}),se=_n(z,te,ce=>B({...D,[J]:ce}),"response path");se.classList.add("wgd-map-source");let De=Jt(()=>{let{[J]:ce,...xt}=D;B(xt)});U.append(s("div",{class:"wgd-rec-row"},[ne,s("span",{class:"wgd-st-colon"},["\u2190"]),se,De]))}L.forEach((J,z)=>{let te=p("",se=>{if(se!==""){if(Object.hasOwn(D,se)){g(`'${se}' is already a projection target.`);return}L.splice(z,1),B({...D,[se]:J.source})}}),q=_n(J.source,F,se=>{J.source=se,E()},"response path");q.classList.add("wgd-map-source");let ne=Jt(()=>{L.splice(z,1),E()});U.append(s("div",{class:"wgd-rec-row wgd-rec-pending"},[te,s("span",{class:"wgd-st-colon"},["\u2190"]),q,ne]))});let Y=s("button",{class:"wgd-button wgd-add",type:"button"},["+ projection"]);Y.addEventListener("click",()=>{L.push({source:""}),E()}),H.hidden=S.length===0,H.textContent=S.length===0?"":`Type mismatch: ${S.join("; ")}.`,U.append(s("div",{class:"wgd-row"},[Y]),H)}return E(),U}function y(){m(),w(),k()}return y(),{element:u,setValue(A){r=A===void 0?void 0:de(A),y()}}}var Li=e=>x(e)&&qn.some(t=>t===e.type)?"listBind":"bind";function yr(e,t){if(me(e)==="array")return["."];let n=[];Rn(e,"",n);let r=new Set(["string","number","integer","boolean","null",void 0]),o=n.filter(({schema:d})=>{let u=me(d);return t==="each"?u==="array":t==="bind"?r.has(u):t==="listBind"?r.has(u)||u==="array":!0}).map(d=>d.path);return t!=="each"&&r.has(me(e))&&o.unshift("."),o}function _i(e,t){let n=rt(e,t);return me(n)==="array"?He(n):void 0}var In=Symbol("remove");function br(e){let t="";for(let n of e){let r=typeof n=="number"?`children.${n}`:n;t=t===""?r:`${t}.${r}`}return t}function Pn(e,t,n){if(t.length===0)return n===In?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===In?o.splice(r,1):o[r]=Pn(o[r],i,n),{...e,children:o}}if(!x(e))return e;if(i.length===0&&n===In){let{[r]:o,...d}=e;return d}return{...e,[r]:Pn(e[r],i,n)}}function Ci(e,t,n,r){let i=t.length===0?e:As(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[d,u]=[o[n],o[r]];o[n]=u,o[r]=d;let a={...i,children:o};return t.length===0?a:Pn(e,t,a)}function As(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 $n={text:()=>"text",bind:()=>({bind:"."}),element:()=>({tag:"div",children:[]}),each:()=>({each:".",template:"item"}),when:()=>({when:".",template:"shown"})};function $i(e,t,n={}){let r=n.actionContext??{actions:[],secretNames:[],schemas:[]},i=new Set,o=s("div",{class:"wgd-tree"}),d=K(void 0),u=s("textarea",{class:"wgd-textarea wgd-template-json",rows:"14",spellcheck:"false"}),a=s("div",void 0,[u,d]);ue(u),a.hidden=!0;let l=s("button",{class:"wgd-button",type:"button"},["Tree"]),c=s("button",{class:"wgd-button",type:"button"},["JSON"]);l.addEventListener("click",()=>{o.hidden=!1,a.hidden=!0}),c.addEventListener("click",()=>{o.hidden=!0,a.hidden=!1});let f=K(void 0),h=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,c]),f,o,a])]);function v(T){e.update(b=>({...b,template:T}))}function m(T,b){v(Pn(e.get().template,T,b))}u.addEventListener("input",()=>{try{let T=JSON.parse(u.value);d.hidden=!0,d.textContent="",v(T)}catch(T){d.hidden=!1,d.textContent=`Invalid JSON (template keeps the last valid value): ${String(le(T))}`}});function w(T,b,O="wgd-input wgd-node-value"){let C=s("input",{type:"text",class:O});return C.value=T,C.addEventListener("change",()=>b(C.value)),C}function k(T,b){let O=T!==void 0&&ft(T.type)?T:void 0,C=ge([{value:"none",label:"raw"},...ut.map(g=>({value:g}))],O===void 0?"none":O.type,"wgd-select wgd-format-type",g=>{b(g==="number"?{type:"number",decimals:2}:g==="currency"?{type:"currency",currency:"USD",decimals:2}:g==="date"?{type:"date",pattern:"yyyy-MM-dd"}:g==="count"?{type:"count"}:g==="join"?{type:"join",separator:_t}:g==="truncate"?{type:"truncate",length:80}:g==="pluralize"?{type:"pluralize",forms:{one:`${mt} item`,other:`${mt} items`}}:void 0)},"Present the bound value: a number, a currency amount or a date; a list's count or its items joined; text truncated; or a plural form");if(O===void 0)return[C];let P=(g,p,E,S)=>{let I=O[g],F=w(typeof I=="string"||typeof I=="number"?String(I):"",Y=>{let{[g]:J,...z}=O;b(Y===""?z:{...z,[g]:Y})},`wgd-input ${S}`);return F.placeholder=p,F.title=E,F};if(O.type==="count")return[C];if(O.type==="join")return[C,P("separator","sep",`Between items (at most ${$e} characters; default "${_t}")`,"wgd-format-separator"),P("last","last",`Before the last item, e.g. " and " (at most ${$e} characters)`,"wgd-format-last"),P("field","field","Each item's field to join, e.g. name (leave empty for the items themselves)","wgd-format-field")];if(O.type==="truncate"){let g=w(typeof O.length=="number"?String(O.length):"",p=>{let E=Number(p);b({...O,length:p!==""&&Number.isFinite(E)?E:p})},"wgd-input wgd-format-length");return g.placeholder="len",g.title=`Characters kept (${Ge}-${Ye})`,[C,g,P("ellipsis",dn,`Appended when cut (at most ${Xe} characters)`,"wgd-format-ellipsis")]}if(O.type==="pluralize"){let g=x(O.forms)?O.forms:{},p=E=>{let S=g[E],I=w(typeof S=="string"?S:"",F=>{let{[E]:Y,...J}=g,z=F===""&&E!=="other"?J:{...J,[E]:F};b({...O,forms:z})},`wgd-input wgd-format-form wgd-format-form-${E}`);return I.placeholder=E,I.title=`The ${E} form; ${mt} becomes the number`,I};return[C,p("zero"),p("one"),p("other")]}let H=()=>{let g=w(O.decimals===void 0?"":String(O.decimals),p=>{let{decimals:E,...S}=O,I=Number(p);b(p===""?S:{...S,decimals:Number.isFinite(I)?I:p})},"wgd-input wgd-format-decimals");return g.placeholder="dec",g.title=`Decimal places (${Je}-${Ke})`,g};if(O.type==="currency"){let g=w(typeof O.currency=="string"?O.currency:"",E=>b({...O,currency:E.toUpperCase()}),"wgd-input wgd-format-currency");g.placeholder="CUR",g.title="ISO-4217 currency code, e.g. COP";let p=ge(qe.map(E=>({value:E})),pt(O.currencyDisplay)?O.currencyDisplay:qe[0],"wgd-select wgd-format-display",E=>b({...O,currencyDisplay:E}),"How the currency names itself");return[C,g,H(),p]}if(O.type==="number")return[C,H()];let B=w(typeof O.pattern=="string"?O.pattern:"",g=>b({...O,pattern:g}),"wgd-input wgd-format-pattern");return B.placeholder="pattern",B.title=`Date pattern from ${gt.join(" ")} plus separators, e.g. dd-MM-yyyy HH:mm`,[C,B]}let N=new Set;function y(T,b,O,C,P,H,B,g){let p=br(b),E=C.length>0,S=E&&N.has(p),I;E?(I=s("button",{class:"wgd-chevron",type:"button",title:S?"Expand":"Collapse"},[S?"\u25B8":"\u25BE"]),I.addEventListener("click",()=>{S?N.delete(p):N.add(p),V()})):I=s("span",{class:"wgd-chevron wgd-chevron-none"});let F=T===void 0?[I,...O]:[I,s("span",{class:"wgd-node-badge"},[T]),...O];S&&g?.summary!==void 0&&F.push(s("span",{class:"wgd-node-summary"},[g.summary]));let Y=[...g?.icons??[]];if(B&&B.count>1){if(B.index>0){let z=s("button",{class:"wgd-icon",type:"button",title:"Move up"},["\u2191"]);z.addEventListener("click",()=>v(Ci(e.get().template,B.parent,B.index,B.index-1))),Y.push(z)}if(B.index<B.count-1){let z=s("button",{class:"wgd-icon",type:"button",title:"Move down"},["\u2193"]);z.addEventListener("click",()=>v(Ci(e.get().template,B.parent,B.index,B.index+1))),Y.push(z)}}if(H){let z=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);z.addEventListener("click",()=>b.length===0?v(""):m(b,In)),Y.push(z)}Y.length>0&&F.push(s("span",{class:"wgd-node-icons"},Y));let J=[s("div",{class:"wgd-node-row"},F)];return P!==void 0&&J.push(K(P)),S||J.push(...C),s("div",{class:"wgd-node","data-path":p},J)}let A=["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 R(T,b,O,C,P="wgd-input wgd-node-value"){let H=x(b)?yr(b,O):[];if(H.length===0)return w(T,C,P);let B=s("select",{class:"wgd-select wgd-path"}),g=H.includes(T);for(let S of g?H:[T,...H])B.append(s("option",{value:S},[S===T&&!g?`${S} (off-schema)`:S]));B.append(s("option",{value:"__custom__"},["custom\u2026"])),B.value=T,Se(B);let p=w(T,C,P);p.hidden=!0,B.addEventListener("change",()=>{if(B.value==="__custom__"){p.hidden=!1,p.focus();return}p.hidden=!0,C(B.value)});let E=P.includes("wgd-attr-value")?" wgd-attr-value":"";return s("span",{class:`wgd-pathwrap${E}`},[B,p])}function W(T,b,O){let C=T??"",P=S=>O(S===""?void 0:S),H="Optional item key (e.g. id): a reordered list keeps each item's state",B=x(b)?yr(b,"bind"):[];if(B.length===0){let S=w(C,P,"wgd-input wgd-each-key");return S.placeholder="key path",S.title=H,S}let g=s("select",{class:"wgd-select wgd-each-key",title:H}),p=C===""||B.includes(C);g.append(s("option",{value:""},["no key"]));for(let S of p?B:[C,...B])g.append(s("option",{value:S},[S===C&&!p?`${S} (off-schema)`:S]));g.append(s("option",{value:"__custom__"},["custom\u2026"])),g.value=C,Se(g);let E=w(C,P,"wgd-input wgd-each-key");return E.hidden=!0,g.addEventListener("change",()=>{if(g.value==="__custom__"){E.hidden=!1,E.focus();return}E.hidden=!0,P(g.value)}),s("span",{class:"wgd-pathwrap"},[g,E])}function U(T,b){let O=s("select",{class:"wgd-select wgd-tag"}),C=A.includes(T)?A:[T,...A];for(let H of C)O.append(s("option",{value:H},[H]));O.append(s("option",{value:"__custom__"},["custom\u2026"])),O.value=T,Se(O);let P=w(T,b,"wgd-input wgd-tag-custom");return P.hidden=!0,O.addEventListener("change",()=>{if(O.value==="__custom__"){P.hidden=!1,P.focus();return}P.hidden=!0,b(O.value)}),s("span",{class:"wgd-tagwrap"},[O,P])}function D(T,b,O,C,P,H,B){let g=[...b,O];if(C===void 0){let p=fr(`+ ${T}`,`Set '${T}' to a node`,Object.keys($n),E=>{let S=$n[E];S&&m(g,S())});return P?s("div",{class:"wgd-slot"},[K(`Missing required '${T}'.`),p]):s("div",{class:"wgd-slot wgd-slot-unset"},[p])}return s("div",{class:"wgd-slot"},[s("span",{class:"wgd-slot-label"},[T]),L(C,g,H,!P,void 0,B)])}function L(T,b,O,C=!0,P,H){let B=br(b),g=O!==void 0&&(O===B||(O.startsWith(B===""?"attrs.":`${B}.attrs.`)||O.startsWith(B===""?"action":`${B}.action`))&&x(T)&&typeof T.tag=="string")?j:void 0;if(typeof T=="string")return y("text",b,[w(T,p=>m(b,p))],[],g,C,P);if(!x(T))return y("invalid",b,[s("code",void 0,[JSON.stringify(T)])],[],g??"Not a template node.",C,P);if(typeof T.bind=="string"){let p=T.bind,E=T.markdown===!0,S=E?"markdown":Ht(T),I=x(T.format)?T.format:void 0,F=x(T.map)?T.map:void 0,Y=q=>({bind:p,...q}),J=[R(p,H,Li(I),q=>m(b,{...T,bind:q}))];if((S===void 0||S==="format")&&J.push(...k(I,q=>m(b,q===void 0?{bind:p}:Y({format:q})))),E){let q=s("button",{class:"wgd-md-toggle",type:"button","aria-pressed":"true",title:"Rendered as Markdown \u2014 click for plain text"},["markdown"]);q.addEventListener("click",()=>m(b,{bind:p})),J.push(q)}let z=[];if(S===void 0){let q=s("button",{class:"wgd-icon",type:"button",title:"Render the value as Markdown (paragraphs, lists, emphasis, code, links)"},["md"]);q.addEventListener("click",()=>m(b,Y({markdown:!0}))),z.push(q);let ne=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored labels (e.g. status \u2192 text)"},["map"]);ne.addEventListener("click",()=>m(b,Y({map:{}}))),z.push(ne)}let te=[];if(S==="map"){let q=zt(F,{key:"data value",value:"authored label",add:"+ mapping"},se=>m(b,se===void 0?{bind:p}:Y({map:se,...typeof T.default=="string"?{default:T.default}:{}}))),ne=w(typeof T.default=="string"?T.default:"",se=>m(b,Y({map:F??{},...se===""?{}:{default:se}})),"wgd-input wgd-attr-map-default");ne.placeholder="default (on miss)",te.push(s("div",{class:"wgd-attr-map"},[q.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),ne])]))}return y("bind",b,J,te,g,C,P,z.length>0?{icons:z}:void 0)}if(typeof T.each=="string"){let p=T.each,{each:E,key:S,...I}=T;return y("each",b,[R(p,H,"each",F=>m(b,{...T,each:F})),s("span",{class:"wgd-st-colon"},["key"]),W(typeof T.key=="string"?T.key:void 0,_i(H,p),F=>m(b,{each:p,...F===void 0?{}:{key:F},...I}))],[D("template",b,"template",T.template,!0,O,_i(H,T.each)),D("empty",b,"empty",T.empty,!1,O,H)],g,C,P,{summary:T.empty!==void 0?"template \xB7 empty":"template"})}if(typeof T.when=="string")return y("when",b,[R(T.when,H,"when",p=>m(b,{...T,when:p}))],[D("template",b,"template",T.template,!0,O,H),D("else",b,"else",T.else,!1,O,H)],g,C,P,{summary:T.else!==void 0?"template \xB7 else":"template"});if(typeof T.tag=="string"){let p=x(T.attrs)?T.attrs:{},E=x(T.action)?T.action:void 0,S=Object.entries(p).map(([z,te])=>{let q=x(te)&&typeof te.bind=="string"?te:{bind:""},ne=x(te)&&typeof te.bind=="string",se=ne?q:void 0,De=Z=>{let pe={bind:Z.bind};return Z.map!==void 0?(pe.map=Z.map,Z.default!==void 0&&Z.default!==""&&(pe.default=Z.default)):Z.prefix!==void 0&&Z.prefix!==""?pe.prefix=Z.prefix:Z.format!==void 0&&(pe.format=Z.format),pe},ce=Z=>{m(b,{...T,attrs:{...p,[z]:Z}})},xt=w(z,Z=>{let pe=Object.entries(p).map(([Fe,Ar])=>Fe===z?[Z,Ar]:[Fe,Ar]);m(b,{...T,attrs:Object.fromEntries(pe)})},"wgd-input wgd-attr-name"),be=s("select",{class:"wgd-select wgd-attr-mode"});be.append(s("option",{value:"literal"},["literal"])),be.append(s("option",{value:"bind"},["bind"])),be.value=ne?"bind":"literal",Se(be);let St=w(String(ne?"":te),Z=>ce(Z),"wgd-input wgd-attr-value"),Zi=ne?R(q.bind,H,Li(q.format),Z=>ce(De({...q,bind:Z})),"wgd-input wgd-attr-value"):St;be.addEventListener("change",()=>{let Z=ne?q.bind:St.value;ce(be.value==="bind"?{bind:Z||"."}:Z)});let Fn=s("button",{class:"wgd-icon",type:"button",title:"Remove attribute"},["\u2715"]);Fn.addEventListener("click",()=>{let{[z]:Z,...pe}=p;m(b,{...T,attrs:pe})});let Tt=[xt,be,Zi],ot=se===void 0?void 0:Ht(se),Qi=x(se?.format)?se.format:void 0,eo=ne&&(ot===void 0||ot==="format"),to=ne&&(ot===void 0||ot==="prefix"),no=ne&&ot===void 0;if(eo&&Tt.push(...k(Qi,Z=>ce(De({...q,format:Z})))),to){let Z=w(se?.prefix??"",pe=>ce(De({...q,prefix:pe})),"wgd-input wgd-attr-prefix");Z.placeholder="prefix",Z.title="Literal prefix, e.g. mailto: \u2014 emitted only when the bound value is non-empty",Tt.push(Z)}if(no){let Z=s("button",{class:"wgd-icon",type:"button",title:"Map values to authored literals (e.g. status \u2192 class)"},["map"]);Z.addEventListener("click",()=>ce(De({...q,map:{}}))),Tt.push(s("span",{class:"wgd-node-icons"},[Z,Fn]))}else Tt.push(Fn);let Tr=s("div",{class:"wgd-attr-row"},Tt),Un=[Tr];if(ne&&ot==="map"){let Z=zt(q.map,{key:"data value",value:"authored literal",add:"+ mapping"},Fe=>{ce(Fe===void 0?{bind:q.bind}:De({...q,map:Fe}))}),pe=w(q.default??"",Fe=>ce(De({...q,default:Fe})),"wgd-input wgd-attr-map-default");pe.placeholder="default (on miss)",Un.push(s("div",{class:"wgd-attr-map"},[Z.element,s("div",{class:"wgd-rec-row"},[s("span",{class:"wgd-st-colon"},["\u21B3"]),pe])]))}return Un.length===1?Tr:s("div",{class:"wgd-attr"},Un)}),I=Array.isArray(T.children)?T.children:[],F=fr("+","Add attribute or child node",["attribute",...E===void 0&&(T.tag==="button"||T.tag==="a")?["action"]:[],...Object.keys($n)],z=>{N.delete(br(b));let te=$n[z];if(z==="attribute")m(b,{...T,attrs:{...p,"":""}});else if(z==="action"){let q=r.actions[0];m(b,{...T,action:q!==void 0?{ref:q.name}:{definition:{kind:"prompt",text:["Tell me more"]}}})}else te&&m([...b,I.length],te())}),Y=[];if(S.length>0&&Y.push(s("div",{class:"wgd-attrs"},S)),E!==void 0){let z=x(H)?yr(H,"when"):[],te=Cn(E,{...r,scopePaths:z,getDataSchema:()=>We(e.get(),r.schemas)},se=>{if(se===void 0){let{action:De,...ce}=T;m(b,ce)}else m(b,{...T,action:se})}),q=[s("span",{class:"wgd-slot-label"},["action"]),te.element],ne="ref"in E&&typeof E.ref=="string"?E.ref:void 0;ne!==void 0&&i.has(ne)&&q.push(K(`Unknown shared action '${ne}' \u2014 this element renders disabled.`)),Y.push(s("div",{class:"wgd-attrs wgd-node-action"},q))}I.length>0&&Y.push(s("div",{class:"wgd-children"},I.map((z,te)=>L(z,[...b,te],O,!0,{parent:b,index:te,count:I.length},H))));let J=[];return S.length>0&&J.push(`${S.length} attr${S.length===1?"":"s"}`),E!==void 0&&J.push("action"),I.length>0&&J.push(`${I.length} ${I.length===1?"child":"children"}`),y(void 0,b,[U(T.tag,z=>m(b,{...T,tag:z}))],Y,g,C,P,{icons:[F],summary:J.join(" \xB7 ")})}return y("unknown",b,[s("code",void 0,[JSON.stringify(T)])],[],g??"Unknown template node form.",C,P)}let j,M,$;function V(){M!==void 0&&o.replaceChildren(L(M.template,[],$,!0,void 0,We(M,r.schemas)))}function ee(T,b){j=b.template?`${b.template.code}: ${b.template.message}`:void 0,M=T,$=b.template?.path;let O=new Set(r.actions.map(P=>P.name));i=new Set(Ft(T.template,T.load).filter(P=>!O.has(P)));let C=b.template?`${b.template.code}: ${b.template.message}`+(b.template.path!==void 0&&b.template.path!==""?` (at ${b.template.path})`:""):b.actionRefs;f.hidden=C===void 0,f.textContent=C??"",(!o.hidden||o.childNodes.length===0)&&V(),document.activeElement!==u&&(u.value=JSON.stringify(T.template,null,2),fe(u))}return t.push(()=>{}),{element:h,refresh:ee,dispose:()=>h.remove()}}function Ii(e,t,n=[]){let r=K(void 0),i=s("select",{class:"wgd-select wgd-theme-select"});i.append(s("option",{value:""},["(none \u2014 defaults)"]));for(let c of n)i.append(s("option",{value:c.name},[c.label??c.name]));let o=c=>{i.value=n.some(f=>f.name===c.previewTheme)?c.previewTheme??"":""};o(e.get()),i.addEventListener("change",()=>{let c=n.find(f=>f.name===i.value);e.update(f=>{let{theme:h,themeStyles:v,previewTheme:m,...w}=f;return c===void 0?w:{...w,theme:c.tokens,previewTheme:c.name,...c.styles===void 0?{}:{themeStyles:c.styles}}})});let d=s("div",{class:"wgd-token-ref"});function u(c){d.replaceChildren();for(let[f,h]of Object.entries(Ee)){let v=c?.[f]??h.default,m=s("div",{class:"wgd-token-ref-row",title:h.use},[h.type==="color"?s("span",{class:"wgd-token-ref-swatch",style:`background: ${v}`}):s("span",{class:"wgd-token-ref-swatch wgd-token-ref-noswatch"}),s("code",{class:"wgd-token-ref-name"},[`--wg-${f}`]),s("span",{class:"wgd-token-ref-value"},[v])]);d.append(m)}for(let[f,h]of Object.entries(c??{})){if(!f.startsWith("x-"))continue;let v=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-${f}`]),s("span",{class:"wgd-token-ref-value"},[h])]);d.append(v)}}u(e.get().theme),t.push(c=>{o(c),u(c.theme)});let a=[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)"]),d])],l=Q("Preview",a);return{element:l,setDiagnostic(c){r.hidden=c===void 0,r.textContent=c??""},dispose:()=>l.remove()}}function jn(e,t,n,r,i,o,d=6){let u=K(void 0),a=t(i.get()),l=vt(e,a===void 0?"":JSON.stringify(a,null,2),f=>{if(f.trim()===""){u.hidden=!0,r&&i.update(h=>r(h));return}try{let h=JSON.parse(f);u.hidden=!0,u.textContent="",i.update(v=>n(v,h))}catch(h){u.hidden=!1,u.textContent=`Invalid JSON (draft keeps the last valid value): ${String(le(h))}`}},d),c=he(l,"textarea");return ue(c),o.push(f=>{if(document.activeElement===c)return;let h=t(f);c.value=h===void 0?"":JSON.stringify(h,null,2),fe(c)}),s("div",void 0,[l,u])}function Pi(e,t,n=[],r=[],i={actions:[],secretNames:[],schemas:[]}){let o=[],d=[];function u(g,p,E){let S=Me(g,p(e.get()),F=>e.update(Y=>E(Y,F))),I=he(S,"input");return o.push(F=>{document.activeElement!==I&&(I.value=p(F))}),S}let a=K(void 0),l=zt(e.get().descriptor.hints,{key:"hint name",value:"what the hint does",add:"+ hint"},g=>e.update(p=>{if(g===void 0){let{hints:E,...S}=p.descriptor;return{...p,descriptor:S}}return{...p,descriptor:{...p.descriptor,hints:g}}}));o.push(g=>l.setValue(g.descriptor.hints));let c=K(void 0),f=Q("General",[u("Kind (id)",g=>g.kind,(g,p)=>({...g,kind:p})),a,u("Description",g=>g.descriptor.description??"",(g,p)=>({...g,descriptor:{...g.descriptor,description:p}})),u("Data shape (prose)",g=>g.descriptor.dataShape??"",(g,p)=>({...g,descriptor:{...g.descriptor,dataShape:p}})),c,s("div",{class:"wgd-field"},[s("span",{class:"wgd-field-label"},["Hints"]),nt([{label:"Tree",element:l.element},{label:"JSON",element:jn("",g=>g.descriptor.hints,(g,p)=>{if(!x(p))return g;let E=Object.fromEntries(Object.entries(p).map(([S,I])=>[S,String(I)]));return{...g,descriptor:{...g.descriptor,hints:E}}},g=>{let{hints:p,...E}=g.descriptor;return{...g,descriptor:E}},e,o,3)}])])]),h=Et(e.get().descriptor.dataSchema,g=>e.update(p=>{if(g===void 0){let{dataSchema:E,...S}=p.descriptor;return{...p,descriptor:S}}return{...p,descriptor:{...p.descriptor,dataSchema:g}}}));o.push(g=>h.setValue(g.descriptor.dataSchema));let v=nt([{label:"Builder",element:h.element},{label:"JSON",element:jn("dataSchema (JSON-Schema subset: type/properties/required/items/enum/pattern)",g=>g.descriptor.dataSchema,(g,p)=>x(p)?{...g,descriptor:{...g.descriptor,dataSchema:p}}:g,g=>{let{dataSchema:p,...E}=g.descriptor;return{...g,descriptor:E}},e,o)}]),m=s("select",{class:"wgd-select wgd-schema-mode"});m.append(s("option",{value:"inline"},["define inline"]));let w=s("option",{value:"shared"},["use shared"]);r.length===0&&(w.disabled=!0),m.append(w);let k=s("select",{class:"wgd-select wgd-schema-ref"});for(let g of r)k.append(s("option",{value:g.name},[g.label??g.name]));k.addEventListener("change",()=>{e.update(g=>({...g,descriptor:{...g.descriptor,dataSchemaRef:k.value}}))});let N=s("textarea",{class:"wgd-textarea wgd-schema-shared",rows:"10",readonly:"",spellcheck:"false"}),y=K(void 0),A=K(void 0),R=s("div",void 0,[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Shared schema"]),k]),N,s("span",{class:"wgd-field-label"},["Read-only here \u2014 edit shared schemas in the Data schemas section."])]);m.addEventListener("change",()=>{if(m.value==="shared"){let g=e.get().descriptor.dataSchemaRef??r[0]?.name??"";e.update(p=>{let{dataSchema:E,...S}=p.descriptor;return{...p,descriptor:{...S,dataSchemaRef:g}}})}else{let g=We(e.get(),r);e.update(p=>{let{dataSchemaRef:E,...S}=p.descriptor;return{...p,descriptor:{...S,dataSchema:g??{type:"object"}}}})}});function W(g){let p=g.descriptor.dataSchemaRef,E=typeof p=="string";if(m.value=E?"shared":"inline",v.hidden=E,R.hidden=!E,E){k.value!==p&&(k.value=p);let S=r.find(I=>I.name===p)?.schema;N.value=S===void 0?"":JSON.stringify(S,null,2),fe(N)}}o.push(W),W(e.get());let U=Q("Data schema",[s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Source"]),m]),y,v,A,R],!1);ue(N);function D(g,p){let E=s("div"),S="",I;function F(Y){let J=We(Y,r),z=J===void 0?"":JSON.stringify(J);if(I!==void 0&&z===S){I.setValue(g(Y));return}S=z;let te=q=>e.update(ne=>p(ne,q));I=J!==void 0&&x(J)?On(J,g(Y),te):vi(g(Y),te),E.replaceChildren(I.element)}return F(e.get()),o.push(F),E}let L=K(void 0),j=Q("Sample data",[s("span",{class:"wgd-field-label"},["dataExample \u2014 ships with the widget as the example agents imitate"]),nt([{label:"Edit",element:D(g=>g.descriptor.dataExample,(g,p)=>({...g,descriptor:{...g.descriptor,dataExample:p}}))},{label:"JSON",element:jn("dataExample (JSON)",g=>g.descriptor.dataExample,(g,p)=>({...g,descriptor:{...g.descriptor,dataExample:p}}),g=>{let{dataExample:p,...E}=g.descriptor;return{...g,descriptor:E}},e,o)}]),L],!1),M=K(void 0),$=Q("Data for preview",[s("span",{class:"wgd-field-label"},["Overrides dataExample in the preview only (not exported)"]),nt([{label:"Edit",element:D(g=>g.sampleData,(g,p)=>({...g,sampleData:p}))},{label:"JSON",element:jn("Preview data (JSON)",g=>g.sampleData,(g,p)=>({...g,sampleData:p}),g=>{let{sampleData:p,...E}=g;return E},e,o,4)}]),M],!1),V=Nn(e.get().descriptor.styles,g=>e.update(p=>{if(g===void 0){let{styles:E,...S}=p.descriptor;return{...p,descriptor:S}}return{...p,descriptor:{...p.descriptor,styles:g}}}));o.push(g=>V.setValue(g.descriptor.styles));let ee=$i(e,o,{actionContext:i}),T=Ii(e,o,n),b=K(void 0),O=Cn(e.get().load,{...i,loadOnly:!0,getDataSchema:()=>We(e.get(),r)},g=>e.update(p=>{if(g===void 0){let{load:E,...S}=p;return S}return{...p,load:g}}));o.push(g=>{O.element.contains(document.activeElement)||O.setValue(g.load)});let C=Q("Load action (http GET, runs once when the widget first renders in an Apps host)",[s("div",{class:"wgd-compact wgd-load"},[O.element]),b],!1),P=bi(e);$.classList.add("wgd-edit-only"),V.element.classList.add("wgd-edit-only"),t.left.append(f,U,j,ee.element,C,P.element),t.right.append($,V.element,T.element),d.push(ee.dispose,T.dispose,P.dispose);function H(g){let p=An(g,{schemas:r,actions:i.actions});a.hidden=p.kind===void 0,b.hidden=p.load===void 0,b.textContent=p.load??"",a.textContent=p.kind??"",L.hidden=p.example===void 0,L.textContent=p.example?`dataExample vs dataSchema: ${p.example.code} at ${p.example.path} \u2014 ${p.example.message}`:"",M.hidden=p.sample===void 0,M.textContent=p.sample?`sample vs dataSchema: ${p.sample.code} at ${p.sample.path} \u2014 ${p.sample.message}`:"",c.hidden=p.dataShape===void 0,c.textContent=p.dataShape??"",y.hidden=p.schemaRef===void 0,y.textContent=p.schemaRef??"",A.hidden=p.dataSchema===void 0,A.textContent=p.dataSchema?.join(`
|
|
480
|
+
`)??"",T.setDiagnostic(p.theme?`${p.theme.code}: ${p.theme.message}`:void 0),V.setIssues(p.styles);for(let E of o)E(g);ee.refresh(g,p)}let B=e.subscribe(H);return d.push(B),H(e.get()),{dispose(){for(let g of d)g();t.left.replaceChildren(),t.right.replaceChildren()}}}var Mn="designer-preview",Ds=0,Os=Math.random().toString(36).slice(2,8);function Wn(e={}){er(document);let t=s("div",{class:"wgd-banner"});t.hidden=!0;let n=s("style"),r=s("style"),i=`wgd-preview-${Os}-${++Ds}`,o=s("div",{class:"wgd-preview","data-wgd-scope":i}),d=w=>or(w,`[data-wgd-scope="${i}"]`),u=s("div",{class:"wgd-preview-pane"},[t,n,r,o]),a=Oe(),l=()=>({tag:"div",children:["\u2026"]});a.register(Mn,w=>l(w),{description:"Designer preview delegate.",dataShape:"Defined by the draft being designed."});let c=new Map;for(let w of e.widgets??[]){let k=Ie(w.template);if(!k.ok||typeof w.kind!="string"||w.kind==="")continue;let N=Sn(k.template),y=x(w.descriptor)?w.descriptor:{};try{a.register(w.kind,A=>N(A),{description:`Custom widget '${w.kind}' supplied for preview.`,dataShape:"Defined by the supplied definition.",...y.dataExample!==void 0?{dataExample:y.dataExample}:{}})}catch{continue}x(y.styles)&&c.set(w.kind,d(y.styles))}let f=a.kinds().filter(w=>w!==Mn),h;function v(w,k,N){let y=N===void 0||N===Mn;if(y&&!k.previewable){let R=k.kind??(k.template?`${k.template.code}: ${k.template.message}`+(k.template.path?` (at ${k.template.path})`:""):"Draft is not previewable.");if(t.hidden=!1,h===void 0){t.textContent=`Nothing to preview yet \u2014 ${R}`,o.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 ${R}`;return}if(o.querySelector(".wgd-preview-empty")?.remove(),t.hidden=!0,t.textContent="",y){let R=Ie(w.template);if(!R.ok)return;let W=e.actions??[];l=Sn(R.template,{actions:U=>W.find(D=>D.name===U)?.definition})}r.textContent=y?w.descriptor.styles?d(w.descriptor.styles):"":c.get(N)??"",nr(o,w.theme??{}),n.textContent=w.themeStyles?d(w.themeStyles):"";let A={kind:y?Mn:N,data:y?w.sampleData??w.descriptor.dataExample??null:m(N)};h===void 0?h=cr(A,o,{catalog:a}):h.update(A);for(let R of o.querySelectorAll("[data-wg-action]"))R.classList.add("wg-designer-action")}function m(w){return a.describe(w)?.dataExample??{value:"preview"}}return{pane:u,kinds:f,update:v,dispose(){h?.dispose(),h=void 0,u.replaceChildren()}}}function it(e){return JSON.parse(JSON.stringify(e))}function Kt(){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 ji(e){let t=it(e??Kt()),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=it(o(it(t))),i()},replace(o){n.length=0,t=it(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 Mi(e,t={}){Ae(document);let n=t.initialWidget?it({...t.initialWidget}):Kt(),r=t.themes?.find(y=>y.name===t.previewTheme),i=r!==void 0?{...n,theme:r.tokens,previewTheme:r.name,...r.styles===void 0?{}:{themeStyles:r.styles}}:t.initialTheme!==void 0?{...n,theme:t.initialTheme}:n,o=ji(i),d=new Set,u=Wn({actions:t.actions??[]}),a=s("div",{class:"wgd-panels"}),l=s("div",{class:"wgd-preview-pane"}),c=s("div",{class:"wgd-side"},[u.pane,l]),f=s("div",{class:"wgd-root"},[a,c]);(t.appearance==="light"||t.appearance==="dark")&&f.setAttribute("data-wgd-theme",t.appearance),Te(f,t.chrome),e.appendChild(f);let h={actions:t.actions??[],secretNames:t.secretNames??[],schemas:t.schemas??[]},v=Pi(o,{left:a,right:l},t.themes??[],t.schemas??[],h),m=y=>An(y,{...t.schemas===void 0?{}:{schemas:t.schemas},actions:t.actions??[]});function w(y){let A=m(y);u.update(y,A);for(let R of[...d])R(y,A)}let k=o.subscribe(w);w(o.get());function N(y){f.classList.toggle("wgd-readonly",y);let A=[...f.querySelectorAll(".wgd-panels .wgd-section-body, .wgd-edit-only > .wgd-section-body")].filter(R=>!R.parentElement?.classList.contains("wgd-view-only"));for(let R of A)y?R.setAttribute("inert",""):R.removeAttribute("inert")}return t.readOnly===!0&&N(!0),{getDraft:()=>it(o.get()),getDiagnostics:()=>m(o.get()),setReadOnly:N,loadWidget(y){let A=Dn(y,o.get().kind);return A.length>0?{ok:!1,errors:A}:(mr(o,y),{ok:!0})},checkWidget(y){let A=Dn(y,o.get().kind);if(A.length>0)return{ok:!1,errors:A};let{kind:R,template:W,descriptor:U,load:D}=y;return{ok:!0,diagnostics:m({kind:R,template:W,descriptor:U,...D===void 0?{}:{load:D}})}},loadTheme(y){let A=Ne(y);return A.ok?(o.update(R=>{let{themeStyles:W,...U}=R,D=t.themes?.find(L=>L.name===R.previewTheme);return{...U,theme:{...D?.tokens??{},...A.theme},...D?.styles===void 0?{}:{themeStyles:D.styles}}}),{ok:!0}):{ok:!1,errors:[A.error.message]}},subscribe(y){return d.add(y),()=>d.delete(y)},dispose(){k(),v.dispose(),u.dispose(),d.clear(),f.remove()}}}function Ns(){return{name:"my-schema",label:"My schema",schema:{type:"object",properties:{}}}}function Rs(e){let t=[];return x(e)?(typeof e.name!="string"||e.name.trim()===""?t.push("'name' must be a non-empty string."):ve.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 Wi(e,t={}){Ae(document);let n=t.initialSchema?JSON.parse(JSON.stringify(t.initialSchema)):Ns(),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),Te(o,t.chrome),e.appendChild(o);function d(){return JSON.parse(JSON.stringify(n))}let u=K(void 0);function a(){let b=x(n.schema)?Be(n.schema):[];u.hidden=b.length===0,u.textContent=b.join(`
|
|
481
|
+
`)}function l(){a();for(let b of[...r])b(d())}let c=[],f=K(void 0);function h(b,O,C){let P=Me(b,O(),C),H=he(P,"input");return c.push(()=>{document.activeElement!==H&&(H.value=O())}),P}let v=Q("Schema",[h("Name (id)",()=>n.name,b=>{n={...n,name:b};let O=b.trim()===""||!ve.test(b);f.hidden=!O,f.textContent=O?"Name must be non-empty using letters, digits, '.', '_' or '-'.":"",l()}),f,h("Label",()=>n.label??"",b=>{n={...n,label:b},l()}),h("Description",()=>n.description??"",b=>{n={...n,description:b},l()})]),m=Et(n.schema,b=>{n={...n,schema:b??{}},y(),l()}),w=K(void 0),k=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),N=s("div",void 0,[k,w]);k.value=JSON.stringify(n.schema,null,2),k.addEventListener("input",()=>{try{let b=JSON.parse(k.value);if(!x(b))throw new Error("schema must be an object");w.hidden=!0,w.textContent="",n={...n,schema:b},m.setValue(b),l()}catch(b){w.hidden=!1,w.textContent=`Invalid JSON (schema keeps the last valid value): ${String(le(b))}`}});function y(){document.activeElement!==k&&(k.value=JSON.stringify(n.schema,null,2),fe(k))}let A=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Builder"]),R=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);N.hidden=!0,A.addEventListener("click",()=>{m.element.hidden=!1,N.hidden=!0,A.classList.add("wgd-tab-active"),R.classList.remove("wgd-tab-active")}),R.addEventListener("click",()=>{m.element.hidden=!0,N.hidden=!1,R.classList.add("wgd-tab-active"),A.classList.remove("wgd-tab-active"),y()});let W=Q("Definition",[s("div",{class:"wgd-row"},[A,R]),m.element,N,u]),U=K(void 0),D=s("textarea",{class:"wgd-textarea wgd-schema-import",rows:"6",spellcheck:"false"}),L=s("button",{class:"wgd-button",type:"button"},["Import"]);L.addEventListener("click",()=>{let b;try{b=JSON.parse(D.value)}catch(C){U.hidden=!1,U.textContent=`Invalid JSON: ${le(C)}`;return}let O=ee(b);U.hidden=O.ok,U.textContent=O.ok?"":O.errors.join(`
|
|
482
|
+
`)});let j=Q("Import",[s("span",{class:"wgd-field-label"},["Import schema entry JSON ({ name, label?, description?, schema })"]),D,U,s("div",{class:"wgd-row"},[L])]),M=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),$=s("button",{class:"wgd-button wgd-add",type:"button"},["Export schema entry"]);$.addEventListener("click",()=>{M.value=JSON.stringify(d(),null,2),fe(M)});let V=Q("Export",[s("div",{class:"wgd-toolbar"},[$]),M]);V.classList.add("wgd-view-only"),i.append(v,W,j,V),a(),ue(k),ue(D),ue(M);function ee(b){let O=Rs(b);if(O.length>0)return{ok:!1,errors:O};n=JSON.parse(JSON.stringify(b));for(let C of c)C();return f.hidden=!0,m.setValue(n.schema),y(),l(),{ok:!0}}function T(b){o.classList.toggle("wgd-readonly",b);let O=[...i.querySelectorAll(".wgd-section-body")].filter(C=>!C.parentElement?.classList.contains("wgd-view-only"));for(let C of O)b?C.setAttribute("inert",""):C.removeAttribute("inert")}return t.readOnly===!0&&T(!0),{getSchema:d,loadSchema:ee,setReadOnly:T,subscribe(b){return r.add(b),()=>r.delete(b)},dispose(){r.clear(),o.remove()}}}var Ls=Oe().kinds(),_s=/^#[0-9a-f]{3}([0-9a-f]{3})?$/i,Hi=/^x-[a-z0-9][a-z0-9-]*$/;function Cs(e){if(!_s.test(e))return;if(e.length===7)return e.toLowerCase();let[,t,n,r]=e.toLowerCase();return`#${t}${t}${n}${n}${r}${r}`}function $s(){return{name:"my-theme",label:"My theme",tokens:{}}}var Is=new Set(ir().names());function Ui(e){if(!ve.test(e))return`INVALID_IDENTIFIER \u2014 '${e}' may use letters, digits, '.', '_' or '-' only.`;if(Is.has(e))return`RESERVED_THEME \u2014 '${e}' is a built-in theme; give yours its own name.`}function Fi(e){let{extends:t,...n}=JSON.parse(JSON.stringify(e));return n}function Ps(e,t){let n=[];if(typeof e!="object"||e===null||Array.isArray(e))return["Theme entry must be an object."];let r=e;if(typeof r.name!="string"||r.name.trim()==="")n.push("'name' must be a non-empty string.");else if(r.name!==t){let o=Ui(r.name);o!==void 0&&n.push(`name: ${o}`)}let i=Ne(r.tokens??{});return i.ok||n.push(`tokens: ${i.error.code} \u2014 ${i.error.message}`),r.styles!==void 0&&!ze(r.styles)&&n.push("styles: must map selectors to objects of property/value strings."),n}function Bi(e,t={}){Ae(document);let n=t.initialTheme?Fi(t.initialTheme):$s(),r=new Set,i=Wn(t.widgets?{widgets:t.widgets}:{}),o=i.kinds.length>0?i.kinds:Ls,d=o[0]??"card",u=s("div",{class:"wgd-panels"}),a=s("div",{class:"wgd-side"},[i.pane]),l=s("div",{class:"wgd-root wgd-theme-designer"},[u,a]);(t.appearance==="light"||t.appearance==="dark")&&l.setAttribute("data-wgd-theme",t.appearance),Te(l,t.chrome),e.appendChild(l);function c(){let p={...Kt(),theme:n.tokens};return n.styles===void 0?p:{...p,themeStyles:n.styles}}function f(){i.update(c(),{styles:[],previewable:!0},d);for(let p of[...r])p(h())}function h(){return JSON.parse(JSON.stringify(n))}function v(p,E){let S={...n.tokens};E===""?delete S[p]:S[p]=E,n={...n,tokens:S},f()}let m=[];function w(p,E,S){let I=Me(p,E(),S),F=he(I,"input");return m.push(()=>{document.activeElement!==F&&(F.value=E())}),I}let k=K(void 0);function N(){let p=n.name.trim()===""?"'name' must be a non-empty string.":Ui(n.name);k.hidden=p===void 0,k.textContent=p??""}m.push(N);let y=Q("Theme",[w("Name (id)",()=>n.name,p=>{n={...n,name:p},N(),f()}),k,w("Label",()=>n.label??"",p=>{n={...n,label:p},f()}),w("Description",()=>n.description??"",p=>{n={...n,description:p},f()})]);N();let A=s("select",{class:"wgd-select wgd-preview-kind"});for(let p of o)A.append(s("option",{value:p},[p]));A.value=d,A.addEventListener("change",()=>{d=A.value,f()}),a.prepend(s("div",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},["Preview kind"]),A]));let R=[],W=[];for(let p of ke){let E=s("input",{type:"text",class:"wgd-input",placeholder:Ze[p]});E.value=n.tokens[p]??"";let S=K(void 0),I=Ee[p].type==="color"?s("input",{type:"color",class:"wgd-swatch",title:`Pick --wg-${p}`}):void 0,F=Y=>{let J=Y===""?Ze[p]:Y;if(I!==void 0){let z=Cs(J);z!==void 0&&(I.value=z),I.style.background=Qe(J)?J:"transparent"}};F(E.value),I?.addEventListener("input",()=>{E.value=I.value,E.dispatchEvent(new Event("input",{bubbles:!0}))}),E.addEventListener("input",()=>{let Y=E.value!==""&&!Qe(E.value);S.hidden=!Y,S.textContent=Y?`INVALID_TOKEN_VALUE: unsafe value withheld from the preview. ${Zn}`:"",F(E.value),v(p,E.value)}),R.push(()=>{document.activeElement!==E&&(E.value=n.tokens[p]??"",F(E.value))}),W.push(s("div",void 0,[s("label",{class:"wgd-field",title:Ee[p].use},[s("span",{class:"wgd-field-label"},[`--wg-${p}`]),s("div",{class:"wgd-token-row"},I===void 0?[E]:[E,I])]),S]))}let U=Q("Tokens",W),D=s("div",{class:"wgd-jt-children"}),L=K(void 0);function j(){return Object.entries(n.tokens).filter(([p])=>Hi.test(p))}function M(){let p=j().map(([S,I])=>{let F=s("input",{type:"text",class:"wgd-input wgd-jt-keyinput"});F.value=S,F.addEventListener("change",()=>{let z=F.value;if(!Hi.test(z)){L.hidden=!1,L.textContent=`'${z}' is not a valid custom name \u2014 use x-<lowercase-kebab>.`,F.value=S;return}L.hidden=!0;let te={...n.tokens};delete te[S],te[z]=I,n={...n,tokens:te},M(),f()});let Y=s("input",{type:"text",class:"wgd-input"});Y.value=I,Y.addEventListener("input",()=>v(S,Y.value));let J=s("button",{class:"wgd-icon",type:"button",title:"Remove"},["\u2715"]);return J.addEventListener("click",()=>{v(S,""),M()}),s("div",{class:"wgd-attr-row"},[F,Y,J])}),E=s("button",{class:"wgd-button wgd-add",type:"button"},["+ variable"]);E.addEventListener("click",()=>{let S="x-custom";for(let I=1;S in n.tokens;I++)S=`x-custom${I}`;v(S,"0"),M()}),D.replaceChildren(...p,s("div",{class:"wgd-toolbar"},[E]))}M();let $=Q("Custom variables (--wg-x-*)",[D,L]),V=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),ee=s("button",{class:"wgd-button wgd-add",type:"button"},["Export theme entry"]);ee.addEventListener("click",()=>{V.value=JSON.stringify(h(),null,2)});let T=s("textarea",{class:"wgd-textarea",rows:"5",spellcheck:"false"}),b=K(void 0),O=s("button",{class:"wgd-button",type:"button"},["Import"]);O.addEventListener("click",()=>{let p;try{p=JSON.parse(T.value)}catch(S){b.hidden=!1,b.textContent=`Invalid JSON: ${le(S)}`;return}let E=B(p);b.hidden=E.ok,b.textContent=E.ok?"":E.errors.join(`
|
|
483
|
+
`)});let C=Q("Import",[s("span",{class:"wgd-field-label"},["Import theme entry JSON"]),T,b,s("div",{class:"wgd-row"},[O])]),P=Q("Export",[s("div",{class:"wgd-toolbar"},[ee]),V]);P.classList.add("wgd-view-only");let H=Nn(n.styles,p=>{let{styles:E,...S}=n;n=p===void 0?S:{...S,styles:p},H.setIssues(Bt(n.styles)),f()});H.setIssues(Bt(n.styles)),u.append(y,U,$,C,P),H.element.classList.add("wgd-edit-only"),a.append(H.element);function B(p){let E=Ps(p,n.name);if(E.length>0)return{ok:!1,errors:E};n=Fi(p);for(let S of m)S();for(let S of R)S();return M(),H.setValue(n.styles),H.setIssues(Bt(n.styles)),f(),{ok:!0}}f();function g(p){l.classList.toggle("wgd-readonly",p);let E=[...l.querySelectorAll(".wgd-panels .wgd-section-body, .wgd-edit-only > .wgd-section-body")].filter(S=>!S.parentElement?.classList.contains("wgd-view-only"));for(let S of E)p?S.setAttribute("inert",""):S.removeAttribute("inert")}return t.readOnly===!0&&g(!0),{getTheme:h,loadTheme:B,setReadOnly:g,subscribe(p){return r.add(p),()=>r.delete(p)},dispose(){r.clear(),i.dispose(),l.remove()}}}function js(){return{name:"my-action",label:"My action",definition:{kind:"prompt",text:["Tell me more about ",{bind:"title"}]}}}function Ms(e){let t=[];if(!x(e))return["Action entry must be an object."];(typeof e.name!="string"||!bn.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=ht(e.definition,"definition");return n&&t.push(`${n.message} (at ${n.path})`),t}function Ws(e){let t={name:e.name,definition:de(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 zi(e,t,n){let{[t]:r,...i}=e;return n===""?i:{...i,[t]:n}}function Vi(e,t={}){Ae(document);let n=t.initialAction?de(t.initialAction):js(),r=t.testCall,i=new Set,o=s("div",{class:"wgd-panels"}),d=s("div",{class:"wgd-root wgd-action-designer"},[o]);(t.appearance==="light"||t.appearance==="dark")&&d.setAttribute("data-wgd-theme",t.appearance),Te(d,t.chrome),e.appendChild(d);let u=()=>de(n);function a(){for(let g of[...i])g(u())}let l=[],c=K(void 0);function f(g,p,E){let S=Me(g,p(),E),I=he(S,"input");return l.push(()=>{document.activeElement!==I&&(I.value=p())}),S}let h=Q("Action",[f("Name (id)",()=>n.name,g=>{n={...n,name:g};let p=!bn.test(g);c.hidden=!p,c.textContent=p?"Name must be lowercase letters, digits and dashes, starting with a letter.":"",a()}),c,f("Label",()=>n.label??"",g=>{n=zi(n,"label",g),a()}),f("Description",()=>n.description??"",g=>{n=zi(n,"description",g),a()})]),v=K(void 0),m=wr(n.definition,{...t.schemas?{schemas:t.schemas}:{},...t.secretNames?{secretNames:t.secretNames}:{}},g=>{n={...n,definition:g},y(),A(),$(),a()}),w=K(void 0),k=s("textarea",{class:"wgd-textarea",rows:"12",spellcheck:"false"}),N=s("div",void 0,[k,w]);k.value=JSON.stringify(n.definition,null,2),k.addEventListener("input",()=>{try{let g=JSON.parse(k.value),p=ht(g,"definition");if(p)throw new Error(`${p.message} (at ${p.path})`);w.hidden=!0,w.textContent="",n={...n,definition:g},m.setValue(n.definition),A(),$(),a()}catch(g){w.hidden=!1,w.textContent=`Invalid (definition keeps the last valid value): ${le(g)}`}});function y(){document.activeElement!==k&&(k.value=JSON.stringify(n.definition,null,2),fe(k))}function A(){let g=ht(n.definition,"definition");v.hidden=g===void 0,v.textContent=g?`${g.message} (at ${g.path})`:""}A();let R=s("button",{class:"wgd-button wgd-tab wgd-tab-active",type:"button"},["Editor"]),W=s("button",{class:"wgd-button wgd-tab",type:"button"},["JSON"]);N.hidden=!0,R.addEventListener("click",()=>{m.element.hidden=!1,N.hidden=!0,R.classList.add("wgd-tab-active"),W.classList.remove("wgd-tab-active")}),W.addEventListener("click",()=>{m.element.hidden=!0,N.hidden=!1,W.classList.add("wgd-tab-active"),R.classList.remove("wgd-tab-active"),y()});let U=Q("Definition",[s("div",{class:"wgd-row"},[R,W]),v,m.element,N]),D=s("div",{class:"wgd-action-test"}),L=Q("Test",[D]),j={},M;function $(){if(r===void 0)return;if(D.replaceChildren(),n.definition.kind!=="http"){M=void 0,j={},D.append(s("p",{class:"wgd-diagnostic"},["Prompt actions run in the host's composer; nothing to test."]));return}let g=n.definition,p=JSON.stringify(g.input);p!==M&&(j={}),M=p;let E=On(g.input,j,F=>{j=x(F)?F:{}});j=x(E.getValue())?E.getValue():{};let S=s("pre",{class:"wgd-test-output"}),I=s("button",{class:"wgd-button wgd-add wgd-test-run",type:"button"},["Test call"]);I.addEventListener("click",()=>{I.disabled=!0,I.classList.add("wgd-busy"),I.setAttribute("aria-busy","true"),S.textContent="\u2026",r(g,j).then(F=>{S.textContent=typeof F=="string"?F:JSON.stringify(F,null,2)}).catch(F=>{S.textContent=`Test failed: ${F.message}`}).finally(()=>{I.disabled=!1,I.classList.remove("wgd-busy"),I.removeAttribute("aria-busy")})}),D.append(s("span",{class:"wgd-field-label"},["Arguments"]),E.element,s("div",{class:"wgd-row"},[I]),S)}$();let V=K(void 0),ee=s("textarea",{class:"wgd-textarea wgd-action-import",rows:"6",spellcheck:"false"}),T=s("button",{class:"wgd-button",type:"button"},["Import"]);T.addEventListener("click",()=>{let g;try{g=JSON.parse(ee.value)}catch(E){V.hidden=!1,V.textContent=`Invalid JSON: ${le(E)}`;return}let p=H(g);V.hidden=p.ok,V.textContent=p.ok?"":p.errors.join(`
|
|
484
|
+
`)});let b=Q("Import",[s("span",{class:"wgd-field-label"},["Import action entry JSON ({ name, label?, description?, definition })"]),ee,V,s("div",{class:"wgd-row"},[T])]),O=s("textarea",{class:"wgd-textarea",rows:"8",readonly:"",spellcheck:"false"}),C=s("button",{class:"wgd-button wgd-add",type:"button"},["Export action entry"]);C.addEventListener("click",()=>{O.value=JSON.stringify(u(),null,2),fe(O)});let P=Q("Export",[s("div",{class:"wgd-toolbar"},[C]),O]);P.classList.add("wgd-view-only"),o.append(h,U,...r===void 0?[]:[L],b,P),ue(k),ue(ee),ue(O);function H(g){let p=Ms(g);if(p.length>0)return{ok:!1,errors:p};n=Ws(g),j={};for(let E of l)E();return c.hidden=!0,m.setValue(n.definition),y(),A(),$(),a(),{ok:!0}}function B(g){d.classList.toggle("wgd-readonly",g);let p=[...o.querySelectorAll(".wgd-section-body")].filter(E=>!E.parentElement?.classList.contains("wgd-view-only"));for(let E of p)g?E.setAttribute("inert",""):E.removeAttribute("inert")}return t.readOnly===!0&&B(!0),{getAction:u,loadAction:H,setReadOnly:B,subscribe(g){return i.add(g),()=>i.delete(g)},dispose(){i.clear(),d.remove()}}}var Hn=[{mode:"light",label:"Light hosts",builtIn:"Built-in light"},{mode:"dark",label:"Dark hosts",builtIn:"Built-in dark"}];function Hs(e){if(!x(e))return["Settings must be an object of named sections."];let t=[],n=e.resourceDomains;n!==void 0&&(!Array.isArray(n)||!n.every(i=>typeof i=="string"))&&t.push("resourceDomains: must be a list of domain strings.");let r=e.defaultThemes;if(r===void 0)return t;if(!x(r))return[...t,"defaultThemes: must be an object of { light?, dark? }."];for(let[i,o]of Object.entries(r))Hn.some(d=>d.mode===i)?typeof o!="string"&&t.push(`defaultThemes: the ${i} default must be a theme name.`):t.push(`defaultThemes: '${i}' is not a theme mode.`);return t}function Ji(e,t={}){Ae(document);let n=t.themes??[],r=t.initialSettings?de(t.initialSettings):{},i=new Set,o=s("div",{class:"wgd-panels"}),d=s("div",{class:"wgd-root wgd-settings-designer"},[o]);(t.appearance==="light"||t.appearance==="dark")&&d.setAttribute("data-wgd-theme",t.appearance),Te(d,t.chrome),e.appendChild(d);function u(){return{...de(r),defaultThemes:de(r.defaultThemes??{})}}function a(){for(let L of[...i])L(u())}let l=new Map;function c(L,j,M){let $=r.defaultThemes?.[j];L.replaceChildren(s("option",{value:""},[M]));for(let V of n)L.append(s("option",{value:V.name},[V.label??V.name]));$!==void 0&&!n.some(V=>V.name===$)&&L.append(s("option",{value:$,class:"wgd-unavailable"},[`${$} (unavailable)`])),L.value=$??""}let f=Hn.map(({mode:L,label:j,builtIn:M})=>{let $=s("select",{class:"wgd-select wgd-default-theme","data-mode":L});return c($,L,M),$.addEventListener("change",()=>{let V={...r.defaultThemes??{}};$.value===""?delete V[L]:V[L]=$.value,r={...r,defaultThemes:V},a()}),l.set(L,$),s("label",{class:"wgd-row"},[s("span",{class:"wgd-field-label"},[j]),$])}),h=Q("Default themes",[s("span",{class:"wgd-field-label"},["The theme a render uses when it names none: light hosts get the light default, dark hosts the dark one."]),...f]);o.append(h);let v=s("div",{class:"wgd-domains"}),m=s("input",{type:"text",class:"wgd-input wgd-domain-add",placeholder:"cdn.example.com",spellcheck:"false","aria-label":"Add a resource domain"}),w=s("button",{class:"wgd-icon",type:"button",title:"Add domain"},["+"]);function k(L){let j=Vn(L);return"error"in j?{value:L.trim(),mark:`Not a resource domain: ${j.error}.`,error:!0}:{value:j.origin,mark:j.origin,error:!1}}function N(L){r={...r,resourceDomains:L},y(),a()}function y(){let L=r.resourceDomains??[];v.replaceChildren(...L.map((M,$)=>{let V=s("input",{type:"text",class:"wgd-input wgd-domain",spellcheck:"false","aria-label":`Resource domain ${$+1}`});V.value=M,V.addEventListener("change",()=>{let O=[...L];O[$]=k(V.value).value,N(O)});let ee=s("button",{class:"wgd-icon",type:"button",title:"Remove domain"},["\u2715"]);ee.addEventListener("click",()=>N(L.filter((O,C)=>C!==$)));let{mark:T,error:b}=k(M);return s("div",{class:"wgd-domain-entry"},[s("div",{class:"wgd-row"},[V,ee]),b?K(T):s("span",{class:"wgd-field-label wgd-domain-origin"},[T])])}));let j=L.length>=20;m.disabled=j,w.disabled=j}function A(){if(m.value.trim()===""||(r.resourceDomains??[]).length>=20)return;let L=k(m.value).value;m.value="",N([...r.resourceDomains??[],L])}w.addEventListener("click",A),m.addEventListener("keydown",L=>{L.key==="Enter"&&(L.preventDefault(),A())});let R=Q("Resource domains",[s("span",{class:"wgd-field-label"},[`Domains your widgets' images may load from directly in chat hosts that honor them, when the server does not copy an image inline. Enter cdn.example.com or *.example.com, optionally with https:// (no ports, paths or IP addresses), at most ${20}.`]),s("span",{class:"wgd-field-label"},["Any render, including image addresses an agent supplies, may load from these domains in the viewer's browser, so list only domains you control. A domain that redirects needs its target listed too, and a chat client keeps the list it read until it reloads."]),v,s("div",{class:"wgd-row"},[m,w])]);o.append(R),y();function W(L){let j=Hs(L);if(j.length>0)return{ok:!1,errors:j};r=de(L);for(let{mode:M,builtIn:$}of Hn){let V=l.get(M);V!==void 0&&c(V,M,$)}return y(),a(),{ok:!0}}function U(L){d.classList.toggle("wgd-readonly",L);for(let j of o.querySelectorAll(".wgd-section-body"))L?j.setAttribute("inert",""):j.removeAttribute("inert")}t.readOnly===!0&&U(!0);function D(L){n=[...L];for(let{mode:j,builtIn:M}of Hn){let $=l.get(j);$!==void 0&&c($,j,M)}}return{getSettings:u,loadSettings:W,setThemes:D,setReadOnly:U,subscribe(L){return i.add(L),()=>i.delete(L)},dispose(){i.clear(),d.remove()}}}function qt(e){let t=e.getAttribute("appearance"),n=wi(e.getAttribute("chrome"));return{...t==="light"||t==="dark"?{appearance:t}:{},...n===void 0?{}:{chrome:n}}}var Ki="widgentic-designer",qi="widgentic-theme-designer",Gi="widgentic-schema-designer",Yi="widgentic-action-designer",Xi="widgentic-settings-designer";function vr(e=Ki){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Mi(this,qt(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 Er(e=qi){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Bi(this,qt(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 kr(e=Gi){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Wi(this,qt(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 xr(e=Yi){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;connectedCallback(){this.#e===void 0&&(this.#e=Vi(this,qt(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)}function Fs(e,t){if(!Object.prototype.hasOwnProperty.call(e,t))return;let n=e,r=n[t];delete n[t],n[t]=r}function Sr(e=Xi){if(customElements.get(e)!==void 0)return;class t extends HTMLElement{#e;#t;#n=[];constructor(){super(),Fs(this,"themes")}get themes(){return[...this.#n]}set themes(r){this.#n=Array.isArray(r)?[...r]:[],this.#e?.setThemes(this.#n)}connectedCallback(){this.#e===void 0&&(this.#e=Ji(this,{...qt(this),themes:this.#n}),this.#t=this.#e.subscribe(r=>{this.dispatchEvent(new CustomEvent("widgentic-change",{detail:{settings: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)}xr();vr();kr();Er();Sr();
|
|
455
485
|
//# sourceMappingURL=widgentic-designer.js.map
|