@burdenoff/microfe-crewfoundry 2026.1013.2 → 2026.1029.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/dist/crewfoundry/CrewFoundryRoot.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoot.js +160 -256
  3. package/dist/crewfoundry/CrewFoundryRoot.js.map +1 -1
  4. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  5. package/dist/crewfoundry/CrewFoundryRoutes.js +152 -192
  6. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  7. package/dist/crewfoundry/components/InlineError.d.ts +5 -0
  8. package/dist/crewfoundry/components/InlineError.d.ts.map +1 -0
  9. package/dist/crewfoundry/components/InlineError.js +17 -0
  10. package/dist/crewfoundry/components/InlineError.js.map +1 -0
  11. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
  12. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
  13. package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
  14. package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
  15. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
  16. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
  17. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
  18. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
  19. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
  20. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
  21. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
  22. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
  23. package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
  24. package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
  25. package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
  26. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
  27. package/dist/crewfoundry/lib/analytics.d.ts +1 -6
  28. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  29. package/dist/crewfoundry/lib/analytics.js +3 -18
  30. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  31. package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
  32. package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
  33. package/dist/crewfoundry/lib/companyFinance.js +3 -8
  34. package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
  35. package/dist/crewfoundry/lib/learning.d.ts +12 -0
  36. package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
  37. package/dist/crewfoundry/lib/learning.js +26 -0
  38. package/dist/crewfoundry/lib/learning.js.map +1 -0
  39. package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
  40. package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
  41. package/dist/crewfoundry/lib/marketplace.js +91 -0
  42. package/dist/crewfoundry/lib/marketplace.js.map +1 -0
  43. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
  44. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
  45. package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
  46. package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
  47. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
  48. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
  49. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  50. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  51. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
  52. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  54. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
  55. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  56. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  57. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
  58. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
  60. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
  61. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  62. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
  63. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
  64. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
  66. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
  68. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
  70. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
  71. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
  72. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
  73. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
  74. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
  78. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
  79. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  80. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
  81. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
  82. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
  83. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
  84. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
  86. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
  88. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
  89. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  90. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
  92. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  93. package/dist/crewfoundry/store/crewfoundryStore.d.ts +138 -78
  94. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  95. package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
  96. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  97. package/dist/crewfoundry/utils/dateUtils.d.ts +5 -0
  98. package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -1
  99. package/dist/crewfoundry/utils/dateUtils.js +10 -1
  100. package/dist/crewfoundry/utils/dateUtils.js.map +1 -1
  101. package/dist/generated/global-types.d.ts +5145 -1627
  102. package/dist/generated/global-types.d.ts.map +1 -1
  103. package/dist/generated/wspace-types.d.ts +100373 -34602
  104. package/dist/generated/wspace-types.d.ts.map +1 -1
  105. package/dist/utils/pageContext.d.ts.map +1 -1
  106. package/dist/utils/pageContext.js +0 -1
  107. package/dist/utils/pageContext.js.map +1 -1
  108. package/package.json +1 -1
  109. package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
  110. package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
  111. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
  112. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
  113. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
  114. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
  115. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
  116. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
  117. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
  118. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
  119. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
  120. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
  121. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
  122. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
  123. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
  124. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
  125. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
  126. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
  127. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
  128. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
  129. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
  130. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
  131. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
  132. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
  133. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
  134. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
  135. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
  136. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
  137. package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
  138. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
  139. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
  140. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
  141. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
  142. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
  143. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
  144. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
  145. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
  146. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
  147. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
  148. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
  149. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
  150. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
  151. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
  152. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
  153. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
  154. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
  155. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
  156. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
  157. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
  158. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
  159. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
  160. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
  161. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
  162. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
  163. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
  164. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
  165. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
  166. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
  167. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
  168. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
  169. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
  170. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
  171. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
  172. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
  173. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
  174. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
  175. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
  176. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
  177. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
  178. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
  179. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
  180. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
  181. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
  182. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
  183. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
  184. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
  185. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
  186. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
  187. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
  188. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
  189. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
  190. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
  191. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
  192. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
  193. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
  194. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
  195. package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
  196. package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
  197. package/dist/crewfoundry/utils/courseProgress.js +0 -46
  198. package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
