@burdenoff/microfe-crewfoundry 2026.1013.1 → 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 (214) 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/forms/FormModal.d.ts +25 -1
  12. package/dist/crewfoundry/components/forms/FormModal.d.ts.map +1 -1
  13. package/dist/crewfoundry/components/forms/FormModal.js +151 -136
  14. package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
  15. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
  16. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
  17. package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
  18. package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
  19. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
  20. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
  21. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
  22. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
  23. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
  24. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
  25. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
  26. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
  27. package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
  28. package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
  29. package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
  30. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
  31. package/dist/crewfoundry/lib/analytics.d.ts +1 -6
  32. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  33. package/dist/crewfoundry/lib/analytics.js +3 -18
  34. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  35. package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
  36. package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
  37. package/dist/crewfoundry/lib/companyFinance.js +3 -8
  38. package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
  39. package/dist/crewfoundry/lib/learning.d.ts +12 -0
  40. package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
  41. package/dist/crewfoundry/lib/learning.js +26 -0
  42. package/dist/crewfoundry/lib/learning.js.map +1 -0
  43. package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
  44. package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
  45. package/dist/crewfoundry/lib/marketplace.js +91 -0
  46. package/dist/crewfoundry/lib/marketplace.js.map +1 -0
  47. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
  48. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
  49. package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
  50. package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
  51. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
  52. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
  53. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  54. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.d.ts.map +1 -1
  55. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +49 -49
  56. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  58. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
  59. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  60. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  61. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
  62. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  64. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
  65. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
  67. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
  68. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/HiringCreateJobPagePage.d.ts.map +1 -1
  70. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +260 -115
  71. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  72. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.d.ts.map +1 -1
  73. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +199 -166
  74. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/HiringJobsPagePage.d.ts.map +1 -1
  76. package/dist/crewfoundry/pages/HiringJobsPagePage.js +118 -104
  77. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
  79. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
  80. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
  82. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
  83. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
  84. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
  86. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
  87. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
  88. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
  89. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
  90. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
  91. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
  92. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
  94. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
  95. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  96. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
  97. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
  98. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
  99. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
  100. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
  102. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
  104. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
  105. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
  107. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
  108. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  109. package/dist/crewfoundry/store/crewfoundryStore.d.ts +139 -79
  110. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  111. package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
  112. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  113. package/dist/crewfoundry/utils/dateUtils.d.ts +52 -0
  114. package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -0
  115. package/dist/crewfoundry/utils/dateUtils.js +31 -0
  116. package/dist/crewfoundry/utils/dateUtils.js.map +1 -0
  117. package/dist/generated/global-types.d.ts +5145 -1627
  118. package/dist/generated/global-types.d.ts.map +1 -1
  119. package/dist/generated/wspace-types.d.ts +100373 -34602
  120. package/dist/generated/wspace-types.d.ts.map +1 -1
  121. package/dist/utils/pageContext.d.ts.map +1 -1
  122. package/dist/utils/pageContext.js +0 -1
  123. package/dist/utils/pageContext.js.map +1 -1
  124. package/package.json +1 -1
  125. package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
  126. package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
  127. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
  128. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
  129. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
  130. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
  131. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
  132. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
  133. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
  134. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
  135. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
  136. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
  137. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
  138. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
  139. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
  140. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
  141. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
  142. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
  143. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
  144. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
  145. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
  146. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
  147. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
  148. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
  149. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
  150. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
  151. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
  152. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
  153. package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
  154. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
  155. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
  156. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
  157. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
  158. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
  159. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
  160. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
  161. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
  162. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
  163. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
  164. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
  165. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
  166. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
  167. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
  168. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
  169. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
  170. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
  171. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
  172. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
  173. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
  174. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
  175. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
  176. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
  177. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
  178. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
  179. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
  180. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
  181. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
  182. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
  183. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
  184. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
  185. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
  186. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
  187. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
  188. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
  189. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
  190. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
  191. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
  192. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
  193. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
  194. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
  195. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
  196. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
  197. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
  198. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
  199. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
  200. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
  201. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
  202. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
  203. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
  204. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
  205. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
  206. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
  207. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
  208. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
  209. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
  210. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
  211. package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
  212. package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
  213. package/dist/crewfoundry/utils/courseProgress.js +0 -46
  214. package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
