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,397 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * SkillExplorer Component
4
+ *
5
+ * Interactive skill browser with filtering and search.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { useState, useMemo, useCallback, } from 'react';
10
+ import { DEFAULT_BLOOM_COLORS, STATUS_COLORS } from './types.js';
11
+ const FilterBar = ({ filters, availableTags, onChange, enableSearch, }) => {
12
+ const containerStyle = {
13
+ display: 'flex',
14
+ flexWrap: 'wrap',
15
+ gap: '12px',
16
+ padding: '16px',
17
+ backgroundColor: '#ffffff',
18
+ borderRadius: '12px',
19
+ border: '1px solid #e5e7eb',
20
+ marginBottom: '16px',
21
+ };
22
+ const inputStyle = {
23
+ flex: '1 1 200px',
24
+ padding: '8px 12px',
25
+ border: '1px solid #e5e7eb',
26
+ borderRadius: '8px',
27
+ fontSize: '14px',
28
+ outline: 'none',
29
+ };
30
+ const selectStyle = {
31
+ padding: '8px 12px',
32
+ border: '1px solid #e5e7eb',
33
+ borderRadius: '8px',
34
+ fontSize: '14px',
35
+ backgroundColor: '#ffffff',
36
+ outline: 'none',
37
+ cursor: 'pointer',
38
+ };
39
+ const bloomLevels = [
40
+ 'remember',
41
+ 'understand',
42
+ 'apply',
43
+ 'analyze',
44
+ 'evaluate',
45
+ 'create',
46
+ ];
47
+ return (_jsxs("div", { style: containerStyle, children: [enableSearch && (_jsx("input", { type: "text", placeholder: "Search skills...", value: filters.query || '', onChange: (e) => onChange({ ...filters, query: e.currentTarget.value }), style: inputStyle })), _jsxs("select", { value: filters.bloomLevels?.[0] || '', onChange: (e) => onChange({
48
+ ...filters,
49
+ bloomLevels: e.currentTarget.value ? [e.currentTarget.value] : undefined,
50
+ }), style: selectStyle, children: [_jsx("option", { value: "", children: "All Levels" }), bloomLevels.map((level) => (_jsx("option", { value: level, children: level.charAt(0).toUpperCase() + level.slice(1) }, level)))] }), _jsxs("select", { value: filters.tags?.[0] || '', onChange: (e) => onChange({
51
+ ...filters,
52
+ tags: e.currentTarget.value ? [e.currentTarget.value] : undefined,
53
+ }), style: selectStyle, children: [_jsx("option", { value: "", children: "All Tags" }), availableTags.map((tag) => (_jsx("option", { value: tag, children: tag }, tag)))] }), _jsxs("select", { value: filters.masteryStatus || 'all', onChange: (e) => onChange({
54
+ ...filters,
55
+ masteryStatus: e.currentTarget.value,
56
+ }), style: selectStyle, children: [_jsx("option", { value: "all", children: "All Status" }), _jsx("option", { value: "mastered", children: "Mastered" }), _jsx("option", { value: "available", children: "Available" }), _jsx("option", { value: "locked", children: "Locked" })] }), _jsxs("select", { value: filters.sortBy || 'name', onChange: (e) => onChange({
57
+ ...filters,
58
+ sortBy: e.currentTarget.value,
59
+ }), style: selectStyle, children: [_jsx("option", { value: "name", children: "Sort by Name" }), _jsx("option", { value: "bloomLevel", children: "Sort by Level" }), _jsx("option", { value: "estimatedMinutes", children: "Sort by Time" })] })] }));
60
+ };
61
+ const ViewToggle = ({ viewMode, onChange }) => {
62
+ const containerStyle = {
63
+ display: 'flex',
64
+ gap: '4px',
65
+ padding: '4px',
66
+ backgroundColor: '#f3f4f6',
67
+ borderRadius: '8px',
68
+ };
69
+ const buttonStyle = (isActive) => ({
70
+ padding: '6px 12px',
71
+ backgroundColor: isActive ? '#ffffff' : 'transparent',
72
+ border: 'none',
73
+ borderRadius: '6px',
74
+ fontSize: '12px',
75
+ fontWeight: isActive ? 600 : 400,
76
+ color: isActive ? '#1f2937' : '#6b7280',
77
+ cursor: 'pointer',
78
+ boxShadow: isActive ? '0 1px 2px rgba(0,0,0,0.05)' : 'none',
79
+ transition: 'all 0.15s ease',
80
+ });
81
+ return (_jsxs("div", { style: containerStyle, children: [_jsx("button", { style: buttonStyle(viewMode === 'grid'), onClick: () => onChange('grid'), children: "Grid" }), _jsx("button", { style: buttonStyle(viewMode === 'list'), onClick: () => onChange('list'), children: "List" }), _jsx("button", { style: buttonStyle(viewMode === 'graph'), onClick: () => onChange('graph'), children: "Graph" })] }));
82
+ };
83
+ const GridSkillCard = ({ skill, isMastered, isAvailable, onClick, onSetGoal, }) => {
84
+ const status = isMastered ? 'mastered' : isAvailable ? 'available' : 'locked';
85
+ const statusColor = isMastered
86
+ ? STATUS_COLORS.mastered
87
+ : isAvailable
88
+ ? STATUS_COLORS.available
89
+ : STATUS_COLORS.locked;
90
+ const cardStyle = {
91
+ backgroundColor: '#ffffff',
92
+ borderRadius: '12px',
93
+ border: '1px solid #e5e7eb',
94
+ padding: '16px',
95
+ cursor: 'pointer',
96
+ transition: 'box-shadow 0.2s ease, transform 0.1s ease',
97
+ };
98
+ const headerStyle = {
99
+ display: 'flex',
100
+ justifyContent: 'space-between',
101
+ alignItems: 'flex-start',
102
+ marginBottom: '8px',
103
+ };
104
+ const titleStyle = {
105
+ fontSize: '14px',
106
+ fontWeight: 600,
107
+ color: '#1f2937',
108
+ margin: 0,
109
+ flex: 1,
110
+ };
111
+ const badgeStyle = {
112
+ padding: '2px 8px',
113
+ borderRadius: '9999px',
114
+ fontSize: '10px',
115
+ fontWeight: 500,
116
+ backgroundColor: statusColor,
117
+ color: status === 'locked' ? '#374151' : '#ffffff',
118
+ };
119
+ const descStyle = {
120
+ fontSize: '12px',
121
+ color: '#6b7280',
122
+ lineHeight: 1.5,
123
+ marginBottom: '8px',
124
+ display: '-webkit-box',
125
+ WebkitLineClamp: 2,
126
+ WebkitBoxOrient: 'vertical',
127
+ overflow: 'hidden',
128
+ };
129
+ const metaStyle = {
130
+ display: 'flex',
131
+ justifyContent: 'space-between',
132
+ alignItems: 'center',
133
+ marginTop: '12px',
134
+ paddingTop: '12px',
135
+ borderTop: '1px solid #f3f4f6',
136
+ };
137
+ const levelStyle = {
138
+ padding: '2px 8px',
139
+ borderRadius: '4px',
140
+ fontSize: '11px',
141
+ fontWeight: 500,
142
+ textTransform: 'capitalize',
143
+ backgroundColor: DEFAULT_BLOOM_COLORS[skill.bloomLevel],
144
+ color: '#ffffff',
145
+ };
146
+ const goalButtonStyle = {
147
+ padding: '4px 8px',
148
+ backgroundColor: 'transparent',
149
+ border: '1px solid #e5e7eb',
150
+ borderRadius: '4px',
151
+ fontSize: '11px',
152
+ color: '#6b7280',
153
+ cursor: 'pointer',
154
+ };
155
+ return (_jsxs("div", { style: cardStyle, onClick: onClick, children: [_jsxs("div", { style: headerStyle, children: [_jsx("h4", { style: titleStyle, children: skill.name }), _jsx("span", { style: badgeStyle, children: status.charAt(0).toUpperCase() + status.slice(1) })] }), skill.description && _jsx("p", { style: descStyle, children: skill.description }), _jsx("div", { style: { display: 'flex', gap: '4px', flexWrap: 'wrap' }, children: skill.tags.slice(0, 3).map((tag) => (_jsx("span", { style: {
156
+ padding: '2px 6px',
157
+ backgroundColor: '#f3f4f6',
158
+ borderRadius: '4px',
159
+ fontSize: '10px',
160
+ color: '#6b7280',
161
+ }, children: tag }, tag))) }), _jsxs("div", { style: metaStyle, children: [_jsx("span", { style: levelStyle, children: skill.bloomLevel }), _jsxs("span", { style: { fontSize: '11px', color: '#6b7280' }, children: [skill.estimatedMinutes, " min"] }), onSetGoal && !isMastered && (_jsx("button", { style: goalButtonStyle, onClick: (e) => {
162
+ e.stopPropagation();
163
+ onSetGoal();
164
+ }, children: "Set Goal" }))] })] }));
165
+ };
166
+ const ListSkillRow = ({ skill, isMastered, isAvailable, onClick, }) => {
167
+ const status = isMastered ? 'mastered' : isAvailable ? 'available' : 'locked';
168
+ const statusColor = isMastered
169
+ ? STATUS_COLORS.mastered
170
+ : isAvailable
171
+ ? STATUS_COLORS.available
172
+ : STATUS_COLORS.locked;
173
+ const rowStyle = {
174
+ display: 'flex',
175
+ alignItems: 'center',
176
+ padding: '12px 16px',
177
+ backgroundColor: '#ffffff',
178
+ borderBottom: '1px solid #f3f4f6',
179
+ cursor: 'pointer',
180
+ transition: 'background-color 0.15s ease',
181
+ };
182
+ const statusDotStyle = {
183
+ width: '10px',
184
+ height: '10px',
185
+ borderRadius: '50%',
186
+ backgroundColor: statusColor,
187
+ marginRight: '12px',
188
+ flexShrink: 0,
189
+ };
190
+ const nameStyle = {
191
+ flex: 1,
192
+ fontSize: '14px',
193
+ fontWeight: 500,
194
+ color: '#1f2937',
195
+ };
196
+ const levelStyle = {
197
+ padding: '2px 8px',
198
+ borderRadius: '4px',
199
+ fontSize: '11px',
200
+ fontWeight: 500,
201
+ textTransform: 'capitalize',
202
+ backgroundColor: DEFAULT_BLOOM_COLORS[skill.bloomLevel],
203
+ color: '#ffffff',
204
+ marginRight: '16px',
205
+ };
206
+ const timeStyle = {
207
+ fontSize: '12px',
208
+ color: '#6b7280',
209
+ width: '60px',
210
+ textAlign: 'right',
211
+ };
212
+ return (_jsxs("div", { style: rowStyle, onClick: onClick, children: [_jsx("div", { style: statusDotStyle }), _jsx("span", { style: nameStyle, children: skill.name }), _jsx("span", { style: levelStyle, children: skill.bloomLevel }), _jsxs("span", { style: timeStyle, children: [skill.estimatedMinutes, " min"] })] }));
213
+ };
214
+ // ─────────────────────────────────────────────────────────────────────────────
215
+ // Main Component
216
+ // ─────────────────────────────────────────────────────────────────────────────
217
+ /**
218
+ * SkillExplorer Component
219
+ *
220
+ * Interactive browser for exploring and filtering skills.
221
+ *
222
+ * @example
223
+ * ```tsx
224
+ * import { SkillExplorer } from 'learngraph/components';
225
+ *
226
+ * function CurriculumBrowser() {
227
+ * const { skills, edges } = useLearnGraph();
228
+ *
229
+ * return (
230
+ * <SkillExplorer
231
+ * skills={skills}
232
+ * edges={edges}
233
+ * masteredSkillIds={['skill-1', 'skill-2']}
234
+ * viewMode="grid"
235
+ * enableSearch
236
+ * enableFilters
237
+ * onSkillSelect={(skill) => navigate(`/skill/${skill.id}`)}
238
+ * onSetGoal={(skill) => setLearningGoal(skill.id)}
239
+ * />
240
+ * );
241
+ * }
242
+ * ```
243
+ */
244
+ export const SkillExplorer = ({ skills, edges, masteredSkillIds = [], availableTags: providedTags, initialFilters = {}, viewMode: initialViewMode = 'grid', onFiltersChange, onSkillSelect, onSetGoal, enableSearch = true, enableFilters = true, enableViewToggle = true, className, style, }) => {
245
+ const [filters, setFilters] = useState(initialFilters);
246
+ const [viewMode, setViewMode] = useState(initialViewMode);
247
+ const masteredSet = useMemo(() => new Set(masteredSkillIds), [masteredSkillIds]);
248
+ // Build prerequisite map
249
+ const prereqMap = useMemo(() => {
250
+ const map = new Map();
251
+ for (const edge of edges) {
252
+ const targetId = String(edge.targetId);
253
+ const sourceId = String(edge.sourceId);
254
+ if (!map.has(targetId)) {
255
+ map.set(targetId, new Set());
256
+ }
257
+ map.get(targetId).add(sourceId);
258
+ }
259
+ return map;
260
+ }, [edges]);
261
+ // Check if skill is available
262
+ const isAvailable = useCallback((skillId) => {
263
+ if (masteredSet.has(skillId))
264
+ return false;
265
+ const prereqs = prereqMap.get(skillId);
266
+ if (!prereqs || prereqs.size === 0)
267
+ return true;
268
+ return Array.from(prereqs).every((id) => masteredSet.has(id));
269
+ }, [prereqMap, masteredSet]);
270
+ // Collect available tags
271
+ const availableTags = useMemo(() => {
272
+ if (providedTags)
273
+ return providedTags;
274
+ const tagSet = new Set();
275
+ for (const skill of skills) {
276
+ for (const tag of skill.tags) {
277
+ tagSet.add(tag);
278
+ }
279
+ }
280
+ return Array.from(tagSet).sort();
281
+ }, [skills, providedTags]);
282
+ // Filter and sort skills
283
+ const filteredSkills = useMemo(() => {
284
+ let result = [...skills];
285
+ // Text search
286
+ if (filters.query) {
287
+ const lowerQuery = filters.query.toLowerCase();
288
+ result = result.filter((skill) => skill.name.toLowerCase().includes(lowerQuery) ||
289
+ (skill.description?.toLowerCase().includes(lowerQuery) ?? false) ||
290
+ skill.tags.some((tag) => tag.toLowerCase().includes(lowerQuery)));
291
+ }
292
+ // Bloom level filter
293
+ if (filters.bloomLevels && filters.bloomLevels.length > 0) {
294
+ result = result.filter((skill) => filters.bloomLevels.includes(skill.bloomLevel));
295
+ }
296
+ // Tag filter
297
+ if (filters.tags && filters.tags.length > 0) {
298
+ result = result.filter((skill) => skill.tags.some((tag) => filters.tags.includes(tag)));
299
+ }
300
+ // Mastery status filter
301
+ if (filters.masteryStatus && filters.masteryStatus !== 'all') {
302
+ result = result.filter((skill) => {
303
+ const skillId = String(skill.id);
304
+ const isMastered = masteredSet.has(skillId);
305
+ const available = isAvailable(skillId);
306
+ switch (filters.masteryStatus) {
307
+ case 'mastered':
308
+ return isMastered;
309
+ case 'available':
310
+ return !isMastered && available;
311
+ case 'locked':
312
+ return !isMastered && !available;
313
+ default:
314
+ return true;
315
+ }
316
+ });
317
+ }
318
+ // Sort
319
+ const sortBy = filters.sortBy || 'name';
320
+ const sortDir = filters.sortDirection || 'asc';
321
+ result.sort((a, b) => {
322
+ let comparison = 0;
323
+ switch (sortBy) {
324
+ case 'name':
325
+ comparison = a.name.localeCompare(b.name);
326
+ break;
327
+ case 'bloomLevel':
328
+ const levels = [
329
+ 'remember',
330
+ 'understand',
331
+ 'apply',
332
+ 'analyze',
333
+ 'evaluate',
334
+ 'create',
335
+ ];
336
+ comparison =
337
+ levels.indexOf(a.bloomLevel) - levels.indexOf(b.bloomLevel);
338
+ break;
339
+ case 'estimatedMinutes':
340
+ comparison = a.estimatedMinutes - b.estimatedMinutes;
341
+ break;
342
+ }
343
+ return sortDir === 'desc' ? -comparison : comparison;
344
+ });
345
+ return result;
346
+ }, [skills, filters, masteredSet, isAvailable]);
347
+ const handleFiltersChange = useCallback((newFilters) => {
348
+ setFilters(newFilters);
349
+ onFiltersChange?.(newFilters);
350
+ }, [onFiltersChange]);
351
+ const containerStyle = {
352
+ ...style,
353
+ };
354
+ const headerStyle = {
355
+ display: 'flex',
356
+ justifyContent: 'space-between',
357
+ alignItems: 'center',
358
+ marginBottom: '16px',
359
+ };
360
+ const countStyle = {
361
+ fontSize: '14px',
362
+ color: '#6b7280',
363
+ };
364
+ const gridStyle = {
365
+ display: 'grid',
366
+ gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',
367
+ gap: '16px',
368
+ };
369
+ const listStyle = {
370
+ backgroundColor: '#ffffff',
371
+ borderRadius: '12px',
372
+ border: '1px solid #e5e7eb',
373
+ overflow: 'hidden',
374
+ };
375
+ return (_jsxs("div", { className: className, style: containerStyle, children: [enableFilters && (_jsx(FilterBar, { filters: filters, availableTags: availableTags, onChange: handleFiltersChange, enableSearch: enableSearch })), _jsxs("div", { style: headerStyle, children: [_jsxs("span", { style: countStyle, children: ["Showing ", filteredSkills.length, " of ", skills.length, " skills"] }), enableViewToggle && (_jsx(ViewToggle, { viewMode: viewMode, onChange: setViewMode }))] }), viewMode === 'grid' && (_jsx("div", { style: gridStyle, children: filteredSkills.map((skill) => (_jsx(GridSkillCard, { skill: skill, isMastered: masteredSet.has(String(skill.id)), isAvailable: isAvailable(String(skill.id)), onClick: () => onSkillSelect?.(skill), onSetGoal: onSetGoal ? () => onSetGoal(skill) : undefined }, String(skill.id)))) })), viewMode === 'list' && (_jsx("div", { style: listStyle, children: filteredSkills.map((skill) => (_jsx(ListSkillRow, { skill: skill, isMastered: masteredSet.has(String(skill.id)), isAvailable: isAvailable(String(skill.id)), onClick: () => onSkillSelect?.(skill) }, String(skill.id)))) })), viewMode === 'graph' && (_jsxs("div", { style: {
376
+ padding: '40px',
377
+ textAlign: 'center',
378
+ color: '#6b7280',
379
+ backgroundColor: '#f9fafb',
380
+ borderRadius: '12px',
381
+ border: '1px solid #e5e7eb',
382
+ }, children: [_jsx("p", { children: "Graph view requires the SkillGraph component." }), _jsx("p", { style: { fontSize: '12px' }, children: "Use the SkillGraph component directly for graph visualization." })] })), filteredSkills.length === 0 && (_jsxs("div", { style: {
383
+ padding: '40px',
384
+ textAlign: 'center',
385
+ color: '#6b7280',
386
+ }, children: [_jsx("p", { children: "No skills match your filters." }), _jsx("button", { style: {
387
+ marginTop: '12px',
388
+ padding: '8px 16px',
389
+ backgroundColor: '#3b82f6',
390
+ color: '#ffffff',
391
+ border: 'none',
392
+ borderRadius: '6px',
393
+ cursor: 'pointer',
394
+ }, onClick: () => handleFiltersChange({}), children: "Clear Filters" })] }))] }));
395
+ };
396
+ export default SkillExplorer;
397
+ //# sourceMappingURL=SkillExplorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillExplorer.js","sourceRoot":"","sources":["../../../src/components/SkillExplorer.tsx"],"names":[],"mappings":"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"}