@graphysdk/react-renderer 1.9.0-beta.1791541380583 → 1.9.0-beta.1791545910919

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 Vn = Object.defineProperty, Hl = (e, t) => {
22
22
  });
23
23
  return t || Vn(r, Symbol.toStringTag, { value: "Module" }), r;
24
24
  };
25
- typeof window < "u" && (window.__GRAPHY_SDK__ ??= {}, window.__GRAPHY_SDK__.reactRenderer = "1.9.0-beta.1791541380583");
25
+ typeof window < "u" && (window.__GRAPHY_SDK__ ??= {}, window.__GRAPHY_SDK__.reactRenderer = "1.9.0-beta.1791545910919");
26
26
  function Fl(e) {
27
27
  for (const t of e) (t.severity === "error" ? console.error : console.warn)(`[graphy] ${t.code}: ${t.message}`, t);
28
28
  }
@@ -7482,13 +7482,15 @@ var Kp = (e, t, r, n) => t !== "comment" ? r : $o(r, 140, (o) => e.measureText(o
7482
7482
  style: { overflow: "visible" },
7483
7483
  children: e.map((u) => {
7484
7484
  if (u.geometry !== "linear" || !u.gridVisible) return null;
7485
- const h = u.position === "bottom" || u.position === "top", g = xe(u.scaleAestheticKey) === "x" ? i : l, f = ve(g.dashArray, g.strokeWidth);
7485
+ const h = xe(u.scaleAestheticKey) === "x" ? i : l;
7486
+ if (h.strokeWidth <= 0) return null;
7487
+ const g = u.position === "bottom" || u.position === "top", f = ve(h.dashArray, h.strokeWidth);
7486
7488
  return /* @__PURE__ */ s("g", { children: u.ticks.map((v, m) => {
7487
- const p = Im(h, v.position);
7489
+ const p = Im(g, v.position);
7488
7490
  if (p !== null && t[p] > 0) return null;
7489
- const x = h ? v.position : 1 - v.position;
7491
+ const x = g ? v.position : 1 - v.position;
7490
7492
  let A;
7491
- if (h) {
7493
+ if (g) {
7492
7494
  const k = x * n.width + d;
7493
7495
  A = {
7494
7496
  x1: k,
@@ -7509,8 +7511,8 @@ var Kp = (e, t, r, n) => t !== "comment" ? r : $o(r, 140, (o) => e.measureText(o
7509
7511
  ...A,
7510
7512
  ...Xi,
7511
7513
  strokeDasharray: f,
7512
- strokeWidth: g.strokeWidth,
7513
- stroke: g.stroke
7514
+ strokeWidth: h.strokeWidth,
7515
+ stroke: h.stroke
7514
7516
  });
7515
7517
  return a ? /* @__PURE__ */ S("g", {
7516
7518
  ...Ni(u.scaleAestheticKey),
@@ -7704,6 +7706,7 @@ var qi = (e, t) => {
7704
7706
  ]
7705
7707
  });
7706
7708
  }, Sr = ({ axis: e, lineStyle: t, isHitTestable: r, draw: n }) => {
7709
+ if (t.strokeWidth <= 0) return null;
7707
7710
  const o = n({
7708
7711
  stroke: t.stroke,
7709
7712
  strokeWidth: t.strokeWidth
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const a=require("./history-chords-tKvI0zg9.cjs");let g=require("@graphysdk/viz-engine"),l=require("react"),o=require("react/jsx-runtime"),Y=require("zustand"),K=require("motion/react"),z=require("zustand/vanilla"),V=require("clsx");V=a.__toESM(V,1);var pe="_1a5iqpb0",ve="_1a5iqpb1";var fe="_1a5iqpb3",Se="_1a5iqpb4",ye="_1a5iqpb5";var W=({errors:e})=>{const[t,...r]=e;return(0,o.jsxs)("div",{role:"alert",className:pe,children:[(0,o.jsx)("strong",{className:ve,children:"This chart could not be rendered."}),t&&(0,o.jsx)(Q,{diagnostic:t}),r.length>0&&(0,o.jsx)("ul",{className:"_1a5iqpb2",children:r.map((s,n)=>(0,o.jsx)("li",{children:(0,o.jsx)(Q,{diagnostic:s})},`${s.code}-${n}`))})]})},Q=({diagnostic:e})=>(0,o.jsxs)("div",{className:fe,children:[(0,o.jsx)("span",{className:Se,children:e.code}),(0,o.jsx)("p",{className:ye,children:e.message}),e.suggestion&&(0,o.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function be(e=[],t=[]){return e.length===t.length&&e.every((r,s)=>Object.is(r,t[s]))}var re=class extends l.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,g.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,g.buildDiagnostic)(e);a.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!be(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,o.jsx)(W,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,o.jsx)(W,{errors:t}):r}},se={},ne=(0,l.createContext)(se),M=({shapes:e=se,children:t})=>(0,o.jsx)(ne.Provider,{value:e,children:t}),U=()=>(0,l.useContext)(ne),oe=e=>typeof e=="object"&&"geom"in e&&"render"in e,ae=e=>{const t=(0,g.resolveDefinition)(e);return t instanceof g.Geom?t:null},ie=(e,t)=>{const r=e.filter(s=>Ee(s,t));return r.length===e.length?e:r},Ee=(e,t)=>e.kind==="annotation"?(0,g.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,g.findLayerById)(t.layers,e.layerId)!==void 0:!0,J=[],Te=()=>(0,z.createStore)(e=>({selection:J,setSelection:t=>e(r=>xe(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:J})})),xe=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,s)=>{const n=t[s];return n!==void 0&&(0,g.areEditTargetsEqual)(r,n)}),Ge=process.env.NODE_ENV!=="production",Re=5,Ce=e=>{if(!Ge)return{emit:()=>{},subscribe:()=>Ne,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let r=null;return{emit:s=>{const n=e.getLastCompile();if(n){r=s;for(const d of t)d(s,n)}},subscribe:s=>(t.add(s),()=>{t.delete(s)}),getLastTrigger:()=>r,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},je=()=>(0,z.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,r)=>e(s=>{if(s.lastSnapshot===r)return s;const n={id:s.nextId,label:De(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:n,history:Pe(s.history,n,Re),nextId:s.nextId+1,lastSnapshot:r}})})),Ne=()=>{},De=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}},Pe=(e,t,r)=>{const s=e.length>=r?e.length-(r-1):0;return[...e.slice(s),t]};function _e(e,t){let r;return e.layers.flatMap((s,n)=>a.isOverlayHosted(t(s.geom,e.coordSystem.type))?He(s)?(r??=(0,g.createStyleResolver)().readers(e),Ae(s,r.geom(s))?[{kind:"user-input",severity:"warning",code:"INVALID_STYLE_RULE",message:`Style 'overlay' is not supported on portal-rendered geom '${s.geom}' (layer '${s.id}'); it is ignored.`,context:{param:"overlay",layerIndex:n,requested:s.geom},suggestion:"Remove the geom overlay or use a renderer that paints inside the panel SVG."}]:[]):[]:[])}function Z(e){const t=e.filter(oe),r=new Set([...Object.keys(a.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),s=[],n=new Set;for(const u of e){const h=ae(u);h===null||r.has(h.type)||n.has(h.type)||(n.add(h.type),s.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 d=new Map;for(const u of t){if("definition"in u)continue;const h=`${u.geom}|${u.coord}`,v=d.get(h);v?v.count+=1:d.set(h,{geom:u.geom,coord:u.coord,count:1})}const c=[];for(const{geom:u,coord:h,count:v}of d.values())v<2||c.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${h}') (${v} 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 c.push(...Oe(e)),{errors:s,warnings:c}}function Ie(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s)t(c.geom,r.type)!==null||n.has(c.geom)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${c.geom}' under ${r.type} coords; the layer is not painted.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${c.geom}', '${r.type}') via \`defineGeomRenderer\`.`}));return d}function ke(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||u.hitTest||a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares spatialKind 'render-hit-test' but its renderer provides no hit-test; the layer has no hover.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Add a \`hitTest\` factory (precomputed geometry) or an overlay render (\`{ fn, options: { overlay: true } }\`, live simulation) to the renderer for ('${c.geom}', '${r.type}').`}))}return d}function qe(e){const t=new Set,r=[];for(const s of e.layers){const n=s.identityKey;s.interactive!==!1&&(s.spatialKind!=="render-hit-test"||typeof n!="object"||t.has(s.geom)||s.data.hasVariable(n.variable)||(t.add(s.geom),r.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${s.geom}' keys its identity on '${n.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:s.geom,kind:"geom-renderer"},suggestion:`Emit the '${n.variable}' column from the geom's \`compile()\`, or point \`identityKey\` at a column it does emit.`})))}return r}function Le(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||!u.hitTest||!a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"CONFLICTING_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares both a \`hitTest\` factory and an overlay render; these are alternatives, so only the overlay is used.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:"Keep one: a `hitTest` factory for precomputed geometry, OR an overlay render (`{ fn, options: { overlay: true } }`) for a live simulation."}))}return d}function we(e,t){const r=new Set,s=[];for(const n of e.layers)n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||r.has(n.geom)||t.hasCapability(n.geom)||(r.add(n.geom),s.push({kind:"user-input",severity:"warning",code:"MISSING_ANCHOR_CAPABILITY",message:`Geom '${n.geom}' declares no \`resolveAnchorPosition\`; its observations cannot be annotated, so the editor overlay paints no creation trigger on them.`,context:{requested:n.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 s}function Me(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind==="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||!a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"OVERLAY_REQUIRES_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares an overlay render but its layer's spatialKind is '${c.spatialKind}', not 'render-hit-test'; the overlay's push-path hover resolves to nothing.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'render-hit-test' so the scene layer carries the `byKey` index the overlay's `pushHover` resolves against."}))}return d}var He=e=>[e.styles.defaults,e.styles.overrides].some(t=>t.some(r=>(r.declarations.overlay?.length??0)>0)),Ae=(e,t)=>{const[r]=e.data;if(r===void 0)return!1;if((t.get("overlay",r)?.length??0)>0)return!0;for(const s of e.data)if((t.get("overlay",s,"hovered")?.length??0)>0)return!0;return!1};function Oe(e){const t=new Set,r=[];for(const s of e){const n=ae(s);n===null||t.has(n.type)||n.dataLabelCoordTypes.length===0||n.getDataLabelPlacements!==void 0||(t.add(n.type),r.push({kind:"user-input",severity:"warning",code:"MISSING_DATA_LABEL_PLACEMENT",message:`Geom '${n.type}' declares \`dataLabelCoordTypes\` but implements no \`getDataLabelPlacements\`; its layers paint no data labels.`,context:{requested:n.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,z.createStore)(t=>({scene:e,setScene:r=>t(s=>s.scene===r?s:{scene:r})})),Be=({spec:e,data:t,customPalettes:r,colorScheme:s,plugins:n,theme:d,resolveRenderer:c,anchorResolver:u,onSpecChange:h,onError:v,onWarnings:_})=>{const N=a.useLatestRef(h),T=a.useLatestRef(v),x=a.useLatestRef(_),[{session:m,compileBus:f}]=(0,l.useState)(()=>{const i=(0,g.createCompiler)({plugins:n,theme:d});return{session:new g.GraphCompilationSession(i),compileBus:Ce(i)}}),[S]=(0,l.useState)(()=>{const i=Z(n??[]),p=Z(d?.plugins??[]);return{errors:[...p.errors,...i.errors],warnings:[...p.warnings,...i.warnings]}}),P=(0,l.useRef)(null),[y]=(0,l.useState)(Ke),R=(0,l.useRef)(null),D=(0,l.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),G=(0,l.useCallback)(i=>{if(!i.ok)return i.errors;if(R.current)R.current.getState().setScene(i.scene);else{const p=$e(i.scene);p.subscribe(y.notify),R.current=p,y.notify()}return null},[y]),[H,k]=(0,l.useState)(()=>{const i=m.compile({spec:e,data:t,customPalettes:r,colorScheme:s});return P.current=i,D(G(i))}),E=(0,l.useCallback)(i=>i.ok?[...i.warnings,...Ie(i.scene,c),...ke(i.scene,c),...qe(i.scene),...Le(i.scene,c),...Me(i.scene,c),..._e(i.scene,c),...we(i.scene,u)]:i.warnings,[c,u]),C=(0,l.useCallback)(i=>{i.length!==0&&(a.logDiagnostics(i),T.current?.(i))},[T]),j=(0,l.useCallback)(i=>{i.length!==0&&(a.logDiagnostics(i),x.current?.(i))},[x]);(0,l.useEffect)(()=>{const i=P.current;i&&(C([...S.errors,...i.ok?[]:i.errors]),j([...S.warnings,...E(i)]),i.ok&&f.emit({kind:"init"}))},[f,C,j,S,E]),(0,l.useEffect)(()=>{const i=m.update({spec:e,data:t,customPalettes:r,colorScheme:s});if(!i)return;i.committedSpec&&N.current?.(i.committedSpec);const p=G(i.result);k(D(p)),p&&C(p),j(E(i.result)),p||f.emit({kind:i.specChanged?"spec":"data"})},[e,t,r,s,m,f,G,C,j,D,E,N]);const q=(0,l.useCallback)(i=>{k(p=>p===null?p:D(null)),j(E(i))},[D,j,E]),A=(0,l.useCallback)(i=>{i.scene&&R.current?.getState().setScene(i.scene),i.result&&q(i.result),i.command&&f.emit({kind:"command",command:i.command}),i.spec&&N.current?.(i.spec),i.errors&&C([...i.errors])},[q,f,N,C]),b=(0,l.useCallback)(i=>{for(const p of i)A(p);return i.some(p=>!!p.scene)},[A]),O=(0,l.useCallback)((i,p)=>{b(m.applyCommand(i,p))},[m,b]),I=(0,l.useCallback)(()=>{b(m.commit())},[m,b]),$=(0,l.useCallback)(()=>b(m.undo()),[m,b]),L=(0,l.useCallback)(()=>b(m.redo()),[m,b]),F=(0,l.useMemo)(()=>({stack:m.history,undo:$,redo:L}),[m,$,L]),ge=(0,l.useCallback)(()=>R.current?.getState().scene??null,[]);return{store:R.current,dispatch:O,commit:I,history:F,subscribe:y.subscribe,getScene:ge,compileBus:f,compileErrors:H}},Ke=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},ce=({data:e,spec:t,plugins:r=[],theme:s,formattingLocale:n,handleRef:d,onSpecChange:c,onError:u,onWarnings:h,customPalettes:v,colorScheme:_="light",children:N})=>{const[T]=(0,l.useState)(()=>s),x=T?.colorScheme??_,[m]=(0,l.useState)(()=>a.createGeomRendererResolver([...T?.plugins??[],...r].filter(oe))),f=(0,l.useId)(),[S]=(0,l.useState)(()=>(0,g.createAnchorResolver)(r)),[P]=(0,l.useState)(()=>(0,g.createDataLabelPlacementResolver)(r)),[y]=(0,l.useState)(()=>Te()),[R]=(0,l.useState)(()=>a.createTargetBoundaryStore()),D=(0,l.useMemo)(()=>(0,g.createStyleResolver)({colorScheme:x}),[x]),{store:G,dispatch:H,commit:k,history:E,subscribe:C,getScene:j,compileBus:q,compileErrors:A}=Be({spec:t,data:e,customPalettes:v,colorScheme:x,plugins:r,theme:T,resolveRenderer:m,anchorResolver:S,onSpecChange:c,onError:u,onWarnings:h});(0,l.useEffect)(()=>{if(G)return G.subscribe((I,$)=>{if(I.scene.spec===$.scene.spec)return;const{selection:L,setSelection:F}=y.getState();L.length!==0&&F(ie(L,I.scene.spec))})},[G,y]);const b=(0,l.useMemo)(()=>({dispatch:H,commit:k}),[H,k]);(0,l.useImperativeHandle)(d,()=>({commands:b,undo:E.undo,redo:E.redo,subscribe:C,getScene:j,getSelection:()=>y.getState().selection,setSelection:I=>y.getState().setSelection(I),subscribeSelection:y.subscribe,canPlaceDataLabels:P.hasCapability,canFormatDataLabelsAsPercentages:P.hasPercentageFormat}),[b,E,C,j,y,P]);const O=(0,l.useMemo)(()=>G?{chartId:f,store:G,selectionStore:y,targetBoundaryStore:R,commands:b,history:E,formattingLocale:n,compileBus:q,colorScheme:x,styleResolver:D,anchorResolver:S}:null,[f,G,y,R,b,E,n,q,x,D,S]);return(0,o.jsx)(re,{forcedErrors:A,onError:u,resetKeys:[t,e],children:O?(0,o.jsx)(a.GraphContext.Provider,{value:O,children:(0,o.jsx)(a.GeomRendererResolverProvider,{value:m,children:(0,o.jsx)(a.DataLabelPlacementResolverProvider,{value:P,children:(0,o.jsx)(M,{shapes:T?.shapes,children:N})})})}):null})};function Ue({theme:e,...t}={}){const r=(0,g.createSpecBuilder)(t);return{...r,GraphProvider:n=>(0,o.jsx)(ce,{...n,plugins:r.plugins,theme:e})}}var le=({shouldAnimateTransitions:e,cx:t,cy:r,r:s,...n})=>e?(0,o.jsx)(K.motion.circle,{initial:!1,animate:{cx:t,cy:r,r:s},transition:a.DEFAULT_SPRING_TRANSITION,...n}):(0,o.jsx)("circle",{cx:t,cy:r,r:s,...n}),de=({shouldAnimateTransitions:e,x1:t,y1:r,x2:s,y2:n,...d})=>e?(0,o.jsx)(K.motion.line,{initial:!1,animate:{x1:t,y1:r,x2:s,y2:n},transition:a.DEFAULT_SPRING_TRANSITION,...d}):(0,o.jsx)("line",{x1:t,y1:r,x2:s,y2:n,...d}),ue=({shouldAnimateTransitions:e,x:t,y:r,width:s,height:n,...d})=>e?(0,o.jsx)(K.motion.rect,{initial:!1,animate:{attrX:t,attrY:r,width:s,height:n},transition:a.DEFAULT_SPRING_TRANSITION,...d}):(0,o.jsx)("rect",{x:t,y:r,width:s,height:n,...d}),me=({shouldAnimateTransitions:e,d:t,source:r,...s})=>e?(0,o.jsx)(ze,{d:t,source:r,...s}):(0,o.jsx)("path",{d:t,...s}),Fe=e=>{const{Circle:t}=U();return t===void 0?le(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},Ye=e=>{const{Line:t}=U();return t===void 0?de(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},Ve=e=>{const{Rect:t}=U();return t===void 0?ue(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},We=e=>{const{Path:t}=U();return t===void 0?me(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},ze=({d:e,source:t,...r})=>{const s=a.useSvgPathMorph(e,a.DEFAULT_SPRING_TRANSITION,t);return(0,o.jsx)(K.motion.path,{d:s,...r})},Xe=({children:e,...t})=>(0,o.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:e}),Qe=({box:e,children:t})=>(0,o.jsx)("svg",{x:(0,g.toPercent)(e.x0),y:(0,g.toPercent)(e.y0),width:(0,g.toPercent)(e.x1-e.x0),height:(0,g.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:t}),Je="drqe3u0",Ze="drqe3u1",et="drqe3u2",tt="drqe3u3",w="drqe3u4",rt="drqe3u5",st="drqe3u6",nt="drqe3u7",B="drqe3u8",ot="drqe3u9",at="drqe3ua";var it="drqe3uc",ct="drqe3ud",lt="drqe3ue",dt="drqe3uf";var ut="drqe3uh",mt="drqe3ui",ee={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},te={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},he={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},ht=({width:e=440,style:t,className:r}={})=>{const{compileBus:s}=a.useGraphContext(),[n]=(0,l.useState)(()=>je()),[d,c]=(0,l.useState)(!1),[u,h]=(0,l.useState)(g.isCompilerCachingEnabled);(0,l.useEffect)(()=>{const{recordCompile:m}=n.getState(),f=s.getLastTrigger(),S=s.getLastCompile();return f&&S&&m(f,S),s.subscribe(m)},[n,s]);const v=(0,Y.useStore)(n,m=>m.lastCompile),_=(0,Y.useStore)(n,m=>m.history),N=s.getCacheStats(),T=v===null&&_.length===0,x=()=>{h(m=>{const f=!m;return(0,g.setCompilerCachingEnabled)(f),f})};return(0,o.jsxs)("div",{className:(0,V.default)(at,r),style:{width:e,...t},children:[(0,o.jsxs)("div",{className:Je,children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("div",{className:Ze,children:"compile cache"}),(0,o.jsx)("div",{className:lt,children:T?"production: stats disabled":v?`last: ${v.label} · ${X(v.durationMs)}`:"awaiting first compile…"})]}),(0,o.jsx)("button",{type:"button",onClick:()=>c(m=>!m),className:dt,children:d?"▾":"▴"})]}),!d&&(0,o.jsxs)("div",{className:"drqe3ub",children:[(0,o.jsxs)("button",{type:"button",onClick:x,className:u?ee.enabled:ee.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,o.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!d&&!T&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(gt,{delta:v?.stages,durations:v?.stageDurationsMs,cumulative:N}),(0,o.jsx)(pt,{entries:_})]})]})},gt=({delta:e,durations:t,cumulative:r})=>(0,o.jsxs)("table",{className:et,children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{className:ut,children:[(0,o.jsx)("th",{className:tt,children:"stage"}),(0,o.jsx)("th",{className:w,children:"time"}),(0,o.jsx)("th",{className:w,children:"Δ miss"}),(0,o.jsx)("th",{className:w,children:"Δ hit"}),(0,o.jsx)("th",{className:w,children:"total miss"}),(0,o.jsx)("th",{className:w,children:"total hit"})]})}),(0,o.jsx)("tbody",{children:g.COMPILER_STAGE_KEYS.map(s=>{const n=e?.[s],d=vt(n);return(0,o.jsxs)("tr",{className:it,children:[(0,o.jsxs)("td",{className:rt,children:[(0,o.jsx)("span",{className:he[d],"aria-hidden":!0})," ",s]}),(0,o.jsx)("td",{className:B,children:t===void 0||d==="untouched"?"—":X(t[s])}),(0,o.jsx)("td",{className:d==="ran"?te.ran:te.dim,children:n?.misses??0}),(0,o.jsx)("td",{className:B,children:n?.hits??0}),(0,o.jsx)("td",{className:B,children:r[s].misses}),(0,o.jsx)("td",{className:B,children:r[s].hits})]},s)})})]}),pt=({entries:e})=>e.length===0?null:(0,o.jsxs)("div",{className:ct,children:[(0,o.jsx)("div",{className:mt,children:"recent compiles"}),e.map(t=>{const r=ft(t.stages,d=>d.misses>0),s=g.COMPILER_STAGE_KEYS.length,n=r===0?"cached":"ran";return(0,o.jsxs)("div",{className:st,children:[(0,o.jsx)("span",{className:he[n],"aria-hidden":!0}),(0,o.jsx)("span",{className:nt,title:t.label,children:t.label}),(0,o.jsxs)("span",{className:ot,children:[r,"/",s," ran · ",X(t.durationMs)]})]},t.id)})]}),vt=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",ft=(e,t)=>{let r=0;for(const s of g.COMPILER_STAGE_KEYS)t(e[s])&&(r+=1);return r},X=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,St=()=>{const{history:e}=a.useGraphContext(),{stack:t,undo:r,redo:s}=e,n=(0,l.useCallback)(u=>t.subscribe(u),[t]),d=(0,l.useCallback)(()=>t.getSnapshot(),[t]),c=(0,l.useSyncExternalStore)(n,d,d);return(0,l.useMemo)(()=>({...c,undo:r,redo:s}),[c,r,s])},yt=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),bt=(e,t={})=>{const{target:r,enabled:s=!0}=t;(0,l.useEffect)(()=>{const n=Et(r);if(!s||!n)return;const d=c=>{if(!Tt(c)||c.defaultPrevented||xt(c.target))return;const u=a.resolveHistoryStep(c);if(!u)return;const h=e.current;h&&(u==="undo"?h.undo():h.redo())&&c.preventDefault()};return n.addEventListener("keydown",d),()=>n.removeEventListener("keydown",d)},[e,r,s])},Et=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Tt=e=>"key"in e,xt=e=>e instanceof HTMLInputElement?!yt.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Gt=()=>{const{targetBoundaryStore:e}=a.useGraphContext();return(0,Y.useStore)(e,t=>t.boundary)};exports.BrandMark=a.BrandMark;exports.CanvasTextMeasurer=a.CanvasTextMeasurer;exports.DefaultFooter=a.DefaultFooter;exports.DefaultGeomCircle=le;exports.DefaultGeomLine=de;exports.DefaultGeomPath=me;exports.DefaultGeomRect=ue;exports.DefaultGrid=a.DefaultGrid;exports.DefaultHeader=a.DefaultHeader;exports.DefaultSwatch=a.DefaultSwatch;exports.DefaultTooltip=a.DefaultTooltip;exports.DevToolsPanel=ht;exports.GRAPH_MODES=a.GRAPH_MODES;exports.GeomCircle=Fe;exports.GeomLine=Ye;exports.GeomPath=We;exports.GeomRect=Ve;exports.GraphErrorBoundary=re;exports.GraphErrorPanel=W;exports.GraphProvider=ce;exports.GraphRenderer=a.GraphRenderer;exports.HoverProvider=a.HoverProvider;exports.IntroFade=a.IntroFade;exports.IntroWipeClip=a.IntroWipeClip;exports.TextMeasurerProvider=a.TextMeasurerProvider;exports.ThemeProvider=a.ThemeProvider;exports.UnitBoxSvg=Qe;exports.UnitSpaceSvg=Xe;exports.buildDotsEditOutlineShapes=a.buildDotsEditOutlineShapes;exports.createGraphyKit=Ue;exports.darkTheme=a.darkTheme;exports.defineGeomRenderer=a.defineGeomRenderer;exports.lightTheme=a.lightTheme;exports.lightenCss=a.lightenCss;exports.projectPointCartesian=a.projectPointCartesian;exports.pruneSelection=ie;exports.resolveBrandMarkVisual=a.resolveBrandMarkVisual;exports.scalePointToPanel=a.scalePointToPanel;exports.stampAxisEditTarget=a.stampAxisEditTarget;exports.stampGridEditTarget=a.stampGridEditTarget;exports.stampLegendEditTarget=a.stampLegendEditTarget;exports.useElementScreenRect=a.useElementScreenRect;exports.useGeomHitTest=a.useGeomHitTest;exports.useGeomHover=a.useGeomHover;exports.useGeomReaderTree=a.useGeomReaderTree;exports.useGeomStyleReader=a.useGeomStyleReader;exports.useGraphCommands=a.useGraphCommands;exports.useGraphHandle=a.useGraphHandle;exports.useGraphHistory=St;exports.useGraphHistoryShortcuts=bt;exports.useGraphLocale=a.useGraphLocale;exports.useGraphSelection=a.useGraphSelection;exports.useGuidesTakePress=a.useGuidesTakePress;exports.useHandleScene=a.useHandleScene;exports.useHoverState=a.useHoverState;exports.usePaintDefs=a.usePaintDefs;exports.useResolvedStyle=a.useResolvedStyle;exports.useSceneSelector=a.useSceneSelector;exports.useStyleReaderTree=a.useStyleReaderTree;exports.useStyleResolver=a.useStyleResolver;exports.useTargetBoundary=Gt;exports.useTextMeasurer=a.useTextMeasurer;exports.vars=a.vars;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const a=require("./history-chords-DBh6HEw_.cjs");let g=require("@graphysdk/viz-engine"),l=require("react"),o=require("react/jsx-runtime"),Y=require("zustand"),K=require("motion/react"),z=require("zustand/vanilla"),V=require("clsx");V=a.__toESM(V,1);var pe="_1a5iqpb0",ve="_1a5iqpb1";var fe="_1a5iqpb3",Se="_1a5iqpb4",ye="_1a5iqpb5";var W=({errors:e})=>{const[t,...r]=e;return(0,o.jsxs)("div",{role:"alert",className:pe,children:[(0,o.jsx)("strong",{className:ve,children:"This chart could not be rendered."}),t&&(0,o.jsx)(Q,{diagnostic:t}),r.length>0&&(0,o.jsx)("ul",{className:"_1a5iqpb2",children:r.map((s,n)=>(0,o.jsx)("li",{children:(0,o.jsx)(Q,{diagnostic:s})},`${s.code}-${n}`))})]})},Q=({diagnostic:e})=>(0,o.jsxs)("div",{className:fe,children:[(0,o.jsx)("span",{className:Se,children:e.code}),(0,o.jsx)("p",{className:ye,children:e.message}),e.suggestion&&(0,o.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function be(e=[],t=[]){return e.length===t.length&&e.every((r,s)=>Object.is(r,t[s]))}var re=class extends l.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,g.buildDiagnostic)(e)}}componentDidCatch(e,t){const r=(0,g.buildDiagnostic)(e);a.logDiagnostics([r]),this.props.onError?.([r]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!be(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,o.jsx)(W,{errors:[e]});const{forcedErrors:t,children:r}=this.props;return t&&t.length>0?(0,o.jsx)(W,{errors:t}):r}},se={},ne=(0,l.createContext)(se),M=({shapes:e=se,children:t})=>(0,o.jsx)(ne.Provider,{value:e,children:t}),U=()=>(0,l.useContext)(ne),oe=e=>typeof e=="object"&&"geom"in e&&"render"in e,ae=e=>{const t=(0,g.resolveDefinition)(e);return t instanceof g.Geom?t:null},ie=(e,t)=>{const r=e.filter(s=>Ee(s,t));return r.length===e.length?e:r},Ee=(e,t)=>e.kind==="annotation"?(0,g.findAnnotation)(t.annotations,e.id)!==null:e.kind==="observations"||e.kind==="layer"&&e.layerId!==void 0?(0,g.findLayerById)(t.layers,e.layerId)!==void 0:!0,J=[],Te=()=>(0,z.createStore)(e=>({selection:J,setSelection:t=>e(r=>xe(r.selection,t)?r:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:J})})),xe=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((r,s)=>{const n=t[s];return n!==void 0&&(0,g.areEditTargetsEqual)(r,n)}),Ge=process.env.NODE_ENV!=="production",Re=5,Ce=e=>{if(!Ge)return{emit:()=>{},subscribe:()=>Ne,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let r=null;return{emit:s=>{const n=e.getLastCompile();if(n){r=s;for(const d of t)d(s,n)}},subscribe:s=>(t.add(s),()=>{t.delete(s)}),getLastTrigger:()=>r,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},je=()=>(0,z.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,r)=>e(s=>{if(s.lastSnapshot===r)return s;const n={id:s.nextId,label:De(t),stages:r.stages,stageDurationsMs:r.stageDurationsMs,durationMs:r.durationMs};return{lastCompile:n,history:Pe(s.history,n,Re),nextId:s.nextId+1,lastSnapshot:r}})})),Ne=()=>{},De=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}},Pe=(e,t,r)=>{const s=e.length>=r?e.length-(r-1):0;return[...e.slice(s),t]};function _e(e,t){let r;return e.layers.flatMap((s,n)=>a.isOverlayHosted(t(s.geom,e.coordSystem.type))?He(s)?(r??=(0,g.createStyleResolver)().readers(e),Ae(s,r.geom(s))?[{kind:"user-input",severity:"warning",code:"INVALID_STYLE_RULE",message:`Style 'overlay' is not supported on portal-rendered geom '${s.geom}' (layer '${s.id}'); it is ignored.`,context:{param:"overlay",layerIndex:n,requested:s.geom},suggestion:"Remove the geom overlay or use a renderer that paints inside the panel SVG."}]:[]):[]:[])}function Z(e){const t=e.filter(oe),r=new Set([...Object.keys(a.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),s=[],n=new Set;for(const u of e){const h=ae(u);h===null||r.has(h.type)||n.has(h.type)||(n.add(h.type),s.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 d=new Map;for(const u of t){if("definition"in u)continue;const h=`${u.geom}|${u.coord}`,v=d.get(h);v?v.count+=1:d.set(h,{geom:u.geom,coord:u.coord,count:1})}const c=[];for(const{geom:u,coord:h,count:v}of d.values())v<2||c.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${h}') (${v} 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 c.push(...Oe(e)),{errors:s,warnings:c}}function Ie(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s)t(c.geom,r.type)!==null||n.has(c.geom)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${c.geom}' under ${r.type} coords; the layer is not painted.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${c.geom}', '${r.type}') via \`defineGeomRenderer\`.`}));return d}function ke(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||u.hitTest||a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"MISSING_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares spatialKind 'render-hit-test' but its renderer provides no hit-test; the layer has no hover.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Add a \`hitTest\` factory (precomputed geometry) or an overlay render (\`{ fn, options: { overlay: true } }\`, live simulation) to the renderer for ('${c.geom}', '${r.type}').`}))}return d}function qe(e){const t=new Set,r=[];for(const s of e.layers){const n=s.identityKey;s.interactive!==!1&&(s.spatialKind!=="render-hit-test"||typeof n!="object"||t.has(s.geom)||s.data.hasVariable(n.variable)||(t.add(s.geom),r.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${s.geom}' keys its identity on '${n.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:s.geom,kind:"geom-renderer"},suggestion:`Emit the '${n.variable}' column from the geom's \`compile()\`, or point \`identityKey\` at a column it does emit.`})))}return r}function Le(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||!u.hitTest||!a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"CONFLICTING_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares both a \`hitTest\` factory and an overlay render; these are alternatives, so only the overlay is used.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:"Keep one: a `hitTest` factory for precomputed geometry, OR an overlay render (`{ fn, options: { overlay: true } }`) for a live simulation."}))}return d}function we(e,t){const r=new Set,s=[];for(const n of e.layers)n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||r.has(n.geom)||t.hasCapability(n.geom)||(r.add(n.geom),s.push({kind:"user-input",severity:"warning",code:"MISSING_ANCHOR_CAPABILITY",message:`Geom '${n.geom}' declares no \`resolveAnchorPosition\`; its observations cannot be annotated, so the editor overlay paints no creation trigger on them.`,context:{requested:n.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 s}function Me(e,t){const{coordSystem:r,layers:s}=e,n=new Set,d=[];for(const c of s){if(c.interactive===!1||c.spatialKind==="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,r.type);u===null||!a.isOverlayHosted(u)||(n.add(c.geom),d.push({kind:"user-input",severity:"warning",code:"OVERLAY_REQUIRES_RENDER_HIT_TEST",message:`Geom '${c.geom}' declares an overlay render but its layer's spatialKind is '${c.spatialKind}', not 'render-hit-test'; the overlay's push-path hover resolves to nothing.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:"Have the geom's manifest yield spatialKind 'render-hit-test' so the scene layer carries the `byKey` index the overlay's `pushHover` resolves against."}))}return d}var He=e=>[e.styles.defaults,e.styles.overrides].some(t=>t.some(r=>(r.declarations.overlay?.length??0)>0)),Ae=(e,t)=>{const[r]=e.data;if(r===void 0)return!1;if((t.get("overlay",r)?.length??0)>0)return!0;for(const s of e.data)if((t.get("overlay",s,"hovered")?.length??0)>0)return!0;return!1};function Oe(e){const t=new Set,r=[];for(const s of e){const n=ae(s);n===null||t.has(n.type)||n.dataLabelCoordTypes.length===0||n.getDataLabelPlacements!==void 0||(t.add(n.type),r.push({kind:"user-input",severity:"warning",code:"MISSING_DATA_LABEL_PLACEMENT",message:`Geom '${n.type}' declares \`dataLabelCoordTypes\` but implements no \`getDataLabelPlacements\`; its layers paint no data labels.`,context:{requested:n.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,z.createStore)(t=>({scene:e,setScene:r=>t(s=>s.scene===r?s:{scene:r})})),Be=({spec:e,data:t,customPalettes:r,colorScheme:s,plugins:n,theme:d,resolveRenderer:c,anchorResolver:u,onSpecChange:h,onError:v,onWarnings:_})=>{const N=a.useLatestRef(h),T=a.useLatestRef(v),x=a.useLatestRef(_),[{session:m,compileBus:f}]=(0,l.useState)(()=>{const i=(0,g.createCompiler)({plugins:n,theme:d});return{session:new g.GraphCompilationSession(i),compileBus:Ce(i)}}),[S]=(0,l.useState)(()=>{const i=Z(n??[]),p=Z(d?.plugins??[]);return{errors:[...p.errors,...i.errors],warnings:[...p.warnings,...i.warnings]}}),P=(0,l.useRef)(null),[y]=(0,l.useState)(Ke),R=(0,l.useRef)(null),D=(0,l.useCallback)(i=>S.errors.length===0?i:[...S.errors,...i??[]],[S]),G=(0,l.useCallback)(i=>{if(!i.ok)return i.errors;if(R.current)R.current.getState().setScene(i.scene);else{const p=$e(i.scene);p.subscribe(y.notify),R.current=p,y.notify()}return null},[y]),[H,k]=(0,l.useState)(()=>{const i=m.compile({spec:e,data:t,customPalettes:r,colorScheme:s});return P.current=i,D(G(i))}),E=(0,l.useCallback)(i=>i.ok?[...i.warnings,...Ie(i.scene,c),...ke(i.scene,c),...qe(i.scene),...Le(i.scene,c),...Me(i.scene,c),..._e(i.scene,c),...we(i.scene,u)]:i.warnings,[c,u]),C=(0,l.useCallback)(i=>{i.length!==0&&(a.logDiagnostics(i),T.current?.(i))},[T]),j=(0,l.useCallback)(i=>{i.length!==0&&(a.logDiagnostics(i),x.current?.(i))},[x]);(0,l.useEffect)(()=>{const i=P.current;i&&(C([...S.errors,...i.ok?[]:i.errors]),j([...S.warnings,...E(i)]),i.ok&&f.emit({kind:"init"}))},[f,C,j,S,E]),(0,l.useEffect)(()=>{const i=m.update({spec:e,data:t,customPalettes:r,colorScheme:s});if(!i)return;i.committedSpec&&N.current?.(i.committedSpec);const p=G(i.result);k(D(p)),p&&C(p),j(E(i.result)),p||f.emit({kind:i.specChanged?"spec":"data"})},[e,t,r,s,m,f,G,C,j,D,E,N]);const q=(0,l.useCallback)(i=>{k(p=>p===null?p:D(null)),j(E(i))},[D,j,E]),A=(0,l.useCallback)(i=>{i.scene&&R.current?.getState().setScene(i.scene),i.result&&q(i.result),i.command&&f.emit({kind:"command",command:i.command}),i.spec&&N.current?.(i.spec),i.errors&&C([...i.errors])},[q,f,N,C]),b=(0,l.useCallback)(i=>{for(const p of i)A(p);return i.some(p=>!!p.scene)},[A]),O=(0,l.useCallback)((i,p)=>{b(m.applyCommand(i,p))},[m,b]),I=(0,l.useCallback)(()=>{b(m.commit())},[m,b]),$=(0,l.useCallback)(()=>b(m.undo()),[m,b]),L=(0,l.useCallback)(()=>b(m.redo()),[m,b]),F=(0,l.useMemo)(()=>({stack:m.history,undo:$,redo:L}),[m,$,L]),ge=(0,l.useCallback)(()=>R.current?.getState().scene??null,[]);return{store:R.current,dispatch:O,commit:I,history:F,subscribe:y.subscribe,getScene:ge,compileBus:f,compileErrors:H}},Ke=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},ce=({data:e,spec:t,plugins:r=[],theme:s,formattingLocale:n,handleRef:d,onSpecChange:c,onError:u,onWarnings:h,customPalettes:v,colorScheme:_="light",children:N})=>{const[T]=(0,l.useState)(()=>s),x=T?.colorScheme??_,[m]=(0,l.useState)(()=>a.createGeomRendererResolver([...T?.plugins??[],...r].filter(oe))),f=(0,l.useId)(),[S]=(0,l.useState)(()=>(0,g.createAnchorResolver)(r)),[P]=(0,l.useState)(()=>(0,g.createDataLabelPlacementResolver)(r)),[y]=(0,l.useState)(()=>Te()),[R]=(0,l.useState)(()=>a.createTargetBoundaryStore()),D=(0,l.useMemo)(()=>(0,g.createStyleResolver)({colorScheme:x}),[x]),{store:G,dispatch:H,commit:k,history:E,subscribe:C,getScene:j,compileBus:q,compileErrors:A}=Be({spec:t,data:e,customPalettes:v,colorScheme:x,plugins:r,theme:T,resolveRenderer:m,anchorResolver:S,onSpecChange:c,onError:u,onWarnings:h});(0,l.useEffect)(()=>{if(G)return G.subscribe((I,$)=>{if(I.scene.spec===$.scene.spec)return;const{selection:L,setSelection:F}=y.getState();L.length!==0&&F(ie(L,I.scene.spec))})},[G,y]);const b=(0,l.useMemo)(()=>({dispatch:H,commit:k}),[H,k]);(0,l.useImperativeHandle)(d,()=>({commands:b,undo:E.undo,redo:E.redo,subscribe:C,getScene:j,getSelection:()=>y.getState().selection,setSelection:I=>y.getState().setSelection(I),subscribeSelection:y.subscribe,canPlaceDataLabels:P.hasCapability,canFormatDataLabelsAsPercentages:P.hasPercentageFormat}),[b,E,C,j,y,P]);const O=(0,l.useMemo)(()=>G?{chartId:f,store:G,selectionStore:y,targetBoundaryStore:R,commands:b,history:E,formattingLocale:n,compileBus:q,colorScheme:x,styleResolver:D,anchorResolver:S}:null,[f,G,y,R,b,E,n,q,x,D,S]);return(0,o.jsx)(re,{forcedErrors:A,onError:u,resetKeys:[t,e],children:O?(0,o.jsx)(a.GraphContext.Provider,{value:O,children:(0,o.jsx)(a.GeomRendererResolverProvider,{value:m,children:(0,o.jsx)(a.DataLabelPlacementResolverProvider,{value:P,children:(0,o.jsx)(M,{shapes:T?.shapes,children:N})})})}):null})};function Ue({theme:e,...t}={}){const r=(0,g.createSpecBuilder)(t);return{...r,GraphProvider:n=>(0,o.jsx)(ce,{...n,plugins:r.plugins,theme:e})}}var le=({shouldAnimateTransitions:e,cx:t,cy:r,r:s,...n})=>e?(0,o.jsx)(K.motion.circle,{initial:!1,animate:{cx:t,cy:r,r:s},transition:a.DEFAULT_SPRING_TRANSITION,...n}):(0,o.jsx)("circle",{cx:t,cy:r,r:s,...n}),de=({shouldAnimateTransitions:e,x1:t,y1:r,x2:s,y2:n,...d})=>e?(0,o.jsx)(K.motion.line,{initial:!1,animate:{x1:t,y1:r,x2:s,y2:n},transition:a.DEFAULT_SPRING_TRANSITION,...d}):(0,o.jsx)("line",{x1:t,y1:r,x2:s,y2:n,...d}),ue=({shouldAnimateTransitions:e,x:t,y:r,width:s,height:n,...d})=>e?(0,o.jsx)(K.motion.rect,{initial:!1,animate:{attrX:t,attrY:r,width:s,height:n},transition:a.DEFAULT_SPRING_TRANSITION,...d}):(0,o.jsx)("rect",{x:t,y:r,width:s,height:n,...d}),me=({shouldAnimateTransitions:e,d:t,source:r,...s})=>e?(0,o.jsx)(ze,{d:t,source:r,...s}):(0,o.jsx)("path",{d:t,...s}),Fe=e=>{const{Circle:t}=U();return t===void 0?le(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},Ye=e=>{const{Line:t}=U();return t===void 0?de(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},Ve=e=>{const{Rect:t}=U();return t===void 0?ue(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},We=e=>{const{Path:t}=U();return t===void 0?me(e):(0,o.jsx)(M,{children:(0,o.jsx)(t,{...e})})},ze=({d:e,source:t,...r})=>{const s=a.useSvgPathMorph(e,a.DEFAULT_SPRING_TRANSITION,t);return(0,o.jsx)(K.motion.path,{d:s,...r})},Xe=({children:e,...t})=>(0,o.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:e}),Qe=({box:e,children:t})=>(0,o.jsx)("svg",{x:(0,g.toPercent)(e.x0),y:(0,g.toPercent)(e.y0),width:(0,g.toPercent)(e.x1-e.x0),height:(0,g.toPercent)(e.y1-e.y0),overflow:"hidden",pointerEvents:"none",children:t}),Je="drqe3u0",Ze="drqe3u1",et="drqe3u2",tt="drqe3u3",w="drqe3u4",rt="drqe3u5",st="drqe3u6",nt="drqe3u7",B="drqe3u8",ot="drqe3u9",at="drqe3ua";var it="drqe3uc",ct="drqe3ud",lt="drqe3ue",dt="drqe3uf";var ut="drqe3uh",mt="drqe3ui",ee={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},te={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},he={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},ht=({width:e=440,style:t,className:r}={})=>{const{compileBus:s}=a.useGraphContext(),[n]=(0,l.useState)(()=>je()),[d,c]=(0,l.useState)(!1),[u,h]=(0,l.useState)(g.isCompilerCachingEnabled);(0,l.useEffect)(()=>{const{recordCompile:m}=n.getState(),f=s.getLastTrigger(),S=s.getLastCompile();return f&&S&&m(f,S),s.subscribe(m)},[n,s]);const v=(0,Y.useStore)(n,m=>m.lastCompile),_=(0,Y.useStore)(n,m=>m.history),N=s.getCacheStats(),T=v===null&&_.length===0,x=()=>{h(m=>{const f=!m;return(0,g.setCompilerCachingEnabled)(f),f})};return(0,o.jsxs)("div",{className:(0,V.default)(at,r),style:{width:e,...t},children:[(0,o.jsxs)("div",{className:Je,children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("div",{className:Ze,children:"compile cache"}),(0,o.jsx)("div",{className:lt,children:T?"production: stats disabled":v?`last: ${v.label} · ${X(v.durationMs)}`:"awaiting first compile…"})]}),(0,o.jsx)("button",{type:"button",onClick:()=>c(m=>!m),className:dt,children:d?"▾":"▴"})]}),!d&&(0,o.jsxs)("div",{className:"drqe3ub",children:[(0,o.jsxs)("button",{type:"button",onClick:x,className:u?ee.enabled:ee.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,o.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!d&&!T&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(gt,{delta:v?.stages,durations:v?.stageDurationsMs,cumulative:N}),(0,o.jsx)(pt,{entries:_})]})]})},gt=({delta:e,durations:t,cumulative:r})=>(0,o.jsxs)("table",{className:et,children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{className:ut,children:[(0,o.jsx)("th",{className:tt,children:"stage"}),(0,o.jsx)("th",{className:w,children:"time"}),(0,o.jsx)("th",{className:w,children:"Δ miss"}),(0,o.jsx)("th",{className:w,children:"Δ hit"}),(0,o.jsx)("th",{className:w,children:"total miss"}),(0,o.jsx)("th",{className:w,children:"total hit"})]})}),(0,o.jsx)("tbody",{children:g.COMPILER_STAGE_KEYS.map(s=>{const n=e?.[s],d=vt(n);return(0,o.jsxs)("tr",{className:it,children:[(0,o.jsxs)("td",{className:rt,children:[(0,o.jsx)("span",{className:he[d],"aria-hidden":!0})," ",s]}),(0,o.jsx)("td",{className:B,children:t===void 0||d==="untouched"?"—":X(t[s])}),(0,o.jsx)("td",{className:d==="ran"?te.ran:te.dim,children:n?.misses??0}),(0,o.jsx)("td",{className:B,children:n?.hits??0}),(0,o.jsx)("td",{className:B,children:r[s].misses}),(0,o.jsx)("td",{className:B,children:r[s].hits})]},s)})})]}),pt=({entries:e})=>e.length===0?null:(0,o.jsxs)("div",{className:ct,children:[(0,o.jsx)("div",{className:mt,children:"recent compiles"}),e.map(t=>{const r=ft(t.stages,d=>d.misses>0),s=g.COMPILER_STAGE_KEYS.length,n=r===0?"cached":"ran";return(0,o.jsxs)("div",{className:st,children:[(0,o.jsx)("span",{className:he[n],"aria-hidden":!0}),(0,o.jsx)("span",{className:nt,title:t.label,children:t.label}),(0,o.jsxs)("span",{className:ot,children:[r,"/",s," ran · ",X(t.durationMs)]})]},t.id)})]}),vt=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",ft=(e,t)=>{let r=0;for(const s of g.COMPILER_STAGE_KEYS)t(e[s])&&(r+=1);return r},X=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,St=()=>{const{history:e}=a.useGraphContext(),{stack:t,undo:r,redo:s}=e,n=(0,l.useCallback)(u=>t.subscribe(u),[t]),d=(0,l.useCallback)(()=>t.getSnapshot(),[t]),c=(0,l.useSyncExternalStore)(n,d,d);return(0,l.useMemo)(()=>({...c,undo:r,redo:s}),[c,r,s])},yt=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),bt=(e,t={})=>{const{target:r,enabled:s=!0}=t;(0,l.useEffect)(()=>{const n=Et(r);if(!s||!n)return;const d=c=>{if(!Tt(c)||c.defaultPrevented||xt(c.target))return;const u=a.resolveHistoryStep(c);if(!u)return;const h=e.current;h&&(u==="undo"?h.undo():h.redo())&&c.preventDefault()};return n.addEventListener("keydown",d),()=>n.removeEventListener("keydown",d)},[e,r,s])},Et=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,Tt=e=>"key"in e,xt=e=>e instanceof HTMLInputElement?!yt.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,Gt=()=>{const{targetBoundaryStore:e}=a.useGraphContext();return(0,Y.useStore)(e,t=>t.boundary)};exports.BrandMark=a.BrandMark;exports.CanvasTextMeasurer=a.CanvasTextMeasurer;exports.DefaultFooter=a.DefaultFooter;exports.DefaultGeomCircle=le;exports.DefaultGeomLine=de;exports.DefaultGeomPath=me;exports.DefaultGeomRect=ue;exports.DefaultGrid=a.DefaultGrid;exports.DefaultHeader=a.DefaultHeader;exports.DefaultSwatch=a.DefaultSwatch;exports.DefaultTooltip=a.DefaultTooltip;exports.DevToolsPanel=ht;exports.GRAPH_MODES=a.GRAPH_MODES;exports.GeomCircle=Fe;exports.GeomLine=Ye;exports.GeomPath=We;exports.GeomRect=Ve;exports.GraphErrorBoundary=re;exports.GraphErrorPanel=W;exports.GraphProvider=ce;exports.GraphRenderer=a.GraphRenderer;exports.HoverProvider=a.HoverProvider;exports.IntroFade=a.IntroFade;exports.IntroWipeClip=a.IntroWipeClip;exports.TextMeasurerProvider=a.TextMeasurerProvider;exports.ThemeProvider=a.ThemeProvider;exports.UnitBoxSvg=Qe;exports.UnitSpaceSvg=Xe;exports.buildDotsEditOutlineShapes=a.buildDotsEditOutlineShapes;exports.createGraphyKit=Ue;exports.darkTheme=a.darkTheme;exports.defineGeomRenderer=a.defineGeomRenderer;exports.lightTheme=a.lightTheme;exports.lightenCss=a.lightenCss;exports.projectPointCartesian=a.projectPointCartesian;exports.pruneSelection=ie;exports.resolveBrandMarkVisual=a.resolveBrandMarkVisual;exports.scalePointToPanel=a.scalePointToPanel;exports.stampAxisEditTarget=a.stampAxisEditTarget;exports.stampGridEditTarget=a.stampGridEditTarget;exports.stampLegendEditTarget=a.stampLegendEditTarget;exports.useElementScreenRect=a.useElementScreenRect;exports.useGeomHitTest=a.useGeomHitTest;exports.useGeomHover=a.useGeomHover;exports.useGeomReaderTree=a.useGeomReaderTree;exports.useGeomStyleReader=a.useGeomStyleReader;exports.useGraphCommands=a.useGraphCommands;exports.useGraphHandle=a.useGraphHandle;exports.useGraphHistory=St;exports.useGraphHistoryShortcuts=bt;exports.useGraphLocale=a.useGraphLocale;exports.useGraphSelection=a.useGraphSelection;exports.useGuidesTakePress=a.useGuidesTakePress;exports.useHandleScene=a.useHandleScene;exports.useHoverState=a.useHoverState;exports.usePaintDefs=a.usePaintDefs;exports.useResolvedStyle=a.useResolvedStyle;exports.useSceneSelector=a.useSceneSelector;exports.useStyleReaderTree=a.useStyleReaderTree;exports.useStyleResolver=a.useStyleResolver;exports.useTargetBoundary=Gt;exports.useTextMeasurer=a.useTextMeasurer;exports.vars=a.vars;
package/dist/index.d.ts CHANGED
@@ -269,7 +269,8 @@ export declare const DefaultGeomRect: ({ shouldAnimateTransitions, x, y, width,
269
269
  * Default paint for the grid region — per-tick grid lines, drawn inside the panel frame rect. Where a press
270
270
  * can take a guide, each drawn line is a stamped group holding the stroke and a transparent hit stroke
271
271
  * `GRID_LINE_HIT_WIDTH_PX` wide on the same coordinates. The hit stroke is solid, so a dashed line answers
272
- * along its whole length, gaps included. Of two crossing lines the one painted later answers.
272
+ * along its whole length, gaps included. Of two crossing lines the one painted later answers. An axis whose lines
273
+ * resolve to zero width draws none, so nothing unseen takes a press or an outline.
273
274
  */
274
275
  export declare const DefaultGrid: ({ axes, panelBorderSizes, panelFrameRect, panelRect }: GridSlotProps) => JSX.Element;
275
276
 
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as er, At as Z, B as tr, Ct as rr, Dt as nr, Ft as sr, Gt as or, Ht as be, It as Y, Kt as ar, L as ir, Lt as Ee, M as cr, Nt as Te, Ot as lr, Pt as Re, R as dr, Rt as ur, St as mr, V as hr, Vt as gr, Wt as pr, Zt as fr, _n as ee, a as vr, an as Ne, at as yr, bn as z, bt as Sr, dn as br, en as Er, fn as Tr, ft as Rr, gn as Ce, h as Nr, hn as Cr, ht as Gr, i as Dr, in as qr, it as Ir, j as wr, ln as _r, mn as Pr, mt as kr, n as Lr, on as V, pn as $r, qt as Mr, r as Hr, rn as xr, s as Ar, sn as Br, st as Or, t as Ge, un as Kr, vn as De, w as Fr } from "./history-chords-DO98J8wD.js";
1
+ import { A as er, At as Z, B as tr, Ct as rr, Dt as nr, Ft as sr, Gt as or, Ht as be, It as Y, Kt as ar, L as ir, Lt as Ee, M as cr, Nt as Te, Ot as lr, Pt as Re, R as dr, Rt as ur, St as mr, V as hr, Vt as gr, Wt as pr, Zt as fr, _n as ee, a as vr, an as Ne, at as yr, bn as z, bt as Sr, dn as br, en as Er, fn as Tr, ft as Rr, gn as Ce, h as Nr, hn as Cr, ht as Gr, i as Dr, in as qr, it as Ir, j as wr, ln as _r, mn as Pr, mt as kr, n as Lr, on as V, pn as $r, qt as Mr, r as Hr, rn as xr, s as Ar, sn as Br, st as Or, t as Ge, un as Kr, vn as De, w as Fr } from "./history-chords-DOlobsvb.js";
2
2
  import { COMPILER_STAGE_KEYS as te, Geom as qe, GraphCompilationSession as Ie, areEditTargetsEqual as we, buildDiagnostic as se, createAnchorResolver as _e, createCompiler as Pe, createDataLabelPlacementResolver as ke, createSpecBuilder as Le, createStyleResolver as he, findAnnotation as $e, findLayerById as oe, isCompilerCachingEnabled as Me, resolveDefinition as He, setCompilerCachingEnabled as xe, toPercent as U } from "@graphysdk/viz-engine";
3
3
  import { Component as Ae, createContext as Be, useCallback as p, useContext as Oe, useEffect as x, useId as Ke, useImperativeHandle as Fe, useMemo as H, useRef as ae, useState as b, useSyncExternalStore as Ue } from "react";
4
4
  import { Fragment as je, jsx as a, 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.1791541380583",
14
+ "version": "1.9.0-beta.1791545910919",
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.1791541380583"
53
+ "@graphysdk/viz-engine": "1.9.0-beta.1791545910919"
54
54
  },
55
55
  "peerDependencies": {
56
56
  "@tiptap/core": "^3.0.0",