@@ -1,310 +1,147 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { getInitials as t } from "../components/viz/lib/format.js";
3
- import { RatingStars as n } from "../components/viz/RatingStars.js";
2
+ import { StatCard as t } from "../components/viz/StatCard.js";
3
+ import { AvatarStack as n } from "../components/viz/AvatarStack.js";
4
4
  import "../components/viz/index.js";
5
- import { useMemo as r, useState as i } from "react";
6
- import { CalendarDays as a, CheckCircle2 as o, Clock3 as s, MessageSquare as c, PauseCircle as l, Star as u } from "lucide-react";
7
- import { useLocation as d, useNavigate as f } from "react-router";
8
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
9
- import { Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, EmphasisPanel as x, GradientText as S, IllustratedEmptyState as C, Input as w, PagePurpose as T, Spinner as E } from "@burdenoff/fe-libs/ui";
5
+ import { formatDate as r } from "../utils/dateUtils.js";
6
+ import { InlineError as i } from "../components/InlineError.js";
7
+ import { useEnsureLoaded as a } from "../lib/useEnsureLoaded.js";
8
+ import { formatRate as o } from "../lib/marketplace.js";
9
+ import { BookServiceModal as s } from "../components/marketplace/BookServiceModal.js";
10
+ import { ServiceListingModal as c } from "../components/marketplace/ServiceListingModal.js";
11
+ import { useState as l } from "react";
12
+ import { ArrowLeft as u, Pencil as d } from "lucide-react";
13
+ import { useNavigate as f, useSearchParams as p } from "react-router";
14
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
15
+ import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, GradientText as S, IllustratedEmptyState as C, Spinner as w } from "@burdenoff/fe-libs/ui";
10
16
  //#region src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx
