@graphysdk/react-renderer 1.9.0-beta.1792404455940 → 1.9.0-beta.1792407460425

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.
@@ -22,7 +22,7 @@ import './history-chords.css';var Kn = Object.defineProperty, Zl = (e, t) => {
22
22
  });
23
23
  return t || Kn(r, Symbol.toStringTag, { value: "Module" }), r;
24
24
  };
25
- typeof window < "u" && (window.__GRAPHY_SDK__ ??= {}, window.__GRAPHY_SDK__.reactRenderer = "1.9.0-beta.1792404455940");
25
+ typeof window < "u" && (window.__GRAPHY_SDK__ ??= {}, window.__GRAPHY_SDK__.reactRenderer = "1.9.0-beta.1792407460425");
26
26
  function $l(e) {
27
27
  for (const t of e) (t.severity === "error" ? console.error : console.warn)(`[graphy] ${t.code}: ${t.message}`, t);
28
28
  }
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const o=require("./history-chords-BD49NtWv.cjs");let m=require("@graphysdk/viz-engine"),d=require("react"),a=require("react/jsx-runtime"),F=require("zustand"),O=require("motion/react"),Y=require("zustand/vanilla"),U=require("clsx");U=o.__toESM(U,1);var me="_1a5iqpb0",ge="_1a5iqpb1";var pe="_1a5iqpb3",ve="_1a5iqpb4",fe="_1a5iqpb5";var z=({errors:e})=>{const[t,...r]=e;return(0,a.jsxs)("div",{role:"alert",className:me,children:[(0,a.jsx)("strong",{className:ge,children:"This chart could not be rendered."}),t&&(0,a.jsx)(V,{diagnostic:t}),r.length>0&&(0,a.jsx)("ul",{className:"_1a5iqpb2",children:r.map((n,s)=>(0,a.jsx)("li",{children:(0,a.jsx)(V,{diagnostic:n})},`${n.code}-${s}`))})]})},V=({diagnostic:e})=>(0,a.jsxs)("div",{className:pe,children:[(0,a.jsx)("span",{className:ve,children:e.code}),(0,a.jsx)("p",{className:fe,children:e.message}),e.suggestion&&(0,a.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function Se(e=[],t=[]){return e.length===t.length&&e.every((r,n)=>Object.is(r,t[n]))}var te=class extends d.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,m.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,m.buildDiagnostic)(e);o.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!Se(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,a.jsx)(z,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,a.jsx)(z,{errors:t}):r}},re=e=>typeof e=="object"&&"geom"in e&&"render"in e,ne=e=>{const t=(0,m.resolveDefinition)(e);return t instanceof m.Geom?t:null},se=(e,t)=>{const r=e.filter(n=>ye(n,t));return r.length===e.length?e:r},ye=(e,t)=>e.kind==="annotation"?(0,m.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,m.findLayerById)(t.layers,e.layerId)!==void 0:!0,X=[],be=()=>(0,Y.createStore)(e=>({selection:X,setSelection:t=>e(r=>Ge(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:X})})),Ge=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,n)=>{const s=t[n];return s!==void 0&&(0,m.areEditTargetsEqual)(r,s)}),xe=process.env.NODE_ENV!=="production",Ee=5,Te=e=>{if(!xe)return{emit:()=>{},subscribe:()=>Pe,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let r=null;return{emit:n=>{const s=e.getLastCompile();if(s){r=n;for(const c of t)c(n,s)}},subscribe:n=>(t.add(n),()=>{t.delete(n)}),getLastTrigger:()=>r,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},Re=()=>(0,Y.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,r)=>e(n=>{if(n.lastSnapshot===r)return n;const s={id:n.nextId,label:Ce(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:s,history:je(n.history,s,Ee),nextId:n.nextId+1,lastSnapshot:r}})})),Pe=()=>{},Ce=e=>{switch(e.kind){case"init":return"init";case"spec":return"spec change";case"data":return"data change";case"command":return e.command.metadata.description}},je=(e,t,r)=>{const n=e.length>=r?e.length-(r-1):0;return[...e.slice(n),t]};function Q(e){const t=e.filter(re),r=new Set([...Object.keys(o.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),n=[],s=new Set;for(const u of e){const h=ne(u);h===null||r.has(h.type)||s.has(h.type)||(s.add(h.type),n.push({kind:"user-input",severity:"error",code:"MISSING_GEOM_RENDERER",message:`Custom geom '${h.type}' is registered but has no renderer.`,context:{requested:h.type,kind:"geom-renderer"},suggestion:`Add a render half for it: \`defineGeomRenderer(${h.type}Geom, { coord, render })\`, then include it in \`plugins\`.`}))}const c=new Map;for(const u of t){if("definition"in u)continue;const h=`${u.geom}|${u.coord}`,p=c.get(h);p?p.count+=1:c.set(h,{geom:u.geom,coord:u.coord,count:1})}const l=[];for(const{geom:u,coord:h,count:p}of c.values())p<2||l.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${h}') (${p} entries); the last in the array wins.`,context:{requested:`${u}@${h}`,kind:"geom-renderer"},suggestion:`Keep a single render-only override for ('${u}', '${h}').`});return l.push(...Me(e)),{errors:n,warnings:l}}function Ne(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n)t(l.geom,r.type)!==null||s.has(l.geom)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${l.geom}' under ${r.type} coords; the layer is not painted.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${l.geom}', '${r.type}') via \`defineGeomRenderer\`.`}));return c}function De(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||u.hitTest||o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares spatialKind 'render-hit-test' but its renderer provides no hit-test; the layer has no hover.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:`Add a \`hitTest\` factory (precomputed geometry) or a live render (\`{ fn, options: { live: true } }\`, live simulation) to the renderer for ('${l.geom}', '${r.type}').`}))}return c}function _e(e){const t=new Set,r=[];for(const n of e.layers){const s=n.identityKey;n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||typeof s!="object"||t.has(n.geom)||n.data.hasVariable(s.variable)||(t.add(n.geom),r.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${n.geom}' keys its identity on '${s.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:n.geom,kind:"geom-renderer"},suggestion:`Emit the '${s.variable}' column from the geom's \`compile()\`, or point \`identityKey\` at a column it does emit.`})))}return r}function ke(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!u.hitTest||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"CONFLICTING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares both a \`hitTest\` factory and a live render; these are alternatives, so only the live render is used.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Keep one: a `hitTest` factory for precomputed geometry, OR a live render (`{ fn, options: { live: true } }`) for a live simulation."}))}return c}function Ie(e,t){const r=new Set,n=[];for(const s of e.layers)s.interactive!==!1&&(s.spatialKind!=="render-hit-test"||r.has(s.geom)||t.hasCapability(s.geom)||(r.add(s.geom),n.push({kind:"user-input",severity:"warning",code:"MISSING_ANCHOR_CAPABILITY",message:`Geom '${s.geom}' declares no \`resolveAnchorPosition\`; its observations cannot be annotated, so the editor overlay paints no creation trigger on them.`,context:{requested:s.geom,kind:"geom-renderer"},suggestion:"Implement `resolveAnchorPosition(observation, context)` on the geom, returning the normalised panel position an annotation on that observation belongs at."})));return n}function qe(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind==="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"LIVE_RENDER_REQUIRES_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares a live render but its layer's spatialKind is '${l.spatialKind}', not 'render-hit-test'; its push-path hover resolves to nothing.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'render-hit-test' so the scene layer carries the `byKey` index the live render's `pushHover` resolves against."}))}return c}function Le(e,t){let r;return e.layers.flatMap((n,s)=>o.isLiveRender(t(n.geom,e.coordSystem.type))?we(n)?(r??=(0,m.createStyleResolver)().readers(e),(r.geom(n).get("overpaint",void 0,"hovered")?.length??0)===0?[]:[{kind:"user-input",severity:"warning",code:"INVALID_STYLE_RULE",message:`Style 'overpaint' in state 'hovered' is not supported on live geom '${n.geom}' (layer '${n.id}'); it is ignored.`,context:{param:"overpaint",layerIndex:s,requested:n.geom},suggestion:"Remove the hovered overpaint, or paint the hover treatment in the geom's live render."}]):[]:[])}var we=e=>[e.styles.defaults,e.styles.overrides].some(t=>t.some(r=>r.state==="hovered"&&(r.declarations.overpaint?.length??0)>0));function Me(e){const t=new Set,r=[];for(const n of e){const s=ne(n);s===null||t.has(s.type)||s.dataLabelCoordTypes.length===0||s.getDataLabelPlacements!==void 0||(t.add(s.type),r.push({kind:"user-input",severity:"warning",code:"MISSING_DATA_LABEL_PLACEMENT",message:`Geom '${s.type}' declares \`dataLabelCoordTypes\` but implements no \`getDataLabelPlacements\`; its layers paint no data labels.`,context:{requested:s.type,kind:"geom-renderer"},suggestion:"Implement `getDataLabelPlacements(context)` on the geom, or drop `dataLabelCoordTypes` so the compiler warns the author off the flag."}))}return r}var He=e=>(0,Y.createStore)(t=>({scene:e,setScene:r=>t(n=>n.scene===r?n:{scene:r})})),$e=({spec:e,data:t,colorScheme:r,plugins:n,theme:s,resolveRenderer:c,anchorResolver:l,onSpecChange:u,onError:h,onWarnings:p})=>{const R=o.useLatestRef(u),P=o.useLatestRef(h),x=o.useLatestRef(p),[{session:f,compileBus:g}]=(0,d.useState)(()=>{const i=(0,m.createCompiler)({plugins:n,theme:s});return{session:new m.GraphCompilationSession(i),compileBus:Te(i)}}),[S]=(0,d.useState)(()=>{const i=Q(n??[]),v=Q(s?.plugins??[]);return{errors:[...v.errors,...i.errors],warnings:[...v.warnings,...i.warnings]}}),E=(0,d.useRef)(null),[y]=(0,d.useState)(Ae),C=(0,d.useRef)(null),D=(0,d.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),T=(0,d.useCallback)(i=>{if(!i.ok)return i.errors;if(C.current)C.current.getState().setScene(i.scene);else{const v=He(i.scene);v.subscribe(y.notify),C.current=v,y.notify()}return null},[y]),[M,k]=(0,d.useState)(()=>{const i=f.compile({spec:e,data:t,colorScheme:r});return E.current=i,D(T(i))}),G=(0,d.useCallback)(i=>i.ok?[...i.warnings,...Ne(i.scene,c),...De(i.scene,c),..._e(i.scene),...ke(i.scene,c),...qe(i.scene,c),...Le(i.scene,c),...Ie(i.scene,l)]:i.warnings,[c,l]),j=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),P.current?.(i))},[P]),N=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),x.current?.(i))},[x]);(0,d.useEffect)(()=>{const i=E.current;i&&(j([...S.errors,...i.ok?[]:i.errors]),N([...S.warnings,...G(i)]),i.ok&&g.emit({kind:"init"}))},[g,j,N,S,G]),(0,d.useEffect)(()=>{const i=f.update({spec:e,data:t,colorScheme:r});if(!i)return;i.committedSpec&&R.current?.(i.committedSpec);const v=T(i.result);k(D(v)),v&&j(v),N(G(i.result)),v||g.emit({kind:i.specChanged?"spec":"data"})},[e,t,r,f,g,T,j,N,D,G,R]);const I=(0,d.useCallback)(i=>{k(v=>v===null?v:D(null)),N(G(i))},[D,N,G]),H=(0,d.useCallback)(i=>{i.scene&&C.current?.getState().setScene(i.scene),i.result&&I(i.result),i.command&&g.emit({kind:"command",command:i.command}),i.spec&&R.current?.(i.spec),i.errors&&j([...i.errors])},[I,g,R,j]),b=(0,d.useCallback)(i=>{for(const v of i)H(v);return i.some(v=>!!v.scene)},[H]),$=(0,d.useCallback)((i,v)=>{b(f.applyCommand(i,v))},[f,b]),_=(0,d.useCallback)(()=>{b(f.commit())},[f,b]),A=(0,d.useCallback)(()=>b(f.undo()),[f,b]),q=(0,d.useCallback)(()=>b(f.redo()),[f,b]),K=(0,d.useMemo)(()=>({stack:f.history,undo:A,redo:q}),[f,A,q]),he=(0,d.useCallback)(()=>C.current?.getState().scene??null,[]);return{store:C.current,dispatch:$,commit:_,history:K,subscribe:y.subscribe,getScene:he,compileBus:g,compileErrors:M}},Ae=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},oe=({data:e,spec:t,plugins:r=[],theme:n,formattingLocale:s,handleRef:c,onSpecChange:l,onError:u,onWarnings:h,colorScheme:p="light",children:R})=>{const[P]=(0,d.useState)(()=>n),x=P?.colorScheme??p,[f]=(0,d.useState)(()=>o.createGeomRendererResolver([...P?.plugins??[],...r].filter(re))),g=(0,d.useId)(),[S]=(0,d.useState)(()=>(0,m.createAnchorResolver)(r)),[E]=(0,d.useState)(()=>(0,m.createDataLabelPlacementResolver)(r)),[y]=(0,d.useState)(()=>be()),[C]=(0,d.useState)(()=>o.createTargetBoundaryStore()),D=(0,d.useMemo)(()=>(0,m.createStyleResolver)({colorScheme:x}),[x]),{store:T,dispatch:M,commit:k,history:G,subscribe:j,getScene:N,compileBus:I,compileErrors:H}=$e({spec:t,data:e,colorScheme:x,plugins:r,theme:P,resolveRenderer:f,anchorResolver:S,onSpecChange:l,onError:u,onWarnings:h});(0,d.useEffect)(()=>{if(T)return T.subscribe((_,A)=>{if(_.scene.spec===A.scene.spec)return;const{selection:q,setSelection:K}=y.getState();q.length!==0&&K(se(q,_.scene.spec))})},[T,y]);const b=(0,d.useMemo)(()=>({dispatch:M,commit:k}),[M,k]);(0,d.useImperativeHandle)(c,()=>({commands:b,undo:G.undo,redo:G.redo,subscribe:j,getScene:N,getSelection:()=>y.getState().selection,setSelection:_=>y.getState().setSelection(_),subscribeSelection:y.subscribe,canPlaceDataLabels:E.hasCapability,canFormatDataLabelsAsPercentages:E.hasPercentageFormat}),[b,G,j,N,y,E]);const $=(0,d.useMemo)(()=>T?{chartId:g,store:T,selectionStore:y,targetBoundaryStore:C,commands:b,history:G,formattingLocale:s,compileBus:I,colorScheme:x,styleResolver:D,anchorResolver:S}:null,[g,T,y,C,b,G,s,I,x,D,S]);return(0,a.jsx)(te,{forcedErrors:H,onError:u,resetKeys:[t,e],children:$?(0,a.jsx)(o.GraphContext.Provider,{value:$,children:(0,a.jsx)(o.GeomRendererResolverProvider,{value:f,children:(0,a.jsx)(o.DataLabelPlacementResolverProvider,{value:E,children:(0,a.jsx)(o.GeomShapesProvider,{shapes:P?.shapes,children:R})})})}):null})};function Be({theme:e,...t}={}){const r=(0,m.createSpecBuilder)(t);return{...r,GraphProvider:s=>(0,a.jsx)(oe,{...s,plugins:r.plugins,theme:e})}}var w=(e,t)=>{if(typeof e!="string"||!e.endsWith("%"))return null;const r=Number.parseFloat(e);return Number.isFinite(r)?r/100*t:null},ae=({x:e,y:t,width:r,height:n},s)=>{const c=w(e,s.width),l=w(t,s.height),u=w(r,s.width),h=w(n,s.height);return c===null||l===null||u===null||h===null?null:{x:c,y:l,width:u,height:h}},ie=({shouldAnimateTransitions:e,cx:t,cy:r,r:n,effects:s,...c})=>{const l=o.toGeomEffectsStyle(s);return e?(0,a.jsx)(O.motion.circle,{initial:!1,animate:{cx:t,cy:r,r:n},transition:o.DEFAULT_SPRING_TRANSITION,style:l,...c}):(0,a.jsx)("circle",{cx:t,cy:r,r:n,style:l,...c})},le=({shouldAnimateTransitions:e,x1:t,y1:r,x2:n,y2:s,effects:c,...l})=>{const u=o.toGeomEffectsStyle(c);return e?(0,a.jsx)(O.motion.line,{initial:!1,animate:{x1:t,y1:r,x2:n,y2:s},transition:o.DEFAULT_SPRING_TRANSITION,style:u,...l}):(0,a.jsx)("line",{x1:t,y1:r,x2:n,y2:s,style:u,...l})},ce=({shouldAnimateTransitions:e,x:t,y:r,width:n,height:s,rx:c,ry:l,effects:u,...h})=>{const p=o.toGeomEffectsStyle(u);return e?(0,a.jsx)(O.motion.rect,{initial:!1,animate:{attrX:t,attrY:r,width:n,height:s,...c!==void 0&&l!==void 0?{rx:c,ry:l}:{}},transition:o.DEFAULT_SPRING_TRANSITION,style:p,...h}):(0,a.jsx)("rect",{x:t,y:r,width:n,height:s,rx:c,ry:l,style:p,...h})},ue=({shouldAnimateTransitions:e,d:t,source:r,effects:n,...s})=>{const c=o.toGeomEffectsStyle(n);return e?(0,a.jsx)(ze,{d:t,source:r,style:c,...s}):(0,a.jsx)("path",{d:t,style:c,...s})},Oe=e=>{const{Circle:t}=o.useGeomShapes();return t===void 0?ie(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Ke=e=>{const{Line:t}=o.useGeomShapes();return t===void 0?le(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Fe=({cornerRadius:e,...t})=>{const{Rect:r}=o.useGeomShapes(),n=o.useGeomPanelPixelSize(),s=o.useGeomPixelsPerUnit(),c={...t,...Ye(e,t,n,s)};return r===void 0?ce(c):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(r,{...c})})},Ue=e=>{const{Path:t}=o.useGeomShapes();return t===void 0?ue(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},ze=({d:e,source:t,...r})=>{const n=o.useSvgPathMorph(e,o.DEFAULT_SPRING_TRANSITION,t);return(0,a.jsx)(O.motion.path,{d:n,...r})},Ye=(e,t,r,n)=>{if(e===void 0)return{};const s=We(t,r,n);if(s===null)return e==="full"?{}:J((0,m.resolveGeomCornerRadiusPx)({cornerRadius:e}),n);const c=Math.min((0,m.resolveGeomCornerRadiusPx)({cornerRadius:e,box:s}),Math.min(s.width,s.height)/2);return J(c,n)},We=(e,t,r)=>typeof e.width=="number"&&typeof e.height=="number"?{width:Math.abs(e.width)*r.x,height:Math.abs(e.height)*r.y}:t===null?null:ae(e,t),J=(e,t)=>({rx:e/t.x,ry:e/t.y}),Ve=({children:e,...t})=>{const r=o.useGeomPanelPixelSize();return(0,a.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:r,space:"unit",children:e})})},Xe=({box:e,children:t})=>{const r=o.useGeomPanelSize(),n=r===null?null:r.width*(e.x1-e.x0),s=r===null?null:r.height*(e.y1-e.y0),c=(0,d.useMemo)(()=>n===null||s===null?null:{width:n,height:s},[n,s]);return(0,a.jsx)("svg",{x:(0,m.toPercent)(e.x0),y:(0,m.toPercent)(e.y0),width:(0,m.toPercent)(e.x1-e.x0),height:(0,m.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:c,children:t})})},Qe="drqe3u0",Je="drqe3u1",Ze="drqe3u2",et="drqe3u3",L="drqe3u4",tt="drqe3u5",rt="drqe3u6",nt="drqe3u7",B="drqe3u8",st="drqe3u9",ot="drqe3ua";var at="drqe3uc",it="drqe3ud",lt="drqe3ue",ct="drqe3uf";var ut="drqe3uh",dt="drqe3ui",Z={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},ee={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},de={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},ht=({width:e=440,style:t,className:r}={})=>{const{compileBus:n}=o.useGraphContext(),[s]=(0,d.useState)(()=>Re()),[c,l]=(0,d.useState)(!1),[u,h]=(0,d.useState)(m.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:g}=s.getState(),S=n.getLastTrigger(),E=n.getLastCompile();return S&&E&&g(S,E),n.subscribe(g)},[s,n]);const p=(0,F.useStore)(s,g=>g.lastCompile),R=(0,F.useStore)(s,g=>g.history),P=n.getCacheStats(),x=p===null&&R.length===0,f=()=>{h(g=>{const S=!g;return(0,m.setCompilerCachingEnabled)(S),S})};return(0,a.jsxs)("div",{className:(0,U.default)(ot,r),style:{width:e,...t},children:[(0,a.jsxs)("div",{className:Qe,children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:Je,children:"compile cache"}),(0,a.jsx)("div",{className:lt,children:x?"production: stats disabled":p?`last: ${p.label} · ${W(p.durationMs)}`:"awaiting first compile…"})]}),(0,a.jsx)("button",{type:"button",onClick:()=>l(g=>!g),className:ct,children:c?"▾":"▴"})]}),!c&&(0,a.jsxs)("div",{className:"drqe3ub",children:[(0,a.jsxs)("button",{type:"button",onClick:f,className:u?Z.enabled:Z.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,a.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!c&&!x&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(mt,{delta:p?.stages,durations:p?.stageDurationsMs,cumulative:P}),(0,a.jsx)(gt,{entries:R})]})]})},mt=({delta:e,durations:t,cumulative:r})=>(0,a.jsxs)("table",{className:Ze,children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:ut,children:[(0,a.jsx)("th",{className:et,children:"stage"}),(0,a.jsx)("th",{className:L,children:"time"}),(0,a.jsx)("th",{className:L,children:"Δ miss"}),(0,a.jsx)("th",{className:L,children:"Δ hit"}),(0,a.jsx)("th",{className:L,children:"total miss"}),(0,a.jsx)("th",{className:L,children:"total hit"})]})}),(0,a.jsx)("tbody",{children:m.COMPILER_STAGE_KEYS.map(n=>{const s=e?.[n],c=pt(s);return(0,a.jsxs)("tr",{className:at,children:[(0,a.jsxs)("td",{className:tt,children:[(0,a.jsx)("span",{className:de[c],"aria-hidden":!0})," ",n]}),(0,a.jsx)("td",{className:B,children:t===void 0||c==="untouched"?"—":W(t[n])}),(0,a.jsx)("td",{className:c==="ran"?ee.ran:ee.dim,children:s?.misses??0}),(0,a.jsx)("td",{className:B,children:s?.hits??0}),(0,a.jsx)("td",{className:B,children:r[n].misses}),(0,a.jsx)("td",{className:B,children:r[n].hits})]},n)})})]}),gt=({entries:e})=>e.length===0?null:(0,a.jsxs)("div",{className:it,children:[(0,a.jsx)("div",{className:dt,children:"recent compiles"}),e.map(t=>{const r=vt(t.stages,c=>c.misses>0),n=m.COMPILER_STAGE_KEYS.length,s=r===0?"cached":"ran";return(0,a.jsxs)("div",{className:rt,children:[(0,a.jsx)("span",{className:de[s],"aria-hidden":!0}),(0,a.jsx)("span",{className:nt,title:t.label,children:t.label}),(0,a.jsxs)("span",{className:st,children:[r,"/",n," ran · ",W(t.durationMs)]})]},t.id)})]}),pt=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",vt=(e,t)=>{let r=0;for(const n of m.COMPILER_STAGE_KEYS)t(e[n])&&(r+=1);return r},W=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,ft=()=>{const{history:e}=o.useGraphContext(),{stack:t,undo:r,redo:n}=e,s=(0,d.useCallback)(u=>t.subscribe(u),[t]),c=(0,d.useCallback)(()=>t.getSnapshot(),[t]),l=(0,d.useSyncExternalStore)(s,c,c);return(0,d.useMemo)(()=>({...l,undo:r,redo:n}),[l,r,n])},St=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),yt=(e,t={})=>{const{target:r,enabled:n=!0}=t;(0,d.useEffect)(()=>{const s=bt(r);if(!n||!s)return;const c=l=>{if(!Gt(l)||l.defaultPrevented||xt(l.target))return;const u=o.resolveHistoryStep(l);if(!u)return;const h=e.current;h&&(u==="undo"?h.undo():h.redo())&&l.preventDefault()};return s.addEventListener("keydown",c),()=>s.removeEventListener("keydown",c)},[e,r,n])},bt=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Gt=e=>"key"in e,xt=e=>e instanceof HTMLInputElement?!St.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Et=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,F.useStore)(e,t=>t.boundary)};exports.BrandMark=o.BrandMark;exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGeomCircle=ie;exports.DefaultGeomLine=le;exports.DefaultGeomPath=ue;exports.DefaultGeomRect=ce;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=ht;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Oe;exports.GeomLine=Ke;exports.GeomOverpaint=o.GeomOverpaint;exports.GeomPath=Ue;exports.GeomRect=Fe;exports.GraphErrorBoundary=te;exports.GraphErrorPanel=z;exports.GraphProvider=oe;exports.GraphRenderer=o.GraphRenderer;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=Xe;exports.UnitSpaceSvg=Ve;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Be;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=se;exports.readShapePixelRect=ae;exports.readShapePixels=w;exports.resolveBrandMarkVisual=o.resolveBrandMarkVisual;exports.resolvePathStroke=o.resolvePathStroke;exports.scalePointToPanel=o.scalePointToPanel;exports.stampAxisEditTarget=o.stampAxisEditTarget;exports.stampGridEditTarget=o.stampGridEditTarget;exports.stampLegendEditTarget=o.stampLegendEditTarget;exports.useElementScreenRect=o.useElementScreenRect;exports.useGeomHitTest=o.useGeomHitTest;exports.useGeomHover=o.useGeomHover;exports.useGeomPanelSize=o.useGeomPanelSize;exports.useGeomReaderTree=o.useGeomReaderTree;exports.useGeomStyleReader=o.useGeomStyleReader;exports.useGraphCommands=o.useGraphCommands;exports.useGraphHandle=o.useGraphHandle;exports.useGraphHistory=ft;exports.useGraphHistoryShortcuts=yt;exports.useGraphLocale=o.useGraphLocale;exports.useGraphSelection=o.useGraphSelection;exports.useGuidesTakePress=o.useGuidesTakePress;exports.useHandleScene=o.useHandleScene;exports.useHoverState=o.useHoverState;exports.usePaintDefs=o.usePaintDefs;exports.useResolvedStyle=o.useResolvedStyle;exports.useSceneSelector=o.useSceneSelector;exports.useStyleReaderTree=o.useStyleReaderTree;exports.useStyleResolver=o.useStyleResolver;exports.useTargetBoundary=Et;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=o.vars;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const o=require("./history-chords-B9ozn71x.cjs");let m=require("@graphysdk/viz-engine"),d=require("react"),a=require("react/jsx-runtime"),F=require("zustand"),O=require("motion/react"),Y=require("zustand/vanilla"),U=require("clsx");U=o.__toESM(U,1);var me="_1a5iqpb0",ge="_1a5iqpb1";var pe="_1a5iqpb3",ve="_1a5iqpb4",fe="_1a5iqpb5";var z=({errors:e})=>{const[t,...r]=e;return(0,a.jsxs)("div",{role:"alert",className:me,children:[(0,a.jsx)("strong",{className:ge,children:"This chart could not be rendered."}),t&&(0,a.jsx)(V,{diagnostic:t}),r.length>0&&(0,a.jsx)("ul",{className:"_1a5iqpb2",children:r.map((n,s)=>(0,a.jsx)("li",{children:(0,a.jsx)(V,{diagnostic:n})},`${n.code}-${s}`))})]})},V=({diagnostic:e})=>(0,a.jsxs)("div",{className:pe,children:[(0,a.jsx)("span",{className:ve,children:e.code}),(0,a.jsx)("p",{className:fe,children:e.message}),e.suggestion&&(0,a.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function Se(e=[],t=[]){return e.length===t.length&&e.every((r,n)=>Object.is(r,t[n]))}var te=class extends d.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,m.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,m.buildDiagnostic)(e);o.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!Se(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,a.jsx)(z,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,a.jsx)(z,{errors:t}):r}},re=e=>typeof e=="object"&&"geom"in e&&"render"in e,ne=e=>{const t=(0,m.resolveDefinition)(e);return t instanceof m.Geom?t:null},se=(e,t)=>{const r=e.filter(n=>ye(n,t));return r.length===e.length?e:r},ye=(e,t)=>e.kind==="annotation"?(0,m.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,m.findLayerById)(t.layers,e.layerId)!==void 0:!0,X=[],be=()=>(0,Y.createStore)(e=>({selection:X,setSelection:t=>e(r=>Ge(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:X})})),Ge=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,n)=>{const s=t[n];return s!==void 0&&(0,m.areEditTargetsEqual)(r,s)}),xe=process.env.NODE_ENV!=="production",Ee=5,Te=e=>{if(!xe)return{emit:()=>{},subscribe:()=>Pe,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let r=null;return{emit:n=>{const s=e.getLastCompile();if(s){r=n;for(const c of t)c(n,s)}},subscribe:n=>(t.add(n),()=>{t.delete(n)}),getLastTrigger:()=>r,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},Re=()=>(0,Y.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,r)=>e(n=>{if(n.lastSnapshot===r)return n;const s={id:n.nextId,label:Ce(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:s,history:je(n.history,s,Ee),nextId:n.nextId+1,lastSnapshot:r}})})),Pe=()=>{},Ce=e=>{switch(e.kind){case"init":return"init";case"spec":return"spec change";case"data":return"data change";case"command":return e.command.metadata.description}},je=(e,t,r)=>{const n=e.length>=r?e.length-(r-1):0;return[...e.slice(n),t]};function Q(e){const t=e.filter(re),r=new Set([...Object.keys(o.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),n=[],s=new Set;for(const u of e){const h=ne(u);h===null||r.has(h.type)||s.has(h.type)||(s.add(h.type),n.push({kind:"user-input",severity:"error",code:"MISSING_GEOM_RENDERER",message:`Custom geom '${h.type}' is registered but has no renderer.`,context:{requested:h.type,kind:"geom-renderer"},suggestion:`Add a render half for it: \`defineGeomRenderer(${h.type}Geom, { coord, render })\`, then include it in \`plugins\`.`}))}const c=new Map;for(const u of t){if("definition"in u)continue;const h=`${u.geom}|${u.coord}`,p=c.get(h);p?p.count+=1:c.set(h,{geom:u.geom,coord:u.coord,count:1})}const l=[];for(const{geom:u,coord:h,count:p}of c.values())p<2||l.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${h}') (${p} entries); the last in the array wins.`,context:{requested:`${u}@${h}`,kind:"geom-renderer"},suggestion:`Keep a single render-only override for ('${u}', '${h}').`});return l.push(...Me(e)),{errors:n,warnings:l}}function Ne(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n)t(l.geom,r.type)!==null||s.has(l.geom)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${l.geom}' under ${r.type} coords; the layer is not painted.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${l.geom}', '${r.type}') via \`defineGeomRenderer\`.`}));return c}function De(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||u.hitTest||o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares spatialKind 'render-hit-test' but its renderer provides no hit-test; the layer has no hover.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:`Add a \`hitTest\` factory (precomputed geometry) or a live render (\`{ fn, options: { live: true } }\`, live simulation) to the renderer for ('${l.geom}', '${r.type}').`}))}return c}function _e(e){const t=new Set,r=[];for(const n of e.layers){const s=n.identityKey;n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||typeof s!="object"||t.has(n.geom)||n.data.hasVariable(s.variable)||(t.add(n.geom),r.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${n.geom}' keys its identity on '${s.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:n.geom,kind:"geom-renderer"},suggestion:`Emit the '${s.variable}' column from the geom's \`compile()\`, or point \`identityKey\` at a column it does emit.`})))}return r}function ke(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!u.hitTest||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"CONFLICTING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares both a \`hitTest\` factory and a live render; these are alternatives, so only the live render is used.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Keep one: a `hitTest` factory for precomputed geometry, OR a live render (`{ fn, options: { live: true } }`) for a live simulation."}))}return c}function Ie(e,t){const r=new Set,n=[];for(const s of e.layers)s.interactive!==!1&&(s.spatialKind!=="render-hit-test"||r.has(s.geom)||t.hasCapability(s.geom)||(r.add(s.geom),n.push({kind:"user-input",severity:"warning",code:"MISSING_ANCHOR_CAPABILITY",message:`Geom '${s.geom}' declares no \`resolveAnchorPosition\`; its observations cannot be annotated, so the editor overlay paints no creation trigger on them.`,context:{requested:s.geom,kind:"geom-renderer"},suggestion:"Implement `resolveAnchorPosition(observation, context)` on the geom, returning the normalised panel position an annotation on that observation belongs at."})));return n}function qe(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind==="render-hit-test"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"user-input",severity:"warning",code:"LIVE_RENDER_REQUIRES_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares a live render but its layer's spatialKind is '${l.spatialKind}', not 'render-hit-test'; its push-path hover resolves to nothing.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'render-hit-test' so the scene layer carries the `byKey` index the live render's `pushHover` resolves against."}))}return c}function Le(e,t){let r;return e.layers.flatMap((n,s)=>o.isLiveRender(t(n.geom,e.coordSystem.type))?we(n)?(r??=(0,m.createStyleResolver)().readers(e),(r.geom(n).get("overpaint",void 0,"hovered")?.length??0)===0?[]:[{kind:"user-input",severity:"warning",code:"INVALID_STYLE_RULE",message:`Style 'overpaint' in state 'hovered' is not supported on live geom '${n.geom}' (layer '${n.id}'); it is ignored.`,context:{param:"overpaint",layerIndex:s,requested:n.geom},suggestion:"Remove the hovered overpaint, or paint the hover treatment in the geom's live render."}]):[]:[])}var we=e=>[e.styles.defaults,e.styles.overrides].some(t=>t.some(r=>r.state==="hovered"&&(r.declarations.overpaint?.length??0)>0));function Me(e){const t=new Set,r=[];for(const n of e){const s=ne(n);s===null||t.has(s.type)||s.dataLabelCoordTypes.length===0||s.getDataLabelPlacements!==void 0||(t.add(s.type),r.push({kind:"user-input",severity:"warning",code:"MISSING_DATA_LABEL_PLACEMENT",message:`Geom '${s.type}' declares \`dataLabelCoordTypes\` but implements no \`getDataLabelPlacements\`; its layers paint no data labels.`,context:{requested:s.type,kind:"geom-renderer"},suggestion:"Implement `getDataLabelPlacements(context)` on the geom, or drop `dataLabelCoordTypes` so the compiler warns the author off the flag."}))}return r}var He=e=>(0,Y.createStore)(t=>({scene:e,setScene:r=>t(n=>n.scene===r?n:{scene:r})})),$e=({spec:e,data:t,colorScheme:r,plugins:n,theme:s,resolveRenderer:c,anchorResolver:l,onSpecChange:u,onError:h,onWarnings:p})=>{const R=o.useLatestRef(u),P=o.useLatestRef(h),x=o.useLatestRef(p),[{session:f,compileBus:g}]=(0,d.useState)(()=>{const i=(0,m.createCompiler)({plugins:n,theme:s});return{session:new m.GraphCompilationSession(i),compileBus:Te(i)}}),[S]=(0,d.useState)(()=>{const i=Q(n??[]),v=Q(s?.plugins??[]);return{errors:[...v.errors,...i.errors],warnings:[...v.warnings,...i.warnings]}}),E=(0,d.useRef)(null),[y]=(0,d.useState)(Ae),C=(0,d.useRef)(null),D=(0,d.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),T=(0,d.useCallback)(i=>{if(!i.ok)return i.errors;if(C.current)C.current.getState().setScene(i.scene);else{const v=He(i.scene);v.subscribe(y.notify),C.current=v,y.notify()}return null},[y]),[M,k]=(0,d.useState)(()=>{const i=f.compile({spec:e,data:t,colorScheme:r});return E.current=i,D(T(i))}),G=(0,d.useCallback)(i=>i.ok?[...i.warnings,...Ne(i.scene,c),...De(i.scene,c),..._e(i.scene),...ke(i.scene,c),...qe(i.scene,c),...Le(i.scene,c),...Ie(i.scene,l)]:i.warnings,[c,l]),j=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),P.current?.(i))},[P]),N=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),x.current?.(i))},[x]);(0,d.useEffect)(()=>{const i=E.current;i&&(j([...S.errors,...i.ok?[]:i.errors]),N([...S.warnings,...G(i)]),i.ok&&g.emit({kind:"init"}))},[g,j,N,S,G]),(0,d.useEffect)(()=>{const i=f.update({spec:e,data:t,colorScheme:r});if(!i)return;i.committedSpec&&R.current?.(i.committedSpec);const v=T(i.result);k(D(v)),v&&j(v),N(G(i.result)),v||g.emit({kind:i.specChanged?"spec":"data"})},[e,t,r,f,g,T,j,N,D,G,R]);const I=(0,d.useCallback)(i=>{k(v=>v===null?v:D(null)),N(G(i))},[D,N,G]),H=(0,d.useCallback)(i=>{i.scene&&C.current?.getState().setScene(i.scene),i.result&&I(i.result),i.command&&g.emit({kind:"command",command:i.command}),i.spec&&R.current?.(i.spec),i.errors&&j([...i.errors])},[I,g,R,j]),b=(0,d.useCallback)(i=>{for(const v of i)H(v);return i.some(v=>!!v.scene)},[H]),$=(0,d.useCallback)((i,v)=>{b(f.applyCommand(i,v))},[f,b]),_=(0,d.useCallback)(()=>{b(f.commit())},[f,b]),A=(0,d.useCallback)(()=>b(f.undo()),[f,b]),q=(0,d.useCallback)(()=>b(f.redo()),[f,b]),K=(0,d.useMemo)(()=>({stack:f.history,undo:A,redo:q}),[f,A,q]),he=(0,d.useCallback)(()=>C.current?.getState().scene??null,[]);return{store:C.current,dispatch:$,commit:_,history:K,subscribe:y.subscribe,getScene:he,compileBus:g,compileErrors:M}},Ae=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},oe=({data:e,spec:t,plugins:r=[],theme:n,formattingLocale:s,handleRef:c,onSpecChange:l,onError:u,onWarnings:h,colorScheme:p="light",children:R})=>{const[P]=(0,d.useState)(()=>n),x=P?.colorScheme??p,[f]=(0,d.useState)(()=>o.createGeomRendererResolver([...P?.plugins??[],...r].filter(re))),g=(0,d.useId)(),[S]=(0,d.useState)(()=>(0,m.createAnchorResolver)(r)),[E]=(0,d.useState)(()=>(0,m.createDataLabelPlacementResolver)(r)),[y]=(0,d.useState)(()=>be()),[C]=(0,d.useState)(()=>o.createTargetBoundaryStore()),D=(0,d.useMemo)(()=>(0,m.createStyleResolver)({colorScheme:x}),[x]),{store:T,dispatch:M,commit:k,history:G,subscribe:j,getScene:N,compileBus:I,compileErrors:H}=$e({spec:t,data:e,colorScheme:x,plugins:r,theme:P,resolveRenderer:f,anchorResolver:S,onSpecChange:l,onError:u,onWarnings:h});(0,d.useEffect)(()=>{if(T)return T.subscribe((_,A)=>{if(_.scene.spec===A.scene.spec)return;const{selection:q,setSelection:K}=y.getState();q.length!==0&&K(se(q,_.scene.spec))})},[T,y]);const b=(0,d.useMemo)(()=>({dispatch:M,commit:k}),[M,k]);(0,d.useImperativeHandle)(c,()=>({commands:b,undo:G.undo,redo:G.redo,subscribe:j,getScene:N,getSelection:()=>y.getState().selection,setSelection:_=>y.getState().setSelection(_),subscribeSelection:y.subscribe,canPlaceDataLabels:E.hasCapability,canFormatDataLabelsAsPercentages:E.hasPercentageFormat}),[b,G,j,N,y,E]);const $=(0,d.useMemo)(()=>T?{chartId:g,store:T,selectionStore:y,targetBoundaryStore:C,commands:b,history:G,formattingLocale:s,compileBus:I,colorScheme:x,styleResolver:D,anchorResolver:S}:null,[g,T,y,C,b,G,s,I,x,D,S]);return(0,a.jsx)(te,{forcedErrors:H,onError:u,resetKeys:[t,e],children:$?(0,a.jsx)(o.GraphContext.Provider,{value:$,children:(0,a.jsx)(o.GeomRendererResolverProvider,{value:f,children:(0,a.jsx)(o.DataLabelPlacementResolverProvider,{value:E,children:(0,a.jsx)(o.GeomShapesProvider,{shapes:P?.shapes,children:R})})})}):null})};function Be({theme:e,...t}={}){const r=(0,m.createSpecBuilder)(t);return{...r,GraphProvider:s=>(0,a.jsx)(oe,{...s,plugins:r.plugins,theme:e})}}var w=(e,t)=>{if(typeof e!="string"||!e.endsWith("%"))return null;const r=Number.parseFloat(e);return Number.isFinite(r)?r/100*t:null},ae=({x:e,y:t,width:r,height:n},s)=>{const c=w(e,s.width),l=w(t,s.height),u=w(r,s.width),h=w(n,s.height);return c===null||l===null||u===null||h===null?null:{x:c,y:l,width:u,height:h}},ie=({shouldAnimateTransitions:e,cx:t,cy:r,r:n,effects:s,...c})=>{const l=o.toGeomEffectsStyle(s);return e?(0,a.jsx)(O.motion.circle,{initial:!1,animate:{cx:t,cy:r,r:n},transition:o.DEFAULT_SPRING_TRANSITION,style:l,...c}):(0,a.jsx)("circle",{cx:t,cy:r,r:n,style:l,...c})},le=({shouldAnimateTransitions:e,x1:t,y1:r,x2:n,y2:s,effects:c,...l})=>{const u=o.toGeomEffectsStyle(c);return e?(0,a.jsx)(O.motion.line,{initial:!1,animate:{x1:t,y1:r,x2:n,y2:s},transition:o.DEFAULT_SPRING_TRANSITION,style:u,...l}):(0,a.jsx)("line",{x1:t,y1:r,x2:n,y2:s,style:u,...l})},ce=({shouldAnimateTransitions:e,x:t,y:r,width:n,height:s,rx:c,ry:l,effects:u,...h})=>{const p=o.toGeomEffectsStyle(u);return e?(0,a.jsx)(O.motion.rect,{initial:!1,animate:{attrX:t,attrY:r,width:n,height:s,...c!==void 0&&l!==void 0?{rx:c,ry:l}:{}},transition:o.DEFAULT_SPRING_TRANSITION,style:p,...h}):(0,a.jsx)("rect",{x:t,y:r,width:n,height:s,rx:c,ry:l,style:p,...h})},ue=({shouldAnimateTransitions:e,d:t,source:r,effects:n,...s})=>{const c=o.toGeomEffectsStyle(n);return e?(0,a.jsx)(ze,{d:t,source:r,style:c,...s}):(0,a.jsx)("path",{d:t,style:c,...s})},Oe=e=>{const{Circle:t}=o.useGeomShapes();return t===void 0?ie(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Ke=e=>{const{Line:t}=o.useGeomShapes();return t===void 0?le(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Fe=({cornerRadius:e,...t})=>{const{Rect:r}=o.useGeomShapes(),n=o.useGeomPanelPixelSize(),s=o.useGeomPixelsPerUnit(),c={...t,...Ye(e,t,n,s)};return r===void 0?ce(c):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(r,{...c})})},Ue=e=>{const{Path:t}=o.useGeomShapes();return t===void 0?ue(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},ze=({d:e,source:t,...r})=>{const n=o.useSvgPathMorph(e,o.DEFAULT_SPRING_TRANSITION,t);return(0,a.jsx)(O.motion.path,{d:n,...r})},Ye=(e,t,r,n)=>{if(e===void 0)return{};const s=We(t,r,n);if(s===null)return e==="full"?{}:J((0,m.resolveGeomCornerRadiusPx)({cornerRadius:e}),n);const c=Math.min((0,m.resolveGeomCornerRadiusPx)({cornerRadius:e,box:s}),Math.min(s.width,s.height)/2);return J(c,n)},We=(e,t,r)=>typeof e.width=="number"&&typeof e.height=="number"?{width:Math.abs(e.width)*r.x,height:Math.abs(e.height)*r.y}:t===null?null:ae(e,t),J=(e,t)=>({rx:e/t.x,ry:e/t.y}),Ve=({children:e,...t})=>{const r=o.useGeomPanelPixelSize();return(0,a.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:r,space:"unit",children:e})})},Xe=({box:e,children:t})=>{const r=o.useGeomPanelSize(),n=r===null?null:r.width*(e.x1-e.x0),s=r===null?null:r.height*(e.y1-e.y0),c=(0,d.useMemo)(()=>n===null||s===null?null:{width:n,height:s},[n,s]);return(0,a.jsx)("svg",{x:(0,m.toPercent)(e.x0),y:(0,m.toPercent)(e.y0),width:(0,m.toPercent)(e.x1-e.x0),height:(0,m.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:c,children:t})})},Qe="drqe3u0",Je="drqe3u1",Ze="drqe3u2",et="drqe3u3",L="drqe3u4",tt="drqe3u5",rt="drqe3u6",nt="drqe3u7",B="drqe3u8",st="drqe3u9",ot="drqe3ua";var at="drqe3uc",it="drqe3ud",lt="drqe3ue",ct="drqe3uf";var ut="drqe3uh",dt="drqe3ui",Z={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},ee={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},de={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},ht=({width:e=440,style:t,className:r}={})=>{const{compileBus:n}=o.useGraphContext(),[s]=(0,d.useState)(()=>Re()),[c,l]=(0,d.useState)(!1),[u,h]=(0,d.useState)(m.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:g}=s.getState(),S=n.getLastTrigger(),E=n.getLastCompile();return S&&E&&g(S,E),n.subscribe(g)},[s,n]);const p=(0,F.useStore)(s,g=>g.lastCompile),R=(0,F.useStore)(s,g=>g.history),P=n.getCacheStats(),x=p===null&&R.length===0,f=()=>{h(g=>{const S=!g;return(0,m.setCompilerCachingEnabled)(S),S})};return(0,a.jsxs)("div",{className:(0,U.default)(ot,r),style:{width:e,...t},children:[(0,a.jsxs)("div",{className:Qe,children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:Je,children:"compile cache"}),(0,a.jsx)("div",{className:lt,children:x?"production: stats disabled":p?`last: ${p.label} · ${W(p.durationMs)}`:"awaiting first compile…"})]}),(0,a.jsx)("button",{type:"button",onClick:()=>l(g=>!g),className:ct,children:c?"▾":"▴"})]}),!c&&(0,a.jsxs)("div",{className:"drqe3ub",children:[(0,a.jsxs)("button",{type:"button",onClick:f,className:u?Z.enabled:Z.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,a.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!c&&!x&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(mt,{delta:p?.stages,durations:p?.stageDurationsMs,cumulative:P}),(0,a.jsx)(gt,{entries:R})]})]})},mt=({delta:e,durations:t,cumulative:r})=>(0,a.jsxs)("table",{className:Ze,children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:ut,children:[(0,a.jsx)("th",{className:et,children:"stage"}),(0,a.jsx)("th",{className:L,children:"time"}),(0,a.jsx)("th",{className:L,children:"Δ miss"}),(0,a.jsx)("th",{className:L,children:"Δ hit"}),(0,a.jsx)("th",{className:L,children:"total miss"}),(0,a.jsx)("th",{className:L,children:"total hit"})]})}),(0,a.jsx)("tbody",{children:m.COMPILER_STAGE_KEYS.map(n=>{const s=e?.[n],c=pt(s);return(0,a.jsxs)("tr",{className:at,children:[(0,a.jsxs)("td",{className:tt,children:[(0,a.jsx)("span",{className:de[c],"aria-hidden":!0})," ",n]}),(0,a.jsx)("td",{className:B,children:t===void 0||c==="untouched"?"—":W(t[n])}),(0,a.jsx)("td",{className:c==="ran"?ee.ran:ee.dim,children:s?.misses??0}),(0,a.jsx)("td",{className:B,children:s?.hits??0}),(0,a.jsx)("td",{className:B,children:r[n].misses}),(0,a.jsx)("td",{className:B,children:r[n].hits})]},n)})})]}),gt=({entries:e})=>e.length===0?null:(0,a.jsxs)("div",{className:it,children:[(0,a.jsx)("div",{className:dt,children:"recent compiles"}),e.map(t=>{const r=vt(t.stages,c=>c.misses>0),n=m.COMPILER_STAGE_KEYS.length,s=r===0?"cached":"ran";return(0,a.jsxs)("div",{className:rt,children:[(0,a.jsx)("span",{className:de[s],"aria-hidden":!0}),(0,a.jsx)("span",{className:nt,title:t.label,children:t.label}),(0,a.jsxs)("span",{className:st,children:[r,"/",n," ran · ",W(t.durationMs)]})]},t.id)})]}),pt=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",vt=(e,t)=>{let r=0;for(const n of m.COMPILER_STAGE_KEYS)t(e[n])&&(r+=1);return r},W=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,ft=()=>{const{history:e}=o.useGraphContext(),{stack:t,undo:r,redo:n}=e,s=(0,d.useCallback)(u=>t.subscribe(u),[t]),c=(0,d.useCallback)(()=>t.getSnapshot(),[t]),l=(0,d.useSyncExternalStore)(s,c,c);return(0,d.useMemo)(()=>({...l,undo:r,redo:n}),[l,r,n])},St=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),yt=(e,t={})=>{const{target:r,enabled:n=!0}=t;(0,d.useEffect)(()=>{const s=bt(r);if(!n||!s)return;const c=l=>{if(!Gt(l)||l.defaultPrevented||xt(l.target))return;const u=o.resolveHistoryStep(l);if(!u)return;const h=e.current;h&&(u==="undo"?h.undo():h.redo())&&l.preventDefault()};return s.addEventListener("keydown",c),()=>s.removeEventListener("keydown",c)},[e,r,n])},bt=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Gt=e=>"key"in e,xt=e=>e instanceof HTMLInputElement?!St.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Et=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,F.useStore)(e,t=>t.boundary)};exports.BrandMark=o.BrandMark;exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGeomCircle=ie;exports.DefaultGeomLine=le;exports.DefaultGeomPath=ue;exports.DefaultGeomRect=ce;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=ht;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Oe;exports.GeomLine=Ke;exports.GeomOverpaint=o.GeomOverpaint;exports.GeomPath=Ue;exports.GeomRect=Fe;exports.GraphErrorBoundary=te;exports.GraphErrorPanel=z;exports.GraphProvider=oe;exports.GraphRenderer=o.GraphRenderer;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=Xe;exports.UnitSpaceSvg=Ve;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Be;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=se;exports.readShapePixelRect=ae;exports.readShapePixels=w;exports.resolveBrandMarkVisual=o.resolveBrandMarkVisual;exports.resolvePathStroke=o.resolvePathStroke;exports.scalePointToPanel=o.scalePointToPanel;exports.stampAxisEditTarget=o.stampAxisEditTarget;exports.stampGridEditTarget=o.stampGridEditTarget;exports.stampLegendEditTarget=o.stampLegendEditTarget;exports.useElementScreenRect=o.useElementScreenRect;exports.useGeomHitTest=o.useGeomHitTest;exports.useGeomHover=o.useGeomHover;exports.useGeomPanelSize=o.useGeomPanelSize;exports.useGeomReaderTree=o.useGeomReaderTree;exports.useGeomStyleReader=o.useGeomStyleReader;exports.useGraphCommands=o.useGraphCommands;exports.useGraphHandle=o.useGraphHandle;exports.useGraphHistory=ft;exports.useGraphHistoryShortcuts=yt;exports.useGraphLocale=o.useGraphLocale;exports.useGraphSelection=o.useGraphSelection;exports.useGuidesTakePress=o.useGuidesTakePress;exports.useHandleScene=o.useHandleScene;exports.useHoverState=o.useHoverState;exports.usePaintDefs=o.usePaintDefs;exports.useResolvedStyle=o.useResolvedStyle;exports.useSceneSelector=o.useSceneSelector;exports.useStyleReaderTree=o.useStyleReaderTree;exports.useStyleResolver=o.useStyleResolver;exports.useTargetBoundary=Et;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=o.vars;
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $t as or, At as ar, Bt as Re, Cn as ir, Ct as cr, Dn as Ne, En as lr, Gt as W, H as dr, Ht as z, It as Ge, Kt as Ce, Lt as ve, M as ur, N as hr, Nt as Z, On as te, Ot as mr, R as gr, Rt as H, Sn as pr, Tn as vr, Tt as fr, Ut as we, V as yr, Vt as De, Wt as Sr, Xt as br, Zt as Pe, _n as Er, _t as Tr, a as Rr, at as Nr, bn as Gr, ct as Cr, en as wr, fn as Dr, gn as Y, gt as Pr, h as qr, hn as V, i as Ir, j as _r, jn as J, jt as kr, kn as qe, kt as Lr, ln as $r, mn as Ie, mt as Mr, n as xr, nn as Hr, on as Ar, ot as Br, pn as Or, qt as Kr, r as Fr, s as Ur, t as _e, tn as jr, w as Wr, wn as zr, xn as Yr, yn as Vr, z as Xr, zt as fe } from "./history-chords-DizKvGR-.js";
1
+ import { $t as or, At as ar, Bt as Re, Cn as ir, Ct as cr, Dn as Ne, En as lr, Gt as W, H as dr, Ht as z, It as Ge, Kt as Ce, Lt as ve, M as ur, N as hr, Nt as Z, On as te, Ot as mr, R as gr, Rt as H, Sn as pr, Tn as vr, Tt as fr, Ut as we, V as yr, Vt as De, Wt as Sr, Xt as br, Zt as Pe, _n as Er, _t as Tr, a as Rr, at as Nr, bn as Gr, ct as Cr, en as wr, fn as Dr, gn as Y, gt as Pr, h as qr, hn as V, i as Ir, j as _r, jn as J, jt as kr, kn as qe, kt as Lr, ln as $r, mn as Ie, mt as Mr, n as xr, nn as Hr, on as Ar, ot as Br, pn as Or, qt as Kr, r as Fr, s as Ur, t as _e, tn as jr, w as Wr, wn as zr, xn as Yr, yn as Vr, z as Xr, zt as fe } from "./history-chords-BcKFOh7E.js";
2
2
  import { COMPILER_STAGE_KEYS as re, Geom as ke, GraphCompilationSession as Le, areEditTargetsEqual as $e, buildDiagnostic as oe, createAnchorResolver as Me, createCompiler as xe, createDataLabelPlacementResolver as He, createSpecBuilder as Ae, createStyleResolver as ye, findAnnotation as Be, findLayerById as ae, isCompilerCachingEnabled as Oe, resolveDefinition as Ke, resolveGeomCornerRadiusPx as ie, setCompilerCachingEnabled as Fe, toPercent as F } from "@graphysdk/viz-engine";
