@graphysdk/react-renderer 1.9.0-beta.1790606620233 → 1.9.0-beta.1790607706146

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-Crrwn8Bl.cjs"),oe=require("./theme.contract.css-DKDKSByt.cjs");let h=require("@graphysdk/viz-engine"),d=require("react"),i=require("react/jsx-runtime"),A=require("zustand"),X=require("motion/react"),K=require("zustand/vanilla"),B=require("clsx");B=o.__toESM(B,1);var ae="_1a5iqpb0",ie="_1a5iqpb1";var ce="_1a5iqpb3",le="_1a5iqpb4",de="_1a5iqpb5";var O=({errors:e})=>{const[t,...s]=e;return(0,i.jsxs)("div",{role:"alert",className:ae,children:[(0,i.jsx)("strong",{className:ie,children:"This chart could not be rendered."}),t&&(0,i.jsx)(Y,{diagnostic:t}),s.length>0&&(0,i.jsx)("ul",{className:"_1a5iqpb2",children:s.map((r,n)=>(0,i.jsx)("li",{children:(0,i.jsx)(Y,{diagnostic:r})},`${r.code}-${n}`))})]})},Y=({diagnostic:e})=>(0,i.jsxs)("div",{className:ce,children:[(0,i.jsx)("span",{className:le,children:e.code}),(0,i.jsx)("p",{className:de,children:e.message}),e.suggestion&&(0,i.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function ue(e=[],t=[]){return e.length===t.length&&e.every((s,r)=>Object.is(s,t[r]))}var Q=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 s=(0,h.buildDiagnostic)(e);o.logDiagnostics([s]),this.props.onError?.([s]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!ue(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,i.jsx)(O,{errors:[e]});const{forcedErrors:t,children:s}=this.props;return t&&t.length>0?(0,i.jsx)(O,{errors:t}):s}},J=e=>typeof e=="object"&&"geom"in e&&"render"in e,Z=e=>{const t=(0,h.resolveDefinition)(e);return t instanceof h.Geom?t:null},ee=(e,t)=>{const s=e.filter(r=>me(r,t));return s.length===e.length?e:s},me=(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,W=[],ge=()=>(0,K.createStore)(e=>({selection:W,setSelection:t=>e(s=>he(s.selection,t)?s:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:W})})),he=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((s,r)=>{const n=t[r];return n!==void 0&&(0,h.areEditTargetsEqual)(s,n)}),pe=process.env.NODE_ENV!=="production",fe=5,ve=e=>{if(!pe)return{emit:()=>{},subscribe:()=>Se,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let s=null;return{emit:r=>{const n=e.getLastCompile();if(n){s=r;for(const l of t)l(r,n)}},subscribe:r=>(t.add(r),()=>{t.delete(r)}),getLastTrigger:()=>s,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},ye=()=>(0,K.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,s)=>e(r=>{if(r.lastSnapshot===s)return r;const n={id:r.nextId,label:be(t),stages:s.stages,stageDurationsMs:s.stageDurationsMs,durationMs:s.durationMs};return{lastCompile:n,history:Ee(r.history,n,fe),nextId:r.nextId+1,lastSnapshot:s}})})),Se=()=>{},be=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}},Ee=(e,t,s)=>{const r=e.length>=s?e.length-(s-1):0;return[...e.slice(r),t]};function Te(e){const t=e.filter(J),s=new Set([...Object.keys(o.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),r=[],n=new Set;for(const u of e){const m=Z(u);m===null||s.has(m.type)||n.has(m.type)||(n.add(m.type),r.push({kind:"user-input",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 l=new Map;for(const u of t){if("definition"in u)continue;const m=`${u.geom}|${u.coord}`,f=l.get(m);f?f.count+=1:l.set(m,{geom:u.geom,coord:u.coord,count:1})}const c=[];for(const{geom:u,coord:m,count:f}of l.values())f<2||c.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${m}') (${f} 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 c.push(..._e(e)),{errors:r,warnings:c}}function xe(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r)t(c.geom,s.type)!==null||n.has(c.geom)||(n.add(c.geom),l.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${c.geom}' under ${s.type} coords; the layer is not painted.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${c.geom}', '${s.type}') via \`defineGeomRenderer\`.`}));return l}function Ce(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||u.hitTest||o.isOverlayHosted(u)||(n.add(c.geom),l.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}', '${s.type}').`}))}return l}function Re(e){const t=new Set,s=[];for(const r of e.layers){const n=r.identityKey;r.interactive!==!1&&(r.spatialKind!=="render-hit-test"||typeof n!="object"||t.has(r.geom)||r.data.hasVariable(n.variable)||(t.add(r.geom),s.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${r.geom}' keys its identity on '${n.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:r.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 s}function Ge(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||!u.hitTest||!o.isOverlayHosted(u)||(n.add(c.geom),l.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 l}function Ne(e,t){const s=new Set,r=[];for(const n of e.layers)n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||s.has(n.geom)||t.hasCapability(n.geom)||(s.add(n.geom),r.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 r}function je(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind==="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||!o.isOverlayHosted(u)||(n.add(c.geom),l.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 l}function _e(e){const t=new Set,s=[];for(const r of e){const n=Z(r);n===null||t.has(n.type)||n.dataLabelCoordTypes.length===0||n.getDataLabelPlacements!==void 0||(t.add(n.type),s.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 s}var qe=e=>(0,K.createStore)(t=>({scene:e,setScene:s=>t(r=>r.scene===s?r:{scene:s})})),ke=({spec:e,data:t,customPalettes:s,colorScheme:r,plugins:n,resolveRenderer:l,anchorResolver:c,onSpecChange:u,onError:m,onWarnings:f})=>{const E=o.useLatestRef(u),j=o.useLatestRef(m),C=o.useLatestRef(f),[{session:v,compileBus:g}]=(0,d.useState)(()=>{const a=(0,h.createCompiler)({plugins:n});return{session:new h.GraphCompilationSession(a),compileBus:ve(a)}}),[p]=(0,d.useState)(()=>Te(n??[])),R=(0,d.useRef)(null),[_]=(0,d.useState)(De),S=(0,d.useRef)(null),G=(0,d.useCallback)(a=>p.errors.length===0?a:[...p.errors,...a??[]],[p]),D=(0,d.useCallback)(a=>{if(!a.ok)return a.errors;if(S.current)S.current.getState().setScene(a.scene);else{const y=qe(a.scene);y.subscribe(_.notify),S.current=y,_.notify()}return null},[_]),[q,I]=(0,d.useState)(()=>{const a=v.compile({spec:e,data:t,customPalettes:s,colorScheme:r});return R.current=a,G(D(a))}),T=(0,d.useCallback)(a=>a.ok?[...a.warnings,...xe(a.scene,l),...Ce(a.scene,l),...Re(a.scene),...Ge(a.scene,l),...je(a.scene,l),...Ne(a.scene,c)]:a.warnings,[l,c]),x=(0,d.useCallback)(a=>{a.length!==0&&(o.logDiagnostics(a),j.current?.(a))},[j]),N=(0,d.useCallback)(a=>{a.length!==0&&(o.logDiagnostics(a),C.current?.(a))},[C]);(0,d.useEffect)(()=>{const a=R.current;a&&(x([...p.errors,...a.ok?[]:a.errors]),N([...p.warnings,...T(a)]),a.ok&&g.emit({kind:"init"}))},[g,x,N,p,T]),(0,d.useEffect)(()=>{const a=v.update({spec:e,data:t,customPalettes:s,colorScheme:r});if(!a)return;a.committedSpec&&E.current?.(a.committedSpec);const y=D(a.result);I(G(y)),y&&x(y),N(T(a.result)),y||g.emit({kind:a.specChanged?"spec":"data"})},[e,t,s,r,v,g,D,x,N,G,T,E]);const k=(0,d.useCallback)(a=>{I(y=>y===null?y:G(null)),N(T(a))},[G,N,T]),P=(0,d.useCallback)(a=>{a.scene&&S.current?.getState().setScene(a.scene),a.result&&k(a.result),a.command&&g.emit({kind:"command",command:a.command}),a.spec&&E.current?.(a.spec),a.errors&&x([...a.errors])},[k,g,E,x]),b=(0,d.useCallback)(a=>{for(const y of a)P(y);return a.some(y=>!!y.scene)},[P]),$=(0,d.useCallback)((a,y)=>{b(v.applyCommand(a,y))},[v,b]),L=(0,d.useCallback)(()=>{b(v.commit())},[v,b]),M=(0,d.useCallback)(()=>b(v.undo()),[v,b]),U=(0,d.useCallback)(()=>b(v.redo()),[v,b]),se=(0,d.useMemo)(()=>({stack:v.history,undo:M,redo:U}),[v,M,U]),ne=(0,d.useCallback)(()=>S.current?.getState().scene??null,[]);return{store:S.current,dispatch:$,commit:L,history:se,subscribe:_.subscribe,getScene:ne,compileBus:g,compileErrors:q}},De=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},te=({data:e,spec:t,plugins:s=[],formattingLocale:r,handleRef:n,onSpecChange:l,onError:c,onWarnings:u,customPalettes:m,colorScheme:f="light",children:E})=>{const[j]=(0,d.useState)(()=>o.createGeomRendererResolver(s.filter(J))),C=(0,d.useId)(),[v]=(0,d.useState)(()=>(0,h.createAnchorResolver)(s)),[g]=(0,d.useState)(()=>(0,h.createDataLabelPlacementResolver)(s)),[p]=(0,d.useState)(()=>ge()),[R]=(0,d.useState)(()=>o.createTargetBoundaryStore()),_=(0,d.useMemo)(()=>(0,h.createStyleResolver)({colorScheme:f}),[f]),{store:S,dispatch:G,commit:D,history:q,subscribe:I,getScene:T,compileBus:x,compileErrors:N}=ke({spec:t,data:e,customPalettes:m,colorScheme:f,plugins:s,resolveRenderer:j,anchorResolver:v,onSpecChange:l,onError:c,onWarnings:u});(0,d.useEffect)(()=>{if(S)return S.subscribe((b,$)=>{if(b.scene.spec===$.scene.spec)return;const{selection:L,setSelection:M}=p.getState();L.length!==0&&M(ee(L,b.scene.spec))})},[S,p]);const k=(0,d.useMemo)(()=>({dispatch:G,commit:D}),[G,D]);(0,d.useImperativeHandle)(n,()=>({commands:k,undo:q.undo,redo:q.redo,subscribe:I,getScene:T,getSelection:()=>p.getState().selection,setSelection:b=>p.getState().setSelection(b),subscribeSelection:p.subscribe,canPlaceDataLabels:g.hasCapability,canFormatDataLabelsAsPercentages:g.hasPercentageFormat}),[k,q,I,T,p,g]);const P=(0,d.useMemo)(()=>S?{chartId:C,store:S,selectionStore:p,targetBoundaryStore:R,commands:k,history:q,formattingLocale:r,compileBus:x,colorScheme:f,styleResolver:_,anchorResolver:v}:null,[C,S,p,R,k,q,r,x,f,_,v]);return(0,i.jsx)(Q,{forcedErrors:N,onError:c,resetKeys:[t,e],children:P?(0,i.jsx)(o.GraphContext.Provider,{value:P,children:(0,i.jsx)(o.GeomRendererResolverProvider,{value:j,children:(0,i.jsx)(o.DataLabelPlacementResolverProvider,{value:g,children:E})})}):null})};function Ie(e){const t=(0,h.createSpecBuilder)(e);return{...t,GraphProvider:r=>(0,i.jsx)(te,{...r,plugins:t.plugins})}}var Pe=({shouldAnimateTransitions:e,cx:t,cy:s,r,...n})=>e?(0,i.jsx)(X.motion.circle,{initial:!1,animate:{cx:t,cy:s,r},transition:o.DEFAULT_SPRING_TRANSITION,...n}):(0,i.jsx)("circle",{cx:t,cy:s,r,...n}),we=({shouldAnimateTransitions:e,x1:t,y1:s,x2:r,y2:n,...l})=>e?(0,i.jsx)(X.motion.line,{initial:!1,animate:{x1:t,y1:s,x2:r,y2:n},transition:o.DEFAULT_SPRING_TRANSITION,...l}):(0,i.jsx)("line",{x1:t,y1:s,x2:r,y2:n,...l}),Le=({children:e,...t})=>(0,i.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:e}),Me=({box:e,children:t})=>(0,i.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:t}),He="drqe3u0",$e="drqe3u1",Ae="drqe3u2",Be="drqe3u3",w="drqe3u4",Oe="drqe3u5",Ke="drqe3u6",Fe="drqe3u7",H="drqe3u8",Ue="drqe3u9",Ye="drqe3ua";var We="drqe3uc",Ve="drqe3ud",ze="drqe3ue",Xe="drqe3uf";var Qe="drqe3uh",Je="drqe3ui",V={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},z={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},re={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},Ze=({width:e=440,style:t,className:s}={})=>{const{compileBus:r}=o.useGraphContext(),[n]=(0,d.useState)(()=>ye()),[l,c]=(0,d.useState)(!1),[u,m]=(0,d.useState)(h.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:g}=n.getState(),p=r.getLastTrigger(),R=r.getLastCompile();return p&&R&&g(p,R),r.subscribe(g)},[n,r]);const f=(0,A.useStore)(n,g=>g.lastCompile),E=(0,A.useStore)(n,g=>g.history),j=r.getCacheStats(),C=f===null&&E.length===0,v=()=>{m(g=>{const p=!g;return(0,h.setCompilerCachingEnabled)(p),p})};return(0,i.jsxs)("div",{className:(0,B.default)(Ye,s),style:{width:e,...t},children:[(0,i.jsxs)("div",{className:He,children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("div",{className:$e,children:"compile cache"}),(0,i.jsx)("div",{className:ze,children:C?"production: stats disabled":f?`last: ${f.label} · ${F(f.durationMs)}`:"awaiting first compile…"})]}),(0,i.jsx)("button",{type:"button",onClick:()=>c(g=>!g),className:Xe,children:l?"▾":"▴"})]}),!l&&(0,i.jsxs)("div",{className:"drqe3ub",children:[(0,i.jsxs)("button",{type:"button",onClick:v,className:u?V.enabled:V.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,i.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!l&&!C&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(et,{delta:f?.stages,durations:f?.stageDurationsMs,cumulative:j}),(0,i.jsx)(tt,{entries:E})]})]})},et=({delta:e,durations:t,cumulative:s})=>(0,i.jsxs)("table",{className:Ae,children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{className:Qe,children:[(0,i.jsx)("th",{className:Be,children:"stage"}),(0,i.jsx)("th",{className:w,children:"time"}),(0,i.jsx)("th",{className:w,children:"Δ miss"}),(0,i.jsx)("th",{className:w,children:"Δ hit"}),(0,i.jsx)("th",{className:w,children:"total miss"}),(0,i.jsx)("th",{className:w,children:"total hit"})]})}),(0,i.jsx)("tbody",{children:h.COMPILER_STAGE_KEYS.map(r=>{const n=e?.[r],l=rt(n);return(0,i.jsxs)("tr",{className:We,children:[(0,i.jsxs)("td",{className:Oe,children:[(0,i.jsx)("span",{className:re[l],"aria-hidden":!0})," ",r]}),(0,i.jsx)("td",{className:H,children:t===void 0||l==="untouched"?"—":F(t[r])}),(0,i.jsx)("td",{className:l==="ran"?z.ran:z.dim,children:n?.misses??0}),(0,i.jsx)("td",{className:H,children:n?.hits??0}),(0,i.jsx)("td",{className:H,children:s[r].misses}),(0,i.jsx)("td",{className:H,children:s[r].hits})]},r)})})]}),tt=({entries:e})=>e.length===0?null:(0,i.jsxs)("div",{className:Ve,children:[(0,i.jsx)("div",{className:Je,children:"recent compiles"}),e.map(t=>{const s=st(t.stages,l=>l.misses>0),r=h.COMPILER_STAGE_KEYS.length,n=s===0?"cached":"ran";return(0,i.jsxs)("div",{className:Ke,children:[(0,i.jsx)("span",{className:re[n],"aria-hidden":!0}),(0,i.jsx)("span",{className:Fe,title:t.label,children:t.label}),(0,i.jsxs)("span",{className:Ue,children:[s,"/",r," ran · ",F(t.durationMs)]})]},t.id)})]}),rt=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",st=(e,t)=>{let s=0;for(const r of h.COMPILER_STAGE_KEYS)t(e[r])&&(s+=1);return s},F=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,nt=()=>{const{history:e}=o.useGraphContext(),{stack:t,undo:s,redo:r}=e,n=(0,d.useCallback)(u=>t.subscribe(u),[t]),l=(0,d.useCallback)(()=>t.getSnapshot(),[t]),c=(0,d.useSyncExternalStore)(n,l,l);return(0,d.useMemo)(()=>({...c,undo:s,redo:r}),[c,s,r])},ot=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),at=(e,t={})=>{const{target:s,enabled:r=!0}=t;(0,d.useEffect)(()=>{const n=it(s);if(!r||!n)return;const l=c=>{if(!ct(c)||c.defaultPrevented||lt(c.target))return;const u=o.resolveHistoryStep(c);if(!u)return;const m=e.current;m&&(u==="undo"?m.undo():m.redo())&&c.preventDefault()};return n.addEventListener("keydown",l),()=>n.removeEventListener("keydown",l)},[e,s,r])},it=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,ct=e=>"key"in e,lt=e=>e instanceof HTMLInputElement?!ot.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,dt=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,A.useStore)(e,t=>t.boundary)};exports.BrandMark=o.BrandMark;exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=Ze;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Pe;exports.GeomLine=we;exports.GraphErrorBoundary=Q;exports.GraphErrorPanel=O;exports.GraphProvider=te;exports.GraphRenderer=o.GraphRenderer;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=Me;exports.UnitSpaceSvg=Le;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Ie;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=ee;exports.resolveBrandMarkVisual=o.resolveBrandMarkVisual;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.useGeomReaderTree=o.useGeomReaderTree;exports.useGeomStyleReader=o.useGeomStyleReader;exports.useGraphCommands=o.useGraphCommands;exports.useGraphHandle=o.useGraphHandle;exports.useGraphHistory=nt;exports.useGraphHistoryShortcuts=at;exports.useGraphSelection=o.useGraphSelection;exports.useGuidesTakePress=o.useGuidesTakePress;exports.useHandleScene=o.useHandleScene;exports.useHoverState=o.useHoverState;exports.useResolvedStyle=o.useResolvedStyle;exports.useSceneSelector=o.useSceneSelector;exports.useStyleReaderTree=o.useStyleReaderTree;exports.useStyleResolver=o.useStyleResolver;exports.useTargetBoundary=dt;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=oe.vars;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('./index.css');const o=require("./history-chords-UXho7u0a.cjs"),oe=require("./theme.contract.css-DKDKSByt.cjs");let g=require("@graphysdk/viz-engine"),d=require("react"),a=require("react/jsx-runtime"),B=require("zustand"),A=require("motion/react"),F=require("zustand/vanilla"),O=require("clsx");O=o.__toESM(O,1);var ae="_1a5iqpb0",ie="_1a5iqpb1";var ce="_1a5iqpb3",le="_1a5iqpb4",de="_1a5iqpb5";var K=({errors:e})=>{const[t,...s]=e;return(0,a.jsxs)("div",{role:"alert",className:ae,children:[(0,a.jsx)("strong",{className:ie,children:"This chart could not be rendered."}),t&&(0,a.jsx)(W,{diagnostic:t}),s.length>0&&(0,a.jsx)("ul",{className:"_1a5iqpb2",children:s.map((r,n)=>(0,a.jsx)("li",{children:(0,a.jsx)(W,{diagnostic:r})},`${r.code}-${n}`))})]})},W=({diagnostic:e})=>(0,a.jsxs)("div",{className:ce,children:[(0,a.jsx)("span",{className:le,children:e.code}),(0,a.jsx)("p",{className:de,children:e.message}),e.suggestion&&(0,a.jsx)("p",{className:"_1a5iqpb6",children:e.suggestion})]});function ue(e=[],t=[]){return e.length===t.length&&e.every((s,r)=>Object.is(s,t[r]))}var Q=class extends d.Component{constructor(...e){super(...e),this.state={caughtDiagnostic:null}}static getDerivedStateFromError(e){return{caughtDiagnostic:(0,g.buildDiagnostic)(e)}}componentDidCatch(e,t){const s=(0,g.buildDiagnostic)(e);o.logDiagnostics([s]),this.props.onError?.([s]),console.error("Chart render component stack:",t.componentStack)}componentDidUpdate(e){this.state.caughtDiagnostic&&!ue(e.resetKeys,this.props.resetKeys)&&this.setState({caughtDiagnostic:null})}render(){const{caughtDiagnostic:e}=this.state;if(e)return(0,a.jsx)(K,{errors:[e]});const{forcedErrors:t,children:s}=this.props;return t&&t.length>0?(0,a.jsx)(K,{errors:t}):s}},J=e=>typeof e=="object"&&"geom"in e&&"render"in e,Z=e=>{const t=(0,g.resolveDefinition)(e);return t instanceof g.Geom?t:null},ee=(e,t)=>{const s=e.filter(r=>me(r,t));return s.length===e.length?e:s},me=(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,V=[],he=()=>(0,F.createStore)(e=>({selection:V,setSelection:t=>e(s=>ge(s.selection,t)?s:{selection:t}),clearSelection:()=>e(t=>t.selection.length===0?t:{selection:V})})),ge=(e,t)=>e===t?!0:e.length!==t.length?!1:e.every((s,r)=>{const n=t[r];return n!==void 0&&(0,g.areEditTargetsEqual)(s,n)}),pe=process.env.NODE_ENV!=="production",fe=5,ve=e=>{if(!pe)return{emit:()=>{},subscribe:()=>ye,getLastTrigger:()=>null,getLastCompile:()=>null,getCacheStats:()=>e.getCacheStats()};const t=new Set;let s=null;return{emit:r=>{const n=e.getLastCompile();if(n){s=r;for(const l of t)l(r,n)}},subscribe:r=>(t.add(r),()=>{t.delete(r)}),getLastTrigger:()=>s,getLastCompile:()=>e.getLastCompile(),getCacheStats:()=>e.getCacheStats()}},Se=()=>(0,F.createStore)(e=>({lastCompile:null,history:[],nextId:1,lastSnapshot:null,recordCompile:(t,s)=>e(r=>{if(r.lastSnapshot===s)return r;const n={id:r.nextId,label:be(t),stages:s.stages,stageDurationsMs:s.stageDurationsMs,durationMs:s.durationMs};return{lastCompile:n,history:Te(r.history,n,fe),nextId:r.nextId+1,lastSnapshot:s}})})),ye=()=>{},be=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}},Te=(e,t,s)=>{const r=e.length>=s?e.length-(s-1):0;return[...e.slice(r),t]};function Ee(e){const t=e.filter(J),s=new Set([...Object.keys(o.BUILT_IN_GEOM_RENDERERS),...t.map(u=>u.geom)]),r=[],n=new Set;for(const u of e){const m=Z(u);m===null||s.has(m.type)||n.has(m.type)||(n.add(m.type),r.push({kind:"user-input",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 l=new Map;for(const u of t){if("definition"in u)continue;const m=`${u.geom}|${u.coord}`,f=l.get(m);f?f.count+=1:l.set(m,{geom:u.geom,coord:u.coord,count:1})}const c=[];for(const{geom:u,coord:m,count:f}of l.values())f<2||c.push({kind:"user-input",severity:"warning",code:"DUPLICATE_REGISTERED_TYPE",message:`Multiple render-only overrides register ('${u}', '${m}') (${f} 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 c.push(..._e(e)),{errors:r,warnings:c}}function xe(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r)t(c.geom,s.type)!==null||n.has(c.geom)||(n.add(c.geom),l.push({kind:"user-input",severity:"warning",code:"MISSING_GEOM_RENDERER",message:`No renderer for geom '${c.geom}' under ${s.type} coords; the layer is not painted.`,context:{requested:c.geom,kind:"geom-renderer"},suggestion:`Register a renderer for ('${c.geom}', '${s.type}') via \`defineGeomRenderer\`.`}));return l}function Re(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||u.hitTest||o.isOverlayHosted(u)||(n.add(c.geom),l.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}', '${s.type}').`}))}return l}function Ge(e){const t=new Set,s=[];for(const r of e.layers){const n=r.identityKey;r.interactive!==!1&&(r.spatialKind!=="render-hit-test"||typeof n!="object"||t.has(r.geom)||r.data.hasVariable(n.variable)||(t.add(r.geom),s.push({kind:"user-input",severity:"warning",code:"RENDER_HIT_TEST_IDENTITY",message:`Geom '${r.geom}' keys its identity on '${n.variable}', a column its compile output does not emit; its hover lookup is empty.`,context:{requested:r.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 s}function Ce(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind!=="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||!u.hitTest||!o.isOverlayHosted(u)||(n.add(c.geom),l.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 l}function Ne(e,t){const s=new Set,r=[];for(const n of e.layers)n.interactive!==!1&&(n.spatialKind!=="render-hit-test"||s.has(n.geom)||t.hasCapability(n.geom)||(s.add(n.geom),r.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 r}function je(e,t){const{coordSystem:s,layers:r}=e,n=new Set,l=[];for(const c of r){if(c.interactive===!1||c.spatialKind==="render-hit-test"||n.has(c.geom))continue;const u=t(c.geom,s.type);u===null||!o.isOverlayHosted(u)||(n.add(c.geom),l.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 l}function _e(e){const t=new Set,s=[];for(const r of e){const n=Z(r);n===null||t.has(n.type)||n.dataLabelCoordTypes.length===0||n.getDataLabelPlacements!==void 0||(t.add(n.type),s.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 s}var De=e=>(0,F.createStore)(t=>({scene:e,setScene:s=>t(r=>r.scene===s?r:{scene:s})})),qe=({spec:e,data:t,customPalettes:s,colorScheme:r,plugins:n,resolveRenderer:l,anchorResolver:c,onSpecChange:u,onError:m,onWarnings:f})=>{const T=o.useLatestRef(u),j=o.useLatestRef(m),R=o.useLatestRef(f),[{session:v,compileBus:h}]=(0,d.useState)(()=>{const i=(0,g.createCompiler)({plugins:n});return{session:new g.GraphCompilationSession(i),compileBus:ve(i)}}),[p]=(0,d.useState)(()=>Ee(n??[])),G=(0,d.useRef)(null),[_]=(0,d.useState)(ke),y=(0,d.useRef)(null),C=(0,d.useCallback)(i=>p.errors.length===0?i:[...p.errors,...i??[]],[p]),k=(0,d.useCallback)(i=>{if(!i.ok)return i.errors;if(y.current)y.current.getState().setScene(i.scene);else{const S=De(i.scene);S.subscribe(_.notify),y.current=S,_.notify()}return null},[_]),[D,I]=(0,d.useState)(()=>{const i=v.compile({spec:e,data:t,customPalettes:s,colorScheme:r});return G.current=i,C(k(i))}),E=(0,d.useCallback)(i=>i.ok?[...i.warnings,...xe(i.scene,l),...Re(i.scene,l),...Ge(i.scene),...Ce(i.scene,l),...je(i.scene,l),...Ne(i.scene,c)]:i.warnings,[l,c]),x=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),j.current?.(i))},[j]),N=(0,d.useCallback)(i=>{i.length!==0&&(o.logDiagnostics(i),R.current?.(i))},[R]);(0,d.useEffect)(()=>{const i=G.current;i&&(x([...p.errors,...i.ok?[]:i.errors]),N([...p.warnings,...E(i)]),i.ok&&h.emit({kind:"init"}))},[h,x,N,p,E]),(0,d.useEffect)(()=>{const i=v.update({spec:e,data:t,customPalettes:s,colorScheme:r});if(!i)return;i.committedSpec&&T.current?.(i.committedSpec);const S=k(i.result);I(C(S)),S&&x(S),N(E(i.result)),S||h.emit({kind:i.specChanged?"spec":"data"})},[e,t,s,r,v,h,k,x,N,C,E,T]);const q=(0,d.useCallback)(i=>{I(S=>S===null?S:C(null)),N(E(i))},[C,N,E]),P=(0,d.useCallback)(i=>{i.scene&&y.current?.getState().setScene(i.scene),i.result&&q(i.result),i.command&&h.emit({kind:"command",command:i.command}),i.spec&&T.current?.(i.spec),i.errors&&x([...i.errors])},[q,h,T,x]),b=(0,d.useCallback)(i=>{for(const S of i)P(S);return i.some(S=>!!S.scene)},[P]),$=(0,d.useCallback)((i,S)=>{b(v.applyCommand(i,S))},[v,b]),w=(0,d.useCallback)(()=>{b(v.commit())},[v,b]),M=(0,d.useCallback)(()=>b(v.undo()),[v,b]),Y=(0,d.useCallback)(()=>b(v.redo()),[v,b]),se=(0,d.useMemo)(()=>({stack:v.history,undo:M,redo:Y}),[v,M,Y]),ne=(0,d.useCallback)(()=>y.current?.getState().scene??null,[]);return{store:y.current,dispatch:$,commit:w,history:se,subscribe:_.subscribe,getScene:ne,compileBus:h,compileErrors:D}},ke=()=>{const e=new Set;return{subscribe:t=>(e.add(t),()=>{e.delete(t)}),notify:()=>e.forEach(t=>t())}},te=({data:e,spec:t,plugins:s=[],formattingLocale:r,handleRef:n,onSpecChange:l,onError:c,onWarnings:u,customPalettes:m,colorScheme:f="light",children:T})=>{const[j]=(0,d.useState)(()=>o.createGeomRendererResolver(s.filter(J))),R=(0,d.useId)(),[v]=(0,d.useState)(()=>(0,g.createAnchorResolver)(s)),[h]=(0,d.useState)(()=>(0,g.createDataLabelPlacementResolver)(s)),[p]=(0,d.useState)(()=>he()),[G]=(0,d.useState)(()=>o.createTargetBoundaryStore()),_=(0,d.useMemo)(()=>(0,g.createStyleResolver)({colorScheme:f}),[f]),{store:y,dispatch:C,commit:k,history:D,subscribe:I,getScene:E,compileBus:x,compileErrors:N}=qe({spec:t,data:e,customPalettes:m,colorScheme:f,plugins:s,resolveRenderer:j,anchorResolver:v,onSpecChange:l,onError:c,onWarnings:u});(0,d.useEffect)(()=>{if(y)return y.subscribe((b,$)=>{if(b.scene.spec===$.scene.spec)return;const{selection:w,setSelection:M}=p.getState();w.length!==0&&M(ee(w,b.scene.spec))})},[y,p]);const q=(0,d.useMemo)(()=>({dispatch:C,commit:k}),[C,k]);(0,d.useImperativeHandle)(n,()=>({commands:q,undo:D.undo,redo:D.redo,subscribe:I,getScene:E,getSelection:()=>p.getState().selection,setSelection:b=>p.getState().setSelection(b),subscribeSelection:p.subscribe,canPlaceDataLabels:h.hasCapability,canFormatDataLabelsAsPercentages:h.hasPercentageFormat}),[q,D,I,E,p,h]);const P=(0,d.useMemo)(()=>y?{chartId:R,store:y,selectionStore:p,targetBoundaryStore:G,commands:q,history:D,formattingLocale:r,compileBus:x,colorScheme:f,styleResolver:_,anchorResolver:v}:null,[R,y,p,G,q,D,r,x,f,_,v]);return(0,a.jsx)(Q,{forcedErrors:N,onError:c,resetKeys:[t,e],children:P?(0,a.jsx)(o.GraphContext.Provider,{value:P,children:(0,a.jsx)(o.GeomRendererResolverProvider,{value:j,children:(0,a.jsx)(o.DataLabelPlacementResolverProvider,{value:h,children:T})})}):null})};function Ie(e){const t=(0,g.createSpecBuilder)(e);return{...t,GraphProvider:r=>(0,a.jsx)(te,{...r,plugins:t.plugins})}}var Pe=({shouldAnimateTransitions:e,cx:t,cy:s,r,...n})=>e?(0,a.jsx)(A.motion.circle,{initial:!1,animate:{cx:t,cy:s,r},transition:o.DEFAULT_SPRING_TRANSITION,...n}):(0,a.jsx)("circle",{cx:t,cy:s,r,...n}),Le=({shouldAnimateTransitions:e,x1:t,y1:s,x2:r,y2:n,...l})=>e?(0,a.jsx)(A.motion.line,{initial:!1,animate:{x1:t,y1:s,x2:r,y2:n},transition:o.DEFAULT_SPRING_TRANSITION,...l}):(0,a.jsx)("line",{x1:t,y1:s,x2:r,y2:n,...l}),we=({shouldAnimateTransitions:e,x:t,y:s,width:r,height:n,...l})=>e?(0,a.jsx)(A.motion.rect,{initial:!1,animate:{attrX:t,attrY:s,width:r,height:n},transition:o.DEFAULT_SPRING_TRANSITION,...l}):(0,a.jsx)("rect",{x:t,y:s,width:r,height:n,...l}),Me=({shouldAnimateTransitions:e,d:t,source:s,...r})=>e?(0,a.jsx)(He,{d:t,source:s,...r}):(0,a.jsx)("path",{d:t,...r}),He=({d:e,source:t,...s})=>{const r=o.useSvgPathMorph(e,o.DEFAULT_SPRING_TRANSITION,t);return(0,a.jsx)(A.motion.path,{d:r,...s})},Ae=({children:e,...t})=>(0,a.jsx)("svg",{viewBox:"0 0 1 1",preserveAspectRatio:"none",width:"100%",height:"100%",pointerEvents:"none",...t,children:e}),$e=({box:e,children:t})=>(0,a.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}),Be="drqe3u0",Oe="drqe3u1",Ke="drqe3u2",Fe="drqe3u3",L="drqe3u4",Ue="drqe3u5",Ye="drqe3u6",We="drqe3u7",H="drqe3u8",Ve="drqe3u9",ze="drqe3ua";var Xe="drqe3uc",Qe="drqe3ud",Je="drqe3ue",Ze="drqe3uf";var et="drqe3uh",tt="drqe3ui",z={enabled:"drqe3uk drqe3uj",disabled:"drqe3ul drqe3uj"},X={ran:"drqe3un drqe3um",dim:"drqe3uo drqe3um"},re={ran:"drqe3uq drqe3up",cached:"drqe3ur drqe3up",untouched:"drqe3us drqe3up"},rt=({width:e=440,style:t,className:s}={})=>{const{compileBus:r}=o.useGraphContext(),[n]=(0,d.useState)(()=>Se()),[l,c]=(0,d.useState)(!1),[u,m]=(0,d.useState)(g.isCompilerCachingEnabled);(0,d.useEffect)(()=>{const{recordCompile:h}=n.getState(),p=r.getLastTrigger(),G=r.getLastCompile();return p&&G&&h(p,G),r.subscribe(h)},[n,r]);const f=(0,B.useStore)(n,h=>h.lastCompile),T=(0,B.useStore)(n,h=>h.history),j=r.getCacheStats(),R=f===null&&T.length===0,v=()=>{m(h=>{const p=!h;return(0,g.setCompilerCachingEnabled)(p),p})};return(0,a.jsxs)("div",{className:(0,O.default)(ze,s),style:{width:e,...t},children:[(0,a.jsxs)("div",{className:Be,children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{className:Oe,children:"compile cache"}),(0,a.jsx)("div",{className:Je,children:R?"production: stats disabled":f?`last: ${f.label} · ${U(f.durationMs)}`:"awaiting first compile…"})]}),(0,a.jsx)("button",{type:"button",onClick:()=>c(h=>!h),className:Ze,children:l?"▾":"▴"})]}),!l&&(0,a.jsxs)("div",{className:"drqe3ub",children:[(0,a.jsxs)("button",{type:"button",onClick:v,className:u?z.enabled:z.disabled,"aria-pressed":u,children:["cache ",u?"enabled":"disabled"]}),(0,a.jsx)("span",{className:"drqe3ug",children:"next compile reflects this toggle"})]}),!l&&!R&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(st,{delta:f?.stages,durations:f?.stageDurationsMs,cumulative:j}),(0,a.jsx)(nt,{entries:T})]})]})},st=({delta:e,durations:t,cumulative:s})=>(0,a.jsxs)("table",{className:Ke,children:[(0,a.jsx)("thead",{children:(0,a.jsxs)("tr",{className:et,children:[(0,a.jsx)("th",{className:Fe,children:"stage"}),(0,a.jsx)("th",{className:L,children:"time"}),(0,a.jsx)("th",{className:L,children:"Δ miss"}),(0,a.jsx)("th",{className:L,children:"Δ hit"}),(0,a.jsx)("th",{className:L,children:"total miss"}),(0,a.jsx)("th",{className:L,children:"total hit"})]})}),(0,a.jsx)("tbody",{children:g.COMPILER_STAGE_KEYS.map(r=>{const n=e?.[r],l=ot(n);return(0,a.jsxs)("tr",{className:Xe,children:[(0,a.jsxs)("td",{className:Ue,children:[(0,a.jsx)("span",{className:re[l],"aria-hidden":!0})," ",r]}),(0,a.jsx)("td",{className:H,children:t===void 0||l==="untouched"?"—":U(t[r])}),(0,a.jsx)("td",{className:l==="ran"?X.ran:X.dim,children:n?.misses??0}),(0,a.jsx)("td",{className:H,children:n?.hits??0}),(0,a.jsx)("td",{className:H,children:s[r].misses}),(0,a.jsx)("td",{className:H,children:s[r].hits})]},r)})})]}),nt=({entries:e})=>e.length===0?null:(0,a.jsxs)("div",{className:Qe,children:[(0,a.jsx)("div",{className:tt,children:"recent compiles"}),e.map(t=>{const s=at(t.stages,l=>l.misses>0),r=g.COMPILER_STAGE_KEYS.length,n=s===0?"cached":"ran";return(0,a.jsxs)("div",{className:Ye,children:[(0,a.jsx)("span",{className:re[n],"aria-hidden":!0}),(0,a.jsx)("span",{className:We,title:t.label,children:t.label}),(0,a.jsxs)("span",{className:Ve,children:[s,"/",r," ran · ",U(t.durationMs)]})]},t.id)})]}),ot=e=>!e||e.hits===0&&e.misses===0?"untouched":e.misses>0?"ran":"cached",at=(e,t)=>{let s=0;for(const r of g.COMPILER_STAGE_KEYS)t(e[r])&&(s+=1);return s},U=e=>e<.1?"<0.1ms":e>=10?`${e.toFixed(0)}ms`:`${e.toFixed(2)}ms`,it=()=>{const{history:e}=o.useGraphContext(),{stack:t,undo:s,redo:r}=e,n=(0,d.useCallback)(u=>t.subscribe(u),[t]),l=(0,d.useCallback)(()=>t.getSnapshot(),[t]),c=(0,d.useSyncExternalStore)(n,l,l);return(0,d.useMemo)(()=>({...c,undo:s,redo:r}),[c,s,r])},ct=new Set(["button","checkbox","color","file","hidden","image","radio","range","reset","submit"]),lt=(e,t={})=>{const{target:s,enabled:r=!0}=t;(0,d.useEffect)(()=>{const n=dt(s);if(!r||!n)return;const l=c=>{if(!ut(c)||c.defaultPrevented||mt(c.target))return;const u=o.resolveHistoryStep(c);if(!u)return;const m=e.current;m&&(u==="undo"?m.undo():m.redo())&&c.preventDefault()};return n.addEventListener("keydown",l),()=>n.removeEventListener("keydown",l)},[e,s,r])},dt=e=>e===void 0?window:e!==null&&"current"in e?e.current:e,ut=e=>"key"in e,mt=e=>e instanceof HTMLInputElement?!ct.has(e.type):e instanceof HTMLElement?e.isContentEditable||e.tagName==="TEXTAREA":!1,ht=()=>{const{targetBoundaryStore:e}=o.useGraphContext();return(0,B.useStore)(e,t=>t.boundary)};exports.BrandMark=o.BrandMark;exports.CanvasTextMeasurer=o.CanvasTextMeasurer;exports.DefaultFooter=o.DefaultFooter;exports.DefaultGrid=o.DefaultGrid;exports.DefaultHeader=o.DefaultHeader;exports.DefaultSwatch=o.DefaultSwatch;exports.DefaultTooltip=o.DefaultTooltip;exports.DevToolsPanel=rt;exports.GRAPH_MODES=o.GRAPH_MODES;exports.GeomCircle=Pe;exports.GeomLine=Le;exports.GeomPath=Me;exports.GeomRect=we;exports.GraphErrorBoundary=Q;exports.GraphErrorPanel=K;exports.GraphProvider=te;exports.GraphRenderer=o.GraphRenderer;exports.HoverProvider=o.HoverProvider;exports.IntroFade=o.IntroFade;exports.IntroWipeClip=o.IntroWipeClip;exports.TextMeasurerProvider=o.TextMeasurerProvider;exports.ThemeProvider=o.ThemeProvider;exports.UnitBoxSvg=$e;exports.UnitSpaceSvg=Ae;exports.buildDotsEditOutlineShapes=o.buildDotsEditOutlineShapes;exports.createGraphyKit=Ie;exports.darkTheme=o.darkTheme;exports.defineGeomRenderer=o.defineGeomRenderer;exports.lightTheme=o.lightTheme;exports.lightenCss=o.lightenCss;exports.projectPointCartesian=o.projectPointCartesian;exports.pruneSelection=ee;exports.resolveBrandMarkVisual=o.resolveBrandMarkVisual;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.useGeomReaderTree=o.useGeomReaderTree;exports.useGeomStyleReader=o.useGeomStyleReader;exports.useGraphCommands=o.useGraphCommands;exports.useGraphHandle=o.useGraphHandle;exports.useGraphHistory=it;exports.useGraphHistoryShortcuts=lt;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=ht;exports.useTextMeasurer=o.useTextMeasurer;exports.vars=oe.vars;
package/dist/index.d.ts CHANGED
@@ -459,6 +459,55 @@ export declare interface GeomOverlayRenderInput<G extends GeomName | string = st
459
459
  overlay: InteractiveOverlayApi;
