@burdenoff/microfe-technospam 2026.1101.3 → 2026.1101.5

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 (39) hide show
  1. package/dist/stories/journeys/Problems.stories.d.ts +5 -0
  2. package/dist/stories/journeys/Problems.stories.d.ts.map +1 -1
  3. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -1
  4. package/dist/technospam/TechnoSpamRoutes.js +91 -90
  5. package/dist/technospam/TechnoSpamRoutes.js.map +1 -1
  6. package/dist/technospam/api/technospamApi.d.ts +21 -7
  7. package/dist/technospam/api/technospamApi.d.ts.map +1 -1
  8. package/dist/technospam/api/technospamApi.js +317 -284
  9. package/dist/technospam/api/technospamApi.js.map +1 -1
  10. package/dist/technospam/components/lesson/OfflineProgressSync.d.ts +9 -0
  11. package/dist/technospam/components/lesson/OfflineProgressSync.d.ts.map +1 -0
  12. package/dist/technospam/components/lesson/OfflineProgressSync.js +20 -0
  13. package/dist/technospam/components/lesson/OfflineProgressSync.js.map +1 -0
  14. package/dist/technospam/components/lesson/SaveCourseOffline.d.ts +17 -0
  15. package/dist/technospam/components/lesson/SaveCourseOffline.d.ts.map +1 -0
  16. package/dist/technospam/components/lesson/SaveCourseOffline.js +73 -0
  17. package/dist/technospam/components/lesson/SaveCourseOffline.js.map +1 -0
  18. package/dist/technospam/components/lesson/SavedCourseOutline.d.ts +17 -0
  19. package/dist/technospam/components/lesson/SavedCourseOutline.d.ts.map +1 -0
  20. package/dist/technospam/components/lesson/SavedCourseOutline.js +77 -0
  21. package/dist/technospam/components/lesson/SavedCourseOutline.js.map +1 -0
  22. package/dist/technospam/hooks/useOfflineLessons.d.ts +26 -0
  23. package/dist/technospam/hooks/useOfflineLessons.d.ts.map +1 -0
  24. package/dist/technospam/hooks/useOfflineLessons.js +70 -0
  25. package/dist/technospam/hooks/useOfflineLessons.js.map +1 -0
  26. package/dist/technospam/lib/offlineLessons.d.ts +97 -0
  27. package/dist/technospam/lib/offlineLessons.d.ts.map +1 -0
  28. package/dist/technospam/lib/offlineLessons.js +168 -0
  29. package/dist/technospam/lib/offlineLessons.js.map +1 -0
  30. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
  31. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +80 -77
  32. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  33. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -1
  34. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +235 -197
  35. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -1
  36. package/dist/technospam/pages/CoursesLessonPlayerPagePage.d.ts.map +1 -1
  37. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js +216 -138
  38. package/dist/technospam/pages/CoursesLessonPlayerPagePage.js.map +1 -1
  39. package/package.json +1 -1
@@ -6,5 +6,10 @@ export default meta;
6
6
  type Story = StoryObj<typeof meta>;
7
7
  /** Pick a problem from the practice list, submit a solution, see the verdict. */
8
8
  export declare const PracticeAndSubmit: Story;
9
+ /**
10
+ * BOFF-3157: in the card layout a keyboard-only learner Tabs to a problem card
11
+ * (its title is the card's button) and opens it with Enter.
12
+ */
13
+ export declare const OpenProblemCardWithKeyboard: Story;
9
14
  export declare const BackendUnavailable: Story;
10
15
  //# sourceMappingURL=Problems.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Problems.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Problems.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,KA8B/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
