@burdenoff/microfe-technospam 2026.1030.4 → 2026.1030.6

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 (67) hide show
  1. package/dist/generated/wspace-types.d.ts +1501 -11
  2. package/dist/generated/wspace-types.d.ts.map +1 -1
  3. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
  4. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
  5. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
  6. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
  7. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
  8. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
  9. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
  10. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
  11. package/dist/node_modules/sonner/dist/index.js.map +1 -1
  12. package/dist/stories/fixtures/technospamFixtures.d.ts +1 -0
  13. package/dist/stories/fixtures/technospamFixtures.d.ts.map +1 -1
  14. package/dist/stories/journeys/Courses.stories.d.ts +5 -2
  15. package/dist/stories/journeys/Courses.stories.d.ts.map +1 -1
  16. package/dist/stories/journeys/Dashboard.stories.d.ts +2 -2
  17. package/dist/stories/journeys/Dashboard.stories.d.ts.map +1 -1
  18. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -1
  19. package/dist/technospam/TechnoSpamRoutes.js +31 -27
  20. package/dist/technospam/TechnoSpamRoutes.js.map +1 -1
  21. package/dist/technospam/api/technospamApi.d.ts +101 -5
  22. package/dist/technospam/api/technospamApi.d.ts.map +1 -1
  23. package/dist/technospam/api/technospamApi.js +278 -146
  24. package/dist/technospam/api/technospamApi.js.map +1 -1
  25. package/dist/technospam/components/lesson/InteractiveWorkspace.d.ts +15 -0
  26. package/dist/technospam/components/lesson/InteractiveWorkspace.d.ts.map +1 -0
  27. package/dist/technospam/components/lesson/InteractiveWorkspace.js +198 -0
  28. package/dist/technospam/components/lesson/InteractiveWorkspace.js.map +1 -0
  29. package/dist/technospam/components/lesson/LessonKindFields.d.ts +15 -0
  30. package/dist/technospam/components/lesson/LessonKindFields.d.ts.map +1 -0
  31. package/dist/technospam/components/lesson/LessonKindFields.js +150 -0
  32. package/dist/technospam/components/lesson/LessonKindFields.js.map +1 -0
  33. package/dist/technospam/components/lesson/QuizLesson.d.ts +14 -0
  34. package/dist/technospam/components/lesson/QuizLesson.d.ts.map +1 -0
  35. package/dist/technospam/components/lesson/QuizLesson.js +105 -0
  36. package/dist/technospam/components/lesson/QuizLesson.js.map +1 -0
  37. package/dist/technospam/components/lesson/lessonAuthoring.d.ts +47 -0
  38. package/dist/technospam/components/lesson/lessonAuthoring.d.ts.map +1 -0
  39. package/dist/technospam/components/lesson/lessonAuthoring.js +80 -0
  40. package/dist/technospam/components/lesson/lessonAuthoring.js.map +1 -0
  41. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts +1 -1
  42. package/dist/technospam/hooks/useTechnoSpamAnalytics.d.ts.map +1 -1
  43. package/dist/technospam/hooks/useTechnoSpamAnalytics.js.map +1 -1
  44. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -1
  45. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +230 -207
  46. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -1
  47. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -1
  48. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +130 -132
  49. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  50. package/dist/technospam/pages/CoursesLessonPlayerPagePage.d.ts +9 -0
  51. package/dist/technospam/pages/CoursesLessonPlayerPagePage.d.ts.map +1 -0
  52. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js +291 -0
  53. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js.map +1 -0
  54. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts.map +1 -1
  55. package/dist/technospam/pages/CoursesMyLearningPagePage.js +80 -78
  56. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -1
  57. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -1
  58. package/dist/technospam/pages/DashboardDashboardPagePage.js +136 -133
  59. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -1
  60. package/dist/technospam/utils/lessonPath.d.ts +15 -0
  61. package/dist/technospam/utils/lessonPath.d.ts.map +1 -0
  62. package/dist/technospam/utils/lessonPath.js +15 -0
  63. package/dist/technospam/utils/lessonPath.js.map +1 -0
  64. package/dist/technospam/utils/pageContext.d.ts.map +1 -1
  65. package/dist/technospam/utils/pageContext.js +10 -0
  66. package/dist/technospam/utils/pageContext.js.map +1 -1
  67. package/package.json +1 -1
@@ -6,20 +6,21 @@ import { MediaCover as a, topicIcon as o } from "../components/MediaCover.js";
6
6
  import { formatDate as s, formatDateTime as c, formatMoney as l } from "../utils/format.js";
7
7
  import { StatusBadge as u } from "../components/StatusBadge.js";
8
8
  import { EmptyView as d, ErrorView as f, LoadingRows as p } from "../components/StateViews.js";
