@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,253 +1,385 @@
1
1
  import { useTechnoSpam as e } from "../providers/TechnoSpamProvider.js";
2
- import { PageLayout as t } from "../components/PageLayout.js";
3
- import { StatCard as n } from "../components/StatCard.js";
4
- import { formatDuration as r, humanizeEnum as i } from "../utils/format.js";
5
- import { StatusBadge as a } from "../components/StatusBadge.js";
6
- import { EmptyView as o, ErrorView as s } from "../components/StateViews.js";
2
+ import { cn as t } from "../utils/cn.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
+ import { StatCard as r } from "../components/StatCard.js";
5
+ import { MediaCover as i, topicIcon as a } from "../components/MediaCover.js";
6
+ import { formatDuration as o, humanizeEnum as s } from "../utils/format.js";
7
+ import { EmptyView as ee, ErrorView as c } from "../components/StateViews.js";
7
8
  import "../components/index.js";
8
- import { notify as c } from "../lib/toast.js";
9
- import { useCertificatesQuery as l, useCourseQuery as u, useEnroll as d, useIssueCertificate as f, useUpdateProgress as p } from "../api/technospamApi.js";
10
- import { Award as m, BookOpen as h, CheckCircle2 as g, Clock as _, FileText as v, Layers as y, Lock as b, PlayCircle as x, Sparkles as S } from "lucide-react";
11
- import { useSearchParams as C } from "react-router-dom";
12
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
13
- import { Badge as E, Button as D, GlassCard as O, Skeleton as k } from "@burdenoff/fe-libs/ui";
9
+ import { notify as l } from "../lib/toast.js";
10
+ import { useCertificatesQuery as u, useCourseQuery as d, useEnroll as f, useIssueCertificate as p, useUpdateProgress as te } from "../api/technospamApi.js";
11
+ import { useTechnoSpamAnalytics as ne } from "../hooks/useTechnoSpamAnalytics.js";
12
+ import { useEffect as re } from "react";
13
+ import { Award as m, BookOpen as h, CheckCircle2 as g, Clock as _, Eye as v, FileText as y, Layers as b, Lock as x, PlayCircle as S, ShieldCheck as C, Sparkles as w, TrendingUp as T, Trophy as ie, Users as E } from "lucide-react";
14
+ import { useSearchParams as D } from "react-router-dom";
15
+ import { jsx as O, jsxs as k } from "react/jsx-runtime";
16
+ import { Badge as A, Button as j, GlassCard as M, Skeleton as N } from "@burdenoff/fe-libs/ui";
14
17
  //#region src/technospam/pages/CoursesCourseDetailsPagePage.tsx
