@unovis/mcp 1.7.0 → 1.7.1

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.
@@ -1779,4 +1779,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
1779
1779
  svg {
1780
1780
  display: block;
1781
1781
  }
1782
- `;var uW=class{constructor(e,r){this._defaultConfig=sW,this.config=this._defaultConfig,this._colorAccessor=n=>n.color,this._container=e,this.div=r?.renderIntoProvidedDomNode?j(this._container):j(this._container).append("div"),this.div.classed(uy,!0),this.element=this.div.node(),this.setConfig(r)}setConfig(e){this.prevConfig=this.config,this.config=Oe(this._defaultConfig,e),this.render()}update(e){this.setConfig(e)}render(){let{config:e}=this,r=this.div.selectAll(`.${Dd}`).data(e.items),n=r.enter().append("div").on("click",this._onItemClick.bind(this)),o=n.merge(r);o.attr("class",i=>`${Dd} ${i.className??""}`).classed(ZC,e.orientation===Xf.Vertical).classed(KC,i=>!!e.onLegendItemClick&&this._isItemClickable(i)).attr("title",i=>i.name).style("display",i=>i.hidden?"none":null),n.append("span").attr("class",hy).call(lW),o.select(`.${hy}`).style("width",function(i){let s=(Array.isArray(i.color)?i.color:[i.color]).length,c=e.bulletSize?lr(e.bulletSize):Ft("var(--vis-legend-bullet-size)",this)||9,l=e.bulletSpacing;return`${jC(c,s,l)}px`}).style("height",e.bulletSize).style("box-sizing","content-box").call(cW,this.config,this._colorAccessor,e.colorFunction),n.append("span").attr("class",fy).classed(e.labelClassName,!0).style("max-width",e.labelMaxWidth).style("font-size",e.labelFontSize),o.select(`.${fy}`).text(i=>i.name),r.exit().remove()}_isItemClickable(e){return e.pointer===void 0?!0:e.pointer}_onItemClick(e,r){let{config:{onLegendItemClick:n}}=this,i=this.div.selectAll(`.${Dd}`).nodes().indexOf(e.currentTarget);n&&n(r,i)}destroy(){this.element!==this._container&&this.div.remove()}};uW.selectors=QC;var dy=uW;var fW=t=>typeof t!="object"||t===null||Array.isArray(t)?!1:Object.keys(t).some(r=>["$field","$index","$const","$dateTickFormat","$numTickFormat","$lookup","$format","$mapField"].includes(r));function ant(t,e,r=7){let n=e-t;if(!Number.isFinite(n)||n<=0)return;let o=[];if(n>=60*864e5){let i=Math.max(1,Math.ceil(n/2592e6/r)),a=new Date(t),s=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),1));for(s.getTime()<t&&(s=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+1,1)));s.getTime()<=e&&o.length<24;)o.push(s.getTime()),s=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+i,1))}else{let i=n>=1728e5?864e5:n>=72e5?36e5:6e4,a=i===864e5?[1,2,7,14]:i===36e5?[1,2,3,6,12]:[1,2,5,10,15,30],s=n/i/r,c=(a.find(l=>l>=s)??Math.ceil(s))*i;for(let l=Math.ceil(t/c)*c;l<=e&&o.length<24;l+=c)o.push(l)}return o.length>=2?o:void 0}function hW(t,e){let r=1/0,n=-1/0;for(let o of t){let i=o[e];if(i==null||i==="")continue;let a=typeof i=="number"?i:new Date(String(i)).getTime();Number.isNaN(a)||(a<r&&(r=a),a>n&&(n=a))}return ant(r,n)}var va=class extends Error{},snt=t=>{if(t==null||t==="")return;let e=Number(t);return Number.isNaN(e)?void 0:e},lnt=t=>{if(t==null||t==="")return;if(typeof t=="number")return t;let e=new Date(t).getTime();return Number.isNaN(e)?void 0:e},cnt=(t,e="en-US")=>{let r=typeof t=="number"?t:Number(t),n=Number.isFinite(r)?r:new Date(String(t)).getTime();if(!Number.isFinite(n))return String(t);let o=new Date(n),i=o.getUTCHours()===0&&o.getUTCMinutes()===0?o.getUTCDate()===1?{year:"numeric",month:"short"}:{month:"short",day:"numeric"}:{hour:"2-digit",minute:"2-digit"};return o.toLocaleString(e,{...i,timeZone:"UTC"})},gy=(t,e="en-US")=>{let r=Number(t);return Number.isFinite(r)?r.toLocaleString(e,{maximumFractionDigits:6}):String(t)};function unt(t,e){if("$field"in t){let{$field:r,as:n}=t;return n==="number"?o=>snt(o?.[r]):n==="date"?o=>lnt(o?.[r]):o=>o?.[r]}if("$index"in t)return(r,n)=>n;if("$const"in t)return()=>t.$const;if("$dateTickFormat"in t)return r=>cnt(r,e);if("$numTickFormat"in t)return r=>gy(r,e);if("$lookup"in t){let r=t.$lookup;return n=>r[Math.round(Number(n))%r.length]??String(n)}if("$format"in t){let{field:r,prefix:n="",suffix:o=""}=t.$format;return i=>{let a=i?.[r];return a==null?"":`${n}${gy(a,e)}${o}`}}if("$mapField"in t){let{field:r,mapping:n,fallback:o}=t.$mapField;return i=>n[String(i?.[r])]??o}return t}function gi(t,e){if(fW(t))return unt(t,e);if(Array.isArray(t))return t.map(r=>gi(r,e));if(typeof t=="object"&&t!==null){let r={};for(let[n,o]of Object.entries(t))r[n]=gi(o,e);return r}return t}var pW=new Set(["Line","Area","GroupedBar","StackedBar","Scatter","Timeline","Boxplot","XYLabels","Plotband","Plotline"]),fnt=new Set(["Donut","NestedDonut","RadialBar","Sankey","Heatmap","Treemap","ChordDiagram","Graph","TopoJSONMap"]),hnt=new Set(["Graph"]);function dW(t,e,r,n){if(!(pW.has(e.type)||fnt.has(e.type)))throw new va(`Unsupported component type: ${e.type}`);let i=Object.prototype.hasOwnProperty.call(t,e.type)?t[e.type]:void 0;if(typeof i!="function")throw new va(`Component ${e.type} is not available in this bundle \u2014 regenerate the document for this chart type`);let a=gi(e.config,n);a.duration=r.duration??0,hnt.has(e.type)&&r.onComponentComplete&&(a.onRenderComplete=r.onComponentComplete);let s=a.projection;if(s?.$mapProjection){let c=t.MapProjection,l=c&&Object.prototype.hasOwnProperty.call(c,s.$mapProjection)?c[s.$mapProjection]:void 0;if(typeof l!="function")throw new va(`Unknown map projection: ${s.$mapProjection}`);a.projection=l()}return new i(a)}function mW(t,e,r={}){if(e.specVersion!==void 0){let c=p=>{let g=/^(\d+)\.(\d+)$/.exec(String(p));return g?[Number(g[1]),Number(g[2])]:[Number.POSITIVE_INFINITY,0]},[l,u]=c(e.specVersion),[f,h]=c("0.1");if(l>f||l===0&&f===0&&u>h)throw new va(`Chart spec version ${e.specVersion} is newer than this renderer supports (${"0.1"}) \u2014 upgrade @unovis/mcp`)}let n=e.locale,o=gi(e.containerConfig??{},n),i=r.duration??0,a=r.responsive?{}:{width:e.width,height:e.height};if(e.container==="xy"){let c=e.components.map(u=>{if(!pW.has(u.type))throw new va(`${u.type} cannot be used in an XY container`);return dW(t,u,r,n)}),l=(u,f)=>{if(u)return new t.Axis({...gi(u,n),type:f,duration:i})};if(e.xAxis&&"$dateTickFormat"in(e.xAxis.tickFormat??{})&&e.xAxis.tickValues===void 0){let u=e.components[0]?.config?.x?.$field,f=Array.isArray(e.data)?e.data:void 0;if(u&&f){let h=hW(f,u);h&&(e={...e,xAxis:{...e.xAxis,tickValues:h}})}}return{containerType:"xy",containerConfig:{...o,components:c,xAxis:l(e.xAxis,"x"),yAxis:l(e.yAxis,"y"),...a,duration:i,onRenderComplete:r.onRenderComplete},data:e.data}}if(e.components.length!==1)throw new va("single container requires exactly one component");let s=dW(t,e.components[0],r,n);return{containerType:"single",containerConfig:{...o,component:s,...a,duration:i,onRenderComplete:r.onRenderComplete},data:e.data}}var JC=t=>String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),dnt=(t,e)=>t==null?"\u2014":typeof t=="number"?gy(t,e):JC(t),ba=(t,e,r)=>`<div class="uv-tt-row"><span class="uv-tt-key">${JC(t)}</span><span class="uv-tt-val">${dnt(e,r)}</span></div>`,Do=t=>`<div class="uv-tt-title">${JC(t)}</div>`;function gW(t){let e=[],r=n=>{if(Array.isArray(n)){n.forEach(r);return}if(typeof n=="object"&&n!==null){let o=n;if(typeof o.$field=="string"){e.includes(o.$field)||e.push(o.$field);return}Object.values(n).forEach(r)}};return r(t),e}var pnt=t=>Object.entries(t??{}).filter(([e,r])=>!e.startsWith("_")&&(r===null||typeof r!="object"));function mnt(t,e,r){return n=>{if(!n)return"";let o=e&&n[e]!==void 0?Do(n[e]):"",i=t.length?t.filter(a=>n[a]!==void 0).map(a=>ba(a,n[a],r)):pnt(n).map(([a,s])=>ba(a,s,r));return`${o}${i.join("")}`||Do("no data")}}function xW(t,e){let r={},n={};for(let s of e.components){if(!t[s.type])continue;let c=gW(s.config),l=mnt(c,void 0,e.locale);switch(s.type){case"Line":case"Area":break;case"GroupedBar":case"StackedBar":{let u=s.type==="StackedBar"?t.StackedBar:t.GroupedBar;n[u.selectors.bar]=l;break}case"Scatter":n[t.Scatter.selectors.point]=l;break;case"Boxplot":n[t.Boxplot.selectors.box]=l;break;case"Timeline":n[t.Timeline.selectors.line]=l;break;case"Donut":n[t.Donut.selectors.segment]=u=>l(u?.data??u);break;case"NestedDonut":n[t.NestedDonut.selectors.segment]=u=>`${Do(u?.data?.key??"")}${ba("value",u?.value??u?.data?.value)}`;break;case"RadialBar":n[t.RadialBar.selectors.segment]=u=>l(u?.data??u);break;case"Heatmap":n[t.Heatmap.selectors.node]=l;break;case"Treemap":n[t.Treemap.selectors.tile]=u=>`${Do(u?.data?.key??u?.key??"")}${ba("value",u?.value)}`;break;case"Sankey":n[t.Sankey.selectors.node]=u=>`${Do(u?.label??u?.id??"")}${ba("total",u?.value)}`,n[t.Sankey.selectors.link]=u=>`${Do(`${u?.source?.label??u?.source?.id??""} \u2192 ${u?.target?.label??u?.target?.id??""}`)}${ba("value",u?.value)}`;break;case"ChordDiagram":n[t.ChordDiagram.selectors.node]=u=>Do(u?.data?.label??u?.key??"");break;case"Graph":n[t.Graph.selectors.node]=u=>l(u?._state?u:u?.data??u),n[t.Graph.selectors.link]=u=>Do(`${u?.source?.id??""} \u2192 ${u?.target?.id??""}`);break;case"TopoJSONMap":n[t.TopoJSONMap.selectors.feature]=u=>{let f=u?.data??u;return!f?.id&&!f?.name?"":`${Do(f.name??f.id)}${f.value!==void 0?ba("value",f.value):""}`};break}}let o=e.components.find(s=>s.type==="Line"||s.type==="Area"),i=e.container==="xy"&&!!o;if((Object.keys(n).length||i)&&(r.tooltip=new t.Tooltip({triggers:n,horizontalPlacement:"center"})),i&&o){let s=gi(o.config.x,e.locale),c=gW(o.config).filter(h=>h!==o.config.x?.$field),l=e.legend?.map(h=>h.name)??c,u=o.config.x?.$field,f=e.xAxis?.tickFormat?gi(e.xAxis.tickFormat,e.locale):void 0;r.crosshair=new t.Crosshair({x:s,y:gi(o.config.y,e.locale),template:h=>{let d=u?h?.[u]:void 0,p=d!==void 0?Do(f?f(d):d):"",g=c.map((m,x)=>ba(l[x]??m,h?.[m],e.locale));return`${p}${g.join("")}`}})}let a=e.legend?.length?e.legend.map(s=>({name:s.name,color:s.color})):void 0;return{containerConfig:r,legendItems:a}}var to=t=>{if(t===null||typeof t!="object")return t;let e={};for(let[r,n]of Object.entries(t))r.startsWith("_")||(n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(e[r]=n);return e},yW={GroupedBar:t=>to(t?.datum??t),StackedBar:t=>to(t?.datum??t),Scatter:t=>to(t?.datum??t),Boxplot:t=>to(t?.datum??t),Timeline:t=>to(t?.datum??t),Donut:t=>to(t?.data??t),NestedDonut:t=>({key:t?.data?.key,value:t?.value??t?.data?.value}),RadialBar:t=>to(t?.data??t),Heatmap:t=>to(t?.datum??t),Treemap:t=>({key:t?.data?.key??t?.key,value:t?.value}),Sankey:t=>t?.source||t?.target?{source:t?.source?.label??t?.source?.id,target:t?.target?.label??t?.target?.id,value:t?.value}:{id:t?.id,label:t?.label,value:t?.value},ChordDiagram:t=>({label:t?.data?.label??t?.key,value:t?.value??t?.data?.value}),Graph:t=>t?.source||t?.target?{source:t?.source?.id,target:t?.target?.id}:to(t?._state?t:t?.data??t),TopoJSONMap:t=>to(t?.data??t)};function gnt(t,e){if(!t[e])return[];switch(e){case"GroupedBar":return[t.GroupedBar.selectors.bar];case"StackedBar":return[t.StackedBar.selectors.bar];case"Scatter":return[t.Scatter.selectors.point];case"Boxplot":return[t.Boxplot.selectors.box];case"Timeline":return[t.Timeline.selectors.line];case"Donut":return[t.Donut.selectors.segment];case"NestedDonut":return[t.NestedDonut.selectors.segment];case"RadialBar":return[t.RadialBar.selectors.segment];case"Heatmap":return[t.Heatmap.selectors.node];case"Treemap":return[t.Treemap.selectors.tile];case"Sankey":return[t.Sankey.selectors.node,t.Sankey.selectors.link];case"ChordDiagram":return[t.ChordDiagram.selectors.node];case"Graph":return[t.Graph.selectors.node,t.Graph.selectors.link];case"TopoJSONMap":return[t.TopoJSONMap.selectors.feature];default:return[]}}function vW(t,e,r,n){let o=gnt(t,e.type);if(!o.length)return;let i=Object.prototype.hasOwnProperty.call(yW,e.type)?yW[e.type]:void 0,a=typeof i=="function"?i:to,s={};for(let c of o)s[c]={click:l=>n({component:e.type,componentIndex:r,event:"click",datum:a(l)})};return s}function SW(t,e){let r=document.createElement("div");r.className="uv-error",r.textContent=e,t.replaceChildren(r)}var bW="1.7.0",_W="data-theme";function tA(t){let e=document.documentElement;t==="dark"?e.setAttribute(_W,"dark"):e.removeAttribute(_W)}function xnt(t,e){e?.forEach((r,n)=>{t.style.setProperty(`--vis-color${n}`,r),t.style.setProperty(`--vis-dark-color${n}`,r)})}function eA(t,e,r={}){if(e.innerHTML="",e.classList.add("uv-root"),tA(t.theme),xnt(e,t.colors),r.showTitle!==!1&&t.title){let h=document.createElement("div");h.className="uv-title",h.textContent=t.title,e.appendChild(h)}let n=py,{containerConfig:o,legendItems:i}=xW(n,t),a=r.onEvent;a&&(t={...t,components:t.components.map((h,d)=>{let p=vW(n,h,d,a);return p?{...h,config:{...h.config,events:p}}:h})});let s;if(i?.length){let h=document.createElement("div");h.className="uv-legend",e.appendChild(h),s=new dy(h,{items:i})}let c=document.createElement("div");c.className="uv-chart",e.appendChild(c);let l=mW(n,t,{duration:r.duration??400,responsive:!0}),u={...l.containerConfig,...o},f=l.containerType==="xy"?new bl(c,u,l.data):new El(c,u,l.data);return{element:e,destroy:()=>{try{f.destroy(),s?.destroy?.()}finally{e.innerHTML=""}}}}var ynt="2026-01-26",wW="unovis-ui-init";function CW(){let t=document.getElementById("uv-embed-root")??document.body,e,r,n,o=!1,i=p=>{let g=window.ReactNativeWebView;g?g.postMessage(JSON.stringify(p)):window.parent?.postMessage(p,"*")},a=()=>{i({type:"unovis:size",width:t.scrollWidth,height:t.scrollHeight}),i({jsonrpc:"2.0",method:"ui/notifications/size-changed",params:{width:t.scrollWidth,height:t.scrollHeight}})},s=(p,g)=>{e?.destroy();try{let{events:m,...x}=g??{};m&&(x.onEvent=v=>i({type:"unovis:event",...v})),e=eA(p,t,x),r=p,n=g,a()}catch(m){SW(t,String(m instanceof Error?m.message:m))}},c=p=>{p!=="dark"&&p!=="light"||(r?s({...r,theme:p},n):tA(p))},l=p=>{if(p.jsonrpc!=="2.0")return!1;if(p.id===wW&&p.result)return o=!0,c(p.result.hostContext?.theme),i({jsonrpc:"2.0",method:"ui/notifications/initialized"}),!0;if(p.method==="ui/notifications/tool-result"){let g=p.params?.structuredContent?.spec;return g&&s(g,{events:!0}),!0}return p.method==="ui/notifications/host-context-changed"?(c(p.params?.hostContext?.theme),!0):(p.method==="ping"&&p.id!==void 0&&i({jsonrpc:"2.0",id:p.id,result:{}}),!0)},u=p=>{let g=p.data,m;if(typeof g=="string")try{m=JSON.parse(g)}catch{return}else m=g;l(m)||(m?.type==="unovis:render"&&m.spec&&s(m.spec,m.options),m?.type==="unovis:theme"&&(m.theme==="light"||m.theme==="dark")&&(r?s({...r,theme:m.theme},n):tA(m.theme)))};window.addEventListener("message",u),document.addEventListener("message",u),i({type:"unovis:ready",version:bW,specVersion:"0.1"});let f=()=>i({jsonrpc:"2.0",id:wW,method:"ui/initialize",params:{protocolVersion:ynt,appInfo:{name:"unovis-chart-widget",version:bW},appCapabilities:{}}});f();let h=0,d=setInterval(()=>{if(o||++h>8){clearInterval(d);return}f()},500)}function kW(){let t=document.getElementById("uv-spec"),e=document.getElementById("uv-options"),r=document.getElementById("uv-root");if(!(!t?.textContent||!r))try{let n=e?.textContent?JSON.parse(e.textContent):{};eA(JSON.parse(t.textContent),r,n)}catch(n){SW(r,`Failed to render chart: ${String(n instanceof Error?n.message:n)}`)}}window.UnovisChart={render:eA,startEmbed:CW,unovis:py};window.location.hash==="#embed"?CW():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",kW):kW();})();
1782
+ `;var uW=class{constructor(e,r){this._defaultConfig=sW,this.config=this._defaultConfig,this._colorAccessor=n=>n.color,this._container=e,this.div=r?.renderIntoProvidedDomNode?j(this._container):j(this._container).append("div"),this.div.classed(uy,!0),this.element=this.div.node(),this.setConfig(r)}setConfig(e){this.prevConfig=this.config,this.config=Oe(this._defaultConfig,e),this.render()}update(e){this.setConfig(e)}render(){let{config:e}=this,r=this.div.selectAll(`.${Dd}`).data(e.items),n=r.enter().append("div").on("click",this._onItemClick.bind(this)),o=n.merge(r);o.attr("class",i=>`${Dd} ${i.className??""}`).classed(ZC,e.orientation===Xf.Vertical).classed(KC,i=>!!e.onLegendItemClick&&this._isItemClickable(i)).attr("title",i=>i.name).style("display",i=>i.hidden?"none":null),n.append("span").attr("class",hy).call(lW),o.select(`.${hy}`).style("width",function(i){let s=(Array.isArray(i.color)?i.color:[i.color]).length,c=e.bulletSize?lr(e.bulletSize):Ft("var(--vis-legend-bullet-size)",this)||9,l=e.bulletSpacing;return`${jC(c,s,l)}px`}).style("height",e.bulletSize).style("box-sizing","content-box").call(cW,this.config,this._colorAccessor,e.colorFunction),n.append("span").attr("class",fy).classed(e.labelClassName,!0).style("max-width",e.labelMaxWidth).style("font-size",e.labelFontSize),o.select(`.${fy}`).text(i=>i.name),r.exit().remove()}_isItemClickable(e){return e.pointer===void 0?!0:e.pointer}_onItemClick(e,r){let{config:{onLegendItemClick:n}}=this,i=this.div.selectAll(`.${Dd}`).nodes().indexOf(e.currentTarget);n&&n(r,i)}destroy(){this.element!==this._container&&this.div.remove()}};uW.selectors=QC;var dy=uW;var fW=t=>typeof t!="object"||t===null||Array.isArray(t)?!1:Object.keys(t).some(r=>["$field","$index","$const","$dateTickFormat","$numTickFormat","$lookup","$format","$mapField"].includes(r));function ant(t,e,r=7){let n=e-t;if(!Number.isFinite(n)||n<=0)return;let o=[];if(n>=60*864e5){let i=Math.max(1,Math.ceil(n/2592e6/r)),a=new Date(t),s=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth(),1));for(s.getTime()<t&&(s=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+1,1)));s.getTime()<=e&&o.length<24;)o.push(s.getTime()),s=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth()+i,1))}else{let i=n>=1728e5?864e5:n>=72e5?36e5:6e4,a=i===864e5?[1,2,7,14]:i===36e5?[1,2,3,6,12]:[1,2,5,10,15,30],s=n/i/r,c=(a.find(l=>l>=s)??Math.ceil(s))*i;for(let l=Math.ceil(t/c)*c;l<=e&&o.length<24;l+=c)o.push(l)}return o.length>=2?o:void 0}function hW(t,e){let r=1/0,n=-1/0;for(let o of t){let i=o[e];if(i==null||i==="")continue;let a=typeof i=="number"?i:new Date(String(i)).getTime();Number.isNaN(a)||(a<r&&(r=a),a>n&&(n=a))}return ant(r,n)}var va=class extends Error{},snt=t=>{if(t==null||t==="")return;let e=Number(t);return Number.isNaN(e)?void 0:e},lnt=t=>{if(t==null||t==="")return;if(typeof t=="number")return t;let e=new Date(t).getTime();return Number.isNaN(e)?void 0:e},cnt=(t,e="en-US")=>{let r=typeof t=="number"?t:Number(t),n=Number.isFinite(r)?r:new Date(String(t)).getTime();if(!Number.isFinite(n))return String(t);let o=new Date(n),i=o.getUTCHours()===0&&o.getUTCMinutes()===0?o.getUTCDate()===1?{year:"numeric",month:"short"}:{month:"short",day:"numeric"}:{hour:"2-digit",minute:"2-digit"};return o.toLocaleString(e,{...i,timeZone:"UTC"})},gy=(t,e="en-US")=>{let r=Number(t);return Number.isFinite(r)?r.toLocaleString(e,{maximumFractionDigits:6}):String(t)};function unt(t,e){if("$field"in t){let{$field:r,as:n}=t;return n==="number"?o=>snt(o?.[r]):n==="date"?o=>lnt(o?.[r]):o=>o?.[r]}if("$index"in t)return(r,n)=>n;if("$const"in t)return()=>t.$const;if("$dateTickFormat"in t)return r=>cnt(r,e);if("$numTickFormat"in t)return r=>gy(r,e);if("$lookup"in t){let r=t.$lookup;return n=>r[Math.round(Number(n))%r.length]??String(n)}if("$format"in t){let{field:r,prefix:n="",suffix:o=""}=t.$format;return i=>{let a=i?.[r];return a==null?"":`${n}${gy(a,e)}${o}`}}if("$mapField"in t){let{field:r,mapping:n,fallback:o}=t.$mapField;return i=>n[String(i?.[r])]??o}return t}function gi(t,e){if(fW(t))return unt(t,e);if(Array.isArray(t))return t.map(r=>gi(r,e));if(typeof t=="object"&&t!==null){let r={};for(let[n,o]of Object.entries(t))r[n]=gi(o,e);return r}return t}var pW=new Set(["Line","Area","GroupedBar","StackedBar","Scatter","Timeline","Boxplot","XYLabels","Plotband","Plotline"]),fnt=new Set(["Donut","NestedDonut","RadialBar","Sankey","Heatmap","Treemap","ChordDiagram","Graph","TopoJSONMap"]),hnt=new Set(["Graph"]);function dW(t,e,r,n){if(!(pW.has(e.type)||fnt.has(e.type)))throw new va(`Unsupported component type: ${e.type}`);let i=Object.prototype.hasOwnProperty.call(t,e.type)?t[e.type]:void 0;if(typeof i!="function")throw new va(`Component ${e.type} is not available in this bundle \u2014 regenerate the document for this chart type`);let a=gi(e.config,n);a.duration=r.duration??0,hnt.has(e.type)&&r.onComponentComplete&&(a.onRenderComplete=r.onComponentComplete);let s=a.projection;if(s?.$mapProjection){let c=t.MapProjection,l=c&&Object.prototype.hasOwnProperty.call(c,s.$mapProjection)?c[s.$mapProjection]:void 0;if(typeof l!="function")throw new va(`Unknown map projection: ${s.$mapProjection}`);a.projection=l()}return new i(a)}function mW(t,e,r={}){if(e.specVersion!==void 0){let c=p=>{let g=/^(\d+)\.(\d+)$/.exec(String(p));return g?[Number(g[1]),Number(g[2])]:[Number.POSITIVE_INFINITY,0]},[l,u]=c(e.specVersion),[f,h]=c("0.1");if(l>f||l===0&&f===0&&u>h)throw new va(`Chart spec version ${e.specVersion} is newer than this renderer supports (${"0.1"}) \u2014 upgrade @unovis/mcp`)}let n=e.locale,o=gi(e.containerConfig??{},n),i=r.duration??0,a=r.responsive?{}:{width:e.width,height:e.height};if(e.container==="xy"){let c=e.components.map(u=>{if(!pW.has(u.type))throw new va(`${u.type} cannot be used in an XY container`);return dW(t,u,r,n)}),l=(u,f)=>{if(u)return new t.Axis({...gi(u,n),type:f,duration:i})};if(e.xAxis&&"$dateTickFormat"in(e.xAxis.tickFormat??{})&&e.xAxis.tickValues===void 0){let u=e.components[0]?.config?.x?.$field,f=Array.isArray(e.data)?e.data:void 0;if(u&&f){let h=hW(f,u);h&&(e={...e,xAxis:{...e.xAxis,tickValues:h}})}}return{containerType:"xy",containerConfig:{...o,components:c,xAxis:l(e.xAxis,"x"),yAxis:l(e.yAxis,"y"),...a,duration:i,onRenderComplete:r.onRenderComplete},data:e.data}}if(e.components.length!==1)throw new va("single container requires exactly one component");let s=dW(t,e.components[0],r,n);return{containerType:"single",containerConfig:{...o,component:s,...a,duration:i,onRenderComplete:r.onRenderComplete},data:e.data}}var JC=t=>String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),dnt=(t,e)=>t==null?"\u2014":typeof t=="number"?gy(t,e):JC(t),ba=(t,e,r)=>`<div class="uv-tt-row"><span class="uv-tt-key">${JC(t)}</span><span class="uv-tt-val">${dnt(e,r)}</span></div>`,Do=t=>`<div class="uv-tt-title">${JC(t)}</div>`;function gW(t){let e=[],r=n=>{if(Array.isArray(n)){n.forEach(r);return}if(typeof n=="object"&&n!==null){let o=n;if(typeof o.$field=="string"){e.includes(o.$field)||e.push(o.$field);return}Object.values(n).forEach(r)}};return r(t),e}var pnt=t=>Object.entries(t??{}).filter(([e,r])=>!e.startsWith("_")&&(r===null||typeof r!="object"));function mnt(t,e,r){return n=>{if(!n)return"";let o=e&&n[e]!==void 0?Do(n[e]):"",i=t.length?t.filter(a=>n[a]!==void 0).map(a=>ba(a,n[a],r)):pnt(n).map(([a,s])=>ba(a,s,r));return`${o}${i.join("")}`||Do("no data")}}function xW(t,e){let r={},n={};for(let s of e.components){if(!t[s.type])continue;let c=gW(s.config),l=mnt(c,void 0,e.locale);switch(s.type){case"Line":case"Area":break;case"GroupedBar":case"StackedBar":{let u=s.type==="StackedBar"?t.StackedBar:t.GroupedBar;n[u.selectors.bar]=l;break}case"Scatter":n[t.Scatter.selectors.point]=l;break;case"Boxplot":n[t.Boxplot.selectors.box]=l;break;case"Timeline":n[t.Timeline.selectors.line]=l;break;case"Donut":n[t.Donut.selectors.segment]=u=>l(u?.data??u);break;case"NestedDonut":n[t.NestedDonut.selectors.segment]=u=>`${Do(u?.data?.key??"")}${ba("value",u?.value??u?.data?.value)}`;break;case"RadialBar":n[t.RadialBar.selectors.segment]=u=>l(u?.data??u);break;case"Heatmap":n[t.Heatmap.selectors.node]=l;break;case"Treemap":n[t.Treemap.selectors.tile]=u=>`${Do(u?.data?.key??u?.key??"")}${ba("value",u?.value)}`;break;case"Sankey":n[t.Sankey.selectors.node]=u=>`${Do(u?.label??u?.id??"")}${ba("total",u?.value)}`,n[t.Sankey.selectors.link]=u=>`${Do(`${u?.source?.label??u?.source?.id??""} \u2192 ${u?.target?.label??u?.target?.id??""}`)}${ba("value",u?.value)}`;break;case"ChordDiagram":n[t.ChordDiagram.selectors.node]=u=>Do(u?.data?.label??u?.key??"");break;case"Graph":n[t.Graph.selectors.node]=u=>l(u?._state?u:u?.data??u),n[t.Graph.selectors.link]=u=>Do(`${u?.source?.id??""} \u2192 ${u?.target?.id??""}`);break;case"TopoJSONMap":n[t.TopoJSONMap.selectors.feature]=u=>{let f=u?.data??u;return!f?.id&&!f?.name?"":`${Do(f.name??f.id)}${f.value!==void 0?ba("value",f.value):""}`};break}}let o=e.components.find(s=>s.type==="Line"||s.type==="Area"),i=e.container==="xy"&&!!o;if((Object.keys(n).length||i)&&(r.tooltip=new t.Tooltip({triggers:n,horizontalPlacement:"center"})),i&&o){let s=gi(o.config.x,e.locale),c=gW(o.config).filter(h=>h!==o.config.x?.$field),l=e.legend?.map(h=>h.name)??c,u=o.config.x?.$field,f=e.xAxis?.tickFormat?gi(e.xAxis.tickFormat,e.locale):void 0;r.crosshair=new t.Crosshair({x:s,y:gi(o.config.y,e.locale),template:h=>{let d=u?h?.[u]:void 0,p=d!==void 0?Do(f?f(d):d):"",g=c.map((m,x)=>ba(l[x]??m,h?.[m],e.locale));return`${p}${g.join("")}`}})}let a=e.legend?.length?e.legend.map(s=>({name:s.name,color:s.color})):void 0;return{containerConfig:r,legendItems:a}}var to=t=>{if(t===null||typeof t!="object")return t;let e={};for(let[r,n]of Object.entries(t))r.startsWith("_")||(n===null||typeof n=="string"||typeof n=="number"||typeof n=="boolean")&&(e[r]=n);return e},yW={GroupedBar:t=>to(t?.datum??t),StackedBar:t=>to(t?.datum??t),Scatter:t=>to(t?.datum??t),Boxplot:t=>to(t?.datum??t),Timeline:t=>to(t?.datum??t),Donut:t=>to(t?.data??t),NestedDonut:t=>({key:t?.data?.key,value:t?.value??t?.data?.value}),RadialBar:t=>to(t?.data??t),Heatmap:t=>to(t?.datum??t),Treemap:t=>({key:t?.data?.key??t?.key,value:t?.value}),Sankey:t=>t?.source||t?.target?{source:t?.source?.label??t?.source?.id,target:t?.target?.label??t?.target?.id,value:t?.value}:{id:t?.id,label:t?.label,value:t?.value},ChordDiagram:t=>({label:t?.data?.label??t?.key,value:t?.value??t?.data?.value}),Graph:t=>t?.source||t?.target?{source:t?.source?.id,target:t?.target?.id}:to(t?._state?t:t?.data??t),TopoJSONMap:t=>to(t?.data??t)};function gnt(t,e){if(!t[e])return[];switch(e){case"GroupedBar":return[t.GroupedBar.selectors.bar];case"StackedBar":return[t.StackedBar.selectors.bar];case"Scatter":return[t.Scatter.selectors.point];case"Boxplot":return[t.Boxplot.selectors.box];case"Timeline":return[t.Timeline.selectors.line];case"Donut":return[t.Donut.selectors.segment];case"NestedDonut":return[t.NestedDonut.selectors.segment];case"RadialBar":return[t.RadialBar.selectors.segment];case"Heatmap":return[t.Heatmap.selectors.node];case"Treemap":return[t.Treemap.selectors.tile];case"Sankey":return[t.Sankey.selectors.node,t.Sankey.selectors.link];case"ChordDiagram":return[t.ChordDiagram.selectors.node];case"Graph":return[t.Graph.selectors.node,t.Graph.selectors.link];case"TopoJSONMap":return[t.TopoJSONMap.selectors.feature];default:return[]}}function vW(t,e,r,n){let o=gnt(t,e.type);if(!o.length)return;let i=Object.prototype.hasOwnProperty.call(yW,e.type)?yW[e.type]:void 0,a=typeof i=="function"?i:to,s={};for(let c of o)s[c]={click:l=>n({component:e.type,componentIndex:r,event:"click",datum:a(l)})};return s}function SW(t,e){let r=document.createElement("div");r.className="uv-error",r.textContent=e,t.replaceChildren(r)}var bW="1.7.1",_W="data-theme";function tA(t){let e=document.documentElement;t==="dark"?e.setAttribute(_W,"dark"):e.removeAttribute(_W)}function xnt(t,e){e?.forEach((r,n)=>{t.style.setProperty(`--vis-color${n}`,r),t.style.setProperty(`--vis-dark-color${n}`,r)})}function eA(t,e,r={}){if(e.innerHTML="",e.classList.add("uv-root"),tA(t.theme),xnt(e,t.colors),r.showTitle!==!1&&t.title){let h=document.createElement("div");h.className="uv-title",h.textContent=t.title,e.appendChild(h)}let n=py,{containerConfig:o,legendItems:i}=xW(n,t),a=r.onEvent;a&&(t={...t,components:t.components.map((h,d)=>{let p=vW(n,h,d,a);return p?{...h,config:{...h.config,events:p}}:h})});let s;if(i?.length){let h=document.createElement("div");h.className="uv-legend",e.appendChild(h),s=new dy(h,{items:i})}let c=document.createElement("div");c.className="uv-chart",e.appendChild(c);let l=mW(n,t,{duration:r.duration??400,responsive:!0}),u={...l.containerConfig,...o},f=l.containerType==="xy"?new bl(c,u,l.data):new El(c,u,l.data);return{element:e,destroy:()=>{try{f.destroy(),s?.destroy?.()}finally{e.innerHTML=""}}}}var ynt="2026-01-26",wW="unovis-ui-init";function CW(){let t=document.getElementById("uv-embed-root")??document.body,e,r,n,o=!1,i=p=>{let g=window.ReactNativeWebView;g?g.postMessage(JSON.stringify(p)):window.parent?.postMessage(p,"*")},a=()=>{i({type:"unovis:size",width:t.scrollWidth,height:t.scrollHeight}),i({jsonrpc:"2.0",method:"ui/notifications/size-changed",params:{width:t.scrollWidth,height:t.scrollHeight}})},s=(p,g)=>{e?.destroy();try{let{events:m,...x}=g??{};m&&(x.onEvent=v=>i({type:"unovis:event",...v})),e=eA(p,t,x),r=p,n=g,a()}catch(m){SW(t,String(m instanceof Error?m.message:m))}},c=p=>{p!=="dark"&&p!=="light"||(r?s({...r,theme:p},n):tA(p))},l=p=>{if(p.jsonrpc!=="2.0")return!1;if(p.id===wW&&p.result)return o=!0,c(p.result.hostContext?.theme),i({jsonrpc:"2.0",method:"ui/notifications/initialized"}),!0;if(p.method==="ui/notifications/tool-result"){let g=p.params?.structuredContent?.spec;return g&&s(g,{events:!0}),!0}return p.method==="ui/notifications/host-context-changed"?(c(p.params?.hostContext?.theme),!0):(p.method==="ping"&&p.id!==void 0&&i({jsonrpc:"2.0",id:p.id,result:{}}),!0)},u=p=>{let g=p.data,m;if(typeof g=="string")try{m=JSON.parse(g)}catch{return}else m=g;l(m)||(m?.type==="unovis:render"&&m.spec&&s(m.spec,m.options),m?.type==="unovis:theme"&&(m.theme==="light"||m.theme==="dark")&&(r?s({...r,theme:m.theme},n):tA(m.theme)))};window.addEventListener("message",u),document.addEventListener("message",u),i({type:"unovis:ready",version:bW,specVersion:"0.1"});let f=()=>i({jsonrpc:"2.0",id:wW,method:"ui/initialize",params:{protocolVersion:ynt,appInfo:{name:"unovis-chart-widget",version:bW},appCapabilities:{}}});f();let h=0,d=setInterval(()=>{if(o||++h>8){clearInterval(d);return}f()},500)}function kW(){let t=document.getElementById("uv-spec"),e=document.getElementById("uv-options"),r=document.getElementById("uv-root");if(!(!t?.textContent||!r))try{let n=e?.textContent?JSON.parse(e.textContent):{};eA(JSON.parse(t.textContent),r,n)}catch(n){SW(r,`Failed to render chart: ${String(n instanceof Error?n.message:n)}`)}}window.UnovisChart={render:eA,startEmbed:CW,unovis:py};window.location.hash==="#embed"?CW():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",kW):kW();})();
@@ -796,4 +796,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
796
796
  svg {
797
797
  display: block;
798
798
  }
