learngraph 0.5.0 → 0.7.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.
Files changed (235) hide show
  1. package/dist/cjs/api/routes/analytics.js +288 -0
  2. package/dist/cjs/api/routes/analytics.js.map +1 -0
  3. package/dist/cjs/api/routes/assessments.js +269 -0
  4. package/dist/cjs/api/routes/assessments.js.map +1 -0
  5. package/dist/cjs/api/routes/curriculum.js +345 -0
  6. package/dist/cjs/api/routes/curriculum.js.map +1 -0
  7. package/dist/cjs/api/routes/edges.js +162 -0
  8. package/dist/cjs/api/routes/edges.js.map +1 -0
  9. package/dist/cjs/api/routes/explore.js +224 -0
  10. package/dist/cjs/api/routes/explore.js.map +1 -0
  11. package/dist/cjs/api/routes/learners.js +324 -0
  12. package/dist/cjs/api/routes/learners.js.map +1 -0
  13. package/dist/cjs/api/routes/me.js +404 -0
  14. package/dist/cjs/api/routes/me.js.map +1 -0
  15. package/dist/cjs/api/routes/skills.js +319 -0
  16. package/dist/cjs/api/routes/skills.js.map +1 -0
  17. package/dist/cjs/api/server.js +185 -0
  18. package/dist/cjs/api/server.js.map +1 -0
  19. package/dist/cjs/api/types.js +10 -0
  20. package/dist/cjs/api/types.js.map +1 -0
  21. package/dist/cjs/assessment/adaptive.js +390 -0
  22. package/dist/cjs/assessment/adaptive.js.map +1 -0
  23. package/dist/cjs/assessment/bkt.js +362 -0
  24. package/dist/cjs/assessment/bkt.js.map +1 -0
  25. package/dist/cjs/assessment/index.js +54 -0
  26. package/dist/cjs/assessment/index.js.map +1 -0
  27. package/dist/cjs/assessment/irt.js +420 -0
  28. package/dist/cjs/assessment/irt.js.map +1 -0
  29. package/dist/cjs/assessment/mastery-engine.js +411 -0
  30. package/dist/cjs/assessment/mastery-engine.js.map +1 -0
  31. package/dist/cjs/components/LearningPathView.js +320 -0
  32. package/dist/cjs/components/LearningPathView.js.map +1 -0
  33. package/dist/cjs/components/ProgressDashboard.js +308 -0
  34. package/dist/cjs/components/ProgressDashboard.js.map +1 -0
  35. package/dist/cjs/components/SkillCard.js +264 -0
  36. package/dist/cjs/components/SkillCard.js.map +1 -0
  37. package/dist/cjs/components/SkillExplorer.js +401 -0
  38. package/dist/cjs/components/SkillExplorer.js.map +1 -0
  39. package/dist/cjs/components/SkillGraph.js +435 -0
  40. package/dist/cjs/components/SkillGraph.js.map +1 -0
  41. package/dist/cjs/components/hooks.js +510 -0
  42. package/dist/cjs/components/hooks.js.map +1 -0
  43. package/dist/cjs/components/index.js +77 -0
  44. package/dist/cjs/components/index.js.map +1 -0
  45. package/dist/cjs/components/types.js +34 -0
  46. package/dist/cjs/components/types.js.map +1 -0
  47. package/dist/cjs/index.js +35 -1
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/llm/adapters/anthropic.js +91 -3
  50. package/dist/cjs/llm/adapters/anthropic.js.map +1 -1
  51. package/dist/cjs/llm/adapters/gemini.js +101 -8
  52. package/dist/cjs/llm/adapters/gemini.js.map +1 -1
  53. package/dist/cjs/llm/adapters/index.js +42 -1
  54. package/dist/cjs/llm/adapters/index.js.map +1 -1
  55. package/dist/cjs/llm/adapters/ollama.js +120 -3
  56. package/dist/cjs/llm/adapters/ollama.js.map +1 -1
  57. package/dist/cjs/llm/adapters/openai.js +108 -2
  58. package/dist/cjs/llm/adapters/openai.js.map +1 -1
  59. package/dist/cjs/mcp/cli.js +302 -0
  60. package/dist/cjs/mcp/cli.js.map +1 -0
  61. package/dist/cjs/mcp/index.js +79 -0
  62. package/dist/cjs/mcp/index.js.map +1 -0
  63. package/dist/cjs/mcp/prompts.js +425 -0
  64. package/dist/cjs/mcp/prompts.js.map +1 -0
  65. package/dist/cjs/mcp/resources.js +371 -0
  66. package/dist/cjs/mcp/resources.js.map +1 -0
  67. package/dist/cjs/mcp/server.js +410 -0
  68. package/dist/cjs/mcp/server.js.map +1 -0
  69. package/dist/cjs/mcp/tools.js +612 -0
  70. package/dist/cjs/mcp/tools.js.map +1 -0
  71. package/dist/cjs/mcp/types.js +10 -0
  72. package/dist/cjs/mcp/types.js.map +1 -0
  73. package/dist/cjs/types/assessment.js +46 -0
  74. package/dist/cjs/types/assessment.js.map +1 -0
  75. package/dist/cjs/types/bloom.js +12 -1
  76. package/dist/cjs/types/bloom.js.map +1 -1
  77. package/dist/cjs/types/index.js +7 -1
  78. package/dist/cjs/types/index.js.map +1 -1
  79. package/dist/esm/api/routes/analytics.js +285 -0
  80. package/dist/esm/api/routes/analytics.js.map +1 -0
  81. package/dist/esm/api/routes/assessments.js +266 -0
  82. package/dist/esm/api/routes/assessments.js.map +1 -0
  83. package/dist/esm/api/routes/curriculum.js +342 -0
  84. package/dist/esm/api/routes/curriculum.js.map +1 -0
  85. package/dist/esm/api/routes/edges.js +159 -0
  86. package/dist/esm/api/routes/edges.js.map +1 -0
  87. package/dist/esm/api/routes/explore.js +221 -0
  88. package/dist/esm/api/routes/explore.js.map +1 -0
  89. package/dist/esm/api/routes/learners.js +321 -0
  90. package/dist/esm/api/routes/learners.js.map +1 -0
  91. package/dist/esm/api/routes/me.js +401 -0
  92. package/dist/esm/api/routes/me.js.map +1 -0
  93. package/dist/esm/api/routes/skills.js +316 -0
  94. package/dist/esm/api/routes/skills.js.map +1 -0
  95. package/dist/esm/api/server.js +179 -0
  96. package/dist/esm/api/server.js.map +1 -0
  97. package/dist/esm/api/types.js +9 -0
  98. package/dist/esm/api/types.js.map +1 -0
  99. package/dist/esm/assessment/adaptive.js +384 -0
  100. package/dist/esm/assessment/adaptive.js.map +1 -0
  101. package/dist/esm/assessment/bkt.js +354 -0
  102. package/dist/esm/assessment/bkt.js.map +1 -0
  103. package/dist/esm/assessment/index.js +21 -0
  104. package/dist/esm/assessment/index.js.map +1 -0
  105. package/dist/esm/assessment/irt.js +406 -0
  106. package/dist/esm/assessment/irt.js.map +1 -0
  107. package/dist/esm/assessment/mastery-engine.js +406 -0
  108. package/dist/esm/assessment/mastery-engine.js.map +1 -0
  109. package/dist/esm/components/LearningPathView.js +316 -0
  110. package/dist/esm/components/LearningPathView.js.map +1 -0
  111. package/dist/esm/components/ProgressDashboard.js +304 -0
  112. package/dist/esm/components/ProgressDashboard.js.map +1 -0
  113. package/dist/esm/components/SkillCard.js +260 -0
  114. package/dist/esm/components/SkillCard.js.map +1 -0
  115. package/dist/esm/components/SkillExplorer.js +397 -0
  116. package/dist/esm/components/SkillExplorer.js.map +1 -0
  117. package/dist/esm/components/SkillGraph.js +398 -0
  118. package/dist/esm/components/SkillGraph.js.map +1 -0
  119. package/dist/esm/components/hooks.js +502 -0
  120. package/dist/esm/components/hooks.js.map +1 -0
  121. package/dist/esm/components/index.js +61 -0
  122. package/dist/esm/components/index.js.map +1 -0
  123. package/dist/esm/components/types.js +31 -0
  124. package/dist/esm/components/types.js.map +1 -0
  125. package/dist/esm/index.js +12 -0
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/llm/adapters/anthropic.js +88 -2
  128. package/dist/esm/llm/adapters/anthropic.js.map +1 -1
  129. package/dist/esm/llm/adapters/gemini.js +98 -7
  130. package/dist/esm/llm/adapters/gemini.js.map +1 -1
  131. package/dist/esm/llm/adapters/index.js +15 -4
  132. package/dist/esm/llm/adapters/index.js.map +1 -1
  133. package/dist/esm/llm/adapters/ollama.js +117 -2
  134. package/dist/esm/llm/adapters/ollama.js.map +1 -1
  135. package/dist/esm/llm/adapters/openai.js +105 -1
  136. package/dist/esm/llm/adapters/openai.js.map +1 -1
  137. package/dist/esm/mcp/cli.js +267 -0
  138. package/dist/esm/mcp/cli.js.map +1 -0
  139. package/dist/esm/mcp/index.js +39 -0
  140. package/dist/esm/mcp/index.js.map +1 -0
  141. package/dist/esm/mcp/prompts.js +419 -0
  142. package/dist/esm/mcp/prompts.js.map +1 -0
  143. package/dist/esm/mcp/resources.js +359 -0
  144. package/dist/esm/mcp/resources.js.map +1 -0
  145. package/dist/esm/mcp/server.js +372 -0
  146. package/dist/esm/mcp/server.js.map +1 -0
  147. package/dist/esm/mcp/tools.js +598 -0
  148. package/dist/esm/mcp/tools.js.map +1 -0
  149. package/dist/esm/mcp/types.js +9 -0
  150. package/dist/esm/mcp/types.js.map +1 -0
  151. package/dist/esm/types/assessment.js +40 -0
  152. package/dist/esm/types/assessment.js.map +1 -0
  153. package/dist/esm/types/bloom.js +11 -0
  154. package/dist/esm/types/bloom.js.map +1 -1
  155. package/dist/esm/types/index.js +2 -1
  156. package/dist/esm/types/index.js.map +1 -1
  157. package/dist/types/api/routes/analytics.d.ts +14 -0
  158. package/dist/types/api/routes/analytics.d.ts.map +1 -0
  159. package/dist/types/api/routes/assessments.d.ts +14 -0
  160. package/dist/types/api/routes/assessments.d.ts.map +1 -0
  161. package/dist/types/api/routes/curriculum.d.ts +14 -0
  162. package/dist/types/api/routes/curriculum.d.ts.map +1 -0
  163. package/dist/types/api/routes/edges.d.ts +14 -0
  164. package/dist/types/api/routes/edges.d.ts.map +1 -0
  165. package/dist/types/api/routes/explore.d.ts +14 -0
  166. package/dist/types/api/routes/explore.d.ts.map +1 -0
  167. package/dist/types/api/routes/learners.d.ts +14 -0
  168. package/dist/types/api/routes/learners.d.ts.map +1 -0
  169. package/dist/types/api/routes/me.d.ts +14 -0
  170. package/dist/types/api/routes/me.d.ts.map +1 -0
  171. package/dist/types/api/routes/skills.d.ts +14 -0
  172. package/dist/types/api/routes/skills.d.ts.map +1 -0
  173. package/dist/types/api/server.d.ts +147 -0
  174. package/dist/types/api/server.d.ts.map +1 -0
  175. package/dist/types/api/types.d.ts +443 -0
  176. package/dist/types/api/types.d.ts.map +1 -0
  177. package/dist/types/assessment/adaptive.d.ts +155 -0
  178. package/dist/types/assessment/adaptive.d.ts.map +1 -0
  179. package/dist/types/assessment/bkt.d.ts +185 -0
  180. package/dist/types/assessment/bkt.d.ts.map +1 -0
  181. package/dist/types/assessment/index.d.ts +18 -0
  182. package/dist/types/assessment/index.d.ts.map +1 -0
  183. package/dist/types/assessment/irt.d.ts +159 -0
  184. package/dist/types/assessment/irt.d.ts.map +1 -0
  185. package/dist/types/assessment/mastery-engine.d.ts +178 -0
  186. package/dist/types/assessment/mastery-engine.d.ts.map +1 -0
  187. package/dist/types/components/LearningPathView.d.ts +40 -0
  188. package/dist/types/components/LearningPathView.d.ts.map +1 -0
  189. package/dist/types/components/ProgressDashboard.d.ts +49 -0
  190. package/dist/types/components/ProgressDashboard.d.ts.map +1 -0
  191. package/dist/types/components/SkillCard.d.ts +34 -0
  192. package/dist/types/components/SkillCard.d.ts.map +1 -0
  193. package/dist/types/components/SkillExplorer.d.ts +39 -0
  194. package/dist/types/components/SkillExplorer.d.ts.map +1 -0
  195. package/dist/types/components/SkillGraph.d.ts +38 -0
  196. package/dist/types/components/SkillGraph.d.ts.map +1 -0
  197. package/dist/types/components/hooks.d.ts +187 -0
  198. package/dist/types/components/hooks.d.ts.map +1 -0
  199. package/dist/types/components/index.d.ts +59 -0
  200. package/dist/types/components/index.d.ts.map +1 -0
  201. package/dist/types/components/types.d.ts +410 -0
  202. package/dist/types/components/types.d.ts.map +1 -0
  203. package/dist/types/index.d.ts +1 -0
  204. package/dist/types/index.d.ts.map +1 -1
  205. package/dist/types/llm/adapters/anthropic.d.ts +84 -1
  206. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -1
  207. package/dist/types/llm/adapters/gemini.d.ts +93 -6
  208. package/dist/types/llm/adapters/gemini.d.ts.map +1 -1
  209. package/dist/types/llm/adapters/index.d.ts +13 -4
  210. package/dist/types/llm/adapters/index.d.ts.map +1 -1
  211. package/dist/types/llm/adapters/ollama.d.ts +126 -1
  212. package/dist/types/llm/adapters/ollama.d.ts.map +1 -1
  213. package/dist/types/llm/adapters/openai.d.ts +104 -1
  214. package/dist/types/llm/adapters/openai.d.ts.map +1 -1
  215. package/dist/types/mcp/cli.d.ts +15 -0
  216. package/dist/types/mcp/cli.d.ts.map +1 -0
  217. package/dist/types/mcp/index.d.ts +32 -0
  218. package/dist/types/mcp/index.d.ts.map +1 -0
  219. package/dist/types/mcp/prompts.d.ts +27 -0
  220. package/dist/types/mcp/prompts.d.ts.map +1 -0
  221. package/dist/types/mcp/resources.d.ts +59 -0
  222. package/dist/types/mcp/resources.d.ts.map +1 -0
  223. package/dist/types/mcp/server.d.ts +136 -0
  224. package/dist/types/mcp/server.d.ts.map +1 -0
  225. package/dist/types/mcp/tools.d.ts +344 -0
  226. package/dist/types/mcp/tools.d.ts.map +1 -0
  227. package/dist/types/mcp/types.d.ts +137 -0
  228. package/dist/types/mcp/types.d.ts.map +1 -0
  229. package/dist/types/types/assessment.d.ts +512 -0
  230. package/dist/types/types/assessment.d.ts.map +1 -0
  231. package/dist/types/types/bloom.d.ts +4 -0
  232. package/dist/types/types/bloom.d.ts.map +1 -1
  233. package/dist/types/types/index.d.ts +3 -1
  234. package/dist/types/types/index.d.ts.map +1 -1
  235. package/package.json +48 -3
