@graphysdk/react-renderer 1.9.0-beta.1793288163741 → 1.9.0-beta.1793293011268

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const o=require("./history-chords-CrDziK5T.cjs");let h=require("@graphysdk/viz-engine"),d=require("react"),a=require("react/jsx-runtime"),U=require("zustand"),K=require("motion/react"),W=require("zustand/vanilla"),z=require("clsx");z=o.__toESM(z,1);var ge="_1a5iqpb0",pe="_1a5iqpb1";var ve="_1a5iqpb3",fe="_1a5iqpb4",Se="_1a5iqpb5";var Y=({errors:e})=>{const[t,...r]=e;return(0,a.jsxs)("div",{role:"alert",className:ge,children:[(0,a.jsx)("strong",{className:pe,children:"This chart could not be rendered."}),t&&(0,a.jsx)(X,{diagnostic:t}),r.length>0&&(0,a.jsx)("ul",{className:"_1a5iqpb2",children:r.map((n,s)=>(0,a.jsx)("li",{children:(0,a.jsx)(X,{diagnostic:n})},`${n.code}-${s}`))})]})},X=({diagnostic:e})=>(0,a.jsxs)("div",{className:ve,children:[(0,a.jsx)("span",{className:fe,children:e.code}),(0,a.jsx)("p",{className:Se,children:e.message}),e.suggestion&&(0,a.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function ye(e=[],t=[]){return e.length===t.length&&e.every((r,n)=>Object.is(r,t[n]))}var ne=class extends d.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,h.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,h.buildDiagnostic)(e);o.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!ye(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,a.jsx)(Y,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,a.jsx)(Y,{errors:t}):r}},se=e=>typeof e=="object"&&"geom"in e&&"render"in e,oe=e=>{const t=(0,h.resolveDefinition)(e);return t instanceof h.Geom?t:null},ae=(e,t)=>{const r=e.filter(n=>be(n,t));return r.length===e.length?e:r},be=(e,t)=>e.kind==="annotation"?(0,h.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,h.findLayerById)(t.layers,e.layerId)!==void 0:!0,Q=[],Ge=()=>(0,W.createStore)(e=>({selection:Q,setSelection:t=>e(r=>xe(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:Q})})),xe=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,n)=>{const s=t[n];return s!==void 0&&(0,h.areEditTargetsEqual)(r,s)}),Te=process.env.NODE_ENV!=="production",Ee=5,Re=e=>{if(!Te)return{emit:()=>{},subscribe:()=>Ce,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()}},Pe=()=>(0,W.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:je(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:s,history:Ne(n.history,s,Ee),nextId:n.nextId+1,lastSnapshot:r}})})),Ce=()=>{},je=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}},Ne=(e,t,r)=>{const n=e.length>=r?e.length-(r-1):0;return[...e.slice(n),t]};function J(e){const t=e.filter(se),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 m=oe(u);m===null||r.has(m.type)||s.has(m.type)||(s.add(m.type),n.push({kind:"userInput",severity:"error",code:"MISSING_GEOM_RENDERER",message:`Custom geom '${m.type}' is registered but has no renderer.`,context:{requested:m.type,kind:"geom-renderer"},suggestion:`Add a render half for it: \`defineGeomRenderer(${m.type}Geom, { coord, render })\`, then include it in \`plugins\`.`}))}const c=new Map;for(const u of t){if("definition"in u)continue;const m=`${u.geom}|${u.coord}`,v=c.get(m);v?v.count+=1:c.set(m,{geom:u.geom,coord:u.coord,count:1})}const l=[];for(const{geom:u,coord:m,count:v}of c.values())v<2||l.push({kind:"userInput",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${m}') (${v} entries); the last in the array wins.`,context:{requested:`${u}@${m}`,kind:"geom-renderer"},suggestion:`Keep a single render-only override for ('${u}', '${m}').`});return l.push(...Me(e)),{errors:n,warnings:l}}function Ie(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:"userInput",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!=="renderHitTest"||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:"userInput",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares spatialKind 'renderHitTest' 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!=="renderHitTest"||typeof s!="object"||t.has(n.geom)||n.data.hasVariable(s.variable)||(t.add(n.geom),r.push({kind:"userInput",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 qe(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="renderHitTest"||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:"userInput",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 ke(e,t){const r=new Set,n=[];for(const s of e.layers)s.interactive!==!1&&(s.spatialKind!=="renderHitTest"||r.has(s.geom)||t.hasCapability(s.geom)||(r.add(s.geom),n.push({kind:"userInput",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 Le(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind==="renderHitTest"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"userInput",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 'renderHitTest'; its push-path hover resolves to nothing.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'renderHitTest' so the scene layer carries the `byKey` index the live render's `pushHover` resolves against."}))}return c}function we(e,t){let r;return e.layers.flatMap((n,s)=>o.isLiveRender(t(n.geom,e.coordSystem.type))?He(n)?(r??=(0,h.createStyleResolver)().readers(e),(r.geom(n).get("overpaint",void 0,"hovered")?.length??0)===0?[]:[{kind:"userInput",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 He=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=oe(n);s===null||t.has(s.type)||s.dataLabelCoordTypes.length===0||s.getDataLabelPlacements!==void 0||(t.add(s.type),r.push({kind:"userInput",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 $e=e=>(0,W.createStore)(t=>({scene:e,setScene:r=>t(n=>n.scene===r?n:{scene:r})})),Ae=({spec:e,data:t,colorScheme:r,plugins:n,theme:s,resolveRenderer:c,anchorResolver:l,onSpecChange:u,onError:m,onWarnings:v})=>{const E=o.useLatestRef(u),R=o.useLatestRef(m),G=o.useLatestRef(v),[{session:f,compileBus:g,findGeom:x}]=(0,d.useState)(()=>{const i=(0,h.createCompiler)({plugins:n,theme:s});return{session:new h.GraphCompilationSession(i),compileBus:Re(i),findGeom:p=>i.findGeom(p)}}),[S]=(0,d.useState)(()=>{const i=J(n??[]),p=J(s?.plugins??[]);return{errors:[...p.errors,...i.errors],warnings:[...p.warnings,...i.warnings]}}),T=(0,d.useRef)(null),[D]=(0,d.useState)(Be),P=(0,d.useRef)(null),b=(0,d.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),_=(0,d.useCallback)(i=>{if(!i.ok)return i.errors;if(P.current)P.current.getState().setScene(i.scene);else{const p=$e(i.scene);p.subscribe(D.notify),P.current=p,D.notify()}return null},[D]),[M,I]=(0,d.useState)(()=>{const i=f.compile({spec:e,data:t,colorScheme:r});return T.current=i,b(_(i))}),C=(0,d.useCallback)(i=>i.ok?[...i.warnings,...Ie(i.scene,c),...De(i.scene,c),..._e(i.scene),...qe(i.scene,c),...Le(i.scene,c),...we(i.scene,c),...ke(i.scene,l)]:i.warnings,[c,l]),j=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),R.current?.(i))},[R]),N=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),G.current?.(i))},[G]);(0,d.useEffect)(()=>{const i=T.current;i&&(j([...S.errors,...i.ok?[]:i.errors]),N([...S.warnings,...C(i)]),i.ok&&g.emit({kind:"init"}))},[g,j,N,S,C]),(0,d.useEffect)(()=>{const i=f.update({spec:e,data:t,colorScheme:r});if(!i)return;i.committedSpec&&E.current?.(i.committedSpec);const p=_(i.result);I(b(p)),p&&j(p),N(C(i.result)),p||g.emit({kind:i.hasSpecChange?"spec":"data"})},[e,t,r,f,g,_,j,N,b,C,E]);const $=(0,d.useCallback)(i=>{I(p=>p===null?p:b(null)),N(C(i))},[b,N,C]),L=(0,d.useCallback)(i=>{i.scene&&P.current?.getState().setScene(i.scene),i.result&&$(i.result),i.command&&g.emit({kind:"command",command:i.command}),i.spec&&E.current?.(i.spec),i.errors&&j([...i.errors])},[$,g,E,j]),y=(0,d.useCallback)(i=>{for(const p of i)L(p);return i.some(p=>!!p.scene)},[L]),A=(0,d.useCallback)((i,p)=>{y(f.applyCommand(i,p))},[f,y]),q=(0,d.useCallback)(()=>{y(f.commit())},[f,y]),B=(0,d.useCallback)(()=>y(f.undo()),[f,y]),w=(0,d.useCallback)(()=>y(f.redo()),[f,y]),F=(0,d.useMemo)(()=>({stack:f.history,undo:B,redo:w}),[f,B,w]),he=(0,d.useCallback)(()=>P.current?.getState().scene??null,[]);return{store:P.current,dispatch:A,commit:q,history:F,subscribe:D.subscribe,getScene:he,compileBus:g,compileErrors:M,findGeom:x}},Be=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},ie=({data:e,spec:t,plugins:r=[],theme:n,formattingLocale:s,handleRef:c,onSpecChange:l,onError:u,onWarnings:m,colorScheme:v="light",children:E})=>{const[R]=(0,d.useState)(()=>n),G=R?.colorScheme??v,[f]=(0,d.useState)(()=>o.createGeomRendererResolver([...R?.plugins??[],...r].filter(se))),g=(0,d.useId)(),[x]=(0,d.useState)(()=>(0,h.createAnchorResolver)(r)),[S]=(0,d.useState)(()=>(0,h.createDataLabelPlacementResolver)(r)),[T]=(0,d.useState)(()=>Ge()),[D]=(0,d.useState)(()=>o.createTargetBoundaryStore()),P=(0,d.useMemo)(()=>(0,h.createStyleResolver)({colorScheme:G}),[G]),{store:b,dispatch:_,commit:M,history:I,subscribe:C,getScene:j,compileBus:N,compileErrors:$,findGeom:L}=Ae({spec:t,data:e,colorScheme:G,plugins:r,theme:R,resolveRenderer:f,anchorResolver:x,onSpecChange:l,onError:u,onWarnings:m});(0,d.useEffect)(()=>{if(b)return b.subscribe((q,B)=>{if(q.scene.spec===B.scene.spec)return;const{selection:w,setSelection:F}=T.getState();w.length!==0&&F(ae(w,q.scene.spec))})},[b,T]);const y=(0,d.useMemo)(()=>({dispatch:_,commit:M}),[_,M]);(0,d.useImperativeHandle)(c,()=>({commands:y,undo:I.undo,redo:I.redo,subscribe:C,getScene:j,getSelection:()=>T.getState().selection,setSelection:q=>T.getState().setSelection(q),subscribeSelection:T.subscribe,canPlaceDataLabels:S.hasCapability,canFormatDataLabelsAsPercentages:S.hasPercentageFormat}),[y,I,C,j,T,S]);const A=(0,d.useMemo)(()=>b?{chartId:g,store:b,selectionStore:T,targetBoundaryStore:D,commands:y,history:I,formattingLocale:s,compileBus:N,colorScheme:G,styleResolver:P,anchorResolver:x,findGeom:L}:null,[g,b,T,D,y,I,s,N,G,P,x,L]);return(0,a.jsx)(ne,{forcedErrors:$,onError:u,resetKeys:[t,e],children:A?(0,a.jsx)(o.GraphContext.Provider,{value:A,children:(0,a.jsx)(o.GeomRendererResolverProvider,{value:f,children:(0,a.jsx)(o.DataLabelPlacementResolverProvider,{value:S,children:(0,a.jsx)(o.GeomShapesProvider,{shapes:R?.shapes,children:E})})})}):null})};function Oe({theme:e,...t}={}){const r=(0,h.createSpecBuilder)(t);return{...r,GraphProvider:s=>(0,a.jsx)(ie,{...s,plugins:r.plugins,theme:e})}}var k=(e,t)=>{if(typeof e=="number")return Number.isFinite(e)?e:null;if(!e.endsWith("%"))return null;const r=Number.parseFloat(e);return Number.isFinite(r)?r/100*t:null},Ke=({x:e,y:t,width:r,height:n},s)=>{const c=k(e,s.width),l=k(t,s.height),u=k(r,s.width),m=k(n,s.height);return c===null||l===null||u===null||m===null?null:{x:c,y:l,width:u,height:m}},le=({animateTransitions:e,cx:t,cy:r,r:n,effects:s,...c})=>{const l=o.toGeomEffectsStyle(s);return e?(0,a.jsx)(K.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})},ce=({animateTransitions:e,x1:t,y1:r,x2:n,y2:s,effects:c,...l})=>{const u=o.toGeomEffectsStyle(c);return e?(0,a.jsx)(K.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})},ue=({animateTransitions:e,x:t,y:r,width:n,height:s,rx:c,ry:l,effects:u,...m})=>{const v=o.toGeomEffectsStyle(u);return e?(0,a.jsx)(K.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:v,...m}):(0,a.jsx)("rect",{x:t,y:r,width:n,height:s,rx:c,ry:l,style:v,...m})},de=({animateTransitions:e,d:t,source:r,effects:n,...s})=>{const c=o.toGeomEffectsStyle(n);return e?(0,a.jsx)(We,{d:t,source:r,style:c,...s}):(0,a.jsx)("path",{d:t,style:c,...s})},Fe=e=>{const{Circle:t}=o.useGeomShapes();return t===void 0?le(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Ue=e=>{const{Line:t}=o.useGeomShapes();return t===void 0?ce(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},ze=({cornerRadius:e,...t})=>{const{Rect:r}=o.useGeomShapes(),n=o.useGeomPanelPixelSize(),s=o.useGeomPixelsPerUnit(),c={...t,...Ve(e,t,n,s)};return r===void 0?ue(c):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(r,{...c})})},Ye=e=>{const{Path:t}=o.useGeomShapes();return t===void 0?de(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},We=({d:e,source:t,...r})=>{const n=o.useSvgPathMorph(e,o.DEFAULT_SPRING_TRANSITION,t);return(0,a.jsx)(K.motion.path,{d:n,...r})},Ve=(e,t,r,n)=>{if(e===void 0)return{};const s=Xe(t,r,n);if(s===null)return e==="full"?{}:ee((0,h.resolveGeomCornerRadiusPx)({cornerRadius:e}),n);const c=Math.min((0,h.resolveGeomCornerRadiusPx)({cornerRadius:e,box:s}),Math.min(s.width,s.height)/2);return ee(c,n)},Xe=(e,t,r)=>{const n=Z(e.width,t?.width,r.x),s=Z(e.height,t?.height,r.y);return n===null||s===null?null:{width:n,height:s}},Z=(e,t,r)=>{if(typeof e=="number")return Number.isFinite(e)?Math.abs(e)*r:null;if(t===void 0)return null;const n=k(e,t);return n===null?null:Math.abs(n)},ee=(e,t)=>t.x<=0||t.y<=0?{rx:0,ry:0}:{rx:e/t.x,ry:e/t.y},Qe=({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})})},Je=({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,h.toPercent)(e.x0),y:(0,h.toPercent)(e.y0),width:(0,h.toPercent)(e.x1-e.x0),height:(0,h.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:c,children:t})})},Ze="drqe3u0",et="drqe3u1",tt="drqe3u2",rt="drqe3u3",H="drqe3u4",nt="drqe3u5",st="drqe3u6",ot="drqe3u7",O="drqe3u8",at="drqe3u9",it="drqe3ua";var lt="drqe3uc",ct="drqe3ud",ut="drqe3ue",dt="drqe3uf";var mt="drqe3uh",ht="drqe3ui",te={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},re={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},me={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},gt=({width:e=440,style:t,className:r}={})=>{const{compileBus:n}=o.useGraphContext(),[s]=(0,d.useState)(()=>Pe()),[c,l]=(0,d.useState)(!1),[u,m]=(0,d.useState)(h.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:g}=s.getState(),x=n.getLastTrigger(),S=n.getLastCompile();return x&&S&&g(x,S),n.subscribe(g)},[s,n]);const v=(0,U.useStore)(s,g=>g.lastCompile),E=(0,U.useStore)(s,g=>g.history),R=n.getCacheStats(),G=v===null&&E.length===0,f=()=>{m(g=>{const x=!g;return(0,h.setCompilerCachingEnabled)(x),x})};return(0,a.jsxs)("div",{className:(0,z.default)(it,r),style:{width:e,...t},children:[(0,a.jsxs)("div",{className:Ze,children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:et,children:"compile cache"}),(0,a.jsx)("div",{className:ut,children:G?"production: stats disabled":v?`last: ${v.label} · ${V(v.durationMs)}`:"awaiting first compile…"})]}),(0,a.jsx)("button",{type:"button",onClick:()=>l(g=>!g),className:dt,children:c?"▾":"▴"})]}),!c&&(0,a.jsxs)("div",{className:"drqe3ub",children:[(0,a.jsxs)("button",{type:"button",onClick:f,className:u?te.enabled:te.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,a.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!c&&!G&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(pt,{delta:v?.stages,durations:v?.stageDurationsMs,cumulative:R}),(0,a.jsx)(vt,{entries:E})]})]})},pt=({delta:e,durations:t,cumulative:r})=>(0,a.jsxs)("table",{className:tt,children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:mt,children:[(0,a.jsx)("th",{className:rt,children:"stage"}),(0,a.jsx)("th",{className:H,children:"time"}),(0,a.jsx)("th",{className:H,children:"Δ miss"}),(0,a.jsx)("th",{className:H,children:"Δ hit"}),(0,a.jsx)("th",{className:H,children:"total miss"}),(0,a.jsx)("th",{className:H,children:"total hit"})]})}),(0,a.jsx)("tbody",{children:h.COMPILER_STAGE_KEYS.map(n=>{const s=e?.[n],c=ft(s);return(0,a.jsxs)("tr",{className:lt,children:[(0,a.jsxs)("td",{className:nt,children:[(0,a.jsx)("span",{className:me[c],"aria-hidden":!0})," ",n]}),(0,a.jsx)("td",{className:O,children:t===void 0||c==="untouched"?"—":V(t[n])}),(0,a.jsx)("td",{className:c==="ran"?re.ran:re.dim,children:s?.misses??0}),(0,a.jsx)("td",{className:O,children:s?.hits??0}),(0,a.jsx)("td",{className:O,children:r[n].misses}),(0,a.jsx)("td",{className:O,children:r[n].hits})]},n)})})]}),vt=({entries:e})=>e.length===0?null:(0,a.jsxs)("div",{className:ct,children:[(0,a.jsx)("div",{className:ht,children:"recent compiles"}),e.map(t=>{const r=St(t.stages,c=>c.misses>0),n=h.COMPILER_STAGE_KEYS.length,s=r===0?"cached":"ran";return(0,a.jsxs)("div",{className:st,children:[(0,a.jsx)("span",{className:me[s],"aria-hidden":!0}),(0,a.jsx)("span",{className:ot,title:t.label,children:t.label}),(0,a.jsxs)("span",{className:at,children:[r,"/",n," ran · ",V(t.durationMs)]})]},t.id)})]}),ft=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",St=(e,t)=>{let r=0;for(const n of h.COMPILER_STAGE_KEYS)t(e[n])&&(r+=1);return r},V=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,yt=()=>{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])},bt=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),Gt=(e,t={})=>{const{target:r,enabled:n=!0}=t;(0,d.useEffect)(()=>{const s=xt(r);if(!n||!s)return;const c=l=>{if(!Tt(l)||l.defaultPrevented||Et(l.target))return;const u=o.resolveHistoryStep(l);if(!u)return;const m=e.current;m&&(u==="undo"?m.undo():m.redo())&&l.preventDefault()};return s.addEventListener("keydown",c),()=>s.removeEventListener("keydown",c)},[e,r,n])},xt=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Tt=e=>"key"in e,Et=e=>e instanceof HTMLInputElement?!bt.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Rt=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,U.useStore)(e,t=>t.boundary)};exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGeomCircle=le;exports.DefaultGeomLine=ce;exports.DefaultGeomPath=de;exports.DefaultGeomRect=ue;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=gt;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Fe;exports.GeomLine=Ue;exports.GeomOverpaint=o.GeomOverpaint;exports.GeomPath=Ye;exports.GeomRect=ze;exports.GraphErrorBoundary=ne;exports.GraphErrorPanel=Y;exports.GraphProvider=ie;exports.GraphRenderer=o.GraphRenderer;exports.GraphyBadge=o.GraphyBadge;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=Je;exports.UnitSpaceSvg=Qe;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Oe;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.getBuiltInEditOutlineShapes=o.getBuiltInEditOutlineShapes;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=ae;exports.readPositionPixels=k;exports.readRectPixels=Ke;exports.resolveGraphyBadgeVariant=o.resolveGraphyBadgeVariant;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=yt;exports.useGraphHistoryShortcuts=Gt;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=Rt;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=o.vars;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const o=require("./history-chords-CyWnvnaA.cjs");let h=require("@graphysdk/viz-engine"),d=require("react"),a=require("react/jsx-runtime"),U=require("zustand"),K=require("motion/react"),W=require("zustand/vanilla"),z=require("clsx");z=o.__toESM(z,1);var ge="_1a5iqpb0",pe="_1a5iqpb1";var ve="_1a5iqpb3",fe="_1a5iqpb4",Se="_1a5iqpb5";var Y=({errors:e})=>{const[t,...r]=e;return(0,a.jsxs)("div",{role:"alert",className:ge,children:[(0,a.jsx)("strong",{className:pe,children:"This chart could not be rendered."}),t&&(0,a.jsx)(X,{diagnostic:t}),r.length>0&&(0,a.jsx)("ul",{className:"_1a5iqpb2",children:r.map((n,s)=>(0,a.jsx)("li",{children:(0,a.jsx)(X,{diagnostic:n})},`${n.code}-${s}`))})]})},X=({diagnostic:e})=>(0,a.jsxs)("div",{className:ve,children:[(0,a.jsx)("span",{className:fe,children:e.code}),(0,a.jsx)("p",{className:Se,children:e.message}),e.suggestion&&(0,a.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function ye(e=[],t=[]){return e.length===t.length&&e.every((r,n)=>Object.is(r,t[n]))}var ne=class extends d.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,h.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,h.buildDiagnostic)(e);o.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!ye(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,a.jsx)(Y,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,a.jsx)(Y,{errors:t}):r}},se=e=>typeof e=="object"&&"geom"in e&&"render"in e,oe=e=>{const t=(0,h.resolveDefinition)(e);return t instanceof h.Geom?t:null},ae=(e,t)=>{const r=e.filter(n=>be(n,t));return r.length===e.length?e:r},be=(e,t)=>e.kind==="annotation"?(0,h.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,h.findLayerById)(t.layers,e.layerId)!==void 0:!0,Q=[],Ge=()=>(0,W.createStore)(e=>({selection:Q,setSelection:t=>e(r=>xe(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:Q})})),xe=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,n)=>{const s=t[n];return s!==void 0&&(0,h.areEditTargetsEqual)(r,s)}),Te=process.env.NODE_ENV!=="production",Ee=5,Re=e=>{if(!Te)return{emit:()=>{},subscribe:()=>Ce,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()}},Pe=()=>(0,W.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:je(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:s,history:Ne(n.history,s,Ee),nextId:n.nextId+1,lastSnapshot:r}})})),Ce=()=>{},je=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}},Ne=(e,t,r)=>{const n=e.length>=r?e.length-(r-1):0;return[...e.slice(n),t]};function J(e){const t=e.filter(se),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 m=oe(u);m===null||r.has(m.type)||s.has(m.type)||(s.add(m.type),n.push({kind:"userInput",severity:"error",code:"MISSING_GEOM_RENDERER",message:`Custom geom '${m.type}' is registered but has no renderer.`,context:{requested:m.type,kind:"geom-renderer"},suggestion:`Add a render half for it: \`defineGeomRenderer(${m.type}Geom, { coord, render })\`, then include it in \`plugins\`.`}))}const c=new Map;for(const u of t){if("definition"in u)continue;const m=`${u.geom}|${u.coord}`,v=c.get(m);v?v.count+=1:c.set(m,{geom:u.geom,coord:u.coord,count:1})}const l=[];for(const{geom:u,coord:m,count:v}of c.values())v<2||l.push({kind:"userInput",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${m}') (${v} entries); the last in the array wins.`,context:{requested:`${u}@${m}`,kind:"geom-renderer"},suggestion:`Keep a single render-only override for ('${u}', '${m}').`});return l.push(...Me(e)),{errors:n,warnings:l}}function Ie(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:"userInput",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!=="renderHitTest"||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:"userInput",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${l.geom}' declares spatialKind 'renderHitTest' 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!=="renderHitTest"||typeof s!="object"||t.has(n.geom)||n.data.hasVariable(s.variable)||(t.add(n.geom),r.push({kind:"userInput",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 qe(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind!=="renderHitTest"||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:"userInput",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 ke(e,t){const r=new Set,n=[];for(const s of e.layers)s.interactive!==!1&&(s.spatialKind!=="renderHitTest"||r.has(s.geom)||t.hasCapability(s.geom)||(r.add(s.geom),n.push({kind:"userInput",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 Le(e,t){const{coordSystem:r,layers:n}=e,s=new Set,c=[];for(const l of n){if(l.interactive===!1||l.spatialKind==="renderHitTest"||s.has(l.geom))continue;const u=t(l.geom,r.type);u===null||!o.isLiveRender(u)||(s.add(l.geom),c.push({kind:"userInput",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 'renderHitTest'; its push-path hover resolves to nothing.`,context:{requested:l.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'renderHitTest' so the scene layer carries the `byKey` index the live render's `pushHover` resolves against."}))}return c}function we(e,t){let r;return e.layers.flatMap((n,s)=>o.isLiveRender(t(n.geom,e.coordSystem.type))?He(n)?(r??=(0,h.createStyleResolver)().readers(e),(r.geom(n).get("overpaint",void 0,"hovered")?.length??0)===0?[]:[{kind:"userInput",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 He=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=oe(n);s===null||t.has(s.type)||s.dataLabelCoordTypes.length===0||s.getDataLabelPlacements!==void 0||(t.add(s.type),r.push({kind:"userInput",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 $e=e=>(0,W.createStore)(t=>({scene:e,setScene:r=>t(n=>n.scene===r?n:{scene:r})})),Ae=({spec:e,data:t,colorScheme:r,plugins:n,theme:s,resolveRenderer:c,anchorResolver:l,onSpecChange:u,onError:m,onWarnings:v})=>{const E=o.useLatestRef(u),R=o.useLatestRef(m),G=o.useLatestRef(v),[{session:f,compileBus:g,findGeom:x}]=(0,d.useState)(()=>{const i=(0,h.createCompiler)({plugins:n,theme:s});return{session:new h.GraphCompilationSession(i),compileBus:Re(i),findGeom:p=>i.findGeom(p)}}),[S]=(0,d.useState)(()=>{const i=J(n??[]),p=J(s?.plugins??[]);return{errors:[...p.errors,...i.errors],warnings:[...p.warnings,...i.warnings]}}),T=(0,d.useRef)(null),[D]=(0,d.useState)(Be),P=(0,d.useRef)(null),b=(0,d.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),_=(0,d.useCallback)(i=>{if(!i.ok)return i.errors;if(P.current)P.current.getState().setScene(i.scene);else{const p=$e(i.scene);p.subscribe(D.notify),P.current=p,D.notify()}return null},[D]),[M,I]=(0,d.useState)(()=>{const i=f.compile({spec:e,data:t,colorScheme:r});return T.current=i,b(_(i))}),C=(0,d.useCallback)(i=>i.ok?[...i.warnings,...Ie(i.scene,c),...De(i.scene,c),..._e(i.scene),...qe(i.scene,c),...Le(i.scene,c),...we(i.scene,c),...ke(i.scene,l)]:i.warnings,[c,l]),j=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),R.current?.(i))},[R]),N=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),G.current?.(i))},[G]);(0,d.useEffect)(()=>{const i=T.current;i&&(j([...S.errors,...i.ok?[]:i.errors]),N([...S.warnings,...C(i)]),i.ok&&g.emit({kind:"init"}))},[g,j,N,S,C]),(0,d.useEffect)(()=>{const i=f.update({spec:e,data:t,colorScheme:r});if(!i)return;i.committedSpec&&E.current?.(i.committedSpec);const p=_(i.result);I(b(p)),p&&j(p),N(C(i.result)),p||g.emit({kind:i.hasSpecChange?"spec":"data"})},[e,t,r,f,g,_,j,N,b,C,E]);const $=(0,d.useCallback)(i=>{I(p=>p===null?p:b(null)),N(C(i))},[b,N,C]),L=(0,d.useCallback)(i=>{i.scene&&P.current?.getState().setScene(i.scene),i.result&&$(i.result),i.command&&g.emit({kind:"command",command:i.command}),i.spec&&E.current?.(i.spec),i.errors&&j([...i.errors])},[$,g,E,j]),y=(0,d.useCallback)(i=>{for(const p of i)L(p);return i.some(p=>!!p.scene)},[L]),A=(0,d.useCallback)((i,p)=>{y(f.applyCommand(i,p))},[f,y]),q=(0,d.useCallback)(()=>{y(f.commit())},[f,y]),B=(0,d.useCallback)(()=>y(f.undo()),[f,y]),w=(0,d.useCallback)(()=>y(f.redo()),[f,y]),F=(0,d.useMemo)(()=>({stack:f.history,undo:B,redo:w}),[f,B,w]),he=(0,d.useCallback)(()=>P.current?.getState().scene??null,[]);return{store:P.current,dispatch:A,commit:q,history:F,subscribe:D.subscribe,getScene:he,compileBus:g,compileErrors:M,findGeom:x}},Be=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},ie=({data:e,spec:t,plugins:r=[],theme:n,formattingLocale:s,handleRef:c,onSpecChange:l,onError:u,onWarnings:m,colorScheme:v="light",children:E})=>{const[R]=(0,d.useState)(()=>n),G=R?.colorScheme??v,[f]=(0,d.useState)(()=>o.createGeomRendererResolver([...R?.plugins??[],...r].filter(se))),g=(0,d.useId)(),[x]=(0,d.useState)(()=>(0,h.createAnchorResolver)(r)),[S]=(0,d.useState)(()=>(0,h.createDataLabelPlacementResolver)(r)),[T]=(0,d.useState)(()=>Ge()),[D]=(0,d.useState)(()=>o.createTargetBoundaryStore()),P=(0,d.useMemo)(()=>(0,h.createStyleResolver)({colorScheme:G}),[G]),{store:b,dispatch:_,commit:M,history:I,subscribe:C,getScene:j,compileBus:N,compileErrors:$,findGeom:L}=Ae({spec:t,data:e,colorScheme:G,plugins:r,theme:R,resolveRenderer:f,anchorResolver:x,onSpecChange:l,onError:u,onWarnings:m});(0,d.useEffect)(()=>{if(b)return b.subscribe((q,B)=>{if(q.scene.spec===B.scene.spec)return;const{selection:w,setSelection:F}=T.getState();w.length!==0&&F(ae(w,q.scene.spec))})},[b,T]);const y=(0,d.useMemo)(()=>({dispatch:_,commit:M}),[_,M]);(0,d.useImperativeHandle)(c,()=>({commands:y,undo:I.undo,redo:I.redo,subscribe:C,getScene:j,getSelection:()=>T.getState().selection,setSelection:q=>T.getState().setSelection(q),subscribeSelection:T.subscribe,canPlaceDataLabels:S.hasCapability,canFormatDataLabelsAsPercentages:S.hasPercentageFormat}),[y,I,C,j,T,S]);const A=(0,d.useMemo)(()=>b?{chartId:g,store:b,selectionStore:T,targetBoundaryStore:D,commands:y,history:I,formattingLocale:s,compileBus:N,colorScheme:G,styleResolver:P,anchorResolver:x,findGeom:L}:null,[g,b,T,D,y,I,s,N,G,P,x,L]);return(0,a.jsx)(ne,{forcedErrors:$,onError:u,resetKeys:[t,e],children:A?(0,a.jsx)(o.GraphContext.Provider,{value:A,children:(0,a.jsx)(o.GeomRendererResolverProvider,{value:f,children:(0,a.jsx)(o.DataLabelPlacementResolverProvider,{value:S,children:(0,a.jsx)(o.GeomShapesProvider,{shapes:R?.shapes,children:E})})})}):null})};function Oe({theme:e,...t}={}){const r=(0,h.createSpecBuilder)(t);return{...r,GraphProvider:s=>(0,a.jsx)(ie,{...s,plugins:r.plugins,theme:e})}}var k=(e,t)=>{if(typeof e=="number")return Number.isFinite(e)?e:null;if(!e.endsWith("%"))return null;const r=Number.parseFloat(e);return Number.isFinite(r)?r/100*t:null},Ke=({x:e,y:t,width:r,height:n},s)=>{const c=k(e,s.width),l=k(t,s.height),u=k(r,s.width),m=k(n,s.height);return c===null||l===null||u===null||m===null?null:{x:c,y:l,width:u,height:m}},le=({animateTransitions:e,cx:t,cy:r,r:n,effects:s,...c})=>{const l=o.toGeomEffectsStyle(s);return e?(0,a.jsx)(K.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})},ce=({animateTransitions:e,x1:t,y1:r,x2:n,y2:s,effects:c,...l})=>{const u=o.toGeomEffectsStyle(c);return e?(0,a.jsx)(K.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})},ue=({animateTransitions:e,x:t,y:r,width:n,height:s,rx:c,ry:l,effects:u,...m})=>{const v=o.toGeomEffectsStyle(u);return e?(0,a.jsx)(K.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:v,...m}):(0,a.jsx)("rect",{x:t,y:r,width:n,height:s,rx:c,ry:l,style:v,...m})},de=({animateTransitions:e,d:t,source:r,effects:n,...s})=>{const c=o.toGeomEffectsStyle(n);return e?(0,a.jsx)(We,{d:t,source:r,style:c,...s}):(0,a.jsx)("path",{d:t,style:c,...s})},Fe=e=>{const{Circle:t}=o.useGeomShapes();return t===void 0?le(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},Ue=e=>{const{Line:t}=o.useGeomShapes();return t===void 0?ce(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},ze=({cornerRadius:e,...t})=>{const{Rect:r}=o.useGeomShapes(),n=o.useGeomPanelPixelSize(),s=o.useGeomPixelsPerUnit(),c={...t,...Ve(e,t,n,s)};return r===void 0?ue(c):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(r,{...c})})},Ye=e=>{const{Path:t}=o.useGeomShapes();return t===void 0?de(e):(0,a.jsx)(o.GeomShapesProvider,{children:(0,a.jsx)(t,{...e})})},We=({d:e,source:t,...r})=>{const n=o.useSvgPathMorph(e,o.DEFAULT_SPRING_TRANSITION,t);return(0,a.jsx)(K.motion.path,{d:n,...r})},Ve=(e,t,r,n)=>{if(e===void 0)return{};const s=Xe(t,r,n);if(s===null)return e==="full"?{}:ee((0,h.resolveGeomCornerRadiusPx)({cornerRadius:e}),n);const c=Math.min((0,h.resolveGeomCornerRadiusPx)({cornerRadius:e,box:s}),Math.min(s.width,s.height)/2);return ee(c,n)},Xe=(e,t,r)=>{const n=Z(e.width,t?.width,r.x),s=Z(e.height,t?.height,r.y);return n===null||s===null?null:{width:n,height:s}},Z=(e,t,r)=>{if(typeof e=="number")return Number.isFinite(e)?Math.abs(e)*r:null;if(t===void 0)return null;const n=k(e,t);return n===null?null:Math.abs(n)},ee=(e,t)=>t.x<=0||t.y<=0?{rx:0,ry:0}:{rx:e/t.x,ry:e/t.y},Qe=({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})})},Je=({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,h.toPercent)(e.x0),y:(0,h.toPercent)(e.y0),width:(0,h.toPercent)(e.x1-e.x0),height:(0,h.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:(0,a.jsx)(o.GeomPanelSizeProvider,{size:c,children:t})})},Ze="drqe3u0",et="drqe3u1",tt="drqe3u2",rt="drqe3u3",H="drqe3u4",nt="drqe3u5",st="drqe3u6",ot="drqe3u7",O="drqe3u8",at="drqe3u9",it="drqe3ua";var lt="drqe3uc",ct="drqe3ud",ut="drqe3ue",dt="drqe3uf";var mt="drqe3uh",ht="drqe3ui",te={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},re={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},me={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},gt=({width:e=440,style:t,className:r}={})=>{const{compileBus:n}=o.useGraphContext(),[s]=(0,d.useState)(()=>Pe()),[c,l]=(0,d.useState)(!1),[u,m]=(0,d.useState)(h.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:g}=s.getState(),x=n.getLastTrigger(),S=n.getLastCompile();return x&&S&&g(x,S),n.subscribe(g)},[s,n]);const v=(0,U.useStore)(s,g=>g.lastCompile),E=(0,U.useStore)(s,g=>g.history),R=n.getCacheStats(),G=v===null&&E.length===0,f=()=>{m(g=>{const x=!g;return(0,h.setCompilerCachingEnabled)(x),x})};return(0,a.jsxs)("div",{className:(0,z.default)(it,r),style:{width:e,...t},children:[(0,a.jsxs)("div",{className:Ze,children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:et,children:"compile cache"}),(0,a.jsx)("div",{className:ut,children:G?"production: stats disabled":v?`last: ${v.label} · ${V(v.durationMs)}`:"awaiting first compile…"})]}),(0,a.jsx)("button",{type:"button",onClick:()=>l(g=>!g),className:dt,children:c?"▾":"▴"})]}),!c&&(0,a.jsxs)("div",{className:"drqe3ub",children:[(0,a.jsxs)("button",{type:"button",onClick:f,className:u?te.enabled:te.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,a.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!c&&!G&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(pt,{delta:v?.stages,durations:v?.stageDurationsMs,cumulative:R}),(0,a.jsx)(vt,{entries:E})]})]})},pt=({delta:e,durations:t,cumulative:r})=>(0,a.jsxs)("table",{className:tt,children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:mt,children:[(0,a.jsx)("th",{className:rt,children:"stage"}),(0,a.jsx)("th",{className:H,children:"time"}),(0,a.jsx)("th",{className:H,children:"Δ miss"}),(0,a.jsx)("th",{className:H,children:"Δ hit"}),(0,a.jsx)("th",{className:H,children:"total miss"}),(0,a.jsx)("th",{className:H,children:"total hit"})]})}),(0,a.jsx)("tbody",{children:h.COMPILER_STAGE_KEYS.map(n=>{const s=e?.[n],c=ft(s);return(0,a.jsxs)("tr",{className:lt,children:[(0,a.jsxs)("td",{className:nt,children:[(0,a.jsx)("span",{className:me[c],"aria-hidden":!0})," ",n]}),(0,a.jsx)("td",{className:O,children:t===void 0||c==="untouched"?"—":V(t[n])}),(0,a.jsx)("td",{className:c==="ran"?re.ran:re.dim,children:s?.misses??0}),(0,a.jsx)("td",{className:O,children:s?.hits??0}),(0,a.jsx)("td",{className:O,children:r[n].misses}),(0,a.jsx)("td",{className:O,children:r[n].hits})]},n)})})]}),vt=({entries:e})=>e.length===0?null:(0,a.jsxs)("div",{className:ct,children:[(0,a.jsx)("div",{className:ht,children:"recent compiles"}),e.map(t=>{const r=St(t.stages,c=>c.misses>0),n=h.COMPILER_STAGE_KEYS.length,s=r===0?"cached":"ran";return(0,a.jsxs)("div",{className:st,children:[(0,a.jsx)("span",{className:me[s],"aria-hidden":!0}),(0,a.jsx)("span",{className:ot,title:t.label,children:t.label}),(0,a.jsxs)("span",{className:at,children:[r,"/",n," ran · ",V(t.durationMs)]})]},t.id)})]}),ft=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",St=(e,t)=>{let r=0;for(const n of h.COMPILER_STAGE_KEYS)t(e[n])&&(r+=1);return r},V=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,yt=()=>{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])},bt=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),Gt=(e,t={})=>{const{target:r,enabled:n=!0}=t;(0,d.useEffect)(()=>{const s=xt(r);if(!n||!s)return;const c=l=>{if(!Tt(l)||l.defaultPrevented||Et(l.target))return;const u=o.resolveHistoryStep(l);if(!u)return;const m=e.current;m&&(u==="undo"?m.undo():m.redo())&&l.preventDefault()};return s.addEventListener("keydown",c),()=>s.removeEventListener("keydown",c)},[e,r,n])},xt=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Tt=e=>"key"in e,Et=e=>e instanceof HTMLInputElement?!bt.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Rt=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,U.useStore)(e,t=>t.boundary)};exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGeomCircle=le;exports.DefaultGeomLine=ce;exports.DefaultGeomPath=de;exports.DefaultGeomRect=ue;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=gt;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Fe;exports.GeomLine=Ue;exports.GeomOverpaint=o.GeomOverpaint;exports.GeomPath=Ye;exports.GeomRect=ze;exports.GraphErrorBoundary=ne;exports.GraphErrorPanel=Y;exports.GraphProvider=ie;exports.GraphRenderer=o.GraphRenderer;exports.GraphyBadge=o.GraphyBadge;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=Je;exports.UnitSpaceSvg=Qe;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Oe;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.getBuiltInEditOutlineShapes=o.getBuiltInEditOutlineShapes;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=ae;exports.readPositionPixels=k;exports.readRectPixels=Ke;exports.resolveGraphyBadgeVariant=o.resolveGraphyBadgeVariant;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=yt;exports.useGraphHistoryShortcuts=Gt;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=Rt;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=o.vars;
package/dist/index.d.ts CHANGED
@@ -1788,7 +1788,7 @@ export declare function useGeomHover(layerId: string): GeomHoverPush;
1788
1788
  */
1789
1789
  export declare const useGeomPanelSize: () => BoxSize | null;
1790
1790
 
1791
- /** The resolver's `geom` subtree, one object per resolver, so the selector never re-renders on a chrome change. */
1791
+ /** The shared `geom` subtree. Changes to `scene.styles` preserve its identity. */
1792
1792
  export declare const useGeomReaderTree: () => StyleReaderTree["geom"];
1793
1793
 
1794
1794
  /**
@@ -1796,8 +1796,7 @@ export declare const useGeomReaderTree: () => StyleReaderTree["geom"];
1796
1796
  * or a highlight's filtered sub-layer. A known geom kind gets back its own readers, whose
1797
1797
  * builtin-backed properties resolve NonNullable.
1798
1798
  *
1799
- * Reads the tree's `geom` subtree, which the resolver shares across every chrome, so a chrome-only
1800
- * recompile does not re-render callers.
1799
+ * Uses the shared `geom` subtree, so changes to `scene.styles` alone do not re-render callers.
1801
1800
  *
1802
1801
  * Shared rest shadows return 'none'; state reads are unchanged. Plugins get this via `input.styleReaders`.
1803
1802
  */
@@ -1932,8 +1931,8 @@ export declare const useResolvedStyle: <TArgs extends readonly unknown[], TResul
1932
1931
  export declare const useSceneSelector: <Selected>(selector: (scene: Scene) => Selected) => Selected;
1933
1932
 
1934
1933
  /**
1935
- * Nested chart style tree from the provider resolver. Subscribes to `scene.chrome`, so a chrome
1936
- * recompile re-renders callers. {@link useGeomStyleReader} does not, which is why this is a separate hook.
1934
+ * Subscribes to `scene.styles` and returns the provider's reader tree. Use {@link useGeomStyleReader}
1935
+ * for layer reads that do not need this subscription.
1937
1936
  */
1938
1937
  export declare const useStyleReaderTree: () => StyleReaderTree;
1939
1938
 
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $t as ar, An as Ne, At as ir, B as cr, Bt as lr, Cn as dr, Dn as ur, Dt as mr, En as hr, Ft as Z, Ht as z, Jt as Ce, M as gr, Mn as Ie, Mt as pr, N as fr, Nt as vr, On as yr, Pn as ee, Qt as Sr, R as br, Rt as De, Sn as Er, Tn as Tr, Tt as Rr, Ut as we, V as Gr, Vt as Nr, Wt as Cr, Xt as Ir, Zt as Dr, _n as Pe, _t as wr, a as Pr, at as qr, bn as _r, ct as kr, dn as A, fn as ye, gn as Lr, h as Hr, hn as Y, i as $r, j as Mr, jn as re, jt as xr, kn as Br, ln as Ar, mn as qe, mt as Or, n as Kr, on as Fr, ot as jr, pn as _e, qt as Ur, r as Wr, rn as zr, s as Yr, t as ke, un as Se, vn as V, vt as Vr, w as Xr, wn as Qr, yn as X, z as Jr, zt as Le } from "./history-chords-CaoYNtzG.js";
1
+ import { $t as ar, An as Ne, At as ir, B as cr, Bt as lr, Cn as dr, Dn as ur, Dt as mr, En as hr, Ft as Z, Ht as z, Jt as Ce, M as gr, Mn as Ie, Mt as pr, N as fr, Nt as vr, On as yr, Pn as ee, Qt as Sr, R as br, Rt as De, Sn as Er, Tn as Tr, Tt as Rr, Ut as we, V as Gr, Vt as Nr, Wt as Cr, Xt as Ir, Zt as Dr, _n as Pe, _t as wr, a as Pr, at as qr, bn as _r, ct as kr, dn as A, fn as ye, gn as Lr, h as Hr, hn as Y, i as $r, j as Mr, jn as re, jt as xr, kn as Br, ln as Ar, mn as qe, mt as Or, n as Kr, on as Fr, ot as jr, pn as _e, qt as Ur, r as Wr, rn as zr, s as Yr, t as ke, un as Se, vn as V, vt as Vr, w as Xr, wn as Qr, yn as X, z as Jr, zt as Le } from "./history-chords-BM-aCZWN.js";
2
2
  import { COMPILER_STAGE_KEYS as ne, Geom as He, GraphCompilationSession as $e, areEditTargetsEqual as Me, buildDiagnostic as ae, createAnchorResolver as xe, createCompiler as Be, createDataLabelPlacementResolver as Ae, createSpecBuilder as Oe, createStyleResolver as be, findAnnotation as Ke, findLayerById as ie, isCompilerCachingEnabled as Fe, resolveDefinition as je, resolveGeomCornerRadiusPx as ce, setCompilerCachingEnabled as Ue, toPercent as U } from "@graphysdk/viz-engine";
3
3
  import { Component as We, useCallback as p, useEffect as B, useId as ze, useImperativeHandle as Ye, useMemo as L, useRef as le, useState as S, useSyncExternalStore as Ve } from "react";
4
4
  import { Fragment as Xe, 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.1793288163741",
14
+ "version": "1.9.0-beta.1793293011268",
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.1793288163741"
53
+ "@graphysdk/viz-engine": "1.9.0-beta.1793293011268"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "@tiptap/core": "^3.0.0",
@@ -150,10 +150,10 @@
150
150
  "vite-plugin-dts": "^4.5.4",
151
151
  "vite-plugin-lib-inject-css": "^2.2.2",
152
152
  "vitest": "^4.1.11",
153
- "@graphytools/vitest-config": "1.0.0",
154
- "@graphytools/eslint-plugin-graphy": "1.0.0",
155
153
  "@graphytools/eslint-config": "0.0.1",
156
- "@graphytools/typescript-config": "0.0.1"
154
+ "@graphytools/eslint-plugin-graphy": "1.0.0",
155
+ "@graphytools/typescript-config": "0.0.1",
156
+ "@graphytools/vitest-config": "1.0.0"
157
157
  },
158
158
  "publishConfig": {
159
159
  "access": "public"