@@ -1,309 +0,0 @@
1
- import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { SegmentedTabs as n } from "../components/viz/SegmentedTabs.js";
4
- import "../components/viz/index.js";
5
- import { progressPercent as r, readCourseProgress as i, writeCourseProgress as a } from "../utils/courseProgress.js";
6
- import { useMemo as o, useState as s } from "react";
7
- import { Check as c, ChevronLeft as l, ChevronRight as u, CircleDashed as d, FileText as f, Play as p } from "lucide-react";
8
- import { useNavigate as m, useSearchParams as h } from "react-router";
9
- import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
10
- import { Badge as y, Button as b, Card as x, CardContent as S, GlassCard as C, IllustratedEmptyState as w, Spinner as T, Textarea as E } from "@burdenoff/fe-libs/ui";
11
- import { useGlobalUi as D } from "@burdenoff/fe-libs/shared/providers/shell";
12
- //#region src/crewfoundry/pages/LearningCourseLearningPagePage.tsx
13
- var O = "crewfoundry:course-enrolled:v1", k = "crewfoundry:course-notes:v1";
14
- function A(e) {
15
- if (typeof window > "u") return !1;
16
- try {
17
- let t = window.localStorage.getItem(O), n = t ? JSON.parse(t) : [];
18
- return Array.isArray(n) && n.includes(e);
19
- } catch {
20
- return !1;
21
- }
22
- }
23
- function ee(e) {
24
- if (!(typeof window > "u")) try {
25
- let t = window.localStorage.getItem(O), n = t ? JSON.parse(t) : [], r = Array.isArray(n) ? n.filter((e) => typeof e == "string") : [];
26
- r.includes(e) || (r.push(e), window.localStorage.setItem(O, JSON.stringify(r)));
27
- } catch {}
28
- }
29
- function te(e) {
30
- if (typeof window > "u") return "";
31
- try {
32
- let t = window.localStorage.getItem(k), n = t ? JSON.parse(t) : {};
33
- if (n && typeof n == "object") {
34
- let t = n[e];
35
- return typeof t == "string" ? t : "";
36
- }
37
- return "";
38
- } catch {
39
- return "";
40
- }
41
- }
42
- function ne(e, t) {
43
- if (!(typeof window > "u")) try {
44
- let n = window.localStorage.getItem(k), r = n ? JSON.parse(n) : {}, i = r && typeof r == "object" ? r : {};
45
- i[e] = t, window.localStorage.setItem(k, JSON.stringify(i));
46
- } catch {}
47
- }
48
- function j() {
49
- let O = m(), [k] = h(), { courses: j, enrollCourse: M, initialized: N } = e(), { showToast: P } = D(), F = k.get("id"), I = F ? j.find((e) => e.id === F) : j[0], L = I ? Math.max(I.modules, 1) : 1, [R, z] = s(() => I ? i(I.id).completed : []), [B, V] = s(() => {
50
- if (!I) return 0;
51
- let e = new Set(i(I.id).completed);
52
- for (let t = 0; t < Math.max(I.modules, 1); t += 1) if (!e.has(t)) return t;
53
- return 0;
54
- }), [H, U] = s("overview"), [W, G] = s(() => I ? te(I.id) : ""), K = o(() => new Set(R), [R]), q = r({ completed: R }, L);
55
- if (!N && !I) return /* @__PURE__ */ _("div", {
56
- className: "flex min-h-[60vh] items-center justify-center p-6",
57
- children: /* @__PURE__ */ _(T, { size: "lg" })
58
- });
59
- if (!I) return /* @__PURE__ */ _("div", {
60
- className: "p-6",
61
- children: /* @__PURE__ */ _(w, {
62
- illustration: "empty-search",
63
- title: "Course not found",
64
- description: "This course is no longer available.",
65
- action: /* @__PURE__ */ _(b, {
66
- variant: "outline",
67
- onClick: () => O("../learning/courses-page"),
68
- children: "Browse courses"
69
- })
70
- })
71
- });
72
- let J = (e) => {
73
- z(e), a(I.id, e, L);
74
- }, Y = async () => {
75
- if (!A(I.id)) {
76
- ee(I.id);
77
- try {
78
- await M(I.id);
79
- } catch {}
80
- }
81
- }, X = async () => {
82
- if (!K.has(B)) {
83
- let e = R.length === 0, t = [...R, B];
84
- J(t), e && await Y(), t.length >= L && P(`You completed ${I.title}`, "success");
85
- }
86
- B < L - 1 && (V(B + 1), U("overview"));
87
- }, Z = (e) => {
88
- V(e), U("overview");
89
- }, re = () => B > 0 && Z(B - 1), ie = () => B < L - 1 && Z(B + 1), Q = K.has(B), $ = `Module ${B + 1}`;
90
- return /* @__PURE__ */ v("div", {
91
- className: "space-y-5 p-6",
92
- children: [/* @__PURE__ */ v("div", {
93
- className: "flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-text-secondary",
94
- children: [
95
- /* @__PURE__ */ _("button", {
96
- type: "button",
97
- onClick: () => O("../learning/courses-page"),
98
- className: "hover:text-text-primary",
99
- children: "Learning"
100
- }),
101
- /* @__PURE__ */ _(u, { className: "h-3.5 w-3.5" }),
102
- /* @__PURE__ */ _("button", {
103
- type: "button",
104
- onClick: () => O(`../learning/course-details-page?id=${encodeURIComponent(I.id)}`),
105
- className: "hover:text-text-primary",
106
- children: "Courses"
107
- }),
108
- /* @__PURE__ */ _(u, { className: "h-3.5 w-3.5" }),
109
- /* @__PURE__ */ _("span", {
110
- className: "font-medium text-text-primary",
111
- children: I.title
112
- })
113
- ]
114
- }), /* @__PURE__ */ v("div", {
115
- className: "grid grid-cols-1 gap-5 lg:grid-cols-[minmax(0,20rem)_minmax(0,1fr)]",
116
- children: [/* @__PURE__ */ _(x, {
117
- className: "lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:overflow-y-auto",
118
- children: /* @__PURE__ */ v(S, {
119
- className: "p-4",
120
- children: [
121
- /* @__PURE__ */ v("div", {
122
- className: "mb-3 flex items-baseline justify-between gap-2",
123
- children: [/* @__PURE__ */ _("h2", {
124
- className: "text-sm font-semibold",
125
- children: "Course content"
126
- }), /* @__PURE__ */ v("span", {
127
- className: "text-xs font-medium text-text-secondary tabular-nums",
128
- children: [q, "% complete"]
129
- })]
130
- }),
131
- /* @__PURE__ */ _("div", {
132
- className: "mb-4 h-2 overflow-hidden rounded-full bg-bg-sunken",
133
- children: /* @__PURE__ */ _("div", {
134
- className: "h-full rounded-full bg-action-primary-bg transition-[width] duration-500",
135
- style: { width: `${q}%` }
136
- })
137
- }),
138
- /* @__PURE__ */ _("ol", {
139
- className: "space-y-1",
140
- children: Array.from({ length: L }, (e, t) => {
141
- let n = K.has(t), r = t === B;
142
- return /* @__PURE__ */ _("li", { children: /* @__PURE__ */ v("button", {
143
- type: "button",
144
- onClick: () => Z(t),
145
- "aria-current": r ? "step" : void 0,
146
- className: `flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left text-sm transition-colors ${r ? "bg-action-primary-bg/10 font-medium text-text-primary" : "text-text-secondary hover:bg-bg-sunken hover:text-text-primary"}`,
147
- children: [/* @__PURE__ */ _("span", {
148
- className: `flex h-5 w-5 shrink-0 items-center justify-center rounded-full border ${n ? "border-transparent bg-status-success-bg text-status-success-text" : r ? "border-action-primary-bg text-action-primary-bg" : "border-border-default text-transparent"}`,
149
- children: _(n ? c : d, { className: "h-3 w-3" })
150
- }), /* @__PURE__ */ _("span", {
151
- className: "truncate",
152
- children: `Module ${t + 1}`
153
- })]
154
- }) }, t);
155
- })
156
- })
157
- ]
158
- })
159
- }), /* @__PURE__ */ v("div", {
160
- className: "space-y-5",
161
- children: [/* @__PURE__ */ v(C, {
162
- treatment: "plain",
163
- className: "overflow-hidden",
164
- children: [/* @__PURE__ */ v("button", {
165
- type: "button",
166
- onClick: () => void X(),
167
- "aria-label": Q ? "Next module" : "Mark this module complete",
168
- className: "group relative flex aspect-video w-full items-center justify-center outline-none focus-visible:shadow-[var(--shadow-focus)]",
169
- style: { background: "linear-gradient(135deg, color-mix(in srgb, var(--color-accent-primary) 24%, var(--color-bg-sunken)), var(--color-bg-sunken))" },
170
- children: [/* @__PURE__ */ _("span", {
171
- className: "absolute left-4 top-4",
172
- children: /* @__PURE__ */ _(y, {
173
- variant: "secondary",
174
- className: "text-[10px]",
175
- children: $
176
- })
177
- }), /* @__PURE__ */ _("span", {
178
- className: "flex h-16 w-16 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-elevation-2 transition-transform group-hover:scale-105",
179
- children: Q ? /* @__PURE__ */ _(c, { className: "h-7 w-7" }) : /* @__PURE__ */ _(p, { className: "ml-1 h-7 w-7" })
180
- })]
181
- }), /* @__PURE__ */ v(S, {
182
- className: "space-y-4 p-5",
183
- children: [
184
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ v("div", {
185
- className: "flex flex-wrap items-center gap-2",
186
- children: [
187
- /* @__PURE__ */ _("h1", {
188
- className: "text-xl font-semibold",
189
- children: $
190
- }),
191
- /* @__PURE__ */ _(y, {
192
- variant: I.level === "beginner" ? "secondary" : I.level === "intermediate" ? "default" : "destructive",
193
- className: "text-[10px]",
194
- children: t(I.level)
195
- }),
196
- Q && /* @__PURE__ */ v("span", {
197
- className: "inline-flex items-center gap-1 text-xs font-medium text-status-success-text",
198
- children: [/* @__PURE__ */ _(c, { className: "h-3.5 w-3.5" }), " Completed"]
199
- })
200
- ]
201
- }), /* @__PURE__ */ v("p", {
202
- className: "mt-1 text-sm text-text-secondary",
203
- children: [
204
- I.title,
205
- " · by ",
206
- I.instructor
207
- ]
208
- })] }),
209
- /* @__PURE__ */ _(n, {
210
- variant: "underline",
211
- "aria-label": "Lesson detail",
212
- value: H,
213
- onChange: (e) => U(e),
214
- tabs: [
215
- {
216
- id: "overview",
217
- label: "Overview"
218
- },
219
- {
220
- id: "resources",
221
- label: "Resources"
222
- },
223
- {
224
- id: "notes",
225
- label: "Notes"
226
- }
227
- ]
228
- }),
229
- H === "overview" && /* @__PURE__ */ v("div", {
230
- className: "space-y-3",
231
- children: [/* @__PURE__ */ _("p", {
232
- className: "text-sm text-text-secondary",
233
- children: I.description
234
- }), I.skills.length > 0 && /* @__PURE__ */ _("div", {
235
- className: "flex flex-wrap gap-1",
236
- children: I.skills.map((e) => /* @__PURE__ */ _(y, {
237
- variant: "outline",
238
- className: "text-[10px]",
239
- children: e
240
- }, e))
241
- })]
242
- }),
243
- H === "resources" && /* @__PURE__ */ v("div", {
244
- className: "rounded-lg border border-dashed border-border-default p-6 text-center",
245
- children: [
246
- /* @__PURE__ */ _(f, { className: "mx-auto mb-2 h-6 w-6 text-text-muted" }),
247
- /* @__PURE__ */ _("p", {
248
- className: "text-sm font-medium",
249
- children: "No downloadable resources yet"
250
- }),
251
- /* @__PURE__ */ _("p", {
252
- className: "text-xs text-text-secondary",
253
- children: "Slides and attachments for this module will appear here when the instructor adds them."
254
- })
255
- ]
256
- }),
257
- H === "notes" && /* @__PURE__ */ v("div", {
258
- className: "space-y-2",
259
- children: [/* @__PURE__ */ _(E, {
260
- value: W,
261
- onChange: (e) => {
262
- G(e.target.value), ne(I.id, e.target.value);
263
- },
264
- placeholder: "Jot down your notes for this course. They are saved to this device automatically.",
265
- rows: 5
266
- }), /* @__PURE__ */ _("p", {
267
- className: "text-xs text-text-muted",
268
- children: "Notes are saved automatically on this device."
269
- })]
270
- })
271
- ]
272
- })]
273
- }), /* @__PURE__ */ _(x, { children: /* @__PURE__ */ v(S, {
274
- className: "space-y-4 p-4",
275
- children: [/* @__PURE__ */ _("div", {
276
- className: "h-2 overflow-hidden rounded-full bg-bg-sunken",
277
- children: /* @__PURE__ */ _("div", {
278
- className: "h-full rounded-full bg-status-success-bg transition-[width] duration-500",
279
- style: { width: `${q}%` }
280
- })
281
- }), /* @__PURE__ */ v("div", {
282
- className: "flex items-center justify-between gap-2",
283
- children: [/* @__PURE__ */ v(b, {
284
- variant: "outline",
285
- onClick: re,
286
- disabled: B === 0,
287
- children: [/* @__PURE__ */ _(l, { className: "mr-1 h-4 w-4" }), "Previous"]
288
- }), /* @__PURE__ */ v("div", {
289
- className: "flex items-center gap-2",
290
- children: [/* @__PURE__ */ _(b, {
291
- onClick: () => void X(),
292
- children: Q ? B < L - 1 ? "Next module" : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(c, { className: "mr-1 h-4 w-4" }), " Completed"] }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(c, { className: "mr-1 h-4 w-4" }), " Mark Complete"] })
293
- }), /* @__PURE__ */ v(b, {
294
- variant: "outline",
295
- onClick: ie,
296
- disabled: B >= L - 1,
297
- children: ["Next", /* @__PURE__ */ _(u, { className: "ml-1 h-4 w-4" })]
298
- })]
299
- })]
300
- })]
301
- }) })]
302
- })]
303
- })]
304
- });
305
- }
306
- //#endregion
307
- export { j as LearningCourseLearningPagePage };
308
-
309
- //# sourceMappingURL=LearningCourseLearningPagePage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningCourseLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseLearningPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GlassCard,\n IllustratedEmptyState,\n Spinner,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Check, ChevronLeft, ChevronRight, CircleDashed, FileText, Play } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { SegmentedTabs } from '../components/viz';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { readCourseProgress, writeCourseProgress, progressPercent } from '../utils/courseProgress';\n\nconst ENROLLED_KEY = 'crewfoundry:course-enrolled:v1';\nconst NOTES_KEY = 'crewfoundry:course-notes:v1';\n\nfunction hasEnrolledLocally(courseId: string): boolean {\n if (typeof window === 'undefined') return false;\n try {\n const raw = window.localStorage.getItem(ENROLLED_KEY);\n const ids: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(ids) && ids.includes(courseId);\n } catch {\n return false;\n }\n}\n\nfunction markEnrolledLocally(courseId: string): void {\n if (typeof window === 'undefined') return;\n try {\n const raw = window.localStorage.getItem(ENROLLED_KEY);\n const ids: unknown = raw ? JSON.parse(raw) : [];\n const list = Array.isArray(ids) ? ids.filter((x): x is string => typeof x === 'string') : [];\n if (!list.includes(courseId)) {\n list.push(courseId);\n window.localStorage.setItem(ENROLLED_KEY, JSON.stringify(list));\n }\n } catch {\n /* best-effort */\n }\n}\n\nfunction readNotes(courseId: string): string {\n if (typeof window === 'undefined') return '';\n try {\n const raw = window.localStorage.getItem(NOTES_KEY);\n const map: unknown = raw ? JSON.parse(raw) : {};\n if (map && typeof map === 'object') {\n const value = (map as Record<string, unknown>)[courseId];\n return typeof value === 'string' ? value : '';\n }\n return '';\n } catch {\n return '';\n }\n}\n\nfunction writeNotes(courseId: string, notes: string): void {\n if (typeof window === 'undefined') return;\n try {\n const raw = window.localStorage.getItem(NOTES_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : {};\n const map: Record<string, string> =\n parsed && typeof parsed === 'object' ? (parsed as Record<string, string>) : {};\n map[courseId] = notes;\n window.localStorage.setItem(NOTES_KEY, JSON.stringify(map));\n } catch {\n /* best-effort */\n }\n}\n\ntype PlayerTab = 'overview' | 'resources' | 'notes';\n\nexport function LearningCourseLearningPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { courses, enrollCourse, initialized } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n\n const courseId = searchParams.get('id');\n const course = courseId ? courses.find((c) => c.id === courseId) : courses[0];\n\n const totalModules = course ? Math.max(course.modules, 1) : 1;\n\n const [completed, setCompleted] = useState<number[]>(() =>\n course ? readCourseProgress(course.id).completed : []\n );\n const [current, setCurrent] = useState<number>(() => {\n if (!course) return 0;\n const done = new Set(readCourseProgress(course.id).completed);\n for (let i = 0; i < Math.max(course.modules, 1); i += 1) {\n if (!done.has(i)) return i;\n }\n return 0;\n });\n const [tab, setTab] = useState<PlayerTab>('overview');\n const [notes, setNotes] = useState<string>(() => (course ? readNotes(course.id) : ''));\n\n const completedSet = useMemo(() => new Set(completed), [completed]);\n const pct = progressPercent({ completed }, totalModules);\n\n if (!initialized && !course) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\n if (!course) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Course not found\"\n description=\"This course is no longer available.\"\n action={\n <Button variant=\"outline\" onClick={() => navigate('../learning/courses-page')}>\n Browse courses\n </Button>\n }\n />\n </div>\n );\n }\n\n const persist = (next: number[]) => {\n setCompleted(next);\n writeCourseProgress(course.id, next, totalModules);\n };\n\n const ensureEnrolled = async () => {\n if (hasEnrolledLocally(course.id)) return;\n markEnrolledLocally(course.id);\n try {\n await enrollCourse(course.id);\n } catch {\n /* enrolment is a best-effort side effect of starting the course */\n }\n };\n\n const handleMarkComplete = async () => {\n if (!completedSet.has(current)) {\n const wasEmpty = completed.length === 0;\n const next = [...completed, current];\n persist(next);\n if (wasEmpty) {\n await ensureEnrolled();\n }\n if (next.length >= totalModules) {\n showToast(`You completed ${course.title}`, 'success');\n }\n }\n if (current < totalModules - 1) {\n setCurrent(current + 1);\n setTab('overview');\n }\n };\n\n const goTo = (index: number) => {\n setCurrent(index);\n setTab('overview');\n };\n\n const goPrev = () => current > 0 && goTo(current - 1);\n const goNext = () => current < totalModules - 1 && goTo(current + 1);\n\n const currentComplete = completedSet.has(current);\n const moduleTitle = `Module ${current + 1}`;\n\n return (\n <div className=\"space-y-5 p-6\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-text-secondary\">\n <button\n type=\"button\"\n onClick={() => navigate('../learning/courses-page')}\n className=\"hover:text-text-primary\"\n >\n Learning\n </button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <button\n type=\"button\"\n onClick={() =>\n navigate(`../learning/course-details-page?id=${encodeURIComponent(course.id)}`)\n }\n className=\"hover:text-text-primary\"\n >\n Courses\n </button>\n <ChevronRight className=\"h-3.5 w-3.5\" />\n <span className=\"font-medium text-text-primary\">{course.title}</span>\n </div>\n\n <div className=\"grid grid-cols-1 gap-5 lg:grid-cols-[minmax(0,20rem)_minmax(0,1fr)]\">\n {/* Course content sidebar */}\n <Card className=\"lg:sticky lg:top-4 lg:max-h-[calc(100vh-2rem)] lg:overflow-y-auto\">\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex items-baseline justify-between gap-2\">\n <h2 className=\"text-sm font-semibold\">Course content</h2>\n <span className=\"text-xs font-medium text-text-secondary tabular-nums\">\n {pct}% complete\n </span>\n </div>\n <div className=\"mb-4 h-2 overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-[width] duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <ol className=\"space-y-1\">\n {Array.from({ length: totalModules }, (_, i) => {\n const done = completedSet.has(i);\n const isCurrent = i === current;\n return (\n <li key={i}>\n <button\n type=\"button\"\n onClick={() => goTo(i)}\n aria-current={isCurrent ? 'step' : undefined}\n className={`flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left text-sm transition-colors ${\n isCurrent\n ? 'bg-action-primary-bg/10 font-medium text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n }`}\n >\n <span\n className={`flex h-5 w-5 shrink-0 items-center justify-center rounded-full border ${\n done\n ? 'border-transparent bg-status-success-bg text-status-success-text'\n : isCurrent\n ? 'border-action-primary-bg text-action-primary-bg'\n : 'border-border-default text-transparent'\n }`}\n >\n {done ? (\n <Check className=\"h-3 w-3\" />\n ) : (\n <CircleDashed className=\"h-3 w-3\" />\n )}\n </span>\n <span className=\"truncate\">{`Module ${i + 1}`}</span>\n </button>\n </li>\n );\n })}\n </ol>\n </CardContent>\n </Card>\n\n {/* Main pane */}\n <div className=\"space-y-5\">\n <GlassCard treatment=\"plain\" className=\"overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => void handleMarkComplete()}\n aria-label={currentComplete ? 'Next module' : 'Mark this module complete'}\n className=\"group relative flex aspect-video w-full items-center justify-center outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n style={{\n background:\n 'linear-gradient(135deg, color-mix(in srgb, var(--color-accent-primary) 24%, var(--color-bg-sunken)), var(--color-bg-sunken))',\n }}\n >\n <span className=\"absolute left-4 top-4\">\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {moduleTitle}\n </Badge>\n </span>\n <span className=\"flex h-16 w-16 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-elevation-2 transition-transform group-hover:scale-105\">\n {currentComplete ? (\n <Check className=\"h-7 w-7\" />\n ) : (\n <Play className=\"ml-1 h-7 w-7\" />\n )}\n </span>\n </button>\n <CardContent className=\"space-y-4 p-5\">\n <div>\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-xl font-semibold\">{moduleTitle}</h1>\n <Badge\n variant={\n course.level === 'beginner'\n ? 'secondary'\n : course.level === 'intermediate'\n ? 'default'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(course.level)}\n </Badge>\n {currentComplete && (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-status-success-text\">\n <Check className=\"h-3.5 w-3.5\" /> Completed\n </span>\n )}\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {course.title} · by {course.instructor}\n </p>\n </div>\n\n <SegmentedTabs\n variant=\"underline\"\n aria-label=\"Lesson detail\"\n value={tab}\n onChange={(id) => setTab(id as PlayerTab)}\n tabs={[\n { id: 'overview', label: 'Overview' },\n { id: 'resources', label: 'Resources' },\n { id: 'notes', label: 'Notes' },\n ]}\n />\n\n {tab === 'overview' && (\n <div className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">{course.description}</p>\n {course.skills.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[10px]\">\n {s}\n </Badge>\n ))}\n </div>\n )}\n </div>\n )}\n\n {tab === 'resources' && (\n <div className=\"rounded-lg border border-dashed border-border-default p-6 text-center\">\n <FileText className=\"mx-auto mb-2 h-6 w-6 text-text-muted\" />\n <p className=\"text-sm font-medium\">No downloadable resources yet</p>\n <p className=\"text-xs text-text-secondary\">\n Slides and attachments for this module will appear here when the instructor adds\n them.\n </p>\n </div>\n )}\n\n {tab === 'notes' && (\n <div className=\"space-y-2\">\n <Textarea\n value={notes}\n onChange={(e) => {\n setNotes(e.target.value);\n writeNotes(course.id, e.target.value);\n }}\n placeholder=\"Jot down your notes for this course. They are saved to this device automatically.\"\n rows={5}\n />\n <p className=\"text-xs text-text-muted\">\n Notes are saved automatically on this device.\n </p>\n </div>\n )}\n </CardContent>\n </GlassCard>\n\n {/* Footer controls */}\n <Card>\n <CardContent className=\"space-y-4 p-4\">\n <div className=\"h-2 overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-status-success-bg transition-[width] duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <Button variant=\"outline\" onClick={goPrev} disabled={current === 0}>\n <ChevronLeft className=\"mr-1 h-4 w-4\" />\n Previous\n </Button>\n <div className=\"flex items-center gap-2\">\n <Button onClick={() => void handleMarkComplete()}>\n {currentComplete ? (\n current < totalModules - 1 ? (\n 'Next module'\n ) : (\n <>\n <Check className=\"mr-1 h-4 w-4\" /> Completed\n </>\n )\n ) : (\n <>\n <Check className=\"mr-1 h-4 w-4\" /> Mark Complete\n </>\n )}\n </Button>\n <Button variant=\"outline\" onClick={goNext} disabled={current >= totalModules - 1}>\n Next\n <ChevronRight className=\"ml-1 h-4 w-4\" />\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function LearningLearningPagePage(): import("react").JSX.Element;
2
- //# sourceMappingURL=LearningLearningPagePage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/LearningLearningPagePage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,wBAAwB,gCAkKvC"}
@@ -1,200 +0,0 @@
1
- import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { BookOpen as n, GraduationCap as r, Star as i, TrendingUp as a, Users as o } from "lucide-react";
4
- import { useNavigate as s } from "react-router";
5
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
- import { Badge as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
7
- //#region src/crewfoundry/pages/LearningLearningPagePage.tsx
8
- function y() {
9
- let y = s(), { courses: b, learningPaths: x } = e(), S = b.reduce((e, t) => e + t.enrolled, 0), C = b.reduce((e, t) => e + t.completed, 0), w = [...b].sort((e, t) => t.rating - e.rating).slice(0, 3), T = (e) => y(`../learning/course-details-page?id=${encodeURIComponent(e)}`), E = (e) => y(`../learning/learning-path-detail-page?id=${encodeURIComponent(e)}`);
10
- return /* @__PURE__ */ l("div", {
11
- className: "space-y-6 p-6",
12
- children: [
13
- /* @__PURE__ */ l("div", { children: [
14
- /* @__PURE__ */ c("h1", {
15
- className: "text-2xl font-semibold",
16
- children: /* @__PURE__ */ c(_, { children: "Learning & Development" })
17
- }),
18
- /* @__PURE__ */ c("p", {
19
- className: "text-sm text-text-secondary",
20
- children: "Explore courses, learning paths, and grow your skills"
21
- }),
22
- /* @__PURE__ */ c(v, {
23
- className: "mt-1",
24
- children: "Your learning home — discover courses, continue where you left off, and keep developing the skills your role needs."
25
- })
26
- ] }),
27
- /* @__PURE__ */ l("div", {
28
- className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
29
- children: [
30
- /* @__PURE__ */ l(g, {
31
- treatment: "glass",
32
- glow: !0,
33
- className: "border-border-seam",
34
- children: [/* @__PURE__ */ l(m, {
35
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
36
- children: [/* @__PURE__ */ c(h, {
37
- className: "text-sm font-medium",
38
- children: "Courses"
39
- }), /* @__PURE__ */ c(n, { className: "h-4 w-4 text-text-secondary" })]
40
- }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c("div", {
41
- className: "text-2xl font-bold tabular-nums",
42
- children: b.length
43
- }), /* @__PURE__ */ c("p", {
44
- className: "text-xs text-text-secondary",
45
- children: "Active courses"
46
- })] })]
47
- }),
48
- /* @__PURE__ */ l(g, {
49
- treatment: "metric",
50
- className: "border-border-seam",
51
- children: [/* @__PURE__ */ l(m, {
52
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
53
- children: [/* @__PURE__ */ c(h, {
54
- className: "text-sm font-medium",
55
- children: "Enrolled"
56
- }), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-text-secondary" })]
57
- }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c("div", {
58
- className: "text-2xl font-bold tabular-nums",
59
- children: S
60
- }) })]
61
- }),
62
- /* @__PURE__ */ l(g, {
63
- treatment: "metric",
64
- className: "border-border-seam",
65
- children: [/* @__PURE__ */ l(m, {
66
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
67
- children: [/* @__PURE__ */ c(h, {
68
- className: "text-sm font-medium",
69
- children: "Completed"
70
- }), /* @__PURE__ */ c(r, { className: "h-4 w-4 text-status-success-text" })]
71
- }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c("div", {
72
- className: "text-2xl font-bold tabular-nums",
73
- children: C
74
- }) })]
75
- }),
76
- /* @__PURE__ */ l(g, {
77
- treatment: "metric",
78
- className: "border-border-seam",
79
- children: [/* @__PURE__ */ l(m, {
80
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
81
- children: [/* @__PURE__ */ c(h, {
82
- className: "text-sm font-medium",
83
- children: "Paths"
84
- }), /* @__PURE__ */ c(a, { className: "h-4 w-4 text-text-secondary" })]
85
- }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c("div", {
86
- className: "text-2xl font-bold tabular-nums",
87
- children: x.length
88
- }) })]
89
- })
90
- ]
91
- }),
92
- /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h2", {
93
- className: "text-lg font-medium mb-3",
94
- children: "Featured Courses"
95
- }), /* @__PURE__ */ c("div", {
96
- className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
97
- children: w.map((e) => /* @__PURE__ */ l(d, {
98
- role: "button",
99
- tabIndex: 0,
100
- "aria-label": `View ${e.title}`,
101
- onClick: () => T(e.id),
102
- onKeyDown: (t) => {
103
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), T(e.id));
104
- },
105
- className: "cursor-pointer transition-shadow hover:shadow-md focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
106
- children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, {
107
- className: "text-base",
108
- children: e.title
109
- }), /* @__PURE__ */ l(p, { children: [
110
- e.instructor,
111
- " · ",
112
- e.duration
113
- ] })] }), /* @__PURE__ */ l(f, { children: [
114
- /* @__PURE__ */ c("p", {
115
- className: "text-sm text-text-secondary mb-3",
116
- children: e.description
117
- }),
118
- /* @__PURE__ */ l("div", {
119
- className: "flex items-center justify-between",
120
- children: [/* @__PURE__ */ l("div", {
121
- className: "flex items-center gap-1",
122
- children: [/* @__PURE__ */ c(i, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ c("span", {
123
- className: "text-sm",
124
- children: e.rating
125
- })]
126
- }), /* @__PURE__ */ l("div", {
127
- className: "flex gap-1",
128
- children: [/* @__PURE__ */ c(u, {
129
- variant: "outline",
130
- className: "text-[10px]",
131
- children: t(e.level)
132
- }), /* @__PURE__ */ c(u, {
133
- variant: "outline",
134
- className: "text-[10px]",
135
- children: e.category
136
- })]
137
- })]
138
- }),
139
- /* @__PURE__ */ l("div", {
140
- className: "mt-2 text-xs text-text-secondary",
141
- children: [
142
- e.enrolled,
143
- " enrolled · ",
144
- e.completed,
145
- " completed"
146
- ]
147
- })
148
- ] })]
149
- }, e.id))
150
- })] }),
151
- /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h2", {
152
- className: "text-lg font-medium mb-3",
153
- children: "Learning Paths"
154
- }), /* @__PURE__ */ c("div", {
155
- className: "grid gap-4 md:grid-cols-3",
156
- children: x.map((e) => /* @__PURE__ */ l(d, {
157
- role: "button",
158
- tabIndex: 0,
159
- "aria-label": `View ${e.title}`,
160
- onClick: () => E(e.id),
161
- onKeyDown: (t) => {
162
- (t.key === "Enter" || t.key === " ") && (t.preventDefault(), E(e.id));
163
- },
164
- className: "cursor-pointer transition-shadow hover:shadow-md focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
165
- children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, {
166
- className: "text-base",
167
- children: e.title
168
- }), /* @__PURE__ */ c(p, { children: e.description })] }), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
169
- className: "flex items-center justify-between text-sm text-text-secondary",
170
- children: [/* @__PURE__ */ l("span", { children: [
171
- e.courses.length,
172
- " courses · ",
173
- e.duration
174
- ] }), /* @__PURE__ */ c(u, {
175
- variant: "outline",
176
- className: "text-[10px]",
177
- children: t(e.level)
178
- })]
179
- }), /* @__PURE__ */ l("div", {
180
- className: "mt-2 space-y-1",
181
- children: [/* @__PURE__ */ l("div", {
182
- className: "flex justify-between text-xs",
183
- children: [/* @__PURE__ */ l("span", { children: [e.enrolled, " enrolled"] }), /* @__PURE__ */ l("span", { children: [e.completionRate, "%"] })]
184
- }), /* @__PURE__ */ c("div", {
185
- className: "h-2 bg-bg-sunken rounded overflow-hidden",
186
- children: /* @__PURE__ */ c("div", {
187
- className: "h-2 bg-action-primary-bg rounded",
188
- style: { width: `${e.completionRate}%` }
189
- })
190
- })]
191
- })] })]
192
- }, e.id))
193
- })] })
194
- ]
195
- });
196
- }
197
- //#endregion
198
- export { y as LearningLearningPagePage };
199
-
200
- //# sourceMappingURL=LearningLearningPagePage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, GraduationCap, Star, TrendingUp, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function LearningLearningPagePage() {\n const navigate = useNavigate();\n const { courses, learningPaths } = useCrewFoundryStore();\n const totalEnrolled = courses.reduce((s, c) => s + c.enrolled, 0);\n const totalCompleted = courses.reduce((s, c) => s + c.completed, 0);\n const featuredCourses = [...courses].sort((a, b) => b.rating - a.rating).slice(0, 3);\n const openCourse = (id: string) =>\n navigate(`../learning/course-details-page?id=${encodeURIComponent(id)}`);\n const openPath = (id: string) =>\n navigate(`../learning/learning-path-detail-page?id=${encodeURIComponent(id)}`);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Learning & Development</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Explore courses, learning paths, and grow your skills\n </p>\n <PagePurpose className=\"mt-1\">\n Your learning home — discover courses, continue where you left off, and keep developing\n the skills your role needs.\n </PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Courses</CardTitle>\n <BookOpen className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{courses.length}</div>\n <p className=\"text-xs text-text-secondary\">Active courses</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Enrolled</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalEnrolled}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <GraduationCap className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalCompleted}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Paths</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{learningPaths.length}</div>\n </CardContent>\n </GlassCard>\n </div>\n <div>\n <h2 className=\"text-lg font-medium mb-3\">Featured Courses</h2>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {featuredCourses.map((course) => (\n <Card\n key={course.id}\n role=\"button\"\n tabIndex={0}\n aria-label={`View ${course.title}`}\n onClick={() => openCourse(course.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openCourse(course.id);\n }\n }}\n className=\"cursor-pointer transition-shadow hover:shadow-md focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{course.title}</CardTitle>\n <CardDescription>\n {course.instructor} · {course.duration}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{course.description}</p>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span className=\"text-sm\">{course.rating}</span>\n </div>\n <div className=\"flex gap-1\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {formatEnumLabel(course.level)}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {course.category}\n </Badge>\n </div>\n </div>\n <div className=\"mt-2 text-xs text-text-secondary\">\n {course.enrolled} enrolled · {course.completed} completed\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n <div>\n <h2 className=\"text-lg font-medium mb-3\">Learning Paths</h2>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {learningPaths.map((path) => (\n <Card\n key={path.id}\n role=\"button\"\n tabIndex={0}\n aria-label={`View ${path.title}`}\n onClick={() => openPath(path.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openPath(path.id);\n }\n }}\n className=\"cursor-pointer transition-shadow hover:shadow-md focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <CardTitle className=\"text-base\">{path.title}</CardTitle>\n <CardDescription>{path.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>\n {path.courses.length} courses · {path.duration}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {formatEnumLabel(path.level)}\n </Badge>\n </div>\n <div className=\"mt-2 space-y-1\">\n <div className=\"flex justify-between text-xs\">\n <span>{path.enrolled} enrolled</span>\n <span>{path.completionRate}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${path.completionRate}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function LearningLearningPathDetailPagePage(): import("react").JSX.Element;
2
- //# sourceMappingURL=LearningLearningPathDetailPagePage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPathDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,kCAAkC,gCAkLjD"}