@burdenoff/microfe-crewfoundry 2026.1013.2 → 2026.1029.2

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 +338 -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,190 +0,0 @@
1
- import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { ProgressRing as n } from "../components/viz/ProgressRing.js";
4
- import { PathSteps as r } from "../components/viz/PathSteps.js";
5
- import { RatingStars as i } from "../components/viz/RatingStars.js";
6
- import "../components/viz/index.js";
7
- import { useState as a } from "react";
8
- import { BookOpen as o, Check as s, ChevronRight as c, Clock as l, Users as u } from "lucide-react";
9
- import { useNavigate as d, useSearchParams as f } from "react-router";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
- import { Badge as h, Button as g, Card as _, CardContent as v, EmphasisPanel as y, GradientText as b, IllustratedEmptyState as x, PagePurpose as S, Spinner as C } from "@burdenoff/fe-libs/ui";
12
- import { useGlobalUi as w } from "@burdenoff/fe-libs/shared/providers/shell";
13
- //#region src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx
14
- function T() {
15
- let [T] = f(), E = d(), { learningPaths: D, courses: O, enrollCourse: k, initialized: A } = e(), { showToast: j } = w(), [M, N] = a(!1), P = T.get("id"), F = P ? D.find((e) => e.id === P) : D[0];
16
- if (!A && !F) return /* @__PURE__ */ p("div", {
17
- className: "flex min-h-[60vh] items-center justify-center p-6",
18
- children: /* @__PURE__ */ p(C, { size: "lg" })
19
- });
20
- if (!F) return /* @__PURE__ */ p("div", {
21
- className: "p-6",
22
- children: /* @__PURE__ */ p(x, {
23
- illustration: "empty-search",
24
- title: "No learning path found",
25
- description: "This learning path is no longer available."
26
- })
27
- });
28
- let I = O.filter((e) => F.courses.includes(e.id)), L = Math.round(F.completionRate / 100 * I.length), R = I.map((e, t) => ({
29
- label: e.title,
30
- state: t < L ? "done" : t === L ? "active" : "todo"
31
- })), z = (e) => E(`../learning/course-learning-page?id=${encodeURIComponent(e)}`);
32
- return /* @__PURE__ */ m("div", {
33
- className: "max-w-5xl space-y-6 p-6",
34
- children: [
35
- /* @__PURE__ */ m("div", {
36
- className: "flex flex-wrap items-start justify-between gap-3",
37
- children: [/* @__PURE__ */ m("div", { children: [
38
- /* @__PURE__ */ p("h1", {
39
- className: "text-2xl font-semibold",
40
- children: /* @__PURE__ */ p(b, { children: F.title })
41
- }),
42
- /* @__PURE__ */ p("p", {
43
- className: "text-sm text-text-secondary",
44
- children: F.description
45
- }),
46
- /* @__PURE__ */ p(S, {
47
- className: "mt-1",
48
- children: "Follow a single learning path end-to-end — see its courses, your progress, and what to complete next to finish the journey."
49
- })
50
- ] }), /* @__PURE__ */ p(g, {
51
- onClick: async () => {
52
- if (I.length === 0) {
53
- j("No courses in this path yet", "warning");
54
- return;
55
- }
56
- N(!0);
57
- try {
58
- for (let e of I) await k(e.id);
59
- j(`Enrolled in ${I.length} course${I.length > 1 ? "s" : ""}`, "success");
60
- } catch (e) {
61
- j(e instanceof Error ? e.message : "Unable to enroll in path", "error");
62
- } finally {
63
- N(!1);
64
- }
65
- },
66
- disabled: M,
67
- children: M ? "Enrolling…" : "Enroll Now"
68
- })]
69
- }),
70
- /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
71
- className: "grid gap-6 p-5 md:grid-cols-[auto_minmax(0,1fr)] md:items-center",
72
- children: [/* @__PURE__ */ p("div", {
73
- className: "flex items-center justify-center",
74
- children: /* @__PURE__ */ p(n, {
75
- value: F.completionRate,
76
- caption: "complete",
77
- label: `${F.completionRate}%`
78
- })
79
- }), /* @__PURE__ */ m("div", {
80
- className: "space-y-4",
81
- children: [/* @__PURE__ */ m("div", {
82
- className: "flex flex-wrap gap-2",
83
- children: [
84
- /* @__PURE__ */ p(h, {
85
- variant: "secondary",
86
- className: "text-[10px]",
87
- children: t(F.level)
88
- }),
89
- /* @__PURE__ */ m(h, {
90
- variant: "outline",
91
- className: "inline-flex items-center gap-1 text-[10px]",
92
- children: [/* @__PURE__ */ p(l, { className: "h-3 w-3" }), F.duration]
93
- }),
94
- /* @__PURE__ */ m(h, {
95
- variant: "outline",
96
- className: "inline-flex items-center gap-1 text-[10px]",
97
- children: [
98
- /* @__PURE__ */ p(o, { className: "h-3 w-3" }),
99
- I.length,
100
- " courses"
101
- ]
102
- }),
103
- /* @__PURE__ */ m(h, {
104
- variant: "outline",
105
- className: "inline-flex items-center gap-1 text-[10px]",
106
- children: [
107
- /* @__PURE__ */ p(u, { className: "h-3 w-3" }),
108
- F.enrolled,
109
- " enrolled"
110
- ]
111
- })
112
- ]
113
- }), R.length > 0 ? /* @__PURE__ */ p(r, { steps: R }) : /* @__PURE__ */ p("p", {
114
- className: "text-sm text-text-secondary",
115
- children: "No courses have been added to this path yet."
116
- })]
117
- })]
118
- }) }),
119
- /* @__PURE__ */ m(y, { children: [
120
- /* @__PURE__ */ p("div", {
121
- className: "text-lg font-semibold",
122
- children: "Courses in this Path"
123
- }),
124
- /* @__PURE__ */ m("p", {
125
- className: "mb-4 text-sm text-text-secondary",
126
- children: [
127
- I.length,
128
- " courses · ",
129
- t(F.level)
130
- ]
131
- }),
132
- /* @__PURE__ */ p("div", {
133
- className: "space-y-3",
134
- children: I.length === 0 ? /* @__PURE__ */ p(x, {
135
- illustration: "empty-generic",
136
- title: "No courses in this path yet",
137
- description: "Courses added to this path will appear here in order."
138
- }) : I.map((e, n) => {
139
- let r = n < L;
140
- return /* @__PURE__ */ m("button", {
141
- type: "button",
142
- onClick: () => z(e.id),
143
- className: "flex w-full items-center gap-3 rounded-lg border border-border-subtle p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
144
- children: [
145
- /* @__PURE__ */ p("span", {
146
- className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-full border text-sm font-semibold ${r ? "border-transparent bg-status-success-bg text-status-success-text" : n === L ? "border-action-primary-bg text-action-primary-bg" : "border-border-default text-text-secondary"}`,
147
- children: r ? /* @__PURE__ */ p(s, { className: "h-4 w-4" }) : n + 1
148
- }),
149
- /* @__PURE__ */ m("div", {
150
- className: "min-w-0 flex-1",
151
- children: [/* @__PURE__ */ p("p", {
152
- className: "truncate text-sm font-medium",
153
- children: e.title
154
- }), /* @__PURE__ */ m("p", {
155
- className: "truncate text-xs text-text-secondary",
156
- children: [
157
- e.instructor,
158
- " · ",
159
- e.duration,
160
- " · ",
161
- e.modules,
162
- " modules"
163
- ]
164
- })]
165
- }),
166
- /* @__PURE__ */ m("div", {
167
- className: "hidden items-center gap-3 sm:flex",
168
- children: [/* @__PURE__ */ p(i, {
169
- value: e.rating,
170
- size: 13,
171
- showValue: !0
172
- }), /* @__PURE__ */ p(h, {
173
- variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
174
- className: "text-[10px]",
175
- children: t(e.level)
176
- })]
177
- }),
178
- /* @__PURE__ */ p(c, { className: "h-4 w-4 shrink-0 text-text-muted" })
179
- ]
180
- }, e.id);
181
- })
182
- })
183
- ] })
184
- ]
185
- });
186
- }
187
- //#endregion
188
- export { T as LearningLearningPathDetailPagePage };
189
-
190
- //# sourceMappingURL=LearningLearningPathDetailPagePage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPathDetailPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Check, ChevronRight, Clock, Users } from 'lucide-react';\nimport { useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { PathSteps, ProgressRing, RatingStars, type PathStep } from '../components/viz';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function LearningLearningPathDetailPagePage() {\n const [searchParams] = useSearchParams();\n const navigate = useNavigate();\n const { learningPaths, courses, enrollCourse, initialized } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [enrolling, setEnrolling] = useState(false);\n const pathId = searchParams.get('id');\n const path = pathId ? learningPaths.find((p) => p.id === pathId) : learningPaths[0];\n if (!initialized && !path) {\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 (!path)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No learning path found\"\n description=\"This learning path is no longer available.\"\n />\n </div>\n );\n const pathCourses = courses.filter((c) => path.courses.includes(c.id));\n const completedCount = Math.round((path.completionRate / 100) * pathCourses.length);\n const steps: PathStep[] = pathCourses.map((c, i) => ({\n label: c.title,\n state: i < completedCount ? 'done' : i === completedCount ? 'active' : 'todo',\n }));\n\n const openPlayer = (id: string) =>\n navigate(`../learning/course-learning-page?id=${encodeURIComponent(id)}`);\n\n const handleEnroll = async () => {\n if (pathCourses.length === 0) {\n showToast('No courses in this path yet', 'warning');\n return;\n }\n setEnrolling(true);\n try {\n for (const course of pathCourses) {\n await enrollCourse(course.id);\n }\n showToast(\n `Enrolled in ${pathCourses.length} course${pathCourses.length > 1 ? 's' : ''}`,\n 'success'\n );\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to enroll in path', 'error');\n } finally {\n setEnrolling(false);\n }\n };\n\n return (\n <div className=\"max-w-5xl space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{path.title}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{path.description}</p>\n <PagePurpose className=\"mt-1\">\n Follow a single learning path end-to-end — see its courses, your progress, and what to\n complete next to finish the journey.\n </PagePurpose>\n </div>\n <Button onClick={handleEnroll} disabled={enrolling}>\n {enrolling ? 'Enrolling…' : 'Enroll Now'}\n </Button>\n </div>\n\n {/* Overview: progress ring + timeline */}\n <Card>\n <CardContent className=\"grid gap-6 p-5 md:grid-cols-[auto_minmax(0,1fr)] md:items-center\">\n <div className=\"flex items-center justify-center\">\n <ProgressRing\n value={path.completionRate}\n caption=\"complete\"\n label={`${path.completionRate}%`}\n />\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {formatEnumLabel(path.level)}\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <Clock className=\"h-3 w-3\" />\n {path.duration}\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <BookOpen className=\"h-3 w-3\" />\n {pathCourses.length} courses\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <Users className=\"h-3 w-3\" />\n {path.enrolled} enrolled\n </Badge>\n </div>\n {steps.length > 0 ? (\n <PathSteps steps={steps} />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n No courses have been added to this path yet.\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n\n <EmphasisPanel>\n <div className=\"text-lg font-semibold\">Courses in this Path</div>\n <p className=\"mb-4 text-sm text-text-secondary\">\n {pathCourses.length} courses · {formatEnumLabel(path.level)}\n </p>\n <div className=\"space-y-3\">\n {pathCourses.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No courses in this path yet\"\n description=\"Courses added to this path will appear here in order.\"\n />\n ) : (\n pathCourses.map((course, idx) => {\n const done = idx < completedCount;\n const isCurrent = idx === completedCount;\n return (\n <button\n key={course.id}\n type=\"button\"\n onClick={() => openPlayer(course.id)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <span\n className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full border text-sm font-semibold ${\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-text-secondary'\n }`}\n >\n {done ? <Check className=\"h-4 w-4\" /> : idx + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{course.title}</p>\n <p className=\"truncate text-xs text-text-secondary\">\n {course.instructor} · {course.duration} · {course.modules} modules\n </p>\n </div>\n <div className=\"hidden items-center gap-3 sm:flex\">\n <RatingStars value={course.rating} size={13} showValue />\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 </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-text-muted\" />\n </button>\n );\n })\n )}\n </div>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function LearningLearningPathsPagePage(): import("react").JSX.Element;
2
- //# sourceMappingURL=LearningLearningPathsPagePage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPathsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/LearningLearningPathsPagePage.tsx"],"names":[],"mappings":"AA+CA,wBAAgB,6BAA6B,gCA2L5C"}
@@ -1,230 +0,0 @@
1
- import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { PathSteps as n } from "../components/viz/PathSteps.js";
4
- import { AvatarStack as r } from "../components/viz/AvatarStack.js";
5
- import "../components/viz/index.js";
6
- import { FormModal as i, useFormModal as a } from "../components/forms/FormModal.js";
7
- import { useMemo as o } from "react";
8
- import { BookOpen as s, Clock as c, Layers as l, Plus as u } from "lucide-react";
9
- import { useNavigate as d } from "react-router";
10
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
- import { Badge as m, Button as h, Card as g, CardContent as _, GradientText as v, IllustratedEmptyState as y, PagePurpose as b, Pagination as x } from "@burdenoff/fe-libs/ui";
12
- import { usePagination as S } from "@burdenoff/fe-libs/shared/hooks";
13
- //#region src/crewfoundry/pages/LearningLearningPathsPagePage.tsx
14
- var C = [
15
- {
16
- name: "title",
17
- label: "Path Title",
18
- type: "text",
19
- required: !0,
20
- colSpan: 2
21
- },
22
- {
23
- name: "description",
24
- label: "Description",
25
- type: "textarea",
26
- required: !0,
27
- colSpan: 2
28
- },
29
- {
30
- name: "duration",
31
- label: "Duration",
32
- type: "text",
33
- required: !0,
34
- placeholder: "e.g. 3 months"
35
- },
36
- {
37
- name: "level",
38
- label: "Level",
39
- type: "select",
40
- required: !0,
41
- options: [
42
- {
43
- label: "Beginner",
44
- value: "beginner"
45
- },
46
- {
47
- label: "Intermediate",
48
- value: "intermediate"
49
- },
50
- {
51
- label: "Advanced",
52
- value: "advanced"
53
- }
54
- ]
55
- }
56
- ];
57
- function w() {
58
- let { learningPaths: w, courses: T, employees: E, addLearningPath: D } = e(), O = d(), k = a(), { page: A, pageSize: j, offset: M, setPage: N } = S({ initialPageSize: 6 }), P = w.slice(M, M + j), F = o(() => {
59
- let e = /* @__PURE__ */ new Map();
60
- for (let t of T) e.set(t.id, t.title);
61
- return e;
62
- }, [T]), I = o(() => E.slice(0, 5).map((e) => ({
63
- name: `${e.firstName} ${e.lastName}`.trim(),
64
- avatarUrl: e.avatar
65
- })), [E]), L = (e) => O(`../learning/learning-path-detail-page?id=${encodeURIComponent(e)}`);
66
- return /* @__PURE__ */ p("div", {
67
- className: "space-y-6 p-6",
68
- children: [
69
- /* @__PURE__ */ p("div", {
70
- className: "flex flex-wrap items-start justify-between gap-3",
71
- children: [/* @__PURE__ */ p("div", { children: [
72
- /* @__PURE__ */ f("h1", {
73
- className: "text-2xl font-semibold",
74
- children: /* @__PURE__ */ f(v, { children: "Learning Paths" })
75
- }),
76
- /* @__PURE__ */ f("p", {
77
- className: "text-sm text-text-secondary",
78
- children: "Structured skill journeys for career growth"
79
- }),
80
- /* @__PURE__ */ f(b, {
81
- className: "mt-1",
82
- children: "Structured learning journeys that string courses together — follow a path to build toward a role or skill set step by step."
83
- })
84
- ] }), /* @__PURE__ */ p(h, {
85
- onClick: () => k.openModal(),
86
- children: [/* @__PURE__ */ f(u, { className: "mr-1 h-4 w-4" }), "New Path"]
87
- })]
88
- }),
89
- w.length === 0 ? /* @__PURE__ */ f(y, {
90
- illustration: "empty-generic",
91
- title: "No learning paths yet",
92
- description: "Learning paths will appear here once they are created.",
93
- action: /* @__PURE__ */ p(h, {
94
- onClick: () => k.openModal(),
95
- children: [/* @__PURE__ */ f(u, { className: "mr-1 h-4 w-4" }), "Create your first path"]
96
- })
97
- }) : /* @__PURE__ */ f("div", {
98
- className: "space-y-4",
99
- children: P.map((e) => {
100
- let i = e.courses, a = i.length, o = Math.round(e.completionRate / 100 * a), u = i.map((e, t) => ({
101
- label: F.get(e) ?? "Course",
102
- state: t < o ? "done" : t === o ? "active" : "todo"
103
- }));
104
- return /* @__PURE__ */ f(g, {
105
- className: "overflow-hidden",
106
- children: /* @__PURE__ */ f(_, {
107
- className: "p-5",
108
- children: /* @__PURE__ */ p("div", {
109
- className: "grid gap-5 lg:grid-cols-[minmax(0,18rem)_minmax(0,1fr)]",
110
- children: [/* @__PURE__ */ p("div", {
111
- className: "space-y-3",
112
- children: [
113
- /* @__PURE__ */ f("button", {
114
- type: "button",
115
- onClick: () => L(e.id),
116
- className: "text-left text-lg font-semibold outline-none hover:text-action-primary-bg focus-visible:text-action-primary-bg",
117
- children: e.title
118
- }),
119
- /* @__PURE__ */ f("p", {
120
- className: "line-clamp-2 text-sm text-text-secondary",
121
- children: e.description
122
- }),
123
- /* @__PURE__ */ p("div", {
124
- className: "flex flex-wrap gap-2",
125
- children: [
126
- /* @__PURE__ */ f(m, {
127
- variant: "secondary",
128
- className: "text-[10px]",
129
- children: t(e.level)
130
- }),
131
- /* @__PURE__ */ p(m, {
132
- variant: "outline",
133
- className: "inline-flex items-center gap-1 text-[10px]",
134
- children: [/* @__PURE__ */ f(c, { className: "h-3 w-3" }), e.duration]
135
- }),
136
- /* @__PURE__ */ p(m, {
137
- variant: "outline",
138
- className: "inline-flex items-center gap-1 text-[10px]",
139
- children: [
140
- /* @__PURE__ */ f(s, { className: "h-3 w-3" }),
141
- a,
142
- " courses"
143
- ]
144
- })
145
- ]
146
- }),
147
- I.length > 0 && e.enrolled > 0 && /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
148
- className: "mb-1 text-xs text-text-secondary",
149
- children: "Enrolled learners"
150
- }), /* @__PURE__ */ p("div", {
151
- className: "flex items-center gap-2",
152
- children: [/* @__PURE__ */ f(r, {
153
- people: I,
154
- size: 28,
155
- max: 5
156
- }), /* @__PURE__ */ p("span", {
157
- className: "text-xs text-text-secondary tabular-nums",
158
- children: [e.enrolled, " enrolled"]
159
- })]
160
- })] })
161
- ]
162
- }), /* @__PURE__ */ p("div", {
163
- className: "space-y-4",
164
- children: [
165
- /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p("div", {
166
- className: "mb-1 flex items-center justify-between text-sm",
167
- children: [/* @__PURE__ */ f("span", {
168
- className: "text-text-secondary",
169
- children: "Overall progress"
170
- }), /* @__PURE__ */ p("span", {
171
- className: "font-semibold tabular-nums",
172
- children: [e.completionRate, "% Complete"]
173
- })]
174
- }), /* @__PURE__ */ f("div", {
175
- className: "h-2.5 overflow-hidden rounded-full bg-bg-sunken",
176
- children: /* @__PURE__ */ f("div", {
177
- className: "h-full rounded-full bg-action-primary-bg transition-[width] duration-500",
178
- style: { width: `${e.completionRate}%` }
179
- })
180
- })] }),
181
- u.length > 0 ? /* @__PURE__ */ f(n, { steps: u }) : /* @__PURE__ */ p("div", {
182
- className: "flex items-center gap-2 rounded-md border border-dashed border-border-default px-3 py-4 text-sm text-text-secondary",
183
- children: [/* @__PURE__ */ f(l, { className: "h-4 w-4" }), "No courses in this path yet — open the path to add them."]
184
- }),
185
- /* @__PURE__ */ f("div", { children: /* @__PURE__ */ f(h, {
186
- variant: "outline",
187
- size: "sm",
188
- onClick: () => L(e.id),
189
- children: "View path"
190
- }) })
191
- ]
192
- })]
193
- })
194
- })
195
- }, e.id);
196
- })
197
- }),
198
- w.length > j && /* @__PURE__ */ f(x, {
199
- page: A,
200
- pageSize: j,
201
- totalItems: w.length,
202
- onPageChange: N
203
- }),
204
- /* @__PURE__ */ f(i, {
205
- open: k.open,
206
- onOpenChange: k.onOpenChange,
207
- title: "Create Learning Path",
208
- description: "Group courses into a structured journey. You can add courses after creating the path.",
209
- fields: C,
210
- submitLabel: "Create Path",
211
- onSubmit: async (e) => {
212
- await D({
213
- id: `path-${Date.now()}`,
214
- title: String(e.title ?? ""),
215
- description: String(e.description ?? ""),
216
- courses: [],
217
- duration: String(e.duration ?? ""),
218
- level: String(e.level ?? "beginner"),
219
- enrolled: 0,
220
- completionRate: 0
221
- });
222
- }
223
- })
224
- ]
225
- });
226
- }
227
- //#endregion
228
- export { w as LearningLearningPathsPagePage };
229
-
230
- //# sourceMappingURL=LearningLearningPathsPagePage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningLearningPathsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { BookOpen, Clock, Layers, Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport { useCrewFoundryStore, type LearningPath } from '../store/crewfoundryStore';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { AvatarStack, PathSteps, type PathStep, type Person } from '../components/viz';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst PATH_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Path Title', type: 'text', required: true, colSpan: 2 },\n { name: 'description', label: 'Description', type: 'textarea', required: true, colSpan: 2 },\n {\n name: 'duration',\n label: 'Duration',\n type: 'text',\n required: true,\n placeholder: 'e.g. 3 months',\n },\n {\n name: 'level',\n label: 'Level',\n type: 'select',\n required: true,\n options: [\n { label: 'Beginner', value: 'beginner' },\n { label: 'Intermediate', value: 'intermediate' },\n { label: 'Advanced', value: 'advanced' },\n ],\n },\n];\n\nexport function LearningLearningPathsPagePage() {\n const { learningPaths, courses, employees, addLearningPath } = useCrewFoundryStore();\n const navigate = useNavigate();\n const createModal = useFormModal();\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 6 });\n const pagedPaths = learningPaths.slice(offset, offset + pageSize);\n\n const courseTitleById = useMemo(() => {\n const map = new Map<string, string>();\n for (const c of courses) {\n map.set(c.id, c.title);\n }\n return map;\n }, [courses]);\n\n const learnerPeople = useMemo<Person[]>(\n () =>\n employees.slice(0, 5).map((e) => ({\n name: `${e.firstName} ${e.lastName}`.trim(),\n avatarUrl: e.avatar,\n })),\n [employees]\n );\n\n const openPath = (id: string) =>\n navigate(`../learning/learning-path-detail-page?id=${encodeURIComponent(id)}`);\n\n const handleCreate = async (values: FormValues) => {\n const path: LearningPath = {\n id: `path-${Date.now()}`,\n title: String(values.title ?? ''),\n description: String(values.description ?? ''),\n courses: [],\n duration: String(values.duration ?? ''),\n level: String(values.level ?? 'beginner'),\n enrolled: 0,\n completionRate: 0,\n };\n await addLearningPath(path);\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Learning Paths</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Structured skill journeys for career growth</p>\n <PagePurpose className=\"mt-1\">\n Structured learning journeys that string courses together — follow a path to build\n toward a role or skill set step by step.\n </PagePurpose>\n </div>\n <Button onClick={() => createModal.openModal()}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Path\n </Button>\n </div>\n\n {learningPaths.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No learning paths yet\"\n description=\"Learning paths will appear here once they are created.\"\n action={\n <Button onClick={() => createModal.openModal()}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Create your first path\n </Button>\n }\n />\n ) : (\n <div className=\"space-y-4\">\n {pagedPaths.map((path) => {\n const courseIds = path.courses;\n const numCourses = courseIds.length;\n const completedCount = Math.round((path.completionRate / 100) * numCourses);\n const steps: PathStep[] = courseIds.map((id, i) => ({\n label: courseTitleById.get(id) ?? 'Course',\n state: i < completedCount ? 'done' : i === completedCount ? 'active' : 'todo',\n }));\n\n return (\n <Card key={path.id} className=\"overflow-hidden\">\n <CardContent className=\"p-5\">\n <div className=\"grid gap-5 lg:grid-cols-[minmax(0,18rem)_minmax(0,1fr)]\">\n {/* Left: identity */}\n <div className=\"space-y-3\">\n <button\n type=\"button\"\n onClick={() => openPath(path.id)}\n className=\"text-left text-lg font-semibold outline-none hover:text-action-primary-bg focus-visible:text-action-primary-bg\"\n >\n {path.title}\n </button>\n <p className=\"line-clamp-2 text-sm text-text-secondary\">{path.description}</p>\n <div className=\"flex flex-wrap gap-2\">\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {formatEnumLabel(path.level)}\n </Badge>\n <Badge\n variant=\"outline\"\n className=\"inline-flex items-center gap-1 text-[10px]\"\n >\n <Clock className=\"h-3 w-3\" />\n {path.duration}\n </Badge>\n <Badge\n variant=\"outline\"\n className=\"inline-flex items-center gap-1 text-[10px]\"\n >\n <BookOpen className=\"h-3 w-3\" />\n {numCourses} courses\n </Badge>\n </div>\n {learnerPeople.length > 0 && path.enrolled > 0 && (\n <div>\n <p className=\"mb-1 text-xs text-text-secondary\">Enrolled learners</p>\n <div className=\"flex items-center gap-2\">\n <AvatarStack people={learnerPeople} size={28} max={5} />\n <span className=\"text-xs text-text-secondary tabular-nums\">\n {path.enrolled} enrolled\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* Right: progress + timeline */}\n <div className=\"space-y-4\">\n <div>\n <div className=\"mb-1 flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Overall progress</span>\n <span className=\"font-semibold tabular-nums\">\n {path.completionRate}% Complete\n </span>\n </div>\n <div className=\"h-2.5 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: `${path.completionRate}%` }}\n />\n </div>\n </div>\n {steps.length > 0 ? (\n <PathSteps steps={steps} />\n ) : (\n <div className=\"flex items-center gap-2 rounded-md border border-dashed border-border-default px-3 py-4 text-sm text-text-secondary\">\n <Layers className=\"h-4 w-4\" />\n No courses in this path yet — open the path to add them.\n </div>\n )}\n <div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => openPath(path.id)}>\n View path\n </Button>\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {learningPaths.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={learningPaths.length}\n onPageChange={setPage}\n />\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title=\"Create Learning Path\"\n description=\"Group courses into a structured journey. You can add courses after creating the path.\"\n fields={PATH_FIELDS}\n submitLabel=\"Create Path\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function LearningMyLearningPagePage(): import("react").JSX.Element;
2
- //# sourceMappingURL=LearningMyLearningPagePage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LearningMyLearningPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/LearningMyLearningPagePage.tsx"],"names":[],"mappings":"AA0GA,wBAAgB,0BAA0B,gCAyNzC"}