@burdenoff/microfe-buildmyiq 2026.509.101

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 (182) hide show
  1. package/README.md +12 -0
  2. package/dist/buildmyiq/BuildMyIQRoot.d.ts +5 -0
  3. package/dist/buildmyiq/BuildMyIQRoot.d.ts.map +1 -0
  4. package/dist/buildmyiq/BuildMyIQRoot.js +329 -0
  5. package/dist/buildmyiq/BuildMyIQRoot.js.map +1 -0
  6. package/dist/buildmyiq/BuildMyIQRoutes.d.ts +2 -0
  7. package/dist/buildmyiq/BuildMyIQRoutes.d.ts.map +1 -0
  8. package/dist/buildmyiq/BuildMyIQRoutes.js +171 -0
  9. package/dist/buildmyiq/BuildMyIQRoutes.js.map +1 -0
  10. package/dist/buildmyiq/index.d.ts +5 -0
  11. package/dist/buildmyiq/index.d.ts.map +1 -0
  12. package/dist/buildmyiq/index.js +3 -0
  13. package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.d.ts +2 -0
  14. package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.d.ts.map +1 -0
  15. package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.js +271 -0
  16. package/dist/buildmyiq/pages/AdminAdminAnalyticsPagePage.js.map +1 -0
  17. package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.d.ts +2 -0
  18. package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.d.ts.map +1 -0
  19. package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.js +212 -0
  20. package/dist/buildmyiq/pages/AdminAdminCoursesPagePage.js.map +1 -0
  21. package/dist/buildmyiq/pages/AdminAdminUsersPagePage.d.ts +2 -0
  22. package/dist/buildmyiq/pages/AdminAdminUsersPagePage.d.ts.map +1 -0
  23. package/dist/buildmyiq/pages/AdminAdminUsersPagePage.js +235 -0
  24. package/dist/buildmyiq/pages/AdminAdminUsersPagePage.js.map +1 -0
  25. package/dist/buildmyiq/pages/AdminIndexPage.d.ts +2 -0
  26. package/dist/buildmyiq/pages/AdminIndexPage.d.ts.map +1 -0
  27. package/dist/buildmyiq/pages/AdminIndexPage.js +274 -0
  28. package/dist/buildmyiq/pages/AdminIndexPage.js.map +1 -0
  29. package/dist/buildmyiq/pages/AiAichatPagePage.d.ts +2 -0
  30. package/dist/buildmyiq/pages/AiAichatPagePage.d.ts.map +1 -0
  31. package/dist/buildmyiq/pages/AiAichatPagePage.js +209 -0
  32. package/dist/buildmyiq/pages/AiAichatPagePage.js.map +1 -0
  33. package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.d.ts +2 -0
  34. package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.d.ts.map +1 -0
  35. package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.js +318 -0
  36. package/dist/buildmyiq/pages/AiAicontentGenerationPagePage.js.map +1 -0
  37. package/dist/buildmyiq/pages/AiAitutoringPagePage.d.ts +2 -0
  38. package/dist/buildmyiq/pages/AiAitutoringPagePage.d.ts.map +1 -0
  39. package/dist/buildmyiq/pages/AiAitutoringPagePage.js +290 -0
  40. package/dist/buildmyiq/pages/AiAitutoringPagePage.js.map +1 -0
  41. package/dist/buildmyiq/pages/AiIndexPage.d.ts +2 -0
  42. package/dist/buildmyiq/pages/AiIndexPage.d.ts.map +1 -0
  43. package/dist/buildmyiq/pages/AiIndexPage.js +191 -0
  44. package/dist/buildmyiq/pages/AiIndexPage.js.map +1 -0
  45. package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.d.ts +2 -0
  46. package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.d.ts.map +1 -0
  47. package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.js +290 -0
  48. package/dist/buildmyiq/pages/AssessmentsAssessmentBuilderPagePage.js.map +1 -0
  49. package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.d.ts +2 -0
  50. package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.d.ts.map +1 -0
  51. package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.js +215 -0
  52. package/dist/buildmyiq/pages/AssessmentsAssessmentGradingPagePage.js.map +1 -0
  53. package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.d.ts +2 -0
  54. package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.d.ts.map +1 -0
  55. package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.js +224 -0
  56. package/dist/buildmyiq/pages/AssessmentsAssessmentResultsPagePage.js.map +1 -0
  57. package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.d.ts +2 -0
  58. package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.d.ts.map +1 -0
  59. package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.js +174 -0
  60. package/dist/buildmyiq/pages/AssessmentsAssessmentTakePagePage.js.map +1 -0
  61. package/dist/buildmyiq/pages/AssessmentsIndexPage.d.ts +2 -0
  62. package/dist/buildmyiq/pages/AssessmentsIndexPage.d.ts.map +1 -0
  63. package/dist/buildmyiq/pages/AssessmentsIndexPage.js +174 -0
  64. package/dist/buildmyiq/pages/AssessmentsIndexPage.js.map +1 -0
  65. package/dist/buildmyiq/pages/CalendarPage.d.ts +2 -0
  66. package/dist/buildmyiq/pages/CalendarPage.d.ts.map +1 -0
  67. package/dist/buildmyiq/pages/CalendarPage.js +242 -0
  68. package/dist/buildmyiq/pages/CalendarPage.js.map +1 -0
  69. package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.d.ts +2 -0
  70. package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.d.ts.map +1 -0
  71. package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.js +180 -0
  72. package/dist/buildmyiq/pages/CommunicationAnnouncementsPagePage.js.map +1 -0
  73. package/dist/buildmyiq/pages/CommunicationForumsPagePage.d.ts +2 -0
  74. package/dist/buildmyiq/pages/CommunicationForumsPagePage.d.ts.map +1 -0
  75. package/dist/buildmyiq/pages/CommunicationForumsPagePage.js +154 -0
  76. package/dist/buildmyiq/pages/CommunicationForumsPagePage.js.map +1 -0
  77. package/dist/buildmyiq/pages/CommunicationIndexPage.d.ts +2 -0
  78. package/dist/buildmyiq/pages/CommunicationIndexPage.d.ts.map +1 -0
  79. package/dist/buildmyiq/pages/CommunicationIndexPage.js +191 -0
  80. package/dist/buildmyiq/pages/CommunicationIndexPage.js.map +1 -0
  81. package/dist/buildmyiq/pages/CommunicationMessagesPagePage.d.ts +2 -0
  82. package/dist/buildmyiq/pages/CommunicationMessagesPagePage.d.ts.map +1 -0
  83. package/dist/buildmyiq/pages/CommunicationMessagesPagePage.js +261 -0
  84. package/dist/buildmyiq/pages/CommunicationMessagesPagePage.js.map +1 -0
  85. package/dist/buildmyiq/pages/CoursesCourseContentPagePage.d.ts +2 -0
  86. package/dist/buildmyiq/pages/CoursesCourseContentPagePage.d.ts.map +1 -0
  87. package/dist/buildmyiq/pages/CoursesCourseContentPagePage.js +164 -0
  88. package/dist/buildmyiq/pages/CoursesCourseContentPagePage.js.map +1 -0
  89. package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.d.ts +2 -0
  90. package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.d.ts.map +1 -0
  91. package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.js +239 -0
  92. package/dist/buildmyiq/pages/CoursesCourseCreatePagePage.js.map +1 -0
  93. package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.d.ts +2 -0
  94. package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.d.ts.map +1 -0
  95. package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.js +368 -0
  96. package/dist/buildmyiq/pages/CoursesCourseDashboardPagePage.js.map +1 -0
  97. package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.d.ts +2 -0
  98. package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.d.ts.map +1 -0
  99. package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.js +219 -0
  100. package/dist/buildmyiq/pages/CoursesCourseDetailPagePage.js.map +1 -0
  101. package/dist/buildmyiq/pages/CoursesCourseListPagePage.d.ts +2 -0
  102. package/dist/buildmyiq/pages/CoursesCourseListPagePage.d.ts.map +1 -0
  103. package/dist/buildmyiq/pages/CoursesCourseListPagePage.js +153 -0
  104. package/dist/buildmyiq/pages/CoursesCourseListPagePage.js.map +1 -0
  105. package/dist/buildmyiq/pages/CoursesIndexPage.d.ts +2 -0
  106. package/dist/buildmyiq/pages/CoursesIndexPage.d.ts.map +1 -0
  107. package/dist/buildmyiq/pages/CoursesIndexPage.js +138 -0
  108. package/dist/buildmyiq/pages/CoursesIndexPage.js.map +1 -0
  109. package/dist/buildmyiq/pages/DashboardPage.d.ts +2 -0
  110. package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -0
  111. package/dist/buildmyiq/pages/DashboardPage.js +264 -0
  112. package/dist/buildmyiq/pages/DashboardPage.js.map +1 -0
  113. package/dist/buildmyiq/pages/MessagesPage.d.ts +2 -0
  114. package/dist/buildmyiq/pages/MessagesPage.d.ts.map +1 -0
  115. package/dist/buildmyiq/pages/MessagesPage.js +261 -0
  116. package/dist/buildmyiq/pages/MessagesPage.js.map +1 -0
  117. package/dist/buildmyiq/pages/ProfileProgressPage.d.ts +2 -0
  118. package/dist/buildmyiq/pages/ProfileProgressPage.d.ts.map +1 -0
  119. package/dist/buildmyiq/pages/ProfileProgressPage.js +194 -0
  120. package/dist/buildmyiq/pages/ProfileProgressPage.js.map +1 -0
  121. package/dist/buildmyiq/pages/TeachingAnalyticsPage.d.ts +2 -0
  122. package/dist/buildmyiq/pages/TeachingAnalyticsPage.d.ts.map +1 -0
  123. package/dist/buildmyiq/pages/TeachingAnalyticsPage.js +243 -0
  124. package/dist/buildmyiq/pages/TeachingAnalyticsPage.js.map +1 -0
  125. package/dist/buildmyiq/pages/TeachingContentPage.d.ts +2 -0
  126. package/dist/buildmyiq/pages/TeachingContentPage.d.ts.map +1 -0
  127. package/dist/buildmyiq/pages/TeachingContentPage.js +165 -0
  128. package/dist/buildmyiq/pages/TeachingContentPage.js.map +1 -0
  129. package/dist/buildmyiq/pages/TeachingCoursesPage.d.ts +2 -0
  130. package/dist/buildmyiq/pages/TeachingCoursesPage.d.ts.map +1 -0
  131. package/dist/buildmyiq/pages/TeachingCoursesPage.js +151 -0
  132. package/dist/buildmyiq/pages/TeachingCoursesPage.js.map +1 -0
  133. package/dist/buildmyiq/pages/TeachingGradingPage.d.ts +2 -0
  134. package/dist/buildmyiq/pages/TeachingGradingPage.d.ts.map +1 -0
  135. package/dist/buildmyiq/pages/TeachingGradingPage.js +204 -0
  136. package/dist/buildmyiq/pages/TeachingGradingPage.js.map +1 -0
  137. package/dist/buildmyiq/pages/TeachingIndexPage.d.ts +2 -0
  138. package/dist/buildmyiq/pages/TeachingIndexPage.d.ts.map +1 -0
  139. package/dist/buildmyiq/pages/TeachingIndexPage.js +220 -0
  140. package/dist/buildmyiq/pages/TeachingIndexPage.js.map +1 -0
  141. package/dist/buildmyiq/pages/TeachingLessonPlansPage.d.ts +2 -0
  142. package/dist/buildmyiq/pages/TeachingLessonPlansPage.d.ts.map +1 -0
  143. package/dist/buildmyiq/pages/TeachingLessonPlansPage.js +157 -0
  144. package/dist/buildmyiq/pages/TeachingLessonPlansPage.js.map +1 -0
  145. package/dist/buildmyiq/pages/TeachingQuestionsPage.d.ts +2 -0
  146. package/dist/buildmyiq/pages/TeachingQuestionsPage.d.ts.map +1 -0
  147. package/dist/buildmyiq/pages/TeachingQuestionsPage.js +184 -0
  148. package/dist/buildmyiq/pages/TeachingQuestionsPage.js.map +1 -0
  149. package/dist/buildmyiq/pages/TeachingStudentsPage.d.ts +2 -0
  150. package/dist/buildmyiq/pages/TeachingStudentsPage.d.ts.map +1 -0
  151. package/dist/buildmyiq/pages/TeachingStudentsPage.js +204 -0
  152. package/dist/buildmyiq/pages/TeachingStudentsPage.js.map +1 -0
  153. package/dist/buildmyiq/providers/BuildMyIQProvider.d.ts +6 -0
  154. package/dist/buildmyiq/providers/BuildMyIQProvider.d.ts.map +1 -0
  155. package/dist/buildmyiq/providers/BuildMyIQProvider.js +27 -0
  156. package/dist/buildmyiq/providers/BuildMyIQProvider.js.map +1 -0
  157. package/dist/buildmyiq/store/buildmyiqStore.d.ts +189 -0
  158. package/dist/buildmyiq/store/buildmyiqStore.d.ts.map +1 -0
  159. package/dist/buildmyiq/store/buildmyiqStore.js +1160 -0
  160. package/dist/buildmyiq/store/buildmyiqStore.js.map +1 -0
  161. package/dist/buildmyiq/types/index.d.ts +51 -0
  162. package/dist/buildmyiq/types/index.d.ts.map +1 -0
  163. package/dist/buildmyiq/utils/cn.d.ts +4 -0
  164. package/dist/buildmyiq/utils/cn.d.ts.map +1 -0
  165. package/dist/buildmyiq/utils/navigation.d.ts +2 -0
  166. package/dist/buildmyiq/utils/navigation.d.ts.map +1 -0
  167. package/dist/buildmyiq/utils/navigation.js +8 -0
  168. package/dist/buildmyiq/utils/navigation.js.map +1 -0
  169. package/dist/dev/main.d.ts +2 -0
  170. package/dist/dev/main.d.ts.map +1 -0
  171. package/dist/generated/global-operations.d.ts +2 -0
  172. package/dist/generated/global-operations.d.ts.map +1 -0
  173. package/dist/generated/global-types.d.ts +18199 -0
  174. package/dist/generated/global-types.d.ts.map +1 -0
  175. package/dist/generated/wspace-operations.d.ts +2 -0
  176. package/dist/generated/wspace-operations.d.ts.map +1 -0
  177. package/dist/generated/wspace-types.d.ts +43046 -0
  178. package/dist/generated/wspace-types.d.ts.map +1 -0
  179. package/dist/index.d.ts +2 -0
  180. package/dist/index.d.ts.map +1 -0
  181. package/dist/index.js +5 -0
  182. package/package.json +107 -0