9
- import { useCertificatesQuery as ee, useCoursesQuery as m, useEnrollmentsQuery as h, useHackathonsQuery as g, useSessionsQuery as _, useSubmissionsQuery as v } from "../api/technospamApi.js";
9
+ import { useCertificatesQuery as m, useCoursesQuery as h, useEnrollmentsQuery as ee, useHackathonsQuery as te, useMyNextLessonsQuery as g, useSessionsQuery as _, useSubmissionsQuery as v } from "../api/technospamApi.js";
10
10
  import "../components/index.js";
11
- import { useMemo as y, useState as b } from "react";
12
- import { ArrowRight as x, Award as S, BookOpen as C, Calendar as w, CalendarClock as T, CheckCircle2 as E, Clock as D, Code2 as O, GraduationCap as k, PlayCircle as A, Trophy as j, Users as te } from "lucide-react";
13
- import { jsx as M, jsxs as N } from "react/jsx-runtime";
14
- import { Button as P, GlassCard as F } from "@burdenoff/fe-libs/ui";
11
+ import { resumePath as y } from "../utils/lessonPath.js";
12
+ import { useMemo as b, useState as ne } from "react";
13
+ import { ArrowRight as x, Award as S, BookOpen as C, Calendar as w, CalendarClock as T, CheckCircle2 as E, Clock as D, Code2 as O, GraduationCap as k, PlayCircle as A, Trophy as j, Users as M } from "lucide-react";
14
+ import { jsx as N, jsxs as P } from "react/jsx-runtime";
15
+ import { Button as F, GlassCard as I } from "@burdenoff/fe-libs/ui";
15
16
  //#region src/technospam/pages/DashboardDashboardPagePage.tsx
