@burdenoff/microfe-buildmyiq 2026.705.13 → 2026.706.10

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/buildmyiq/BuildmyiqRoot.d.ts.map +1 -1
  2. package/dist/buildmyiq/BuildmyiqRoot.js +57 -49
  3. package/dist/buildmyiq/BuildmyiqRoot.js.map +1 -1
  4. package/dist/buildmyiq/BuildmyiqRoutes.d.ts.map +1 -1
  5. package/dist/buildmyiq/BuildmyiqRoutes.js +15 -11
  6. package/dist/buildmyiq/BuildmyiqRoutes.js.map +1 -1
  7. package/dist/buildmyiq/components/Avatar.d.ts +15 -0
  8. package/dist/buildmyiq/components/Avatar.d.ts.map +1 -0
  9. package/dist/buildmyiq/components/Avatar.js +42 -0
  10. package/dist/buildmyiq/components/Avatar.js.map +1 -0
  11. package/dist/buildmyiq/components/Viz.d.ts +25 -0
  12. package/dist/buildmyiq/components/Viz.d.ts.map +1 -0
  13. package/dist/buildmyiq/components/Viz.js +78 -0
  14. package/dist/buildmyiq/components/Viz.js.map +1 -0
  15. package/dist/buildmyiq/components/index.d.ts +2 -0
  16. package/dist/buildmyiq/components/index.d.ts.map +1 -1
  17. package/dist/buildmyiq/components/index.js +2 -0
  18. package/dist/buildmyiq/pages/DashboardPage.d.ts.map +1 -1
  19. package/dist/buildmyiq/pages/DashboardPage.js +200 -98
  20. package/dist/buildmyiq/pages/DashboardPage.js.map +1 -1
  21. package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.d.ts.map +1 -1
  22. package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js +262 -241
  23. package/dist/buildmyiq/pages/assessments/AssessmentDetailPage.js.map +1 -1
  24. package/dist/buildmyiq/pages/assessments/AssessmentsPage.d.ts.map +1 -1
  25. package/dist/buildmyiq/pages/assessments/AssessmentsPage.js +142 -115
  26. package/dist/buildmyiq/pages/assessments/AssessmentsPage.js.map +1 -1
  27. package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.d.ts.map +1 -1
  28. package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js +220 -156
  29. package/dist/buildmyiq/pages/assessments/TakeAssessmentPage.js.map +1 -1
  30. package/dist/buildmyiq/pages/authoring/AuthoringPage.d.ts.map +1 -1
  31. package/dist/buildmyiq/pages/authoring/AuthoringPage.js +51 -46
  32. package/dist/buildmyiq/pages/authoring/AuthoringPage.js.map +1 -1
  33. package/dist/buildmyiq/pages/authoring/CourseBuilderPage.d.ts.map +1 -1
  34. package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js +581 -448
  35. package/dist/buildmyiq/pages/authoring/CourseBuilderPage.js.map +1 -1
  36. package/dist/buildmyiq/pages/catalog/CatalogPage.d.ts.map +1 -1
  37. package/dist/buildmyiq/pages/catalog/CatalogPage.js +52 -42
  38. package/dist/buildmyiq/pages/catalog/CatalogPage.js.map +1 -1
  39. package/dist/buildmyiq/pages/catalog/CourseDetailPage.d.ts.map +1 -1
  40. package/dist/buildmyiq/pages/catalog/CourseDetailPage.js +422 -301
  41. package/dist/buildmyiq/pages/catalog/CourseDetailPage.js.map +1 -1
  42. package/dist/buildmyiq/pages/certificates/CertificatesPage.d.ts.map +1 -1
  43. package/dist/buildmyiq/pages/certificates/CertificatesPage.js +237 -151
  44. package/dist/buildmyiq/pages/certificates/CertificatesPage.js.map +1 -1
  45. package/dist/buildmyiq/pages/cohorts/CohortsPage.d.ts.map +1 -1
  46. package/dist/buildmyiq/pages/cohorts/CohortsPage.js +219 -138
  47. package/dist/buildmyiq/pages/cohorts/CohortsPage.js.map +1 -1
  48. package/dist/buildmyiq/pages/insights/InsightsPage.d.ts.map +1 -1
  49. package/dist/buildmyiq/pages/insights/InsightsPage.js +276 -152
  50. package/dist/buildmyiq/pages/insights/InsightsPage.js.map +1 -1
  51. package/dist/buildmyiq/pages/learning/LessonPlayerPage.d.ts.map +1 -1
  52. package/dist/buildmyiq/pages/learning/LessonPlayerPage.js +237 -174
  53. package/dist/buildmyiq/pages/learning/LessonPlayerPage.js.map +1 -1
  54. package/dist/buildmyiq/pages/learning/MyLearningPage.d.ts.map +1 -1
  55. package/dist/buildmyiq/pages/learning/MyLearningPage.js +307 -169
  56. package/dist/buildmyiq/pages/learning/MyLearningPage.js.map +1 -1
  57. package/dist/buildmyiq/pages/paths/PathsPage.d.ts +4 -0
  58. package/dist/buildmyiq/pages/paths/PathsPage.d.ts.map +1 -0
  59. package/dist/buildmyiq/pages/paths/PathsPage.js +187 -0
  60. package/dist/buildmyiq/pages/paths/PathsPage.js.map +1 -0
  61. package/dist/buildmyiq/pages/skills/SkillsPage.d.ts.map +1 -1
  62. package/dist/buildmyiq/pages/skills/SkillsPage.js +233 -140
  63. package/dist/buildmyiq/pages/skills/SkillsPage.js.map +1 -1
  64. package/dist/buildmyiq/pages/submissions/SubmissionsPage.d.ts.map +1 -1
  65. package/dist/buildmyiq/pages/submissions/SubmissionsPage.js +379 -275
  66. package/dist/buildmyiq/pages/submissions/SubmissionsPage.js.map +1 -1
  67. package/package.json +1 -1