1
+ {"version":3,"file":"Problems.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Problems.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,KA8B/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,KAoBzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AAuJA,wBAAgB,gBAAgB,gCAoK/B"}
1
+ {"version":3,"file":"TechnoSpamRoutes.d.ts","sourceRoot":"","sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"names":[],"mappings":"AAwJA,wBAAgB,gBAAgB,gCAqK/B"}
@@ -2,226 +2,227 @@ import { useTechnoSpamPageView as e } from "./hooks/useTechnoSpamPageView.js";
2
2
  import { EmptyView as t } from "./components/StateViews.js";
3
3
  import { TechnoSpamErrorBoundary as n } from "./components/TechnoSpamErrorBoundary.js";
4
4
  import "./components/index.js";
5
- import { DashboardDashboardPagePage as r } from "./pages/DashboardDashboardPagePage.js";
6
- import { Suspense as i, lazy as a, useMemo as o } from "react";
7
- import { Loader2 as s, ShieldAlert as c } from "lucide-react";
8
- import { Navigate as l, Route as u, Routes as d, useLocation as f } from "react-router";
9
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
10
- import { FeatureGate as h } from "@burdenoff/fe-libs/shared/feature-flags";
5
+ import { OfflineProgressSync as r } from "./components/lesson/OfflineProgressSync.js";
6
+ import { DashboardDashboardPagePage as i } from "./pages/DashboardDashboardPagePage.js";
7
+ import { Suspense as a, lazy as o, useMemo as s } from "react";
8
+ import { Loader2 as c, ShieldAlert as l } from "lucide-react";
9
+ import { Navigate as u, Route as d, Routes as f, useLocation as p } from "react-router";
10
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
+ import { FeatureGate as g } from "@burdenoff/fe-libs/shared/feature-flags";
11
12
  //#region src/technospam/TechnoSpamRoutes.tsx
12
- var g = a(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), _ = a(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), v = a(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), y = a(() => import("./pages/CoursesLessonPlayerPagePage.js").then((e) => ({ default: e.CoursesLessonPlayerPagePage }))), b = a(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), x = a(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), S = a(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), C = a(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), w = a(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), T = a(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), E = a(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), D = a(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), O = a(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), k = a(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage }))), A = a(() => import("./pages/StudyPlannerStudyPlannerPagePage.js").then((e) => ({ default: e.StudyPlannerStudyPlannerPagePage }))), j = a(() => import("./pages/ApplicationsPortfolioPagePage.js").then((e) => ({ default: e.ApplicationsPortfolioPagePage })));
13
- function M() {
14
- return /* @__PURE__ */ p("div", {
13
+ var _ = o(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), v = o(() => import("./pages/CoursesCoursesPagePage.js").then((e) => ({ default: e.CoursesCoursesPagePage }))), y = o(() => import("./pages/CoursesCourseDetailsPagePage.js").then((e) => ({ default: e.CoursesCourseDetailsPagePage }))), b = o(() => import("./pages/CoursesLessonPlayerPagePage.js").then((e) => ({ default: e.CoursesLessonPlayerPagePage }))), x = o(() => import("./pages/CoursesMyLearningPagePage.js").then((e) => ({ default: e.CoursesMyLearningPagePage }))), S = o(() => import("./pages/ApplicationsProblemsPagePage.js").then((e) => ({ default: e.ApplicationsProblemsPagePage }))), C = o(() => import("./pages/ApplicationsProblemDetailsPagePage.js").then((e) => ({ default: e.ApplicationsProblemDetailsPagePage }))), w = o(() => import("./pages/MentorshipMentorsPagePage.js").then((e) => ({ default: e.MentorshipMentorsPagePage }))), T = o(() => import("./pages/MentorshipMentorProfilePagePage.js").then((e) => ({ default: e.MentorshipMentorProfilePagePage }))), E = o(() => import("./pages/MentorshipSessionsPagePage.js").then((e) => ({ default: e.MentorshipSessionsPagePage }))), D = o(() => import("./pages/HackathonsHackathonsPagePage.js").then((e) => ({ default: e.HackathonsHackathonsPagePage }))), O = o(() => import("./pages/HackathonsHackathonDetailsPagePage.js").then((e) => ({ default: e.HackathonsHackathonDetailsPagePage }))), k = o(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), A = o(() => import("./pages/AdminAdminDashboardPagePage.js").then((e) => ({ default: e.AdminAdminDashboardPagePage }))), j = o(() => import("./pages/StudyPlannerStudyPlannerPagePage.js").then((e) => ({ default: e.StudyPlannerStudyPlannerPagePage }))), M = o(() => import("./pages/ApplicationsPortfolioPagePage.js").then((e) => ({ default: e.ApplicationsPortfolioPagePage })));
14
+ function N() {
15
+ return /* @__PURE__ */ m("div", {
15
16
  className: "flex h-full min-h-[40vh] items-center justify-center",
16
- children: /* @__PURE__ */ p(s, {
17
+ children: /* @__PURE__ */ m(c, {
17
18
  className: "animate-spin text-text-muted",
18
19
  size: 28
19
20
  })
20
21
  });
21
22
  }
22
- function N() {
23
- return /* @__PURE__ */ p("div", {
23
+ function P() {
24
+ return /* @__PURE__ */ m("div", {
24
25
  className: "flex h-full min-h-[40vh] items-center justify-center p-6",
25
- children: /* @__PURE__ */ p(t, {
26
- icon: /* @__PURE__ */ p(c, { size: 28 }),
26
+ children: /* @__PURE__ */ m(t, {
27
+ icon: /* @__PURE__ */ m(l, { size: 28 }),
27
28
  title: "Feature not available",
28
29
  description: "This TechnoSpam feature is currently disabled for your workspace."
29
30
  })
30
31
  });
31
32
  }
32
- function P(e, t) {
33
- return /* @__PURE__ */ p(h, {
33
+ function F(e, t) {
34
+ return /* @__PURE__ */ m(g, {
34
35
  flag: e,
35
36
  defaultValue: !0,
36
- fallback: /* @__PURE__ */ p(N, {}),
37
+ fallback: /* @__PURE__ */ m(P, {}),
37
38
  children: t
38
39
  });
39
40
  }
40
- function F() {
41
- let { pathname: t } = f();
42
- e(o(() => t.includes("/courses/lesson-player") ? "lesson-player" : t.includes("/courses/course-details") ? "course-details" : t.includes("/courses/my-learning") ? "my-learning" : t.includes("/courses") ? "courses" : t.includes("/applications/problem-details") ? "problem-details" : t.includes("/applications/portfolio") ? "portfolio" : t.includes("/applications") ? "problems" : t.includes("/study-planner") ? "study-planner" : t.includes("/mentorship/mentor-profile") ? "mentor-profile" : t.includes("/mentorship/sessions") ? "sessions" : t.includes("/mentorship") ? "mentors" : t.includes("/hackathons/hackathon-details") ? "hackathon-details" : t.includes("/hackathons") ? "hackathons" : t.includes("/analytics") ? "analytics" : t.includes("/admin") ? "admin" : "dashboard", [t]));
43
- }
44
41
  function I() {
45
- return F(), /* @__PURE__ */ p(i, {
46
- fallback: /* @__PURE__ */ p(M, {}),
47
- children: /* @__PURE__ */ p(n, { children: /* @__PURE__ */ m(d, { children: [
48
- /* @__PURE__ */ p(u, {
42
+ let { pathname: t } = p();
43
+ e(s(() => t.includes("/courses/lesson-player") ? "lesson-player" : t.includes("/courses/course-details") ? "course-details" : t.includes("/courses/my-learning") ? "my-learning" : t.includes("/courses") ? "courses" : t.includes("/applications/problem-details") ? "problem-details" : t.includes("/applications/portfolio") ? "portfolio" : t.includes("/applications") ? "problems" : t.includes("/study-planner") ? "study-planner" : t.includes("/mentorship/mentor-profile") ? "mentor-profile" : t.includes("/mentorship/sessions") ? "sessions" : t.includes("/mentorship") ? "mentors" : t.includes("/hackathons/hackathon-details") ? "hackathon-details" : t.includes("/hackathons") ? "hackathons" : t.includes("/analytics") ? "analytics" : t.includes("/admin") ? "admin" : "dashboard", [t]));
44
+ }
45
+ function L() {
46
+ return I(), /* @__PURE__ */ m(a, {
47
+ fallback: /* @__PURE__ */ m(N, {}),
48
+ children: /* @__PURE__ */ h(n, { children: [/* @__PURE__ */ m(r, {}), /* @__PURE__ */ h(f, { children: [
49
+ /* @__PURE__ */ m(d, {
49
50
  index: !0,
50
- element: P("technospam.dashboard", /* @__PURE__ */ p(r, {}))
51
+ element: F("technospam.dashboard", /* @__PURE__ */ m(i, {}))
51
52
  }),
52
- /* @__PURE__ */ p(u, {
53
+ /* @__PURE__ */ m(d, {
53
54
  path: "dashboard/dashboard-page",
54
- element: P("technospam.dashboard", /* @__PURE__ */ p(g, {}))
55
+ element: F("technospam.dashboard", /* @__PURE__ */ m(_, {}))
55
56
  }),
56
- /* @__PURE__ */ p(u, {
57
+ /* @__PURE__ */ m(d, {
57
58
  path: "courses/courses-page",
58
- element: P("technospam.courses", /* @__PURE__ */ p(_, {}))
59
+ element: F("technospam.courses", /* @__PURE__ */ m(v, {}))
59
60
  }),
60
- /* @__PURE__ */ p(u, {
61
+ /* @__PURE__ */ m(d, {
61
62
  path: "courses/course-details-page",
62
- element: P("technospam.courses", /* @__PURE__ */ p(v, {}))
63
+ element: F("technospam.courses", /* @__PURE__ */ m(y, {}))
63
64
  }),
64
- /* @__PURE__ */ p(u, {
65
+ /* @__PURE__ */ m(d, {
65
66
  path: "courses/lesson-player-page",
66
- element: P("technospam.courses", /* @__PURE__ */ p(y, {}))
67
+ element: F("technospam.courses", /* @__PURE__ */ m(b, {}))
67
68
  }),
68
- /* @__PURE__ */ p(u, {
69
+ /* @__PURE__ */ m(d, {
69
70
  path: "courses/my-learning-page",
70
- element: P("technospam.courses", /* @__PURE__ */ p(b, {}))
71
+ element: F("technospam.courses", /* @__PURE__ */ m(x, {}))
71
72
  }),
72
- /* @__PURE__ */ p(u, {
73
+ /* @__PURE__ */ m(d, {
73
74
  path: "courses/instructors-page",
74
- element: /* @__PURE__ */ p(l, {
75
+ element: /* @__PURE__ */ m(u, {
75
76
  to: "../courses/courses-page",
76
77
  replace: !0
77
78
  })
78
79
  }),
79
- /* @__PURE__ */ p(u, {
80
+ /* @__PURE__ */ m(d, {
80
81
  path: "courses/instructor-profile-page",
81
- element: /* @__PURE__ */ p(l, {
82
+ element: /* @__PURE__ */ m(u, {
82
83
  to: "../courses/courses-page",
83
84
  replace: !0
84
85
  })
85
86
  }),
86
- /* @__PURE__ */ p(u, {
87
+ /* @__PURE__ */ m(d, {
87
88
  path: "applications/problems-page",
88
- element: P("technospam.problems", /* @__PURE__ */ p(x, {}))
89
+ element: F("technospam.problems", /* @__PURE__ */ m(S, {}))
89
90
  }),
90
- /* @__PURE__ */ p(u, {
91
+ /* @__PURE__ */ m(d, {
91
92
  path: "applications/problem-details-page",
92
- element: P("technospam.problems", /* @__PURE__ */ p(S, {}))
93
+ element: F("technospam.problems", /* @__PURE__ */ m(C, {}))
93
94
  }),
94
- /* @__PURE__ */ p(u, {
95
+ /* @__PURE__ */ m(d, {
95
96
  path: "applications/solutions-page",
96
- element: /* @__PURE__ */ p(l, {
97
+ element: /* @__PURE__ */ m(u, {
97
98
  to: "../applications/problems-page",
98
99
  replace: !0
99
100
  })
100
101
  }),
101
- /* @__PURE__ */ p(u, {
102
+ /* @__PURE__ */ m(d, {
102
103
  path: "applications/portfolio-page",
103
- element: P("technospam.portfolio", /* @__PURE__ */ p(j, {}))
104
+ element: F("technospam.portfolio", /* @__PURE__ */ m(M, {}))
104
105
  }),
105
- /* @__PURE__ */ p(u, {
106
+ /* @__PURE__ */ m(d, {
106
107
  path: "mentorship/mentors-page",
107
- element: P("technospam.mentorship", /* @__PURE__ */ p(C, {}))
108
+ element: F("technospam.mentorship", /* @__PURE__ */ m(w, {}))
108
109
  }),
109
- /* @__PURE__ */ p(u, {
110
+ /* @__PURE__ */ m(d, {
110
111
  path: "mentorship/mentor-profile-page",
111
- element: P("technospam.mentorship", /* @__PURE__ */ p(w, {}))
112
+ element: F("technospam.mentorship", /* @__PURE__ */ m(T, {}))
112
113
  }),
113
- /* @__PURE__ */ p(u, {
114
+ /* @__PURE__ */ m(d, {
114
115
  path: "mentorship/sessions-page",
115
- element: P("technospam.mentorship", /* @__PURE__ */ p(T, {}))
116
+ element: F("technospam.mentorship", /* @__PURE__ */ m(E, {}))
116
117
  }),
117
- /* @__PURE__ */ p(u, {
118
+ /* @__PURE__ */ m(d, {
118
119
  path: "mentorship/mentorship-page",
119
- element: /* @__PURE__ */ p(l, {
120
+ element: /* @__PURE__ */ m(u, {
120
121
  to: "../mentorship/mentors-page",
121
122
  replace: !0
122
123
  })
123
124
  }),
124
- /* @__PURE__ */ p(u, {
125
+ /* @__PURE__ */ m(d, {
125
126
  path: "mentorship/bookings-page",
126
- element: /* @__PURE__ */ p(l, {
127
+ element: /* @__PURE__ */ m(u, {
127
128
  to: "../mentorship/sessions-page",
128
129
  replace: !0
129
130
  })
130
131
  }),
131
- /* @__PURE__ */ p(u, {
132
+ /* @__PURE__ */ m(d, {
132
133
  path: "hackathons/hackathons-page",
133
- element: P("technospam.hackathons", /* @__PURE__ */ p(E, {}))
134
+ element: F("technospam.hackathons", /* @__PURE__ */ m(D, {}))
134
135
  }),
135
- /* @__PURE__ */ p(u, {
136
+ /* @__PURE__ */ m(d, {
136
137
  path: "hackathons/hackathon-details-page",
137
- element: P("technospam.hackathons", /* @__PURE__ */ p(D, {}))
138
+ element: F("technospam.hackathons", /* @__PURE__ */ m(O, {}))
138
139
  }),
139
- /* @__PURE__ */ p(u, {
140
+ /* @__PURE__ */ m(d, {
140
141
  path: "hackathons/events-page",
141
- element: /* @__PURE__ */ p(l, {
142
+ element: /* @__PURE__ */ m(u, {
142
143
  to: "../hackathons/hackathons-page",
143
144
  replace: !0
144
145
  })
145
146
  }),
146
- /* @__PURE__ */ p(u, {
147
+ /* @__PURE__ */ m(d, {
147
148
  path: "hackathons/teams-page",
148
- element: /* @__PURE__ */ p(l, {
149
+ element: /* @__PURE__ */ m(u, {
149
150
  to: "../hackathons/hackathons-page",
150
151
  replace: !0
151
152
  })
152
153
  }),
153
- /* @__PURE__ */ p(u, {
154
+ /* @__PURE__ */ m(d, {
154
155
  path: "analytics/analytics-page",
155
- element: P("technospam.analytics", /* @__PURE__ */ p(O, {}))
156
+ element: F("technospam.analytics", /* @__PURE__ */ m(k, {}))
156
157
  }),
157
- /* @__PURE__ */ p(u, {
158
+ /* @__PURE__ */ m(d, {
158
159
  path: "analytics/progress-page",
159
- element: /* @__PURE__ */ p(l, {
160
+ element: /* @__PURE__ */ m(u, {
160
161
  to: "../analytics/analytics-page",
161
162
  replace: !0
162
163
  })
163
164
  }),
164
- /* @__PURE__ */ p(u, {
165
+ /* @__PURE__ */ m(d, {
165
166
  path: "analytics/achievements-page",
166
- element: /* @__PURE__ */ p(l, {
167
+ element: /* @__PURE__ */ m(u, {
167
168
  to: "../analytics/analytics-page",
168
169
  replace: !0
169
170
  })
170
171
  }),
171
- /* @__PURE__ */ p(u, {
172
+ /* @__PURE__ */ m(d, {
172
173
  path: "analytics/reports-page",
173
- element: /* @__PURE__ */ p(l, {
174
+ element: /* @__PURE__ */ m(u, {
174
175
  to: "../analytics/analytics-page",
175
176
  replace: !0
176
177
  })
177
178
  }),
178
- /* @__PURE__ */ p(u, {
179
+ /* @__PURE__ */ m(d, {
179
180
  path: "admin/admin-dashboard-page",
180
- element: P("technospam.admin", /* @__PURE__ */ p(k, {}))
181
+ element: F("technospam.admin", /* @__PURE__ */ m(A, {}))
181
182
  }),
182
- /* @__PURE__ */ p(u, {
183
+ /* @__PURE__ */ m(d, {
183
184
  path: "admin/audit-reports-page",
184
- element: /* @__PURE__ */ p(l, {
185
+ element: /* @__PURE__ */ m(u, {
185
186
  to: "../admin/admin-dashboard-page",
186
187
  replace: !0
187
188
  })
188
189
  }),
189
- /* @__PURE__ */ p(u, {
190
+ /* @__PURE__ */ m(d, {
190
191
  path: "study-planner/study-planner-page",
191
- element: P("technospam.studyPlanner", /* @__PURE__ */ p(A, {}))
192
+ element: F("technospam.studyPlanner", /* @__PURE__ */ m(j, {}))
192
193
  }),
193
- /* @__PURE__ */ p(u, {
194
+ /* @__PURE__ */ m(d, {
194
195
  path: "study-planner/*",
195
- element: /* @__PURE__ */ p(l, {
196
+ element: /* @__PURE__ */ m(u, {
196
197
  to: "../study-planner/study-planner-page",
197
198
  replace: !0
198
199
  })
199
200
  }),
200
- /* @__PURE__ */ p(u, {
201
+ /* @__PURE__ */ m(d, {
201
202
  path: "open-source/*",
202
- element: /* @__PURE__ */ p(l, {
203
+ element: /* @__PURE__ */ m(u, {
203
204
  to: "../dashboard/dashboard-page",
204
205
  replace: !0
205
206
  })
206
207
  }),
207
- /* @__PURE__ */ p(u, {
208
+ /* @__PURE__ */ m(d, {
208
209
  path: "knowledge-base/*",
209
- element: /* @__PURE__ */ p(l, {
210
+ element: /* @__PURE__ */ m(u, {
210
211
  to: "../dashboard/dashboard-page",
211
212
  replace: !0
212
213
  })
213
214
  }),
214
- /* @__PURE__ */ p(u, {
215
+ /* @__PURE__ */ m(d, {
215
216
  path: "*",
216
- element: /* @__PURE__ */ p(l, {
217
+ element: /* @__PURE__ */ m(u, {
217
218
  to: "../dashboard/dashboard-page",
218
219
  replace: !0
219
220
  })
220
221
  })
221
- ] }) })
222
+ ] })] })
222
223
  });
223
224
  }
224
225
  //#endregion
225
- export { I as TechnoSpamRoutes };
226
+ export { L as TechnoSpamRoutes };
226
227
 
227
228
  //# sourceMappingURL=TechnoSpamRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useMemo } from 'react';\nimport { Navigate, Route, Routes, useLocation } from 'react-router';\nimport { Loader2, ShieldAlert } from 'lucide-react';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTechnoSpamPageView } from './hooks/useTechnoSpamPageView';\nimport { EmptyView, TechnoSpamErrorBoundary } from './components';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (open source, knowledge base,\n * standalone instructors, extra analytics/admin sub-pages) were removed\n * during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n *\n * study-planner (BOFF-4415) and applications/portfolio-page (BOFF-4432) are\n * real pages again as of this pass — see their page components' honesty\n * notes for exactly what is/isn't AI and what's deferred.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesLessonPlayerPagePage = lazy(() =>\n import('./pages/CoursesLessonPlayerPagePage').then((m) => ({\n default: m.CoursesLessonPlayerPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\nconst StudyPlannerStudyPlannerPagePage = lazy(() =>\n import('./pages/StudyPlannerStudyPlannerPagePage').then((m) => ({\n default: m.StudyPlannerStudyPlannerPagePage,\n }))\n);\nconst ApplicationsPortfolioPagePage = lazy(() =>\n import('./pages/ApplicationsPortfolioPagePage').then((m) => ({\n default: m.ApplicationsPortfolioPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center p-6\">\n <EmptyView\n icon={<ShieldAlert size={28} />}\n title=\"Feature not available\"\n description=\"This TechnoSpam feature is currently disabled for your workspace.\"\n />\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nfunction useTrackedPageView() {\n const { pathname } = useLocation();\n const page = useMemo(() => {\n if (pathname.includes('/courses/lesson-player')) return 'lesson-player';\n if (pathname.includes('/courses/course-details')) return 'course-details';\n if (pathname.includes('/courses/my-learning')) return 'my-learning';\n if (pathname.includes('/courses')) return 'courses';\n if (pathname.includes('/applications/problem-details')) return 'problem-details';\n if (pathname.includes('/applications/portfolio')) return 'portfolio';\n if (pathname.includes('/applications')) return 'problems';\n if (pathname.includes('/study-planner')) return 'study-planner';\n if (pathname.includes('/mentorship/mentor-profile')) return 'mentor-profile';\n if (pathname.includes('/mentorship/sessions')) return 'sessions';\n if (pathname.includes('/mentorship')) return 'mentors';\n if (pathname.includes('/hackathons/hackathon-details')) return 'hackathon-details';\n if (pathname.includes('/hackathons')) return 'hackathons';\n if (pathname.includes('/analytics')) return 'analytics';\n if (pathname.includes('/admin')) return 'admin';\n return 'dashboard';\n }, [pathname]);\n useTechnoSpamPageView(page);\n}\n\nexport function TechnoSpamRoutes() {\n useTrackedPageView();\n return (\n <Suspense fallback={<PageLoader />}>\n <TechnoSpamErrorBoundary>\n <Routes>\n <Route index element={gated('technospam.dashboard', <IndexPage />)} />\n <Route\n path=\"dashboard/dashboard-page\"\n element={gated('technospam.dashboard', <DashboardDashboardPagePage />)}\n />\n\n {/* Courses */}\n <Route\n path=\"courses/courses-page\"\n element={gated('technospam.courses', <CoursesCoursesPagePage />)}\n />\n <Route\n path=\"courses/course-details-page\"\n element={gated('technospam.courses', <CoursesCourseDetailsPagePage />)}\n />\n <Route\n path=\"courses/lesson-player-page\"\n element={gated('technospam.courses', <CoursesLessonPlayerPagePage />)}\n />\n <Route\n path=\"courses/my-learning-page\"\n element={gated('technospam.courses', <CoursesMyLearningPagePage />)}\n />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route\n path=\"applications/problems-page\"\n element={gated('technospam.problems', <ApplicationsProblemsPagePage />)}\n />\n <Route\n path=\"applications/problem-details-page\"\n element={gated('technospam.problems', <ApplicationsProblemDetailsPagePage />)}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={gated('technospam.portfolio', <ApplicationsPortfolioPagePage />)}\n />\n\n {/* Mentorship */}\n <Route\n path=\"mentorship/mentors-page\"\n element={gated('technospam.mentorship', <MentorshipMentorsPagePage />)}\n />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={gated('technospam.mentorship', <MentorshipMentorProfilePagePage />)}\n />\n <Route\n path=\"mentorship/sessions-page\"\n element={gated('technospam.mentorship', <MentorshipSessionsPagePage />)}\n />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route\n path=\"hackathons/hackathons-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonsPagePage />)}\n />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonDetailsPagePage />)}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics/analytics-page\"\n element={gated('technospam.analytics', <AnalyticsAnalyticsPagePage />)}\n />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route\n path=\"admin/admin-dashboard-page\"\n element={gated('technospam.admin', <AdminAdminDashboardPagePage />)}\n />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/*\n * Study Planner (BOFF-4415): a real, deterministic (non-AI)\n * scheduler now lives at study-planner/study-planner-page — see\n * StudyPlannerStudyPlannerPagePage's honesty note. This single page\n * intentionally consolidates what the nav scaffolding originally\n * anticipated as several separate pages (plans list, plan details,\n * edit, learning paths, goals) — those richer standalone views,\n * plus true AI/adaptive re-planning (BOFF-3874/3895), remain\n * deferred. Any other study-planner/* sub-path falls back here\n * rather than to the dashboard, since the real page now exists.\n */}\n <Route\n path=\"study-planner/study-planner-page\"\n element={gated('technospam.studyPlanner', <StudyPlannerStudyPlannerPagePage />)}\n />\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../study-planner/study-planner-page\" replace />}\n />\n {/*\n * Removed modules → dashboard.\n *\n * open-source and knowledge-base were never shipped and have no nav\n * entries anymore (BOFF-3086) — these redirects are a defensive\n * fallback for stale bookmarks/links only.\n */}\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </TechnoSpamErrorBoundary>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TechnoSpamRoutes.js","names":[],"sources":["../../src/technospam/TechnoSpamRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useMemo } from 'react';\nimport { Navigate, Route, Routes, useLocation } from 'react-router';\nimport { Loader2, ShieldAlert } from 'lucide-react';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTechnoSpamPageView } from './hooks/useTechnoSpamPageView';\nimport { EmptyView, TechnoSpamErrorBoundary } from './components';\nimport { OfflineProgressSync } from './components/lesson/OfflineProgressSync';\n\n/**\n * TechnoSpam routes — every page is backed by the real wspace-technospam-svc\n * (Tec* fields). Modules with no backend (open source, knowledge base,\n * standalone instructors, extra analytics/admin sub-pages) were removed\n * during the backend-reconciliation rebuild; their old paths redirect to\n * the nearest live page so stale links never 404.\n *\n * study-planner (BOFF-4415) and applications/portfolio-page (BOFF-4432) are\n * real pages again as of this pass — see their page components' honesty\n * notes for exactly what is/isn't AI and what's deferred.\n */\n\nimport { DashboardDashboardPagePage as IndexPage } from './pages/DashboardDashboardPagePage';\n\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst CoursesCoursesPagePage = lazy(() =>\n import('./pages/CoursesCoursesPagePage').then((m) => ({ default: m.CoursesCoursesPagePage }))\n);\nconst CoursesCourseDetailsPagePage = lazy(() =>\n import('./pages/CoursesCourseDetailsPagePage').then((m) => ({\n default: m.CoursesCourseDetailsPagePage,\n }))\n);\nconst CoursesLessonPlayerPagePage = lazy(() =>\n import('./pages/CoursesLessonPlayerPagePage').then((m) => ({\n default: m.CoursesLessonPlayerPagePage,\n }))\n);\nconst CoursesMyLearningPagePage = lazy(() =>\n import('./pages/CoursesMyLearningPagePage').then((m) => ({\n default: m.CoursesMyLearningPagePage,\n }))\n);\nconst ApplicationsProblemsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemsPagePage').then((m) => ({\n default: m.ApplicationsProblemsPagePage,\n }))\n);\nconst ApplicationsProblemDetailsPagePage = lazy(() =>\n import('./pages/ApplicationsProblemDetailsPagePage').then((m) => ({\n default: m.ApplicationsProblemDetailsPagePage,\n }))\n);\nconst MentorshipMentorsPagePage = lazy(() =>\n import('./pages/MentorshipMentorsPagePage').then((m) => ({\n default: m.MentorshipMentorsPagePage,\n }))\n);\nconst MentorshipMentorProfilePagePage = lazy(() =>\n import('./pages/MentorshipMentorProfilePagePage').then((m) => ({\n default: m.MentorshipMentorProfilePagePage,\n }))\n);\nconst MentorshipSessionsPagePage = lazy(() =>\n import('./pages/MentorshipSessionsPagePage').then((m) => ({\n default: m.MentorshipSessionsPagePage,\n }))\n);\nconst HackathonsHackathonsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonsPagePage').then((m) => ({\n default: m.HackathonsHackathonsPagePage,\n }))\n);\nconst HackathonsHackathonDetailsPagePage = lazy(() =>\n import('./pages/HackathonsHackathonDetailsPagePage').then((m) => ({\n default: m.HackathonsHackathonDetailsPagePage,\n }))\n);\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AdminAdminDashboardPagePage = lazy(() =>\n import('./pages/AdminAdminDashboardPagePage').then((m) => ({\n default: m.AdminAdminDashboardPagePage,\n }))\n);\nconst StudyPlannerStudyPlannerPagePage = lazy(() =>\n import('./pages/StudyPlannerStudyPlannerPagePage').then((m) => ({\n default: m.StudyPlannerStudyPlannerPagePage,\n }))\n);\nconst ApplicationsPortfolioPagePage = lazy(() =>\n import('./pages/ApplicationsPortfolioPagePage').then((m) => ({\n default: m.ApplicationsPortfolioPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center\">\n <Loader2 className=\"animate-spin text-text-muted\" size={28} />\n </div>\n );\n}\n\nfunction FeatureDisabledFallback() {\n return (\n <div className=\"flex h-full min-h-[40vh] items-center justify-center p-6\">\n <EmptyView\n icon={<ShieldAlert size={28} />}\n title=\"Feature not available\"\n description=\"This TechnoSpam feature is currently disabled for your workspace.\"\n />\n </div>\n );\n}\n\nfunction gated(flag: string, element: React.ReactNode): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nfunction useTrackedPageView() {\n const { pathname } = useLocation();\n const page = useMemo(() => {\n if (pathname.includes('/courses/lesson-player')) return 'lesson-player';\n if (pathname.includes('/courses/course-details')) return 'course-details';\n if (pathname.includes('/courses/my-learning')) return 'my-learning';\n if (pathname.includes('/courses')) return 'courses';\n if (pathname.includes('/applications/problem-details')) return 'problem-details';\n if (pathname.includes('/applications/portfolio')) return 'portfolio';\n if (pathname.includes('/applications')) return 'problems';\n if (pathname.includes('/study-planner')) return 'study-planner';\n if (pathname.includes('/mentorship/mentor-profile')) return 'mentor-profile';\n if (pathname.includes('/mentorship/sessions')) return 'sessions';\n if (pathname.includes('/mentorship')) return 'mentors';\n if (pathname.includes('/hackathons/hackathon-details')) return 'hackathon-details';\n if (pathname.includes('/hackathons')) return 'hackathons';\n if (pathname.includes('/analytics')) return 'analytics';\n if (pathname.includes('/admin')) return 'admin';\n return 'dashboard';\n }, [pathname]);\n useTechnoSpamPageView(page);\n}\n\nexport function TechnoSpamRoutes() {\n useTrackedPageView();\n return (\n <Suspense fallback={<PageLoader />}>\n <TechnoSpamErrorBoundary>\n <OfflineProgressSync />\n <Routes>\n <Route index element={gated('technospam.dashboard', <IndexPage />)} />\n <Route\n path=\"dashboard/dashboard-page\"\n element={gated('technospam.dashboard', <DashboardDashboardPagePage />)}\n />\n\n {/* Courses */}\n <Route\n path=\"courses/courses-page\"\n element={gated('technospam.courses', <CoursesCoursesPagePage />)}\n />\n <Route\n path=\"courses/course-details-page\"\n element={gated('technospam.courses', <CoursesCourseDetailsPagePage />)}\n />\n <Route\n path=\"courses/lesson-player-page\"\n element={gated('technospam.courses', <CoursesLessonPlayerPagePage />)}\n />\n <Route\n path=\"courses/my-learning-page\"\n element={gated('technospam.courses', <CoursesMyLearningPagePage />)}\n />\n <Route\n path=\"courses/instructors-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n <Route\n path=\"courses/instructor-profile-page\"\n element={<Navigate to=\"../courses/courses-page\" replace />}\n />\n\n {/* Practice (applications) */}\n <Route\n path=\"applications/problems-page\"\n element={gated('technospam.problems', <ApplicationsProblemsPagePage />)}\n />\n <Route\n path=\"applications/problem-details-page\"\n element={gated('technospam.problems', <ApplicationsProblemDetailsPagePage />)}\n />\n <Route\n path=\"applications/solutions-page\"\n element={<Navigate to=\"../applications/problems-page\" replace />}\n />\n <Route\n path=\"applications/portfolio-page\"\n element={gated('technospam.portfolio', <ApplicationsPortfolioPagePage />)}\n />\n\n {/* Mentorship */}\n <Route\n path=\"mentorship/mentors-page\"\n element={gated('technospam.mentorship', <MentorshipMentorsPagePage />)}\n />\n <Route\n path=\"mentorship/mentor-profile-page\"\n element={gated('technospam.mentorship', <MentorshipMentorProfilePagePage />)}\n />\n <Route\n path=\"mentorship/sessions-page\"\n element={gated('technospam.mentorship', <MentorshipSessionsPagePage />)}\n />\n <Route\n path=\"mentorship/mentorship-page\"\n element={<Navigate to=\"../mentorship/mentors-page\" replace />}\n />\n <Route\n path=\"mentorship/bookings-page\"\n element={<Navigate to=\"../mentorship/sessions-page\" replace />}\n />\n\n {/* Hackathons */}\n <Route\n path=\"hackathons/hackathons-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonsPagePage />)}\n />\n <Route\n path=\"hackathons/hackathon-details-page\"\n element={gated('technospam.hackathons', <HackathonsHackathonDetailsPagePage />)}\n />\n <Route\n path=\"hackathons/events-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n <Route\n path=\"hackathons/teams-page\"\n element={<Navigate to=\"../hackathons/hackathons-page\" replace />}\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics/analytics-page\"\n element={gated('technospam.analytics', <AnalyticsAnalyticsPagePage />)}\n />\n <Route\n path=\"analytics/progress-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/achievements-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n <Route\n path=\"analytics/reports-page\"\n element={<Navigate to=\"../analytics/analytics-page\" replace />}\n />\n\n {/* Admin */}\n <Route\n path=\"admin/admin-dashboard-page\"\n element={gated('technospam.admin', <AdminAdminDashboardPagePage />)}\n />\n <Route\n path=\"admin/audit-reports-page\"\n element={<Navigate to=\"../admin/admin-dashboard-page\" replace />}\n />\n\n {/*\n * Study Planner (BOFF-4415): a real, deterministic (non-AI)\n * scheduler now lives at study-planner/study-planner-page — see\n * StudyPlannerStudyPlannerPagePage's honesty note. This single page\n * intentionally consolidates what the nav scaffolding originally\n * anticipated as several separate pages (plans list, plan details,\n * edit, learning paths, goals) — those richer standalone views,\n * plus true AI/adaptive re-planning (BOFF-3874/3895), remain\n * deferred. Any other study-planner/* sub-path falls back here\n * rather than to the dashboard, since the real page now exists.\n */}\n <Route\n path=\"study-planner/study-planner-page\"\n element={gated('technospam.studyPlanner', <StudyPlannerStudyPlannerPagePage />)}\n />\n <Route\n path=\"study-planner/*\"\n element={<Navigate to=\"../study-planner/study-planner-page\" replace />}\n />\n {/*\n * Removed modules → dashboard.\n *\n * open-source and knowledge-base were never shipped and have no nav\n * entries anymore (BOFF-3086) — these redirects are a defensive\n * fallback for stale bookmarks/links only.\n */}\n <Route\n path=\"open-source/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n <Route\n path=\"knowledge-base/*\"\n element={<Navigate to=\"../dashboard/dashboard-page\" replace />}\n />\n\n <Route path=\"*\" element={<Navigate to=\"../dashboard/dashboard-page\" replace />} />\n </Routes>\n </TechnoSpamErrorBoundary>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ErrorLike } from '@apollo/client';
1
+ import { ApolloClient, ErrorLike } from '@apollo/client';
2
2
  import { useMutation, useQuery } from '@apollo/client/react';
3
3
  import { BuiMyCertificateRow, BuiMyEnrollmentRow } from './canonicalLearning';
4
4
 
@@ -394,7 +394,7 @@ export interface MyLearningScope {
394
394
  /** The signed-in learner's own TechnoSpam enrollments (canonical, self-scoped). */
395
395
  export declare function useMyEnrollmentsQuery(scope?: MyLearningScope): {
396
396
  enrollments: TecEnrollment[];
397
- client: import('@apollo/client').ApolloClient;
397
+ client: ApolloClient;
398
398
  observable: import('@apollo/client').ObservableQuery<{
399
399
  buiMyEnrollments: {
400
400
  items: BuiMyEnrollmentRow[];
@@ -452,7 +452,7 @@ export declare function useMyEnrollmentsQuery(scope?: MyLearningScope): {
452
452
  dataState: "empty";
453
453
  } | {
454
454
  enrollments: TecEnrollment[];
455
- client: import('@apollo/client').ApolloClient;
455
+ client: ApolloClient;
456
456
  observable: import('@apollo/client').ObservableQuery<{
457
457
  buiMyEnrollments: {
458
458
  items: BuiMyEnrollmentRow[];
@@ -515,7 +515,7 @@ export declare function useMyEnrollmentsQuery(scope?: MyLearningScope): {
515
515
  dataState: "complete";
516
516
  } | {
517
517
  enrollments: TecEnrollment[];
518
- client: import('@apollo/client').ApolloClient;
518
+ client: ApolloClient;
519
519
  observable: import('@apollo/client').ObservableQuery<{
520
520
  buiMyEnrollments: {
521
521
  items: BuiMyEnrollmentRow[];
@@ -580,7 +580,7 @@ export declare function useMyEnrollmentsQuery(scope?: MyLearningScope): {
580
580
  /** The signed-in learner's own TechnoSpam certificates (canonical, self-scoped). */
581
581
  export declare function useMyCertificatesQuery(scope?: MyLearningScope): {
582
582
  certificates: TecCertificate[];
583
- client: import('@apollo/client').ApolloClient;
583
+ client: ApolloClient;
584
584
  observable: import('@apollo/client').ObservableQuery<{
585
585
  buiMyCertificates: {
586
586
  items: BuiMyCertificateRow[];
@@ -638,7 +638,7 @@ export declare function useMyCertificatesQuery(scope?: MyLearningScope): {
638
638
  dataState: "empty";
639
639
  } | {
640
640
  certificates: TecCertificate[];
641
- client: import('@apollo/client').ApolloClient;
641
+ client: ApolloClient;
642
642
  observable: import('@apollo/client').ObservableQuery<{
643
643
  buiMyCertificates: {
644
644
  items: BuiMyCertificateRow[];
@@ -701,7 +701,7 @@ export declare function useMyCertificatesQuery(scope?: MyLearningScope): {
701
701
  dataState: "complete";
702
702
  } | {
703
703
  certificates: TecCertificate[];
704
- client: import('@apollo/client').ApolloClient;
704
+ client: ApolloClient;
705
705
  observable: import('@apollo/client').ObservableQuery<{
706
706
  buiMyCertificates: {
707
707
  items: BuiMyCertificateRow[];
@@ -1161,6 +1161,20 @@ export declare const useRunLessonCode: () => useMutation.ResultTuple<{
1161
1161
  }, {
1162
1162
  [x: string]: any;
1163
1163
  }, import('@apollo/client').ApolloCache, undefined>;
1164
+ /**
1165
+ * Fetch one lesson (with its course outline) straight from the network, for
1166
+ * saving a course to the device. Returns null when the lesson cannot be read.
1167
+ */
1168
+ export declare function fetchLessonForOffline(client: ApolloClient, courseId: string, lessonId: string): Promise<LessonPlayerData | null>;
1169
+ /** True when every GraphQL error in a failed completion is terminal. */
1170
+ export declare function isTerminalCompletionError(error: unknown): boolean;
1171
+ /**
1172
+ * Send a lesson completion that was queued while offline: `rejected` when the
1173
+ * server refused it for good (see {@link isTerminalCompletionError}), `retry`
1174
+ * for anything that may succeed later (no connection, gateway down, expired
1175
+ * session).
1176
+ */
1177
+ export declare function sendQueuedLessonCompletion(client: ApolloClient, lessonId: string): Promise<'sent' | 'rejected' | 'retry'>;
1164
1178
  export type TecCertificateVerificationStatus = 'VALID' | 'REVOKED' | 'NOT_FOUND';
1165
1179
  export interface TecCertificateVerification {
1166
1180
  serial: string;