16
- function I({ title: e, actionLabel: t, onAction: n }) {
17
- return /* @__PURE__ */ N("div", {
17
+ function L({ title: e, actionLabel: t, onAction: n }) {
18
+ return /* @__PURE__ */ P("div", {
18
19
  className: "mb-3 flex items-center justify-between",
19
- children: [/* @__PURE__ */ M("h2", {
20
+ children: [/* @__PURE__ */ N("h2", {
20
21
  className: "text-base font-semibold text-text-primary",
21
22
  children: e
22
- }), t && n ? /* @__PURE__ */ N(P, {
23
+ }), t && n ? /* @__PURE__ */ P(F, {
23
24
  variant: "ghost",
24
25
  size: "sm",
25
26
  className: "text-xs",
@@ -27,51 +28,52 @@ function I({ title: e, actionLabel: t, onAction: n }) {
27
28
  children: [
28
29
  t,
29
30
  " ",
30
- /* @__PURE__ */ M(x, { size: 13 })
31
+ /* @__PURE__ */ N(x, { size: 13 })
31
32
  ]
32
33
  }) : null]
33
34
  });
34
35
  }
35
- function L({ pct: e }) {
36
- return /* @__PURE__ */ M("div", {
36
+ function R({ pct: e }) {
37
+ return /* @__PURE__ */ N("div", {
37
38
  className: "h-1.5 w-full overflow-hidden rounded-full bg-bg-sunken",
38
- children: /* @__PURE__ */ M("div", {
39
+ children: /* @__PURE__ */ N("div", {
39
40
  className: "h-full rounded-full bg-accent-primary transition-all",
40
41
  style: { width: `${Math.max(0, Math.min(100, e))}%` }
41
42
  })
42
43
  });
43
44
  }
44
- function R({ e, onOpen: t }) {
45
- let r = n(), i = e.course?.title ?? r("technospam.common.courseFallback", "Course");
46
- return /* @__PURE__ */ N("button", {
45
+ function re({ e, resumeLessonId: t, onOpen: r }) {
46
+ let i = n(), s = e.course?.title ?? i("technospam.common.courseFallback", "Course"), c = `${e.course?.topic ?? ""} ${s}`;
47
+ return /* @__PURE__ */ P("button", {
47
48
  type: "button",
48
- onClick: t,
49
+ onClick: r,
50
+ "data-resume-lesson": t ?? void 0,
49
51
  className: "group flex flex-col overflow-hidden rounded-xl border border-border-seam bg-bg-surface text-left transition-all duration-200 hover:-translate-y-1 hover:shadow-lg focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
50
- children: [/* @__PURE__ */ N(a, {
51
- seed: `${e.course?.topic ?? ""} ${i}`,
52
- icon: o(e.course?.topic ?? i),
52
+ children: [/* @__PURE__ */ P(a, {
53
+ seed: c,
54
+ icon: o(e.course?.topic ?? s),
53
55
  height: "h-20",
54
- children: [e.course?.level ? /* @__PURE__ */ M(u, {
56
+ children: [e.course?.level ? /* @__PURE__ */ N(u, {
55
57
  status: e.course.level,
56
58
  kind: "level"
57
- }) : /* @__PURE__ */ M("span", {}), /* @__PURE__ */ M("span", {
59
+ }) : /* @__PURE__ */ N("span", {}), /* @__PURE__ */ N("span", {
58
60
  className: "flex h-7 w-7 items-center justify-center rounded-full bg-white/15 text-white backdrop-blur transition-transform duration-200 group-hover:scale-110",
59
- children: /* @__PURE__ */ M(A, { size: 16 })
61
+ children: /* @__PURE__ */ N(A, { size: 16 })
60
62
  })]
61
- }), /* @__PURE__ */ N("div", {
63
+ }), /* @__PURE__ */ P("div", {
62
64
  className: "flex flex-1 flex-col gap-2.5 p-3.5",
63
- children: [/* @__PURE__ */ N("div", {
65
+ children: [/* @__PURE__ */ P("div", {
64
66
  className: "flex items-start gap-2",
65
- children: [/* @__PURE__ */ M("h3", {
67
+ children: [/* @__PURE__ */ N("h3", {
66
68
  className: "line-clamp-2 flex-1 text-sm font-semibold text-text-primary group-hover:text-accent-primary",
67
- children: i
68
- }), /* @__PURE__ */ M(u, { status: e.status })]
69
- }), /* @__PURE__ */ N("div", {
69
+ children: s
70
+ }), /* @__PURE__ */ N(u, { status: e.status })]
71
+ }), /* @__PURE__ */ P("div", {
70
72
  className: "mt-auto flex items-center gap-2.5",
71
- children: [/* @__PURE__ */ M("div", {
73
+ children: [/* @__PURE__ */ N("div", {
72
74
  className: "flex-1",
73
- children: /* @__PURE__ */ M(L, { pct: e.progressPct })
74
- }), /* @__PURE__ */ N("span", {
75
+ children: /* @__PURE__ */ N(R, { pct: e.progressPct })
76
+ }), /* @__PURE__ */ P("span", {
75
77
  className: "shrink-0 text-xs font-semibold text-text-secondary",
76
78
  children: [e.progressPct, "%"]
77
79
  })]
@@ -79,31 +81,31 @@ function R({ e, onOpen: t }) {
79
81
  })]
80
82
  });
81
83
  }
82
- function z({ course: e, onOpen: t }) {
83
- return /* @__PURE__ */ N("button", {
84
+ function ie({ course: e, onOpen: t }) {
85
+ return /* @__PURE__ */ P("button", {
84
86
  type: "button",
85
87
  onClick: t,
86
88
  className: "group flex w-full flex-col overflow-hidden rounded-xl border border-border-seam bg-bg-surface text-left transition-all duration-200 hover:-translate-y-1 hover:shadow-lg focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
87
- children: [/* @__PURE__ */ M(a, {
89
+ children: [/* @__PURE__ */ N(a, {
88
90
  seed: `${e.topic ?? ""} ${e.title}`,
89
91
  icon: o(e.topic ?? e.title),
90
92
  height: "h-20",
91
- children: /* @__PURE__ */ M(u, {
93
+ children: /* @__PURE__ */ N(u, {
92
94
  status: e.level,
93
95
  kind: "level"
94
96
  })
95
- }), /* @__PURE__ */ N("div", {
97
+ }), /* @__PURE__ */ P("div", {
96
98
  className: "flex flex-1 flex-col gap-1.5 p-3.5",
97
99
  children: [
98
- /* @__PURE__ */ M("h3", {
100
+ /* @__PURE__ */ N("h3", {
99
101
  className: "truncate text-sm font-semibold text-text-primary group-hover:text-accent-primary",
100
102
  children: e.title
101
103
  }),
102
- e.summary ? /* @__PURE__ */ M("p", {
104
+ e.summary ? /* @__PURE__ */ N("p", {
103
105
  className: "line-clamp-2 text-xs text-text-secondary",
104
106
  children: e.summary
105
107
  }) : null,
106
- e.topic ? /* @__PURE__ */ M("span", {
108
+ e.topic ? /* @__PURE__ */ N("span", {
107
109
  className: "mt-auto truncate pt-0.5 text-xs text-text-muted",
108
110
  children: e.topic
109
111
  }) : null
@@ -111,29 +113,29 @@ function z({ course: e, onOpen: t }) {
111
113
  })]
112
114
  });
113
115
  }
114
- function B({ s: e }) {
115
- return /* @__PURE__ */ N("div", {
116
+ function z({ s: e }) {
117
+ return /* @__PURE__ */ P("div", {
116
118
  className: "-mx-2 flex items-start gap-3 rounded-lg border-b border-border-seam px-2 py-3 transition-colors last:border-0 hover:bg-bg-sunken",
117
- children: [/* @__PURE__ */ M("span", {
119
+ children: [/* @__PURE__ */ N("span", {
118
120
  className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-accent-teal/15 text-accent-teal ring-1 ring-accent-teal/20",
119
- children: /* @__PURE__ */ M(T, { size: 16 })
120
- }), /* @__PURE__ */ N("div", {
121
+ children: /* @__PURE__ */ N(T, { size: 16 })
122
+ }), /* @__PURE__ */ P("div", {
121
123
  className: "min-w-0 flex-1",
122
124
  children: [
123
- /* @__PURE__ */ N("div", {
125
+ /* @__PURE__ */ P("div", {
124
126
  className: "flex items-center gap-2",
125
- children: [/* @__PURE__ */ M("span", {
127
+ children: [/* @__PURE__ */ N("span", {
126
128
  className: "truncate text-sm font-medium text-text-primary",
127
129
  children: e.topic
128
- }), /* @__PURE__ */ M(u, { status: e.status })]
130
+ }), /* @__PURE__ */ N(u, { status: e.status })]
129
131
  }),
130
- e.mentor?.headline ? /* @__PURE__ */ M("div", {
132
+ e.mentor?.headline ? /* @__PURE__ */ N("div", {
131
133
  className: "truncate text-xs text-text-muted",
132
134
  children: e.mentor.headline
133
135
  }) : null,
134
- /* @__PURE__ */ N("div", {
136
+ /* @__PURE__ */ P("div", {
135
137
  className: "mt-0.5 flex items-center gap-1.5 text-xs text-text-secondary",
136
- children: [/* @__PURE__ */ M(D, {
138
+ children: [/* @__PURE__ */ N(D, {
137
139
  size: 12,
138
140
  className: "text-text-muted"
139
141
  }), c(e.scheduledAt)]
@@ -142,95 +144,95 @@ function B({ s: e }) {
142
144
  })]
143
145
  });
144
146
  }
145
- function V({ h: e, onOpen: t }) {
147
+ function ae({ h: e, onOpen: t }) {
146
148
  let r = n();
147
- return /* @__PURE__ */ N("button", {
149
+ return /* @__PURE__ */ P("button", {
148
150
  type: "button",
149
151
  onClick: t,
150
152
  className: "group block w-full overflow-hidden rounded-xl border border-border-seam text-left transition-all duration-200 hover:-translate-y-1 hover:shadow-lg focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)]",
151
- children: [/* @__PURE__ */ N(a, {
153
+ children: [/* @__PURE__ */ P(a, {
152
154
  seed: `${e.theme ?? ""} ${e.title}`,
153
155
  icon: j,
154
156
  height: "h-24",
155
- children: [/* @__PURE__ */ N("div", {
157
+ children: [/* @__PURE__ */ P("div", {
156
158
  className: "min-w-0",
157
- children: [/* @__PURE__ */ N("div", {
159
+ children: [/* @__PURE__ */ P("div", {
158
160
  className: "flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-white/80",
159
161
  children: [
160
- /* @__PURE__ */ M(j, { size: 12 }),
162
+ /* @__PURE__ */ N(j, { size: 12 }),
161
163
  " ",
162
164
  r("technospam.common.openHackathon", "Open hackathon")
163
165
  ]
164
- }), /* @__PURE__ */ M("h3", {
166
+ }), /* @__PURE__ */ N("h3", {
165
167
  className: "mt-0.5 truncate text-sm font-semibold text-white drop-shadow-sm",
166
168
  children: e.title
167
169
  })]
168
- }), e.prizePool > 0 ? /* @__PURE__ */ M("span", {
170
+ }), e.prizePool > 0 ? /* @__PURE__ */ N("span", {
169
171
  className: "shrink-0 rounded-full bg-white/20 px-2.5 py-1 text-xs font-semibold text-white backdrop-blur",
170
172
  children: l(e.prizePool, e.currency)
171
173
  }) : null]
172
- }), /* @__PURE__ */ N("div", {
174
+ }), /* @__PURE__ */ P("div", {
173
175
  className: "flex items-center justify-between gap-2 bg-bg-surface px-3.5 py-2.5",
174
- children: [/* @__PURE__ */ N("span", {
176
+ children: [/* @__PURE__ */ P("span", {
175
177
  className: "flex items-center gap-1.5 text-xs text-text-muted",
176
178
  children: [
177
- /* @__PURE__ */ M(w, { size: 12 }),
179
+ /* @__PURE__ */ N(w, { size: 12 }),
178
180
  s(e.startAt),
179
181
  " – ",
180
182
  s(e.endAt)
181
183
  ]
182
- }), /* @__PURE__ */ N("span", {
184
+ }), /* @__PURE__ */ P("span", {
183
185
  className: "flex items-center gap-1 text-xs font-medium text-accent-primary opacity-0 transition-opacity group-hover:opacity-100",
184
186
  children: [
185
187
  r("technospam.common.register", "Register"),
186
188
  " ",
187
- /* @__PURE__ */ M(x, { size: 12 })
189
+ /* @__PURE__ */ N(x, { size: 12 })
188
190
  ]
189
191
  })]
190
192
  })]
191
193
  });
192
194
  }
193
- function H() {
194
- let a = t(), { currentUser: o } = e(), c = n(), l = o?.id, u = h(l ? { learnerId: l } : {}), x = v(l ? { learnerId: l } : {}), w = _(l ? { menteeId: l } : {}), D = ee(l ? { learnerId: l } : {}), A = m({ status: "PUBLISHED" }), L = g({ status: "REGISTRATION_OPEN" }), H = u.data?.tecListEnrollments?.items ?? [], U = x.data?.tecListSubmissions?.items ?? [], W = w.data?.tecListSessions?.items ?? [], G = D.data?.tecListCertificates ?? [], K = A.data?.tecListCourses?.items ?? [], q = L.data?.tecListHackathons?.items ?? [], ne = o?.firstName || o?.name || o?.email?.split("@")[0] || "there", J = y(() => H.filter((e) => e.status === "IN_PROGRESS" || e.status === "ENROLLED"), [H]), Y = y(() => [...J].sort((e, t) => new Date(t.lastActiveAt ?? t.startedAt).getTime() - new Date(e.lastActiveAt ?? e.startedAt).getTime()).slice(0, 3), [J]), re = y(() => new Set(U.filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)).size, [U]), [X] = b(() => Date.now()), Z = y(() => [...W].filter((e) => (e.status === "CONFIRMED" || e.status === "REQUESTED") && new Date(e.scheduledAt).getTime() > X).sort((e, t) => new Date(e.scheduledAt).getTime() - new Date(t.scheduledAt).getTime()), [W, X]), Q = y(() => {
195
+ function B() {
196
+ let a = t(), { currentUser: o } = e(), c = n(), l = o?.id, u = ee(l ? { learnerId: l } : {}), x = g(), w = b(() => new Map((x.data?.tecMyEnrollments?.items ?? []).map((e) => [e.courseId, e.nextLessonId ?? null])), [x.data]), D = v(l ? { learnerId: l } : {}), A = _(l ? { menteeId: l } : {}), R = m(l ? { learnerId: l } : {}), B = h({ status: "PUBLISHED" }), V = te({ status: "REGISTRATION_OPEN" }), H = u.data?.tecListEnrollments?.items ?? [], U = D.data?.tecListSubmissions?.items ?? [], W = A.data?.tecListSessions?.items ?? [], G = R.data?.tecListCertificates ?? [], K = B.data?.tecListCourses?.items ?? [], q = V.data?.tecListHackathons?.items ?? [], oe = o?.firstName || o?.name || o?.email?.split("@")[0] || "there", J = b(() => H.filter((e) => e.status === "IN_PROGRESS" || e.status === "ENROLLED"), [H]), Y = b(() => [...J].sort((e, t) => new Date(t.lastActiveAt ?? t.startedAt).getTime() - new Date(e.lastActiveAt ?? e.startedAt).getTime()).slice(0, 3), [J]), se = b(() => new Set(U.filter((e) => e.verdict === "ACCEPTED").map((e) => e.problemId)).size, [U]), [X] = ne(() => Date.now()), Z = b(() => [...W].filter((e) => (e.status === "CONFIRMED" || e.status === "REQUESTED") && new Date(e.scheduledAt).getTime() > X).sort((e, t) => new Date(e.scheduledAt).getTime() - new Date(t.scheduledAt).getTime()), [W, X]), Q = b(() => {
195
197
  let e = new Set(H.map((e) => e.courseId));
196
198
  return K.filter((t) => !e.has(t.id)).slice(0, 4);
197
199
  }, [K, H]), $ = q.slice(0, 4);
198
- return /* @__PURE__ */ N(r, {
200
+ return /* @__PURE__ */ P(r, {
199
201
  hero: !0,
200
- title: c("technospam.dashboard.title", "Welcome back, {{name}}", { name: ne }),
202
+ title: c("technospam.dashboard.title", "Welcome back, {{name}}", { name: oe }),
201
203
  description: c("technospam.dashboard.description", "Your learning hub — pick up where you left off, keep your skills sharp, and jump into what's next."),
202
- actions: /* @__PURE__ */ N(P, {
204
+ actions: /* @__PURE__ */ P(F, {
203
205
  variant: "outline",
204
206
  onClick: () => a("/courses/my-learning-page"),
205
207
  children: [
206
- /* @__PURE__ */ M(k, { size: 16 }),
208
+ /* @__PURE__ */ N(k, { size: 16 }),
207
209
  " ",
208
210
  c("technospam.dashboard.myLearning", "My Learning")
209
211
  ]
210
212
  }),
211
213
  children: [
212
- /* @__PURE__ */ N("div", {
214
+ /* @__PURE__ */ P("div", {
213
215
  className: "mb-5 grid grid-cols-2 gap-3 lg:grid-cols-4",
214
216
  children: [
215
- /* @__PURE__ */ M(i, {
217
+ /* @__PURE__ */ N(i, {
216
218
  label: c("technospam.dashboard.coursesInProgress", "Courses in progress"),
217
219
  value: J.length,
218
220
  icon: C,
219
221
  tone: "blue"
220
222
  }),
221
- /* @__PURE__ */ M(i, {
223
+ /* @__PURE__ */ N(i, {
222
224
  label: c("technospam.dashboard.problemsSolved", "Problems solved"),
223
- value: re,
225
+ value: se,
224
226
  icon: O,
225
227
  tone: "green"
226
228
  }),
227
- /* @__PURE__ */ M(i, {
229
+ /* @__PURE__ */ N(i, {
228
230
  label: c("technospam.dashboard.upcomingSessions", "Upcoming sessions"),
229
231
  value: Z.length,
230
232
  icon: T,
231
233
  tone: "amber"
232
234
  }),
233
- /* @__PURE__ */ M(i, {
235
+ /* @__PURE__ */ N(i, {
234
236
  label: c("technospam.dashboard.certificates", "Certificates"),
235
237
  value: G.length,
236
238
  icon: S,
@@ -238,165 +240,166 @@ function H() {
238
240
  })
239
241
  ]
240
242
  }),
241
- /* @__PURE__ */ N("div", {
243
+ /* @__PURE__ */ P("div", {
242
244
  className: "mb-6 grid grid-cols-2 gap-3 sm:grid-cols-4",
243
245
  children: [
244
- /* @__PURE__ */ N(P, {
246
+ /* @__PURE__ */ P(F, {
245
247
  variant: "outline",
246
248
  className: "h-auto flex-col gap-2 py-4",
247
249
  onClick: () => a("/courses/courses-page"),
248
- children: [/* @__PURE__ */ M(C, { size: 18 }), /* @__PURE__ */ M("span", {
250
+ children: [/* @__PURE__ */ N(C, { size: 18 }), /* @__PURE__ */ N("span", {
249
251
  className: "text-xs",
250
252
  children: c("technospam.common.browseCourses", "Browse courses")
251
253
  })]
252
254
  }),
253
- /* @__PURE__ */ N(P, {
255
+ /* @__PURE__ */ P(F, {
254
256
  variant: "outline",
255
257
  className: "h-auto flex-col gap-2 py-4",
256
258
  onClick: () => a("/applications/problems-page"),
257
- children: [/* @__PURE__ */ M(O, { size: 18 }), /* @__PURE__ */ M("span", {
259
+ children: [/* @__PURE__ */ N(O, { size: 18 }), /* @__PURE__ */ N("span", {
258
260
  className: "text-xs",
259
261
  children: c("technospam.common.practiceProblems", "Practice problems")
260
262
  })]
261
263
  }),
262
- /* @__PURE__ */ N(P, {
264
+ /* @__PURE__ */ P(F, {
263
265
  variant: "outline",
264
266
  className: "h-auto flex-col gap-2 py-4",
265
267
  onClick: () => a("/mentorship/mentors-page"),
266
- children: [/* @__PURE__ */ M(te, { size: 18 }), /* @__PURE__ */ M("span", {
268
+ children: [/* @__PURE__ */ N(M, { size: 18 }), /* @__PURE__ */ N("span", {
267
269
  className: "text-xs",
268
270
  children: c("technospam.common.findMentor", "Find a mentor")
269
271
  })]
270
272
  }),
271
- /* @__PURE__ */ N(P, {
273
+ /* @__PURE__ */ P(F, {
272
274
  variant: "outline",
273
275
  className: "h-auto flex-col gap-2 py-4",
274
276
  onClick: () => a("/hackathons/hackathons-page"),
275
- children: [/* @__PURE__ */ M(j, { size: 18 }), /* @__PURE__ */ M("span", {
277
+ children: [/* @__PURE__ */ N(j, { size: 18 }), /* @__PURE__ */ N("span", {
276
278
  className: "text-xs",
277
279
  children: c("technospam.common.hackathons", "Hackathons")
278
280
  })]
279
281
  })
280
282
  ]
281
283
  }),
282
- /* @__PURE__ */ N("div", {
284
+ /* @__PURE__ */ P("div", {
283
285
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
284
- children: [/* @__PURE__ */ N("div", {
286
+ children: [/* @__PURE__ */ P("div", {
285
287
  className: "space-y-6 lg:col-span-2",
286
- children: [/* @__PURE__ */ N(F, {
288
+ children: [/* @__PURE__ */ P(I, {
287
289
  className: "p-5",
288
- children: [/* @__PURE__ */ M(I, {
290
+ children: [/* @__PURE__ */ N(L, {
289
291
  title: c("technospam.dashboard.continueLearning", "Continue learning"),
290
292
  actionLabel: c("technospam.dashboard.myLearning", "My Learning"),
291
293
  onAction: () => a("/courses/my-learning-page")
292
- }), u.loading && !H.length ? /* @__PURE__ */ M(p, {
294
+ }), u.loading && !H.length ? /* @__PURE__ */ N(p, {
293
295
  count: 2,
294
296
  height: "h-16"
295
- }) : u.error ? /* @__PURE__ */ M(f, {
297
+ }) : u.error ? /* @__PURE__ */ N(f, {
296
298
  title: c("technospam.common.errorLoadCourses", "Couldn't load your courses"),
297
299
  error: u.error
298
- }) : Y.length === 0 ? /* @__PURE__ */ M(d, {
299
- icon: /* @__PURE__ */ M(C, { size: 24 }),
300
+ }) : Y.length === 0 ? /* @__PURE__ */ N(d, {
301
+ icon: /* @__PURE__ */ N(C, { size: 24 }),
300
302
  title: c("technospam.dashboard.noCoursesInProgressTitle", "No courses in progress"),
301
303
  description: c("technospam.dashboard.noCoursesInProgressDesc", "Enroll in a course to start building skill by doing — your active courses show up here."),
302
- action: /* @__PURE__ */ M(P, {
304
+ action: /* @__PURE__ */ N(F, {
303
305
  onClick: () => a("/courses/courses-page"),
304
306
  children: c("technospam.common.browseCourses", "Browse courses")
305
307
  })
306
- }) : /* @__PURE__ */ M("div", {
308
+ }) : /* @__PURE__ */ N("div", {
307
309
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
308
- children: Y.map((e) => /* @__PURE__ */ M(R, {
310
+ children: Y.map((e) => /* @__PURE__ */ N(re, {
309
311
  e,
310
- onOpen: () => a(`/courses/course-details-page?id=${e.courseId}`)
312
+ resumeLessonId: w.get(e.courseId),
313
+ onOpen: () => a(y(e.courseId, w.get(e.courseId)))
311
314
  }, e.id))
312
315
  })]
313
- }), /* @__PURE__ */ N(F, {
316
+ }), /* @__PURE__ */ P(I, {
314
317
  className: "p-5",
315
- children: [/* @__PURE__ */ M(I, {
318
+ children: [/* @__PURE__ */ N(L, {
316
319
  title: c("technospam.dashboard.recommendedForYou", "Recommended for you"),
317
320
  actionLabel: c("technospam.common.viewAll", "View all"),
318
321
  onAction: () => a("/courses/courses-page")
319
- }), A.loading && !K.length ? /* @__PURE__ */ M(p, {
322
+ }), B.loading && !K.length ? /* @__PURE__ */ N(p, {
320
323
  count: 2,
321
324
  height: "h-20"
322
- }) : A.error ? /* @__PURE__ */ M(f, {
325
+ }) : B.error ? /* @__PURE__ */ N(f, {
323
326
  title: c("technospam.common.errorLoadCourses", "Couldn't load courses"),
324
- error: A.error
325
- }) : Q.length === 0 ? /* @__PURE__ */ M(d, {
326
- icon: /* @__PURE__ */ M(k, { size: 24 }),
327
+ error: B.error
328
+ }) : Q.length === 0 ? /* @__PURE__ */ N(d, {
329
+ icon: /* @__PURE__ */ N(k, { size: 24 }),
327
330
  title: c("technospam.dashboard.noRecommendationsTitle", "No courses to recommend yet"),
328
331
  description: c("technospam.dashboard.noRecommendationsDesc", "New courses are on the way. TechnoSpam is pre-launch — check back soon.")
329
- }) : /* @__PURE__ */ M("div", {
332
+ }) : /* @__PURE__ */ N("div", {
330
333
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
331
- children: Q.map((e) => /* @__PURE__ */ M(z, {
334
+ children: Q.map((e) => /* @__PURE__ */ N(ie, {
332
335
  course: e,
333
336
  onOpen: () => a(`/courses/course-details-page?id=${e.id}`)
334
337
  }, e.id))
335
338
  })]
336
339
  })]
337
- }), /* @__PURE__ */ N("div", {
340
+ }), /* @__PURE__ */ P("div", {
338
341
  className: "space-y-6",
339
342
  children: [
340
- /* @__PURE__ */ N(F, {
343
+ /* @__PURE__ */ P(I, {
341
344
  className: "p-5",
342
- children: [/* @__PURE__ */ M(I, {
345
+ children: [/* @__PURE__ */ N(L, {
343
346
  title: c("technospam.dashboard.upcomingSessionsTitle", "Upcoming sessions"),
344
347
  actionLabel: c("technospam.common.allSessions", "All sessions"),
345
348
  onAction: () => a("/mentorship/sessions-page")
346
- }), w.loading && !W.length ? /* @__PURE__ */ M(p, {
349
+ }), A.loading && !W.length ? /* @__PURE__ */ N(p, {
347
350
  count: 2,
348
351
  height: "h-14"
349
- }) : w.error ? /* @__PURE__ */ M(f, {
352
+ }) : A.error ? /* @__PURE__ */ N(f, {
350
353
  title: c("technospam.common.errorLoadSessions", "Couldn't load sessions"),
351
- error: w.error
352
- }) : Z.length === 0 ? /* @__PURE__ */ M(d, {
353
- icon: /* @__PURE__ */ M(T, { size: 24 }),
354
+ error: A.error
355
+ }) : Z.length === 0 ? /* @__PURE__ */ N(d, {
356
+ icon: /* @__PURE__ */ N(T, { size: 24 }),
354
357
  title: c("technospam.dashboard.noSessionsBookedTitle", "No sessions booked"),
355
358
  description: c("technospam.dashboard.noSessionsBookedDesc", "Book time with a mentor to get unblocked — your upcoming sessions appear here."),
356
- action: /* @__PURE__ */ M(P, {
359
+ action: /* @__PURE__ */ N(F, {
357
360
  variant: "outline",
358
361
  onClick: () => a("/mentorship/mentors-page"),
359
362
  children: c("technospam.common.findMentor", "Find a mentor")
360
363
  })
361
- }) : /* @__PURE__ */ M("div", { children: Z.slice(0, 5).map((e) => /* @__PURE__ */ M(B, { s: e }, e.id)) })]
364
+ }) : /* @__PURE__ */ N("div", { children: Z.slice(0, 5).map((e) => /* @__PURE__ */ N(z, { s: e }, e.id)) })]
362
365
  }),
363
- /* @__PURE__ */ N(F, {
366
+ /* @__PURE__ */ P(I, {
364
367
  className: "p-5",
365
- children: [/* @__PURE__ */ M(I, {
368
+ children: [/* @__PURE__ */ N(L, {
366
369
  title: c("technospam.dashboard.openHackathons", "Open hackathons"),
367
370
  actionLabel: c("technospam.common.viewAll", "View all"),
368
371
  onAction: () => a("/hackathons/hackathons-page")
369
- }), L.loading && !q.length ? /* @__PURE__ */ M(p, {
372
+ }), V.loading && !q.length ? /* @__PURE__ */ N(p, {
370
373
  count: 2,
371
374
  height: "h-14"
372
- }) : L.error ? /* @__PURE__ */ M(f, {
375
+ }) : V.error ? /* @__PURE__ */ N(f, {
373
376
  title: c("technospam.common.errorLoadHackathons", "Couldn't load hackathons"),
374
- error: L.error
375
- }) : $.length === 0 ? /* @__PURE__ */ M(d, {
376
- icon: /* @__PURE__ */ M(j, { size: 24 }),
377
+ error: V.error
378
+ }) : $.length === 0 ? /* @__PURE__ */ N(d, {
379
+ icon: /* @__PURE__ */ N(j, { size: 24 }),
377
380
  title: c("technospam.dashboard.noOpenHackathonsTitle", "No open hackathons"),
378
381
  description: c("technospam.dashboard.noOpenHackathonsDesc", "When registration opens for a hackathon, it will show up here to join.")
379
- }) : /* @__PURE__ */ M("div", {
382
+ }) : /* @__PURE__ */ N("div", {
380
383
  className: "space-y-3",
381
- children: $.map((e) => /* @__PURE__ */ M(V, {
384
+ children: $.map((e) => /* @__PURE__ */ N(ae, {
382
385
  h: e,
383
386
  onOpen: () => a(`/hackathons/hackathon-details-page?id=${e.id}`)
384
387
  }, e.id))
385
388
  })]
386
389
  }),
387
- G.length > 0 ? /* @__PURE__ */ N(F, {
390
+ G.length > 0 ? /* @__PURE__ */ P(I, {
388
391
  className: "p-5",
389
- children: [/* @__PURE__ */ M(I, { title: c("technospam.common.latestCertificate", "Latest certificate") }), /* @__PURE__ */ N("div", {
392
+ children: [/* @__PURE__ */ N(L, { title: c("technospam.common.latestCertificate", "Latest certificate") }), /* @__PURE__ */ P("div", {
390
393
  className: "flex items-center gap-3",
391
- children: [/* @__PURE__ */ M("span", {
394
+ children: [/* @__PURE__ */ N("span", {
392
395
  className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-accent-primary/12 text-accent-teal",
393
- children: /* @__PURE__ */ M(E, { size: 20 })
394
- }), /* @__PURE__ */ N("div", {
396
+ children: /* @__PURE__ */ N(E, { size: 20 })
397
+ }), /* @__PURE__ */ P("div", {
395
398
  className: "min-w-0",
396
- children: [/* @__PURE__ */ M("div", {
399
+ children: [/* @__PURE__ */ N("div", {
397
400
  className: "truncate text-sm font-medium text-text-primary",
398
401
  children: G[0]?.course?.title ?? c("technospam.common.courseFallback", "Course")
399
- }), /* @__PURE__ */ N("div", {
402
+ }), /* @__PURE__ */ P("div", {
400
403
  className: "text-xs text-text-muted",
401
404
  children: [
402
405
  c("technospam.common.score", "Score"),
@@ -419,6 +422,6 @@ function H() {
419
422
  });
420
423
  }
421
424
  //#endregion
422
- export { H as DashboardDashboardPagePage };
425
+ export { B as DashboardDashboardPagePage };
423
426
 
424
427
  //# sourceMappingURL=DashboardDashboardPagePage.js.map