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,320 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LearningPathView = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * LearningPathView Component
7
+ *
8
+ * Displays a learning path with progress tracking.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ const react_1 = require("react");
13
+ const types_js_1 = require("./types.js");
14
+ const ProgressBar = ({ steps }) => {
15
+ const completed = steps.filter((s) => s.status === 'completed').length;
16
+ const percentage = Math.round((completed / steps.length) * 100);
17
+ const containerStyle = {
18
+ marginBottom: '24px',
19
+ };
20
+ const labelStyle = {
21
+ display: 'flex',
22
+ justifyContent: 'space-between',
23
+ fontSize: '14px',
24
+ marginBottom: '8px',
25
+ color: '#374151',
26
+ };
27
+ const barContainerStyle = {
28
+ height: '12px',
29
+ backgroundColor: '#e5e7eb',
30
+ borderRadius: '6px',
31
+ overflow: 'hidden',
32
+ };
33
+ const barStyle = {
34
+ height: '100%',
35
+ width: `${percentage}%`,
36
+ backgroundColor: types_js_1.STATUS_COLORS.mastered,
37
+ borderRadius: '6px',
38
+ transition: 'width 0.3s ease',
39
+ };
40
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: labelStyle, children: [(0, jsx_runtime_1.jsxs)("span", { children: [(0, jsx_runtime_1.jsx)("strong", { children: completed }), " of ", (0, jsx_runtime_1.jsx)("strong", { children: steps.length }), " skills completed"] }), (0, jsx_runtime_1.jsxs)("span", { style: { fontWeight: 600 }, children: [percentage, "%"] })] }), (0, jsx_runtime_1.jsx)("div", { style: barContainerStyle, children: (0, jsx_runtime_1.jsx)("div", { style: barStyle }) })] }));
41
+ };
42
+ const TimelineStep = ({ step, isLast, showTime, onStepClick, onStartStep, }) => {
43
+ const { skill, stepNumber, status, isPrerequisite, estimatedMinutes } = step;
44
+ const statusColors = {
45
+ completed: types_js_1.STATUS_COLORS.mastered,
46
+ current: types_js_1.STATUS_COLORS.available,
47
+ upcoming: '#9ca3af',
48
+ locked: types_js_1.STATUS_COLORS.locked,
49
+ };
50
+ const containerStyle = {
51
+ display: 'flex',
52
+ position: 'relative',
53
+ };
54
+ const indicatorContainerStyle = {
55
+ display: 'flex',
56
+ flexDirection: 'column',
57
+ alignItems: 'center',
58
+ marginRight: '16px',
59
+ };
60
+ const circleStyle = {
61
+ width: '32px',
62
+ height: '32px',
63
+ borderRadius: '50%',
64
+ backgroundColor: status === 'completed' ? statusColors[status] : 'transparent',
65
+ border: `3px solid ${statusColors[status]}`,
66
+ display: 'flex',
67
+ alignItems: 'center',
68
+ justifyContent: 'center',
69
+ fontSize: '14px',
70
+ fontWeight: 600,
71
+ color: status === 'completed' ? '#ffffff' : statusColors[status],
72
+ zIndex: 1,
73
+ };
74
+ const lineStyle = {
75
+ width: '3px',
76
+ flex: 1,
77
+ backgroundColor: status === 'completed' ? statusColors.completed : '#e5e7eb',
78
+ minHeight: '24px',
79
+ display: isLast ? 'none' : 'block',
80
+ };
81
+ const contentStyle = {
82
+ flex: 1,
83
+ paddingBottom: isLast ? 0 : '24px',
84
+ cursor: onStepClick ? 'pointer' : 'default',
85
+ };
86
+ const cardStyle = {
87
+ backgroundColor: status === 'current' ? '#eff6ff' : '#ffffff',
88
+ border: `1px solid ${status === 'current' ? '#bfdbfe' : '#e5e7eb'}`,
89
+ borderRadius: '8px',
90
+ padding: '12px 16px',
91
+ transition: 'box-shadow 0.2s ease',
92
+ };
93
+ const headerStyle = {
94
+ display: 'flex',
95
+ justifyContent: 'space-between',
96
+ alignItems: 'center',
97
+ marginBottom: '4px',
98
+ };
99
+ const titleStyle = {
100
+ fontSize: '14px',
101
+ fontWeight: 600,
102
+ color: status === 'locked' ? '#9ca3af' : '#1f2937',
103
+ margin: 0,
104
+ };
105
+ const badgeStyle = {
106
+ display: 'inline-flex',
107
+ alignItems: 'center',
108
+ padding: '2px 8px',
109
+ borderRadius: '4px',
110
+ fontSize: '11px',
111
+ fontWeight: 500,
112
+ textTransform: 'capitalize',
113
+ backgroundColor: types_js_1.DEFAULT_BLOOM_COLORS[skill.bloomLevel],
114
+ color: '#ffffff',
115
+ };
116
+ const metaStyle = {
117
+ display: 'flex',
118
+ gap: '12px',
119
+ fontSize: '12px',
120
+ color: '#6b7280',
121
+ marginTop: '4px',
122
+ };
123
+ const buttonStyle = {
124
+ marginTop: '8px',
125
+ padding: '6px 12px',
126
+ backgroundColor: '#3b82f6',
127
+ color: '#ffffff',
128
+ border: 'none',
129
+ borderRadius: '6px',
130
+ fontSize: '12px',
131
+ fontWeight: 500,
132
+ cursor: 'pointer',
133
+ };
134
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: indicatorContainerStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: circleStyle, children: status === 'completed' ? '✓' : stepNumber }), (0, jsx_runtime_1.jsx)("div", { style: lineStyle })] }), (0, jsx_runtime_1.jsx)("div", { style: contentStyle, onClick: () => onStepClick?.(step), children: (0, jsx_runtime_1.jsxs)("div", { style: cardStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: headerStyle, children: [(0, jsx_runtime_1.jsx)("h4", { style: titleStyle, children: skill.name }), (0, jsx_runtime_1.jsx)("span", { style: badgeStyle, children: skill.bloomLevel })] }), (0, jsx_runtime_1.jsxs)("div", { style: metaStyle, children: [showTime && (0, jsx_runtime_1.jsxs)("span", { children: [estimatedMinutes, " min"] }), isPrerequisite && ((0, jsx_runtime_1.jsx)("span", { style: { color: '#f59e0b' }, children: "Prerequisite" }))] }), status === 'current' && onStartStep && ((0, jsx_runtime_1.jsx)("button", { style: buttonStyle, onClick: (e) => {
135
+ e.stopPropagation();
136
+ onStartStep(step);
137
+ }, children: "Start Now" }))] }) })] }));
138
+ };
139
+ const ListStep = ({ step, showTime, onStepClick, onStartStep, }) => {
140
+ const { skill, stepNumber, status, isPrerequisite, estimatedMinutes } = step;
141
+ const statusColors = {
142
+ completed: types_js_1.STATUS_COLORS.mastered,
143
+ current: types_js_1.STATUS_COLORS.available,
144
+ upcoming: '#9ca3af',
145
+ locked: types_js_1.STATUS_COLORS.locked,
146
+ };
147
+ const containerStyle = {
148
+ display: 'flex',
149
+ alignItems: 'center',
150
+ padding: '12px',
151
+ backgroundColor: status === 'current' ? '#eff6ff' : '#ffffff',
152
+ border: `1px solid ${status === 'current' ? '#bfdbfe' : '#e5e7eb'}`,
153
+ borderRadius: '8px',
154
+ marginBottom: '8px',
155
+ cursor: onStepClick ? 'pointer' : 'default',
156
+ };
157
+ const numberStyle = {
158
+ width: '28px',
159
+ height: '28px',
160
+ borderRadius: '50%',
161
+ backgroundColor: status === 'completed' ? statusColors[status] : 'transparent',
162
+ border: `2px solid ${statusColors[status]}`,
163
+ display: 'flex',
164
+ alignItems: 'center',
165
+ justifyContent: 'center',
166
+ fontSize: '12px',
167
+ fontWeight: 600,
168
+ color: status === 'completed' ? '#ffffff' : statusColors[status],
169
+ marginRight: '12px',
170
+ flexShrink: 0,
171
+ };
172
+ const contentStyle = {
173
+ flex: 1,
174
+ };
175
+ const titleStyle = {
176
+ fontSize: '14px',
177
+ fontWeight: 500,
178
+ color: status === 'locked' ? '#9ca3af' : '#1f2937',
179
+ margin: 0,
180
+ };
181
+ const metaStyle = {
182
+ display: 'flex',
183
+ gap: '8px',
184
+ fontSize: '11px',
185
+ color: '#6b7280',
186
+ marginTop: '2px',
187
+ };
188
+ const buttonStyle = {
189
+ padding: '4px 10px',
190
+ backgroundColor: '#3b82f6',
191
+ color: '#ffffff',
192
+ border: 'none',
193
+ borderRadius: '4px',
194
+ fontSize: '11px',
195
+ fontWeight: 500,
196
+ cursor: 'pointer',
197
+ marginLeft: '12px',
198
+ };
199
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, onClick: () => onStepClick?.(step), children: [(0, jsx_runtime_1.jsx)("div", { style: numberStyle, children: status === 'completed' ? '✓' : stepNumber }), (0, jsx_runtime_1.jsxs)("div", { style: contentStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: skill.name }), (0, jsx_runtime_1.jsxs)("div", { style: metaStyle, children: [(0, jsx_runtime_1.jsx)("span", { style: {
200
+ textTransform: 'capitalize',
201
+ color: types_js_1.DEFAULT_BLOOM_COLORS[skill.bloomLevel],
202
+ }, children: skill.bloomLevel }), showTime && (0, jsx_runtime_1.jsxs)("span", { children: [estimatedMinutes, " min"] }), isPrerequisite && (0, jsx_runtime_1.jsx)("span", { style: { color: '#f59e0b' }, children: "prereq" })] })] }), status === 'current' && onStartStep && ((0, jsx_runtime_1.jsx)("button", { style: buttonStyle, onClick: (e) => {
203
+ e.stopPropagation();
204
+ onStartStep(step);
205
+ }, children: "Start" }))] }));
206
+ };
207
+ // ─────────────────────────────────────────────────────────────────────────────
208
+ // Main Component
209
+ // ─────────────────────────────────────────────────────────────────────────────
210
+ /**
211
+ * LearningPathView Component
212
+ *
213
+ * Displays a learning path with progress tracking and step navigation.
214
+ *
215
+ * @example
216
+ * ```tsx
217
+ * import { LearningPathView } from 'learngraph/components';
218
+ *
219
+ * function PathToAlgebra() {
220
+ * const { steps } = useLearningPath({
221
+ * targetSkillId: 'algebra-101',
222
+ * });
223
+ *
224
+ * return (
225
+ * <LearningPathView
226
+ * steps={steps}
227
+ * targetSkillName="Algebra Basics"
228
+ * viewMode="timeline"
229
+ * onStepClick={(step) => console.log('Selected:', step.skill.name)}
230
+ * onStartStep={(step) => startLesson(step.skill.id)}
231
+ * showProgress
232
+ * showTimeEstimates
233
+ * />
234
+ * );
235
+ * }
236
+ * ```
237
+ */
238
+ const LearningPathView = ({ steps, targetSkillName, currentStepIndex: _currentStepIndex, viewMode = 'timeline', onStepClick, onStartStep, showTimeEstimates = true, showProgress = true, className, style, }) => {
239
+ // _currentStepIndex is available for future use
240
+ void _currentStepIndex;
241
+ const totalMinutes = (0, react_1.useMemo)(() => steps.reduce((sum, step) => sum + step.estimatedMinutes, 0), [steps]);
242
+ const containerStyle = {
243
+ ...style,
244
+ };
245
+ const headerStyle = {
246
+ marginBottom: '16px',
247
+ };
248
+ const titleStyle = {
249
+ fontSize: '20px',
250
+ fontWeight: 600,
251
+ color: '#1f2937',
252
+ margin: 0,
253
+ };
254
+ const subtitleStyle = {
255
+ fontSize: '14px',
256
+ color: '#6b7280',
257
+ marginTop: '4px',
258
+ };
259
+ if (steps.length === 0) {
260
+ return ((0, jsx_runtime_1.jsx)("div", { className: className, style: containerStyle, children: (0, jsx_runtime_1.jsxs)("div", { style: headerStyle, children: [(0, jsx_runtime_1.jsxs)("h2", { style: titleStyle, children: ["Path to ", targetSkillName] }), (0, jsx_runtime_1.jsx)("p", { style: subtitleStyle, children: "No prerequisites needed!" })] }) }));
261
+ }
262
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: headerStyle, children: [(0, jsx_runtime_1.jsxs)("h2", { style: titleStyle, children: ["Path to ", targetSkillName] }), (0, jsx_runtime_1.jsxs)("p", { style: subtitleStyle, children: [steps.length, " skills \u2022 ", totalMinutes, " minutes estimated"] })] }), showProgress && (0, jsx_runtime_1.jsx)(ProgressBar, { steps: steps }), viewMode === 'timeline' && ((0, jsx_runtime_1.jsx)("div", { children: steps.map((step, index) => ((0, jsx_runtime_1.jsx)(TimelineStep, { step: step, isLast: index === steps.length - 1, showTime: showTimeEstimates, onStepClick: onStepClick, onStartStep: onStartStep }, String(step.skill.id)))) })), viewMode === 'list' && ((0, jsx_runtime_1.jsx)("div", { children: steps.map((step) => ((0, jsx_runtime_1.jsx)(ListStep, { step: step, showTime: showTimeEstimates, onStepClick: onStepClick, onStartStep: onStartStep }, String(step.skill.id)))) })), viewMode === 'cards' && ((0, jsx_runtime_1.jsx)("div", { style: {
263
+ display: 'grid',
264
+ gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))',
265
+ gap: '12px',
266
+ }, children: steps.map((step) => ((0, jsx_runtime_1.jsxs)("div", { style: {
267
+ padding: '16px',
268
+ backgroundColor: step.status === 'current' ? '#eff6ff' : '#ffffff',
269
+ border: `1px solid ${step.status === 'current' ? '#bfdbfe' : '#e5e7eb'}`,
270
+ borderRadius: '8px',
271
+ cursor: onStepClick ? 'pointer' : 'default',
272
+ }, onClick: () => onStepClick?.(step), children: [(0, jsx_runtime_1.jsxs)("div", { style: {
273
+ display: 'flex',
274
+ justifyContent: 'space-between',
275
+ alignItems: 'center',
276
+ marginBottom: '8px',
277
+ }, children: [(0, jsx_runtime_1.jsx)("span", { style: {
278
+ width: '24px',
279
+ height: '24px',
280
+ borderRadius: '50%',
281
+ backgroundColor: step.status === 'completed'
282
+ ? types_js_1.STATUS_COLORS.mastered
283
+ : '#e5e7eb',
284
+ color: step.status === 'completed' ? '#ffffff' : '#6b7280',
285
+ display: 'flex',
286
+ alignItems: 'center',
287
+ justifyContent: 'center',
288
+ fontSize: '12px',
289
+ fontWeight: 600,
290
+ }, children: step.status === 'completed' ? '✓' : step.stepNumber }), (0, jsx_runtime_1.jsx)("span", { style: {
291
+ fontSize: '11px',
292
+ padding: '2px 6px',
293
+ backgroundColor: types_js_1.DEFAULT_BLOOM_COLORS[step.skill.bloomLevel],
294
+ color: '#ffffff',
295
+ borderRadius: '4px',
296
+ textTransform: 'capitalize',
297
+ }, children: step.skill.bloomLevel })] }), (0, jsx_runtime_1.jsx)("h4", { style: {
298
+ fontSize: '14px',
299
+ fontWeight: 600,
300
+ color: '#1f2937',
301
+ margin: '0 0 4px 0',
302
+ }, children: step.skill.name }), (0, jsx_runtime_1.jsx)("div", { style: { fontSize: '12px', color: '#6b7280' }, children: showTimeEstimates && (0, jsx_runtime_1.jsxs)("span", { children: [step.estimatedMinutes, " min"] }) }), step.status === 'current' && onStartStep && ((0, jsx_runtime_1.jsx)("button", { style: {
303
+ marginTop: '12px',
304
+ width: '100%',
305
+ padding: '8px',
306
+ backgroundColor: '#3b82f6',
307
+ color: '#ffffff',
308
+ border: 'none',
309
+ borderRadius: '6px',
310
+ fontSize: '13px',
311
+ fontWeight: 500,
312
+ cursor: 'pointer',
313
+ }, onClick: (e) => {
314
+ e.stopPropagation();
315
+ onStartStep(step);
316
+ }, children: "Start Now" }))] }, String(step.skill.id)))) }))] }));
317
+ };
318
+ exports.LearningPathView = LearningPathView;
319
+ exports.default = exports.LearningPathView;
320
+ //# sourceMappingURL=LearningPathView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LearningPathView.js","sourceRoot":"","sources":["../../../src/components/LearningPathView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProgressDashboard = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const types_js_1 = require("./types.js");
6
+ const StatCard = ({ label, value, subValue, color }) => {
7
+ const cardStyle = {
8
+ backgroundColor: '#ffffff',
9
+ borderRadius: '12px',
10
+ padding: '16px',
11
+ border: '1px solid #e5e7eb',
12
+ flex: 1,
13
+ minWidth: '120px',
14
+ };
15
+ const labelStyle = {
16
+ fontSize: '12px',
17
+ color: '#6b7280',
18
+ marginBottom: '4px',
19
+ textTransform: 'uppercase',
20
+ letterSpacing: '0.05em',
21
+ };
22
+ const valueStyle = {
23
+ fontSize: '28px',
24
+ fontWeight: 700,
25
+ color: color || '#1f2937',
26
+ lineHeight: 1.2,
27
+ };
28
+ const subValueStyle = {
29
+ fontSize: '12px',
30
+ color: '#9ca3af',
31
+ marginTop: '4px',
32
+ };
33
+ return ((0, jsx_runtime_1.jsxs)("div", { style: cardStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: labelStyle, children: label }), (0, jsx_runtime_1.jsx)("div", { style: valueStyle, children: value }), subValue && (0, jsx_runtime_1.jsx)("div", { style: subValueStyle, children: subValue })] }));
34
+ };
35
+ const BloomProgressBar = ({ progress }) => {
36
+ const containerStyle = {
37
+ backgroundColor: '#ffffff',
38
+ borderRadius: '12px',
39
+ padding: '16px',
40
+ border: '1px solid #e5e7eb',
41
+ };
42
+ const titleStyle = {
43
+ fontSize: '14px',
44
+ fontWeight: 600,
45
+ color: '#374151',
46
+ marginBottom: '16px',
47
+ };
48
+ const rowStyle = {
49
+ display: 'flex',
50
+ alignItems: 'center',
51
+ marginBottom: '12px',
52
+ };
53
+ const labelStyle = {
54
+ width: '80px',
55
+ fontSize: '12px',
56
+ fontWeight: 500,
57
+ textTransform: 'capitalize',
58
+ color: '#374151',
59
+ };
60
+ const barContainerStyle = {
61
+ flex: 1,
62
+ height: '20px',
63
+ backgroundColor: '#e5e7eb',
64
+ borderRadius: '10px',
65
+ overflow: 'hidden',
66
+ marginRight: '12px',
67
+ };
68
+ const valueStyle = {
69
+ width: '60px',
70
+ textAlign: 'right',
71
+ fontSize: '12px',
72
+ color: '#6b7280',
73
+ };
74
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: "Progress by Bloom's Level" }), progress.map((p) => ((0, jsx_runtime_1.jsxs)("div", { style: rowStyle, children: [(0, jsx_runtime_1.jsx)("span", { style: labelStyle, children: p.level }), (0, jsx_runtime_1.jsx)("div", { style: barContainerStyle, children: (0, jsx_runtime_1.jsx)("div", { style: {
75
+ height: '100%',
76
+ width: `${p.percentage}%`,
77
+ backgroundColor: types_js_1.DEFAULT_BLOOM_COLORS[p.level],
78
+ borderRadius: '10px',
79
+ transition: 'width 0.3s ease',
80
+ } }) }), (0, jsx_runtime_1.jsxs)("span", { style: valueStyle, children: [p.mastered, "/", p.total] })] }, p.level)))] }));
81
+ };
82
+ const ActivityFeed = ({ activities, onSkillClick }) => {
83
+ const containerStyle = {
84
+ backgroundColor: '#ffffff',
85
+ borderRadius: '12px',
86
+ padding: '16px',
87
+ border: '1px solid #e5e7eb',
88
+ };
89
+ const titleStyle = {
90
+ fontSize: '14px',
91
+ fontWeight: 600,
92
+ color: '#374151',
93
+ marginBottom: '16px',
94
+ };
95
+ const itemStyle = {
96
+ display: 'flex',
97
+ alignItems: 'flex-start',
98
+ padding: '10px 0',
99
+ borderBottom: '1px solid #f3f4f6',
100
+ cursor: 'pointer',
101
+ };
102
+ const iconStyle = (type) => ({
103
+ width: '32px',
104
+ height: '32px',
105
+ borderRadius: '50%',
106
+ backgroundColor: type === 'mastered'
107
+ ? '#dcfce7'
108
+ : type === 'practiced'
109
+ ? '#dbeafe'
110
+ : type === 'started'
111
+ ? '#fef3c7'
112
+ : '#f3e8ff',
113
+ color: type === 'mastered'
114
+ ? types_js_1.STATUS_COLORS.mastered
115
+ : type === 'practiced'
116
+ ? types_js_1.STATUS_COLORS.available
117
+ : type === 'started'
118
+ ? '#f59e0b'
119
+ : '#a855f7',
120
+ display: 'flex',
121
+ alignItems: 'center',
122
+ justifyContent: 'center',
123
+ fontSize: '14px',
124
+ marginRight: '12px',
125
+ flexShrink: 0,
126
+ });
127
+ const getIcon = (type) => {
128
+ switch (type) {
129
+ case 'mastered':
130
+ return '★';
131
+ case 'practiced':
132
+ return '✓';
133
+ case 'started':
134
+ return '→';
135
+ case 'reviewed':
136
+ return '↻';
137
+ default:
138
+ return '•';
139
+ }
140
+ };
141
+ const formatTime = (date) => {
142
+ const now = new Date();
143
+ const diff = now.getTime() - date.getTime();
144
+ const minutes = Math.floor(diff / 60000);
145
+ const hours = Math.floor(diff / 3600000);
146
+ const days = Math.floor(diff / 86400000);
147
+ if (minutes < 1)
148
+ return 'Just now';
149
+ if (minutes < 60)
150
+ return `${minutes}m ago`;
151
+ if (hours < 24)
152
+ return `${hours}h ago`;
153
+ if (days < 7)
154
+ return `${days}d ago`;
155
+ return date.toLocaleDateString();
156
+ };
157
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: "Recent Activity" }), activities.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { style: { color: '#9ca3af', fontSize: '14px', textAlign: 'center', padding: '20px' }, children: "No recent activity" })) : (activities.map((activity, index) => ((0, jsx_runtime_1.jsxs)("div", { style: itemStyle, onClick: () => onSkillClick?.(activity.skill), children: [(0, jsx_runtime_1.jsx)("div", { style: iconStyle(activity.type), children: getIcon(activity.type) }), (0, jsx_runtime_1.jsxs)("div", { style: { flex: 1 }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '13px', fontWeight: 500, color: '#1f2937' }, children: [activity.type === 'mastered' && 'Mastered ', activity.type === 'practiced' && 'Practiced ', activity.type === 'started' && 'Started ', activity.type === 'reviewed' && 'Reviewed ', (0, jsx_runtime_1.jsx)("span", { style: { color: '#3b82f6' }, children: activity.skill.name })] }), (0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '11px', color: '#9ca3af', marginTop: '2px' }, children: [formatTime(activity.timestamp), activity.duration && ` • ${activity.duration} min`, activity.result && ` • ${activity.result.correct}/${activity.result.total} correct`] })] })] }, index))))] }));
158
+ };
159
+ const SkillList = ({ title, skills, emptyMessage, onSkillClick, actionLabel, onAction, }) => {
160
+ const containerStyle = {
161
+ backgroundColor: '#ffffff',
162
+ borderRadius: '12px',
163
+ padding: '16px',
164
+ border: '1px solid #e5e7eb',
165
+ };
166
+ const headerStyle = {
167
+ display: 'flex',
168
+ justifyContent: 'space-between',
169
+ alignItems: 'center',
170
+ marginBottom: '12px',
171
+ };
172
+ const titleStyle = {
173
+ fontSize: '14px',
174
+ fontWeight: 600,
175
+ color: '#374151',
176
+ };
177
+ const actionStyle = {
178
+ fontSize: '12px',
179
+ color: '#3b82f6',
180
+ cursor: 'pointer',
181
+ fontWeight: 500,
182
+ };
183
+ const itemStyle = {
184
+ display: 'flex',
185
+ alignItems: 'center',
186
+ padding: '8px 0',
187
+ borderBottom: '1px solid #f3f4f6',
188
+ cursor: onSkillClick ? 'pointer' : 'default',
189
+ };
190
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: headerStyle, children: [(0, jsx_runtime_1.jsx)("span", { style: titleStyle, children: title }), actionLabel && onAction && ((0, jsx_runtime_1.jsx)("span", { style: actionStyle, onClick: onAction, children: actionLabel }))] }), skills.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { style: { color: '#9ca3af', fontSize: '14px', textAlign: 'center', padding: '20px' }, children: emptyMessage })) : (skills.slice(0, 5).map((skill) => ((0, jsx_runtime_1.jsxs)("div", { style: itemStyle, onClick: () => onSkillClick?.(skill), children: [(0, jsx_runtime_1.jsx)("span", { style: {
191
+ width: '8px',
192
+ height: '8px',
193
+ borderRadius: '50%',
194
+ backgroundColor: types_js_1.DEFAULT_BLOOM_COLORS[skill.bloomLevel],
195
+ marginRight: '10px',
196
+ } }), (0, jsx_runtime_1.jsxs)("div", { style: { flex: 1 }, children: [(0, jsx_runtime_1.jsx)("div", { style: { fontSize: '13px', fontWeight: 500, color: '#1f2937' }, children: skill.name }), (0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '11px', color: '#9ca3af' }, children: [skill.estimatedMinutes, " min"] })] })] }, String(skill.id)))))] }));
197
+ };
198
+ const GoalsList = ({ goals }) => {
199
+ const containerStyle = {
200
+ backgroundColor: '#ffffff',
201
+ borderRadius: '12px',
202
+ padding: '16px',
203
+ border: '1px solid #e5e7eb',
204
+ };
205
+ const titleStyle = {
206
+ fontSize: '14px',
207
+ fontWeight: 600,
208
+ color: '#374151',
209
+ marginBottom: '12px',
210
+ };
211
+ const goalStyle = {
212
+ padding: '12px 0',
213
+ borderBottom: '1px solid #f3f4f6',
214
+ };
215
+ const formatDeadline = (date) => {
216
+ const now = new Date();
217
+ const diff = date.getTime() - now.getTime();
218
+ const days = Math.ceil(diff / 86400000);
219
+ if (days < 0)
220
+ return 'Overdue';
221
+ if (days === 0)
222
+ return 'Due today';
223
+ if (days === 1)
224
+ return 'Due tomorrow';
225
+ if (days < 7)
226
+ return `${days} days left`;
227
+ return date.toLocaleDateString();
228
+ };
229
+ return ((0, jsx_runtime_1.jsxs)("div", { style: containerStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: "Learning Goals" }), goals.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { style: { color: '#9ca3af', fontSize: '14px', textAlign: 'center', padding: '20px' }, children: "No active goals" })) : (goals.map((goal, index) => ((0, jsx_runtime_1.jsxs)("div", { style: goalStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
230
+ display: 'flex',
231
+ justifyContent: 'space-between',
232
+ marginBottom: '6px',
233
+ }, children: [(0, jsx_runtime_1.jsx)("span", { style: { fontSize: '13px', fontWeight: 500, color: '#1f2937' }, children: goal.name }), (0, jsx_runtime_1.jsxs)("span", { style: { fontSize: '12px', fontWeight: 600, color: '#3b82f6' }, children: [Math.round(goal.progress * 100), "%"] })] }), (0, jsx_runtime_1.jsx)("div", { style: {
234
+ height: '6px',
235
+ backgroundColor: '#e5e7eb',
236
+ borderRadius: '3px',
237
+ overflow: 'hidden',
238
+ marginBottom: '4px',
239
+ }, children: (0, jsx_runtime_1.jsx)("div", { style: {
240
+ height: '100%',
241
+ width: `${goal.progress * 100}%`,
242
+ backgroundColor: '#3b82f6',
243
+ borderRadius: '3px',
244
+ } }) }), goal.deadline && ((0, jsx_runtime_1.jsx)("div", { style: { fontSize: '11px', color: '#9ca3af' }, children: formatDeadline(goal.deadline) }))] }, index))))] }));
245
+ };
246
+ // ─────────────────────────────────────────────────────────────────────────────
247
+ // Main Component
248
+ // ─────────────────────────────────────────────────────────────────────────────
249
+ /**
250
+ * ProgressDashboard Component
251
+ *
252
+ * Comprehensive dashboard for tracking learning progress.
253
+ *
254
+ * @example
255
+ * ```tsx
256
+ * import { ProgressDashboard } from 'learngraph/components';
257
+ *
258
+ * function Dashboard() {
259
+ * return (
260
+ * <ProgressDashboard
261
+ * stats={{
262
+ * totalSkills: 50,
263
+ * masteredSkills: 15,
264
+ * inProgressSkills: 5,
265
+ * availableSkills: 10,
266
+ * totalLearningTime: 480,
267
+ * averageMastery: 0.72,
268
+ * streakDays: 7,
269
+ * weeklyProgress: 3,
270
+ * }}
271
+ * bloomProgress={[
272
+ * { level: 'remember', total: 10, mastered: 8, percentage: 80 },
273
+ * { level: 'understand', total: 12, mastered: 5, percentage: 42 },
274
+ * // ...
275
+ * ]}
276
+ * recentActivity={activities}
277
+ * dueForReview={reviewSkills}
278
+ * recommendations={recommendedSkills}
279
+ * showDetailedStats
280
+ * showActivityFeed
281
+ * />
282
+ * );
283
+ * }
284
+ * ```
285
+ */
286
+ const ProgressDashboard = ({ stats, bloomProgress, recentActivity, dueForReview = [], recommendations = [], goals = [], showDetailedStats = true, showActivityFeed = true, onSkillClick, onStartReview, className, style, }) => {
287
+ const containerStyle = {
288
+ display: 'flex',
289
+ flexDirection: 'column',
290
+ gap: '20px',
291
+ ...style,
292
+ };
293
+ const statsRowStyle = {
294
+ display: 'flex',
295
+ gap: '12px',
296
+ flexWrap: 'wrap',
297
+ };
298
+ const gridStyle = {
299
+ display: 'grid',
300
+ gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))',
301
+ gap: '16px',
302
+ };
303
+ const progressPercentage = Math.round((stats.masteredSkills / stats.totalSkills) * 100);
304
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: statsRowStyle, children: [(0, jsx_runtime_1.jsx)(StatCard, { label: "Skills Mastered", value: `${stats.masteredSkills}/${stats.totalSkills}`, subValue: `${progressPercentage}% complete`, color: types_js_1.STATUS_COLORS.mastered }), (0, jsx_runtime_1.jsx)(StatCard, { label: "Streak", value: `${stats.streakDays} days`, subValue: stats.streakDays >= 7 ? 'Keep it up!' : 'Build momentum', color: "#f59e0b" }), (0, jsx_runtime_1.jsx)(StatCard, { label: "This Week", value: `+${stats.weeklyProgress}`, subValue: "skills mastered", color: "#3b82f6" }), (0, jsx_runtime_1.jsx)(StatCard, { label: "Learning Time", value: `${Math.round(stats.totalLearningTime / 60)}h`, subValue: `${stats.totalLearningTime} min total` })] }), (0, jsx_runtime_1.jsx)(BloomProgressBar, { progress: bloomProgress }), (0, jsx_runtime_1.jsxs)("div", { style: gridStyle, children: [showActivityFeed && ((0, jsx_runtime_1.jsx)(ActivityFeed, { activities: recentActivity, onSkillClick: onSkillClick })), (0, jsx_runtime_1.jsx)(SkillList, { title: "Due for Review", skills: dueForReview, emptyMessage: "All caught up!", onSkillClick: onSkillClick, actionLabel: dueForReview.length > 0 ? 'Start Review' : undefined, onAction: onStartReview }), (0, jsx_runtime_1.jsx)(SkillList, { title: "Recommended Next", skills: recommendations, emptyMessage: "Complete more skills to unlock recommendations", onSkillClick: onSkillClick }), goals.length > 0 && (0, jsx_runtime_1.jsx)(GoalsList, { goals: goals })] }), showDetailedStats && ((0, jsx_runtime_1.jsxs)("div", { style: statsRowStyle, children: [(0, jsx_runtime_1.jsx)(StatCard, { label: "In Progress", value: stats.inProgressSkills, color: types_js_1.STATUS_COLORS.inProgress }), (0, jsx_runtime_1.jsx)(StatCard, { label: "Available", value: stats.availableSkills, color: types_js_1.STATUS_COLORS.available }), (0, jsx_runtime_1.jsx)(StatCard, { label: "Average Mastery", value: `${Math.round(stats.averageMastery * 100)}%` })] }))] }));
305
+ };
306
+ exports.ProgressDashboard = ProgressDashboard;
307
+ exports.default = exports.ProgressDashboard;
308
+ //# sourceMappingURL=ProgressDashboard.js.map