15
- var A = {
16
- VIDEO: x,
17
- ARTICLE: v,
18
- INTERACTIVE: S,
19
- QUIZ: g,
20
- PROJECT: y
18
+ var P = {
19
+ VIDEO: {
20
+ icon: S,
21
+ chip: "bg-accent-primary/15 text-accent-primary",
22
+ badge: "border-accent-primary/25 bg-accent-primary/10 text-accent-primary"
23
+ },
24
+ ARTICLE: {
25
+ icon: y,
26
+ chip: "bg-accent-indigo/15 text-accent-indigo",
27
+ badge: "border-accent-indigo/25 bg-accent-indigo/10 text-accent-indigo"
28
+ },
29
+ INTERACTIVE: {
30
+ icon: w,
31
+ chip: "bg-accent-teal/15 text-accent-teal",
32
+ badge: "border-accent-teal/25 bg-accent-teal/10 text-accent-teal"
33
+ },
34
+ QUIZ: {
35
+ icon: g,
36
+ chip: "bg-accent-purple/15 text-accent-purple",
37
+ badge: "border-accent-purple/25 bg-accent-purple/10 text-accent-purple"
38
+ },
39
+ PROJECT: {
40
+ icon: b,
41
+ chip: "bg-status-warning-bg-subtle text-status-warning-text",
42
+ badge: "border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text"
43
+ }
21
44
  };
22
- function j({ lesson: e, done: t }) {
23
- let n = A[e.kind] ?? v;
24
- return /* @__PURE__ */ T("div", {
25
- className: "flex items-center gap-3 border-b border-border-seam py-3 last:border-0",
45
+ function F({ icon: e, children: t }) {
46
+ return /* @__PURE__ */ k("span", {
47
+ className: "inline-flex items-center gap-1 rounded-full bg-white/15 px-2.5 py-1 text-xs font-medium text-white ring-1 ring-white/25 backdrop-blur-sm",
48
+ children: [e ? /* @__PURE__ */ O(e, { size: 12 }) : null, t]
49
+ });
50
+ }
51
+ function I({ lesson: e, index: n, done: r }) {
52
+ let i = P[e.kind] ?? P.ARTICLE, a = i.icon;
53
+ return /* @__PURE__ */ k("div", {
54
+ className: "group flex items-center gap-3 rounded-xl px-2 py-3 transition-colors hover:bg-bg-sunken/60",
26
55
  children: [
27
- /* @__PURE__ */ w("span", {
28
- className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${t ? "bg-status-success-bg-subtle text-status-success-text" : "bg-bg-sunken text-text-secondary"}`,
29
- children: w(t ? g : n, { size: 16 })
56
+ /* @__PURE__ */ O("span", {
57
+ className: "hidden w-6 shrink-0 text-center text-sm font-medium tabular-nums text-text-muted sm:block",
58
+ children: n + 1
59
+ }),
60
+ /* @__PURE__ */ O("span", {
61
+ className: t("flex h-9 w-9 shrink-0 items-center justify-center rounded-lg", r ? "bg-status-success-bg-subtle text-status-success-text" : i.chip),
62
+ children: O(r ? g : a, { size: 17 })
30
63
  }),
31
- /* @__PURE__ */ T("div", {
64
+ /* @__PURE__ */ k("div", {
32
65
  className: "min-w-0 flex-1",
33
- children: [/* @__PURE__ */ T("div", {
34
- className: "flex items-center gap-2",
35
- children: [/* @__PURE__ */ w("span", {
36
- className: "truncate text-sm font-medium text-text-primary",
37
- children: e.title
38
- }), e.isPreview ? /* @__PURE__ */ w(E, {
39
- variant: "secondary",
40
- className: "text-[11px]",
41
- children: "Preview"
42
- }) : null]
43
- }), /* @__PURE__ */ T("div", {
44
- className: "text-xs text-text-muted",
45
- children: [
46
- i(e.kind),
47
- " · ",
48
- r(e.estimatedMinutes)
49
- ]
66
+ children: [/* @__PURE__ */ O("span", {
67
+ className: "block truncate text-sm font-medium text-text-primary",
68
+ children: e.title
69
+ }), /* @__PURE__ */ k("div", {
70
+ className: "mt-1 flex flex-wrap items-center gap-2",
71
+ children: [/* @__PURE__ */ O("span", {
72
+ className: t("inline-flex items-center rounded-full border px-2 py-0.5 text-[11px] font-medium", i.badge),
73
+ children: s(e.kind)
74
+ }), /* @__PURE__ */ k("span", {
75
+ className: "inline-flex items-center gap-1 text-xs text-text-muted",
76
+ children: [
77
+ /* @__PURE__ */ O(_, { size: 12 }),
78
+ " ",
79
+ o(e.estimatedMinutes)
80
+ ]
81
+ })]
50
82
  })]
51
83
  }),
52
- !e.isPreview && !t ? /* @__PURE__ */ w(b, {
53
- size: 14,
54
- className: "text-text-muted"
55
- }) : null
84
+ /* @__PURE__ */ O("div", {
85
+ className: "shrink-0",
86
+ children: r ? /* @__PURE__ */ O(g, {
87
+ size: 18,
88
+ className: "text-status-success-text"
89
+ }) : e.isPreview ? /* @__PURE__ */ k("span", {
90
+ className: "inline-flex items-center gap-1 rounded-full border border-accent-primary/30 bg-accent-primary/10 px-2 py-0.5 text-[11px] font-medium text-accent-primary",
91
+ children: [/* @__PURE__ */ O(v, { size: 12 }), " Preview"]
92
+ }) : /* @__PURE__ */ O(x, {
93
+ size: 15,
94
+ className: "text-text-muted"
95
+ })
96
+ })
56
97
  ]
57
98
  });
58
99
  }
59
- function M() {
60
- let [i] = C(), b = i.get("id") ?? "", { currentUser: x } = e(), { data: S, loading: A, error: M, refetch: N } = u(b), [P, { loading: F }] = d(), [I, { loading: L }] = p(), { data: R, refetch: z } = l(x?.id && b ? {
100
+ function L() {
101
+ let [t] = D(), v = t.get("id") ?? "", { currentUser: x, workspaceId: S } = e(), { emit: w } = ne(), { data: P, loading: L, error: R, refetch: z } = d(v);
102
+ re(() => {
103
+ v && w("technospam.course.viewed", {
104
+ workspaceId: S,
105
+ entityId: v,
106
+ entityType: "TEC_COURSE"
107
+ });
108
+ }, [
109
+ v,
110
+ S,
111
+ w
112
+ ]);
113
+ let [B, { loading: V }] = f(), [H, { loading: U }] = te(), { data: W, refetch: G } = u(x?.id && v ? {
61
114
  learnerId: x.id,
62
- courseId: b
63
- } : {}), [B, { loading: V }] = f(), H = S?.tecCourse ?? null, U = [...H?.lessons ?? []].sort((e, t) => e.position - t.position), W = (H?.enrollments ?? []).find((e) => e.learnerId === x?.id), G = (R?.tecListCertificates ?? []).find((e) => e.status === "ISSUED"), K = !!W && W.progressPct >= 100, q = async () => {
64
- !b || !x?.id || (await B({ variables: {
65
- courseId: b,
115
+ courseId: v
116
+ } : {}), [K, { loading: q }] = p(), J = P?.tecCourse ?? null, Y = [...J?.lessons ?? []].sort((e, t) => e.position - t.position), X = (J?.enrollments ?? []).find((e) => e.learnerId === x?.id), Z = (W?.tecListCertificates ?? []).find((e) => e.status === "ISSUED"), ae = !!X && X.progressPct >= 100, oe = async () => {
117
+ !v || !x?.id || (w("technospam.course.certificate_claimed", {
118
+ workspaceId: S,
119
+ entityId: v,
120
+ entityType: "TEC_COURSE"
121
+ }), (await K({ variables: {
122
+ courseId: v,
66
123
  learnerId: x.id,
67
124
  score: 100
68
- } })).data?.tecIssueCertificate && (c.success("Certificate issued", "Your verifiable certificate is ready in My Learning."), await z());
69
- }, J = async () => {
70
- b && (await P({ variables: { input: { courseId: b } } })).data?.tecEnroll && (c.success("Enrolled", `You're enrolled in "${H?.title}".`), await N());
71
- }, Y = async () => {
72
- if (!W) return;
73
- let e = Math.min(U.length, W.lessonsCompleted + 1), t = U.length ? Math.round(e / U.length * 100) : 100;
74
- (await I({ variables: { input: {
75
- enrollmentId: W.id,
125
+ } })).data?.tecIssueCertificate && (l.success("Certificate issued", "Your verifiable certificate is ready in My Learning."), await G()));
126
+ }, se = async () => {
127
+ v && (w("technospam.course.enroll_clicked", {
128
+ workspaceId: S,
129
+ entityId: v,
130
+ entityType: "TEC_COURSE"
131
+ }), (await B({ variables: { input: { courseId: v } } })).data?.tecEnroll && (w("technospam.course.enrolled", {
132
+ workspaceId: S,
133
+ entityId: v,
134
+ entityType: "TEC_COURSE"
135
+ }), l.success("Enrolled", `You're enrolled in "${J?.title}".`), await z()));
136
+ }, ce = async () => {
137
+ if (!X) return;
138
+ let e = Math.min(Y.length, X.lessonsCompleted + 1), t = Y.length ? Math.round(e / Y.length * 100) : 100;
139
+ (await H({ variables: { input: {
140
+ enrollmentId: X.id,
76
141
  lessonsCompleted: e,
77
142
  progressPct: t
78
- } } })).data?.tecUpdateProgress && (c.success("Progress saved", `${t}% complete`), await N());
143
+ } } })).data?.tecUpdateProgress && (w("technospam.course.progress_updated", {
144
+ workspaceId: S,
145
+ entityId: X.id,
146
+ entityType: "TEC_ENROLLMENT",
147
+ progressPct: t
148
+ }), l.success("Progress saved", `${t}% complete`), await z());
79
149
  };
80
- if (A && !H) return /* @__PURE__ */ T(t, {
150
+ if (L && !J) return /* @__PURE__ */ k(n, {
81
151
  title: "Course",
82
152
  backPath: "/courses/courses-page",
83
- children: [/* @__PURE__ */ w(k, { className: "mb-4 h-40 w-full rounded-xl" }), /* @__PURE__ */ w(k, { className: "h-64 w-full rounded-xl" })]
153
+ children: [/* @__PURE__ */ O(N, { className: "mb-4 h-40 w-full rounded-2xl" }), /* @__PURE__ */ O(N, { className: "h-64 w-full rounded-xl" })]
84
154
  });
85
- if (M || !H) return /* @__PURE__ */ w(t, {
155
+ if (R || !J) return /* @__PURE__ */ O(n, {
86
156
  title: "Course",
87
157
  backPath: "/courses/courses-page",
88
- children: M ? /* @__PURE__ */ w(s, {
158
+ children: R ? /* @__PURE__ */ O(c, {
89
159
  title: "Couldn't load course",
90
- error: M
91
- }) : /* @__PURE__ */ w(o, {
160
+ error: R
161
+ }) : /* @__PURE__ */ O(ee, {
92
162
  title: "Course not found",
93
163
  description: "This course may have been unpublished."
94
164
  })
95
165
  });
96
- let X = W?.lessonsCompleted ?? 0;
97
- return /* @__PURE__ */ T(t, {
98
- hero: !0,
166
+ let Q = X?.lessonsCompleted ?? 0, $ = Math.max(0, Y.length - Q), le = X && X.progressPct >= 100 ? "Course complete — claim your certificate below." : $ === 1 ? "1 lesson to go — almost there!" : `${$} lessons to go — keep it up!`, ue = `${J.topic ?? ""} ${J.title}`;
167
+ return /* @__PURE__ */ k(n, {
99
168
  backPath: "/courses/courses-page",
100
- title: H.title,
101
- description: H.summary ?? void 0,
102
- actions: W ? /* @__PURE__ */ T(D, {
103
- onClick: Y,
104
- disabled: L || X >= U.length,
105
- children: [/* @__PURE__ */ w(g, { size: 16 }), X >= U.length ? "Completed" : "Complete next lesson"]
106
- }) : /* @__PURE__ */ T(D, {
107
- onClick: J,
108
- disabled: F,
169
+ title: J.title,
170
+ description: J.summary ?? void 0,
171
+ actions: X ? /* @__PURE__ */ k(j, {
172
+ onClick: ce,
173
+ disabled: U || Q >= Y.length,
174
+ children: [/* @__PURE__ */ O(g, { size: 16 }), Q >= Y.length ? "Completed" : "Complete next lesson"]
175
+ }) : /* @__PURE__ */ k(j, {
176
+ onClick: se,
177
+ disabled: V,
109
178
  children: [
110
- /* @__PURE__ */ w(h, { size: 16 }),
179
+ /* @__PURE__ */ O(h, { size: 16 }),
111
180
  " ",
112
- F ? "Enrolling…" : "Enroll"
181
+ V ? "Enrolling…" : "Enroll"
113
182
  ]
114
183
  }),
115
184
  children: [
116
- /* @__PURE__ */ T("div", {
117
- className: "mb-5 flex flex-wrap items-center gap-2",
118
- children: [
119
- /* @__PURE__ */ w(a, {
120
- status: H.level,
121
- kind: "level"
122
- }),
123
- /* @__PURE__ */ w(a, { status: H.status }),
124
- H.topic ? /* @__PURE__ */ T(E, {
125
- variant: "outline",
126
- className: "gap-1",
127
- children: [
128
- /* @__PURE__ */ w(y, { size: 12 }),
129
- " ",
130
- H.topic
131
- ]
132
- }) : null,
133
- H.tags.map((e) => /* @__PURE__ */ w(E, {
134
- variant: "secondary",
135
- children: e
136
- }, e))
137
- ]
185
+ /* @__PURE__ */ O(i, {
186
+ height: "h-40",
187
+ seed: ue,
188
+ icon: a(J.topic ?? J.title),
189
+ className: "mb-5 rounded-2xl",
190
+ children: /* @__PURE__ */ k("div", {
191
+ className: "flex w-full flex-col gap-2",
192
+ children: [
193
+ /* @__PURE__ */ O("span", {
194
+ className: "text-xs font-medium uppercase tracking-wide text-white/80",
195
+ children: J.topic ?? "Course"
196
+ }),
197
+ /* @__PURE__ */ O("h2", {
198
+ className: "text-2xl font-bold leading-tight text-white drop-shadow-sm sm:text-3xl",
199
+ children: J.title
200
+ }),
201
+ /* @__PURE__ */ k("div", {
202
+ className: "flex flex-wrap items-center gap-2",
203
+ children: [
204
+ /* @__PURE__ */ O(F, {
205
+ icon: T,
206
+ children: s(J.level)
207
+ }),
208
+ /* @__PURE__ */ O(F, {
209
+ icon: g,
210
+ children: s(J.status)
211
+ }),
212
+ J.topic ? /* @__PURE__ */ O(F, {
213
+ icon: b,
214
+ children: J.topic
215
+ }) : null
216
+ ]
217
+ })
218
+ ]
219
+ })
138
220
  }),
139
- /* @__PURE__ */ T("div", {
221
+ J.tags.length ? /* @__PURE__ */ O("div", {
222
+ className: "mb-5 flex flex-wrap items-center gap-2",
223
+ children: J.tags.map((e) => /* @__PURE__ */ O(A, {
224
+ variant: "secondary",
225
+ children: e
226
+ }, e))
227
+ }) : null,
228
+ /* @__PURE__ */ k("div", {
140
229
  className: "mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4",
141
230
  children: [
142
- /* @__PURE__ */ w(n, {
231
+ /* @__PURE__ */ O(r, {
143
232
  label: "Lessons",
144
- value: U.length,
145
- icon: v
233
+ value: Y.length,
234
+ icon: y,
235
+ tone: "blue"
146
236
  }),
147
- /* @__PURE__ */ w(n, {
237
+ /* @__PURE__ */ O(r, {
148
238
  label: "Duration",
149
- value: r(H.estimatedMinutes),
150
- icon: _
239
+ value: o(J.estimatedMinutes),
240
+ icon: _,
241
+ tone: "teal"
151
242
  }),
152
- /* @__PURE__ */ w(n, {
243
+ /* @__PURE__ */ O(r, {
153
244
  label: "Enrolled",
154
- value: H.enrollments?.length ?? 0,
155
- icon: h
245
+ value: J.enrollments?.length ?? 0,
246
+ icon: E,
247
+ tone: "indigo"
156
248
  }),
157
- /* @__PURE__ */ w(n, {
249
+ /* @__PURE__ */ O(r, {
158
250
  label: "Your progress",
159
- value: W ? `${W.progressPct}%` : "Not started",
160
- icon: g
251
+ value: X ? `${X.progressPct}%` : "Not started",
252
+ icon: T,
253
+ tone: "purple"
161
254
  })
162
255
  ]
163
256
  }),
164
- W ? /* @__PURE__ */ T(O, {
165
- className: "mb-6 p-4",
166
- children: [/* @__PURE__ */ T("div", {
167
- className: "mb-2 flex items-center justify-between text-sm",
168
- children: [/* @__PURE__ */ w("span", {
169
- className: "font-medium text-text-primary",
170
- children: "Your progress"
171
- }), /* @__PURE__ */ T("span", {
172
- className: "text-text-secondary",
257
+ X ? /* @__PURE__ */ k(M, {
258
+ className: "mb-6 p-5",
259
+ children: [
260
+ /* @__PURE__ */ k("div", {
261
+ className: "mb-3 flex items-center gap-2",
173
262
  children: [
174
- X,
175
- "/",
176
- U.length,
177
- " lessons · ",
178
- W.progressPct,
179
- "%"
263
+ /* @__PURE__ */ O("span", {
264
+ className: "flex h-8 w-8 items-center justify-center rounded-lg bg-accent-primary/15 text-accent-primary",
265
+ children: /* @__PURE__ */ O(T, { size: 16 })
266
+ }),
267
+ /* @__PURE__ */ O("span", {
268
+ className: "text-sm font-semibold text-text-primary",
269
+ children: "Your progress"
270
+ }),
271
+ /* @__PURE__ */ k("span", {
272
+ className: "ml-auto text-sm text-text-secondary",
273
+ children: [
274
+ Q,
275
+ "/",
276
+ Y.length,
277
+ " lessons · ",
278
+ X.progressPct,
279
+ "%"
280
+ ]
281
+ })
180
282
  ]
181
- })]
182
- }), /* @__PURE__ */ w("div", {
183
- className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
184
- children: /* @__PURE__ */ w("div", {
185
- className: "h-full rounded-full bg-accent-primary transition-all",
186
- style: { width: `${W.progressPct}%` }
283
+ }),
284
+ /* @__PURE__ */ O("div", {
285
+ className: "h-2.5 w-full overflow-hidden rounded-full bg-bg-sunken",
286
+ children: /* @__PURE__ */ O("div", {
287
+ className: "h-full rounded-full bg-gradient-to-r from-accent-primary via-accent-indigo to-accent-purple transition-all duration-500",
288
+ style: { width: `${X.progressPct}%` }
289
+ })
290
+ }),
291
+ /* @__PURE__ */ O("p", {
292
+ className: "mt-2 text-xs text-text-muted",
293
+ children: le
187
294
  })
188
- })]
295
+ ]
189
296
  }) : null,
190
- G ? /* @__PURE__ */ T(O, {
191
- className: "mb-6 flex flex-wrap items-center gap-3 border-status-success-border p-4",
192
- children: [/* @__PURE__ */ w(m, {
193
- className: "text-accent-teal",
194
- size: 22
195
- }), /* @__PURE__ */ T("div", {
196
- className: "min-w-0",
197
- children: [/* @__PURE__ */ w("div", {
198
- className: "text-sm font-semibold text-text-primary",
199
- children: "Certificate earned"
200
- }), /* @__PURE__ */ T("div", {
201
- className: "text-xs text-text-muted",
202
- children: [
203
- "Serial ",
204
- G.serial,
205
- " · Score ",
206
- G.score
207
- ]
208
- })]
209
- })]
210
- }) : K ? /* @__PURE__ */ T(O, {
211
- className: "mb-6 flex flex-wrap items-center justify-between gap-3 p-4",
212
- children: [/* @__PURE__ */ T("div", {
213
- className: "flex items-center gap-3",
214
- children: [/* @__PURE__ */ w(m, {
215
- className: "text-accent-teal",
216
- size: 22
217
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("div", {
218
- className: "text-sm font-semibold text-text-primary",
297
+ Z ? /* @__PURE__ */ k(M, {
298
+ className: "mb-6 flex flex-wrap items-center gap-3 border border-status-success-border/60 bg-status-success-bg-subtle/30 p-4",
299
+ children: [
300
+ /* @__PURE__ */ O("span", {
301
+ className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-status-warning-bg-subtle text-status-warning-text ring-1 ring-status-warning-border/30",
302
+ children: /* @__PURE__ */ O(m, { size: 22 })
303
+ }),
304
+ /* @__PURE__ */ k("div", {
305
+ className: "min-w-0 flex-1",
306
+ children: [/* @__PURE__ */ O("div", {
307
+ className: "text-sm font-semibold text-text-primary",
308
+ children: "Certificate earned"
309
+ }), /* @__PURE__ */ k("div", {
310
+ className: "text-xs text-text-muted",
311
+ children: [
312
+ "Serial ",
313
+ Z.serial,
314
+ " · Score ",
315
+ Z.score
316
+ ]
317
+ })]
318
+ }),
319
+ /* @__PURE__ */ k("span", {
320
+ className: "inline-flex items-center gap-1 rounded-full border border-status-success-border bg-status-success-bg-subtle px-2.5 py-1 text-xs font-medium text-status-success-text",
321
+ children: [/* @__PURE__ */ O(C, { size: 13 }), " Verified"]
322
+ })
323
+ ]
324
+ }) : ae ? /* @__PURE__ */ k(M, {
325
+ className: "mb-6 flex flex-col items-start gap-4 border border-status-success-border/60 bg-status-success-bg-subtle/40 p-5 sm:flex-row sm:items-center sm:justify-between",
326
+ children: [/* @__PURE__ */ k("div", {
327
+ className: "flex items-center gap-4",
328
+ children: [/* @__PURE__ */ O("span", {
329
+ className: "flex h-14 w-14 shrink-0 items-center justify-center rounded-2xl bg-status-warning-bg-subtle text-status-warning-text ring-1 ring-status-warning-border/40",
330
+ children: /* @__PURE__ */ O(ie, { size: 26 })
331
+ }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("div", {
332
+ className: "text-base font-semibold text-text-primary",
219
333
  children: "You finished this course"
220
- }), /* @__PURE__ */ w("div", {
221
- className: "text-xs text-text-muted",
334
+ }), /* @__PURE__ */ O("div", {
335
+ className: "text-sm text-text-muted",
222
336
  children: "Claim your verifiable certificate of completion."
223
337
  })] })]
224
- }), /* @__PURE__ */ T(D, {
225
- onClick: q,
226
- disabled: V,
338
+ }), /* @__PURE__ */ k(j, {
339
+ onClick: oe,
340
+ disabled: q,
227
341
  children: [
228
- /* @__PURE__ */ w(m, { size: 16 }),
342
+ /* @__PURE__ */ O(m, { size: 16 }),
229
343
  " ",
230
- V ? "Issuing…" : "Claim certificate"
344
+ q ? "Issuing…" : "Claim certificate"
231
345
  ]
232
346
  })]
233
347
  }) : null,
234
- /* @__PURE__ */ T(O, {
348
+ /* @__PURE__ */ k(M, {
235
349
  className: "p-5",
236
- children: [/* @__PURE__ */ w("h2", {
237
- className: "mb-2 text-base font-semibold text-text-primary",
238
- children: "Curriculum"
239
- }), U.length === 0 ? /* @__PURE__ */ w("p", {
350
+ children: [/* @__PURE__ */ k("div", {
351
+ className: "mb-3 flex items-center justify-between gap-2",
352
+ children: [/* @__PURE__ */ k("h2", {
353
+ className: "flex items-center gap-2 text-base font-semibold text-text-primary",
354
+ children: [/* @__PURE__ */ O(h, {
355
+ size: 18,
356
+ className: "text-accent-primary"
357
+ }), " Curriculum"]
358
+ }), Y.length ? /* @__PURE__ */ k("span", {
359
+ className: "rounded-full bg-status-success-bg-subtle px-2.5 py-1 text-xs font-medium text-status-success-text",
360
+ children: [
361
+ Q,
362
+ "/",
363
+ Y.length,
364
+ " completed"
365
+ ]
366
+ }) : null]
367
+ }), Y.length === 0 ? /* @__PURE__ */ O("p", {
240
368
  className: "py-6 text-center text-sm text-text-muted",
241
369
  children: "Lessons for this course are being prepared."
242
- }) : /* @__PURE__ */ w("div", { children: U.map((e, t) => /* @__PURE__ */ w(j, {
243
- lesson: e,
244
- done: t < X
245
- }, e.id)) })]
370
+ }) : /* @__PURE__ */ O("div", {
371
+ className: "flex flex-col",
372
+ children: Y.map((e, t) => /* @__PURE__ */ O(I, {
373
+ lesson: e,
374
+ index: t,
375
+ done: t < Q
376
+ }, e.id))
377
+ })]
246
378
  })
247
379
  ]
248
380
  });
249
381
  }
250
382
  //#endregion
251
- export { M as CoursesCourseDetailsPagePage };
383
+ export { L as CoursesCourseDetailsPagePage };
252
384
 
253
385
  //# sourceMappingURL=CoursesCourseDetailsPagePage.js.map