@expertrees/vue 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 +108 -0
- package/dist/index.js +179 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("vue"),I=require("@expertrees/core");function C(a){const h=r.ref(null),c=r.shallowRef(null),i=r.ref(null),u=r.ref(null),m=r.ref(1),v=r.ref([{nodeId:null,label:a.data.label}]),s=r.computed(()=>v.value.length>1);return r.watch([h,()=>a.data],([o])=>{var l;(l=c.value)==null||l.dispose(),c.value=null,o&&(c.value=new I.SkillTreeEngine({canvas:o,data:a.data,...a.theme!==void 0&&{theme:a.theme},...a.lod!==void 0&&{lod:a.lod},...a.initialContextNodeId!==void 0&&{initialContextNodeId:a.initialContextNodeId},on:{...a.on,"node:hover":t=>{var n,e;i.value=t,(e=(n=a.on)==null?void 0:n["node:hover"])==null||e.call(n,t)},"node:blur":t=>{var n,e,d;((n=i.value)==null?void 0:n.id)===t.id&&(i.value=null),(d=(e=a.on)==null?void 0:e["node:blur"])==null||d.call(e,t)},"node:click":t=>{var n,e,d;u.value=((n=u.value)==null?void 0:n.id)===t.id?null:t,(d=(e=a.on)==null?void 0:e["node:click"])==null||d.call(e,t)},"canvas:click":()=>{var t,n;u.value=null,(n=(t=a.on)==null?void 0:t["canvas:click"])==null||n.call(t)},"zoom:change":t=>{var n,e;m.value=t,(e=(n=a.on)==null?void 0:n["zoom:change"])==null||e.call(n,t)},"context:enter":(t,n)=>{var e,d;v.value=n,u.value=null,(d=(e=a.on)==null?void 0:e["context:enter"])==null||d.call(e,t,n)},"context:exit":(t,n)=>{var e,d;v.value=n,u.value=null,(d=(e=a.on)==null?void 0:e["context:exit"])==null||d.call(e,t,n)},"graph:ready":t=>{var n,e;(e=(n=a.on)==null?void 0:n["graph:ready"])==null||e.call(n,t)}}}),v.value=c.value.getNavigationStack())}),r.onUnmounted(()=>{var o;(o=c.value)==null||o.dispose()}),{canvasRef:h,hoveredNode:i,selectedNode:u,zoom:m,navigationStack:v,canGoBack:s,goBack:()=>{var o;return(o=c.value)==null?void 0:o.goBack()},setNodeState:(o,l)=>{var t;return(t=c.value)==null?void 0:t.setNodeState(o,l)},addEvidence:(o,l)=>{var t;return(t=c.value)==null?void 0:t.addEvidence(o,l)},removeEvidence:(o,l)=>{var t;return(t=c.value)==null?void 0:t.removeEvidence(o,l)},updateTheme:o=>{var l;return(l=c.value)==null?void 0:l.updateTheme(o)},zoomIn:()=>{var o;return(o=c.value)==null?void 0:o.zoomIn()},zoomOut:()=>{var o;return(o=c.value)==null?void 0:o.zoomOut()},getGraph:()=>{var o;return((o=c.value)==null?void 0:o.getGraph())??a.data},enterContext:o=>{var l;return(l=c.value)==null?void 0:l.enterContext(o)},jumpToNavDepth:o=>{var l;return(l=c.value)==null?void 0:l.jumpToNavDepth(o)}}}const b=r.defineComponent({__name:"SkillTree",props:{data:{},theme:{},lod:{},width:{},height:{},initialContextNodeId:{}},emits:["node:click","node:hover","node:blur","canvas:click","zoom:change","context:enter","context:exit","graph:ready"],setup(a,{expose:h,emit:c}){const i=a,u=c,{canvasRef:m,hoveredNode:v,selectedNode:s,zoom:g,navigationStack:x,canGoBack:k,goBack:N,setNodeState:f,addEvidence:p,removeEvidence:S,updateTheme:z,zoomIn:T,zoomOut:y,getGraph:o,enterContext:l,jumpToNavDepth:t}=C({data:i.data,...i.theme!==void 0&&{theme:i.theme},...i.lod!==void 0&&{lod:i.lod},...i.initialContextNodeId!==void 0&&{initialContextNodeId:i.initialContextNodeId},on:{"node:click":e=>u("node:click",e),"node:hover":e=>u("node:hover",e),"node:blur":e=>u("node:blur",e),"canvas:click":()=>u("canvas:click"),"zoom:change":e=>u("zoom:change",e),"context:enter":(e,d)=>u("context:enter",e,d),"context:exit":(e,d)=>u("context:exit",e,d),"graph:ready":e=>u("graph:ready",e)}});h({setNodeState:f,addEvidence:p,removeEvidence:S,updateTheme:z,zoomIn:T,zoomOut:y,goBack:N,enterContext:l,jumpToNavDepth:t,getGraph:o,hoveredNode:v,selectedNode:s,zoom:g,navigationStack:x,canGoBack:k});const n=r.computed(()=>({width:i.width??"100%",height:i.height??"100%",display:"block"}));return(e,d)=>(r.openBlock(),r.createElementBlock("canvas",{ref_key:"canvasRef",ref:m,style:r.normalizeStyle(n.value)},null,4))}});exports.SkillTree=b;exports.useSkillTree=C;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/useSkillTree.ts","../src/SkillTree.vue"],"sourcesContent":["import { ref, computed, shallowRef, onUnmounted, watch, type Ref, type ComputedRef } from 'vue'\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 UseSkillTreeOptions {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n on?: Partial<SkillTreeEvents>\n initialContextNodeId?: string\n}\n\nexport interface UseSkillTreeReturn {\n /** Attach this ref to the <canvas> element */\n canvasRef: Ref<HTMLCanvasElement | null>\n /** Currently hovered node */\n hoveredNode: Ref<SkillNode | null>\n /** Currently selected node */\n selectedNode: Ref<SkillNode | null>\n /** Current zoom level */\n zoom: Ref<number>\n /** Current navigation stack — last entry is the active context */\n navigationStack: Ref<readonly NavigationFrame[]>\n /** Whether the user can navigate back to a parent context */\n canGoBack: ComputedRef<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 (triggers burst + zoom) */\n enterContext: (nodeId: string) => void\n /** Atomically jump to a specific nav stack depth (single animation, no race conditions) */\n jumpToNavDepth: (targetLength: number) => void\n}\n\nexport function useSkillTree(options: UseSkillTreeOptions): UseSkillTreeReturn {\n const canvasRef = ref<HTMLCanvasElement | null>(null)\n const engine = shallowRef<SkillTreeEngine | null>(null)\n\n const hoveredNode = ref<SkillNode | null>(null)\n const selectedNode = ref<SkillNode | null>(null)\n const zoom = ref(1)\n const navigationStack = ref<readonly NavigationFrame[]>([{ nodeId: null, label: options.data.label }])\n const canGoBack = computed(() => navigationStack.value.length > 1)\n\n watch([canvasRef, () => options.data], ([canvas]) => {\n engine.value?.dispose()\n engine.value = null\n\n if (!canvas) return\n\n engine.value = 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 hoveredNode.value = node\n options.on?.['node:hover']?.(node)\n },\n 'node:blur': (node) => {\n if (hoveredNode.value?.id === node.id) hoveredNode.value = null\n options.on?.['node:blur']?.(node)\n },\n 'node:click': (node) => {\n selectedNode.value = selectedNode.value?.id === node.id ? null : node\n options.on?.['node:click']?.(node)\n },\n 'canvas:click': () => {\n selectedNode.value = null\n options.on?.['canvas:click']?.()\n },\n 'zoom:change': (z) => {\n zoom.value = z\n options.on?.['zoom:change']?.(z)\n },\n 'context:enter': (node, stack) => {\n navigationStack.value = stack\n selectedNode.value = null\n options.on?.['context:enter']?.(node, stack)\n },\n 'context:exit': (frame, stack) => {\n navigationStack.value = stack\n selectedNode.value = null\n options.on?.['context:exit']?.(frame, stack)\n },\n 'graph:ready': (graph) => {\n options.on?.['graph:ready']?.(graph)\n },\n },\n })\n\n // Sync stack to reflect any silent initial context (e.g. initialContextNodeId)\n navigationStack.value = engine.value.getNavigationStack()\n })\n\n onUnmounted(() => {\n engine.value?.dispose()\n })\n\n const setNodeState = (nodeId: string, state: NodeState) =>\n engine.value?.setNodeState(nodeId, state)\n\n const addEvidence = (nodeId: string, evidence: Evidence) =>\n engine.value?.addEvidence(nodeId, evidence)\n\n const removeEvidence = (nodeId: string, evidenceId: string) =>\n engine.value?.removeEvidence(nodeId, evidenceId)\n\n const updateTheme = (theme: ThemeInput) =>\n engine.value?.updateTheme(theme)\n\n const zoomIn = () => engine.value?.zoomIn()\n const zoomOut = () => engine.value?.zoomOut()\n const goBack = () => engine.value?.goBack()\n const getGraph = () => engine.value?.getGraph() ?? options.data\n const enterContext = (nodeId: string) => engine.value?.enterContext(nodeId)\n const jumpToNavDepth = (targetLength: number) => engine.value?.jumpToNavDepth(targetLength)\n\n return {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n }\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type {\n SkillGraph,\n SkillNode,\n NodeState,\n ThemeInput,\n LodThreshold,\n SkillTreeEvents,\n NavigationFrame,\n} from '@expertrees/core'\nimport { useSkillTree } from './useSkillTree.js'\n\nconst props = defineProps<{\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n width?: string\n height?: string\n initialContextNodeId?: string\n}>()\n\nconst emit = defineEmits<{\n 'node:click': [node: SkillNode]\n 'node:hover': [node: SkillNode]\n 'node:blur': [node: SkillNode]\n 'canvas:click': []\n 'zoom:change': [zoom: number]\n 'context:enter': [node: SkillNode, stack: readonly NavigationFrame[]]\n 'context:exit': [frame: NavigationFrame, stack: readonly NavigationFrame[]]\n 'graph:ready': [graph: SkillGraph]\n}>()\n\nconst {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n} = useSkillTree({\n data: props.data,\n ...(props.theme !== undefined && { theme: props.theme }),\n ...(props.lod !== undefined && { lod: props.lod }),\n ...(props.initialContextNodeId !== undefined && { initialContextNodeId: props.initialContextNodeId }),\n on: {\n 'node:click': (node) => emit('node:click', node),\n 'node:hover': (node) => emit('node:hover', node),\n 'node:blur': (node) => emit('node:blur', node),\n 'canvas:click': () => emit('canvas:click'),\n 'zoom:change': (z) => emit('zoom:change', z),\n 'context:enter': (node, stack) => emit('context:enter', node, stack),\n 'context:exit': (frame, stack) => emit('context:exit', frame, stack),\n 'graph:ready': (graph) => emit('graph:ready', graph),\n },\n})\n\n// Expose imperative API to parent via template ref\ndefineExpose({\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n goBack,\n enterContext,\n jumpToNavDepth,\n getGraph,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n})\n\nconst canvasStyle = computed(() => ({\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n display: 'block',\n}))\n</script>\n\n<template>\n <canvas ref=\"canvasRef\" :style=\"canvasStyle\" />\n</template>\n"],"names":["useSkillTree","options","canvasRef","ref","engine","shallowRef","hoveredNode","selectedNode","zoom","navigationStack","canGoBack","computed","watch","canvas","_a","SkillTreeEngine","node","_b","_c","z","stack","frame","graph","onUnmounted","nodeId","state","evidence","evidenceId","theme","targetLength","props","__props","emit","__emit","goBack","setNodeState","addEvidence","removeEvidence","updateTheme","zoomIn","zoomOut","getGraph","enterContext","jumpToNavDepth","__expose","canvasStyle","_createElementBlock"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ComponentOptionsMixin } from 'vue';
|
|
2
|
+
import { ComponentProvideOptions } from 'vue';
|
|
3
|
+
import { ComputedRef } from 'vue';
|
|
4
|
+
import { DefineComponent } from 'vue';
|
|
5
|
+
import { Evidence } from '@expertrees/core';
|
|
6
|
+
import { LodThreshold } from '@expertrees/core';
|
|
7
|
+
import { NavigationFrame } from '@expertrees/core';
|
|
8
|
+
import { NodeState } from '@expertrees/core';
|
|
9
|
+
import { PublicProps } from 'vue';
|
|
10
|
+
import { Ref } from 'vue';
|
|
11
|
+
import { SkillGraph } from '@expertrees/core';
|
|
12
|
+
import { SkillNode } from '@expertrees/core';
|
|
13
|
+
import { SkillTreeEvents } from '@expertrees/core';
|
|
14
|
+
import { ThemeInput } from '@expertrees/core';
|
|
15
|
+
|
|
16
|
+
declare type __VLS_Props = {
|
|
17
|
+
data: SkillGraph;
|
|
18
|
+
theme?: ThemeInput;
|
|
19
|
+
lod?: LodThreshold[];
|
|
20
|
+
width?: string;
|
|
21
|
+
height?: string;
|
|
22
|
+
initialContextNodeId?: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export declare const SkillTree: DefineComponent<__VLS_Props, {
|
|
26
|
+
setNodeState: (nodeId: string, state: NodeState) => void;
|
|
27
|
+
addEvidence: (nodeId: string, evidence: Evidence) => void;
|
|
28
|
+
removeEvidence: (nodeId: string, evidenceId: string) => void;
|
|
29
|
+
updateTheme: (theme: ThemeInput) => void;
|
|
30
|
+
zoomIn: () => void;
|
|
31
|
+
zoomOut: () => void;
|
|
32
|
+
goBack: () => void;
|
|
33
|
+
enterContext: (nodeId: string) => void;
|
|
34
|
+
jumpToNavDepth: (targetLength: number) => void;
|
|
35
|
+
getGraph: () => SkillGraph;
|
|
36
|
+
hoveredNode: Ref<SkillNode | null, SkillNode | null>;
|
|
37
|
+
selectedNode: Ref<SkillNode | null, SkillNode | null>;
|
|
38
|
+
zoom: Ref<number, number>;
|
|
39
|
+
navigationStack: Ref<readonly NavigationFrame[], readonly NavigationFrame[]>;
|
|
40
|
+
canGoBack: ComputedRef<boolean>;
|
|
41
|
+
}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
|
|
42
|
+
"node:click": (node: SkillNode) => any;
|
|
43
|
+
"node:hover": (node: SkillNode) => any;
|
|
44
|
+
"node:blur": (node: SkillNode) => any;
|
|
45
|
+
"canvas:click": () => any;
|
|
46
|
+
"zoom:change": (zoom: number) => any;
|
|
47
|
+
"context:enter": (node: SkillNode, stack: readonly NavigationFrame[]) => any;
|
|
48
|
+
"context:exit": (frame: NavigationFrame, stack: readonly NavigationFrame[]) => any;
|
|
49
|
+
"graph:ready": (graph: SkillGraph) => any;
|
|
50
|
+
}, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
51
|
+
"onNode:click"?: (node: SkillNode) => any;
|
|
52
|
+
"onNode:hover"?: (node: SkillNode) => any;
|
|
53
|
+
"onNode:blur"?: (node: SkillNode) => any;
|
|
54
|
+
"onCanvas:click"?: () => any;
|
|
55
|
+
"onZoom:change"?: (zoom: number) => any;
|
|
56
|
+
"onContext:enter"?: (node: SkillNode, stack: readonly NavigationFrame[]) => any;
|
|
57
|
+
"onContext:exit"?: (frame: NavigationFrame, stack: readonly NavigationFrame[]) => any;
|
|
58
|
+
"onGraph:ready"?: (graph: SkillGraph) => any;
|
|
59
|
+
}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {
|
|
60
|
+
canvasRef: HTMLCanvasElement;
|
|
61
|
+
}, HTMLCanvasElement>;
|
|
62
|
+
|
|
63
|
+
export declare function useSkillTree(options: UseSkillTreeOptions): UseSkillTreeReturn;
|
|
64
|
+
|
|
65
|
+
export declare interface UseSkillTreeOptions {
|
|
66
|
+
data: SkillGraph;
|
|
67
|
+
theme?: ThemeInput;
|
|
68
|
+
lod?: LodThreshold[];
|
|
69
|
+
on?: Partial<SkillTreeEvents>;
|
|
70
|
+
initialContextNodeId?: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export declare interface UseSkillTreeReturn {
|
|
74
|
+
/** Attach this ref to the <canvas> element */
|
|
75
|
+
canvasRef: Ref<HTMLCanvasElement | null>;
|
|
76
|
+
/** Currently hovered node */
|
|
77
|
+
hoveredNode: Ref<SkillNode | null>;
|
|
78
|
+
/** Currently selected node */
|
|
79
|
+
selectedNode: Ref<SkillNode | null>;
|
|
80
|
+
/** Current zoom level */
|
|
81
|
+
zoom: Ref<number>;
|
|
82
|
+
/** Current navigation stack — last entry is the active context */
|
|
83
|
+
navigationStack: Ref<readonly NavigationFrame[]>;
|
|
84
|
+
/** Whether the user can navigate back to a parent context */
|
|
85
|
+
canGoBack: ComputedRef<boolean>;
|
|
86
|
+
/** Navigate back to the parent context */
|
|
87
|
+
goBack: () => void;
|
|
88
|
+
/** Set a node's semantic state */
|
|
89
|
+
setNodeState: (nodeId: string, state: NodeState) => void;
|
|
90
|
+
/** Add evidence to a node */
|
|
91
|
+
addEvidence: (nodeId: string, evidence: Evidence) => void;
|
|
92
|
+
/** Remove evidence from a node */
|
|
93
|
+
removeEvidence: (nodeId: string, evidenceId: string) => void;
|
|
94
|
+
/** Update the visual theme */
|
|
95
|
+
updateTheme: (theme: ThemeInput) => void;
|
|
96
|
+
/** Programmatic zoom in */
|
|
97
|
+
zoomIn: () => void;
|
|
98
|
+
/** Programmatic zoom out */
|
|
99
|
+
zoomOut: () => void;
|
|
100
|
+
/** Get serialized graph state */
|
|
101
|
+
getGraph: () => SkillGraph;
|
|
102
|
+
/** Programmatically enter a bubble node's context (triggers burst + zoom) */
|
|
103
|
+
enterContext: (nodeId: string) => void;
|
|
104
|
+
/** Atomically jump to a specific nav stack depth (single animation, no race conditions) */
|
|
105
|
+
jumpToNavDepth: (targetLength: number) => void;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { }
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { ref as r, shallowRef as y, computed as T, watch as E, onUnmounted as b, defineComponent as B, openBlock as _, createElementBlock as w, normalizeStyle as G } from "vue";
|
|
2
|
+
import { SkillTreeEngine as j } from "@expertrees/core";
|
|
3
|
+
function D(a) {
|
|
4
|
+
const h = r(null), d = y(null), i = r(null), v = r(null), m = r(1), u = r([{ nodeId: null, label: a.data.label }]), s = T(() => u.value.length > 1);
|
|
5
|
+
return E([h, () => a.data], ([o]) => {
|
|
6
|
+
var l;
|
|
7
|
+
(l = d.value) == null || l.dispose(), d.value = null, o && (d.value = new j({
|
|
8
|
+
canvas: o,
|
|
9
|
+
data: a.data,
|
|
10
|
+
...a.theme !== void 0 && { theme: a.theme },
|
|
11
|
+
...a.lod !== void 0 && { lod: a.lod },
|
|
12
|
+
...a.initialContextNodeId !== void 0 && { initialContextNodeId: a.initialContextNodeId },
|
|
13
|
+
on: {
|
|
14
|
+
...a.on,
|
|
15
|
+
"node:hover": (t) => {
|
|
16
|
+
var n, e;
|
|
17
|
+
i.value = t, (e = (n = a.on) == null ? void 0 : n["node:hover"]) == null || e.call(n, t);
|
|
18
|
+
},
|
|
19
|
+
"node:blur": (t) => {
|
|
20
|
+
var n, e, c;
|
|
21
|
+
((n = i.value) == null ? void 0 : n.id) === t.id && (i.value = null), (c = (e = a.on) == null ? void 0 : e["node:blur"]) == null || c.call(e, t);
|
|
22
|
+
},
|
|
23
|
+
"node:click": (t) => {
|
|
24
|
+
var n, e, c;
|
|
25
|
+
v.value = ((n = v.value) == null ? void 0 : n.id) === t.id ? null : t, (c = (e = a.on) == null ? void 0 : e["node:click"]) == null || c.call(e, t);
|
|
26
|
+
},
|
|
27
|
+
"canvas:click": () => {
|
|
28
|
+
var t, n;
|
|
29
|
+
v.value = null, (n = (t = a.on) == null ? void 0 : t["canvas:click"]) == null || n.call(t);
|
|
30
|
+
},
|
|
31
|
+
"zoom:change": (t) => {
|
|
32
|
+
var n, e;
|
|
33
|
+
m.value = t, (e = (n = a.on) == null ? void 0 : n["zoom:change"]) == null || e.call(n, t);
|
|
34
|
+
},
|
|
35
|
+
"context:enter": (t, n) => {
|
|
36
|
+
var e, c;
|
|
37
|
+
u.value = n, v.value = null, (c = (e = a.on) == null ? void 0 : e["context:enter"]) == null || c.call(e, t, n);
|
|
38
|
+
},
|
|
39
|
+
"context:exit": (t, n) => {
|
|
40
|
+
var e, c;
|
|
41
|
+
u.value = n, v.value = null, (c = (e = a.on) == null ? void 0 : e["context:exit"]) == null || c.call(e, t, n);
|
|
42
|
+
},
|
|
43
|
+
"graph:ready": (t) => {
|
|
44
|
+
var n, e;
|
|
45
|
+
(e = (n = a.on) == null ? void 0 : n["graph:ready"]) == null || e.call(n, t);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}), u.value = d.value.getNavigationStack());
|
|
49
|
+
}), b(() => {
|
|
50
|
+
var o;
|
|
51
|
+
(o = d.value) == null || o.dispose();
|
|
52
|
+
}), {
|
|
53
|
+
canvasRef: h,
|
|
54
|
+
hoveredNode: i,
|
|
55
|
+
selectedNode: v,
|
|
56
|
+
zoom: m,
|
|
57
|
+
navigationStack: u,
|
|
58
|
+
canGoBack: s,
|
|
59
|
+
goBack: () => {
|
|
60
|
+
var o;
|
|
61
|
+
return (o = d.value) == null ? void 0 : o.goBack();
|
|
62
|
+
},
|
|
63
|
+
setNodeState: (o, l) => {
|
|
64
|
+
var t;
|
|
65
|
+
return (t = d.value) == null ? void 0 : t.setNodeState(o, l);
|
|
66
|
+
},
|
|
67
|
+
addEvidence: (o, l) => {
|
|
68
|
+
var t;
|
|
69
|
+
return (t = d.value) == null ? void 0 : t.addEvidence(o, l);
|
|
70
|
+
},
|
|
71
|
+
removeEvidence: (o, l) => {
|
|
72
|
+
var t;
|
|
73
|
+
return (t = d.value) == null ? void 0 : t.removeEvidence(o, l);
|
|
74
|
+
},
|
|
75
|
+
updateTheme: (o) => {
|
|
76
|
+
var l;
|
|
77
|
+
return (l = d.value) == null ? void 0 : l.updateTheme(o);
|
|
78
|
+
},
|
|
79
|
+
zoomIn: () => {
|
|
80
|
+
var o;
|
|
81
|
+
return (o = d.value) == null ? void 0 : o.zoomIn();
|
|
82
|
+
},
|
|
83
|
+
zoomOut: () => {
|
|
84
|
+
var o;
|
|
85
|
+
return (o = d.value) == null ? void 0 : o.zoomOut();
|
|
86
|
+
},
|
|
87
|
+
getGraph: () => {
|
|
88
|
+
var o;
|
|
89
|
+
return ((o = d.value) == null ? void 0 : o.getGraph()) ?? a.data;
|
|
90
|
+
},
|
|
91
|
+
enterContext: (o) => {
|
|
92
|
+
var l;
|
|
93
|
+
return (l = d.value) == null ? void 0 : l.enterContext(o);
|
|
94
|
+
},
|
|
95
|
+
jumpToNavDepth: (o) => {
|
|
96
|
+
var l;
|
|
97
|
+
return (l = d.value) == null ? void 0 : l.jumpToNavDepth(o);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const U = /* @__PURE__ */ B({
|
|
102
|
+
__name: "SkillTree",
|
|
103
|
+
props: {
|
|
104
|
+
data: {},
|
|
105
|
+
theme: {},
|
|
106
|
+
lod: {},
|
|
107
|
+
width: {},
|
|
108
|
+
height: {},
|
|
109
|
+
initialContextNodeId: {}
|
|
110
|
+
},
|
|
111
|
+
emits: ["node:click", "node:hover", "node:blur", "canvas:click", "zoom:change", "context:enter", "context:exit", "graph:ready"],
|
|
112
|
+
setup(a, { expose: h, emit: d }) {
|
|
113
|
+
const i = a, v = d, {
|
|
114
|
+
canvasRef: m,
|
|
115
|
+
hoveredNode: u,
|
|
116
|
+
selectedNode: s,
|
|
117
|
+
zoom: x,
|
|
118
|
+
navigationStack: g,
|
|
119
|
+
canGoBack: k,
|
|
120
|
+
goBack: N,
|
|
121
|
+
setNodeState: p,
|
|
122
|
+
addEvidence: z,
|
|
123
|
+
removeEvidence: f,
|
|
124
|
+
updateTheme: S,
|
|
125
|
+
zoomIn: C,
|
|
126
|
+
zoomOut: I,
|
|
127
|
+
getGraph: o,
|
|
128
|
+
enterContext: l,
|
|
129
|
+
jumpToNavDepth: t
|
|
130
|
+
} = D({
|
|
131
|
+
data: i.data,
|
|
132
|
+
...i.theme !== void 0 && { theme: i.theme },
|
|
133
|
+
...i.lod !== void 0 && { lod: i.lod },
|
|
134
|
+
...i.initialContextNodeId !== void 0 && { initialContextNodeId: i.initialContextNodeId },
|
|
135
|
+
on: {
|
|
136
|
+
"node:click": (e) => v("node:click", e),
|
|
137
|
+
"node:hover": (e) => v("node:hover", e),
|
|
138
|
+
"node:blur": (e) => v("node:blur", e),
|
|
139
|
+
"canvas:click": () => v("canvas:click"),
|
|
140
|
+
"zoom:change": (e) => v("zoom:change", e),
|
|
141
|
+
"context:enter": (e, c) => v("context:enter", e, c),
|
|
142
|
+
"context:exit": (e, c) => v("context:exit", e, c),
|
|
143
|
+
"graph:ready": (e) => v("graph:ready", e)
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
h({
|
|
147
|
+
setNodeState: p,
|
|
148
|
+
addEvidence: z,
|
|
149
|
+
removeEvidence: f,
|
|
150
|
+
updateTheme: S,
|
|
151
|
+
zoomIn: C,
|
|
152
|
+
zoomOut: I,
|
|
153
|
+
goBack: N,
|
|
154
|
+
enterContext: l,
|
|
155
|
+
jumpToNavDepth: t,
|
|
156
|
+
getGraph: o,
|
|
157
|
+
hoveredNode: u,
|
|
158
|
+
selectedNode: s,
|
|
159
|
+
zoom: x,
|
|
160
|
+
navigationStack: g,
|
|
161
|
+
canGoBack: k
|
|
162
|
+
});
|
|
163
|
+
const n = T(() => ({
|
|
164
|
+
width: i.width ?? "100%",
|
|
165
|
+
height: i.height ?? "100%",
|
|
166
|
+
display: "block"
|
|
167
|
+
}));
|
|
168
|
+
return (e, c) => (_(), w("canvas", {
|
|
169
|
+
ref_key: "canvasRef",
|
|
170
|
+
ref: m,
|
|
171
|
+
style: G(n.value)
|
|
172
|
+
}, null, 4));
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
export {
|
|
176
|
+
U as SkillTree,
|
|
177
|
+
D as useSkillTree
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/useSkillTree.ts","../src/SkillTree.vue"],"sourcesContent":["import { ref, computed, shallowRef, onUnmounted, watch, type Ref, type ComputedRef } from 'vue'\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 UseSkillTreeOptions {\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n on?: Partial<SkillTreeEvents>\n initialContextNodeId?: string\n}\n\nexport interface UseSkillTreeReturn {\n /** Attach this ref to the <canvas> element */\n canvasRef: Ref<HTMLCanvasElement | null>\n /** Currently hovered node */\n hoveredNode: Ref<SkillNode | null>\n /** Currently selected node */\n selectedNode: Ref<SkillNode | null>\n /** Current zoom level */\n zoom: Ref<number>\n /** Current navigation stack — last entry is the active context */\n navigationStack: Ref<readonly NavigationFrame[]>\n /** Whether the user can navigate back to a parent context */\n canGoBack: ComputedRef<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 (triggers burst + zoom) */\n enterContext: (nodeId: string) => void\n /** Atomically jump to a specific nav stack depth (single animation, no race conditions) */\n jumpToNavDepth: (targetLength: number) => void\n}\n\nexport function useSkillTree(options: UseSkillTreeOptions): UseSkillTreeReturn {\n const canvasRef = ref<HTMLCanvasElement | null>(null)\n const engine = shallowRef<SkillTreeEngine | null>(null)\n\n const hoveredNode = ref<SkillNode | null>(null)\n const selectedNode = ref<SkillNode | null>(null)\n const zoom = ref(1)\n const navigationStack = ref<readonly NavigationFrame[]>([{ nodeId: null, label: options.data.label }])\n const canGoBack = computed(() => navigationStack.value.length > 1)\n\n watch([canvasRef, () => options.data], ([canvas]) => {\n engine.value?.dispose()\n engine.value = null\n\n if (!canvas) return\n\n engine.value = 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 hoveredNode.value = node\n options.on?.['node:hover']?.(node)\n },\n 'node:blur': (node) => {\n if (hoveredNode.value?.id === node.id) hoveredNode.value = null\n options.on?.['node:blur']?.(node)\n },\n 'node:click': (node) => {\n selectedNode.value = selectedNode.value?.id === node.id ? null : node\n options.on?.['node:click']?.(node)\n },\n 'canvas:click': () => {\n selectedNode.value = null\n options.on?.['canvas:click']?.()\n },\n 'zoom:change': (z) => {\n zoom.value = z\n options.on?.['zoom:change']?.(z)\n },\n 'context:enter': (node, stack) => {\n navigationStack.value = stack\n selectedNode.value = null\n options.on?.['context:enter']?.(node, stack)\n },\n 'context:exit': (frame, stack) => {\n navigationStack.value = stack\n selectedNode.value = null\n options.on?.['context:exit']?.(frame, stack)\n },\n 'graph:ready': (graph) => {\n options.on?.['graph:ready']?.(graph)\n },\n },\n })\n\n // Sync stack to reflect any silent initial context (e.g. initialContextNodeId)\n navigationStack.value = engine.value.getNavigationStack()\n })\n\n onUnmounted(() => {\n engine.value?.dispose()\n })\n\n const setNodeState = (nodeId: string, state: NodeState) =>\n engine.value?.setNodeState(nodeId, state)\n\n const addEvidence = (nodeId: string, evidence: Evidence) =>\n engine.value?.addEvidence(nodeId, evidence)\n\n const removeEvidence = (nodeId: string, evidenceId: string) =>\n engine.value?.removeEvidence(nodeId, evidenceId)\n\n const updateTheme = (theme: ThemeInput) =>\n engine.value?.updateTheme(theme)\n\n const zoomIn = () => engine.value?.zoomIn()\n const zoomOut = () => engine.value?.zoomOut()\n const goBack = () => engine.value?.goBack()\n const getGraph = () => engine.value?.getGraph() ?? options.data\n const enterContext = (nodeId: string) => engine.value?.enterContext(nodeId)\n const jumpToNavDepth = (targetLength: number) => engine.value?.jumpToNavDepth(targetLength)\n\n return {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n }\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type {\n SkillGraph,\n SkillNode,\n NodeState,\n ThemeInput,\n LodThreshold,\n SkillTreeEvents,\n NavigationFrame,\n} from '@expertrees/core'\nimport { useSkillTree } from './useSkillTree.js'\n\nconst props = defineProps<{\n data: SkillGraph\n theme?: ThemeInput\n lod?: LodThreshold[]\n width?: string\n height?: string\n initialContextNodeId?: string\n}>()\n\nconst emit = defineEmits<{\n 'node:click': [node: SkillNode]\n 'node:hover': [node: SkillNode]\n 'node:blur': [node: SkillNode]\n 'canvas:click': []\n 'zoom:change': [zoom: number]\n 'context:enter': [node: SkillNode, stack: readonly NavigationFrame[]]\n 'context:exit': [frame: NavigationFrame, stack: readonly NavigationFrame[]]\n 'graph:ready': [graph: SkillGraph]\n}>()\n\nconst {\n canvasRef,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n goBack,\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n getGraph,\n enterContext,\n jumpToNavDepth,\n} = useSkillTree({\n data: props.data,\n ...(props.theme !== undefined && { theme: props.theme }),\n ...(props.lod !== undefined && { lod: props.lod }),\n ...(props.initialContextNodeId !== undefined && { initialContextNodeId: props.initialContextNodeId }),\n on: {\n 'node:click': (node) => emit('node:click', node),\n 'node:hover': (node) => emit('node:hover', node),\n 'node:blur': (node) => emit('node:blur', node),\n 'canvas:click': () => emit('canvas:click'),\n 'zoom:change': (z) => emit('zoom:change', z),\n 'context:enter': (node, stack) => emit('context:enter', node, stack),\n 'context:exit': (frame, stack) => emit('context:exit', frame, stack),\n 'graph:ready': (graph) => emit('graph:ready', graph),\n },\n})\n\n// Expose imperative API to parent via template ref\ndefineExpose({\n setNodeState,\n addEvidence,\n removeEvidence,\n updateTheme,\n zoomIn,\n zoomOut,\n goBack,\n enterContext,\n jumpToNavDepth,\n getGraph,\n hoveredNode,\n selectedNode,\n zoom,\n navigationStack,\n canGoBack,\n})\n\nconst canvasStyle = computed(() => ({\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n display: 'block',\n}))\n</script>\n\n<template>\n <canvas ref=\"canvasRef\" :style=\"canvasStyle\" />\n</template>\n"],"names":["useSkillTree","options","canvasRef","ref","engine","shallowRef","hoveredNode","selectedNode","zoom","navigationStack","canGoBack","computed","watch","canvas","_a","SkillTreeEngine","node","_b","_c","z","stack","frame","graph","onUnmounted","nodeId","state","evidence","evidenceId","theme","targetLength","props","__props","emit","__emit","goBack","setNodeState","addEvidence","removeEvidence","updateTheme","zoomIn","zoomOut","getGraph","enterContext","jumpToNavDepth","__expose","canvasStyle","_createElementBlock"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@expertrees/vue",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Vue 3 component and composable 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", "vue", "vue3", "visualization"],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "vite build",
|
|
24
|
+
"dev": "vite build --watch",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"test:watch": "vitest",
|
|
27
|
+
"typecheck": "vue-tsc --noEmit",
|
|
28
|
+
"clean": "rm -rf dist"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@expertrees/core": "*"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"vue": "^3.4.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@vitejs/plugin-vue": "^5.2.1",
|
|
38
|
+
"@vue/test-utils": "^2.4.6",
|
|
39
|
+
"happy-dom": "^16.3.0",
|
|
40
|
+
"vite": "^6.0.7",
|
|
41
|
+
"vite-plugin-dts": "^4.4.0",
|
|
42
|
+
"vitest": "^2.1.8",
|
|
43
|
+
"vue": "^3.4.0",
|
|
44
|
+
"vue-tsc": "^2.2.0"
|
|
45
|
+
}
|
|
46
|
+
}
|