@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 +1 @@
1
- {"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx"],"sourcesContent":["import {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, CheckCircle, Clock, Plus } from 'lucide-react';\n\nexport function MarketplaceBookingManagementPagePage() {\n // There is no booking data source or booking-creation mutation yet, so we do\n // not synthesize pseudo-bookings from unrelated services. Counts are a true\n // zero and the list shows an honest empty state until the backend ships.\n const upcomingCount = 0;\n const confirmedCount = 0;\n const pendingCount = 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Booking Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage service provider appointments</p>\n <PagePurpose className=\"mt-1\">\n Manage your service bookings — review upcoming engagements, confirm schedules, and keep\n your client commitments on track.\n </PagePurpose>\n </div>\n {/* Bookings derive from marketplace services; there is no standalone\n booking-creation mutation yet, so this stays an honest disabled\n control instead of a silently-dead button. */}\n <Button size=\"sm\" disabled title=\"Booking creation is coming soon\">\n <Plus className=\"mr-1 h-4 w-4\" />\n New Booking · Coming soon\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Upcoming</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{upcomingCount}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Confirmed</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{confirmedCount}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{pendingCount}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Bookings</CardTitle>\n </CardHeader>\n <CardContent>\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No bookings yet\"\n description=\"Once booking creation ships, your scheduled service appointments will appear here.\"\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;AAaA,SAAgB,IAAuC;AAQrD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,sBAAiC,CAAA;MAC5C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAAwC,CAAA;KACnF,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAGhB,CAAA;KACV,EAAA,CAAA,EAIN,kBAAC,GAAD;KAAQ,MAAK;KAAK,UAAA;KAAS,OAAM;eAAjC,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,4BAE1B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAoB,CAAA,EAC/D,kBAAC,GAAD,EAAU,WAAU,iCAAkC,CAAA,CAC3C;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAjCH;OAiC0D,CAAA,EAC1D,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAqB,CAAA,EAChE,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,CACjD;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAzCF;OAyC0D,CAAA,EAC3D,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAmB,CAAA,EAC9D,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,CAC3C;UACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAjDJ;OAiD0D,CAAA,EACzD,CAAA,CACJ;;KACR;;GAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,gBAAwB,CAAA,EACxB,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,cAAa;IACb,OAAM;IACN,aAAY;IACZ,CAAA,EACU,CAAA,CACT,EAAA,CAAA;GACH"}
1
+ {"version":3,"file":"MarketplaceBookingManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceBookingManagementPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n Spinner,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useNavigate } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { SegmentedTabs, StatCard } from '../components/viz';\nimport {\n useCrewFoundryStore,\n type CrewBooking,\n type CrewBookingStatus,\n} from '../store/crewfoundryStore';\nimport {\n BOOKING_ACTION_LABEL,\n BOOKING_STATUS_LABEL,\n allowedBookingTransitions,\n formatRate,\n} from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\ntype View = 'provider' | 'client';\n\nconst STATUS_VARIANT: Record<CrewBookingStatus, 'default' | 'secondary' | 'outline'> = {\n requested: 'outline',\n confirmed: 'default',\n completed: 'secondary',\n cancelled: 'secondary',\n};\n\nexport function MarketplaceBookingManagementPagePage() {\n const navigate = useNavigate();\n const { bookings, marketplaceLoaded, fetchMarketplace, updateBookingStatus, initParams } =\n useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [view, setView] = useState<View>('provider');\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n const actorId = initParams.actorId;\n const asProvider = bookings.filter((booking) => booking.providerActorId === actorId);\n const asClient = bookings.filter((booking) => booking.clientActorId === actorId);\n const rows = view === 'provider' ? asProvider : asClient;\n const count = (list: CrewBooking[], status: CrewBookingStatus) =>\n list.filter((booking) => booking.status === status).length;\n\n const transition = async (booking: CrewBooking, status: CrewBookingStatus) => {\n setActionError(null);\n setPendingId(booking.id);\n try {\n await updateBookingStatus(booking.id, status);\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Unable to update booking');\n } finally {\n setPendingId(null);\n }\n };\n\n const columns: ResponsiveTableColumn<CrewBooking>[] = [\n {\n key: 'service',\n header: 'Service',\n priority: 'primary',\n cell: (booking) => (\n <button\n type=\"button\"\n className=\"text-left font-medium hover:underline\"\n onClick={() =>\n navigate(\n `../marketplace/service-details-page?id=${encodeURIComponent(booking.listingId)}`\n )\n }\n >\n {booking.listingTitle}\n </button>\n ),\n },\n {\n key: 'party',\n header: view === 'provider' ? 'Booked by' : 'Provider',\n cell: (booking) => (\n <span>{view === 'provider' ? booking.clientName : booking.providerName}</span>\n ),\n },\n {\n key: 'when',\n header: 'Scheduled',\n cell: (booking) => (\n <span className=\"text-text-secondary\">\n {booking.scheduledStart\n ? `${formatDate(booking.scheduledStart)}${booking.scheduledEnd ? ` – ${formatDate(booking.scheduledEnd)}` : ''}`\n : 'Not scheduled'}\n </span>\n ),\n },\n {\n key: 'rate',\n header: 'Agreed rate',\n cell: (booking) => <span className=\"tabular-nums\">{formatRate(booking)}</span>,\n },\n {\n key: 'status',\n header: 'Status',\n cell: (booking) => (\n <Badge variant={STATUS_VARIANT[booking.status]} className=\"text-[10px]\">\n {BOOKING_STATUS_LABEL[booking.status]}\n </Badge>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (booking) => {\n const next = allowedBookingTransitions(booking, actorId);\n if (next.length === 0) {\n return <span className=\"text-xs text-text-muted\">—</span>;\n }\n return (\n <div className=\"flex flex-wrap justify-end gap-1\">\n {next.map((status) => (\n <Button\n key={status}\n size=\"sm\"\n variant={status === 'cancelled' ? 'ghost' : 'outline'}\n disabled={pendingId === booking.id}\n onClick={() => void transition(booking, status)}\n >\n {BOOKING_ACTION_LABEL[status]}\n </Button>\n ))}\n </div>\n );\n },\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Bookings</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {asProvider.length} for your services · {asClient.length} you made\n </p>\n <PagePurpose className=\"mt-1\">\n Confirm requests for your services, mark work completed, and keep track of the services\n you have booked from others.\n </PagePurpose>\n </div>\n\n <MarketplaceTabs value=\"bookings\" />\n\n <InlineError message={loadError ?? actionError} />\n\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatCard label=\"Requested\" value={count(rows, 'requested')} />\n <StatCard label=\"Confirmed\" value={count(rows, 'confirmed')} />\n <StatCard label=\"Completed\" value={count(rows, 'completed')} />\n <StatCard label=\"Cancelled\" value={count(rows, 'cancelled')} />\n </div>\n\n <SegmentedTabs\n aria-label=\"Booking perspective\"\n value={view}\n onChange={(id) => setView(id as View)}\n tabs={[\n { id: 'provider', label: 'Requests for my services', count: asProvider.length },\n { id: 'client', label: 'My bookings', count: asClient.length },\n ]}\n />\n\n {!marketplaceLoaded && !loadError ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : rows.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={view === 'provider' ? 'No booking requests yet' : \"You haven't booked anything\"}\n description={\n view === 'provider'\n ? 'Requests appear here when a colleague books one of your services.'\n : 'Browse the marketplace to book a colleague or contractor.'\n }\n action={\n <Button size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n Browse the marketplace\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewBooking>\n data={rows}\n rowKey={(booking) => booking.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Escrow ledger for marketplace bookings. These rows are bookkeeping only —
3
+ * wspace-crewfoundry-svc records the amount that should be held and when it is
4
+ * released; no money is moved or held by the platform.
5
+ */
6
+ export declare function MarketplaceEscrowPagePage(): import("react").JSX.Element;
7
+ //# sourceMappingURL=MarketplaceEscrowPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceEscrowPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx"],"names":[],"mappings":"AA2BA;;;;GAIG;AACH,wBAAgB,yBAAyB,gCAkLxC"}
@@ -0,0 +1,175 @@
1
+ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
+ import { StatCard as t } from "../components/viz/StatCard.js";
3
+ import "../components/viz/index.js";
4
+ import { formatDate as n } from "../utils/dateUtils.js";
5
+ import { InlineError as r } from "../components/InlineError.js";
6
+ import { useEnsureLoaded as i } from "../lib/useEnsureLoaded.js";
7
+ import { MarketplaceTabs as a } from "../components/marketplace/MarketplaceTabs.js";
8
+ import { ESCROW_STATUS_LABEL as o, formatMoney as s, isEscrowOpen as c, sumByCurrency as l } from "../lib/marketplace.js";
9
+ import { useMemo as u, useState as d } from "react";
10
+ import { Info as f } from "lucide-react";
11
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
12
+ import { Badge as h, Button as g, Card as _, CardContent as v, GradientText as y, IllustratedEmptyState as b, PagePurpose as x, ResponsiveTable as S, Spinner as C } from "@burdenoff/fe-libs/ui";
13
+ //#region src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx
14
+ var w = {
15
+ ON_BOOKING_COMPLETION: "When the booking completes",
16
+ ON_MANUAL_APPROVAL: "On manual approval"
17
+ };
18
+ function T() {
19
+ let { escrowRecords: T, escrowLoaded: E, escrowError: D, fetchEscrowRecords: O, bookings: k, marketplaceLoaded: A, fetchMarketplace: j, releaseEscrowRecord: M, cancelEscrowRecord: N } = e();
20
+ i(E, O);
21
+ let P = i(A, j), [F, I] = d(null), [L, R] = d(null), z = u(() => new Map(k.map((e) => [e.id, e])), [k]), B = T.filter((e) => c(e.status)), V = T.filter((e) => e.status === "released"), H = async (e, t) => {
22
+ I(null), R(e.id);
23
+ try {
24
+ await t(e.id);
25
+ } catch (e) {
26
+ I(e instanceof Error ? e.message : "Unable to update escrow");
27
+ } finally {
28
+ R(null);
29
+ }
30
+ };
31
+ return /* @__PURE__ */ m("div", {
32
+ className: "space-y-6 p-6",
33
+ children: [
34
+ /* @__PURE__ */ m("div", { children: [
35
+ /* @__PURE__ */ p("h1", {
36
+ className: "text-2xl font-semibold",
37
+ children: /* @__PURE__ */ p(y, { children: "Escrow Ledger" })
38
+ }),
39
+ /* @__PURE__ */ m("p", {
40
+ className: "text-sm text-text-secondary",
41
+ children: [
42
+ T.length,
43
+ " records · ",
44
+ B.length,
45
+ " awaiting release"
46
+ ]
47
+ }),
48
+ /* @__PURE__ */ p(x, {
49
+ className: "mt-1",
50
+ children: "Every marketplace booking records the agreed amount that should be held until the work is done. Release it when the work is approved, or cancel it if the booking falls through."
51
+ })
52
+ ] }),
53
+ /* @__PURE__ */ p(a, { value: "escrow" }),
54
+ /* @__PURE__ */ m("div", {
55
+ className: "flex items-start gap-2 rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text",
56
+ children: [/* @__PURE__ */ p(f, {
57
+ className: "mt-0.5 h-4 w-4 shrink-0",
58
+ "aria-hidden": !0
59
+ }), /* @__PURE__ */ p("span", { children: "This is a bookkeeping ledger. CrewFoundry records what should be held and released; it does not collect, hold or transfer funds. Settle payments through your usual payment process." })]
60
+ }),
61
+ /* @__PURE__ */ p(r, { message: D ? `Escrow records are unavailable: ${D}. Viewing escrow requires payroll access in this workspace.` : P ?? F }),
62
+ /* @__PURE__ */ m("div", {
63
+ className: "grid gap-4 sm:grid-cols-3",
64
+ children: [
65
+ /* @__PURE__ */ p(t, {
66
+ label: "Awaiting Release",
67
+ value: l(B)
68
+ }),
69
+ /* @__PURE__ */ p(t, {
70
+ label: "Released",
71
+ value: l(V)
72
+ }),
73
+ /* @__PURE__ */ p(t, {
74
+ label: "Records",
75
+ value: T.length
76
+ })
77
+ ]
78
+ }),
79
+ E ? D ? null : T.length === 0 ? /* @__PURE__ */ p(b, {
80
+ illustration: "empty-data",
81
+ title: "No escrow records yet",
82
+ description: "An escrow record is created automatically each time a service is booked."
83
+ }) : /* @__PURE__ */ p(_, { children: /* @__PURE__ */ p(v, {
84
+ className: "pt-6",
85
+ children: /* @__PURE__ */ p(S, {
86
+ data: T,
87
+ rowKey: (e) => e.id,
88
+ columns: [
89
+ {
90
+ key: "booking",
91
+ header: "Booking",
92
+ priority: "primary",
93
+ cell: (e) => {
94
+ let t = z.get(e.bookingId);
95
+ return /* @__PURE__ */ m("div", {
96
+ className: "min-w-0",
97
+ children: [/* @__PURE__ */ p("p", {
98
+ className: "font-medium",
99
+ children: t?.listingTitle ?? "Booking"
100
+ }), t && /* @__PURE__ */ m("p", {
101
+ className: "text-xs text-text-secondary",
102
+ children: [
103
+ t.providerName,
104
+ " → ",
105
+ t.clientName
106
+ ]
107
+ })]
108
+ });
109
+ }
110
+ },
111
+ {
112
+ key: "amount",
113
+ header: "Amount",
114
+ cell: (e) => /* @__PURE__ */ p("span", {
115
+ className: "tabular-nums font-medium",
116
+ children: s(e.amount, e.currency)
117
+ })
118
+ },
119
+ {
120
+ key: "condition",
121
+ header: "Releases",
122
+ cell: (e) => /* @__PURE__ */ p("span", {
123
+ className: "text-text-secondary",
124
+ children: w[e.releaseCondition] ?? e.releaseCondition
125
+ })
126
+ },
127
+ {
128
+ key: "status",
129
+ header: "Status",
130
+ cell: (e) => /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p(h, {
131
+ variant: c(e.status) ? "default" : "secondary",
132
+ className: "text-[10px]",
133
+ children: o[e.status]
134
+ }), e.releasedAt && /* @__PURE__ */ p("p", {
135
+ className: "mt-1 text-xs text-text-secondary",
136
+ children: n(e.releasedAt)
137
+ })] })
138
+ },
139
+ {
140
+ key: "actions",
141
+ header: "",
142
+ cellClassName: "md:text-right",
143
+ cell: (e) => c(e.status) ? /* @__PURE__ */ m("div", {
144
+ className: "flex justify-end gap-1",
145
+ children: [/* @__PURE__ */ p(g, {
146
+ size: "sm",
147
+ variant: "outline",
148
+ disabled: L === e.id,
149
+ onClick: () => void H(e, M),
150
+ children: "Release"
151
+ }), /* @__PURE__ */ p(g, {
152
+ size: "sm",
153
+ variant: "ghost",
154
+ disabled: L === e.id,
155
+ onClick: () => void H(e, N),
156
+ children: "Cancel"
157
+ })]
158
+ }) : /* @__PURE__ */ p("span", {
159
+ className: "text-xs text-text-muted",
160
+ children: "—"
161
+ })
162
+ }
163
+ ]
164
+ })
165
+ }) }) : /* @__PURE__ */ p("div", {
166
+ className: "flex min-h-[240px] items-center justify-center",
167
+ children: /* @__PURE__ */ p(C, { size: "lg" })
168
+ })
169
+ ]
170
+ });
171
+ }
172
+ //#endregion
173
+ export { T as MarketplaceEscrowPagePage };
174
+
175
+ //# sourceMappingURL=MarketplaceEscrowPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketplaceEscrowPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceEscrowPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n Spinner,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { Info } from 'lucide-react';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewEscrowRecord } from '../store/crewfoundryStore';\nimport { ESCROW_STATUS_LABEL, formatMoney, isEscrowOpen, sumByCurrency } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\nconst RELEASE_CONDITION_LABEL: Record<string, string> = {\n ON_BOOKING_COMPLETION: 'When the booking completes',\n ON_MANUAL_APPROVAL: 'On manual approval',\n};\n\n/**\n * Escrow ledger for marketplace bookings. These rows are bookkeeping only —\n * wspace-crewfoundry-svc records the amount that should be held and when it is\n * released; no money is moved or held by the platform.\n */\nexport function MarketplaceEscrowPagePage() {\n const {\n escrowRecords,\n escrowLoaded,\n escrowError,\n fetchEscrowRecords,\n bookings,\n marketplaceLoaded,\n fetchMarketplace,\n releaseEscrowRecord,\n cancelEscrowRecord,\n } = useCrewFoundryStore();\n useEnsureLoaded(escrowLoaded, fetchEscrowRecords);\n const marketplaceError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [actionError, setActionError] = useState<string | null>(null);\n const [pendingId, setPendingId] = useState<string | null>(null);\n\n const bookingById = useMemo(() => new Map(bookings.map((b) => [b.id, b])), [bookings]);\n const held = escrowRecords.filter((row) => isEscrowOpen(row.status));\n const released = escrowRecords.filter((row) => row.status === 'released');\n\n const run = async (row: CrewEscrowRecord, action: (id: string) => Promise<void>) => {\n setActionError(null);\n setPendingId(row.id);\n try {\n await action(row.id);\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Unable to update escrow');\n } finally {\n setPendingId(null);\n }\n };\n\n const columns: ResponsiveTableColumn<CrewEscrowRecord>[] = [\n {\n key: 'booking',\n header: 'Booking',\n priority: 'primary',\n cell: (row) => {\n const booking = bookingById.get(row.bookingId);\n return (\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{booking?.listingTitle ?? 'Booking'}</p>\n {booking && (\n <p className=\"text-xs text-text-secondary\">\n {booking.providerName} → {booking.clientName}\n </p>\n )}\n </div>\n );\n },\n },\n {\n key: 'amount',\n header: 'Amount',\n cell: (row) => (\n <span className=\"tabular-nums font-medium\">{formatMoney(row.amount, row.currency)}</span>\n ),\n },\n {\n key: 'condition',\n header: 'Releases',\n cell: (row) => (\n <span className=\"text-text-secondary\">\n {RELEASE_CONDITION_LABEL[row.releaseCondition] ?? row.releaseCondition}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (row) => (\n <div>\n <Badge\n variant={isEscrowOpen(row.status) ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {ESCROW_STATUS_LABEL[row.status]}\n </Badge>\n {row.releasedAt && (\n <p className=\"mt-1 text-xs text-text-secondary\">{formatDate(row.releasedAt)}</p>\n )}\n </div>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (row) =>\n isEscrowOpen(row.status) ? (\n <div className=\"flex justify-end gap-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={pendingId === row.id}\n onClick={() => void run(row, releaseEscrowRecord)}\n >\n Release\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={pendingId === row.id}\n onClick={() => void run(row, cancelEscrowRecord)}\n >\n Cancel\n </Button>\n </div>\n ) : (\n <span className=\"text-xs text-text-muted\">—</span>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Escrow Ledger</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {escrowRecords.length} records · {held.length} awaiting release\n </p>\n <PagePurpose className=\"mt-1\">\n Every marketplace booking records the agreed amount that should be held until the work is\n done. Release it when the work is approved, or cancel it if the booking falls through.\n </PagePurpose>\n </div>\n\n <MarketplaceTabs value=\"escrow\" />\n\n <div className=\"flex items-start gap-2 rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text\">\n <Info className=\"mt-0.5 h-4 w-4 shrink-0\" aria-hidden />\n <span>\n This is a bookkeeping ledger. CrewFoundry records what should be held and released; it\n does not collect, hold or transfer funds. Settle payments through your usual payment\n process.\n </span>\n </div>\n\n <InlineError\n message={\n escrowError\n ? `Escrow records are unavailable: ${escrowError}. Viewing escrow requires payroll access in this workspace.`\n : (marketplaceError ?? actionError)\n }\n />\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Awaiting Release\" value={sumByCurrency(held)} />\n <StatCard label=\"Released\" value={sumByCurrency(released)} />\n <StatCard label=\"Records\" value={escrowRecords.length} />\n </div>\n\n {!escrowLoaded ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : escrowError ? null : escrowRecords.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No escrow records yet\"\n description=\"An escrow record is created automatically each time a service is booked.\"\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewEscrowRecord>\n data={escrowRecords}\n rowKey={(row) => row.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceMarketplacePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,8BAA8B,gCAsO7C"}
1
+ {"version":3,"file":"MarketplaceMarketplacePagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMarketplacePagePage.tsx"],"names":[],"mappings":"AAiCA,wBAAgB,8BAA8B,gCA2N7C"}