460
460
  }
461
461
 
462
+ /**
463
+ * A path whose shape morphs to its new one — {@link GeomCircle} for a free shape, such as a polygon between two
464
+ * bars. A path is drawn in pixels, so it takes the layer it is drawn from as `source`: a resize redraws it where
465
+ * the percentage marks already are, rather than morphing behind them.
466
+ */
467
+ export declare const GeomPath: ({ shouldAnimateTransitions, d, source, ...paint }: GeomPathProps) => JSX.Element;
468
+
469
+ declare interface GeomPathProps {
470
+ /** The path in the panel's local pixels, `0…width` by `0…height`: a path has no percentage units. */
471
+ d: string;
472
+ /**
473
+ * The layer the path is drawn from. A new path from the same layer (at another panel size) lands at once, as the
474
+ * marks placed in panel percentages do; only a new layer, from a recompile, morphs.
475
+ */
476
+ source: SceneLayer;
477
+ fill?: string;
478
+ opacity?: number;
479
+ fillOpacity?: number;
480
+ stroke?: string;
481
+ strokeOpacity?: number;
482
+ strokeWidth?: number;
483
+ strokeDasharray?: string;
484
+ /** Whether a change of shape morphs to the new one. Snaps when false. */
485
+ shouldAnimateTransitions: boolean;
486
+ 'data-testid'?: string;
487
+ }
488
+
489
+ /**
490
+ * A rect whose origin and size spring to their new values — {@link GeomCircle} for a box. Motion reads `x`
491
+ * and `y` on an SVG element as a transform, so the origin springs through `attrX` and `attrY`, the attributes.
492
+ */
493
+ export declare const GeomRect: ({ shouldAnimateTransitions, x, y, width, height, ...paint }: GeomRectProps) => JSX.Element;
494
+
495
+ declare interface GeomRectProps {
496
+ x: MarkPosition;
497
+ y: MarkPosition;
498
+ width: MarkPosition;
499
+ height: MarkPosition;
500
+ fill?: string;
501
+ opacity?: number;
502
+ fillOpacity?: number;
503
+ stroke?: string;
504
+ strokeOpacity?: number;
505
+ strokeWidth?: number;
506
+ /** Whether a change of origin or size springs to the new one. Snaps when false. */
507
+ shouldAnimateTransitions: boolean;
508
+ 'data-testid'?: string;
509
+ }
510
+
462
511
  /**
463
512
  * A geom's `render`: either a plain panel-SVG paint function, or an overlay-hosted one paired with
464
513
  * `options` — so a geom that must paint into the interactive overlay declares
@@ -1150,6 +1199,27 @@ declare interface OverlayAnchorInput<G extends GeomName | string = string, C ext
1150
1199
  observation: Observation;
1151
1200
  }
1152
1201
 
1202
+ export declare interface PaintDefs {
1203
+ /** The `fill` attribute for a paint: the colour itself, or a `url(#id)` into the defs this SVG renders. */
1204
+ fillFor: (paint: ResolvedPaint) => string;
1205
+ /** The `<defs>` for `paints`; render it once inside the SVG. */
1206
+ defs: ReactNode;
1207
+ }
1208
+
1209
+ export declare interface PaintDefsOptions {
1210
+ /** Paints used by this render. Duplicate values share a definition; solid colours need none. */
1211
+ paints: readonly ResolvedPaint[];
1212
+ unitsPerPixel?: UnitsPerPixel;
1213
+ /** Defaults to the top-left corner. Does not affect gradients or stretched images. */
1214
+ origin?: PaintGridOrigin;
1215
+ }
1216
+
1217
+ /** Origin of a pattern or tiled-image grid, in fractions of the SVG viewport's width and height. */
1218
+ export declare interface PaintGridOrigin {
1219
+ x: number;
1220
+ y: number;
1221
+ }
1222
+
1153
1223
  /**
1154
1224
  * How a point's `(x, y)` becomes SVG coordinates — the only thing that differs between a cartesian point
1155
1225
  * and a polar (radar) point. Each coord's geom-renderer and hover container supply their own projection;
@@ -1502,6 +1572,12 @@ declare interface UnitSpaceSvgProps extends Omit<SVGProps<SVGSVGElement>, 'viewB
1502
1572
  children: ReactNode;
1503
1573
  }
1504
1574
 
1575
+ /** How many of the SVG's user units make one screen pixel along each axis, so a tile repeats every `size` pixels. */
1576
+ export declare interface UnitsPerPixel {
1577
+ x: number;
1578
+ y: number;
1579
+ }
1580
+
1505
1581
  /**
1506
1582
  * Tracks an element's on-screen rect, so that a fixed-position overlay can sit exactly over it in pixel
1507
1583
  * space. `screenRect` is `null` until the first measurement lands, and drops back to `null` whenever the
@@ -1624,6 +1700,9 @@ export declare const useGraphHistory: () => GraphHistory;
1624
1700
  */