@@ -0,0 +1,271 @@
1
+ import { useBuildMyIQStore as e } from "../store/buildmyiqStore.js";
2
+ import { Clock as t, DollarSign as n, GraduationCap as r, Users as i } from "lucide-react";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { Badge as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d } from "@burdenoff/fe-libs/ui";
5
+ //#region src/buildmyiq/pages/AdminAdminAnalyticsPagePage.tsx
6
+ function f() {
7
+ let { courses: f, students: p, grades: m, assessments: h } = e(), g = f.reduce((e, t) => e + t.students, 0), _ = m.filter((e) => e.status === "graded").reduce((e, t, n, r) => e + t.score / t.maxScore * 100 / r.length, 0), v = f.reduce((e, t) => e + t.price * t.students, 0), y = [
8
+ {
9
+ grade: "A",
10
+ count: m.filter((e) => e.grade.startsWith("A")).length,
11
+ color: "bg-green-500"
12
+ },
13
+ {
14
+ grade: "B",
15
+ count: m.filter((e) => e.grade.startsWith("B")).length,
16
+ color: "bg-blue-500"
17
+ },
18
+ {
19
+ grade: "C",
20
+ count: m.filter((e) => e.grade.startsWith("C")).length,
21
+ color: "bg-yellow-500"
22
+ },
23
+ {
24
+ grade: "D",
25
+ count: m.filter((e) => e.grade.startsWith("D")).length,
26
+ color: "bg-orange-500"
27
+ },
28
+ {
29
+ grade: "F",
30
+ count: m.filter((e) => e.grade.startsWith("F")).length,
31
+ color: "bg-red-500"
32
+ }
33
+ ], b = Math.max(...y.map((e) => e.count), 1);
34
+ return /* @__PURE__ */ o("div", {
35
+ className: "space-y-6 p-6",
36
+ children: [
37
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
38
+ className: "text-2xl font-semibold",
39
+ children: "Platform Analytics"
40
+ }), /* @__PURE__ */ a("p", {
41
+ className: "text-sm text-muted-foreground",
42
+ children: "Comprehensive insights into platform performance and usage"
43
+ })] }),
44
+ /* @__PURE__ */ a("div", {
45
+ className: "grid grid-cols-1 md:grid-cols-4 gap-4",
46
+ children: [
47
+ {
48
+ label: "Daily Active Users",
49
+ value: "487",
50
+ icon: i,
51
+ color: "text-blue-600",
52
+ trend: "+12.3%"
53
+ },
54
+ {
55
+ label: "Course Completions",
56
+ value: "156",
57
+ icon: r,
58
+ color: "text-green-600",
59
+ trend: "+8.7%"
60
+ },
61
+ {
62
+ label: "Avg. Session Time",
63
+ value: "24 min",
64
+ icon: t,
65
+ color: "text-purple-600",
66
+ trend: "+3.1%"
67
+ },
68
+ {
69
+ label: "Monthly Revenue",
70
+ value: `$${(v / 12).toFixed(0)}`,
71
+ icon: n,
72
+ color: "text-orange-600",
73
+ trend: "+15.2%"
74
+ }
75
+ ].map((e) => /* @__PURE__ */ a(c, { children: /* @__PURE__ */ a(l, {
76
+ className: "pt-6",
77
+ children: /* @__PURE__ */ o("div", {
78
+ className: "flex items-center gap-3",
79
+ children: [/* @__PURE__ */ a(e.icon, { className: `h-5 w-5 ${e.color}` }), /* @__PURE__ */ o("div", { children: [
80
+ /* @__PURE__ */ a("p", {
81
+ className: "text-sm text-muted-foreground",
82
+ children: e.label
83
+ }),
84
+ /* @__PURE__ */ a("p", {
85
+ className: "text-2xl font-bold",
86
+ children: e.value
87
+ }),
88
+ /* @__PURE__ */ a("p", {
89
+ className: "text-xs text-green-600",
90
+ children: e.trend
91
+ })
92
+ ] })]
93
+ })
94
+ }) }, e.label))
95
+ }),
96
+ /* @__PURE__ */ o("div", {
97
+ className: "grid grid-cols-1 lg:grid-cols-2 gap-4",
98
+ children: [/* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, {
99
+ className: "text-lg",
100
+ children: "Enrollment by Course"
101
+ }) }), /* @__PURE__ */ a(l, {
102
+ className: "space-y-3",
103
+ children: f.map((e) => {
104
+ let t = Math.round(e.students / Math.max(g, 1) * 100);
105
+ return /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("div", {
106
+ className: "flex justify-between text-sm mb-1",
107
+ children: [/* @__PURE__ */ a("span", {
108
+ className: "truncate max-w-[60%]",
109
+ children: e.title
110
+ }), /* @__PURE__ */ o("span", {
111
+ className: "font-medium",
112
+ children: [e.students, " students"]
113
+ })]
114
+ }), /* @__PURE__ */ a("div", {
115
+ className: "h-2 rounded-full bg-muted",
116
+ children: /* @__PURE__ */ a("div", {
117
+ className: "h-2 rounded-full bg-primary",
118
+ style: { width: `${t}%` }
119
+ })
120
+ })] }, e.id);
121
+ })
122
+ })] }), /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, {
123
+ className: "text-lg",
124
+ children: "Grade Distribution"
125
+ }) }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a("div", {
126
+ className: "flex items-end gap-4 h-40",
127
+ children: y.map((e) => /* @__PURE__ */ o("div", {
128
+ className: "flex-1 flex flex-col items-center gap-1",
129
+ children: [
130
+ /* @__PURE__ */ a("span", {
131
+ className: "text-xs font-bold",
132
+ children: e.count
133
+ }),
134
+ /* @__PURE__ */ a("div", {
135
+ className: `w-full rounded-t ${e.color}`,
136
+ style: {
137
+ height: `${e.count / b * 100}%`,
138
+ minHeight: e.count > 0 ? "8px" : "0"
139
+ }
140
+ }),
141
+ /* @__PURE__ */ a("span", {
142
+ className: "text-sm font-medium",
143
+ children: e.grade
144
+ })
145
+ ]
146
+ }, e.grade))
147
+ }) })] })]
148
+ }),
149
+ /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, {
150
+ className: "text-lg",
151
+ children: "Top Performing Courses"
152
+ }) }), /* @__PURE__ */ a(l, {
153
+ className: "p-0",
154
+ children: /* @__PURE__ */ a("div", {
155
+ className: "overflow-x-auto",
156
+ children: /* @__PURE__ */ o("table", {
157
+ className: "w-full",
158
+ children: [/* @__PURE__ */ a("thead", { children: /* @__PURE__ */ o("tr", {
159
+ className: "border-b bg-muted/50",
160
+ children: [
161
+ /* @__PURE__ */ a("th", {
162
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
163
+ children: "Course"
164
+ }),
165
+ /* @__PURE__ */ a("th", {
166
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
167
+ children: "Instructor"
168
+ }),
169
+ /* @__PURE__ */ a("th", {
170
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
171
+ children: "Students"
172
+ }),
173
+ /* @__PURE__ */ a("th", {
174
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
175
+ children: "Avg. Score"
176
+ }),
177
+ /* @__PURE__ */ a("th", {
178
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
179
+ children: "Rating"
180
+ }),
181
+ /* @__PURE__ */ a("th", {
182
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
183
+ children: "Revenue"
184
+ })
185
+ ]
186
+ }) }), /* @__PURE__ */ a("tbody", { children: f.sort((e, t) => t.rating - e.rating).map((e) => /* @__PURE__ */ o("tr", {
187
+ className: "border-b hover:bg-muted/30",
188
+ children: [
189
+ /* @__PURE__ */ a("td", {
190
+ className: "p-3 text-sm font-medium",
191
+ children: e.title
192
+ }),
193
+ /* @__PURE__ */ a("td", {
194
+ className: "p-3 text-sm text-muted-foreground",
195
+ children: e.instructor
196
+ }),
197
+ /* @__PURE__ */ a("td", {
198
+ className: "p-3 text-sm",
199
+ children: e.students
200
+ }),
201
+ /* @__PURE__ */ o("td", {
202
+ className: "p-3 text-sm",
203
+ children: [Math.round(_), "%"]
204
+ }),
205
+ /* @__PURE__ */ a("td", {
206
+ className: "p-3",
207
+ children: /* @__PURE__ */ o(s, {
208
+ variant: "secondary",
209
+ children: [e.rating, "/5"]
210
+ })
211
+ }),
212
+ /* @__PURE__ */ o("td", {
213
+ className: "p-3 text-sm font-medium",
214
+ children: ["$", (e.price * e.students).toLocaleString()]
215
+ })
216
+ ]
217
+ }, e.id)) })]
218
+ })
219
+ })
220
+ })] }),
221
+ /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ a(d, {
222
+ className: "text-lg",
223
+ children: "Student Engagement Metrics"
224
+ }) }), /* @__PURE__ */ a(l, { children: /* @__PURE__ */ a("div", {
225
+ className: "grid grid-cols-2 md:grid-cols-4 gap-4",
226
+ children: [
227
+ {
228
+ label: "Forum Posts",
229
+ value: "1,247",
230
+ change: "+15%"
231
+ },
232
+ {
233
+ label: "Submissions",
234
+ value: "3,892",
235
+ change: "+22%"
236
+ },
237
+ {
238
+ label: "Resource Downloads",
239
+ value: "8,456",
240
+ change: "+18%"
241
+ },
242
+ {
243
+ label: "AI Chat Sessions",
244
+ value: "2,156",
245
+ change: "+45%"
246
+ }
247
+ ].map((e) => /* @__PURE__ */ o("div", {
248
+ className: "rounded-lg border p-4 text-center",
249
+ children: [
250
+ /* @__PURE__ */ a("p", {
251
+ className: "text-2xl font-bold",
252
+ children: e.value
253
+ }),
254
+ /* @__PURE__ */ a("p", {
255
+ className: "text-sm text-muted-foreground",
256
+ children: e.label
257
+ }),
258
+ /* @__PURE__ */ o("p", {
259
+ className: "text-xs text-green-600 mt-1",
260
+ children: [e.change, " this month"]
261
+ })
262
+ ]
263
+ }, e.label))
264
+ }) })] })
265
+ ]
266
+ });
267
+ }
268
+ //#endregion
269
+ export { f as AdminAdminAnalyticsPagePage };
270
+
271
+ //# sourceMappingURL=AdminAdminAnalyticsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAdminAnalyticsPagePage.js","names":[],"sources":["../../../src/buildmyiq/pages/AdminAdminAnalyticsPagePage.tsx"],"sourcesContent":["import { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport {\n BarChart3,\n Users,\n BookOpen,\n TrendingUp,\n Clock,\n DollarSign,\n Activity,\n GraduationCap,\n} from 'lucide-react';\nimport { useBuildMyIQStore } from '../store/buildmyiqStore';\n\nexport function AdminAdminAnalyticsPagePage() {\n const { courses, students, grades, assessments } = useBuildMyIQStore();\n\n const totalEnrollments = courses.reduce((sum, c) => sum + c.students, 0);\n const avgScore = grades\n .filter((g) => g.status === 'graded')\n .reduce((sum, g, _, arr) => sum + ((g.score / g.maxScore) * 100) / arr.length, 0);\n const totalRevenue = courses.reduce((sum, c) => sum + c.price * c.students, 0);\n\n const gradeDistribution = [\n {\n grade: 'A',\n count: grades.filter((g) => g.grade.startsWith('A')).length,\n color: 'bg-green-500',\n },\n {\n grade: 'B',\n count: grades.filter((g) => g.grade.startsWith('B')).length,\n color: 'bg-blue-500',\n },\n {\n grade: 'C',\n count: grades.filter((g) => g.grade.startsWith('C')).length,\n color: 'bg-yellow-500',\n },\n {\n grade: 'D',\n count: grades.filter((g) => g.grade.startsWith('D')).length,\n color: 'bg-orange-500',\n },\n {\n grade: 'F',\n count: grades.filter((g) => g.grade.startsWith('F')).length,\n color: 'bg-red-500',\n },\n ];\n const maxGradeCount = Math.max(...gradeDistribution.map((g) => g.count), 1);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Platform Analytics</h1>\n <p className=\"text-sm text-muted-foreground\">\n Comprehensive insights into platform performance and usage\n </p>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n {[\n {\n label: 'Daily Active Users',\n value: '487',\n icon: Users,\n color: 'text-blue-600',\n trend: '+12.3%',\n },\n {\n label: 'Course Completions',\n value: '156',\n icon: GraduationCap,\n color: 'text-green-600',\n trend: '+8.7%',\n },\n {\n label: 'Avg. Session Time',\n value: '24 min',\n icon: Clock,\n color: 'text-purple-600',\n trend: '+3.1%',\n },\n {\n label: 'Monthly Revenue',\n value: `$${(totalRevenue / 12).toFixed(0)}`,\n icon: DollarSign,\n color: 'text-orange-600',\n trend: '+15.2%',\n },\n ].map((kpi) => (\n <Card key={kpi.label}>\n <CardContent className=\"pt-6\">\n <div className=\"flex items-center gap-3\">\n <kpi.icon className={`h-5 w-5 ${kpi.color}`} />\n <div>\n <p className=\"text-sm text-muted-foreground\">{kpi.label}</p>\n <p className=\"text-2xl font-bold\">{kpi.value}</p>\n <p className=\"text-xs text-green-600\">{kpi.trend}</p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Enrollment by Course</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {courses.map((course) => {\n const pct = Math.round((course.students / Math.max(totalEnrollments, 1)) * 100);\n return (\n <div key={course.id}>\n <div className=\"flex justify-between text-sm mb-1\">\n <span className=\"truncate max-w-[60%]\">{course.title}</span>\n <span className=\"font-medium\">{course.students} students</span>\n </div>\n <div className=\"h-2 rounded-full bg-muted\">\n <div className=\"h-2 rounded-full bg-primary\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Grade Distribution</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-end gap-4 h-40\">\n {gradeDistribution.map((g) => (\n <div key={g.grade} className=\"flex-1 flex flex-col items-center gap-1\">\n <span className=\"text-xs font-bold\">{g.count}</span>\n <div\n className={`w-full rounded-t ${g.color}`}\n style={{\n height: `${(g.count / maxGradeCount) * 100}%`,\n minHeight: g.count > 0 ? '8px' : '0',\n }}\n />\n <span className=\"text-sm font-medium\">{g.grade}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Top Performing Courses</CardTitle>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Course\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Instructor\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Students\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Avg. Score\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Rating\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Revenue\n </th>\n </tr>\n </thead>\n <tbody>\n {courses\n .sort((a, b) => b.rating - a.rating)\n .map((c) => (\n <tr key={c.id} className=\"border-b hover:bg-muted/30\">\n <td className=\"p-3 text-sm font-medium\">{c.title}</td>\n <td className=\"p-3 text-sm text-muted-foreground\">{c.instructor}</td>\n <td className=\"p-3 text-sm\">{c.students}</td>\n <td className=\"p-3 text-sm\">{Math.round(avgScore)}%</td>\n <td className=\"p-3\">\n <Badge variant=\"secondary\">{c.rating}/5</Badge>\n </td>\n <td className=\"p-3 text-sm font-medium\">\n ${(c.price * c.students).toLocaleString()}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-lg\">Student Engagement Metrics</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {[\n { label: 'Forum Posts', value: '1,247', change: '+15%' },\n { label: 'Submissions', value: '3,892', change: '+22%' },\n { label: 'Resource Downloads', value: '8,456', change: '+18%' },\n { label: 'AI Chat Sessions', value: '2,156', change: '+45%' },\n ].map((m) => (\n <div key={m.label} className=\"rounded-lg border p-4 text-center\">\n <p className=\"text-2xl font-bold\">{m.value}</p>\n <p className=\"text-sm text-muted-foreground\">{m.label}</p>\n <p className=\"text-xs text-green-600 mt-1\">{m.change} this month</p>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function AdminAdminCoursesPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AdminAdminCoursesPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAdminCoursesPagePage.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/pages/AdminAdminCoursesPagePage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,yBAAyB,4CAiKxC"}
@@ -0,0 +1,212 @@
1
+ import { useBuildMyIQStore as e } from "../store/buildmyiqStore.js";
2
+ import { useState as t } from "react";
3
+ import { BookOpen as n, MoreHorizontal as r, Plus as i, Search as a, Star as o, Users as s } from "lucide-react";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
+ import { Badge as u, Button as d, Card as f, CardContent as p, Input as m } from "@burdenoff/fe-libs/ui";
6
+ //#region src/buildmyiq/pages/AdminAdminCoursesPagePage.tsx
7
+ var h = {
8
+ published: "bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400",
9
+ draft: "bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400",
10
+ archived: "bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400"
11
+ };
12
+ function g() {
13
+ let { courses: g } = e(), [_, v] = t(""), [y, b] = t("all"), x = g.filter((e) => {
14
+ let t = e.title.toLowerCase().includes(_.toLowerCase()) || e.instructor.toLowerCase().includes(_.toLowerCase()), n = y === "all" || e.status === y;
15
+ return t && n;
16
+ }), S = g.filter((e) => e.status === "published").length, C = g.filter((e) => e.status === "draft").length, w = g.filter((e) => e.status === "archived").length;
17
+ return /* @__PURE__ */ l("div", {
18
+ className: "space-y-6 p-6",
19
+ children: [
20
+ /* @__PURE__ */ l("div", {
21
+ className: "flex items-center justify-between",
22
+ children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
23
+ className: "text-2xl font-semibold",
24
+ children: "Course Management"
25
+ }), /* @__PURE__ */ c("p", {
26
+ className: "text-sm text-muted-foreground",
27
+ children: "Administer and manage all platform courses"
28
+ })] }), /* @__PURE__ */ l(d, {
29
+ size: "sm",
30
+ children: [/* @__PURE__ */ c(i, { className: "mr-2 h-4 w-4" }), "Add Course"]
31
+ })]
32
+ }),
33
+ /* @__PURE__ */ l("div", {
34
+ className: "grid grid-cols-1 md:grid-cols-4 gap-4",
35
+ children: [
36
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
37
+ className: "pt-6",
38
+ children: [/* @__PURE__ */ c("p", {
39
+ className: "text-sm text-muted-foreground",
40
+ children: "Total Courses"
41
+ }), /* @__PURE__ */ c("p", {
42
+ className: "text-2xl font-bold",
43
+ children: g.length
44
+ })]
45
+ }) }),
46
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
47
+ className: "pt-6",
48
+ children: [/* @__PURE__ */ c("p", {
49
+ className: "text-sm text-muted-foreground",
50
+ children: "Published"
51
+ }), /* @__PURE__ */ c("p", {
52
+ className: "text-2xl font-bold text-green-600",
53
+ children: S
54
+ })]
55
+ }) }),
56
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
57
+ className: "pt-6",
58
+ children: [/* @__PURE__ */ c("p", {
59
+ className: "text-sm text-muted-foreground",
60
+ children: "Draft"
61
+ }), /* @__PURE__ */ c("p", {
62
+ className: "text-2xl font-bold text-yellow-600",
63
+ children: C
64
+ })]
65
+ }) }),
66
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
67
+ className: "pt-6",
68
+ children: [/* @__PURE__ */ c("p", {
69
+ className: "text-sm text-muted-foreground",
70
+ children: "Archived"
71
+ }), /* @__PURE__ */ c("p", {
72
+ className: "text-2xl font-bold text-gray-600",
73
+ children: w
74
+ })]
75
+ }) })
76
+ ]
77
+ }),
78
+ /* @__PURE__ */ l("div", {
79
+ className: "flex flex-col sm:flex-row gap-3",
80
+ children: [/* @__PURE__ */ l("div", {
81
+ className: "relative flex-1",
82
+ children: [/* @__PURE__ */ c(a, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ c(m, {
83
+ placeholder: "Search courses or instructors...",
84
+ value: _,
85
+ onChange: (e) => v(e.target.value),
86
+ className: "pl-10"
87
+ })]
88
+ }), /* @__PURE__ */ c("div", {
89
+ className: "flex gap-1",
90
+ children: [
91
+ "all",
92
+ "published",
93
+ "draft",
94
+ "archived"
95
+ ].map((e) => /* @__PURE__ */ c(d, {
96
+ variant: y === e ? "default" : "outline",
97
+ size: "sm",
98
+ className: "capitalize",
99
+ onClick: () => b(e),
100
+ children: e
101
+ }, e))
102
+ })]
103
+ }),
104
+ /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c(p, {
105
+ className: "p-0",
106
+ children: /* @__PURE__ */ c("div", {
107
+ className: "overflow-x-auto",
108
+ children: /* @__PURE__ */ l("table", {
109
+ className: "w-full",
110
+ children: [/* @__PURE__ */ c("thead", { children: /* @__PURE__ */ l("tr", {
111
+ className: "border-b bg-muted/50",
112
+ children: [
113
+ /* @__PURE__ */ c("th", {
114
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
115
+ children: "Course"
116
+ }),
117
+ /* @__PURE__ */ c("th", {
118
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
119
+ children: "Instructor"
120
+ }),
121
+ /* @__PURE__ */ c("th", {
122
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
123
+ children: "Category"
124
+ }),
125
+ /* @__PURE__ */ c("th", {
126
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
127
+ children: "Students"
128
+ }),
129
+ /* @__PURE__ */ c("th", {
130
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
131
+ children: "Rating"
132
+ }),
133
+ /* @__PURE__ */ c("th", {
134
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
135
+ children: "Status"
136
+ }),
137
+ /* @__PURE__ */ c("th", {
138
+ className: "text-left text-xs font-medium text-muted-foreground p-3",
139
+ children: "Updated"
140
+ }),
141
+ /* @__PURE__ */ c("th", { className: "text-left text-xs font-medium text-muted-foreground p-3" })
142
+ ]
143
+ }) }), /* @__PURE__ */ c("tbody", { children: x.map((e) => /* @__PURE__ */ l("tr", {
144
+ className: "border-b hover:bg-muted/30 transition-colors",
145
+ children: [
146
+ /* @__PURE__ */ c("td", {
147
+ className: "p-3",
148
+ children: /* @__PURE__ */ l("div", {
149
+ className: "flex items-center gap-2",
150
+ children: [/* @__PURE__ */ c(n, { className: "h-4 w-4 text-muted-foreground shrink-0" }), /* @__PURE__ */ c("span", {
151
+ className: "text-sm font-medium",
152
+ children: e.title
153
+ })]
154
+ })
155
+ }),
156
+ /* @__PURE__ */ c("td", {
157
+ className: "p-3 text-sm text-muted-foreground",
158
+ children: e.instructor
159
+ }),
160
+ /* @__PURE__ */ c("td", {
161
+ className: "p-3",
162
+ children: /* @__PURE__ */ c(u, {
163
+ variant: "outline",
164
+ className: "text-xs",
165
+ children: e.category
166
+ })
167
+ }),
168
+ /* @__PURE__ */ c("td", {
169
+ className: "p-3",
170
+ children: /* @__PURE__ */ l("div", {
171
+ className: "flex items-center gap-1 text-sm",
172
+ children: [/* @__PURE__ */ c(s, { className: "h-3.5 w-3.5 text-muted-foreground" }), e.students]
173
+ })
174
+ }),
175
+ /* @__PURE__ */ c("td", {
176
+ className: "p-3",
177
+ children: /* @__PURE__ */ l("div", {
178
+ className: "flex items-center gap-1 text-sm",
179
+ children: [/* @__PURE__ */ c(o, { className: "h-3.5 w-3.5 text-yellow-500 fill-yellow-500" }), e.rating]
180
+ })
181
+ }),
182
+ /* @__PURE__ */ c("td", {
183
+ className: "p-3",
184
+ children: /* @__PURE__ */ c(u, {
185
+ className: `text-xs ${h[e.status]}`,
186
+ children: e.status
187
+ })
188
+ }),
189
+ /* @__PURE__ */ c("td", {
190
+ className: "p-3 text-sm text-muted-foreground",
191
+ children: e.lastUpdated
192
+ }),
193
+ /* @__PURE__ */ c("td", {
194
+ className: "p-3",
195
+ children: /* @__PURE__ */ c(d, {
196
+ variant: "ghost",
197
+ size: "sm",
198
+ children: /* @__PURE__ */ c(r, { className: "h-4 w-4" })
199
+ })
200
+ })
201
+ ]
202
+ }, e.id)) })]
203
+ })
204
+ })
205
+ }) })
206
+ ]
207
+ });
208
+ }
209
+ //#endregion
210
+ export { g as AdminAdminCoursesPagePage };
211
+
212
+ //# sourceMappingURL=AdminAdminCoursesPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAdminCoursesPagePage.js","names":[],"sources":["../../../src/buildmyiq/pages/AdminAdminCoursesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Search, Plus, Star, Users, MoreHorizontal } from 'lucide-react';\nimport { useBuildMyIQStore } from '../store/buildmyiqStore';\n\nconst statusColors: Record<string, string> = {\n published: 'bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-400',\n draft: 'bg-yellow-100 text-yellow-700 dark:bg-yellow-900/30 dark:text-yellow-400',\n archived: 'bg-gray-100 text-gray-700 dark:bg-gray-900/30 dark:text-gray-400',\n};\n\nexport function AdminAdminCoursesPagePage() {\n const { courses } = useBuildMyIQStore();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState('all');\n\n const filtered = courses.filter((c) => {\n const matchesSearch =\n c.title.toLowerCase().includes(search.toLowerCase()) ||\n c.instructor.toLowerCase().includes(search.toLowerCase());\n const matchesStatus = statusFilter === 'all' || c.status === statusFilter;\n return matchesSearch && matchesStatus;\n });\n\n const published = courses.filter((c) => c.status === 'published').length;\n const draft = courses.filter((c) => c.status === 'draft').length;\n const archived = courses.filter((c) => c.status === 'archived').length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Course Management</h1>\n <p className=\"text-sm text-muted-foreground\">\n Administer and manage all platform courses\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Add Course\n </Button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-6\">\n <p className=\"text-sm text-muted-foreground\">Total Courses</p>\n <p className=\"text-2xl font-bold\">{courses.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6\">\n <p className=\"text-sm text-muted-foreground\">Published</p>\n <p className=\"text-2xl font-bold text-green-600\">{published}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6\">\n <p className=\"text-sm text-muted-foreground\">Draft</p>\n <p className=\"text-2xl font-bold text-yellow-600\">{draft}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6\">\n <p className=\"text-sm text-muted-foreground\">Archived</p>\n <p className=\"text-2xl font-bold text-gray-600\">{archived}</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground\" />\n <Input\n placeholder=\"Search courses or instructors...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex gap-1\">\n {['all', 'published', 'draft', 'archived'].map((s) => (\n <Button\n key={s}\n variant={statusFilter === s ? 'default' : 'outline'}\n size=\"sm\"\n className=\"capitalize\"\n onClick={() => setStatusFilter(s)}\n >\n {s}\n </Button>\n ))}\n </div>\n </div>\n\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Course\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Instructor\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Category\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Students\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Rating\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Status\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\">\n Updated\n </th>\n <th className=\"text-left text-xs font-medium text-muted-foreground p-3\"></th>\n </tr>\n </thead>\n <tbody>\n {filtered.map((course) => (\n <tr key={course.id} className=\"border-b hover:bg-muted/30 transition-colors\">\n <td className=\"p-3\">\n <div className=\"flex items-center gap-2\">\n <BookOpen className=\"h-4 w-4 text-muted-foreground shrink-0\" />\n <span className=\"text-sm font-medium\">{course.title}</span>\n </div>\n </td>\n <td className=\"p-3 text-sm text-muted-foreground\">{course.instructor}</td>\n <td className=\"p-3\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {course.category}\n </Badge>\n </td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-1 text-sm\">\n <Users className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {course.students}\n </div>\n </td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-1 text-sm\">\n <Star className=\"h-3.5 w-3.5 text-yellow-500 fill-yellow-500\" />\n {course.rating}\n </div>\n </td>\n <td className=\"p-3\">\n <Badge className={`text-xs ${statusColors[course.status]}`}>\n {course.status}\n </Badge>\n </td>\n <td className=\"p-3 text-sm text-muted-foreground\">{course.lastUpdated}</td>\n <td className=\"p-3\">\n <Button variant=\"ghost\" size=\"sm\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function AdminAdminUsersPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AdminAdminUsersPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAdminUsersPagePage.d.ts","sourceRoot":"","sources":["../../../src/buildmyiq/pages/AdminAdminUsersPagePage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,uBAAuB,4CAuLtC"}