@burdenoff/microfe-crewfoundry 2026.1013.2 → 2026.1029.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/CrewFoundryRoot.d.ts.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoot.js +160 -256
- package/dist/crewfoundry/CrewFoundryRoot.js.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoutes.js +152 -192
- package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
- package/dist/crewfoundry/components/InlineError.d.ts +5 -0
- package/dist/crewfoundry/components/InlineError.d.ts.map +1 -0
- package/dist/crewfoundry/components/InlineError.js +17 -0
- package/dist/crewfoundry/components/InlineError.js.map +1 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
- package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
- package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
- package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
- package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
- package/dist/crewfoundry/lib/analytics.d.ts +1 -6
- package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
- package/dist/crewfoundry/lib/analytics.js +3 -18
- package/dist/crewfoundry/lib/analytics.js.map +1 -1
- package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
- package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
- package/dist/crewfoundry/lib/companyFinance.js +3 -8
- package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
- package/dist/crewfoundry/lib/learning.d.ts +12 -0
- package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
- package/dist/crewfoundry/lib/learning.js +26 -0
- package/dist/crewfoundry/lib/learning.js.map +1 -0
- package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
- package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
- package/dist/crewfoundry/lib/marketplace.js +91 -0
- package/dist/crewfoundry/lib/marketplace.js.map +1 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
- package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.d.ts +138 -78
- package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/dateUtils.d.ts +5 -0
- package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -1
- package/dist/crewfoundry/utils/dateUtils.js +10 -1
- package/dist/crewfoundry/utils/dateUtils.js.map +1 -1
- package/dist/generated/global-types.d.ts +5145 -1627
- package/dist/generated/global-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.d.ts +100373 -34602
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/utils/pageContext.d.ts.map +1 -1
- package/dist/utils/pageContext.js +0 -1
- package/dist/utils/pageContext.js.map +1 -1
- package/package.json +1 -1
- package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
- package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
- package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
- package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
- package/dist/crewfoundry/utils/courseProgress.js +0 -46
- package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceFreelancerProfilePagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Award, Briefcase, DollarSign, MessageSquare, Star } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { RatingStars, getInitials } from '../components/viz';\n\nconst initialsOf = (name: string): string => getInitials(name);\n\nexport function MarketplaceFreelancerProfilePagePage() {\n const navigate = useNavigate();\n const location = useLocation();\n const { marketplaceServices } = useCrewFoundryStore();\n const selectedId = new URLSearchParams(location.search).get('id');\n\n const baseService =\n marketplaceServices.find((service) => service.id === selectedId) ?? marketplaceServices[0];\n const providerName = baseService?.provider ?? '';\n\n const providerServices = useMemo(\n () => marketplaceServices.filter((service) => service.provider === providerName),\n [marketplaceServices, providerName]\n );\n\n const skills = useMemo(\n () => Array.from(new Set(providerServices.flatMap((service) => service.skills))).slice(0, 20),\n [providerServices]\n );\n\n const categories = useMemo(\n () => Array.from(new Set(providerServices.map((service) => service.category))),\n [providerServices]\n );\n\n const avgRating =\n providerServices.length > 0\n ? (\n providerServices.reduce((sum, service) => sum + service.rating, 0) /\n providerServices.length\n ).toFixed(1)\n : '0.0';\n const totalReviews = providerServices.reduce((sum, service) => sum + service.reviews, 0);\n const startingRate =\n providerServices.length > 0 ? Math.min(...providerServices.map((service) => service.price)) : 0;\n const isTopRated = Number(avgRating) >= 4.5 && totalReviews > 0;\n\n if (!baseService) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Provider not found\"\n description=\"This freelancer is no longer available on the marketplace.\"\n />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start gap-6\">\n <div className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text text-2xl font-semibold\">\n {initialsOf(providerName)}\n </div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{providerName}</GradientText>\n </h1>\n {isTopRated ? <Badge>Top Rated</Badge> : null}\n </div>\n <p className=\"text-sm text-text-secondary\">\n {categories.length > 0 ? `Provider · ${categories.join(', ')}` : 'Marketplace provider'}\n </p>\n <PagePurpose className=\"mt-1\">\n Review a freelancer's full profile — skills, listed services, and ratings — to\n decide if they're the right fit before you hire.\n </PagePurpose>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-text-secondary\">\n <RatingStars value={Number(avgRating)} count={totalReviews} showValue size={14} />\n <span className=\"flex items-center gap-1\">\n <Briefcase className=\"h-3 w-3\" /> {providerServices.length} services\n </span>\n </div>\n <div className=\"flex gap-2 pt-1\">\n <Button size=\"sm\" onClick={() => navigate('../marketplace/messaging-page')}>\n <MessageSquare className=\"h-3 w-3 mr-1\" /> Message\n </Button>\n {/* No consultation-booking mutation exists yet — honest disabled control. */}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled\n title=\"Consultation booking is coming soon\"\n aria-label=\"Book consultation — coming soon\"\n >\n Book Consultation · Coming soon\n </Button>\n </div>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n {\n icon: Briefcase,\n label: 'Services',\n value: `${providerServices.length}`,\n color: 'text-status-info-text',\n },\n {\n icon: Star,\n label: 'Avg Rating',\n value: `${avgRating}`,\n color: 'text-status-warning-text',\n },\n {\n icon: Award,\n label: 'Total Reviews',\n value: `${totalReviews}`,\n color: 'text-status-success-text',\n },\n {\n icon: DollarSign,\n label: 'Starting Rate',\n value: `$${startingRate.toLocaleString()}`,\n color: 'text-action-primary-bg',\n },\n ].map((stat) => (\n <Card key={stat.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <stat.icon className={`h-5 w-5 ${stat.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n <p className=\"text-lg font-bold\">{stat.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"lg:col-span-2 space-y-6\">\n <EmphasisPanel>\n <div className=\"mb-2 text-base font-semibold\">Overview</div>\n <p className=\"text-sm text-text-secondary\">\n {providerName} offers {providerServices.length}{' '}\n {providerServices.length === 1 ? 'service' : 'services'} on the marketplace\n {categories.length > 0 ? ` across ${categories.join(', ')}` : ''}, with an average\n rating of {avgRating} from {totalReviews} reviews.\n </p>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Listed Services</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providerServices.map((service) => (\n <button\n key={service.id}\n type=\"button\"\n onClick={() => navigate(`../marketplace/service-details-page?id=${service.id}`)}\n className=\"w-full rounded-lg border p-4 space-y-2 text-left hover:bg-bg-sunken/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg\"\n >\n <div className=\"flex items-center justify-between\">\n <p className=\"font-medium text-sm\">{service.title}</p>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {service.deliveryTime}\n </Badge>\n </div>\n <p className=\"text-xs text-text-secondary\">{service.description}</p>\n <div className=\"flex items-center gap-3 text-xs\">\n <span className=\"font-medium\">\n ${service.price.toLocaleString()}/{service.priceType}\n </span>\n <RatingStars value={service.rating} count={service.reviews} size={12} />\n </div>\n </button>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Skills & Expertise</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1.5\">\n {skills.length > 0 ? (\n skills.map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-xs\">\n {skill}\n </Badge>\n ))\n ) : (\n <p className=\"text-xs text-text-secondary\">No skills listed yet.</p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Service Categories</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-wrap gap-1.5\">\n {categories.length > 0 ? (\n categories.map((category) => (\n <Badge key={category} variant=\"outline\" className=\"text-xs\">\n {category}\n </Badge>\n ))\n ) : (\n <p className=\"text-xs text-text-secondary\">No categories listed yet.</p>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMarketplaceServicesPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.tsx"],"names":[],"mappings":"AAoBA,wBAAgB,sCAAsC,gCA8JrD"}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
|
-
import { getInitials as n } from "../components/viz/lib/format.js";
|
|
4
|
-
import { RatingStars as r } from "../components/viz/RatingStars.js";
|
|
5
|
-
import { SegmentedTabs as i } from "../components/viz/SegmentedTabs.js";
|
|
6
|
-
import "../components/viz/index.js";
|
|
7
|
-
import { useEffect as a, useMemo as o, useState as s } from "react";
|
|
8
|
-
import { Search as c } from "lucide-react";
|
|
9
|
-
import { useNavigate as l } from "react-router";
|
|
10
|
-
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
11
|
-
import { Badge as f, CardContent as p, GlassCard as m, GradientText as h, IllustratedEmptyState as g, Input as _, PagePurpose as v, Pagination as y, ResponsiveTable as b } from "@burdenoff/fe-libs/ui";
|
|
12
|
-
import { usePagination as x } from "@burdenoff/fe-libs/shared/hooks";
|
|
13
|
-
//#region src/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.tsx
|
|
14
|
-
function S() {
|
|
15
|
-
let S = l(), { marketplaceServices: C } = e(), [w, T] = s(""), [E, D] = s("all"), { page: O, pageSize: k, offset: A, setPage: j } = x({ initialPageSize: 10 }), M = o(() => {
|
|
16
|
-
let e = /* @__PURE__ */ new Map();
|
|
17
|
-
for (let t of C) e.set(t.category, (e.get(t.category) ?? 0) + 1);
|
|
18
|
-
let t = [{
|
|
19
|
-
id: "all",
|
|
20
|
-
label: "All",
|
|
21
|
-
count: C.length
|
|
22
|
-
}];
|
|
23
|
-
for (let [n, r] of [...e.entries()].sort((e, t) => e[0].localeCompare(t[0]))) t.push({
|
|
24
|
-
id: n,
|
|
25
|
-
label: n,
|
|
26
|
-
count: r
|
|
27
|
-
});
|
|
28
|
-
return t;
|
|
29
|
-
}, [C]), N = C.filter((e) => E !== "all" && e.category !== E ? !1 : `${e.title} ${e.provider} ${e.category}`.toLowerCase().includes(w.toLowerCase())), P = N.slice(A, A + k);
|
|
30
|
-
return a(() => {
|
|
31
|
-
j(1);
|
|
32
|
-
}, [
|
|
33
|
-
w,
|
|
34
|
-
E,
|
|
35
|
-
j
|
|
36
|
-
]), /* @__PURE__ */ d("div", {
|
|
37
|
-
className: "space-y-6 p-6",
|
|
38
|
-
children: [
|
|
39
|
-
/* @__PURE__ */ d("div", { children: [
|
|
40
|
-
/* @__PURE__ */ u("h1", {
|
|
41
|
-
className: "text-2xl font-semibold",
|
|
42
|
-
children: /* @__PURE__ */ u(h, { children: "Browse Services" })
|
|
43
|
-
}),
|
|
44
|
-
/* @__PURE__ */ d("p", {
|
|
45
|
-
className: "text-sm text-text-secondary",
|
|
46
|
-
children: [C.length, " services available"]
|
|
47
|
-
}),
|
|
48
|
-
/* @__PURE__ */ u(v, {
|
|
49
|
-
className: "mt-1",
|
|
50
|
-
children: "Explore services offered on the marketplace — search and compare offerings to find exactly the help your project needs."
|
|
51
|
-
})
|
|
52
|
-
] }),
|
|
53
|
-
/* @__PURE__ */ d("div", {
|
|
54
|
-
className: "flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",
|
|
55
|
-
children: [/* @__PURE__ */ d("div", {
|
|
56
|
-
className: "relative w-full max-w-sm",
|
|
57
|
-
children: [/* @__PURE__ */ u(c, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ u(_, {
|
|
58
|
-
placeholder: "Search services...",
|
|
59
|
-
className: "pl-9",
|
|
60
|
-
value: w,
|
|
61
|
-
onChange: (e) => T(e.target.value)
|
|
62
|
-
})]
|
|
63
|
-
}), /* @__PURE__ */ u("div", {
|
|
64
|
-
className: "-mx-1 overflow-x-auto px-1 pb-1",
|
|
65
|
-
children: /* @__PURE__ */ u(i, {
|
|
66
|
-
tabs: M,
|
|
67
|
-
value: E,
|
|
68
|
-
onChange: D,
|
|
69
|
-
"aria-label": "Filter services by category"
|
|
70
|
-
})
|
|
71
|
-
})]
|
|
72
|
-
}),
|
|
73
|
-
/* @__PURE__ */ u(m, {
|
|
74
|
-
treatment: "glass",
|
|
75
|
-
glow: !0,
|
|
76
|
-
className: "border-border-seam",
|
|
77
|
-
children: /* @__PURE__ */ u(p, {
|
|
78
|
-
className: "p-4",
|
|
79
|
-
children: /* @__PURE__ */ u(b, {
|
|
80
|
-
columns: [
|
|
81
|
-
{
|
|
82
|
-
key: "service",
|
|
83
|
-
header: "Service",
|
|
84
|
-
priority: "primary",
|
|
85
|
-
cell: (e) => /* @__PURE__ */ d("div", {
|
|
86
|
-
className: "flex items-center gap-2.5",
|
|
87
|
-
children: [/* @__PURE__ */ u("span", {
|
|
88
|
-
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-[11px] font-semibold text-action-primary-text",
|
|
89
|
-
"aria-hidden": "true",
|
|
90
|
-
children: n(e.provider)
|
|
91
|
-
}), /* @__PURE__ */ d("div", {
|
|
92
|
-
className: "min-w-0",
|
|
93
|
-
children: [/* @__PURE__ */ u("p", {
|
|
94
|
-
className: "font-medium",
|
|
95
|
-
children: e.title
|
|
96
|
-
}), /* @__PURE__ */ d("p", {
|
|
97
|
-
className: "truncate text-xs text-text-secondary",
|
|
98
|
-
children: [e.description.slice(0, 60), e.description.length > 60 ? "…" : ""]
|
|
99
|
-
})]
|
|
100
|
-
})]
|
|
101
|
-
})
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
key: "provider",
|
|
105
|
-
header: "Provider",
|
|
106
|
-
priority: "secondary",
|
|
107
|
-
cell: (e) => /* @__PURE__ */ u("span", {
|
|
108
|
-
className: "text-text-secondary",
|
|
109
|
-
children: e.provider
|
|
110
|
-
})
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
key: "category",
|
|
114
|
-
header: "Category",
|
|
115
|
-
priority: "secondary",
|
|
116
|
-
cell: (e) => /* @__PURE__ */ u(f, {
|
|
117
|
-
variant: "outline",
|
|
118
|
-
className: "w-fit h-fit text-[10px]",
|
|
119
|
-
children: e.category
|
|
120
|
-
})
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
key: "price",
|
|
124
|
-
header: "Price",
|
|
125
|
-
priority: "secondary",
|
|
126
|
-
cell: (e) => /* @__PURE__ */ d("span", {
|
|
127
|
-
className: "font-medium",
|
|
128
|
-
children: [
|
|
129
|
-
"$",
|
|
130
|
-
e.price.toLocaleString(),
|
|
131
|
-
"/",
|
|
132
|
-
e.priceType
|
|
133
|
-
]
|
|
134
|
-
})
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
key: "rating",
|
|
138
|
-
header: "Rating",
|
|
139
|
-
priority: "secondary",
|
|
140
|
-
cell: (e) => /* @__PURE__ */ u(r, {
|
|
141
|
-
value: e.rating,
|
|
142
|
-
count: e.reviews,
|
|
143
|
-
size: 12
|
|
144
|
-
})
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
key: "status",
|
|
148
|
-
header: "Status",
|
|
149
|
-
priority: "secondary",
|
|
150
|
-
cell: (e) => /* @__PURE__ */ u(f, {
|
|
151
|
-
variant: e.status === "active" ? "default" : "secondary",
|
|
152
|
-
className: "text-[10px]",
|
|
153
|
-
children: t(e.status)
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
],
|
|
157
|
-
data: P,
|
|
158
|
-
rowKey: (e) => e.id,
|
|
159
|
-
onRowClick: (e) => S(`../marketplace/service-details-page?id=${e.id}`),
|
|
160
|
-
emptyState: /* @__PURE__ */ u(g, {
|
|
161
|
-
illustration: "empty-search",
|
|
162
|
-
title: "No services found",
|
|
163
|
-
description: "Try a different search term to find the help you need."
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
})
|
|
167
|
-
}),
|
|
168
|
-
N.length > 0 ? /* @__PURE__ */ u(y, {
|
|
169
|
-
page: O,
|
|
170
|
-
pageSize: k,
|
|
171
|
-
totalItems: N.length,
|
|
172
|
-
onPageChange: j
|
|
173
|
-
}) : null
|
|
174
|
-
]
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
//#endregion
|
|
178
|
-
export { S as MarketplaceMarketplaceServicesPagePage };
|
|
179
|
-
|
|
180
|
-
//# sourceMappingURL=MarketplaceMarketplaceServicesPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMarketplaceServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport {\n Badge,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Pagination,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Search } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport { useCrewFoundryStore, type MarketplaceService } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { RatingStars, SegmentedTabs, getInitials, type SegmentedTab } from '../components/viz';\n\nexport function MarketplaceMarketplaceServicesPagePage() {\n const navigate = useNavigate();\n const { marketplaceServices } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [category, setCategory] = useState('all');\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 10 });\n\n const categoryTabs = useMemo<SegmentedTab[]>(() => {\n const counts = new Map<string, number>();\n for (const svc of marketplaceServices) {\n counts.set(svc.category, (counts.get(svc.category) ?? 0) + 1);\n }\n const tabs: SegmentedTab[] = [{ id: 'all', label: 'All', count: marketplaceServices.length }];\n for (const [name, count] of [...counts.entries()].sort((a, b) => a[0].localeCompare(b[0]))) {\n tabs.push({ id: name, label: name, count });\n }\n return tabs;\n }, [marketplaceServices]);\n\n const filtered = marketplaceServices.filter((s) => {\n if (category !== 'all' && s.category !== category) {\n return false;\n }\n return `${s.title} ${s.provider} ${s.category}`.toLowerCase().includes(search.toLowerCase());\n });\n const paged = filtered.slice(offset, offset + pageSize);\n\n useEffect(() => {\n setPage(1);\n }, [search, category, setPage]);\n\n const columns: ResponsiveTableColumn<MarketplaceService>[] = [\n {\n key: 'service',\n header: 'Service',\n priority: 'primary',\n cell: (svc) => (\n <div className=\"flex items-center gap-2.5\">\n <span\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-[11px] font-semibold text-action-primary-text\"\n aria-hidden=\"true\"\n >\n {getInitials(svc.provider)}\n </span>\n <div className=\"min-w-0\">\n <p className=\"font-medium\">{svc.title}</p>\n <p className=\"truncate text-xs text-text-secondary\">\n {svc.description.slice(0, 60)}\n {svc.description.length > 60 ? '…' : ''}\n </p>\n </div>\n </div>\n ),\n },\n {\n key: 'provider',\n header: 'Provider',\n priority: 'secondary',\n cell: (svc) => <span className=\"text-text-secondary\">{svc.provider}</span>,\n },\n {\n key: 'category',\n header: 'Category',\n priority: 'secondary',\n cell: (svc) => (\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {svc.category}\n </Badge>\n ),\n },\n {\n key: 'price',\n header: 'Price',\n priority: 'secondary',\n cell: (svc) => (\n <span className=\"font-medium\">\n ${svc.price.toLocaleString()}/{svc.priceType}\n </span>\n ),\n },\n {\n key: 'rating',\n header: 'Rating',\n priority: 'secondary',\n cell: (svc) => <RatingStars value={svc.rating} count={svc.reviews} size={12} />,\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'secondary',\n cell: (svc) => (\n <Badge variant={svc.status === 'active' ? 'default' : 'secondary'} className=\"text-[10px]\">\n {formatEnumLabel(svc.status)}\n </Badge>\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>Browse Services</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {marketplaceServices.length} services available\n </p>\n <PagePurpose className=\"mt-1\">\n Explore services offered on the marketplace — search and compare offerings to find exactly\n the help your project needs.\n </PagePurpose>\n </div>\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"relative w-full max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search services...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"-mx-1 overflow-x-auto px-1 pb-1\">\n <SegmentedTabs\n tabs={categoryTabs}\n value={category}\n onChange={setCategory}\n aria-label=\"Filter services by category\"\n />\n </div>\n </div>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-4\">\n <ResponsiveTable\n columns={columns}\n data={paged}\n rowKey={(svc) => svc.id}\n onRowClick={(svc) => navigate(`../marketplace/service-details-page?id=${svc.id}`)}\n emptyState={\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No services found\"\n description=\"Try a different search term to find the help you need.\"\n />\n }\n />\n </CardContent>\n </GlassCard>\n {filtered.length > 0 ? (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={filtered.length}\n onPageChange={setPage}\n />\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMessagingPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx"],"names":[],"mappings":"AAQA,wBAAgB,4BAA4B,gCA4B3C"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
-
import { CardContent as n, GlassCard as r, GradientText as i, IllustratedEmptyState as a, PagePurpose as o } from "@burdenoff/fe-libs/ui";
|
|
3
|
-
//#region src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx
|
|
4
|
-
function s() {
|
|
5
|
-
return /* @__PURE__ */ t("div", {
|
|
6
|
-
className: "space-y-6 p-6",
|
|
7
|
-
children: [/* @__PURE__ */ t("div", { children: [
|
|
8
|
-
/* @__PURE__ */ e("h1", {
|
|
9
|
-
className: "text-2xl font-semibold",
|
|
10
|
-
children: /* @__PURE__ */ e(i, { children: "Service Messages" })
|
|
11
|
-
}),
|
|
12
|
-
/* @__PURE__ */ e("p", {
|
|
13
|
-
className: "text-sm text-text-secondary",
|
|
14
|
-
children: "Communication with service providers"
|
|
15
|
-
}),
|
|
16
|
-
/* @__PURE__ */ e(o, {
|
|
17
|
-
className: "mt-1",
|
|
18
|
-
children: "Message freelancers and clients about your engagements — keep all marketplace conversations in one organized inbox."
|
|
19
|
-
})
|
|
20
|
-
] }), /* @__PURE__ */ e(r, {
|
|
21
|
-
treatment: "glass",
|
|
22
|
-
glow: !0,
|
|
23
|
-
className: "border-border-seam",
|
|
24
|
-
children: /* @__PURE__ */ e(n, {
|
|
25
|
-
className: "p-6",
|
|
26
|
-
children: /* @__PURE__ */ e(a, {
|
|
27
|
-
illustration: "empty-notifications",
|
|
28
|
-
title: "Direct messaging is coming soon",
|
|
29
|
-
description: "Conversations with providers and clients will appear here once marketplace messaging ships."
|
|
30
|
-
})
|
|
31
|
-
})
|
|
32
|
-
})]
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
export { s as MarketplaceMessagingPagePage };
|
|
37
|
-
|
|
38
|
-
//# sourceMappingURL=MarketplaceMessagingPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMessagingPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMessagingPagePage.tsx"],"sourcesContent":["import {\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\n\nexport function MarketplaceMessagingPagePage() {\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Service Messages</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Communication with service providers</p>\n <PagePurpose className=\"mt-1\">\n Message freelancers and clients about your engagements — keep all marketplace\n conversations in one organized inbox.\n </PagePurpose>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-6\">\n {/* Direct marketplace messaging has no backend yet. We show an honest\n coming-soon empty state rather than synthesizing message threads\n from unrelated notification data. */}\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"Direct messaging is coming soon\"\n description=\"Conversations with providers and clients will appear here once marketplace messaging ships.\"\n />\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;AAQA,SAAgB,IAA+B;AAC7C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,oBAA+B,CAAA;IAC1C,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAAwC,CAAA;GACnF,kBAAC,GAAD;IAAa,WAAU;cAAO;IAGhB,CAAA;GACV,EAAA,CAAA,EAEN,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,GAAD;IAAa,WAAU;cAIrB,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACU,CAAA;GACJ,CAAA,CACR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceProjectDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceProjectDetailsPagePage.tsx"],"names":[],"mappings":"AAgBA,wBAAgB,iCAAiC,gCAmJhD"}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
|
-
import { Calendar as n, DollarSign as r, MessageSquare as i, Users as a } from "lucide-react";
|
|
4
|
-
import { useLocation as o, useNavigate as s } from "react-router";
|
|
5
|
-
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
-
import { Badge as u, Card as d, CardContent as f, EmphasisPanel as p, GradientText as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _, Spinner as v } from "@burdenoff/fe-libs/ui";
|
|
7
|
-
//#region src/crewfoundry/pages/MarketplaceProjectDetailsPagePage.tsx
|
|
8
|
-
function y() {
|
|
9
|
-
let y = s(), b = o(), { projects: x, initialized: S } = e(), C = new URLSearchParams(b.search).get("id"), w = x.find((e) => e.id === C) ?? x[0];
|
|
10
|
-
return !S && !w ? /* @__PURE__ */ c("div", {
|
|
11
|
-
className: "flex min-h-[60vh] items-center justify-center p-6",
|
|
12
|
-
children: /* @__PURE__ */ c(v, { size: "lg" })
|
|
13
|
-
}) : w ? /* @__PURE__ */ l("div", {
|
|
14
|
-
className: "space-y-6 p-6 max-w-4xl",
|
|
15
|
-
children: [
|
|
16
|
-
/* @__PURE__ */ l("div", {
|
|
17
|
-
className: "flex items-center justify-between",
|
|
18
|
-
children: [/* @__PURE__ */ l("div", { children: [
|
|
19
|
-
/* @__PURE__ */ c("h1", {
|
|
20
|
-
className: "text-2xl font-semibold",
|
|
21
|
-
children: /* @__PURE__ */ c(m, { children: w.name })
|
|
22
|
-
}),
|
|
23
|
-
/* @__PURE__ */ c("p", {
|
|
24
|
-
className: "text-sm text-text-secondary",
|
|
25
|
-
children: w.description
|
|
26
|
-
}),
|
|
27
|
-
/* @__PURE__ */ c(_, {
|
|
28
|
-
className: "mt-2",
|
|
29
|
-
children: "The full picture of a marketplace project — scope, budget, timeline, and progress — so you can track delivery and stay aligned with the team doing the work."
|
|
30
|
-
})
|
|
31
|
-
] }), /* @__PURE__ */ c(u, {
|
|
32
|
-
variant: w.status === "active" ? "default" : "secondary",
|
|
33
|
-
children: t(w.status)
|
|
34
|
-
})]
|
|
35
|
-
}),
|
|
36
|
-
/* @__PURE__ */ c(g, {
|
|
37
|
-
storageKey: "crewfoundry-marketplace-project-details",
|
|
38
|
-
steps: [
|
|
39
|
-
{
|
|
40
|
-
id: "message",
|
|
41
|
-
label: "Message the team",
|
|
42
|
-
description: "Coordinate on scope, blockers, and next milestones.",
|
|
43
|
-
icon: /* @__PURE__ */ c(i, { className: "h-4 w-4" }),
|
|
44
|
-
onClick: () => y("../marketplace/messaging-page")
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
id: "bookings",
|
|
48
|
-
label: "Review bookings",
|
|
49
|
-
description: "Check the engagements tied to this project.",
|
|
50
|
-
icon: /* @__PURE__ */ c(n, { className: "h-4 w-4" }),
|
|
51
|
-
onClick: () => y("../marketplace/booking-management-page")
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
id: "earnings",
|
|
55
|
-
label: "Track earnings",
|
|
56
|
-
description: "See payouts and balances connected to your work.",
|
|
57
|
-
icon: /* @__PURE__ */ c(r, { className: "h-4 w-4" }),
|
|
58
|
-
onClick: () => y("../marketplace/earnings-page")
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
}),
|
|
62
|
-
/* @__PURE__ */ l("div", {
|
|
63
|
-
className: "grid gap-4 md:grid-cols-4",
|
|
64
|
-
children: [
|
|
65
|
-
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
66
|
-
className: "p-4 text-center",
|
|
67
|
-
children: [
|
|
68
|
-
/* @__PURE__ */ c(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
69
|
-
/* @__PURE__ */ l("p", {
|
|
70
|
-
className: "text-lg font-bold",
|
|
71
|
-
children: [
|
|
72
|
-
"$",
|
|
73
|
-
(w.budget / 1e3).toFixed(0),
|
|
74
|
-
"K"
|
|
75
|
-
]
|
|
76
|
-
}),
|
|
77
|
-
/* @__PURE__ */ c("p", {
|
|
78
|
-
className: "text-xs text-text-secondary",
|
|
79
|
-
children: "Budget"
|
|
80
|
-
})
|
|
81
|
-
]
|
|
82
|
-
}) }),
|
|
83
|
-
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
84
|
-
className: "p-4 text-center",
|
|
85
|
-
children: [
|
|
86
|
-
/* @__PURE__ */ c(r, { className: "h-5 w-5 mx-auto text-status-success-text mb-1" }),
|
|
87
|
-
/* @__PURE__ */ l("p", {
|
|
88
|
-
className: "text-lg font-bold",
|
|
89
|
-
children: [
|
|
90
|
-
"$",
|
|
91
|
-
(w.spent / 1e3).toFixed(0),
|
|
92
|
-
"K"
|
|
93
|
-
]
|
|
94
|
-
}),
|
|
95
|
-
/* @__PURE__ */ c("p", {
|
|
96
|
-
className: "text-xs text-text-secondary",
|
|
97
|
-
children: "Spent"
|
|
98
|
-
})
|
|
99
|
-
]
|
|
100
|
-
}) }),
|
|
101
|
-
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
102
|
-
className: "p-4 text-center",
|
|
103
|
-
children: [
|
|
104
|
-
/* @__PURE__ */ c(a, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
105
|
-
/* @__PURE__ */ c("p", {
|
|
106
|
-
className: "text-lg font-bold",
|
|
107
|
-
children: w.teamName
|
|
108
|
-
}),
|
|
109
|
-
/* @__PURE__ */ c("p", {
|
|
110
|
-
className: "text-xs text-text-secondary",
|
|
111
|
-
children: "Team"
|
|
112
|
-
})
|
|
113
|
-
]
|
|
114
|
-
}) }),
|
|
115
|
-
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
116
|
-
className: "p-4 text-center",
|
|
117
|
-
children: [
|
|
118
|
-
/* @__PURE__ */ c(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
119
|
-
/* @__PURE__ */ c("p", {
|
|
120
|
-
className: "text-lg font-bold",
|
|
121
|
-
children: w.endDate
|
|
122
|
-
}),
|
|
123
|
-
/* @__PURE__ */ c("p", {
|
|
124
|
-
className: "text-xs text-text-secondary",
|
|
125
|
-
children: "Deadline"
|
|
126
|
-
})
|
|
127
|
-
]
|
|
128
|
-
}) })
|
|
129
|
-
]
|
|
130
|
-
}),
|
|
131
|
-
/* @__PURE__ */ l(p, { children: [
|
|
132
|
-
/* @__PURE__ */ c("div", {
|
|
133
|
-
className: "mb-2 text-lg font-semibold",
|
|
134
|
-
children: "Progress"
|
|
135
|
-
}),
|
|
136
|
-
/* @__PURE__ */ l("div", {
|
|
137
|
-
className: "space-y-2",
|
|
138
|
-
children: [/* @__PURE__ */ l("div", {
|
|
139
|
-
className: "flex justify-between text-sm",
|
|
140
|
-
children: [/* @__PURE__ */ l("span", { children: [
|
|
141
|
-
w.completedTasks,
|
|
142
|
-
" of ",
|
|
143
|
-
w.tasks,
|
|
144
|
-
" tasks"
|
|
145
|
-
] }), /* @__PURE__ */ l("span", {
|
|
146
|
-
className: "font-medium",
|
|
147
|
-
children: [w.progress, "%"]
|
|
148
|
-
})]
|
|
149
|
-
}), /* @__PURE__ */ c("div", {
|
|
150
|
-
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
151
|
-
children: /* @__PURE__ */ c("div", {
|
|
152
|
-
className: "h-3 bg-action-primary-bg rounded",
|
|
153
|
-
style: { width: `${w.progress}%` }
|
|
154
|
-
})
|
|
155
|
-
})]
|
|
156
|
-
}),
|
|
157
|
-
/* @__PURE__ */ l("div", {
|
|
158
|
-
className: "grid grid-cols-2 gap-4 mt-4",
|
|
159
|
-
children: [
|
|
160
|
-
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
161
|
-
className: "text-xs text-text-secondary",
|
|
162
|
-
children: "Manager"
|
|
163
|
-
}), /* @__PURE__ */ c("p", {
|
|
164
|
-
className: "text-sm font-medium",
|
|
165
|
-
children: w.managerName
|
|
166
|
-
})] }),
|
|
167
|
-
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
168
|
-
className: "text-xs text-text-secondary",
|
|
169
|
-
children: "Priority"
|
|
170
|
-
}), /* @__PURE__ */ c(u, {
|
|
171
|
-
variant: w.priority === "critical" ? "destructive" : w.priority === "high" ? "default" : "secondary",
|
|
172
|
-
children: t(w.priority)
|
|
173
|
-
})] }),
|
|
174
|
-
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
175
|
-
className: "text-xs text-text-secondary",
|
|
176
|
-
children: "Start Date"
|
|
177
|
-
}), /* @__PURE__ */ c("p", {
|
|
178
|
-
className: "text-sm",
|
|
179
|
-
children: w.startDate
|
|
180
|
-
})] }),
|
|
181
|
-
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
182
|
-
className: "text-xs text-text-secondary",
|
|
183
|
-
children: "End Date"
|
|
184
|
-
}), /* @__PURE__ */ c("p", {
|
|
185
|
-
className: "text-sm",
|
|
186
|
-
children: w.endDate
|
|
187
|
-
})] })
|
|
188
|
-
]
|
|
189
|
-
})
|
|
190
|
-
] })
|
|
191
|
-
]
|
|
192
|
-
}) : /* @__PURE__ */ c("div", {
|
|
193
|
-
className: "p-6",
|
|
194
|
-
children: /* @__PURE__ */ c(h, {
|
|
195
|
-
illustration: "empty-search",
|
|
196
|
-
title: "Project not found",
|
|
197
|
-
description: "This project is no longer available."
|
|
198
|
-
})
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
//#endregion
|
|
202
|
-
export { y as MarketplaceProjectDetailsPagePage };
|
|
203
|
-
|
|
204
|
-
//# sourceMappingURL=MarketplaceProjectDetailsPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceProjectDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceProjectDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, DollarSign, MessageSquare, Users } from 'lucide-react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function MarketplaceProjectDetailsPagePage() {\n const navigate = useNavigate();\n const location = useLocation();\n const { projects, initialized } = useCrewFoundryStore();\n const selectedId = new URLSearchParams(location.search).get('id');\n const project = projects.find((p) => p.id === selectedId) ?? projects[0];\n if (!initialized && !project) {\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 (!project)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Project not found\"\n description=\"This project is no longer available.\"\n />\n </div>\n );\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{project.name}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{project.description}</p>\n <PagePurpose className=\"mt-2\">\n The full picture of a marketplace project — scope, budget, timeline, and progress — so\n you can track delivery and stay aligned with the team doing the work.\n </PagePurpose>\n </div>\n <Badge variant={project.status === 'active' ? 'default' : 'secondary'}>\n {formatEnumLabel(project.status)}\n </Badge>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-marketplace-project-details\"\n steps={[\n {\n id: 'message',\n label: 'Message the team',\n description: 'Coordinate on scope, blockers, and next milestones.',\n icon: <MessageSquare className=\"h-4 w-4\" />,\n onClick: () => navigate('../marketplace/messaging-page'),\n },\n {\n id: 'bookings',\n label: 'Review bookings',\n description: 'Check the engagements tied to this project.',\n icon: <Calendar className=\"h-4 w-4\" />,\n onClick: () => navigate('../marketplace/booking-management-page'),\n },\n {\n id: 'earnings',\n label: 'Track earnings',\n description: 'See payouts and balances connected to your work.',\n icon: <DollarSign className=\"h-4 w-4\" />,\n onClick: () => navigate('../marketplace/earnings-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">${(project.budget / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Budget</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-status-success-text mb-1\" />\n <p className=\"text-lg font-bold\">${(project.spent / 1000).toFixed(0)}K</p>\n <p className=\"text-xs text-text-secondary\">Spent</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.teamName}</p>\n <p className=\"text-xs text-text-secondary\">Team</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{project.endDate}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">Progress</div>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {project.completedTasks} of {project.tasks} tasks\n </span>\n <span className=\"font-medium\">{project.progress}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mt-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Manager</p>\n <p className=\"text-sm font-medium\">{project.managerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Priority</p>\n <Badge\n variant={\n project.priority === 'critical'\n ? 'destructive'\n : project.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n >\n {formatEnumLabel(project.priority)}\n </Badge>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Start Date</p>\n <p className=\"text-sm\">{project.startDate}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">End Date</p>\n <p className=\"text-sm\">{project.endDate}</p>\n </div>\n </div>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsEscrowPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/PaymentsEscrowPagePage.tsx"],"names":[],"mappings":"AAWA,wBAAgB,sBAAsB,gCA2CrC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { Lock as e } from "lucide-react";
|
|
2
|
-
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
-
import { Badge as r, Button as i, CardContent as a, GlassCard as o, GradientText as s, IllustratedEmptyState as c, PagePurpose as l } from "@burdenoff/fe-libs/ui";
|
|
4
|
-
//#region src/crewfoundry/pages/PaymentsEscrowPagePage.tsx
|
|
5
|
-
function u() {
|
|
6
|
-
return /* @__PURE__ */ n("div", {
|
|
7
|
-
className: "space-y-6 p-6",
|
|
8
|
-
children: [/* @__PURE__ */ n("div", {
|
|
9
|
-
className: "flex items-center justify-between",
|
|
10
|
-
children: [/* @__PURE__ */ n("div", { children: [
|
|
11
|
-
/* @__PURE__ */ t("h1", {
|
|
12
|
-
className: "text-2xl font-semibold",
|
|
13
|
-
children: /* @__PURE__ */ t(s, { children: "Escrow" })
|
|
14
|
-
}),
|
|
15
|
-
/* @__PURE__ */ t("p", {
|
|
16
|
-
className: "text-sm text-text-secondary",
|
|
17
|
-
children: "Secure payment holding for service contracts"
|
|
18
|
-
}),
|
|
19
|
-
/* @__PURE__ */ t(l, {
|
|
20
|
-
className: "mt-1",
|
|
21
|
-
children: "Hold and release project funds safely in escrow — protect both sides until milestones are met and work is approved."
|
|
22
|
-
})
|
|
23
|
-
] }), /* @__PURE__ */ n("div", {
|
|
24
|
-
className: "flex items-center gap-2",
|
|
25
|
-
children: [/* @__PURE__ */ t(r, {
|
|
26
|
-
variant: "secondary",
|
|
27
|
-
className: "text-[10px]",
|
|
28
|
-
children: "Coming soon"
|
|
29
|
-
}), /* @__PURE__ */ n(i, {
|
|
30
|
-
size: "sm",
|
|
31
|
-
disabled: !0,
|
|
32
|
-
"aria-label": "Fund escrow (coming soon)",
|
|
33
|
-
title: "Escrow funding is coming soon",
|
|
34
|
-
children: [/* @__PURE__ */ t(e, { className: "mr-1 h-4 w-4" }), "Fund Escrow"]
|
|
35
|
-
})]
|
|
36
|
-
})]
|
|
37
|
-
}), /* @__PURE__ */ t(o, {
|
|
38
|
-
treatment: "glass",
|
|
39
|
-
glow: !0,
|
|
40
|
-
className: "border-border-seam",
|
|
41
|
-
children: /* @__PURE__ */ t(a, {
|
|
42
|
-
className: "p-6",
|
|
43
|
-
children: /* @__PURE__ */ t(c, {
|
|
44
|
-
illustration: "empty-data",
|
|
45
|
-
title: "Escrow is on the way",
|
|
46
|
-
description: "Milestone-based escrow — funding, holding, and releasing project payments against approved work — isn't available yet. When it launches you'll be able to fund contracts, track held balances, and release funds as milestones are approved."
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
})]
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
//#endregion
|
|
53
|
-
export { u as PaymentsEscrowPagePage };
|
|
54
|
-
|
|
55
|
-
//# sourceMappingURL=PaymentsEscrowPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsEscrowPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/PaymentsEscrowPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Lock } from 'lucide-react';\n\nexport function PaymentsEscrowPagePage() {\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>Escrow</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Secure payment holding for service contracts\n </p>\n <PagePurpose className=\"mt-1\">\n Hold and release project funds safely in escrow — protect both sides until milestones\n are met and work is approved.\n </PagePurpose>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n Coming soon\n </Badge>\n <Button\n size=\"sm\"\n disabled\n aria-label=\"Fund escrow (coming soon)\"\n title=\"Escrow funding is coming soon\"\n >\n <Lock className=\"mr-1 h-4 w-4\" />\n Fund Escrow\n </Button>\n </div>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"Escrow is on the way\"\n description=\"Milestone-based escrow — funding, holding, and releasing project payments against approved work — isn't available yet. When it launches you'll be able to fund contracts, track held balances, and release funds as milestones are approved.\"\n />\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;;AAWA,SAAgB,IAAyB;AACvC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,UAAqB,CAAA;KAChC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA;IACJ,kBAAC,GAAD;KAAa,WAAU;eAAO;KAGhB,CAAA;IACV,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAO,SAAQ;KAAY,WAAU;eAAc;KAE3C,CAAA,EACR,kBAAC,GAAD;KACE,MAAK;KACL,UAAA;KACA,cAAW;KACX,OAAM;eAJR,CAME,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,cAE1B;OACL;MACF;MAEN,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACU,CAAA;GACJ,CAAA,CACR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PaymentsInvoicesPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/PaymentsInvoicesPagePage.tsx"],"names":[],"mappings":"AA8GA,wBAAgB,wBAAwB,gCAyQvC"}
|