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