3
3
  import { Component as Ue, useCallback as v, useEffect as x, useId as je, useImperativeHandle as We, useMemo as _, useRef as ce, useState as b, useSyncExternalStore as ze } from "react";
4
4
  import { Fragment as Ye, jsx as c, jsxs as f } from "react/jsx-runtime";
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "visualization",
12
12
  "renderer"
13
13
  ],
14
- "version": "1.9.0-beta.1792404455940",
14
+ "version": "1.9.0-beta.1792407460425",
15
15
  "type": "module",
16
16
  "sideEffects": [
17
17
  "**/*.css.ts",
@@ -50,7 +50,7 @@
50
50
  "react-colorful": "^5.6.1",
51
51
  "react-intl": "^8.1.3",
52
52
  "zustand": "^5.0.12",
53
- "@graphysdk/viz-engine": "1.9.0-beta.1792404455940"
53
+ "@graphysdk/viz-engine": "1.9.0-beta.1792407460425"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "@tiptap/core": "^3.0.0",
@@ -152,8 +152,8 @@
152
152
  "vitest": "^4.1.11",
153
153
  "@graphytools/eslint-config": "0.0.1",
154
154
  "@graphytools/eslint-plugin-graphy": "1.0.0",
155
- "@graphytools/vitest-config": "1.0.0",
156
- "@graphytools/typescript-config": "0.0.1"
155
+ "@graphytools/typescript-config": "0.0.1",
156
+ "@graphytools/vitest-config": "1.0.0"
157
157
  },
158
158
  "publishConfig": {
159
159
  "access": "public"