799
- `;var G0=class{constructor(e,n){this._defaultConfig=W0,this.config=this._defaultConfig,this._colorAccessor=r=>r.color,this._container=e,this.div=n?.renderIntoProvidedDomNode?Y(this._container):Y(this._container).append("div"),this.div.classed(ll,!0),this.element=this.div.node(),this.setConfig(n)}setConfig(e){this.prevConfig=this.config,this.config=te(this._defaultConfig,e),this.render()}update(e){this.setConfig(e)}render(){let{config:e}=this,n=this.div.selectAll(`.${Vo}`).data(e.items),r=n.enter().append("div").on("click",this._onItemClick.bind(this)),i=r.merge(n);i.attr("class",o=>`${Vo} ${o.className??""}`).classed(Nf,e.orientation===Ro.Vertical).classed(Bf,o=>!!e.onLegendItemClick&&this._isItemClickable(o)).attr("title",o=>o.name).style("display",o=>o.hidden?"none":null),r.append("span").attr("class",ul).call(H0),i.select(`.${ul}`).style("width",function(o){let a=(Array.isArray(o.color)?o.color:[o.color]).length,c=e.bulletSize?ee(e.bulletSize):Dt("var(--vis-legend-bullet-size)",this)||9,l=e.bulletSpacing;return`${Of(c,a,l)}px`}).style("height",e.bulletSize).style("box-sizing","content-box").call(Y0,this.config,this._colorAccessor,e.colorFunction),r.append("span").attr("class",cl).classed(e.labelClassName,!0).style("max-width",e.labelMaxWidth).style("font-size",e.labelFontSize),i.select(`.${cl}`).text(o=>o.name),n.exit().remove()}_isItemClickable(e){return e.pointer===void 0?!0:e.pointer}_onItemClick(e,n){let{config:{onLegendItemClick:r}}=this,o=this.div.selectAll(`.${Vo}`).nodes().indexOf(e.currentTarget);r&&r(n,o)}destroy(){this.element!==this._container&&this.div.remove()}};G0.selectors=Pf;var fl=G0;var U0=t=>typeof t!="object"||t===null||Array.isArray(t)?!1:Object.keys(t).some(n=>["$field","$index","$const","$dateTickFormat","$numTickFormat","$lookup","$format","$mapField"].includes(n));function TS(t,e,n=7){let r=e-t;if(!Number.isFinite(r)||r<=0)return;let i=[];if(r>=60*864e5){let o=Math.max(1,Math.ceil(r/2592e6/n)),s=new Date(t),a=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),1));for(a.getTime()<t&&(a=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth()+1,1)));a.getTime()<=e&&i.length<24;)i.push(a.getTime()),a=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth()+o,1))}else{let o=r>=1728e5?864e5:r>=72e5?36e5:6e4,s=o===864e5?[1,2,7,14]:o===36e5?[1,2,3,6,12]:[1,2,5,10,15,30],a=r/o/n,c=(s.find(l=>l>=a)??Math.ceil(a))*o;for(let l=Math.ceil(t/c)*c;l<=e&&i.length<24;l+=c)i.push(l)}return i.length>=2?i:void 0}function X0(t,e){let n=1/0,r=-1/0;for(let i of t){let o=i[e];if(o==null||o==="")continue;let s=typeof o=="number"?o:new Date(String(o)).getTime();Number.isNaN(s)||(s<n&&(n=s),s>r&&(r=s))}return TS(n,r)}var Rn=class extends Error{},AS=t=>{if(t==null||t==="")return;let e=Number(t);return Number.isNaN(e)?void 0:e},CS=t=>{if(t==null||t==="")return;if(typeof t=="number")return t;let e=new Date(t).getTime();return Number.isNaN(e)?void 0:e},MS=(t,e="en-US")=>{let n=typeof t=="number"?t:Number(t),r=Number.isFinite(n)?n:new Date(String(t)).getTime();if(!Number.isFinite(r))return String(t);let i=new Date(r),o=i.getUTCHours()===0&&i.getUTCMinutes()===0?i.getUTCDate()===1?{year:"numeric",month:"short"}:{month:"short",day:"numeric"}:{hour:"2-digit",minute:"2-digit"};return i.toLocaleString(e,{...o,timeZone:"UTC"})},pl=(t,e="en-US")=>{let n=Number(t);return Number.isFinite(n)?n.toLocaleString(e,{maximumFractionDigits:6}):String(t)};function LS(t,e){if("$field"in t){let{$field:n,as:r}=t;return r==="number"?i=>AS(i?.[n]):r==="date"?i=>CS(i?.[n]):i=>i?.[n]}if("$index"in t)return(n,r)=>r;if("$const"in t)return()=>t.$const;if("$dateTickFormat"in t)return n=>MS(n,e);if("$numTickFormat"in t)return n=>pl(n,e);if("$lookup"in t){let n=t.$lookup;return r=>n[Math.round(Number(r))%n.length]??String(r)}if("$format"in t){let{field:n,prefix:r="",suffix:i=""}=t.$format;return o=>{let s=o?.[n];return s==null?"":`${r}${pl(s,e)}${i}`}}if("$mapField"in t){let{field:n,mapping:r,fallback:i}=t.$mapField;return o=>r[String(o?.[n])]??i}return t}function dn(t,e){if(U0(t))return LS(t,e);if(Array.isArray(t))return t.map(n=>dn(n,e));if(typeof t=="object"&&t!==null){let n={};for(let[r,i]of Object.entries(t))n[r]=dn(i,e);return n}return t}var j0=new Set(["Line","Area","GroupedBar","StackedBar","Scatter","Timeline","Boxplot","XYLabels","Plotband","Plotline"]),RS=new Set(["Donut","NestedDonut","RadialBar","Sankey","Heatmap","Treemap","ChordDiagram","Graph","TopoJSONMap"]),ES=new Set(["Graph"]);function q0(t,e,n,r){if(!(j0.has(e.type)||RS.has(e.type)))throw new Rn(`Unsupported component type: ${e.type}`);let o=Object.prototype.hasOwnProperty.call(t,e.type)?t[e.type]:void 0;if(typeof o!="function")throw new Rn(`Component ${e.type} is not available in this bundle \u2014 regenerate the document for this chart type`);let s=dn(e.config,r);s.duration=n.duration??0,ES.has(e.type)&&n.onComponentComplete&&(s.onRenderComplete=n.onComponentComplete);let a=s.projection;if(a?.$mapProjection){let c=t.MapProjection,l=c&&Object.prototype.hasOwnProperty.call(c,a.$mapProjection)?c[a.$mapProjection]:void 0;if(typeof l!="function")throw new Rn(`Unknown map projection: ${a.$mapProjection}`);s.projection=l()}return new o(s)}function Z0(t,e,n={}){if(e.specVersion!==void 0){let c=x=>{let p=/^(\d+)\.(\d+)$/.exec(String(x));return p?[Number(p[1]),Number(p[2])]:[Number.POSITIVE_INFINITY,0]},[l,u]=c(e.specVersion),[f,h]=c("0.1");if(l>f||l===0&&f===0&&u>h)throw new Rn(`Chart spec version ${e.specVersion} is newer than this renderer supports (${"0.1"}) \u2014 upgrade @unovis/mcp`)}let r=e.locale,i=dn(e.containerConfig??{},r),o=n.duration??0,s=n.responsive?{}:{width:e.width,height:e.height};if(e.container==="xy"){let c=e.components.map(u=>{if(!j0.has(u.type))throw new Rn(`${u.type} cannot be used in an XY container`);return q0(t,u,n,r)}),l=(u,f)=>{if(u)return new t.Axis({...dn(u,r),type:f,duration:o})};if(e.xAxis&&"$dateTickFormat"in(e.xAxis.tickFormat??{})&&e.xAxis.tickValues===void 0){let u=e.components[0]?.config?.x?.$field,f=Array.isArray(e.data)?e.data:void 0;if(u&&f){let h=X0(f,u);h&&(e={...e,xAxis:{...e.xAxis,tickValues:h}})}}return{containerType:"xy",containerConfig:{...i,components:c,xAxis:l(e.xAxis,"x"),yAxis:l(e.yAxis,"y"),...s,duration:o,onRenderComplete:n.onRenderComplete},data:e.data}}if(e.components.length!==1)throw new Rn("single container requires exactly one component");let a=q0(t,e.components[0],n,r);return{containerType:"single",containerConfig:{...i,component:a,...s,duration:o,onRenderComplete:n.onRenderComplete},data:e.data}}var Ff=t=>String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),DS=(t,e)=>t==null?"\u2014":typeof t=="number"?pl(t,e):Ff(t),En=(t,e,n)=>`<div class="uv-tt-row"><span class="uv-tt-key">${Ff(t)}</span><span class="uv-tt-val">${DS(e,n)}</span></div>`,je=t=>`<div class="uv-tt-title">${Ff(t)}</div>`;function K0(t){let e=[],n=r=>{if(Array.isArray(r)){r.forEach(n);return}if(typeof r=="object"&&r!==null){let i=r;if(typeof i.$field=="string"){e.includes(i.$field)||e.push(i.$field);return}Object.values(r).forEach(n)}};return n(t),e}var $S=t=>Object.entries(t??{}).filter(([e,n])=>!e.startsWith("_")&&(n===null||typeof n!="object"));function IS(t,e,n){return r=>{if(!r)return"";let i=e&&r[e]!==void 0?je(r[e]):"",o=t.length?t.filter(s=>r[s]!==void 0).map(s=>En(s,r[s],n)):$S(r).map(([s,a])=>En(s,a,n));return`${i}${o.join("")}`||je("no data")}}function Q0(t,e){let n={},r={};for(let a of e.components){if(!t[a.type])continue;let c=K0(a.config),l=IS(c,void 0,e.locale);switch(a.type){case"Line":case"Area":break;case"GroupedBar":case"StackedBar":{let u=a.type==="StackedBar"?t.StackedBar:t.GroupedBar;r[u.selectors.bar]=l;break}case"Scatter":r[t.Scatter.selectors.point]=l;break;case"Boxplot":r[t.Boxplot.selectors.box]=l;break;case"Timeline":r[t.Timeline.selectors.line]=l;break;case"Donut":r[t.Donut.selectors.segment]=u=>l(u?.data??u);break;case"NestedDonut":r[t.NestedDonut.selectors.segment]=u=>`${je(u?.data?.key??"")}${En("value",u?.value??u?.data?.value)}`;break;case"RadialBar":r[t.RadialBar.selectors.segment]=u=>l(u?.data??u);break;case"Heatmap":r[t.Heatmap.selectors.node]=l;break;case"Treemap":r[t.Treemap.selectors.tile]=u=>`${je(u?.data?.key??u?.key??"")}${En("value",u?.value)}`;break;case"Sankey":r[t.Sankey.selectors.node]=u=>`${je(u?.label??u?.id??"")}${En("total",u?.value)}`,r[t.Sankey.selectors.link]=u=>`${je(`${u?.source?.label??u?.source?.id??""} \u2192 ${u?.target?.label??u?.target?.id??""}`)}${En("value",u?.value)}`;break;case"ChordDiagram":r[t.ChordDiagram.selectors.node]=u=>je(u?.data?.label??u?.key??"");break;case"Graph":r[t.Graph.selectors.node]=u=>l(u?._state?u:u?.data??u),r[t.Graph.selectors.link]=u=>je(`${u?.source?.id??""} \u2192 ${u?.target?.id??""}`);break;case"TopoJSONMap":r[t.TopoJSONMap.selectors.feature]=u=>{let f=u?.data??u;return!f?.id&&!f?.name?"":`${je(f.name??f.id)}${f.value!==void 0?En("value",f.value):""}`};break}}let i=e.components.find(a=>a.type==="Line"||a.type==="Area"),o=e.container==="xy"&&!!i;if((Object.keys(r).length||o)&&(n.tooltip=new t.Tooltip({triggers:r,horizontalPlacement:"center"})),o&&i){let a=dn(i.config.x,e.locale),c=K0(i.config).filter(h=>h!==i.config.x?.$field),l=e.legend?.map(h=>h.name)??c,u=i.config.x?.$field,f=e.xAxis?.tickFormat?dn(e.xAxis.tickFormat,e.locale):void 0;n.crosshair=new t.Crosshair({x:a,y:dn(i.config.y,e.locale),template:h=>{let d=u?h?.[u]:void 0,x=d!==void 0?je(f?f(d):d):"",p=c.map((g,v)=>En(l[v]??g,h?.[g],e.locale));return`${x}${p.join("")}`}})}let s=e.legend?.length?e.legend.map(a=>({name:a.name,color:a.color})):void 0;return{containerConfig:n,legendItems:s}}var De=t=>{if(t===null||typeof t!="object")return t;let e={};for(let[n,r]of Object.entries(t))n.startsWith("_")||(r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")&&(e[n]=r);return e},J0={GroupedBar:t=>De(t?.datum??t),StackedBar:t=>De(t?.datum??t),Scatter:t=>De(t?.datum??t),Boxplot:t=>De(t?.datum??t),Timeline:t=>De(t?.datum??t),Donut:t=>De(t?.data??t),NestedDonut:t=>({key:t?.data?.key,value:t?.value??t?.data?.value}),RadialBar:t=>De(t?.data??t),Heatmap:t=>De(t?.datum??t),Treemap:t=>({key:t?.data?.key??t?.key,value:t?.value}),Sankey:t=>t?.source||t?.target?{source:t?.source?.label??t?.source?.id,target:t?.target?.label??t?.target?.id,value:t?.value}:{id:t?.id,label:t?.label,value:t?.value},ChordDiagram:t=>({label:t?.data?.label??t?.key,value:t?.value??t?.data?.value}),Graph:t=>t?.source||t?.target?{source:t?.source?.id,target:t?.target?.id}:De(t?._state?t:t?.data??t),TopoJSONMap:t=>De(t?.data??t)};function OS(t,e){if(!t[e])return[];switch(e){case"GroupedBar":return[t.GroupedBar.selectors.bar];case"StackedBar":return[t.StackedBar.selectors.bar];case"Scatter":return[t.Scatter.selectors.point];case"Boxplot":return[t.Boxplot.selectors.box];case"Timeline":return[t.Timeline.selectors.line];case"Donut":return[t.Donut.selectors.segment];case"NestedDonut":return[t.NestedDonut.selectors.segment];case"RadialBar":return[t.RadialBar.selectors.segment];case"Heatmap":return[t.Heatmap.selectors.node];case"Treemap":return[t.Treemap.selectors.tile];case"Sankey":return[t.Sankey.selectors.node,t.Sankey.selectors.link];case"ChordDiagram":return[t.ChordDiagram.selectors.node];case"Graph":return[t.Graph.selectors.node,t.Graph.selectors.link];case"TopoJSONMap":return[t.TopoJSONMap.selectors.feature];default:return[]}}function ty(t,e,n,r){let i=OS(t,e.type);if(!i.length)return;let o=Object.prototype.hasOwnProperty.call(J0,e.type)?J0[e.type]:void 0,s=typeof o=="function"?o:De,a={};for(let c of i)a[c]={click:l=>r({component:e.type,componentIndex:n,event:"click",datum:s(l)})};return a}function oy(t,e){let n=document.createElement("div");n.className="uv-error",n.textContent=e,t.replaceChildren(n)}var ey="1.7.0",ny="data-theme";function zf(t){let e=document.documentElement;t==="dark"?e.setAttribute(ny,"dark"):e.removeAttribute(ny)}function NS(t,e){e?.forEach((n,r)=>{t.style.setProperty(`--vis-color${r}`,n),t.style.setProperty(`--vis-dark-color${r}`,n)})}function Vf(t,e,n={}){if(e.innerHTML="",e.classList.add("uv-root"),zf(t.theme),NS(e,t.colors),n.showTitle!==!1&&t.title){let h=document.createElement("div");h.className="uv-title",h.textContent=t.title,e.appendChild(h)}let r=hl,{containerConfig:i,legendItems:o}=Q0(r,t),s=n.onEvent;s&&(t={...t,components:t.components.map((h,d)=>{let x=ty(r,h,d,s);return x?{...h,config:{...h.config,events:x}}:h})});let a;if(o?.length){let h=document.createElement("div");h.className="uv-legend",e.appendChild(h),a=new fl(h,{items:o})}let c=document.createElement("div");c.className="uv-chart",e.appendChild(c);let l=Z0(r,t,{duration:n.duration??400,responsive:!0}),u={...l.containerConfig,...i},f=l.containerType==="xy"?new jr(c,u,l.data):new ri(c,u,l.data);return{element:e,destroy:()=>{try{f.destroy(),a?.destroy?.()}finally{e.innerHTML=""}}}}var BS="2026-01-26",ry="unovis-ui-init";function sy(){let t=document.getElementById("uv-embed-root")??document.body,e,n,r,i=!1,o=x=>{let p=window.ReactNativeWebView;p?p.postMessage(JSON.stringify(x)):window.parent?.postMessage(x,"*")},s=()=>{o({type:"unovis:size",width:t.scrollWidth,height:t.scrollHeight}),o({jsonrpc:"2.0",method:"ui/notifications/size-changed",params:{width:t.scrollWidth,height:t.scrollHeight}})},a=(x,p)=>{e?.destroy();try{let{events:g,...v}=p??{};g&&(v.onEvent=b=>o({type:"unovis:event",...b})),e=Vf(x,t,v),n=x,r=p,s()}catch(g){oy(t,String(g instanceof Error?g.message:g))}},c=x=>{x!=="dark"&&x!=="light"||(n?a({...n,theme:x},r):zf(x))},l=x=>{if(x.jsonrpc!=="2.0")return!1;if(x.id===ry&&x.result)return i=!0,c(x.result.hostContext?.theme),o({jsonrpc:"2.0",method:"ui/notifications/initialized"}),!0;if(x.method==="ui/notifications/tool-result"){let p=x.params?.structuredContent?.spec;return p&&a(p,{events:!0}),!0}return x.method==="ui/notifications/host-context-changed"?(c(x.params?.hostContext?.theme),!0):(x.method==="ping"&&x.id!==void 0&&o({jsonrpc:"2.0",id:x.id,result:{}}),!0)},u=x=>{let p=x.data,g;if(typeof p=="string")try{g=JSON.parse(p)}catch{return}else g=p;l(g)||(g?.type==="unovis:render"&&g.spec&&a(g.spec,g.options),g?.type==="unovis:theme"&&(g.theme==="light"||g.theme==="dark")&&(n?a({...n,theme:g.theme},r):zf(g.theme)))};window.addEventListener("message",u),document.addEventListener("message",u),o({type:"unovis:ready",version:ey,specVersion:"0.1"});let f=()=>o({jsonrpc:"2.0",id:ry,method:"ui/initialize",params:{protocolVersion:BS,appInfo:{name:"unovis-chart-widget",version:ey},appCapabilities:{}}});f();let h=0,d=setInterval(()=>{if(i||++h>8){clearInterval(d);return}f()},500)}function iy(){let t=document.getElementById("uv-spec"),e=document.getElementById("uv-options"),n=document.getElementById("uv-root");if(!(!t?.textContent||!n))try{let r=e?.textContent?JSON.parse(e.textContent):{};Vf(JSON.parse(t.textContent),n,r)}catch(r){oy(n,`Failed to render chart: ${String(r instanceof Error?r.message:r)}`)}}window.UnovisChart={render:Vf,startEmbed:sy,unovis:hl};window.location.hash==="#embed"?sy():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",iy):iy();})();
799
+ `;var G0=class{constructor(e,n){this._defaultConfig=W0,this.config=this._defaultConfig,this._colorAccessor=r=>r.color,this._container=e,this.div=n?.renderIntoProvidedDomNode?Y(this._container):Y(this._container).append("div"),this.div.classed(ll,!0),this.element=this.div.node(),this.setConfig(n)}setConfig(e){this.prevConfig=this.config,this.config=te(this._defaultConfig,e),this.render()}update(e){this.setConfig(e)}render(){let{config:e}=this,n=this.div.selectAll(`.${Vo}`).data(e.items),r=n.enter().append("div").on("click",this._onItemClick.bind(this)),i=r.merge(n);i.attr("class",o=>`${Vo} ${o.className??""}`).classed(Nf,e.orientation===Ro.Vertical).classed(Bf,o=>!!e.onLegendItemClick&&this._isItemClickable(o)).attr("title",o=>o.name).style("display",o=>o.hidden?"none":null),r.append("span").attr("class",ul).call(H0),i.select(`.${ul}`).style("width",function(o){let a=(Array.isArray(o.color)?o.color:[o.color]).length,c=e.bulletSize?ee(e.bulletSize):Dt("var(--vis-legend-bullet-size)",this)||9,l=e.bulletSpacing;return`${Of(c,a,l)}px`}).style("height",e.bulletSize).style("box-sizing","content-box").call(Y0,this.config,this._colorAccessor,e.colorFunction),r.append("span").attr("class",cl).classed(e.labelClassName,!0).style("max-width",e.labelMaxWidth).style("font-size",e.labelFontSize),i.select(`.${cl}`).text(o=>o.name),n.exit().remove()}_isItemClickable(e){return e.pointer===void 0?!0:e.pointer}_onItemClick(e,n){let{config:{onLegendItemClick:r}}=this,o=this.div.selectAll(`.${Vo}`).nodes().indexOf(e.currentTarget);r&&r(n,o)}destroy(){this.element!==this._container&&this.div.remove()}};G0.selectors=Pf;var fl=G0;var U0=t=>typeof t!="object"||t===null||Array.isArray(t)?!1:Object.keys(t).some(n=>["$field","$index","$const","$dateTickFormat","$numTickFormat","$lookup","$format","$mapField"].includes(n));function TS(t,e,n=7){let r=e-t;if(!Number.isFinite(r)||r<=0)return;let i=[];if(r>=60*864e5){let o=Math.max(1,Math.ceil(r/2592e6/n)),s=new Date(t),a=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),1));for(a.getTime()<t&&(a=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth()+1,1)));a.getTime()<=e&&i.length<24;)i.push(a.getTime()),a=new Date(Date.UTC(a.getUTCFullYear(),a.getUTCMonth()+o,1))}else{let o=r>=1728e5?864e5:r>=72e5?36e5:6e4,s=o===864e5?[1,2,7,14]:o===36e5?[1,2,3,6,12]:[1,2,5,10,15,30],a=r/o/n,c=(s.find(l=>l>=a)??Math.ceil(a))*o;for(let l=Math.ceil(t/c)*c;l<=e&&i.length<24;l+=c)i.push(l)}return i.length>=2?i:void 0}function X0(t,e){let n=1/0,r=-1/0;for(let i of t){let o=i[e];if(o==null||o==="")continue;let s=typeof o=="number"?o:new Date(String(o)).getTime();Number.isNaN(s)||(s<n&&(n=s),s>r&&(r=s))}return TS(n,r)}var Rn=class extends Error{},AS=t=>{if(t==null||t==="")return;let e=Number(t);return Number.isNaN(e)?void 0:e},CS=t=>{if(t==null||t==="")return;if(typeof t=="number")return t;let e=new Date(t).getTime();return Number.isNaN(e)?void 0:e},MS=(t,e="en-US")=>{let n=typeof t=="number"?t:Number(t),r=Number.isFinite(n)?n:new Date(String(t)).getTime();if(!Number.isFinite(r))return String(t);let i=new Date(r),o=i.getUTCHours()===0&&i.getUTCMinutes()===0?i.getUTCDate()===1?{year:"numeric",month:"short"}:{month:"short",day:"numeric"}:{hour:"2-digit",minute:"2-digit"};return i.toLocaleString(e,{...o,timeZone:"UTC"})},pl=(t,e="en-US")=>{let n=Number(t);return Number.isFinite(n)?n.toLocaleString(e,{maximumFractionDigits:6}):String(t)};function LS(t,e){if("$field"in t){let{$field:n,as:r}=t;return r==="number"?i=>AS(i?.[n]):r==="date"?i=>CS(i?.[n]):i=>i?.[n]}if("$index"in t)return(n,r)=>r;if("$const"in t)return()=>t.$const;if("$dateTickFormat"in t)return n=>MS(n,e);if("$numTickFormat"in t)return n=>pl(n,e);if("$lookup"in t){let n=t.$lookup;return r=>n[Math.round(Number(r))%n.length]??String(r)}if("$format"in t){let{field:n,prefix:r="",suffix:i=""}=t.$format;return o=>{let s=o?.[n];return s==null?"":`${r}${pl(s,e)}${i}`}}if("$mapField"in t){let{field:n,mapping:r,fallback:i}=t.$mapField;return o=>r[String(o?.[n])]??i}return t}function dn(t,e){if(U0(t))return LS(t,e);if(Array.isArray(t))return t.map(n=>dn(n,e));if(typeof t=="object"&&t!==null){let n={};for(let[r,i]of Object.entries(t))n[r]=dn(i,e);return n}return t}var j0=new Set(["Line","Area","GroupedBar","StackedBar","Scatter","Timeline","Boxplot","XYLabels","Plotband","Plotline"]),RS=new Set(["Donut","NestedDonut","RadialBar","Sankey","Heatmap","Treemap","ChordDiagram","Graph","TopoJSONMap"]),ES=new Set(["Graph"]);function q0(t,e,n,r){if(!(j0.has(e.type)||RS.has(e.type)))throw new Rn(`Unsupported component type: ${e.type}`);let o=Object.prototype.hasOwnProperty.call(t,e.type)?t[e.type]:void 0;if(typeof o!="function")throw new Rn(`Component ${e.type} is not available in this bundle \u2014 regenerate the document for this chart type`);let s=dn(e.config,r);s.duration=n.duration??0,ES.has(e.type)&&n.onComponentComplete&&(s.onRenderComplete=n.onComponentComplete);let a=s.projection;if(a?.$mapProjection){let c=t.MapProjection,l=c&&Object.prototype.hasOwnProperty.call(c,a.$mapProjection)?c[a.$mapProjection]:void 0;if(typeof l!="function")throw new Rn(`Unknown map projection: ${a.$mapProjection}`);s.projection=l()}return new o(s)}function Z0(t,e,n={}){if(e.specVersion!==void 0){let c=x=>{let p=/^(\d+)\.(\d+)$/.exec(String(x));return p?[Number(p[1]),Number(p[2])]:[Number.POSITIVE_INFINITY,0]},[l,u]=c(e.specVersion),[f,h]=c("0.1");if(l>f||l===0&&f===0&&u>h)throw new Rn(`Chart spec version ${e.specVersion} is newer than this renderer supports (${"0.1"}) \u2014 upgrade @unovis/mcp`)}let r=e.locale,i=dn(e.containerConfig??{},r),o=n.duration??0,s=n.responsive?{}:{width:e.width,height:e.height};if(e.container==="xy"){let c=e.components.map(u=>{if(!j0.has(u.type))throw new Rn(`${u.type} cannot be used in an XY container`);return q0(t,u,n,r)}),l=(u,f)=>{if(u)return new t.Axis({...dn(u,r),type:f,duration:o})};if(e.xAxis&&"$dateTickFormat"in(e.xAxis.tickFormat??{})&&e.xAxis.tickValues===void 0){let u=e.components[0]?.config?.x?.$field,f=Array.isArray(e.data)?e.data:void 0;if(u&&f){let h=X0(f,u);h&&(e={...e,xAxis:{...e.xAxis,tickValues:h}})}}return{containerType:"xy",containerConfig:{...i,components:c,xAxis:l(e.xAxis,"x"),yAxis:l(e.yAxis,"y"),...s,duration:o,onRenderComplete:n.onRenderComplete},data:e.data}}if(e.components.length!==1)throw new Rn("single container requires exactly one component");let a=q0(t,e.components[0],n,r);return{containerType:"single",containerConfig:{...i,component:a,...s,duration:o,onRenderComplete:n.onRenderComplete},data:e.data}}var Ff=t=>String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),DS=(t,e)=>t==null?"\u2014":typeof t=="number"?pl(t,e):Ff(t),En=(t,e,n)=>`<div class="uv-tt-row"><span class="uv-tt-key">${Ff(t)}</span><span class="uv-tt-val">${DS(e,n)}</span></div>`,je=t=>`<div class="uv-tt-title">${Ff(t)}</div>`;function K0(t){let e=[],n=r=>{if(Array.isArray(r)){r.forEach(n);return}if(typeof r=="object"&&r!==null){let i=r;if(typeof i.$field=="string"){e.includes(i.$field)||e.push(i.$field);return}Object.values(r).forEach(n)}};return n(t),e}var $S=t=>Object.entries(t??{}).filter(([e,n])=>!e.startsWith("_")&&(n===null||typeof n!="object"));function IS(t,e,n){return r=>{if(!r)return"";let i=e&&r[e]!==void 0?je(r[e]):"",o=t.length?t.filter(s=>r[s]!==void 0).map(s=>En(s,r[s],n)):$S(r).map(([s,a])=>En(s,a,n));return`${i}${o.join("")}`||je("no data")}}function Q0(t,e){let n={},r={};for(let a of e.components){if(!t[a.type])continue;let c=K0(a.config),l=IS(c,void 0,e.locale);switch(a.type){case"Line":case"Area":break;case"GroupedBar":case"StackedBar":{let u=a.type==="StackedBar"?t.StackedBar:t.GroupedBar;r[u.selectors.bar]=l;break}case"Scatter":r[t.Scatter.selectors.point]=l;break;case"Boxplot":r[t.Boxplot.selectors.box]=l;break;case"Timeline":r[t.Timeline.selectors.line]=l;break;case"Donut":r[t.Donut.selectors.segment]=u=>l(u?.data??u);break;case"NestedDonut":r[t.NestedDonut.selectors.segment]=u=>`${je(u?.data?.key??"")}${En("value",u?.value??u?.data?.value)}`;break;case"RadialBar":r[t.RadialBar.selectors.segment]=u=>l(u?.data??u);break;case"Heatmap":r[t.Heatmap.selectors.node]=l;break;case"Treemap":r[t.Treemap.selectors.tile]=u=>`${je(u?.data?.key??u?.key??"")}${En("value",u?.value)}`;break;case"Sankey":r[t.Sankey.selectors.node]=u=>`${je(u?.label??u?.id??"")}${En("total",u?.value)}`,r[t.Sankey.selectors.link]=u=>`${je(`${u?.source?.label??u?.source?.id??""} \u2192 ${u?.target?.label??u?.target?.id??""}`)}${En("value",u?.value)}`;break;case"ChordDiagram":r[t.ChordDiagram.selectors.node]=u=>je(u?.data?.label??u?.key??"");break;case"Graph":r[t.Graph.selectors.node]=u=>l(u?._state?u:u?.data??u),r[t.Graph.selectors.link]=u=>je(`${u?.source?.id??""} \u2192 ${u?.target?.id??""}`);break;case"TopoJSONMap":r[t.TopoJSONMap.selectors.feature]=u=>{let f=u?.data??u;return!f?.id&&!f?.name?"":`${je(f.name??f.id)}${f.value!==void 0?En("value",f.value):""}`};break}}let i=e.components.find(a=>a.type==="Line"||a.type==="Area"),o=e.container==="xy"&&!!i;if((Object.keys(r).length||o)&&(n.tooltip=new t.Tooltip({triggers:r,horizontalPlacement:"center"})),o&&i){let a=dn(i.config.x,e.locale),c=K0(i.config).filter(h=>h!==i.config.x?.$field),l=e.legend?.map(h=>h.name)??c,u=i.config.x?.$field,f=e.xAxis?.tickFormat?dn(e.xAxis.tickFormat,e.locale):void 0;n.crosshair=new t.Crosshair({x:a,y:dn(i.config.y,e.locale),template:h=>{let d=u?h?.[u]:void 0,x=d!==void 0?je(f?f(d):d):"",p=c.map((g,v)=>En(l[v]??g,h?.[g],e.locale));return`${x}${p.join("")}`}})}let s=e.legend?.length?e.legend.map(a=>({name:a.name,color:a.color})):void 0;return{containerConfig:n,legendItems:s}}var De=t=>{if(t===null||typeof t!="object")return t;let e={};for(let[n,r]of Object.entries(t))n.startsWith("_")||(r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")&&(e[n]=r);return e},J0={GroupedBar:t=>De(t?.datum??t),StackedBar:t=>De(t?.datum??t),Scatter:t=>De(t?.datum??t),Boxplot:t=>De(t?.datum??t),Timeline:t=>De(t?.datum??t),Donut:t=>De(t?.data??t),NestedDonut:t=>({key:t?.data?.key,value:t?.value??t?.data?.value}),RadialBar:t=>De(t?.data??t),Heatmap:t=>De(t?.datum??t),Treemap:t=>({key:t?.data?.key??t?.key,value:t?.value}),Sankey:t=>t?.source||t?.target?{source:t?.source?.label??t?.source?.id,target:t?.target?.label??t?.target?.id,value:t?.value}:{id:t?.id,label:t?.label,value:t?.value},ChordDiagram:t=>({label:t?.data?.label??t?.key,value:t?.value??t?.data?.value}),Graph:t=>t?.source||t?.target?{source:t?.source?.id,target:t?.target?.id}:De(t?._state?t:t?.data??t),TopoJSONMap:t=>De(t?.data??t)};function OS(t,e){if(!t[e])return[];switch(e){case"GroupedBar":return[t.GroupedBar.selectors.bar];case"StackedBar":return[t.StackedBar.selectors.bar];case"Scatter":return[t.Scatter.selectors.point];case"Boxplot":return[t.Boxplot.selectors.box];case"Timeline":return[t.Timeline.selectors.line];case"Donut":return[t.Donut.selectors.segment];case"NestedDonut":return[t.NestedDonut.selectors.segment];case"RadialBar":return[t.RadialBar.selectors.segment];case"Heatmap":return[t.Heatmap.selectors.node];case"Treemap":return[t.Treemap.selectors.tile];case"Sankey":return[t.Sankey.selectors.node,t.Sankey.selectors.link];case"ChordDiagram":return[t.ChordDiagram.selectors.node];case"Graph":return[t.Graph.selectors.node,t.Graph.selectors.link];case"TopoJSONMap":return[t.TopoJSONMap.selectors.feature];default:return[]}}function ty(t,e,n,r){let i=OS(t,e.type);if(!i.length)return;let o=Object.prototype.hasOwnProperty.call(J0,e.type)?J0[e.type]:void 0,s=typeof o=="function"?o:De,a={};for(let c of i)a[c]={click:l=>r({component:e.type,componentIndex:n,event:"click",datum:s(l)})};return a}function oy(t,e){let n=document.createElement("div");n.className="uv-error",n.textContent=e,t.replaceChildren(n)}var ey="1.7.1",ny="data-theme";function zf(t){let e=document.documentElement;t==="dark"?e.setAttribute(ny,"dark"):e.removeAttribute(ny)}function NS(t,e){e?.forEach((n,r)=>{t.style.setProperty(`--vis-color${r}`,n),t.style.setProperty(`--vis-dark-color${r}`,n)})}function Vf(t,e,n={}){if(e.innerHTML="",e.classList.add("uv-root"),zf(t.theme),NS(e,t.colors),n.showTitle!==!1&&t.title){let h=document.createElement("div");h.className="uv-title",h.textContent=t.title,e.appendChild(h)}let r=hl,{containerConfig:i,legendItems:o}=Q0(r,t),s=n.onEvent;s&&(t={...t,components:t.components.map((h,d)=>{let x=ty(r,h,d,s);return x?{...h,config:{...h.config,events:x}}:h})});let a;if(o?.length){let h=document.createElement("div");h.className="uv-legend",e.appendChild(h),a=new fl(h,{items:o})}let c=document.createElement("div");c.className="uv-chart",e.appendChild(c);let l=Z0(r,t,{duration:n.duration??400,responsive:!0}),u={...l.containerConfig,...i},f=l.containerType==="xy"?new jr(c,u,l.data):new ri(c,u,l.data);return{element:e,destroy:()=>{try{f.destroy(),a?.destroy?.()}finally{e.innerHTML=""}}}}var BS="2026-01-26",ry="unovis-ui-init";function sy(){let t=document.getElementById("uv-embed-root")??document.body,e,n,r,i=!1,o=x=>{let p=window.ReactNativeWebView;p?p.postMessage(JSON.stringify(x)):window.parent?.postMessage(x,"*")},s=()=>{o({type:"unovis:size",width:t.scrollWidth,height:t.scrollHeight}),o({jsonrpc:"2.0",method:"ui/notifications/size-changed",params:{width:t.scrollWidth,height:t.scrollHeight}})},a=(x,p)=>{e?.destroy();try{let{events:g,...v}=p??{};g&&(v.onEvent=b=>o({type:"unovis:event",...b})),e=Vf(x,t,v),n=x,r=p,s()}catch(g){oy(t,String(g instanceof Error?g.message:g))}},c=x=>{x!=="dark"&&x!=="light"||(n?a({...n,theme:x},r):zf(x))},l=x=>{if(x.jsonrpc!=="2.0")return!1;if(x.id===ry&&x.result)return i=!0,c(x.result.hostContext?.theme),o({jsonrpc:"2.0",method:"ui/notifications/initialized"}),!0;if(x.method==="ui/notifications/tool-result"){let p=x.params?.structuredContent?.spec;return p&&a(p,{events:!0}),!0}return x.method==="ui/notifications/host-context-changed"?(c(x.params?.hostContext?.theme),!0):(x.method==="ping"&&x.id!==void 0&&o({jsonrpc:"2.0",id:x.id,result:{}}),!0)},u=x=>{let p=x.data,g;if(typeof p=="string")try{g=JSON.parse(p)}catch{return}else g=p;l(g)||(g?.type==="unovis:render"&&g.spec&&a(g.spec,g.options),g?.type==="unovis:theme"&&(g.theme==="light"||g.theme==="dark")&&(n?a({...n,theme:g.theme},r):zf(g.theme)))};window.addEventListener("message",u),document.addEventListener("message",u),o({type:"unovis:ready",version:ey,specVersion:"0.1"});let f=()=>o({jsonrpc:"2.0",id:ry,method:"ui/initialize",params:{protocolVersion:BS,appInfo:{name:"unovis-chart-widget",version:ey},appCapabilities:{}}});f();let h=0,d=setInterval(()=>{if(i||++h>8){clearInterval(d);return}f()},500)}function iy(){let t=document.getElementById("uv-spec"),e=document.getElementById("uv-options"),n=document.getElementById("uv-root");if(!(!t?.textContent||!n))try{let r=e?.textContent?JSON.parse(e.textContent):{};Vf(JSON.parse(t.textContent),n,r)}catch(r){oy(n,`Failed to render chart: ${String(r instanceof Error?r.message:r)}`)}}window.UnovisChart={render:Vf,startEmbed:sy,unovis:hl};window.location.hash==="#embed"?sy():document.readyState==="loading"?document.addEventListener("DOMContentLoaded",iy):iy();})();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unovis/mcp",
3
3
  "description": "MCP server that renders Unovis charts to SVG locally in Node — no browser, no remote services",
4
- "version": "1.7.0",
4
+ "version": "1.7.1",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/f5/unovis.git",
@@ -57,8 +57,8 @@
57
57
  "dependencies": {
58
58
  "@modelcontextprotocol/sdk": "^1.17.0",
59
59
  "zod": "^3.25.0",
60
- "@unovis/ssr": "1.7.0",
61
- "@unovis/ts": "1.7.0"
60
+ "@unovis/ssr": "1.7.1",
61
+ "@unovis/ts": "1.7.1"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@modelcontextprotocol/ext-apps": "^1.7.5",