@@ -1,292 +1,355 @@
1
1
  import { useBuildmyiq as e } from "../../context/BuildmyiqContext.js";
2
2
  import { cn as t } from "../../utils/cn.js";
3
3
  import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { formatDuration as r } from "../../utils/formatters.js";
5
- import { StatusBadge as i } from "../../components/StatusBadge.js";
6
- import { EmptyState as a } from "../../components/EmptyState.js";
7
- import { ErrorView as o, LoadingView as s } from "../../components/StateViews.js";
8
- import { MiniBar as c } from "../../components/MiniBar.js";
4
+ import { formatDuration as r, formatEnumLabel as i } from "../../utils/formatters.js";
5
+ import { StatusBadge as a } from "../../components/StatusBadge.js";
6
+ import { EmptyState as o } from "../../components/EmptyState.js";
7
+ import { ErrorView as s, LoadingView as c } from "../../components/StateViews.js";
8
+ import { MiniBar as l } from "../../components/MiniBar.js";
9
+ import { ProgressRing as u } from "../../components/Viz.js";
9
10
  import "../../context/index.js";
10
- import { useBuiCourse as ee, useBuiEnrollment as l, useBuiRecordLessonProgress as u, useBuiTransitionEnrollment as d } from "../../hooks/useBuildmyiqApi.js";
11
+ import { useBuiCourse as ee, useBuiEnrollment as te, useBuiRecordLessonProgress as ne, useBuiTransitionEnrollment as re } from "../../hooks/useBuildmyiqApi.js";
11
12
  import "../../hooks/index.js";
12
- import { FileLink as f } from "../../components/FileLink.js";
13
+ import { FileLink as d } from "../../components/FileLink.js";
13
14
  import "../../components/index.js";
14
- import { useEffect as p, useMemo as m, useRef as h, useState as g } from "react";
15
- import { ArrowLeft as _, CheckCircle2 as v, ChevronLeft as y, ChevronRight as te, Circle as b, ListChecks as x, Loader2 as S, Trophy as ne } from "lucide-react";
16
- import { useParams as re } from "react-router-dom";
17
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
18
- import { Button as T, GlassCard as E } from "@burdenoff/fe-libs/ui";
15
+ import { useEffect as ie, useMemo as f, useRef as p, useState as m } from "react";
16
+ import { ArrowLeft as ae, BookOpen as h, Check as g, CheckCircle2 as _, ChevronLeft as oe, ChevronRight as se, FileText as v, HelpCircle as y, ListChecks as b, Loader2 as x, MousePointerClick as S, PenLine as C, PlayCircle as w, Radio as T, Trophy as ce } from "lucide-react";
17
+ import { useParams as le } from "react-router-dom";
18
+ import { Fragment as ue, jsx as E, jsxs as D } from "react/jsx-runtime";
19
+ import { Button as O, GlassCard as k } from "@burdenoff/fe-libs/ui";
19
20
  //#region src/buildmyiq/pages/learning/LessonPlayerPage.tsx
