@burdenoff/microfe-technospam 2026.705.1 → 2026.709.1

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 (48) hide show
  1. package/dist/generated/wspace-operations.js +67 -0
  2. package/dist/generated/wspace-operations.js.map +1 -0
  3. package/dist/index.js +3 -1
  4. package/dist/technospam/components/MediaCover.js +57 -0
  5. package/dist/technospam/components/MediaCover.js.map +1 -0
  6. package/dist/technospam/components/PageLayout.js +1 -1
  7. package/dist/technospam/components/PageLayout.js.map +1 -1
  8. package/dist/technospam/components/StatCard.js +19 -11
  9. package/dist/technospam/components/StatCard.js.map +1 -1
  10. package/dist/technospam/components/StatusBadge.js +1 -1
  11. package/dist/technospam/components/StatusBadge.js.map +1 -1
  12. package/dist/technospam/components/index.js +1 -0
  13. package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
  14. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
  15. package/dist/technospam/index.js +2 -0
  16. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +525 -459
  17. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  18. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
  19. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  20. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -101
  21. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
  22. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +103 -99
  23. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  24. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +316 -184
  25. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  26. package/dist/technospam/pages/CoursesCoursesPagePage.js +101 -93
  27. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  28. package/dist/technospam/pages/CoursesMyLearningPagePage.js +119 -88
  29. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  30. package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
  31. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  32. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
  33. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
  34. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +99 -91
  35. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  36. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +185 -116
  37. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
  38. package/dist/technospam/pages/MentorshipMentorsPagePage.js +233 -165
  39. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  40. package/dist/technospam/pages/MentorshipSessionsPagePage.js +146 -113
  41. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
  42. package/dist/technospam/services/assistantApi.js +222 -0
  43. package/dist/technospam/services/assistantApi.js.map +1 -0
  44. package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
  45. package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
  46. package/dist/technospam/utils/pageContext.js +46 -0
  47. package/dist/technospam/utils/pageContext.js.map +1 -0
  48. package/package.json +5 -1
@@ -1,70 +1,71 @@
1
1
  import { useTechnoSpam as e, useTechnoSpamNavigate as t } from "../providers/TechnoSpamProvider.js";
2
- import { PageLayout as n } from "../components/PageLayout.js";
3
- import { StatCard as r } from "../components/StatCard.js";
4
- import { humanizeEnum as i } from "../utils/format.js";
5
- import { EmptyView as a, ErrorView as ee, LoadingGrid as te, LoadingRows as ne } from "../components/StateViews.js";
2
+ import { cn as n } from "../utils/cn.js";
3
+ import { PageLayout as r } from "../components/PageLayout.js";
4
+ import { StatCard as i } from "../components/StatCard.js";
5
+ import { humanizeEnum as a } from "../utils/format.js";
6
+ import { EmptyView as o, ErrorView as ee, LoadingGrid as te, LoadingRows as s } from "../components/StateViews.js";
6
7
  import "../components/index.js";
