@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 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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"}
@@ -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
+ }