@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.
- package/dist/generated/wspace-operations.js +67 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/index.js +3 -1
- package/dist/technospam/components/MediaCover.js +57 -0
- package/dist/technospam/components/MediaCover.js.map +1 -0
- package/dist/technospam/components/PageLayout.js +1 -1
- package/dist/technospam/components/PageLayout.js.map +1 -1
- package/dist/technospam/components/StatCard.js +19 -11
- package/dist/technospam/components/StatCard.js.map +1 -1
- package/dist/technospam/components/StatusBadge.js +1 -1
- package/dist/technospam/components/StatusBadge.js.map +1 -1
- package/dist/technospam/components/index.js +1 -0
- package/dist/technospam/hooks/useTechnoSpamAnalytics.js +13 -0
- package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -0
- package/dist/technospam/index.js +2 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js +525 -459
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +167 -127
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +178 -101
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +103 -99
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +316 -184
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +101 -93
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesMyLearningPagePage.js +119 -88
- package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
- package/dist/technospam/pages/DashboardDashboardPagePage.js +232 -199
- package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +128 -106
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +99 -91
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +185 -116
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +233 -165
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +146 -113
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -1
- package/dist/technospam/services/assistantApi.js +222 -0
- package/dist/technospam/services/assistantApi.js.map +1 -0
- package/dist/technospam/services/createSandboxAssistantTransport.js +120 -0
- package/dist/technospam/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/technospam/utils/pageContext.js +46 -0
- package/dist/technospam/utils/pageContext.js.map +1 -0
- package/package.json +5 -1
|
@@ -1,253 +1,385 @@
|
|
|
1
1
|
import { useTechnoSpam as e } from "../providers/TechnoSpamProvider.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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
|
|
9
|
-
import { useCertificatesQuery as
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
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
|
|
16
|
-
VIDEO:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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__ */
|
|
28
|
-
className:
|
|
29
|
-
children:
|
|
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__ */
|
|
64
|
+
/* @__PURE__ */ k("div", {
|
|
32
65
|
className: "min-w-0 flex-1",
|
|
33
|
-
children: [/* @__PURE__ */
|
|
34
|
-
className: "
|
|
35
|
-
children:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
|
60
|
-
let [
|
|
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:
|
|
63
|
-
} : {}), [
|
|
64
|
-
!
|
|
65
|
-
|
|
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 && (
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
(await
|
|
75
|
-
|
|
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 && (
|
|
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 (
|
|
150
|
+
if (L && !J) return /* @__PURE__ */ k(n, {
|
|
81
151
|
title: "Course",
|
|
82
152
|
backPath: "/courses/courses-page",
|
|
83
|
-
children: [/* @__PURE__ */
|
|
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 (
|
|
155
|
+
if (R || !J) return /* @__PURE__ */ O(n, {
|
|
86
156
|
title: "Course",
|
|
87
157
|
backPath: "/courses/courses-page",
|
|
88
|
-
children:
|
|
158
|
+
children: R ? /* @__PURE__ */ O(c, {
|
|
89
159
|
title: "Couldn't load course",
|
|
90
|
-
error:
|
|
91
|
-
}) : /* @__PURE__ */
|
|
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
|
|
97
|
-
return /* @__PURE__ */
|
|
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:
|
|
101
|
-
description:
|
|
102
|
-
actions:
|
|
103
|
-
onClick:
|
|
104
|
-
disabled:
|
|
105
|
-
children: [/* @__PURE__ */
|
|
106
|
-
}) : /* @__PURE__ */
|
|
107
|
-
onClick:
|
|
108
|
-
disabled:
|
|
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__ */
|
|
179
|
+
/* @__PURE__ */ O(h, { size: 16 }),
|
|
111
180
|
" ",
|
|
112
|
-
|
|
181
|
+
V ? "Enrolling…" : "Enroll"
|
|
113
182
|
]
|
|
114
183
|
}),
|
|
115
184
|
children: [
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
" ",
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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__ */
|
|
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__ */
|
|
231
|
+
/* @__PURE__ */ O(r, {
|
|
143
232
|
label: "Lessons",
|
|
144
|
-
value:
|
|
145
|
-
icon:
|
|
233
|
+
value: Y.length,
|
|
234
|
+
icon: y,
|
|
235
|
+
tone: "blue"
|
|
146
236
|
}),
|
|
147
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ O(r, {
|
|
148
238
|
label: "Duration",
|
|
149
|
-
value:
|
|
150
|
-
icon: _
|
|
239
|
+
value: o(J.estimatedMinutes),
|
|
240
|
+
icon: _,
|
|
241
|
+
tone: "teal"
|
|
151
242
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
243
|
+
/* @__PURE__ */ O(r, {
|
|
153
244
|
label: "Enrolled",
|
|
154
|
-
value:
|
|
155
|
-
icon:
|
|
245
|
+
value: J.enrollments?.length ?? 0,
|
|
246
|
+
icon: E,
|
|
247
|
+
tone: "indigo"
|
|
156
248
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ O(r, {
|
|
158
250
|
label: "Your progress",
|
|
159
|
-
value:
|
|
160
|
-
icon:
|
|
251
|
+
value: X ? `${X.progressPct}%` : "Not started",
|
|
252
|
+
icon: T,
|
|
253
|
+
tone: "purple"
|
|
161
254
|
})
|
|
162
255
|
]
|
|
163
256
|
}),
|
|
164
|
-
|
|
165
|
-
className: "mb-6 p-
|
|
166
|
-
children: [
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
191
|
-
className: "mb-6 flex flex-wrap items-center gap-3 border-status-success-border p-4",
|
|
192
|
-
children: [
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
className: "
|
|
199
|
-
children: "
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
"
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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__ */
|
|
221
|
-
className: "text-
|
|
334
|
+
}), /* @__PURE__ */ O("div", {
|
|
335
|
+
className: "text-sm text-text-muted",
|
|
222
336
|
children: "Claim your verifiable certificate of completion."
|
|
223
337
|
})] })]
|
|
224
|
-
}), /* @__PURE__ */
|
|
225
|
-
onClick:
|
|
226
|
-
disabled:
|
|
338
|
+
}), /* @__PURE__ */ k(j, {
|
|
339
|
+
onClick: oe,
|
|
340
|
+
disabled: q,
|
|
227
341
|
children: [
|
|
228
|
-
/* @__PURE__ */
|
|
342
|
+
/* @__PURE__ */ O(m, { size: 16 }),
|
|
229
343
|
" ",
|
|
230
|
-
|
|
344
|
+
q ? "Issuing…" : "Claim certificate"
|
|
231
345
|
]
|
|
232
346
|
})]
|
|
233
347
|
}) : null,
|
|
234
|
-
/* @__PURE__ */
|
|
348
|
+
/* @__PURE__ */ k(M, {
|
|
235
349
|
className: "p-5",
|
|
236
|
-
children: [/* @__PURE__ */
|
|
237
|
-
className: "mb-
|
|
238
|
-
children: "
|
|
239
|
-
|
|
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__ */
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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 {
|
|
383
|
+
export { L as CoursesCourseDetailsPagePage };
|
|
252
384
|
|
|
253
385
|
//# sourceMappingURL=CoursesCourseDetailsPagePage.js.map
|