1625
1701
  export declare const useGraphHistoryShortcuts: (handleRef: RefObject<GraphHandle | null>, options?: GraphHistoryShortcutsOptions) => void;
1626
1702
 
1703
+ /** The locale a chart reads. Resolved outside `IntlProvider`, so either renderer can mount its own. */
1704
+ export declare const useGraphLocale: () => "en-GB" | "en-US" | "ar" | "pt-PT";
1705
+
1627
1706
  /**
1628
1707
  * Subscribes to what the graph holds selected, from inside a `<GraphProvider>`. The store is
1629
1708
  * per-chart and shared with {@link GraphHandle}, so a surface outside the tree and one inside it
@@ -1658,6 +1737,12 @@ export declare const useHandleScene: (handle: GraphHandle) => Scene | null;
1658
1737
  */
1659
1738
  export declare function useHoverState<T>(selector: (state: HoverStoreState) => T): T;
1660
1739
 
1740
+ /**
1741
+ * Builds SVG definitions for the current paints, sharing one definition per distinct paint value.
1742
+ * Hashes keep ids short; suffixes distinguish collisions. Unused definitions are removed on update.
1743
+ */
1744
+ export declare const usePaintDefs: ({ paints, unitsPerPixel, origin, }: PaintDefsOptions) => PaintDefs;
1745
+
1661
1746
  /** Memoizes a module-level style read. Pass the read function, then the arguments it needs. */
1662
1747
  export declare const useResolvedStyle: <TArgs extends readonly unknown[], TResult>(read: (...args: TArgs) => TResult, ...args: TArgs) => TResult;
1663
1748