@expertrees/react 0.1.0
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 +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +89 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=require("react/jsx-runtime"),c=require("react"),O=require("@expertrees/core");function b(o){const l=c.useRef(null),[v,C]=c.useState(null),[g,m]=c.useState(null),[h,s]=c.useState(null),[N,x]=c.useState(1),[k,i]=c.useState([{nodeId:null,label:o.data.label}]),r=c.useCallback(n=>C(n),[]);c.useEffect(()=>{var d;if((d=l.current)==null||d.dispose(),l.current=null,!v)return;const n=new O.SkillTreeEngine({canvas:v,data:o.data,...o.theme!==void 0&&{theme:o.theme},...o.lod!==void 0&&{lod:o.lod},...o.initialContextNodeId!==void 0&&{initialContextNodeId:o.initialContextNodeId},on:{...o.on,"node:hover":t=>{var e,a;m(t),(a=(e=o.on)==null?void 0:e["node:hover"])==null||a.call(e,t)},"node:blur":t=>{var e,a;m(u=>(u==null?void 0:u.id)===t.id?null:u),(a=(e=o.on)==null?void 0:e["node:blur"])==null||a.call(e,t)},"node:click":t=>{var e,a;s(u=>(u==null?void 0:u.id)===t.id?null:t),(a=(e=o.on)==null?void 0:e["node:click"])==null||a.call(e,t)},"canvas:click":()=>{var t,e;s(null),(e=(t=o.on)==null?void 0:t["canvas:click"])==null||e.call(t)},"zoom:change":t=>{var e,a;x(t),(a=(e=o.on)==null?void 0:e["zoom:change"])==null||a.call(e,t)},"context:enter":(t,e)=>{var a,u;i([...e]),s(null),(u=(a=o.on)==null?void 0:a["context:enter"])==null||u.call(a,t,e)},"context:exit":(t,e)=>{var a,u;i([...e]),s(null),(u=(a=o.on)==null?void 0:a["context:exit"])==null||u.call(a,t,e)},"graph:ready":t=>{var e,a;(a=(e=o.on)==null?void 0:e["graph:ready"])==null||a.call(e,t)}}});return l.current=n,i([...n.getNavigationStack()]),()=>{n.dispose(),l.current=null}},[v,o.data]);const S=c.useCallback((n,d)=>{var t;return(t=l.current)==null?void 0:t.setNodeState(n,d)},[]),E=c.useCallback((n,d)=>{var t;return(t=l.current)==null?void 0:t.addEvidence(n,d)},[]),f=c.useCallback((n,d)=>{var t;return(t=l.current)==null?void 0:t.removeEvidence(n,d)},[]),z=c.useCallback(n=>{var d;return(d=l.current)==null?void 0:d.updateTheme(n)},[]),I=c.useCallback(()=>{var n;return(n=l.current)==null?void 0:n.zoomIn()},[]),T=c.useCallback(()=>{var n;return(n=l.current)==null?void 0:n.zoomOut()},[]),j=c.useCallback(()=>{var n;return(n=l.current)==null?void 0:n.goBack()},[]),y=c.useCallback(()=>{var n;return((n=l.current)==null?void 0:n.getGraph())??o.data},[o.data]),B=c.useCallback(n=>{var d;return(d=l.current)==null?void 0:d.enterContext(n)},[]),G=c.useCallback(n=>{var d;return(d=l.current)==null?void 0:d.jumpToNavDepth(n)},[]);return{canvasRef:r,hoveredNode:g,selectedNode:h,zoom:N,navigationStack:k,canGoBack:k.length>1,goBack:j,setNodeState:S,addEvidence:E,removeEvidence:f,updateTheme:z,zoomIn:I,zoomOut:T,getGraph:y,enterContext:B,jumpToNavDepth:G}}const D=c.forwardRef(function(l,v){const{data:C,theme:g,lod:m,initialContextNodeId:h,width:s="100%",height:N="100%",style:x,className:k,on:i}=l,r=b({data:C,...g!==void 0&&{theme:g},...m!==void 0&&{lod:m},...h!==void 0&&{initialContextNodeId:h},...i!==void 0&&{on:i}});return c.useImperativeHandle(v,()=>({setNodeState:r.setNodeState,addEvidence:r.addEvidence,removeEvidence:r.removeEvidence,updateTheme:r.updateTheme,zoomIn:r.zoomIn,zoomOut:r.zoomOut,goBack:r.goBack,enterContext:r.enterContext,jumpToNavDepth:r.jumpToNavDepth,getGraph:r.getGraph,get hoveredNode(){return r.hoveredNode},get selectedNode(){return r.selectedNode},get zoom(){return r.zoom},get navigationStack(){return r.navigationStack},get canGoBack(){return r.canGoBack}}),[r]),R.jsx("canvas",{ref:r.canvasRef,style:{width:s,height:N,display:"block",...x},className:k})});exports.ExpertreeCanvas=D;exports.useExpertree=b;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/useExpertree.ts","../src/ExpertreeCanvas.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } from 'react'\nimport {\n SkillTreeEngine,\n type SkillGraph,\n type SkillNode,\n type NodeState,\n type Evidence,\n type ThemeInput,\n type LodThreshold,\n type SkillTreeEvents,\n type NavigationFrame,\n} from '@expertrees/core'\n\nexport interface UseExpertreeOptions {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n on?: Partial<SkillTreeEvents>\n initialContextNodeId?: string\n}\n\nexport interface UseExpertreeReturn {\n /** Attach to the <canvas> element via the ref callback */\n canvasRef: (el: HTMLCanvasElement | null) => void\n /** Currently hovered node */\n hoveredNode: SkillNode | null\n /** Currently selected node */\n selectedNode: SkillNode | null\n /** Current zoom level */\n zoom: number\n /** Current navigation stack — last entry is the active context */\n navigationStack: readonly NavigationFrame[]\n /** Whether the user can navigate back to a parent context */\n canGoBack: boolean\n /** Navigate back to the parent context */\n goBack: () => void\n /** Set a node's semantic state */\n setNodeState: (nodeId: string, state: NodeState) => void\n /** Add evidence to a node */\n addEvidence: (nodeId: string, evidence: Evidence) => void\n /** Remove evidence from a node */\n removeEvidence: (nodeId: string, evidenceId: string) => void\n /** Update the visual theme */\n updateTheme: (theme: ThemeInput) => void\n /** Programmatic zoom in */\n zoomIn: () => void\n /** Programmatic zoom out */\n zoomOut: () => void\n /** Get serialized graph state */\n getGraph: () => SkillGraph\n /** Programmatically enter a bubble node's context */\n enterContext: (nodeId: string) => void\n /** Atomically jump to a specific nav stack depth */\n jumpToNavDepth: (targetLength: number) => void\n}\n\nexport function useExpertree(options: UseExpertreeOptions): UseExpertreeReturn {\n const engineRef = useRef<SkillTreeEngine | null>(null)\n const [canvas, setCanvas] = useState<HTMLCanvasElement | null>(null)\n const [hoveredNode, setHoveredNode] = useState<SkillNode | null>(null)\n const [selectedNode, setSelectedNode] = useState<SkillNode | null>(null)\n const [zoom, setZoom] = useState(1)\n const [navigationStack, setNavigationStack] = useState<readonly NavigationFrame[]>([\n { nodeId: null, label: options.data.label },\n ])\n\n const canvasRef = useCallback((el: HTMLCanvasElement | null) => setCanvas(el), [])\n\n useEffect(() => {\n engineRef.current?.dispose()\n engineRef.current = null\n\n if (!canvas) return\n\n const engine = new SkillTreeEngine({\n canvas,\n data: options.data,\n ...(options.theme !== undefined && { theme: options.theme }),\n ...(options.lod !== undefined && { lod: options.lod }),\n ...(options.initialContextNodeId !== undefined && { initialContextNodeId: options.initialContextNodeId }),\n on: {\n ...options.on,\n 'node:hover': (node) => {\n setHoveredNode(node)\n options.on?.['node:hover']?.(node)\n },\n 'node:blur': (node) => {\n setHoveredNode(prev => prev?.id === node.id ? null : prev)\n options.on?.['node:blur']?.(node)\n },\n 'node:click': (node) => {\n setSelectedNode(prev => prev?.id === node.id ? null : node)\n options.on?.['node:click']?.(node)\n },\n 'canvas:click': () => {\n setSelectedNode(null)\n options.on?.['canvas:click']?.()\n },\n 'zoom:change': (z) => {\n setZoom(z)\n options.on?.['zoom:change']?.(z)\n },\n 'context:enter': (node, stack) => {\n setNavigationStack([...stack])\n setSelectedNode(null)\n options.on?.['context:enter']?.(node, stack)\n },\n 'context:exit': (frame, stack) => {\n setNavigationStack([...stack])\n setSelectedNode(null)\n options.on?.['context:exit']?.(frame, stack)\n },\n 'graph:ready': (graph) => {\n options.on?.['graph:ready']?.(graph)\n },\n },\n })\n\n engineRef.current = engine\n setNavigationStack([...engine.getNavigationStack()])\n\n return () => {\n engine.dispose()\n engineRef.current = null\n }\n }, [canvas, options.data])\n\n const setNodeState = useCallback((nodeId: string, state: NodeState) =>\n engineRef.current?.setNodeState(nodeId, state), [])\n\n const addEvidence = useCallback((nodeId: string, evidence: Evidence) =>\n engineRef.current?.addEvidence(nodeId, evidence), [])\n\n const removeEvidence = useCallback((nodeId: string, evidenceId: string) =>\n engineRef.current?.removeEvidence(nodeId, evidenceId), [])\n\n const updateTheme = useCallback((theme: ThemeInput) =>\n engineRef.current?.updateTheme(theme), [])\n\n const zoomIn = useCallback(() => engineRef.current?.zoomIn(), [])\n const zoomOut = useCallback(() => engineRef.current?.zoomOut(), [])\n const goBack = useCallback(() => engineRef.current?.goBack(), [])\n const getGraph = useCallback(() => engineRef.current?.getGraph() ?? options.data, [options.data])\n const enterContext = useCallback((nodeId: string) => engineRef.current?.enterContext(nodeId), [])\n const jumpToNavDepth = useCallback((targetLength: number) => engineRef.current?.jumpToNavDepth(targetLength), [])\n\n return {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack: navigationStack.length > 1,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n }\n}\n","import React, { forwardRef, useImperativeHandle, type CSSProperties } from 'react'\nimport type {\n SkillGraph,\n SkillNode,\n NodeState,\n Evidence,\n ThemeInput,\n LodThreshold,\n SkillTreeEvents,\n NavigationFrame,\n} from '@expertrees/core'\nimport { useExpertree } from './useExpertree.js'\n\nexport interface ExpertreeCanvasProps {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n initialContextNodeId?: string\n width?: string\n height?: string\n style?: CSSProperties\n className?: string\n on?: Partial<SkillTreeEvents>\n}\n\nexport interface ExpertreeCanvasHandle {\n setNodeState: (nodeId: string, state: NodeState) => void\n addEvidence: (nodeId: string, evidence: Evidence) => void\n removeEvidence: (nodeId: string, evidenceId: string) => void\n updateTheme: (theme: ThemeInput) => void\n zoomIn: () => void\n zoomOut: () => void\n goBack: () => void\n enterContext: (nodeId: string) => void\n jumpToNavDepth: (targetLength: number) => void\n getGraph: () => SkillGraph\n hoveredNode: SkillNode | null\n selectedNode: SkillNode | null\n zoom: number\n navigationStack: readonly NavigationFrame[]\n canGoBack: boolean\n}\n\nexport const ExpertreeCanvas = forwardRef<ExpertreeCanvasHandle, ExpertreeCanvasProps>(\n function ExpertreeCanvas(props, ref) {\n const {\n data, theme, lod, initialContextNodeId,\n width = '100%', height = '100%',\n style, className, on,\n } = props\n\n const api = useExpertree({\n data,\n ...(theme !== undefined && { theme }),\n ...(lod !== undefined && { lod }),\n ...(initialContextNodeId !== undefined && { initialContextNodeId }),\n ...(on !== undefined && { on }),\n })\n\n useImperativeHandle(ref, () => ({\n setNodeState: api.setNodeState,\n addEvidence: api.addEvidence,\n removeEvidence: api.removeEvidence,\n updateTheme: api.updateTheme,\n zoomIn: api.zoomIn,\n zoomOut: api.zoomOut,\n goBack: api.goBack,\n enterContext: api.enterContext,\n jumpToNavDepth: api.jumpToNavDepth,\n getGraph: api.getGraph,\n get hoveredNode() { return api.hoveredNode },\n get selectedNode() { return api.selectedNode },\n get zoom() { return api.zoom },\n get navigationStack() { return api.navigationStack },\n get canGoBack() { return api.canGoBack },\n }), [api])\n\n return (\n <canvas\n ref={api.canvasRef}\n style={{ width, height, display: 'block', ...style }}\n className={className}\n />\n )\n }\n)\n"],"names":["useExpertree","options","engineRef","useRef","canvas","setCanvas","useState","hoveredNode","setHoveredNode","selectedNode","setSelectedNode","zoom","setZoom","navigationStack","setNavigationStack","canvasRef","useCallback","el","useEffect","_a","engine","SkillTreeEngine","node","_b","prev","z","stack","frame","graph","setNodeState","nodeId","state","addEvidence","evidence","removeEvidence","evidenceId","updateTheme","theme","zoomIn","zoomOut","goBack","getGraph","enterContext","jumpToNavDepth","targetLength","ExpertreeCanvas","forwardRef","props","ref","data","lod","initialContextNodeId","width","height","style","className","on","api","useImperativeHandle","jsx"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { CSSProperties } from 'react';
|
|
2
|
+
import { default as default_2 } from 'react';
|
|
3
|
+
import { Evidence } from '@expertrees/core';
|
|
4
|
+
import { LodThreshold } from '@expertrees/core';
|
|
5
|
+
import { NavigationFrame } from '@expertrees/core';
|
|
6
|
+
import { NodeState } from '@expertrees/core';
|
|
7
|
+
import { SkillGraph } from '@expertrees/core';
|
|
8
|
+
import { SkillNode } from '@expertrees/core';
|
|
9
|
+
import { SkillTreeEvents } from '@expertrees/core';
|
|
10
|
+
import { ThemeInput } from '@expertrees/core';
|
|
11
|
+
|
|
12
|
+
export declare const ExpertreeCanvas: default_2.ForwardRefExoticComponent<ExpertreeCanvasProps & default_2.RefAttributes<ExpertreeCanvasHandle>>;
|
|
13
|
+
|
|
14
|
+
export declare interface ExpertreeCanvasHandle {
|
|
15
|
+
setNodeState: (nodeId: string, state: NodeState) => void;
|
|
16
|
+
addEvidence: (nodeId: string, evidence: Evidence) => void;
|
|
17
|
+
removeEvidence: (nodeId: string, evidenceId: string) => void;
|
|
18
|
+
updateTheme: (theme: ThemeInput) => void;
|
|
19
|
+
zoomIn: () => void;
|
|
20
|
+
zoomOut: () => void;
|
|
21
|
+
goBack: () => void;
|
|
22
|
+
enterContext: (nodeId: string) => void;
|
|
23
|
+
jumpToNavDepth: (targetLength: number) => void;
|
|
24
|
+
getGraph: () => SkillGraph;
|
|
25
|
+
hoveredNode: SkillNode | null;
|
|
26
|
+
selectedNode: SkillNode | null;
|
|
27
|
+
zoom: number;
|
|
28
|
+
navigationStack: readonly NavigationFrame[];
|
|
29
|
+
canGoBack: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export declare interface ExpertreeCanvasProps {
|
|
33
|
+
data: SkillGraph;
|
|
34
|
+
theme?: ThemeInput;
|
|
35
|
+
lod?: LodThreshold[];
|
|
36
|
+
initialContextNodeId?: string;
|
|
37
|
+
width?: string;
|
|
38
|
+
height?: string;
|
|
39
|
+
style?: CSSProperties;
|
|
40
|
+
className?: string;
|
|
41
|
+
on?: Partial<SkillTreeEvents>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export declare function useExpertree(options: UseExpertreeOptions): UseExpertreeReturn;
|
|
45
|
+
|
|
46
|
+
export declare interface UseExpertreeOptions {
|
|
47
|
+
data: SkillGraph;
|
|
48
|
+
theme?: ThemeInput;
|
|
49
|
+
lod?: LodThreshold[];
|
|
50
|
+
on?: Partial<SkillTreeEvents>;
|
|
51
|
+
initialContextNodeId?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export declare interface UseExpertreeReturn {
|
|
55
|
+
/** Attach to the <canvas> element via the ref callback */
|
|
56
|
+
canvasRef: (el: HTMLCanvasElement | null) => void;
|
|
57
|
+
/** Currently hovered node */
|
|
58
|
+
hoveredNode: SkillNode | null;
|
|
59
|
+
/** Currently selected node */
|
|
60
|
+
selectedNode: SkillNode | null;
|
|
61
|
+
/** Current zoom level */
|
|
62
|
+
zoom: number;
|
|
63
|
+
/** Current navigation stack — last entry is the active context */
|
|
64
|
+
navigationStack: readonly NavigationFrame[];
|
|
65
|
+
/** Whether the user can navigate back to a parent context */
|
|
66
|
+
canGoBack: boolean;
|
|
67
|
+
/** Navigate back to the parent context */
|
|
68
|
+
goBack: () => void;
|
|
69
|
+
/** Set a node's semantic state */
|
|
70
|
+
setNodeState: (nodeId: string, state: NodeState) => void;
|
|
71
|
+
/** Add evidence to a node */
|
|
72
|
+
addEvidence: (nodeId: string, evidence: Evidence) => void;
|
|
73
|
+
/** Remove evidence from a node */
|
|
74
|
+
removeEvidence: (nodeId: string, evidenceId: string) => void;
|
|
75
|
+
/** Update the visual theme */
|
|
76
|
+
updateTheme: (theme: ThemeInput) => void;
|
|
77
|
+
/** Programmatic zoom in */
|
|
78
|
+
zoomIn: () => void;
|
|
79
|
+
/** Programmatic zoom out */
|
|
80
|
+
zoomOut: () => void;
|
|
81
|
+
/** Get serialized graph state */
|
|
82
|
+
getGraph: () => SkillGraph;
|
|
83
|
+
/** Programmatically enter a bubble node's context */
|
|
84
|
+
enterContext: (nodeId: string) => void;
|
|
85
|
+
/** Atomically jump to a specific nav stack depth */
|
|
86
|
+
jumpToNavDepth: (targetLength: number) => void;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { }
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { jsx as R } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as D, useState as h, useCallback as u, useEffect as O, forwardRef as w, useImperativeHandle as p } from "react";
|
|
3
|
+
import { SkillTreeEngine as H } from "@expertrees/core";
|
|
4
|
+
function Z(a) {
|
|
5
|
+
const r = D(null), [s, k] = h(null), [g, v] = h(null), [N, i] = h(null), [f, E] = h(1), [x, m] = h([
|
|
6
|
+
{ nodeId: null, label: a.data.label }
|
|
7
|
+
]), c = u((n) => k(n), []);
|
|
8
|
+
O(() => {
|
|
9
|
+
var d;
|
|
10
|
+
if ((d = r.current) == null || d.dispose(), r.current = null, !s) return;
|
|
11
|
+
const n = new H({
|
|
12
|
+
canvas: s,
|
|
13
|
+
data: a.data,
|
|
14
|
+
...a.theme !== void 0 && { theme: a.theme },
|
|
15
|
+
...a.lod !== void 0 && { lod: a.lod },
|
|
16
|
+
...a.initialContextNodeId !== void 0 && { initialContextNodeId: a.initialContextNodeId },
|
|
17
|
+
on: {
|
|
18
|
+
...a.on,
|
|
19
|
+
"node:hover": (t) => {
|
|
20
|
+
var e, o;
|
|
21
|
+
v(t), (o = (e = a.on) == null ? void 0 : e["node:hover"]) == null || o.call(e, t);
|
|
22
|
+
},
|
|
23
|
+
"node:blur": (t) => {
|
|
24
|
+
var e, o;
|
|
25
|
+
v((l) => (l == null ? void 0 : l.id) === t.id ? null : l), (o = (e = a.on) == null ? void 0 : e["node:blur"]) == null || o.call(e, t);
|
|
26
|
+
},
|
|
27
|
+
"node:click": (t) => {
|
|
28
|
+
var e, o;
|
|
29
|
+
i((l) => (l == null ? void 0 : l.id) === t.id ? null : t), (o = (e = a.on) == null ? void 0 : e["node:click"]) == null || o.call(e, t);
|
|
30
|
+
},
|
|
31
|
+
"canvas:click": () => {
|
|
32
|
+
var t, e;
|
|
33
|
+
i(null), (e = (t = a.on) == null ? void 0 : t["canvas:click"]) == null || e.call(t);
|
|
34
|
+
},
|
|
35
|
+
"zoom:change": (t) => {
|
|
36
|
+
var e, o;
|
|
37
|
+
E(t), (o = (e = a.on) == null ? void 0 : e["zoom:change"]) == null || o.call(e, t);
|
|
38
|
+
},
|
|
39
|
+
"context:enter": (t, e) => {
|
|
40
|
+
var o, l;
|
|
41
|
+
m([...e]), i(null), (l = (o = a.on) == null ? void 0 : o["context:enter"]) == null || l.call(o, t, e);
|
|
42
|
+
},
|
|
43
|
+
"context:exit": (t, e) => {
|
|
44
|
+
var o, l;
|
|
45
|
+
m([...e]), i(null), (l = (o = a.on) == null ? void 0 : o["context:exit"]) == null || l.call(o, t, e);
|
|
46
|
+
},
|
|
47
|
+
"graph:ready": (t) => {
|
|
48
|
+
var e, o;
|
|
49
|
+
(o = (e = a.on) == null ? void 0 : e["graph:ready"]) == null || o.call(e, t);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return r.current = n, m([...n.getNavigationStack()]), () => {
|
|
54
|
+
n.dispose(), r.current = null;
|
|
55
|
+
};
|
|
56
|
+
}, [s, a.data]);
|
|
57
|
+
const z = u((n, d) => {
|
|
58
|
+
var t;
|
|
59
|
+
return (t = r.current) == null ? void 0 : t.setNodeState(n, d);
|
|
60
|
+
}, []), C = u((n, d) => {
|
|
61
|
+
var t;
|
|
62
|
+
return (t = r.current) == null ? void 0 : t.addEvidence(n, d);
|
|
63
|
+
}, []), S = u((n, d) => {
|
|
64
|
+
var t;
|
|
65
|
+
return (t = r.current) == null ? void 0 : t.removeEvidence(n, d);
|
|
66
|
+
}, []), I = u((n) => {
|
|
67
|
+
var d;
|
|
68
|
+
return (d = r.current) == null ? void 0 : d.updateTheme(n);
|
|
69
|
+
}, []), T = u(() => {
|
|
70
|
+
var n;
|
|
71
|
+
return (n = r.current) == null ? void 0 : n.zoomIn();
|
|
72
|
+
}, []), B = u(() => {
|
|
73
|
+
var n;
|
|
74
|
+
return (n = r.current) == null ? void 0 : n.zoomOut();
|
|
75
|
+
}, []), G = u(() => {
|
|
76
|
+
var n;
|
|
77
|
+
return (n = r.current) == null ? void 0 : n.goBack();
|
|
78
|
+
}, []), b = u(() => {
|
|
79
|
+
var n;
|
|
80
|
+
return ((n = r.current) == null ? void 0 : n.getGraph()) ?? a.data;
|
|
81
|
+
}, [a.data]), j = u((n) => {
|
|
82
|
+
var d;
|
|
83
|
+
return (d = r.current) == null ? void 0 : d.enterContext(n);
|
|
84
|
+
}, []), y = u((n) => {
|
|
85
|
+
var d;
|
|
86
|
+
return (d = r.current) == null ? void 0 : d.jumpToNavDepth(n);
|
|
87
|
+
}, []);
|
|
88
|
+
return {
|
|
89
|
+
canvasRef: c,
|
|
90
|
+
hoveredNode: g,
|
|
91
|
+
selectedNode: N,
|
|
92
|
+
zoom: f,
|
|
93
|
+
navigationStack: x,
|
|
94
|
+
canGoBack: x.length > 1,
|
|
95
|
+
goBack: G,
|
|
96
|
+
setNodeState: z,
|
|
97
|
+
addEvidence: C,
|
|
98
|
+
removeEvidence: S,
|
|
99
|
+
updateTheme: I,
|
|
100
|
+
zoomIn: T,
|
|
101
|
+
zoomOut: B,
|
|
102
|
+
getGraph: b,
|
|
103
|
+
enterContext: j,
|
|
104
|
+
jumpToNavDepth: y
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const J = w(
|
|
108
|
+
function(r, s) {
|
|
109
|
+
const {
|
|
110
|
+
data: k,
|
|
111
|
+
theme: g,
|
|
112
|
+
lod: v,
|
|
113
|
+
initialContextNodeId: N,
|
|
114
|
+
width: i = "100%",
|
|
115
|
+
height: f = "100%",
|
|
116
|
+
style: E,
|
|
117
|
+
className: x,
|
|
118
|
+
on: m
|
|
119
|
+
} = r, c = Z({
|
|
120
|
+
data: k,
|
|
121
|
+
...g !== void 0 && { theme: g },
|
|
122
|
+
...v !== void 0 && { lod: v },
|
|
123
|
+
...N !== void 0 && { initialContextNodeId: N },
|
|
124
|
+
...m !== void 0 && { on: m }
|
|
125
|
+
});
|
|
126
|
+
return p(s, () => ({
|
|
127
|
+
setNodeState: c.setNodeState,
|
|
128
|
+
addEvidence: c.addEvidence,
|
|
129
|
+
removeEvidence: c.removeEvidence,
|
|
130
|
+
updateTheme: c.updateTheme,
|
|
131
|
+
zoomIn: c.zoomIn,
|
|
132
|
+
zoomOut: c.zoomOut,
|
|
133
|
+
goBack: c.goBack,
|
|
134
|
+
enterContext: c.enterContext,
|
|
135
|
+
jumpToNavDepth: c.jumpToNavDepth,
|
|
136
|
+
getGraph: c.getGraph,
|
|
137
|
+
get hoveredNode() {
|
|
138
|
+
return c.hoveredNode;
|
|
139
|
+
},
|
|
140
|
+
get selectedNode() {
|
|
141
|
+
return c.selectedNode;
|
|
142
|
+
},
|
|
143
|
+
get zoom() {
|
|
144
|
+
return c.zoom;
|
|
145
|
+
},
|
|
146
|
+
get navigationStack() {
|
|
147
|
+
return c.navigationStack;
|
|
148
|
+
},
|
|
149
|
+
get canGoBack() {
|
|
150
|
+
return c.canGoBack;
|
|
151
|
+
}
|
|
152
|
+
}), [c]), /* @__PURE__ */ R(
|
|
153
|
+
"canvas",
|
|
154
|
+
{
|
|
155
|
+
ref: c.canvasRef,
|
|
156
|
+
style: { width: i, height: f, display: "block", ...E },
|
|
157
|
+
className: x
|
|
158
|
+
}
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
export {
|
|
163
|
+
J as ExpertreeCanvas,
|
|
164
|
+
Z as useExpertree
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/useExpertree.ts","../src/ExpertreeCanvas.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useRef } from 'react'\nimport {\n SkillTreeEngine,\n type SkillGraph,\n type SkillNode,\n type NodeState,\n type Evidence,\n type ThemeInput,\n type LodThreshold,\n type SkillTreeEvents,\n type NavigationFrame,\n} from '@expertrees/core'\n\nexport interface UseExpertreeOptions {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n on?: Partial<SkillTreeEvents>\n initialContextNodeId?: string\n}\n\nexport interface UseExpertreeReturn {\n /** Attach to the <canvas> element via the ref callback */\n canvasRef: (el: HTMLCanvasElement | null) => void\n /** Currently hovered node */\n hoveredNode: SkillNode | null\n /** Currently selected node */\n selectedNode: SkillNode | null\n /** Current zoom level */\n zoom: number\n /** Current navigation stack — last entry is the active context */\n navigationStack: readonly NavigationFrame[]\n /** Whether the user can navigate back to a parent context */\n canGoBack: boolean\n /** Navigate back to the parent context */\n goBack: () => void\n /** Set a node's semantic state */\n setNodeState: (nodeId: string, state: NodeState) => void\n /** Add evidence to a node */\n addEvidence: (nodeId: string, evidence: Evidence) => void\n /** Remove evidence from a node */\n removeEvidence: (nodeId: string, evidenceId: string) => void\n /** Update the visual theme */\n updateTheme: (theme: ThemeInput) => void\n /** Programmatic zoom in */\n zoomIn: () => void\n /** Programmatic zoom out */\n zoomOut: () => void\n /** Get serialized graph state */\n getGraph: () => SkillGraph\n /** Programmatically enter a bubble node's context */\n enterContext: (nodeId: string) => void\n /** Atomically jump to a specific nav stack depth */\n jumpToNavDepth: (targetLength: number) => void\n}\n\nexport function useExpertree(options: UseExpertreeOptions): UseExpertreeReturn {\n const engineRef = useRef<SkillTreeEngine | null>(null)\n const [canvas, setCanvas] = useState<HTMLCanvasElement | null>(null)\n const [hoveredNode, setHoveredNode] = useState<SkillNode | null>(null)\n const [selectedNode, setSelectedNode] = useState<SkillNode | null>(null)\n const [zoom, setZoom] = useState(1)\n const [navigationStack, setNavigationStack] = useState<readonly NavigationFrame[]>([\n { nodeId: null, label: options.data.label },\n ])\n\n const canvasRef = useCallback((el: HTMLCanvasElement | null) => setCanvas(el), [])\n\n useEffect(() => {\n engineRef.current?.dispose()\n engineRef.current = null\n\n if (!canvas) return\n\n const engine = new SkillTreeEngine({\n canvas,\n data: options.data,\n ...(options.theme !== undefined && { theme: options.theme }),\n ...(options.lod !== undefined && { lod: options.lod }),\n ...(options.initialContextNodeId !== undefined && { initialContextNodeId: options.initialContextNodeId }),\n on: {\n ...options.on,\n 'node:hover': (node) => {\n setHoveredNode(node)\n options.on?.['node:hover']?.(node)\n },\n 'node:blur': (node) => {\n setHoveredNode(prev => prev?.id === node.id ? null : prev)\n options.on?.['node:blur']?.(node)\n },\n 'node:click': (node) => {\n setSelectedNode(prev => prev?.id === node.id ? null : node)\n options.on?.['node:click']?.(node)\n },\n 'canvas:click': () => {\n setSelectedNode(null)\n options.on?.['canvas:click']?.()\n },\n 'zoom:change': (z) => {\n setZoom(z)\n options.on?.['zoom:change']?.(z)\n },\n 'context:enter': (node, stack) => {\n setNavigationStack([...stack])\n setSelectedNode(null)\n options.on?.['context:enter']?.(node, stack)\n },\n 'context:exit': (frame, stack) => {\n setNavigationStack([...stack])\n setSelectedNode(null)\n options.on?.['context:exit']?.(frame, stack)\n },\n 'graph:ready': (graph) => {\n options.on?.['graph:ready']?.(graph)\n },\n },\n })\n\n engineRef.current = engine\n setNavigationStack([...engine.getNavigationStack()])\n\n return () => {\n engine.dispose()\n engineRef.current = null\n }\n }, [canvas, options.data])\n\n const setNodeState = useCallback((nodeId: string, state: NodeState) =>\n engineRef.current?.setNodeState(nodeId, state), [])\n\n const addEvidence = useCallback((nodeId: string, evidence: Evidence) =>\n engineRef.current?.addEvidence(nodeId, evidence), [])\n\n const removeEvidence = useCallback((nodeId: string, evidenceId: string) =>\n engineRef.current?.removeEvidence(nodeId, evidenceId), [])\n\n const updateTheme = useCallback((theme: ThemeInput) =>\n engineRef.current?.updateTheme(theme), [])\n\n const zoomIn = useCallback(() => engineRef.current?.zoomIn(), [])\n const zoomOut = useCallback(() => engineRef.current?.zoomOut(), [])\n const goBack = useCallback(() => engineRef.current?.goBack(), [])\n const getGraph = useCallback(() => engineRef.current?.getGraph() ?? options.data, [options.data])\n const enterContext = useCallback((nodeId: string) => engineRef.current?.enterContext(nodeId), [])\n const jumpToNavDepth = useCallback((targetLength: number) => engineRef.current?.jumpToNavDepth(targetLength), [])\n\n return {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack: navigationStack.length > 1,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n }\n}\n","import React, { forwardRef, useImperativeHandle, type CSSProperties } from 'react'\nimport type {\n SkillGraph,\n SkillNode,\n NodeState,\n Evidence,\n ThemeInput,\n LodThreshold,\n SkillTreeEvents,\n NavigationFrame,\n} from '@expertrees/core'\nimport { useExpertree } from './useExpertree.js'\n\nexport interface ExpertreeCanvasProps {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n initialContextNodeId?: string\n width?: string\n height?: string\n style?: CSSProperties\n className?: string\n on?: Partial<SkillTreeEvents>\n}\n\nexport interface ExpertreeCanvasHandle {\n setNodeState: (nodeId: string, state: NodeState) => void\n addEvidence: (nodeId: string, evidence: Evidence) => void\n removeEvidence: (nodeId: string, evidenceId: string) => void\n updateTheme: (theme: ThemeInput) => void\n zoomIn: () => void\n zoomOut: () => void\n goBack: () => void\n enterContext: (nodeId: string) => void\n jumpToNavDepth: (targetLength: number) => void\n getGraph: () => SkillGraph\n hoveredNode: SkillNode | null\n selectedNode: SkillNode | null\n zoom: number\n navigationStack: readonly NavigationFrame[]\n canGoBack: boolean\n}\n\nexport const ExpertreeCanvas = forwardRef<ExpertreeCanvasHandle, ExpertreeCanvasProps>(\n function ExpertreeCanvas(props, ref) {\n const {\n data, theme, lod, initialContextNodeId,\n width = '100%', height = '100%',\n style, className, on,\n } = props\n\n const api = useExpertree({\n data,\n ...(theme !== undefined && { theme }),\n ...(lod !== undefined && { lod }),\n ...(initialContextNodeId !== undefined && { initialContextNodeId }),\n ...(on !== undefined && { on }),\n })\n\n useImperativeHandle(ref, () => ({\n setNodeState: api.setNodeState,\n addEvidence: api.addEvidence,\n removeEvidence: api.removeEvidence,\n updateTheme: api.updateTheme,\n zoomIn: api.zoomIn,\n zoomOut: api.zoomOut,\n goBack: api.goBack,\n enterContext: api.enterContext,\n jumpToNavDepth: api.jumpToNavDepth,\n getGraph: api.getGraph,\n get hoveredNode() { return api.hoveredNode },\n get selectedNode() { return api.selectedNode },\n get zoom() { return api.zoom },\n get navigationStack() { return api.navigationStack },\n get canGoBack() { return api.canGoBack },\n }), [api])\n\n return (\n <canvas\n ref={api.canvasRef}\n style={{ width, height, display: 'block', ...style }}\n className={className}\n />\n )\n }\n)\n"],"names":["useExpertree","options","engineRef","useRef","canvas","setCanvas","useState","hoveredNode","setHoveredNode","selectedNode","setSelectedNode","zoom","setZoom","navigationStack","setNavigationStack","canvasRef","useCallback","el","useEffect","_a","engine","SkillTreeEngine","node","_b","prev","z","stack","frame","graph","setNodeState","nodeId","state","addEvidence","evidence","removeEvidence","evidenceId","updateTheme","theme","zoomIn","zoomOut","goBack","getGraph","enterContext","jumpToNavDepth","targetLength","ExpertreeCanvas","forwardRef","props","ref","data","lod","initialContextNodeId","width","height","style","className","on","api","useImperativeHandle","jsx"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@expertrees/react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React hook and component for @expertrees/core",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.cjs",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": ["dist"],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"keywords": ["knowledge-graph", "skill-tree", "react", "visualization"],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "vite build",
|
|
24
|
+
"dev": "vite build --watch",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"clean": "rm -rf dist"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@expertrees/core": "*"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/react": "^18.3.0",
|
|
36
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
37
|
+
"react": "^18.3.0",
|
|
38
|
+
"vite": "^6.0.7",
|
|
39
|
+
"vite-plugin-dts": "^4.4.0"
|
|
40
|
+
}
|
|
41
|
+
}
|