20
- var D = (e) => [...e].sort((e, t) => e.position - t.position), O = () => {
21
- let { enrollmentId: O } = re(), { navigateTo: k } = e(), A = l(O), j = A.data ?? null, M = j?.courseId, N = ee(M), P = N.data ?? null, F = u(), I = d(), L = F.mutate, R = h(/* @__PURE__ */ new Set()), [z, B] = g(null), [V, H] = g(!1), U = m(() => {
22
- if (!P) return [];
23
- let e = /* @__PURE__ */ new Set(), t = D(P.modules ?? []), n = [];
21
+ var A = {
22
+ ARTICLE: v,
23
+ VIDEO: w,
24
+ QUIZ: y,
25
+ ASSIGNMENT: C,
26
+ INTERACTIVE: S,
27
+ LIVE_SESSION: T
28
+ }, j = (e) => [...e].sort((e, t) => e.position - t.position), M = () => {
29
+ let { enrollmentId: y } = le(), { navigateTo: S } = e(), C = te(y), w = C.data ?? null, T = w?.courseId, M = ee(T), N = M.data ?? null, P = ne(), F = re(), I = P.mutate, L = p(/* @__PURE__ */ new Set()), [R, z] = m(null), [B, V] = m(!1), H = f(() => {
30
+ if (!N) return [];
31
+ let e = /* @__PURE__ */ new Set(), t = j(N.modules ?? []), n = [];
24
32
  for (let r of t) {
25
- let t = D(r.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
33
+ let t = j(r.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
26
34
  t.length > 0 && n.push({
27
35
  id: r.id,
28
36
  title: r.title,
29
37
  lessons: t
30
38
  });
31
39
  }
32
- let r = D(P.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
40
+ let r = j(N.lessons ?? []).filter((t) => e.has(t.id) ? !1 : (e.add(t.id), !0));
33
41
  return r.length > 0 && n.push({
34
42
  id: "__standalone",
35
43
  title: "Lessons",
36
44
  lessons: r
37
45
  }), n;
38
- }, [P]), W = m(() => U.flatMap((e) => e.lessons), [U]), G = m(() => {
46
+ }, [N]), U = f(() => H.flatMap((e) => e.lessons), [H]), W = f(() => {
39
47
  let e = /* @__PURE__ */ new Map();
40
- for (let t of j?.lessonProgress ?? []) e.set(t.lessonId, t.status);
48
+ for (let t of w?.lessonProgress ?? []) e.set(t.lessonId, t.status);
41
49
  return e;
42
- }, [j]), K = m(() => W.length === 0 ? null : z && W.some((e) => e.id === z) ? z : W[0].id, [W, z]);
43
- p(() => {
44
- if (!O || !K) return;
45
- let e = G.get(K);
46
- e === "COMPLETED" || e === "IN_PROGRESS" || R.current.has(K) || (R.current.add(K), L({
47
- enrollmentId: O,
48
- lessonId: K,
50
+ }, [w]), G = f(() => U.length === 0 ? null : R && U.some((e) => e.id === R) ? R : U[0].id, [U, R]);
51
+ ie(() => {
52
+ if (!y || !G) return;
53
+ let e = W.get(G);
54
+ e === "COMPLETED" || e === "IN_PROGRESS" || L.current.has(G) || (L.current.add(G), I({
55
+ enrollmentId: y,
56
+ lessonId: G,
49
57
  status: "IN_PROGRESS"
50
58
  }));
51
59
  }, [
52
- O,
53
- K,
60
+ y,
54
61
  G,
55
- L
62
+ W,
63
+ I
56
64
  ]);
57
- let q = W.findIndex((e) => e.id === K), J = q >= 0 ? W[q] : null, Y = (J ? G.get(J.id) : void 0) === "COMPLETED", ie = W.length > 0 && W.every((e) => G.get(e.id) === "COMPLETED"), ae = j?.status === "COMPLETED", X = (e) => {
58
- B(e), H(!1);
65
+ let K = U.findIndex((e) => e.id === G), q = K >= 0 ? U[K] : null, J = (q ? W.get(q.id) : void 0) === "COMPLETED", Y = U.filter((e) => W.get(e.id) === "COMPLETED").length, de = U.length > 0 && Y === U.length, fe = w?.status === "COMPLETED", X = (e) => {
66
+ z(e), V(!1);
59
67
  }, Z = (e) => {
60
- if (q < 0) return;
61
- let t = W[q + e];
68
+ if (K < 0) return;
69
+ let t = U[K + e];
62
70
  t && X(t.id);
63
- }, oe = async () => {
64
- if (!O || !J) return;
65
- await F.mutateAsync({
66
- enrollmentId: O,
67
- lessonId: J.id,
71
+ }, pe = async () => {
72
+ if (!y || !q) return;
73
+ await P.mutateAsync({
74
+ enrollmentId: y,
75
+ lessonId: q.id,
68
76
  status: "COMPLETED"
69
77
  });
70
- let e = W[q + 1];
71
- e && B(e.id);
72
- }, se = async () => {
73
- O && await I.mutateAsync({
74
- id: O,
78
+ let e = U[K + 1];
79
+ e && z(e.id);
80
+ }, me = async () => {
81
+ y && await F.mutateAsync({
82
+ id: y,
75
83
  status: "COMPLETED"
76
84
  });
77
85
  };
78
- if (!O) return /* @__PURE__ */ C(n, {
86
+ if (!y) return /* @__PURE__ */ E(n, {
79
87
  title: "Lesson",
80
- children: /* @__PURE__ */ C(a, {
88
+ children: /* @__PURE__ */ E(o, {
81
89
  illustration: "empty-data",
82
90
  title: "No enrollment selected",
83
91
  description: "Open a course from My Learning to start the lesson player.",
84
- action: /* @__PURE__ */ C(T, {
85
- onClick: () => k("learning"),
92
+ action: /* @__PURE__ */ E(O, {
93
+ onClick: () => S("learning"),
86
94
  children: "Back to My Learning"
87
95
  })
88
96
  })
89
97
  });
90
- let ce = A.isLoading || !!M && N.isLoading, Q = /* @__PURE__ */ w(T, {
98
+ let he = C.isLoading || !!T && M.isLoading, Q = /* @__PURE__ */ D(O, {
91
99
  variant: "ghost",
92
100
  size: "sm",
93
- onClick: () => k("learning"),
94
- children: [/* @__PURE__ */ C(_, { className: "mr-1 h-4 w-4" }), " My Learning"]
101
+ onClick: () => S("learning"),
102
+ children: [/* @__PURE__ */ E(ae, { className: "mr-1 h-4 w-4" }), " My Learning"]
95
103
  });
96
- if (ce) return /* @__PURE__ */ C(n, {
104
+ if (he) return /* @__PURE__ */ E(n, {
97
105
  title: "Lesson",
98
106
  actions: Q,
99
- children: /* @__PURE__ */ C(s, { label: "Loading your lesson…" })
107
+ children: /* @__PURE__ */ E(c, { label: "Loading your lesson…" })
100
108
  });
101
- if (A.isError) return /* @__PURE__ */ C(n, {
109
+ if (C.isError) return /* @__PURE__ */ E(n, {
102
110
  title: "Lesson",
103
111
  actions: Q,
104
- children: /* @__PURE__ */ C(o, {
112
+ children: /* @__PURE__ */ E(s, {
105
113
  title: "Couldn't load this enrollment",
106
- message: A.error instanceof Error ? A.error.message : void 0,
107
- onRetry: () => A.refetch()
114
+ message: C.error instanceof Error ? C.error.message : void 0,
115
+ onRetry: () => C.refetch()
108
116
  })
109
117
  });
110
- if (!j) return /* @__PURE__ */ C(n, {
118
+ if (!w) return /* @__PURE__ */ E(n, {
111
119
  title: "Lesson",
112
120
  actions: Q,
113
- children: /* @__PURE__ */ C(a, {
121
+ children: /* @__PURE__ */ E(o, {
114
122
  illustration: "empty-data",
115
123
  title: "Enrollment not found",
116
124
  description: "This enrollment may have been removed or is not available to you.",
117
- action: /* @__PURE__ */ C(T, {
118
- onClick: () => k("learning"),
125
+ action: /* @__PURE__ */ E(O, {
126
+ onClick: () => S("learning"),
119
127
  children: "Back to My Learning"
120
128
  })
121
129
  })
122
130
  });
123
- if (N.isError) return /* @__PURE__ */ C(n, {
131
+ if (M.isError) return /* @__PURE__ */ E(n, {
124
132
  title: "Lesson",
125
133
  actions: Q,
126
- children: /* @__PURE__ */ C(o, {
134
+ children: /* @__PURE__ */ E(s, {
127
135
  title: "Couldn't load the course",
128
- message: N.error instanceof Error ? N.error.message : void 0,
129
- onRetry: () => N.refetch()
136
+ message: M.error instanceof Error ? M.error.message : void 0,
137
+ onRetry: () => M.refetch()
130
138
  })
131
139
  });
132
- let $ = Math.round(j.progressPct ?? 0);
133
- return /* @__PURE__ */ C(n, {
134
- title: P?.title ?? "Lesson",
140
+ let $ = Math.round(w.progressPct ?? 0), ge = q ? A[q.type] : v;
141
+ return /* @__PURE__ */ E(n, {
142
+ title: N?.title ?? "Lesson",
135
143
  actions: Q,
136
- children: /* @__PURE__ */ w("div", {
144
+ children: /* @__PURE__ */ D("div", {
137
145
  className: "flex flex-col gap-5",
138
146
  children: [
139
- /* @__PURE__ */ w("div", {
140
- className: "flex flex-col gap-2 rounded-2xl border border-border-seam bg-bg-surface p-4 sm:flex-row sm:items-center sm:gap-4",
147
+ /* @__PURE__ */ D(k, {
148
+ treatment: "glass",
149
+ glow: $ > 0,
150
+ className: "flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:gap-5",
141
151
  children: [
142
- /* @__PURE__ */ w("div", {
143
- className: "flex items-center gap-2",
144
- children: [/* @__PURE__ */ C(i, { status: j.status }), /* @__PURE__ */ w("span", {
145
- className: "text-sm text-text-secondary",
146
- children: [
147
- W.filter((e) => G.get(e.id) === "COMPLETED").length,
148
- " /",
149
- " ",
150
- W.length,
151
- " lessons complete"
152
- ]
153
- })]
152
+ /* @__PURE__ */ E(u, {
153
+ value: $,
154
+ size: 64,
155
+ className: "shrink-0"
154
156
  }),
155
- /* @__PURE__ */ w("div", {
156
- className: "flex flex-1 items-center gap-3",
157
- children: [/* @__PURE__ */ C(c, {
157
+ /* @__PURE__ */ D("div", {
158
+ className: "min-w-0 flex-1",
159
+ children: [/* @__PURE__ */ D("div", {
160
+ className: "flex flex-wrap items-center gap-2",
161
+ children: [/* @__PURE__ */ E(a, { status: w.status }), /* @__PURE__ */ D("span", {
162
+ className: "text-sm text-text-secondary tabular-nums",
163
+ children: [
164
+ Y,
165
+ " of ",
166
+ U.length,
167
+ " lessons complete"
168
+ ]
169
+ })]
170
+ }), /* @__PURE__ */ E(l, {
158
171
  value: $,
159
- className: "flex-1"
160
- }), /* @__PURE__ */ w("span", {
161
- className: "shrink-0 text-sm font-medium tabular-nums text-text-primary",
162
- children: [$, "%"]
172
+ className: "mt-3"
163
173
  })]
164
174
  }),
165
- ie && !ae && /* @__PURE__ */ w(T, {
166
- size: "sm",
175
+ de && !fe && /* @__PURE__ */ D(O, {
167
176
  className: "shrink-0 max-sm:w-full",
168
- onClick: se,
169
- disabled: I.isPending,
170
- children: [I.isPending ? /* @__PURE__ */ C(S, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ C(ne, { className: "mr-1 h-4 w-4" }), "Finish course"]
177
+ onClick: me,
178
+ disabled: F.isPending,
179
+ children: [F.isPending ? /* @__PURE__ */ E(x, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ E(ce, { className: "mr-1 h-4 w-4" }), "Finish course"]
171
180
  })
172
181
  ]
173
182
  }),
174
- /* @__PURE__ */ w(T, {
183
+ /* @__PURE__ */ D(O, {
175
184
  variant: "secondary",
176
185
  size: "sm",
177
186
  className: "w-full lg:hidden",
178
- onClick: () => H((e) => !e),
179
- children: [/* @__PURE__ */ C(x, { className: "mr-1 h-4 w-4" }), V ? "Hide lessons" : "Show lessons"]
187
+ onClick: () => V((e) => !e),
188
+ children: [/* @__PURE__ */ E(b, { className: "mr-1 h-4 w-4" }), B ? "Hide lessons" : `Lessons (${Y}/${U.length})`]
180
189
  }),
181
- /* @__PURE__ */ w("div", {
190
+ /* @__PURE__ */ D("div", {
182
191
  className: "flex flex-col gap-5 lg:flex-row",
183
- children: [/* @__PURE__ */ C("aside", {
184
- className: t("lg:block lg:w-80 lg:shrink-0", V ? "block" : "hidden"),
185
- children: /* @__PURE__ */ C(E, {
192
+ children: [/* @__PURE__ */ E("aside", {
193
+ className: t("lg:block lg:w-80 lg:shrink-0", B ? "block" : "hidden"),
194
+ children: /* @__PURE__ */ E(k, {
186
195
  treatment: "plain",
187
196
  className: "overflow-hidden p-0 lg:sticky lg:top-4",
188
- children: W.length === 0 ? /* @__PURE__ */ C("div", {
197
+ children: U.length === 0 ? /* @__PURE__ */ E("div", {
189
198
  className: "p-4 text-sm text-text-secondary",
190
199
  children: "This course has no lessons yet."
191
- }) : /* @__PURE__ */ C("nav", {
192
- className: "max-h-[70vh] overflow-auto p-2",
193
- children: U.map((e) => /* @__PURE__ */ w("div", {
194
- className: "mb-2 last:mb-0",
195
- children: [/* @__PURE__ */ C("p", {
196
- className: "px-3 py-2 text-xs font-semibold uppercase tracking-wide text-text-secondary",
197
- children: e.title
198
- }), /* @__PURE__ */ C("ul", {
199
- className: "flex flex-col gap-0.5",
200
- children: e.lessons.map((e) => {
201
- let n = G.get(e.id) === "COMPLETED", i = e.id === K;
202
- return /* @__PURE__ */ C("li", { children: /* @__PURE__ */ w("button", {
203
- type: "button",
204
- onClick: () => X(e.id),
205
- className: t("flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm transition-colors", i ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
206
- "aria-current": i ? "true" : void 0,
200
+ }) : /* @__PURE__ */ D(ue, { children: [/* @__PURE__ */ E("nav", {
201
+ className: "max-h-[68vh] overflow-auto p-3",
202
+ children: H.map((e) => {
203
+ let n = e.lessons.filter((e) => W.get(e.id) === "COMPLETED").length;
204
+ return /* @__PURE__ */ D("div", {
205
+ className: "mb-4 last:mb-0",
206
+ children: [/* @__PURE__ */ D("div", {
207
+ className: "mb-2 flex items-center justify-between gap-2 px-1",
208
+ children: [/* @__PURE__ */ E("p", {
209
+ className: "min-w-0 truncate text-sm font-semibold text-text-primary",
210
+ children: e.title
211
+ }), /* @__PURE__ */ D("span", {
212
+ className: "shrink-0 text-xs font-medium tabular-nums text-text-secondary",
207
213
  children: [
208
- n ? /* @__PURE__ */ C(v, { className: "h-4 w-4 shrink-0 text-status-success-text" }) : /* @__PURE__ */ C(b, { className: "h-4 w-4 shrink-0 opacity-50" }),
209
- /* @__PURE__ */ C("span", {
210
- className: "min-w-0 flex-1 truncate",
211
- children: e.title
212
- }),
213
- e.durationMin > 0 && /* @__PURE__ */ C("span", {
214
- className: "shrink-0 text-xs tabular-nums text-text-secondary",
215
- children: r(e.durationMin)
216
- })
214
+ n,
215
+ " / ",
216
+ e.lessons.length
217
217
  ]
218
- }) }, e.id);
219
- })
220
- })]
221
- }, e.id))
222
- })
218
+ })]
219
+ }), /* @__PURE__ */ E("ul", {
220
+ className: "flex flex-col",
221
+ children: e.lessons.map((n, a) => {
222
+ let o = W.get(n.id) === "COMPLETED", s = n.id === G, c = a === e.lessons.length - 1, l = A[n.type];
223
+ return /* @__PURE__ */ D("li", {
224
+ className: "flex gap-3",
225
+ children: [/* @__PURE__ */ D("div", {
226
+ className: "flex flex-col items-center pt-1.5",
227
+ children: [o ? /* @__PURE__ */ E("span", {
228
+ className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--color-status-success-text)]",
229
+ children: /* @__PURE__ */ E(g, { className: "h-3.5 w-3.5 text-status-success-bg-subtle" })
230
+ }) : s ? /* @__PURE__ */ E("span", {
231
+ className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--color-accent-soft)] ring-2 ring-[var(--color-accent-teal)]",
232
+ children: /* @__PURE__ */ E(l, { className: "h-3.5 w-3.5 text-[var(--color-accent-teal)]" })
233
+ }) : /* @__PURE__ */ E("span", {
234
+ className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-sunken",
235
+ children: /* @__PURE__ */ E(l, { className: "h-3.5 w-3.5 text-text-secondary opacity-70" })
236
+ }), !c && /* @__PURE__ */ E("span", { className: t("my-1 w-px flex-1", o ? "bg-[color-mix(in_srgb,var(--color-status-success-text)_45%,transparent)]" : "bg-border-seam") })]
237
+ }), /* @__PURE__ */ D("button", {
238
+ type: "button",
239
+ onClick: () => X(n.id),
240
+ className: t("mb-1 min-w-0 flex-1 rounded-lg px-3 py-2 text-left transition-colors", s ? "bg-[var(--color-accent-soft)]" : "hover:bg-bg-sunken"),
241
+ "aria-current": s ? "true" : void 0,
242
+ children: [/* @__PURE__ */ E("span", {
243
+ className: t("block truncate text-sm", s ? "font-medium text-text-primary" : o ? "text-text-secondary" : "text-text-primary"),
244
+ children: n.title
245
+ }), /* @__PURE__ */ D("span", {
246
+ className: "mt-0.5 block truncate text-xs text-text-secondary",
247
+ children: [i(n.type), n.durationMin > 0 ? ` · ${r(n.durationMin)}` : ""]
248
+ })]
249
+ })]
250
+ }, n.id);
251
+ })
252
+ })]
253
+ }, e.id);
254
+ })
255
+ }), T && /* @__PURE__ */ E("div", {
256
+ className: "border-t border-border-seam p-3",
257
+ children: /* @__PURE__ */ D(O, {
258
+ variant: "outline",
259
+ size: "sm",
260
+ className: "w-full",
261
+ onClick: () => S(`catalog/${T}`),
262
+ children: [/* @__PURE__ */ E(h, { className: "mr-1.5 h-4 w-4" }), " Course overview"]
263
+ })
264
+ })] })
223
265
  })
224
- }), /* @__PURE__ */ C("main", {
266
+ }), /* @__PURE__ */ E("main", {
225
267
  className: "min-w-0 flex-1",
226
- children: J ? /* @__PURE__ */ w(E, {
268
+ children: q ? /* @__PURE__ */ D(k, {
227
269
  treatment: "plain",
228
- className: "flex flex-col gap-4 p-5 sm:p-6",
270
+ className: "flex flex-col gap-4 p-5 sm:p-7",
229
271
  children: [
230
- /* @__PURE__ */ w("div", {
272
+ /* @__PURE__ */ D("div", {
231
273
  className: "flex flex-wrap items-center gap-2",
232
274
  children: [
233
- /* @__PURE__ */ C(i, { status: J.type }),
234
- J.durationMin > 0 && /* @__PURE__ */ C("span", {
275
+ /* @__PURE__ */ D("span", {
276
+ className: "inline-flex items-center gap-1.5 rounded-full bg-[var(--color-accent-soft)] px-2.5 py-1 text-xs font-medium text-text-primary",
277
+ children: [/* @__PURE__ */ E(ge, { className: "h-3.5 w-3.5 text-[var(--color-accent-teal)]" }), i(q.type)]
278
+ }),
279
+ q.durationMin > 0 && /* @__PURE__ */ E("span", {
235
280
  className: "text-xs text-text-secondary",
236
- children: r(J.durationMin)
281
+ children: r(q.durationMin)
237
282
  }),
238
- Y && /* @__PURE__ */ w("span", {
283
+ J && /* @__PURE__ */ D("span", {
239
284
  className: "inline-flex items-center gap-1 text-xs font-medium text-status-success-text",
240
- children: [/* @__PURE__ */ C(v, { className: "h-3.5 w-3.5" }), " Completed"]
285
+ children: [/* @__PURE__ */ E(_, { className: "h-3.5 w-3.5" }), " Completed"]
286
+ }),
287
+ /* @__PURE__ */ D("span", {
288
+ className: "ml-auto text-xs tabular-nums text-text-secondary",
289
+ children: [
290
+ "Lesson ",
291
+ K + 1,
292
+ " of ",
293
+ U.length
294
+ ]
241
295
  })
242
296
  ]
243
297
  }),
244
- /* @__PURE__ */ C("h2", {
245
- className: "text-xl font-semibold text-text-primary",
246
- children: J.title
298
+ /* @__PURE__ */ E("h2", {
299
+ className: "text-2xl font-semibold tracking-tight text-text-primary",
300
+ children: q.title
247
301
  }),
248
- J.media ? /* @__PURE__ */ C("div", {
302
+ q.media ? /* @__PURE__ */ D("div", {
249
303
  className: "rounded-xl border border-border-seam bg-bg-sunken p-3",
250
- children: /* @__PURE__ */ C(f, { fileId: J.media.id })
304
+ children: [/* @__PURE__ */ E("p", {
305
+ className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary",
306
+ children: "Resources"
307
+ }), /* @__PURE__ */ E(d, { fileId: q.media.id })]
251
308
  }) : null,
252
- J.content ? /* @__PURE__ */ C("p", {
253
- className: "whitespace-pre-wrap text-sm leading-relaxed text-text-primary",
254
- children: J.content
255
- }) : /* @__PURE__ */ w("p", {
309
+ q.content ? /* @__PURE__ */ E("p", {
310
+ className: "max-w-prose whitespace-pre-wrap text-[15px] leading-7 text-text-primary",
311
+ children: q.content
312
+ }) : /* @__PURE__ */ D("p", {
256
313
  className: "text-sm text-text-secondary",
257
314
  children: [
258
315
  "This lesson has no written content",
259
- J.media ? " beyond the attached media" : "",
316
+ q.media ? " beyond the attached media" : "",
260
317
  "."
261
318
  ]
262
319
  }),
263
- /* @__PURE__ */ w("div", {
264
- className: "mt-2 flex flex-col gap-3 border-t border-border-seam pt-4 sm:flex-row sm:items-center sm:justify-between",
265
- children: [/* @__PURE__ */ w("div", {
266
- className: "flex items-center gap-2",
267
- children: [/* @__PURE__ */ w(T, {
268
- variant: "secondary",
320
+ /* @__PURE__ */ D("div", {
321
+ className: "mt-2 flex flex-col gap-3 border-t border-border-seam pt-5 sm:flex-row sm:items-center sm:justify-between",
322
+ children: [
323
+ /* @__PURE__ */ D(O, {
324
+ variant: "outline",
269
325
  size: "sm",
326
+ className: "max-sm:w-full",
270
327
  onClick: () => Z(-1),
271
- disabled: q <= 0,
272
- children: [/* @__PURE__ */ C(y, { className: "mr-1 h-4 w-4" }), " Prev"]
273
- }), /* @__PURE__ */ w(T, {
274
- variant: "secondary",
328
+ disabled: K <= 0,
329
+ children: [/* @__PURE__ */ E(oe, { className: "mr-1 h-4 w-4" }), " Previous"]
330
+ }),
331
+ J ? /* @__PURE__ */ D("span", {
332
+ className: "inline-flex items-center justify-center gap-2 rounded-lg bg-status-success-bg-subtle px-4 py-2 text-sm font-medium text-status-success-text max-sm:w-full",
333
+ children: [/* @__PURE__ */ E(_, { className: "h-4 w-4" }), " Lesson complete"]
334
+ }) : /* @__PURE__ */ D(O, {
335
+ size: "lg",
336
+ className: "max-sm:w-full",
337
+ onClick: pe,
338
+ disabled: P.isPending,
339
+ children: [P.isPending ? /* @__PURE__ */ E(x, { className: "mr-1.5 h-4 w-4 animate-spin" }) : /* @__PURE__ */ E(_, { className: "mr-1.5 h-4 w-4" }), "Mark complete"]
340
+ }),
341
+ /* @__PURE__ */ D(O, {
342
+ variant: "outline",
275
343
  size: "sm",
344
+ className: "max-sm:w-full",
276
345
  onClick: () => Z(1),
277
- disabled: q >= W.length - 1,
278
- children: ["Next ", /* @__PURE__ */ C(te, { className: "ml-1 h-4 w-4" })]
279
- })]
280
- }), !Y && /* @__PURE__ */ w(T, {
281
- size: "sm",
282
- className: "max-sm:w-full",
283
- onClick: oe,
284
- disabled: F.isPending,
285
- children: [F.isPending ? /* @__PURE__ */ C(S, { className: "mr-1 h-4 w-4 animate-spin" }) : /* @__PURE__ */ C(v, { className: "mr-1 h-4 w-4" }), "Mark complete"]
286
- })]
346
+ disabled: K >= U.length - 1,
347
+ children: ["Next ", /* @__PURE__ */ E(se, { className: "ml-1 h-4 w-4" })]
348
+ })
349
+ ]
287
350
  })
288
351
  ]
289
- }) : /* @__PURE__ */ C(a, {
352
+ }) : /* @__PURE__ */ E(o, {
290
353
  illustration: "empty-data",
291
354
  title: "No lesson to show",
292
355
  description: "This course doesn't have any lessons yet. Check back once the author adds content."
@@ -298,6 +361,6 @@ var D = (e) => [...e].sort((e, t) => e.position - t.position), O = () => {
298
361
  });
299
362
  };
300
363
  //#endregion
301
- export { O as LessonPlayerPage };
364
+ export { M as LessonPlayerPage };
302
365
 
303
366
  //# sourceMappingURL=LessonPlayerPage.js.map