@@ -0,0 +1,398 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * SkillGraph Component
4
+ *
5
+ * Interactive graph visualization for skills and prerequisites.
6
+ * Uses React Flow for rendering and interaction.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { useMemo, useCallback, useEffect, } from 'react';
11
+ import ReactFlow, { Background, Controls, MiniMap, useNodesState, useEdgesState, Position, MarkerType, Handle, getBezierPath, } from 'reactflow';
12
+ import { DEFAULT_BLOOM_COLORS, STATUS_COLORS } from './types.js';
13
+ /**
14
+ * Calculate hierarchical layout (top-to-bottom)
15
+ */
16
+ function calculateHierarchicalLayout(skills, edges) {
17
+ const nodeWidth = 200;
18
+ const nodeHeight = 80;
19
+ const levelGap = 120;
20
+ const nodeGap = 40;
21
+ // Build adjacency for levels
22
+ const prereqMap = new Map();
23
+ for (const edge of edges) {
24
+ const targetId = String(edge.targetId);
25
+ const sourceId = String(edge.sourceId);
26
+ if (!prereqMap.has(targetId)) {
27
+ prereqMap.set(targetId, new Set());
28
+ }
29
+ prereqMap.get(targetId).add(sourceId);
30
+ }
31
+ // Calculate levels (BFS from roots)
32
+ const levels = new Map();
33
+ const roots = skills.filter((s) => {
34
+ const prereqs = prereqMap.get(String(s.id));
35
+ return !prereqs || prereqs.size === 0;
36
+ });
37
+ // Initialize roots at level 0
38
+ for (const root of roots) {
39
+ levels.set(String(root.id), 0);
40
+ }
41
+ // BFS to assign levels
42
+ const queue = [...roots.map((r) => String(r.id))];
43
+ const visited = new Set(queue);
44
+ while (queue.length > 0) {
45
+ const nodeId = queue.shift();
46
+ const nodeLevel = levels.get(nodeId) || 0;
47
+ // Find dependents
48
+ for (const edge of edges) {
49
+ if (String(edge.sourceId) === nodeId) {
50
+ const targetId = String(edge.targetId);
51
+ const currentLevel = levels.get(targetId);
52
+ const newLevel = nodeLevel + 1;
53
+ if (currentLevel === undefined || newLevel > currentLevel) {
54
+ levels.set(targetId, newLevel);
55
+ }
56
+ if (!visited.has(targetId)) {
57
+ visited.add(targetId);
58
+ queue.push(targetId);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ // Assign level 0 to any remaining nodes
64
+ for (const skill of skills) {
65
+ if (!levels.has(String(skill.id))) {
66
+ levels.set(String(skill.id), 0);
67
+ }
68
+ }
69
+ // Group by level
70
+ const levelGroups = new Map();
71
+ for (const [nodeId, level] of levels) {
72
+ if (!levelGroups.has(level)) {
73
+ levelGroups.set(level, []);
74
+ }
75
+ levelGroups.get(level).push(nodeId);
76
+ }
77
+ // Calculate positions
78
+ const nodes = [];
79
+ const maxNodesInLevel = Math.max(...Array.from(levelGroups.values()).map((g) => g.length));
80
+ const totalWidth = maxNodesInLevel * (nodeWidth + nodeGap);
81
+ for (const [level, nodeIds] of levelGroups) {
82
+ const levelWidth = nodeIds.length * (nodeWidth + nodeGap);
83
+ const startX = (totalWidth - levelWidth) / 2;
84
+ nodeIds.forEach((nodeId, index) => {
85
+ nodes.push({
86
+ id: nodeId,
87
+ x: startX + index * (nodeWidth + nodeGap),
88
+ y: level * (nodeHeight + levelGap),
89
+ });
90
+ });
91
+ }
92
+ return { nodes };
93
+ }
94
+ /**
95
+ * Calculate force-directed layout (simplified)
96
+ */
97
+ function calculateForceLayout(skills, edges) {
98
+ const width = 1000;
99
+ const height = 800;
100
+ // Simple grid layout with some randomness
101
+ const cols = Math.ceil(Math.sqrt(skills.length));
102
+ const cellWidth = width / cols;
103
+ const cellHeight = height / Math.ceil(skills.length / cols);
104
+ const nodes = skills.map((skill, index) => ({
105
+ id: String(skill.id),
106
+ x: (index % cols) * cellWidth + cellWidth / 2 + (Math.random() - 0.5) * 50,
107
+ y: Math.floor(index / cols) * cellHeight +
108
+ cellHeight / 2 +
109
+ (Math.random() - 0.5) * 50,
110
+ }));
111
+ return { nodes };
112
+ }
113
+ /**
114
+ * Calculate circular layout
115
+ */
116
+ function calculateCircularLayout(skills) {
117
+ const centerX = 500;
118
+ const centerY = 400;
119
+ const radius = 300;
120
+ const nodes = skills.map((skill, index) => {
121
+ const angle = (2 * Math.PI * index) / skills.length;
122
+ return {
123
+ id: String(skill.id),
124
+ x: centerX + radius * Math.cos(angle),
125
+ y: centerY + radius * Math.sin(angle),
126
+ };
127
+ });
128
+ return { nodes };
129
+ }
130
+ /**
131
+ * Calculate layout based on algorithm
132
+ */
133
+ function calculateLayout(skills, edges, layout) {
134
+ switch (layout) {
135
+ case 'hierarchical':
136
+ case 'dagre':
137
+ return calculateHierarchicalLayout(skills, edges);
138
+ case 'force':
139
+ return calculateForceLayout(skills, edges);
140
+ case 'circular':
141
+ case 'radial':
142
+ return calculateCircularLayout(skills);
143
+ default:
144
+ return calculateHierarchicalLayout(skills, edges);
145
+ }
146
+ }
147
+ const SkillNodeComponent = ({ data, selected }) => {
148
+ const { skill, type, bloomColor, onClick } = data;
149
+ const backgroundColor = useMemo(() => {
150
+ switch (type) {
151
+ case 'mastered':
152
+ return STATUS_COLORS.mastered;
153
+ case 'available':
154
+ return STATUS_COLORS.available;
155
+ case 'locked':
156
+ return STATUS_COLORS.locked;
157
+ case 'target':
158
+ return '#ec4899'; // pink-500
159
+ default:
160
+ return bloomColor;
161
+ }
162
+ }, [type, bloomColor]);
163
+ const style = {
164
+ padding: '12px 16px',
165
+ borderRadius: '8px',
166
+ backgroundColor,
167
+ color: type === 'locked' ? '#374151' : '#ffffff',
168
+ border: selected ? '3px solid #1f2937' : '2px solid transparent',
169
+ boxShadow: selected
170
+ ? '0 4px 6px -1px rgba(0, 0, 0, 0.1)'
171
+ : '0 1px 3px rgba(0, 0, 0, 0.1)',
172
+ cursor: 'pointer',
173
+ minWidth: '160px',
174
+ maxWidth: '200px',
175
+ transition: 'all 0.2s ease',
176
+ };
177
+ return (_jsxs("div", { style: style, onClick: onClick, children: [_jsx(Handle, { type: "target", position: Position.Top, style: { background: '#6b7280' } }), _jsx("div", { style: { fontWeight: 600, marginBottom: '4px', fontSize: '14px' }, children: skill.name }), _jsxs("div", { style: {
178
+ fontSize: '11px',
179
+ opacity: 0.85,
180
+ display: 'flex',
181
+ gap: '8px',
182
+ alignItems: 'center',
183
+ }, children: [_jsx("span", { style: {
184
+ textTransform: 'capitalize',
185
+ backgroundColor: 'rgba(255,255,255,0.2)',
186
+ padding: '2px 6px',
187
+ borderRadius: '4px',
188
+ }, children: skill.bloomLevel }), _jsxs("span", { children: [skill.estimatedMinutes, "m"] })] }), _jsx(Handle, { type: "source", position: Position.Bottom, style: { background: '#6b7280' } })] }));
189
+ };
190
+ const PrerequisiteEdgeComponent = ({ id, sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition, data, style = {}, }) => {
191
+ const [edgePath] = getBezierPath({
192
+ sourceX,
193
+ sourceY,
194
+ sourcePosition,
195
+ targetX,
196
+ targetY,
197
+ targetPosition,
198
+ });
199
+ const strokeWidth = useMemo(() => {
200
+ const strength = data?.strength ?? 0.5;
201
+ return 1 + strength * 2;
202
+ }, [data?.strength]);
203
+ const strokeColor = useMemo(() => {
204
+ switch (data?.type) {
205
+ case 'required':
206
+ return '#6b7280';
207
+ case 'recommended':
208
+ return '#9ca3af';
209
+ case 'optional':
210
+ return '#d1d5db';
211
+ default:
212
+ return '#9ca3af';
213
+ }
214
+ }, [data?.type]);
215
+ return (_jsx("path", { id: id, style: {
216
+ ...style,
217
+ strokeWidth,
218
+ stroke: strokeColor,
219
+ }, className: "react-flow__edge-path", d: edgePath, markerEnd: `url(#arrow-${data?.type || 'default'})` }));
220
+ };
221
+ // ─────────────────────────────────────────────────────────────────────────────
222
+ // Main Component
223
+ // ─────────────────────────────────────────────────────────────────────────────
224
+ const nodeTypes = {
225
+ skillNode: SkillNodeComponent,
226
+ };
227
+ const edgeTypes = {
228
+ prereqEdge: PrerequisiteEdgeComponent,
229
+ };
230
+ /**
231
+ * SkillGraph Component
232
+ *
233
+ * Interactive visualization of skills and their prerequisite relationships.
234
+ *
235
+ * @example
236
+ * ```tsx
237
+ * import { SkillGraph } from 'learngraph/components';
238
+ *
239
+ * function CurriculumView() {
240
+ * const { skills, edges } = useLearnGraph();
241
+ *
242
+ * return (
243
+ * <SkillGraph
244
+ * skills={skills}
245
+ * edges={edges}
246
+ * masteredSkillIds={['skill-1', 'skill-2']}
247
+ * layout="hierarchical"
248
+ * onNodeClick={(node) => console.log('Selected:', node.skill.name)}
249
+ * height={600}
250
+ * />
251
+ * );
252
+ * }
253
+ * ```
254
+ */
255
+ export const SkillGraph = ({ skills, edges, masteredSkillIds = [], targetSkillId, layout = 'hierarchical', onNodeClick, onEdgeClick, interactive = true, showMinimap = true, showControls = true, bloomColors = {}, width = '100%', height = 500, className, style, }) => {
256
+ const masteredSet = useMemo(() => new Set(masteredSkillIds), [masteredSkillIds]);
257
+ // Build prerequisite map for availability check
258
+ const prereqMap = useMemo(() => {
259
+ const map = new Map();
260
+ for (const edge of edges) {
261
+ const targetId = String(edge.targetId);
262
+ const sourceId = String(edge.sourceId);
263
+ if (!map.has(targetId)) {
264
+ map.set(targetId, new Set());
265
+ }
266
+ map.get(targetId).add(sourceId);
267
+ }
268
+ return map;
269
+ }, [edges]);
270
+ // Check if skill is available
271
+ const isAvailable = useCallback((skillId) => {
272
+ if (masteredSet.has(skillId))
273
+ return false;
274
+ const prereqs = prereqMap.get(skillId);
275
+ if (!prereqs || prereqs.size === 0)
276
+ return true;
277
+ return Array.from(prereqs).every((id) => masteredSet.has(id));
278
+ }, [prereqMap, masteredSet]);
279
+ // Get bloom color
280
+ const getBloomColor = useCallback((level) => {
281
+ return bloomColors[level] ?? DEFAULT_BLOOM_COLORS[level];
282
+ }, [bloomColors]);
283
+ // Calculate layout
284
+ const layoutResult = useMemo(() => calculateLayout(skills, edges, layout), [skills, edges, layout]);
285
+ // Create position map
286
+ const positionMap = useMemo(() => {
287
+ const map = new Map();
288
+ for (const node of layoutResult.nodes) {
289
+ map.set(node.id, { x: node.x, y: node.y });
290
+ }
291
+ return map;
292
+ }, [layoutResult]);
293
+ // Convert to React Flow nodes
294
+ const initialNodes = useMemo(() => {
295
+ return skills.map((skill) => {
296
+ const skillId = String(skill.id);
297
+ const position = positionMap.get(skillId) || { x: 0, y: 0 };
298
+ let nodeType = 'skill';
299
+ if (skillId === targetSkillId) {
300
+ nodeType = 'target';
301
+ }
302
+ else if (masteredSet.has(skillId)) {
303
+ nodeType = 'mastered';
304
+ }
305
+ else if (isAvailable(skillId)) {
306
+ nodeType = 'available';
307
+ }
308
+ else {
309
+ nodeType = 'locked';
310
+ }
311
+ return {
312
+ id: skillId,
313
+ type: 'skillNode',
314
+ position,
315
+ data: {
316
+ skill,
317
+ type: nodeType,
318
+ bloomColor: getBloomColor(skill.bloomLevel),
319
+ onClick: onNodeClick
320
+ ? () => onNodeClick({
321
+ id: skillId,
322
+ label: skill.name,
323
+ skill,
324
+ position,
325
+ type: nodeType,
326
+ })
327
+ : undefined,
328
+ },
329
+ };
330
+ });
331
+ }, [
332
+ skills,
333
+ positionMap,
334
+ targetSkillId,
335
+ masteredSet,
336
+ isAvailable,
337
+ getBloomColor,
338
+ onNodeClick,
339
+ ]);
340
+ // Convert to React Flow edges
341
+ const initialEdges = useMemo(() => {
342
+ return edges.map((edge) => {
343
+ const edgeType = edge.strength > 0.7
344
+ ? 'required'
345
+ : edge.strength > 0.4
346
+ ? 'recommended'
347
+ : 'optional';
348
+ return {
349
+ id: String(edge.id),
350
+ source: String(edge.sourceId),
351
+ target: String(edge.targetId),
352
+ type: 'prereqEdge',
353
+ animated: targetSkillId
354
+ ? String(edge.targetId) === targetSkillId
355
+ : false,
356
+ data: {
357
+ strength: edge.strength,
358
+ type: edgeType,
359
+ },
360
+ markerEnd: {
361
+ type: MarkerType.ArrowClosed,
362
+ width: 15,
363
+ height: 15,
364
+ color: '#6b7280',
365
+ },
366
+ };
367
+ });
368
+ }, [edges, targetSkillId]);
369
+ const [nodes, setNodes, onNodesChange] = useNodesState(initialNodes);
370
+ const [flowEdges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
371
+ // Update when props change
372
+ useEffect(() => {
373
+ setNodes(initialNodes);
374
+ setEdges(initialEdges);
375
+ }, [initialNodes, initialEdges, setNodes, setEdges]);
376
+ const containerStyle = {
377
+ width,
378
+ height,
379
+ ...style,
380
+ };
381
+ return (_jsx("div", { className: className, style: containerStyle, children: _jsxs(ReactFlow, { nodes: nodes, edges: flowEdges, onNodesChange: interactive ? onNodesChange : undefined, onEdgesChange: interactive ? onEdgesChange : undefined, nodeTypes: nodeTypes, edgeTypes: edgeTypes, fitView: true, attributionPosition: "bottom-left", nodesDraggable: interactive, nodesConnectable: false, elementsSelectable: interactive, children: [_jsx(Background, { color: "#e5e7eb", gap: 16 }), showControls && _jsx(Controls, {}), showMinimap && (_jsx(MiniMap, { nodeColor: (node) => {
382
+ const data = node.data;
383
+ switch (data?.type) {
384
+ case 'mastered':
385
+ return STATUS_COLORS.mastered;
386
+ case 'available':
387
+ return STATUS_COLORS.available;
388
+ case 'locked':
389
+ return STATUS_COLORS.locked;
390
+ case 'target':
391
+ return '#ec4899';
392
+ default:
393
+ return data?.bloomColor || '#94a3b8';
394
+ }
395
+ }, maskColor: "rgba(0, 0, 0, 0.1)" }))] }) }));
396
+ };
397
+ export default SkillGraph;
398
+ //# sourceMappingURL=SkillGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillGraph.js","sourceRoot":"","sources":["../../../src/components/SkillGraph.tsx"],"names":[],"mappings":"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"}