7
- import { useCertificatesQuery as re, useCoursesQuery as ie, useEnrollmentsQuery as o, useHackathonsQuery as s, useProblemsQuery as c, useSessionsQuery as ae, useSubmissionsQuery as oe } from "../api/technospamApi.js";
8
- import { Legend as l } from "../../node_modules/recharts/es6/component/Legend.js";
9
- import { Tooltip as u } from "../../node_modules/recharts/es6/component/Tooltip.js";
10
- import { ResponsiveContainer as d } from "../../node_modules/recharts/es6/component/ResponsiveContainer.js";
11
- import { Cell as f } from "../../node_modules/recharts/es6/component/Cell.js";
12
- import { Pie as se } from "../../node_modules/recharts/es6/polar/Pie.js";
13
- import { Bar as ce } from "../../node_modules/recharts/es6/cartesian/Bar.js";
14
- import { CartesianGrid as p } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
15
- import { Area as m } from "../../node_modules/recharts/es6/cartesian/Area.js";
16
- import { XAxis as h } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
17
- import { YAxis as g } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
18
- import { BarChart as _ } from "../../node_modules/recharts/es6/chart/BarChart.js";
19
- import { PieChart as le } from "../../node_modules/recharts/es6/chart/PieChart.js";
20
- import { AreaChart as ue } from "../../node_modules/recharts/es6/chart/AreaChart.js";
21
- import { useMemo as v } from "react";
22
- import { Activity as y, Award as de, BarChart3 as fe, BookOpen as b, Code2 as x, GraduationCap as S, Library as pe, Percent as me, TrendingUp as he, Trophy as ge, Users as _e } from "lucide-react";
8
+ import { useCertificatesQuery as ne, useCoursesQuery as re, useEnrollmentsQuery as ie, useHackathonsQuery as ae, useProblemsQuery as oe, useSessionsQuery as se, useSubmissionsQuery as ce } from "../api/technospamApi.js";
9
+ import { Legend as c } from "../../node_modules/recharts/es6/component/Legend.js";
10
+ import { Tooltip as l } from "../../node_modules/recharts/es6/component/Tooltip.js";
11
+ import { ResponsiveContainer as u } from "../../node_modules/recharts/es6/component/ResponsiveContainer.js";
12
+ import { Cell as d } from "../../node_modules/recharts/es6/component/Cell.js";
13
+ import { Pie as le } from "../../node_modules/recharts/es6/polar/Pie.js";
14
+ import { Bar as ue } from "../../node_modules/recharts/es6/cartesian/Bar.js";
15
+ import { CartesianGrid as f } from "../../node_modules/recharts/es6/cartesian/CartesianGrid.js";
16
+ import { Area as p } from "../../node_modules/recharts/es6/cartesian/Area.js";
17
+ import { XAxis as m } from "../../node_modules/recharts/es6/cartesian/XAxis.js";
18
+ import { YAxis as h } from "../../node_modules/recharts/es6/cartesian/YAxis.js";
19
+ import { BarChart as de } from "../../node_modules/recharts/es6/chart/BarChart.js";
20
+ import { PieChart as fe } from "../../node_modules/recharts/es6/chart/PieChart.js";
21
+ import { AreaChart as pe } from "../../node_modules/recharts/es6/chart/AreaChart.js";
22
+ import { useMemo as g } from "react";
23
+ import { Activity as _, Award as v, BarChart3 as y, BookOpen as b, Code2 as x, GraduationCap as S, Library as me, Percent as he, TrendingUp as ge, Trophy as _e, Users as ve } from "lucide-react";
23
24
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
24
25
  import { Button as T, GlassCard as E } from "@burdenoff/fe-libs/ui";
25
26
  //#region src/technospam/pages/AnalyticsAnalyticsPagePage.tsx