11
- function D(e) {
12
- switch (e) {
13
- case "active": return {
14
- label: "Available for new projects",
15
- icon: o,
16
- className: "text-status-success-text"
17
- };
18
- case "pending": return {
19
- label: "Pending review",
20
- icon: s,
21
- className: "text-status-warning-text"
22
- };
23
- default: return {
24
- label: "Not currently available",
25
- icon: l,
26
- className: "text-text-secondary"
27
- };
28
- }
29
- }
30
- function O() {
31
- let o = f(), l = d(), { marketplaceServices: O, initialized: k } = e(), A = new URLSearchParams(l.search).get("id"), j = O.find((e) => e.id === A) ?? O[0], M = r(() => j ? O.filter((e) => e.provider === j.provider) : [], [O, j]), [N, P] = i(null), F = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10), [I, L] = i(F);
32
- if (!k && !j) return /* @__PURE__ */ p("div", {
17
+ function T() {
18
+ let T = f(), [E] = p(), { serviceListings: D, bookings: O, marketplaceLoaded: k, fetchMarketplace: A, initParams: j } = e(), M = a(k, A), [N, P] = l(null), [F, I] = l(!1), [L, R] = l(null), z = E.get("id"), B = D.find((e) => e.id === z);
19
+ if (!k && !M) return /* @__PURE__ */ m("div", {
33
20
  className: "flex min-h-[60vh] items-center justify-center p-6",
34
- children: /* @__PURE__ */ p(E, { size: "lg" })
21
+ children: /* @__PURE__ */ m(w, { size: "lg" })
35
22
  });
36
- if (!j) return /* @__PURE__ */ p("div", {
37
- className: "p-6",
38
- children: /* @__PURE__ */ p(C, {
23
+ if (!B) return /* @__PURE__ */ h("div", {
24
+ className: "space-y-4 p-6",
25
+ children: [/* @__PURE__ */ m(i, { message: M }), /* @__PURE__ */ m(C, {
39
26
  illustration: "empty-search",
40
27
  title: "Service not found",
41
- description: "This service is no longer available."
42
- })
28
+ description: "This service was removed or the link is incomplete.",
29
+ action: /* @__PURE__ */ m(_, {
30
+ size: "sm",
31
+ onClick: () => T("../marketplace/marketplace-page"),
32
+ children: "Back to the marketplace"
33
+ })
34
+ })]
43
35
  });
44
- let R = M.find((e) => e.id === N) ?? j, z = D(j.status), B = z.icon;
45
- return /* @__PURE__ */ m("div", {
36
+ let V = B.providerActorId === j.actorId, H = O.filter((e) => e.listingId === B.id), U = H.filter((e) => e.status === "completed").length, W = H.filter((e) => e.status === "requested" || e.status === "confirmed").length;
37
+ return /* @__PURE__ */ h("div", {
46
38
  className: "space-y-6 p-6",
47
- children: [/* @__PURE__ */ m("div", {
48
- className: "text-xs text-text-secondary",
49
- children: [
50
- /* @__PURE__ */ p("button", {
51
- type: "button",
52
- className: "hover:text-text-primary",
53
- onClick: () => o("../marketplace/marketplace-page"),
54
- children: "Marketplace"
55
- }),
56
- /* @__PURE__ */ p("span", {
57
- className: "mx-1",
58
- children: "/"
59
- }),
60
- /* @__PURE__ */ p("span", {
61
- className: "text-text-primary",
62
- children: j.title
63
- })
64
- ]
65
- }), /* @__PURE__ */ m("div", {
66
- className: "grid gap-6 lg:grid-cols-3",
67
- children: [/* @__PURE__ */ m("div", {
68
- className: "space-y-6 lg:col-span-2",
69
- children: [
70
- /* @__PURE__ */ m("div", {
71
- className: "flex flex-col gap-4 sm:flex-row sm:items-start",
72
- children: [/* @__PURE__ */ p("span", {
73
- className: "flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-2xl font-semibold text-action-primary-text",
74
- "aria-hidden": "true",
75
- children: t(j.provider)
76
- }), /* @__PURE__ */ m("div", {
77
- className: "min-w-0 flex-1 space-y-2",
78
- children: [
79
- /* @__PURE__ */ p("h1", {
80
- className: "text-2xl font-semibold",
81
- children: /* @__PURE__ */ p(S, { children: j.provider })
82
- }),
83
- /* @__PURE__ */ p("p", {
84
- className: "text-sm text-text-secondary",
85
- children: j.title
86
- }),
87
- /* @__PURE__ */ m("div", {
88
- className: "flex flex-wrap items-center gap-3",
89
- children: [
90
- /* @__PURE__ */ p(n, {
91
- value: j.rating,
92
- count: j.reviews,
93
- showValue: !0,
94
- size: 16
95
- }),
96
- /* @__PURE__ */ m("span", {
97
- className: "flex items-center gap-1 text-xs text-text-secondary",
98
- children: [/* @__PURE__ */ p(s, { className: "h-3 w-3" }), j.deliveryTime]
99
- }),
100
- /* @__PURE__ */ p(h, {
101
- variant: "outline",
102
- className: "text-[10px]",
103
- children: j.category
104
- })
105
- ]
106
- }),
107
- /* @__PURE__ */ p("div", {
108
- className: "flex flex-wrap gap-1.5 pt-1",
109
- children: j.skills.map((e) => /* @__PURE__ */ p(h, {
110
- variant: "secondary",
111
- className: "text-xs",
112
- children: e
113
- }, e))
114
- })
115
- ]
116
- })]
117
- }),
118
- /* @__PURE__ */ p(T, { children: "See exactly what this service includes, what it costs, and how others rated it — use the booking panel to pick a package and request an engagement." }),
119
- /* @__PURE__ */ m(x, { children: [/* @__PURE__ */ p("div", {
120
- className: "mb-2 text-lg font-semibold",
121
- children: "About this service"
122
- }), /* @__PURE__ */ p("p", {
123
- className: "text-sm text-text-secondary",
124
- children: j.description
125
- })] }),
126
- /* @__PURE__ */ m("div", {
127
- className: "space-y-3",
128
- children: [/* @__PURE__ */ p("h2", {
129
- className: "text-lg font-semibold",
130
- children: "Services offered"
131
- }), /* @__PURE__ */ p("div", {
132
- className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
133
- children: M.map((e) => {
134
- let t = e.id === R.id;
135
- return /* @__PURE__ */ m("button", {
136
- type: "button",
137
- onClick: () => P(e.id),
138
- "aria-pressed": t,
139
- className: `flex flex-col rounded-lg border p-4 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${t ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken/50"}`,
140
- children: [
141
- /* @__PURE__ */ m("div", {
142
- className: "flex items-start justify-between gap-2",
143
- children: [/* @__PURE__ */ p("p", {
144
- className: "text-sm font-semibold",
145
- children: e.title
146
- }), /* @__PURE__ */ p("span", {
147
- className: "whitespace-nowrap text-[11px] text-text-secondary",
148
- children: e.deliveryTime
149
- })]
150
- }),
151
- /* @__PURE__ */ m("p", {
152
- className: "mt-1 text-xl font-bold tabular-nums",
153
- children: [
154
- "$",
155
- e.price.toLocaleString(),
156
- /* @__PURE__ */ m("span", {
157
- className: "text-xs font-normal text-text-secondary",
158
- children: ["/", e.priceType]
159
- })
160
- ]
161
- }),
162
- /* @__PURE__ */ p("p", {
163
- className: "mt-2 line-clamp-3 text-xs text-text-secondary",
164
- children: e.description
165
- })
166
- ]
167
- }, e.id);
168
- })
169
- })]
170
- }),
171
- /* @__PURE__ */ m("div", {
172
- className: "space-y-3",
173
- children: [/* @__PURE__ */ p("h2", {
174
- className: "text-lg font-semibold",
175
- children: "Reviews"
176
- }), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
177
- className: "flex flex-col items-center gap-2 p-6 text-center",
178
- children: [/* @__PURE__ */ m("div", {
179
- className: "flex items-center gap-2",
180
- children: [
181
- /* @__PURE__ */ p(u, {
182
- className: "h-6 w-6 text-status-warning-text",
183
- fill: "currentColor"
184
- }),
185
- /* @__PURE__ */ p("span", {
186
- className: "text-2xl font-bold tabular-nums",
187
- children: j.rating.toFixed(1)
188
- }),
189
- /* @__PURE__ */ p("span", {
190
- className: "text-sm text-text-secondary",
191
- children: "/ 5"
192
- })
193
- ]
194
- }), /* @__PURE__ */ m("p", {
195
- className: "text-sm text-text-secondary",
196
- children: [
197
- "Based on ",
198
- j.reviews.toLocaleString(),
199
- " ",
200
- j.reviews === 1 ? "review" : "reviews",
201
- ". Individual review notes aren't published for this listing yet."
202
- ]
203
- })]
204
- }) })]
205
- })
206
- ]
207
- }), /* @__PURE__ */ p("div", {
208
- className: "lg:col-span-1",
209
- children: /* @__PURE__ */ m(_, {
210
- className: "lg:sticky lg:top-6",
211
- children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, {
212
- className: "text-lg",
213
- children: "Book this service"
214
- }) }), /* @__PURE__ */ m(v, {
215
- className: "space-y-5",
39
+ children: [
40
+ /* @__PURE__ */ h(_, {
41
+ variant: "ghost",
42
+ size: "sm",
43
+ onClick: () => T("../marketplace/marketplace-page"),
44
+ children: [/* @__PURE__ */ m(u, { className: "mr-1 h-4 w-4" }), "Marketplace"]
45
+ }),
46
+ /* @__PURE__ */ h("div", {
47
+ className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
48
+ children: [/* @__PURE__ */ h("div", {
49
+ className: "min-w-0",
50
+ children: [/* @__PURE__ */ h("div", {
51
+ className: "flex flex-wrap items-center gap-2",
216
52
  children: [
217
- /* @__PURE__ */ m("fieldset", {
218
- className: "space-y-2",
219
- children: [/* @__PURE__ */ p("legend", {
220
- className: "mb-1 text-sm font-medium",
221
- children: "Package"
222
- }), M.map((e) => {
223
- let t = e.id === R.id;
224
- return /* @__PURE__ */ m("button", {
225
- type: "button",
226
- onClick: () => P(e.id),
227
- "aria-pressed": t,
228
- className: `flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${t ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken/50"}`,
229
- children: [/* @__PURE__ */ m("span", {
230
- className: "flex items-center gap-2 min-w-0",
231
- children: [/* @__PURE__ */ p("span", {
232
- className: `flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${t ? "border-action-primary-bg" : "border-border-strong"}`,
233
- "aria-hidden": "true",
234
- children: t ? /* @__PURE__ */ p("span", { className: "h-2 w-2 rounded-full bg-action-primary-bg" }) : null
235
- }), /* @__PURE__ */ p("span", {
236
- className: "truncate text-sm",
237
- children: e.title
238
- })]
239
- }), /* @__PURE__ */ m("span", {
240
- className: "whitespace-nowrap text-sm font-semibold tabular-nums",
241
- children: ["$", e.price.toLocaleString()]
242
- })]
243
- }, e.id);
244
- })]
245
- }),
246
- /* @__PURE__ */ m("div", {
247
- className: "space-y-1.5",
248
- children: [/* @__PURE__ */ p("label", {
249
- htmlFor: "booking-date",
250
- className: "text-sm font-medium",
251
- children: "Date"
252
- }), /* @__PURE__ */ m("div", {
253
- className: "relative",
254
- children: [/* @__PURE__ */ p(a, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ p(w, {
255
- id: "booking-date",
256
- type: "date",
257
- min: F,
258
- value: I,
259
- onChange: (e) => L(e.target.value),
260
- className: "pl-9"
261
- })]
262
- })]
263
- }),
264
- /* @__PURE__ */ m("div", {
265
- className: "flex items-center justify-between border-t border-border-subtle pt-3",
266
- children: [/* @__PURE__ */ p("span", {
267
- className: "text-sm font-medium",
268
- children: "Total price"
269
- }), /* @__PURE__ */ m("span", {
270
- className: "text-lg font-bold tabular-nums",
271
- children: [
272
- "$",
273
- R.price.toLocaleString(),
274
- /* @__PURE__ */ m("span", {
275
- className: "text-xs font-normal text-text-secondary",
276
- children: ["/", R.priceType]
277
- })
278
- ]
279
- })]
53
+ /* @__PURE__ */ m("h1", {
54
+ className: "text-2xl font-semibold",
55
+ children: /* @__PURE__ */ m(S, { children: B.title })
280
56
  }),
281
- /* @__PURE__ */ m("div", {
282
- className: "space-y-2",
283
- children: [/* @__PURE__ */ p(g, {
284
- className: "w-full",
285
- disabled: !0,
286
- title: "Booking is coming soon",
287
- "aria-label": "Book now — coming soon",
288
- children: "Book Now · Coming soon"
289
- }), /* @__PURE__ */ m(g, {
290
- variant: "outline",
291
- className: "w-full",
292
- onClick: () => o("../marketplace/messaging-page"),
293
- children: [/* @__PURE__ */ p(c, { className: "mr-1 h-4 w-4" }), "Message"]
294
- })]
57
+ /* @__PURE__ */ m(g, {
58
+ variant: B.status === "active" ? "default" : "secondary",
59
+ className: "text-[10px]",
60
+ children: B.status === "active" ? "Bookable" : "Paused"
295
61
  }),
296
- /* @__PURE__ */ m("p", {
297
- className: `flex items-center justify-center gap-1.5 text-xs ${z.className}`,
298
- children: [/* @__PURE__ */ p(B, { className: "h-3.5 w-3.5" }), z.label]
62
+ B.category && /* @__PURE__ */ m(g, {
63
+ variant: "outline",
64
+ className: "text-[10px]",
65
+ children: B.category
299
66
  })
300
67
  ]
68
+ }), /* @__PURE__ */ h("div", {
69
+ className: "mt-2 flex items-center gap-2 text-sm text-text-secondary",
70
+ children: [
71
+ /* @__PURE__ */ m(n, {
72
+ people: [{ name: B.providerName }],
73
+ size: 28
74
+ }),
75
+ B.providerName,
76
+ V && " (you)",
77
+ " · listed ",
78
+ r(B.createdAt)
79
+ ]
301
80
  })]
302
- })
303
- })]
304
- })]
81
+ }), /* @__PURE__ */ h("div", {
82
+ className: "flex flex-wrap gap-2",
83
+ children: [V && /* @__PURE__ */ h(_, {
84
+ size: "sm",
85
+ variant: "outline",
86
+ onClick: () => I(!0),
87
+ children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Edit"]
88
+ }), /* @__PURE__ */ m(_, {
89
+ size: "sm",
90
+ disabled: B.status !== "active",
91
+ title: B.status === "active" ? void 0 : "The provider has paused this service",
92
+ onClick: () => {
93
+ R(null), P(B);
94
+ },
95
+ children: "Book this service"
96
+ })]
97
+ })]
98
+ }),
99
+ /* @__PURE__ */ m(i, { message: M }),
100
+ L && /* @__PURE__ */ m("div", {
101
+ role: "status",
102
+ className: "rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text",
103
+ children: L
104
+ }),
105
+ /* @__PURE__ */ h("div", {
106
+ className: "grid gap-4 sm:grid-cols-3",
107
+ children: [
108
+ /* @__PURE__ */ m(t, {
109
+ label: "Rate",
110
+ value: o(B)
111
+ }),
112
+ /* @__PURE__ */ m(t, {
113
+ label: "Open Bookings",
114
+ value: W
115
+ }),
116
+ /* @__PURE__ */ m(t, {
117
+ label: "Completed Bookings",
118
+ value: U
119
+ })
120
+ ]
121
+ }),
122
+ /* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ m(x, {
123
+ className: "text-base",
124
+ children: "What’s included"
125
+ }) }), /* @__PURE__ */ m(y, { children: /* @__PURE__ */ m("p", {
126
+ className: "whitespace-pre-line text-sm text-text-secondary",
127
+ children: B.description
128
+ }) })] }),
129
+ /* @__PURE__ */ m(s, {
130
+ listing: N,
131
+ onOpenChange: (e) => {
132
+ e || P(null);
133
+ },
134
+ onBooked: () => R("Booking requested. Track it under Bookings; the provider confirms it there.")
135
+ }),
136
+ /* @__PURE__ */ m(c, {
137
+ open: F,
138
+ onOpenChange: I,
139
+ listing: B
140
+ })
141
+ ]
305
142
  });
306
143
  }
307
144
  //#endregion
308
- export { O as MarketplaceServiceDetailsPagePage };
145
+ export { T as MarketplaceServiceDetailsPagePage };
309
146
 
310
147
  //# sourceMappingURL=MarketplaceServiceDetailsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceServiceDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { CalendarDays, CheckCircle2, Clock3, MessageSquare, PauseCircle, Star } from 'lucide-react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { useCrewFoundryStore, type MarketplaceService } from '../store/crewfoundryStore';\nimport { RatingStars, getInitials } from '../components/viz';\n\n/** Honest availability derived from the real service `status` enum (never \"Booked\"). */\nfunction availabilityOf(status: MarketplaceService['status']): {\n label: string;\n icon: typeof CheckCircle2;\n className: string;\n} {\n switch (status) {\n case 'active':\n return {\n label: 'Available for new projects',\n icon: CheckCircle2,\n className: 'text-status-success-text',\n };\n case 'pending':\n return { label: 'Pending review', icon: Clock3, className: 'text-status-warning-text' };\n default:\n return {\n label: 'Not currently available',\n icon: PauseCircle,\n className: 'text-text-secondary',\n };\n }\n}\n\nexport function MarketplaceServiceDetailsPagePage() {\n const navigate = useNavigate();\n const location = useLocation();\n const { marketplaceServices, initialized } = useCrewFoundryStore();\n const selectedId = new URLSearchParams(location.search).get('id');\n const svc = marketplaceServices.find((s) => s.id === selectedId) ?? marketplaceServices[0];\n\n // Real \"packages\": every service this same provider actually offers. The\n // backend exposes a single price per service (no synthetic tiers), so each\n // package is a genuine listing — the viewed service is pre-selected.\n const providerPackages = useMemo(\n () =>\n svc\n ? marketplaceServices.filter((s) => s.provider === svc.provider)\n : ([] as MarketplaceService[]),\n [marketplaceServices, svc]\n );\n\n const [selectedPackageId, setSelectedPackageId] = useState<string | null>(null);\n const today = new Date().toISOString().slice(0, 10);\n const [bookingDate, setBookingDate] = useState(today);\n\n if (!initialized && !svc) {\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 (!svc) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Service not found\"\n description=\"This service is no longer available.\"\n />\n </div>\n );\n }\n\n const selectedPackage = providerPackages.find((p) => p.id === selectedPackageId) ?? svc;\n const availability = availabilityOf(svc.status);\n const AvailabilityIcon = availability.icon;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"text-xs text-text-secondary\">\n <button\n type=\"button\"\n className=\"hover:text-text-primary\"\n onClick={() => navigate('../marketplace/marketplace-page')}\n >\n Marketplace\n </button>\n <span className=\"mx-1\">/</span>\n <span className=\"text-text-primary\">{svc.title}</span>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* ── Left: provider + service detail ─────────────────────────── */}\n <div className=\"space-y-6 lg:col-span-2\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start\">\n <span\n className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-2xl font-semibold text-action-primary-text\"\n aria-hidden=\"true\"\n >\n {getInitials(svc.provider)}\n </span>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{svc.provider}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{svc.title}</p>\n <div className=\"flex flex-wrap items-center gap-3\">\n <RatingStars value={svc.rating} count={svc.reviews} showValue size={16} />\n <span className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Clock3 className=\"h-3 w-3\" />\n {svc.deliveryTime}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {svc.category}\n </Badge>\n </div>\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {svc.skills.map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-xs\">\n {skill}\n </Badge>\n ))}\n </div>\n </div>\n </div>\n\n <PagePurpose>\n See exactly what this service includes, what it costs, and how others rated it — use the\n booking panel to pick a package and request an engagement.\n </PagePurpose>\n\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">About this service</div>\n <p className=\"text-sm text-text-secondary\">{svc.description}</p>\n </EmphasisPanel>\n\n {/* Services offered — real listings from this provider */}\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">Services offered</h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {providerPackages.map((pkg) => {\n const active = pkg.id === selectedPackage.id;\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => setSelectedPackageId(pkg.id)}\n aria-pressed={active}\n className={`flex flex-col rounded-lg border p-4 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${\n active\n ? 'border-action-primary-bg bg-action-primary-bg/5'\n : 'border-border-subtle hover:bg-bg-sunken/50'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-sm font-semibold\">{pkg.title}</p>\n <span className=\"whitespace-nowrap text-[11px] text-text-secondary\">\n {pkg.deliveryTime}\n </span>\n </div>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n ${pkg.price.toLocaleString()}\n <span className=\"text-xs font-normal text-text-secondary\">\n /{pkg.priceType}\n </span>\n </p>\n <p className=\"mt-2 line-clamp-3 text-xs text-text-secondary\">\n {pkg.description}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Reviews — backend stores only an aggregate rating + count, not\n individual review bodies, so we report that honestly rather than\n inventing reviewer cards. */}\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">Reviews</h2>\n <Card>\n <CardContent className=\"flex flex-col items-center gap-2 p-6 text-center\">\n <div className=\"flex items-center gap-2\">\n <Star className=\"h-6 w-6 text-status-warning-text\" fill=\"currentColor\" />\n <span className=\"text-2xl font-bold tabular-nums\">{svc.rating.toFixed(1)}</span>\n <span className=\"text-sm text-text-secondary\">/ 5</span>\n </div>\n <p className=\"text-sm text-text-secondary\">\n Based on {svc.reviews.toLocaleString()} {svc.reviews === 1 ? 'review' : 'reviews'}\n . Individual review notes aren&apos;t published for this listing yet.\n </p>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* ── Right: sticky booking panel ─────────────────────────────── */}\n <div className=\"lg:col-span-1\">\n <Card className=\"lg:sticky lg:top-6\">\n <CardHeader>\n <CardTitle className=\"text-lg\">Book this service</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <fieldset className=\"space-y-2\">\n <legend className=\"mb-1 text-sm font-medium\">Package</legend>\n {providerPackages.map((pkg) => {\n const active = pkg.id === selectedPackage.id;\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => setSelectedPackageId(pkg.id)}\n aria-pressed={active}\n className={`flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${\n active\n ? 'border-action-primary-bg bg-action-primary-bg/5'\n : 'border-border-subtle hover:bg-bg-sunken/50'\n }`}\n >\n <span className=\"flex items-center gap-2 min-w-0\">\n <span\n className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n active ? 'border-action-primary-bg' : 'border-border-strong'\n }`}\n aria-hidden=\"true\"\n >\n {active ? (\n <span className=\"h-2 w-2 rounded-full bg-action-primary-bg\" />\n ) : null}\n </span>\n <span className=\"truncate text-sm\">{pkg.title}</span>\n </span>\n <span className=\"whitespace-nowrap text-sm font-semibold tabular-nums\">\n ${pkg.price.toLocaleString()}\n </span>\n </button>\n );\n })}\n </fieldset>\n\n <div className=\"space-y-1.5\">\n <label htmlFor=\"booking-date\" className=\"text-sm font-medium\">\n Date\n </label>\n <div className=\"relative\">\n <CalendarDays className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n id=\"booking-date\"\n type=\"date\"\n min={today}\n value={bookingDate}\n onChange={(event) => setBookingDate(event.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border-subtle pt-3\">\n <span className=\"text-sm font-medium\">Total price</span>\n <span className=\"text-lg font-bold tabular-nums\">\n ${selectedPackage.price.toLocaleString()}\n <span className=\"text-xs font-normal text-text-secondary\">\n /{selectedPackage.priceType}\n </span>\n </span>\n </div>\n\n <div className=\"space-y-2\">\n {/* No createCrewBooking mutation exists in the backend yet, so\n Book Now stays an honest disabled control — the panel is\n fully interactive but does not fake a booking. */}\n <Button\n className=\"w-full\"\n disabled\n title=\"Booking is coming soon\"\n aria-label=\"Book now — coming soon\"\n >\n Book Now · Coming soon\n </Button>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => navigate('../marketplace/messaging-page')}\n >\n <MessageSquare className=\"mr-1 h-4 w-4\" />\n Message\n </Button>\n </div>\n\n <p\n className={`flex items-center justify-center gap-1.5 text-xs ${availability.className}`}\n >\n <AvailabilityIcon className=\"h-3.5 w-3.5\" />\n {availability.label}\n </p>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MarketplaceServiceDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n IllustratedEmptyState,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Pencil } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { BookServiceModal } from '../components/marketplace/BookServiceModal';\nimport { ServiceListingModal } from '../components/marketplace/ServiceListingModal';\nimport { AvatarStack, StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewServiceListing } from '../store/crewfoundryStore';\nimport { formatRate } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\nexport function MarketplaceServiceDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { serviceListings, bookings, marketplaceLoaded, fetchMarketplace, initParams } =\n useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [bookTarget, setBookTarget] = useState<CrewServiceListing | null>(null);\n const [editOpen, setEditOpen] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n\n const listingId = searchParams.get('id');\n const listing = serviceListings.find((item) => item.id === listingId);\n\n if (!marketplaceLoaded && !loadError) {\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 (!listing) {\n return (\n <div className=\"space-y-4 p-6\">\n <InlineError message={loadError} />\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Service not found\"\n description=\"This service was removed or the link is incomplete.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n Back to the marketplace\n </Button>\n }\n />\n </div>\n );\n }\n\n const own = listing.providerActorId === initParams.actorId;\n const listingBookings = bookings.filter((booking) => booking.listingId === listing.id);\n const completed = listingBookings.filter((booking) => booking.status === 'completed').length;\n const open = listingBookings.filter(\n (booking) => booking.status === 'requested' || booking.status === 'confirmed'\n ).length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n Marketplace\n </Button>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{listing.title}</GradientText>\n </h1>\n <Badge\n variant={listing.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {listing.status === 'active' ? 'Bookable' : 'Paused'}\n </Badge>\n {listing.category && (\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {listing.category}\n </Badge>\n )}\n </div>\n <div className=\"mt-2 flex items-center gap-2 text-sm text-text-secondary\">\n <AvatarStack people={[{ name: listing.providerName }]} size={28} />\n {listing.providerName}\n {own && ' (you)'} · listed {formatDate(listing.createdAt)}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {own && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditOpen(true)}>\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={listing.status !== 'active'}\n title={listing.status !== 'active' ? 'The provider has paused this service' : undefined}\n onClick={() => {\n setNotice(null);\n setBookTarget(listing);\n }}\n >\n Book this service\n </Button>\n </div>\n </div>\n\n <InlineError message={loadError} />\n {notice && (\n <div\n role=\"status\"\n className=\"rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text\"\n >\n {notice}\n </div>\n )}\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Rate\" value={formatRate(listing)} />\n <StatCard label=\"Open Bookings\" value={open} />\n <StatCard label=\"Completed Bookings\" value={completed} />\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">What’s included</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"whitespace-pre-line text-sm text-text-secondary\">{listing.description}</p>\n </CardContent>\n </Card>\n\n <BookServiceModal\n listing={bookTarget}\n onOpenChange={(next) => {\n if (!next) setBookTarget(null);\n }}\n onBooked={() =>\n setNotice('Booking requested. Track it under Bookings; the provider confirms it there.')\n }\n />\n <ServiceListingModal open={editOpen} onOpenChange={setEditOpen} listing={listing} />\n </div>\n );\n}\n"],"mappings":"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"}