26
- var ve = [
27
+ var ye = [
27
28
  "ENROLLED",
28
29
  "IN_PROGRESS",
29
30
  "COMPLETED",
30
31
  "DROPPED"
31
- ], D = {
32
+ ], be = {
32
33
  ENROLLED: "var(--color-accent-primary)",
33
34
  IN_PROGRESS: "var(--color-accent-teal)",
34
35
  COMPLETED: "var(--color-status-success)",
35
36
  DROPPED: "var(--color-status-warning)"
36
- }, O = [
37
+ }, D = [
37
38
  "ACCEPTED",
38
39
  "WRONG_ANSWER",
39
40
  "TIME_LIMIT_EXCEEDED",
40
41
  "RUNTIME_ERROR",
41
42
  "COMPILE_ERROR",
42
43
  "PENDING"
43
- ], k = {
44
+ ], O = {
44
45
  ACCEPTED: "Accepted",
45
46
  WRONG_ANSWER: "Wrong",
46
47
  TIME_LIMIT_EXCEEDED: "TLE",
47
48
  RUNTIME_ERROR: "Runtime",
48
49
  COMPILE_ERROR: "Compile",
49
50
  PENDING: "Pending"
50
- }, A = {
51
+ }, k = {
51
52
  ACCEPTED: "var(--color-status-success)",
52
53
  WRONG_ANSWER: "var(--color-status-error)",
53
54
  TIME_LIMIT_EXCEEDED: "var(--color-status-warning)",
54
55
  RUNTIME_ERROR: "var(--color-status-error)",
55
56
  COMPILE_ERROR: "var(--color-status-error)",
56
57
  PENDING: "var(--color-text-muted)"
57
- }, j = {
58
+ }, A = {
58
59
  background: "var(--color-bg-surface)",
59
60
  border: "1px solid var(--color-border-seam)",
60
61
  borderRadius: 12,
61
62
  color: "var(--color-text-primary)",
62
63
  fontSize: 12
63
- }, M = { color: "var(--color-text-secondary)" }, N = {
64
+ }, j = { color: "var(--color-text-secondary)" }, M = {
64
65
  fill: "var(--color-text-muted)",
65
66
  fontSize: 12
66
67
  };
67
- function P(e) {
68
+ function N(e) {
68
69
  let t = new Date(e);
69
70
  if (Number.isNaN(t.getTime())) return {
70
71
  key: 0,
@@ -79,27 +80,50 @@ function P(e) {
79
80
  })
80
81
  };
81
82
  }
82
- function F({ title: e, icon: t, isEmpty: n, emptyLabel: r, children: i }) {
83
+ var P = {
84
+ blue: "bg-accent-primary/15 text-accent-primary ring-accent-primary/20",
85
+ teal: "bg-accent-teal/15 text-accent-teal ring-accent-teal/20",
86
+ purple: "bg-accent-purple/15 text-accent-purple ring-accent-purple/20",
87
+ indigo: "bg-accent-indigo/15 text-accent-indigo ring-accent-indigo/20"
88
+ };
89
+ function F({ icon: e, title: t, subtitle: r, tone: i }) {
90
+ return /* @__PURE__ */ w("div", {
91
+ className: "mb-4 flex items-center gap-3",
92
+ children: [/* @__PURE__ */ C("span", {
93
+ className: n("flex h-9 w-9 shrink-0 items-center justify-center rounded-xl ring-1", P[i]),
94
+ children: /* @__PURE__ */ C(e, { size: 17 })
95
+ }), /* @__PURE__ */ w("div", {
96
+ className: "min-w-0",
97
+ children: [/* @__PURE__ */ C("h3", {
98
+ className: "truncate text-sm font-semibold text-text-primary",
99
+ children: t
100
+ }), r ? /* @__PURE__ */ C("p", {
101
+ className: "truncate text-xs text-text-muted",
102
+ children: r
103
+ }) : null]
104
+ })]
105
+ });
106
+ }
107
+ function I({ title: e, subtitle: t, icon: n, tone: r = "teal", isEmpty: i, emptyLabel: a, children: o }) {
83
108
  return /* @__PURE__ */ w(E, {
84
- className: "p-5",
85
- children: [/* @__PURE__ */ w("h3", {
86
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
87
- children: [/* @__PURE__ */ C(t, {
88
- size: 16,
89
- className: "text-accent-teal"
90
- }), e]
91
- }), n ? /* @__PURE__ */ C("div", {
109
+ className: "p-5 transition-shadow duration-200 hover:shadow-lg",
110
+ children: [/* @__PURE__ */ C(F, {
111
+ icon: n,
112
+ title: e,
113
+ subtitle: t,
114
+ tone: r
115
+ }), i ? /* @__PURE__ */ C("div", {
92
116
  className: "flex h-[240px] items-center justify-center text-center text-sm text-text-muted",
93
- children: r
94
- }) : /* @__PURE__ */ C(d, {
117
+ children: a
118
+ }) : /* @__PURE__ */ C(u, {
95
119
  width: "100%",
96
120
  height: 260,
97
- children: i
121
+ children: o
98
122
  })]
99
123
  });
100
124
  }
101
- function I() {
102
- let I = t(), { currentUser: ye } = e(), L = ye?.id, R = o(L ? { learnerId: L } : {}), z = oe(L ? { learnerId: L } : {}), B = ae(L ? { menteeId: L } : {}), V = re(L ? { learnerId: L } : {}), be = ie({ status: "PUBLISHED" }), xe = c({ status: "PUBLISHED" }), Se = s({}), H = v(() => R.data?.tecListEnrollments.items ?? [], [R.data]), U = v(() => z.data?.tecListSubmissions.items ?? [], [z.data]), W = B.data?.tecListSessions ?? [], G = V.data?.tecListCertificates ?? [], Ce = be.data?.tecListCourses.items.length ?? 0, we = xe.data?.tecListProblems.items.length ?? 0, Te = Se.data?.tecListHackathons.items.length ?? 0, K = v(() => {
125
+ function L() {
126
+ let n = t(), { currentUser: P } = e(), L = P?.id, R = ie(L ? { learnerId: L } : {}), z = ce(L ? { learnerId: L } : {}), B = se(L ? { menteeId: L } : {}), V = ne(L ? { learnerId: L } : {}), xe = re({ status: "PUBLISHED" }), Se = oe({ status: "PUBLISHED" }), Ce = ae({}), H = g(() => R.data?.tecListEnrollments.items ?? [], [R.data]), U = g(() => z.data?.tecListSubmissions.items ?? [], [z.data]), W = B.data?.tecListSessions ?? [], G = V.data?.tecListCertificates ?? [], we = xe.data?.tecListCourses.items.length ?? 0, Te = Se.data?.tecListProblems.items.length ?? 0, Ee = Ce.data?.tecListHackathons.items.length ?? 0, K = g(() => {
103
127
  let e = H.filter((e) => e.status === "COMPLETED").length, t = H.length ? Math.round(H.reduce((e, t) => e + t.progressPct, 0) / H.length) : 0, n = U.filter((e) => e.verdict === "ACCEPTED");
104
128
  return {
105
129
  coursesCompleted: e,
@@ -107,17 +131,17 @@ function I() {
107
131
  problemsSolved: new Set(n.map((e) => e.problemId)).size,
108
132
  acceptanceRate: U.length ? Math.round(n.length / U.length * 100) : 0
109
133
  };
110
- }, [H, U]), q = v(() => ve.map((e) => ({
111
- name: i(e),
134
+ }, [H, U]), q = g(() => ye.map((e) => ({
135
+ name: a(e),
112
136
  value: H.filter((t) => t.status === e).length,
113
- color: D[e]
114
- })).filter((e) => e.value > 0), [H]), J = v(() => O.map((e) => ({
115
- label: k[e],
137
+ color: be[e]
138
+ })).filter((e) => e.value > 0), [H]), J = g(() => D.map((e) => ({
139
+ label: O[e],
116
140
  count: U.filter((t) => t.verdict === e).length,
117
- color: A[e]
118
- })).filter((e) => e.count > 0), [U]), Y = v(() => {
141
+ color: k[e]
142
+ })).filter((e) => e.count > 0), [U]), Y = g(() => {
119
143
  let e = /* @__PURE__ */ new Map(), t = (t, n) => {
120
- let { key: r, label: i } = P(t), a = e.get(r) ?? {
144
+ let { key: r, label: i } = N(t), a = e.get(r) ?? {
121
145
  label: i,
122
146
  submissions: 0,
123
147
  enrollments: 0
@@ -125,7 +149,7 @@ function I() {
125
149
  a[n] += 1, e.set(r, a);
126
150
  };
127
151
  return U.forEach((e) => t(e.createdAt, "submissions")), H.forEach((e) => t(e.createdAt, "enrollments")), [...e.entries()].sort((e, t) => e[0] - t[0]).slice(-8).map(([, e]) => e);
128
- }, [U, H]), X = H.length > 0 || U.length > 0 || W.length > 0 || G.length > 0, Z = R.loading || z.loading || B.loading || V.loading, Q = R.error || z.error || B.error || V.error, Ee = Z && !X, $ = /* @__PURE__ */ w("div", { children: [
152
+ }, [U, H]), X = H.length > 0 || U.length > 0 || W.length > 0 || G.length > 0, De = R.loading || z.loading || B.loading || V.loading, Z = R.error || z.error || B.error || V.error, Q = De && !X, $ = /* @__PURE__ */ w("div", { children: [
129
153
  /* @__PURE__ */ C("h2", {
130
154
  className: "mb-3 text-base font-semibold text-text-primary",
131
155
  children: "Workspace overview"
@@ -137,85 +161,95 @@ function I() {
137
161
  /* @__PURE__ */ w("div", {
138
162
  className: "grid grid-cols-1 gap-3 sm:grid-cols-3",
139
163
  children: [
140
- /* @__PURE__ */ C(r, {
164
+ /* @__PURE__ */ C(i, {
141
165
  label: "Published courses",
142
- value: Ce,
143
- icon: pe
166
+ value: we,
167
+ icon: me,
168
+ tone: "blue"
144
169
  }),
145
- /* @__PURE__ */ C(r, {
170
+ /* @__PURE__ */ C(i, {
146
171
  label: "Published problems",
147
- value: we,
148
- icon: x
172
+ value: Te,
173
+ icon: x,
174
+ tone: "indigo"
149
175
  }),
150
- /* @__PURE__ */ C(r, {
176
+ /* @__PURE__ */ C(i, {
151
177
  label: "Hackathons",
152
- value: Te,
153
- icon: ge
178
+ value: Ee,
179
+ icon: _e,
180
+ tone: "purple"
154
181
  })
155
182
  ]
156
183
  })
157
184
  ] });
158
- return /* @__PURE__ */ C(n, {
185
+ return /* @__PURE__ */ C(r, {
159
186
  hero: !0,
160
187
  title: "Analytics",
161
188
  description: "Your real learning performance across courses, problems, mentoring and certificates.",
162
189
  actions: /* @__PURE__ */ w(T, {
163
190
  variant: "outline",
164
- onClick: () => I("/courses/my-learning-page"),
191
+ onClick: () => n("/courses/my-learning-page"),
165
192
  children: [/* @__PURE__ */ C(S, { size: 16 }), " My Learning"]
166
193
  }),
167
- children: L ? Ee ? /* @__PURE__ */ w("div", {
194
+ children: L ? Q ? /* @__PURE__ */ w("div", {
168
195
  className: "space-y-6",
169
196
  children: [/* @__PURE__ */ C(te, {
170
197
  count: 4,
171
198
  height: "h-24"
172
- }), /* @__PURE__ */ C(ne, {
199
+ }), /* @__PURE__ */ C(s, {
173
200
  count: 2,
174
201
  height: "h-72"
175
202
  })]
176
- }) : Q && !X ? /* @__PURE__ */ C(ee, {
203
+ }) : Z && !X ? /* @__PURE__ */ C(ee, {
177
204
  title: "Couldn't load your analytics",
178
- error: Q
205
+ error: Z
179
206
  }) : /* @__PURE__ */ w("div", {
180
207
  className: "space-y-8",
181
208
  children: [
182
209
  /* @__PURE__ */ w("div", {
183
210
  className: "grid grid-cols-2 gap-3 sm:grid-cols-3 xl:grid-cols-4",
184
211
  children: [
185
- /* @__PURE__ */ C(r, {
212
+ /* @__PURE__ */ C(i, {
186
213
  label: "Courses enrolled",
187
214
  value: H.length,
188
- icon: b
215
+ icon: b,
216
+ tone: "blue"
189
217
  }),
190
- /* @__PURE__ */ C(r, {
218
+ /* @__PURE__ */ C(i, {
191
219
  label: "Courses completed",
192
220
  value: K.coursesCompleted,
193
- icon: S
221
+ icon: S,
222
+ tone: "green"
194
223
  }),
195
- /* @__PURE__ */ C(r, {
224
+ /* @__PURE__ */ C(i, {
196
225
  label: "Avg progress",
197
226
  value: `${K.avgProgress}%`,
198
- icon: he
227
+ icon: ge,
228
+ tone: "purple"
199
229
  }),
200
- /* @__PURE__ */ C(r, {
230
+ /* @__PURE__ */ C(i, {
201
231
  label: "Problems solved",
202
232
  value: K.problemsSolved,
203
- icon: x
233
+ icon: x,
234
+ tone: "indigo"
204
235
  }),
205
- /* @__PURE__ */ C(r, {
236
+ /* @__PURE__ */ C(i, {
206
237
  label: "Acceptance rate",
207
238
  value: `${K.acceptanceRate}%`,
208
- icon: me
239
+ icon: he,
240
+ tone: "teal"
209
241
  }),
210
- /* @__PURE__ */ C(r, {
242
+ /* @__PURE__ */ C(i, {
211
243
  label: "Mentor sessions",
212
244
  value: W.length,
213
- icon: _e
245
+ icon: ve,
246
+ tone: "blue"
214
247
  }),
215
- /* @__PURE__ */ C(r, {
248
+ /* @__PURE__ */ C(i, {
216
249
  label: "Certificates",
217
250
  value: G.length,
218
- icon: de
251
+ icon: v,
252
+ tone: "amber"
219
253
  })
220
254
  ]
221
255
  }),
@@ -223,13 +257,15 @@ function I() {
223
257
  className: "space-y-4",
224
258
  children: [/* @__PURE__ */ w("div", {
225
259
  className: "grid grid-cols-1 gap-4 lg:grid-cols-2",
226
- children: [/* @__PURE__ */ C(F, {
260
+ children: [/* @__PURE__ */ C(I, {
227
261
  title: "Enrollments by status",
262
+ subtitle: "How your courses are progressing",
228
263
  icon: b,
264
+ tone: "blue",
229
265
  isEmpty: q.length === 0,
230
266
  emptyLabel: "No enrollments yet",
231
- children: /* @__PURE__ */ w(le, { children: [
232
- /* @__PURE__ */ C(se, {
267
+ children: /* @__PURE__ */ w(fe, { children: [
268
+ /* @__PURE__ */ C(le, {
233
269
  data: q,
234
270
  dataKey: "value",
235
271
  nameKey: "name",
@@ -238,23 +274,25 @@ function I() {
238
274
  paddingAngle: 2,
239
275
  stroke: "var(--color-bg-surface)",
240
276
  strokeWidth: 2,
241
- children: q.map((e) => /* @__PURE__ */ C(f, { fill: e.color }, e.name))
242
- }),
243
- /* @__PURE__ */ C(u, {
244
- contentStyle: j,
245
- labelStyle: M
277
+ children: q.map((e) => /* @__PURE__ */ C(d, { fill: e.color }, e.name))
246
278
  }),
247
279
  /* @__PURE__ */ C(l, {
280
+ contentStyle: A,
281
+ labelStyle: j
282
+ }),
283
+ /* @__PURE__ */ C(c, {
248
284
  iconType: "circle",
249
285
  wrapperStyle: { fontSize: 12 }
250
286
  })
251
287
  ] })
252
- }), /* @__PURE__ */ C(F, {
288
+ }), /* @__PURE__ */ C(I, {
253
289
  title: "Submissions by verdict",
290
+ subtitle: "Outcomes across your attempts",
254
291
  icon: x,
292
+ tone: "purple",
255
293
  isEmpty: J.length === 0,
256
294
  emptyLabel: "No submissions yet",
257
- children: /* @__PURE__ */ w(_, {
295
+ children: /* @__PURE__ */ w(de, {
258
296
  data: J,
259
297
  margin: {
260
298
  top: 8,
@@ -263,29 +301,32 @@ function I() {
263
301
  bottom: 0
264
302
  },
265
303
  children: [
266
- /* @__PURE__ */ C(p, {
304
+ /* @__PURE__ */ C(f, {
267
305
  strokeDasharray: "3 3",
268
306
  stroke: "var(--color-border-seam)",
269
307
  vertical: !1
270
308
  }),
271
- /* @__PURE__ */ C(h, {
309
+ /* @__PURE__ */ C(m, {
272
310
  dataKey: "label",
273
- tick: N,
311
+ tick: M,
274
312
  axisLine: { stroke: "var(--color-border-seam)" },
275
313
  tickLine: !1
276
314
  }),
277
- /* @__PURE__ */ C(g, {
315
+ /* @__PURE__ */ C(h, {
278
316
  allowDecimals: !1,
279
- tick: N,
317
+ tick: M,
280
318
  axisLine: !1,
281
319
  tickLine: !1
282
320
  }),
283
- /* @__PURE__ */ C(u, {
284
- contentStyle: j,
285
- labelStyle: M,
286
- cursor: { fill: "var(--color-accent-wash)" }
321
+ /* @__PURE__ */ C(l, {
322
+ contentStyle: A,
323
+ labelStyle: j,
324
+ cursor: {
325
+ fill: "var(--color-accent-primary)",
326
+ fillOpacity: .08
327
+ }
287
328
  }),
288
- /* @__PURE__ */ C(ce, {
329
+ /* @__PURE__ */ C(ue, {
289
330
  dataKey: "count",
290
331
  name: "Submissions",
291
332
  radius: [
@@ -295,26 +336,25 @@ function I() {
295
336
  0
296
337
  ],
297
338
  maxBarSize: 56,
298
- children: J.map((e) => /* @__PURE__ */ C(f, { fill: e.color }, e.label))
339
+ children: J.map((e) => /* @__PURE__ */ C(d, { fill: e.color }, e.label))
299
340
  })
300
341
  ]
301
342
  })
302
343
  })]
303
344
  }), /* @__PURE__ */ w(E, {
304
- className: "p-5",
305
- children: [/* @__PURE__ */ w("h3", {
306
- className: "mb-4 flex items-center gap-2 text-sm font-semibold text-text-primary",
307
- children: [/* @__PURE__ */ C(y, {
308
- size: 16,
309
- className: "text-accent-teal"
310
- }), "Learning activity over time"]
345
+ className: "p-5 transition-shadow duration-200 hover:shadow-lg",
346
+ children: [/* @__PURE__ */ C(F, {
347
+ icon: _,
348
+ title: "Learning activity over time",
349
+ subtitle: "Submissions and enrollments per week",
350
+ tone: "teal"
311
351
  }), Y.length === 0 ? /* @__PURE__ */ C("div", {
312
352
  className: "flex h-[240px] items-center justify-center text-sm text-text-muted",
313
353
  children: "No dated activity yet"
314
- }) : /* @__PURE__ */ C(d, {
354
+ }) : /* @__PURE__ */ C(u, {
315
355
  width: "100%",
316
356
  height: 280,
317
- children: /* @__PURE__ */ w(ue, {
357
+ children: /* @__PURE__ */ w(pe, {
318
358
  data: Y,
319
359
  margin: {
320
360
  top: 8,
@@ -354,32 +394,32 @@ function I() {
354
394
  stopOpacity: 0
355
395
  })]
356
396
  })] }),
357
- /* @__PURE__ */ C(p, {
397
+ /* @__PURE__ */ C(f, {
358
398
  strokeDasharray: "3 3",
359
399
  stroke: "var(--color-border-seam)",
360
400
  vertical: !1
361
401
  }),
362
- /* @__PURE__ */ C(h, {
402
+ /* @__PURE__ */ C(m, {
363
403
  dataKey: "label",
364
- tick: N,
404
+ tick: M,
365
405
  axisLine: { stroke: "var(--color-border-seam)" },
366
406
  tickLine: !1
367
407
  }),
368
- /* @__PURE__ */ C(g, {
408
+ /* @__PURE__ */ C(h, {
369
409
  allowDecimals: !1,
370
- tick: N,
410
+ tick: M,
371
411
  axisLine: !1,
372
412
  tickLine: !1
373
413
  }),
374
- /* @__PURE__ */ C(u, {
375
- contentStyle: j,
376
- labelStyle: M
377
- }),
378
414
  /* @__PURE__ */ C(l, {
415
+ contentStyle: A,
416
+ labelStyle: j
417
+ }),
418
+ /* @__PURE__ */ C(c, {
379
419
  iconType: "circle",
380
420
  wrapperStyle: { fontSize: 12 }
381
421
  }),
382
- /* @__PURE__ */ C(m, {
422
+ /* @__PURE__ */ C(p, {
383
423
  type: "monotone",
384
424
  dataKey: "submissions",
385
425
  name: "Submissions",
@@ -387,7 +427,7 @@ function I() {
387
427
  strokeWidth: 2,
388
428
  fill: "url(#tec-grad-submissions)"
389
429
  }),
390
- /* @__PURE__ */ C(m, {
430
+ /* @__PURE__ */ C(p, {
391
431
  type: "monotone",
392
432
  dataKey: "enrollments",
393
433
  name: "Enrollments",
@@ -399,12 +439,12 @@ function I() {
399
439
  })
400
440
  })]
401
441
  })]
402
- }) : /* @__PURE__ */ C(a, {
403
- icon: /* @__PURE__ */ C(y, { size: 26 }),
442
+ }) : /* @__PURE__ */ C(o, {
443
+ icon: /* @__PURE__ */ C(_, { size: 26 }),
404
444
  title: "No learning activity yet",
405
445
  description: "Enroll in a course or solve a problem and your progress charts will build here. TechnoSpam is pre-launch — start learning to see your data.",
406
446
  action: /* @__PURE__ */ C(T, {
407
- onClick: () => I("/courses/courses-page"),
447
+ onClick: () => n("/courses/courses-page"),
408
448
  children: "Browse courses"
409
449
  })
410
450
  }),
@@ -412,8 +452,8 @@ function I() {
412
452
  ]
413
453
  }) : /* @__PURE__ */ w("div", {
414
454
  className: "space-y-8",
415
- children: [/* @__PURE__ */ C(a, {
416
- icon: /* @__PURE__ */ C(fe, { size: 26 }),
455
+ children: [/* @__PURE__ */ C(o, {
456
+ icon: /* @__PURE__ */ C(y, { size: 26 }),
417
457
  title: "Sign in to view your analytics",
418
458
  description: "Your personal learning metrics appear here once you're signed in."
419
459
  }), $]
@@ -421,6 +461,6 @@ function I() {
421
461
  });
422
462
  }
423
463
  //#endregion
424
- export { I as AnalyticsAnalyticsPagePage };
464
+ export { L as AnalyticsAnalyticsPagePage };
425
465
 
426
466
  //# sourceMappingURL=AnalyticsAnalyticsPagePage.js.map