@burdenoff/microfe-proserviceworld 2026.626.2 → 2026.706.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/index.js +2 -3
  2. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  3. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  4. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  5. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  6. package/dist/proserviceworld/ProServiceWorldRoot.js +92 -136
  7. package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -1
  8. package/dist/proserviceworld/ProServiceWorldRoutes.js +18 -26
  9. package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -1
  10. package/dist/proserviceworld/components/ui.js +273 -0
  11. package/dist/proserviceworld/components/ui.js.map +1 -0
  12. package/dist/proserviceworld/hooks/useFiles.js +45 -0
  13. package/dist/proserviceworld/hooks/useFiles.js.map +1 -0
  14. package/dist/proserviceworld/hooks/useProServiceWorldApi.js +416 -0
  15. package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -0
  16. package/dist/proserviceworld/index.js +0 -1
  17. package/dist/proserviceworld/pages/AnalyticsPage.js +163 -475
  18. package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
  19. package/dist/proserviceworld/pages/ClientDetailPage.js +238 -0
  20. package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -0
  21. package/dist/proserviceworld/pages/ClientsPage.js +295 -0
  22. package/dist/proserviceworld/pages/ClientsPage.js.map +1 -0
  23. package/dist/proserviceworld/pages/CompliancePage.js +307 -0
  24. package/dist/proserviceworld/pages/CompliancePage.js.map +1 -0
  25. package/dist/proserviceworld/pages/ConflictsPage.js +234 -0
  26. package/dist/proserviceworld/pages/ConflictsPage.js.map +1 -0
  27. package/dist/proserviceworld/pages/DashboardPage.js +179 -632
  28. package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
  29. package/dist/proserviceworld/pages/DocumentsPage.js +235 -539
  30. package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
  31. package/dist/proserviceworld/pages/EngagementDetailPage.js +444 -0
  32. package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -0
  33. package/dist/proserviceworld/pages/EngagementsPage.js +256 -0
  34. package/dist/proserviceworld/pages/EngagementsPage.js.map +1 -0
  35. package/dist/proserviceworld/pages/InvoicesPage.js +303 -0
  36. package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -0
  37. package/dist/proserviceworld/pages/MattersPage.js +275 -0
  38. package/dist/proserviceworld/pages/MattersPage.js.map +1 -0
  39. package/dist/proserviceworld/pages/PracticeAreasPage.js +176 -0
  40. package/dist/proserviceworld/pages/PracticeAreasPage.js.map +1 -0
  41. package/dist/proserviceworld/pages/TimePage.js +310 -0
  42. package/dist/proserviceworld/pages/TimePage.js.map +1 -0
  43. package/dist/proserviceworld/utils/cn.js +10 -0
  44. package/dist/proserviceworld/utils/cn.js.map +1 -0
  45. package/dist/proserviceworld/utils/nav.js +11 -0
  46. package/dist/proserviceworld/utils/nav.js.map +1 -0
  47. package/package.json +3 -2
  48. package/dist/proserviceworld/pages/AdminReportsPage.js +0 -579
  49. package/dist/proserviceworld/pages/AdminReportsPage.js.map +0 -1
  50. package/dist/proserviceworld/pages/AdminUsersPage.js +0 -468
  51. package/dist/proserviceworld/pages/AdminUsersPage.js.map +0 -1
  52. package/dist/proserviceworld/pages/BookingsPage.js +0 -446
  53. package/dist/proserviceworld/pages/BookingsPage.js.map +0 -1
  54. package/dist/proserviceworld/pages/MessagesPage.js +0 -238
  55. package/dist/proserviceworld/pages/MessagesPage.js.map +0 -1
  56. package/dist/proserviceworld/pages/PaymentsPage.js +0 -537
  57. package/dist/proserviceworld/pages/PaymentsPage.js.map +0 -1
  58. package/dist/proserviceworld/pages/ProjectsPage.js +0 -627
  59. package/dist/proserviceworld/pages/ProjectsPage.js.map +0 -1
  60. package/dist/proserviceworld/pages/ProviderDetailPage.js +0 -538
  61. package/dist/proserviceworld/pages/ProviderDetailPage.js.map +0 -1
  62. package/dist/proserviceworld/pages/ProvidersPage.js +0 -347
  63. package/dist/proserviceworld/pages/ProvidersPage.js.map +0 -1
  64. package/dist/proserviceworld/pages/ReviewsPage.js +0 -356
  65. package/dist/proserviceworld/pages/ReviewsPage.js.map +0 -1
  66. package/dist/proserviceworld/pages/ServiceDetailsPage.js +0 -631
  67. package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +0 -1
  68. package/dist/proserviceworld/pages/ServicesPage.js +0 -344
  69. package/dist/proserviceworld/pages/ServicesPage.js.map +0 -1
  70. package/dist/proserviceworld/pages/VerificationPage.js +0 -370
  71. package/dist/proserviceworld/pages/VerificationPage.js.map +0 -1
  72. package/dist/proserviceworld/store/proserviceworldStore.js +0 -2490
  73. package/dist/proserviceworld/store/proserviceworldStore.js.map +0 -1
  74. package/dist/proserviceworld/utils/i18n.js +0 -15
  75. package/dist/proserviceworld/utils/i18n.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DashboardPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Button,\n Badge,\n GlassCard,\n EmphasisPanel,\n AuroraBackground,\n GradientText,\n CTAOverflowMenu,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Calendar,\n Star,\n DollarSign,\n TrendingUp,\n Users,\n CheckCircle,\n AlertCircle,\n Clock,\n BookOpen,\n BarChart3,\n Bell,\n Plus,\n Eye,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport { tWithFallback } from '../utils/i18n';\n\ntype DashboardView = 'client' | 'provider' | 'admin' | 'team';\n\nexport function DashboardPage() {\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n const { bookings, providers, services, reviews, notifications } = useProServiceWorldStore();\n const [activeView, setActiveView] = useState<DashboardView>('client');\n\n const activeBookings = bookings.filter((b) => b.status === 'in_progress');\n const completedBookings = bookings.filter((b) => b.status === 'completed');\n const pendingBookings = bookings.filter((b) => b.status === 'pending');\n const totalSpent = bookings\n .filter((b) => b.paymentStatus === 'completed')\n .reduce((sum, b) => sum + b.budget, 0);\n const unreadNotifications = notifications.filter((n) => !n.read).length;\n\n const viewTabs: { id: DashboardView; label: string }[] = [\n { id: 'client', label: tr('proserviceworld.dashboard.views.client', 'Client') },\n { id: 'provider', label: tr('proserviceworld.dashboard.views.provider', 'Provider') },\n { id: 'admin', label: tr('proserviceworld.dashboard.views.admin', 'Admin') },\n { id: 'team', label: tr('proserviceworld.dashboard.views.team', 'Team') },\n ];\n const bookingStatusLabel = (status: string): string => {\n if (status === 'completed')\n return tr('proserviceworld.shared.bookingStatus.completed', 'completed');\n if (status === 'in_progress')\n return tr('proserviceworld.shared.bookingStatus.inProgress', 'in progress');\n if (status === 'pending') return tr('proserviceworld.shared.bookingStatus.pending', 'pending');\n return tr('proserviceworld.shared.bookingStatus.cancelled', 'cancelled');\n };\n\n return (\n <div className=\"space-y-6 p-6 bg-bg-canvas min-h-screen\">\n {/* Hero header — the ONE aurora backdrop for this MFE. Sits at -z-10 behind\n the header; never moves content; static under reduced motion. */}\n <div className=\"relative overflow-hidden rounded-card -mx-2 px-2 pt-1\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n <GradientText>{tr('proserviceworld.dashboard.title', 'Dashboard')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.subtitle',\n 'Welcome back! Here is your activity overview.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex bg-bg-sunken rounded-lg p-1\">\n {viewTabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveView(tab.id)}\n aria-pressed={activeView === tab.id}\n className={`px-3 py-1.5 rounded text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus ${\n activeView === tab.id\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {unreadNotifications > 0 && (\n <Button variant=\"outline\" size=\"sm\" aria-label={`${unreadNotifications} unread`}>\n <Bell className=\"h-4 w-4 mr-1\" />\n <span className=\"tabular-nums\">{unreadNotifications}</span>\n </Button>\n )}\n </div>\n </div>\n </div>\n\n <PagePurpose icon={<BarChart3 className=\"h-4 w-4\" />}>\n {tr(\n 'proserviceworld.dashboard.purpose',\n 'Your command center for ProServiceWorld. Switch between Client, Provider, Admin, and Team views to track bookings, monitor earnings and ratings, watch platform activity, and jump straight to the actions that matter to your role.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"proserviceworld-dashboard\"\n steps={[\n {\n id: 'find-services',\n label: tr('proserviceworld.dashboard.nextSteps.findServices', 'Find a service to book'),\n description: tr(\n 'proserviceworld.dashboard.nextSteps.findServicesDesc',\n 'Browse verified providers and book the help you need.'\n ),\n icon: <BookOpen className=\"h-4 w-4\" />,\n onClick: () => setActiveView('client'),\n },\n {\n id: 'review-bookings',\n label: tr('proserviceworld.dashboard.nextSteps.reviewBookings', 'Review active bookings'),\n description: tr(\n 'proserviceworld.dashboard.nextSteps.reviewBookingsDesc',\n 'Check progress and status on work in flight.'\n ),\n icon: <Calendar className=\"h-4 w-4\" />,\n onClick: () => setActiveView('client'),\n done: activeBookings.length > 0,\n },\n {\n id: 'provider-view',\n label: tr('proserviceworld.dashboard.nextSteps.providerView', 'Grow your provider business'),\n description: tr(\n 'proserviceworld.dashboard.nextSteps.providerViewDesc',\n 'Switch to the Provider view to manage services and earnings.'\n ),\n icon: <TrendingUp className=\"h-4 w-4\" />,\n onClick: () => setActiveView('provider'),\n },\n ]}\n />\n\n {/* Client Dashboard */}\n {activeView === 'client' && (\n <div className=\"space-y-6\">\n {/* Welcome Card — the single emphasised insight zone for this view */}\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-bold tracking-tight\">\n {tr('proserviceworld.dashboard.client.welcomeTitle', 'Welcome back, Alex!')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.client.welcomeSubtitle',\n 'Manage your services, bookings, and find new providers'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.client.actions.findServices', 'Find Services')}\n </Button>\n </div>\n </EmphasisPanel>\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.metrics.activeBookings', 'Active Bookings')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-status-warning-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">4.8</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.metrics.avgRatingGiven', 'Avg. Rating Given')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-status-success-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{completedBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.metrics.completedProjects', 'Completed Projects')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">${totalSpent.toLocaleString()}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.metrics.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </GlassCard>\n </div>\n\n {/* Recent Bookings */}\n <Card className=\"border-border-seam\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr('proserviceworld.dashboard.client.sections.recentBookings', 'Recent Bookings')}\n </CardTitle>\n <Button variant=\"outline\" size=\"sm\">\n {tr('proserviceworld.shared.actions.viewAll', 'View All')}\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {bookings.slice(0, 5).map((booking) => (\n <div\n key={booking.id}\n className=\"flex items-center justify-between p-4 border border-border-seam rounded-lg transition-shadow hover:shadow-pop\"\n >\n <div className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-accent-soft flex items-center justify-center\">\n <BookOpen className=\"h-5 w-5 text-text-primary\" />\n </div>\n <div>\n <p className=\"font-medium\">{booking.title}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.booking.provider', 'Provider: {{name}}', {\n name: booking.providerName,\n })}\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium text-sm tabular-nums\">\n ${booking.budget.toLocaleString()}\n </p>\n <Badge\n variant={\n booking.status === 'completed'\n ? 'default'\n : booking.status === 'in_progress'\n ? 'secondary'\n : 'outline'\n }\n >\n {bookingStatusLabel(booking.status)}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Provider Dashboard */}\n {activeView === 'provider' && (\n <div className=\"space-y-6\">\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-bold tracking-tight\">\n {tr('proserviceworld.dashboard.provider.welcomeTitle', 'Welcome back, Provider!')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.provider.welcomeSubtitle',\n 'Manage your services, bookings, and grow your business'\n )}\n </p>\n </div>\n <CTAOverflowMenu\n primary={{\n label: tr('proserviceworld.dashboard.provider.actions.editProfile', 'Edit Profile'),\n onSelect: () => {},\n icon: <Eye className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service'),\n onSelect: () => {},\n icon: <Plus className=\"h-4 w-4\" />,\n },\n ]}\n />\n </div>\n </EmphasisPanel>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-status-warning-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">4.9</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.provider.metrics.rating', 'Rating ({{count}} reviews)', {\n count: reviews.length,\n })}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.provider.metrics.activeProjects', 'Active Projects')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <TrendingUp className=\"h-8 w-8 text-status-success-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">98%</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.provider.metrics.completionRate', 'Completion Rate')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">$12,850</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.provider.metrics.thisMonth', 'This Month')}\n </p>\n </div>\n </div>\n </GlassCard>\n </div>\n\n <Card className=\"border-border-seam\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr('proserviceworld.dashboard.provider.sections.yourServices', 'Your Services')}\n </CardTitle>\n <CTAOverflowMenu\n primary={{\n label: tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service'),\n onSelect: () => {},\n icon: <Plus className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: tr('proserviceworld.shared.actions.viewAll', 'View All'),\n onSelect: () => {},\n icon: <Eye className=\"h-4 w-4\" />,\n },\n ]}\n />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {services.slice(0, 3).map((service) => (\n <div\n key={service.id}\n className=\"border border-border-seam rounded-lg p-4 transition-shadow hover:shadow-pop\"\n >\n <h4 className=\"font-medium mb-1\">{service.title}</h4>\n <p className=\"text-sm text-text-secondary mb-2 line-clamp-2\">\n {service.description}\n </p>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium tabular-nums\">\n {tr('proserviceworld.services.card.pricing.from', 'From ${{amount}}', {\n amount: service.pricing.basePrice.toLocaleString(),\n })}\n </span>\n <Badge variant=\"secondary\">\n {tr('proserviceworld.dashboard.provider.service.bookings', '{{count}} bookings', {\n count: service.totalBookings,\n })}\n </Badge>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Admin Dashboard */}\n {activeView === 'admin' && (\n <div className=\"space-y-6\">\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-bold tracking-tight\">\n {tr('proserviceworld.dashboard.admin.title', 'Admin Dashboard')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.admin.subtitle',\n 'Monitor platform activity and manage users'\n )}\n </p>\n </div>\n <CTAOverflowMenu\n primary={{\n label: tr('proserviceworld.dashboard.admin.actions.viewReports', 'View Reports'),\n onSelect: () => {},\n icon: <BarChart3 className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: tr('proserviceworld.dashboard.admin.actions.manageUsers', 'Manage Users'),\n onSelect: () => {},\n icon: <Users className=\"h-4 w-4\" />,\n },\n ]}\n />\n </div>\n </EmphasisPanel>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{providers.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.admin.metrics.totalProviders', 'Total Providers')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <BookOpen className=\"h-8 w-8 text-status-success-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{services.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.admin.metrics.totalServices', 'Total Services')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{bookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.admin.metrics.totalBookings', 'Total Bookings')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-status-warning-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">$45,670</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.admin.metrics.totalRevenue', 'Total Revenue')}\n </p>\n </div>\n </div>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.admin.sections.recentProviders', 'Recent Providers')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers.slice(0, 3).map((provider) => (\n <div key={provider.id} className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-accent-soft flex items-center justify-center\">\n <span className=\"text-text-primary font-medium\">\n {provider.name.charAt(0)}\n </span>\n </div>\n <div className=\"flex-1\">\n <p className=\"font-medium\">{provider.businessName}</p>\n <p className=\"text-sm text-text-secondary\">{provider.specializations[0]}</p>\n </div>\n <div className=\"flex items-center text-sm\">\n <Star className=\"h-4 w-4 text-status-warning-text mr-1\" />\n <span className=\"tabular-nums\">{provider.rating.toFixed(1)}</span>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.admin.sections.platformAlerts', 'Platform Alerts')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-start space-x-3\">\n <AlertCircle className=\"h-5 w-5 text-status-warning-text mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.title',\n 'Pending Verifications'\n )}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.description',\n '3 providers awaiting verification'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <CheckCircle className=\"h-5 w-5 text-status-success-text mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr('proserviceworld.dashboard.admin.alerts.systemStatus.title', 'System Status')}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.systemStatus.description',\n 'All systems operational'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <Bell className=\"h-5 w-5 text-accent-blue mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr('proserviceworld.dashboard.admin.alerts.newReviews.title', 'New Reviews')}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.newReviews.description',\n '12 new reviews this week'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n )}\n\n {/* Team Member Dashboard */}\n {activeView === 'team' && (\n <div className=\"space-y-6\">\n <EmphasisPanel>\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-bold tracking-tight\">\n {tr('proserviceworld.dashboard.team.title', 'Welcome, Team Member!')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr('proserviceworld.dashboard.team.subtitle', 'Manage assigned tasks and projects')}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Calendar className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.team.actions.myTasks', 'My Tasks')}\n </Button>\n </div>\n </EmphasisPanel>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-status-success-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">8</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.team.metrics.tasksCompleted', 'Tasks Completed')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Clock className=\"h-8 w-8 text-status-warning-text\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{pendingBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.team.metrics.pendingTasks', 'Pending Tasks')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">4.9</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.team.metrics.performanceScore', 'Performance Score')}\n </p>\n </div>\n </div>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-accent-blue\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold tabular-nums\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.team.metrics.activeProjects', 'Active Projects')}\n </p>\n </div>\n </div>\n </GlassCard>\n </div>\n\n <Card className=\"border-border-seam\">\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.team.sections.recentActivity', 'Recent Activity')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"py-4\">\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title={tr(\n 'proserviceworld.dashboard.team.sections.comingSoonTitle',\n 'No recent activity yet'\n )}\n description={tr(\n 'proserviceworld.dashboard.team.sections.comingSoon',\n 'Team member features are on the way — assigned tasks and project updates will show up here.'\n )}\n />\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAsCA,SAAgB,IAAgB;CAC9B,IAAM,EAAE,SAAM,GAAS,EACjB,KAAM,GAAa,GAAkB,MACzC,EAAc,GAAG,GAAK,GAAU,EAAO,EACnC,EAAE,aAAU,cAAW,aAAU,YAAS,qBAAkB,GAAyB,EACrF,CAAC,GAAY,KAAiB,EAAwB,SAAS,EAE/D,IAAiB,EAAS,QAAQ,MAAM,EAAE,WAAW,cAAc,EACnE,IAAoB,EAAS,QAAQ,MAAM,EAAE,WAAW,YAAY,EACpE,IAAkB,EAAS,QAAQ,MAAM,EAAE,WAAW,UAAU,EAChE,IAAa,EAChB,QAAQ,MAAM,EAAE,kBAAkB,YAAY,CAC9C,QAAQ,GAAK,MAAM,IAAM,EAAE,QAAQ,EAAE,EAClC,IAAsB,EAAc,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,QAE3D,IAAmD;EACvD;GAAE,IAAI;GAAU,OAAO,EAAG,0CAA0C,SAAS;GAAE;EAC/E;GAAE,IAAI;GAAY,OAAO,EAAG,4CAA4C,WAAW;GAAE;EACrF;GAAE,IAAI;GAAS,OAAO,EAAG,yCAAyC,QAAQ;GAAE;EAC5E;GAAE,IAAI;GAAQ,OAAO,EAAG,wCAAwC,OAAO;GAAE;EAC1E,EACK,KAAsB,MACtB,MAAW,cACN,EAAG,kDAAkD,YAAY,GACtE,MAAW,gBACN,EAAG,mDAAmD,cAAc,GACzE,MAAW,YAAkB,EAAG,gDAAgD,UAAU,GACvF,EAAG,kDAAkD,YAAY;AAG1E,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAGE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,EACvC,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAe,EAAG,mCAAmC,YAAY,EAAgB,CAAA;MAC9E,CAAA,EACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,sCACA,gDACD;MACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAS,KAAK,MACb,kBAAC,UAAD;QAEE,eAAe,EAAc,EAAI,GAAG;QACpC,gBAAc,MAAe,EAAI;QACjC,WAAW,6IACT,MAAe,EAAI,KACf,8CACA;kBAGL,EAAI;QACE,EAVF,EAAI,GAUF,CACT;OACE,CAAA,EACL,IAAsB,KACrB,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,cAAY,GAAG,EAAoB;iBAAvE,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EACjC,kBAAC,QAAD;QAAM,WAAU;kBAAgB;QAA2B,CAAA,CACpD;SAEP;QACF;OACF;;GAEN,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;cACjD,EACC,qCACA,uOACD;IACW,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO,EAAG,oDAAoD,yBAAyB;MACvF,aAAa,EACX,wDACA,wDACD;MACD,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,eAAe,EAAc,SAAS;MACvC;KACD;MACE,IAAI;MACJ,OAAO,EAAG,sDAAsD,yBAAyB;MACzF,aAAa,EACX,0DACA,+CACD;MACD,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,eAAe,EAAc,SAAS;MACtC,MAAM,EAAe,SAAS;MAC/B;KACD;MACE,IAAI;MACJ,OAAO,EAAG,oDAAoD,8BAA8B;MAC5F,aAAa,EACX,wDACA,+DACD;MACD,MAAM,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;MACxC,eAAe,EAAc,WAAW;MACzC;KACF;IACD,CAAA;GAGD,MAAe,YACd,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAG,iDAAiD,sBAAsB;OACxE,CAAA,EACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EACC,oDACA,yDACD;OACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;OAAQ,MAAK;iBAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAChC,EAAG,yDAAyD,gBAAgB,CACtE;SACL;SACQ,CAAA;KAGhB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA,EACjD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAe;WAAW,CAAA,EAC1E,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,2DAA2D,kBAAkB;WAC/E,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,EACrD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAO,CAAA,EACtD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,2DAA2D,oBAAoB;WACjF,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,EAC5D,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAkB;WAAW,CAAA,EAC7E,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,8DAA8D,qBAAqB;WACrF,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAQ,MAAA;QAAK,WAAU;kBAC1C,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,4BAA6B,CAAA,EACnD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAb,CAA+C,KAAE,EAAW,gBAAgB,CAAK;cACjF,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,uDAAuD,cAAc;WACvE,CAAA,CACA;YACF;;QACI,CAAA;OACR;;KAGN,kBAAC,GAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAA,UACG,EAAG,4DAA4D,kBAAkB,EACxE,CAAA,EACZ,kBAAC,GAAD;QAAQ,SAAQ;QAAU,MAAK;kBAC5B,EAAG,0CAA0C,WAAW;QAClD,CAAA,CACL;UACK,CAAA,EACb,kBAAC,GAAD;OAAa,WAAU;iBACpB,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,OAAD;QAEE,WAAU;kBAFZ,CAIE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,GAAD,EAAU,WAAU,6BAA8B,CAAA;UAC9C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAe,EAAQ;UAAU,CAAA,EAC9C,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAG,qDAAqD,sBAAsB,EAC7E,MAAM,EAAQ,cACf,CAAC;UACA,CAAA,CACA,EAAA,CAAA,CACF;YACN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAb,CAAgD,KAC5C,EAAQ,OAAO,gBAAgB,CAC/B;aACJ,kBAAC,GAAD;UACE,SACE,EAAQ,WAAW,cACf,YACA,EAAQ,WAAW,gBACjB,cACA;oBAGP,EAAmB,EAAQ,OAAO;UAC7B,CAAA,CACJ;WACF;UAhCC,EAAQ,GAgCT,CACN;OACU,CAAA,CACT;;KACH;;GAIP,MAAe,cACd,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAG,mDAAmD,0BAA0B;OAC9E,CAAA,EACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EACC,sDACA,yDACD;OACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;OACE,SAAS;QACP,OAAO,EAAG,0DAA0D,eAAe;QACnF,gBAAgB;QAChB,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;QAClC;OACD,SAAS,CACP;QACE,OAAO,EAAG,yDAAyD,cAAc;QACjF,gBAAgB;QAChB,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;QACnC,CACF;OACD,CAAA,CACE;SACQ,CAAA;KAEhB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAW,WAAU;QAAQ,MAAA;QAAK,WAAU;kBAC1C,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,EACrD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAO,CAAA,EACtD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,qDAAqD,8BAA8B,EACrF,OAAO,EAAQ,QAChB,CAAC;WACA,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA,EACjD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAe;WAAW,CAAA,EAC1E,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,6DAA6D,kBAAkB;WACjF,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,oCAAqC,CAAA,EAC3D,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAO,CAAA,EACtD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,6DAA6D,kBAAkB;WACjF,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,4BAA6B,CAAA,EACnD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAW,CAAA,EAC1D,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,wDAAwD,aAAa;WACvE,CAAA,CACA;YACF;;QACI,CAAA;OACR;;KAEN,kBAAC,GAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAA,UACG,EAAG,4DAA4D,gBAAgB,EACtE,CAAA,EACZ,kBAAC,GAAD;QACE,SAAS;SACP,OAAO,EAAG,yDAAyD,cAAc;SACjF,gBAAgB;SAChB,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;SACnC;QACD,SAAS,CACP;SACE,OAAO,EAAG,0CAA0C,WAAW;SAC/D,gBAAgB;SAChB,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;SAClC,CACF;QACD,CAAA,CACE;UACK,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAS,MAAM,GAAG,EAAE,CAAC,KAAK,MACzB,kBAAC,OAAD;QAEE,WAAU;kBAFZ;SAIE,kBAAC,MAAD;UAAI,WAAU;oBAAoB,EAAQ;UAAW,CAAA;SACrD,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAQ;UACP,CAAA;SACJ,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAG,8CAA8C,oBAAoB,EACpE,QAAQ,EAAQ,QAAQ,UAAU,gBAAgB,EACnD,CAAC;WACG,CAAA,EACP,kBAAC,GAAD;WAAO,SAAQ;qBACZ,EAAG,uDAAuD,sBAAsB,EAC/E,OAAO,EAAQ,eAChB,CAAC;WACI,CAAA,CACJ;;SACF;UAnBC,EAAQ,GAmBT,CACN;OACE,CAAA,EACM,CAAA,CACT;;KACH;;GAIP,MAAe,WACd,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAG,yCAAyC,kBAAkB;OAC5D,CAAA,EACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EACC,4CACA,6CACD;OACC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;OACE,SAAS;QACP,OAAO,EAAG,uDAAuD,eAAe;QAChF,gBAAgB;QAChB,MAAM,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;QACxC;OACD,SAAS,CACP;QACE,OAAO,EAAG,uDAAuD,eAAe;QAChF,gBAAgB;QAChB,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;QACpC,CACF;OACD,CAAA,CACE;SACQ,CAAA;KAEhB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,4BAA6B,CAAA,EAC9C,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAU;WAAW,CAAA,EACrE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,0DAA0D,kBAAkB;WAC9E,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,oCAAqC,CAAA,EACzD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAS;WAAW,CAAA,EACpE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,yDAAyD,iBAAiB;WAC5E,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAU,WAAU,4BAA6B,CAAA,EACjD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAS;WAAW,CAAA,EACpE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,yDAAyD,iBAAiB;WAC5E,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAQ,MAAA;QAAK,WAAU;kBAC1C,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,oCAAqC,CAAA,EAC3D,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAW,CAAA,EAC1D,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,wDAAwD,gBAAgB;WAC1E,CAAA,CACA;YACF;;QACI,CAAA;OACR;;KAEN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAG,4DAA4D,mBAAmB,EACzE,CAAA,EACD,CAAA,EACb,kBAAC,GAAD;QAAa,WAAU;kBACpB,EAAU,MAAM,GAAG,EAAE,CAAC,KAAK,MAC1B,kBAAC,OAAD;SAAuB,WAAU;mBAAjC;UACE,kBAAC,OAAD;WAAK,WAAU;qBACb,kBAAC,QAAD;YAAM,WAAU;sBACb,EAAS,KAAK,OAAO,EAAE;YACnB,CAAA;WACH,CAAA;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAe,EAAS;YAAiB,CAAA,EACtD,kBAAC,KAAD;YAAG,WAAU;sBAA+B,EAAS,gBAAgB;YAAO,CAAA,CACxE;;UACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,yCAA0C,CAAA,EAC1D,kBAAC,QAAD;YAAM,WAAU;sBAAgB,EAAS,OAAO,QAAQ,EAAE;YAAQ,CAAA,CAC9D;;UACF;WAdI,EAAS,GAcb,CACN;QACU,CAAA,CACT;UAEP,kBAAC,GAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAG,2DAA2D,kBAAkB,EACvE,CAAA,EACD,CAAA,EACb,kBAAC,GAAD;QAAa,WAAU;kBAAvB;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,2CAA4C,CAAA,EACnE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EACC,qEACA,wBACD;WACC,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBACV,EACC,2EACA,oCACD;WACC,CAAA,CACA,EAAA,CAAA,CACF;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,2CAA4C,CAAA,EACnE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,6DAA6D,gBAAgB;WAC/E,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBACV,EACC,mEACA,0BACD;WACC,CAAA,CACA,EAAA,CAAA,CACF;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,mCAAoC,CAAA,EACpD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,2DAA2D,cAAc;WAC3E,CAAA,EACJ,kBAAC,KAAD;WAAG,WAAU;qBACV,EACC,iEACA,2BACD;WACC,CAAA,CACA,EAAA,CAAA,CACF;;SACM;UACT;SACH;;KACF;;GAIP,MAAe,UACd,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAG,wCAAwC,wBAAwB;OACjE,CAAA,EACL,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAG,2CAA2C,qCAAqC;OAClF,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;iBAA/B,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EACpC,EAAG,kDAAkD,WAAW,CAC1D;SACL;SACQ,CAAA;KAEhB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,EAC5D,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAK,CAAA,EACpD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,yDAAyD,kBAAkB;WAC7E,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,EACtD,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAgB;WAAW,CAAA,EAC3E,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,uDAAuD,gBAAgB;WACzE,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAQ,MAAA;QAAK,WAAU;kBAC1C,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,4BAA6B,CAAA,EAC7C,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAkC;WAAO,CAAA,EACtD,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,2DAA2D,oBAAoB;WACjF,CAAA,CACA;YACF;;QACI,CAAA;OACZ,kBAAC,GAAD;QAAW,WAAU;QAAS,WAAU;kBACtC,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,4BAA6B,CAAA,EAC9C,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAmC,EAAe;WAAW,CAAA,EAC1E,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAG,yDAAyD,kBAAkB;WAC7E,CAAA,CACA;YACF;;QACI,CAAA;OACR;;KAEN,kBAAC,GAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAG,0DAA0D,kBAAkB,EACtE,CAAA,EACD,CAAA,EACb,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,GAAD;QACE,cAAa;QACb,OAAO,EACL,2DACA,yBACD;QACD,aAAa,EACX,sDACA,8FACD;QACD,CAAA;OACU,CAAA,CACT;;KACH;;GAEJ"}
1
+ {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DashboardPage.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport {\n Users,\n Briefcase,\n FolderKanban,\n Clock,\n Receipt,\n ShieldCheck,\n GitBranch,\n ArrowRight,\n} from 'lucide-react';\nimport { useDashboardStats } from '../hooks/useProServiceWorldApi';\nimport { useNav } from '../utils/nav';\nimport {\n PageHeader,\n MetricCard,\n SectionCard,\n LoadingBlock,\n ErrorState,\n StatusPill,\n fmtMoney,\n fmtHours,\n} from '../components/ui';\n\nconst QUICK = [\n { label: 'Clients', to: 'clients', icon: <Users className=\"h-4 w-4\" /> },\n { label: 'Engagements', to: 'engagements', icon: <Briefcase className=\"h-4 w-4\" /> },\n { label: 'Matters', to: 'matters', icon: <FolderKanban className=\"h-4 w-4\" /> },\n { label: 'Time', to: 'time', icon: <Clock className=\"h-4 w-4\" /> },\n { label: 'Invoices', to: 'invoices', icon: <Receipt className=\"h-4 w-4\" /> },\n { label: 'Compliance', to: 'compliance', icon: <ShieldCheck className=\"h-4 w-4\" /> },\n];\n\nexport const DashboardPage: FC = () => {\n const nav = useNav();\n const { data, isLoading, error, refetch } = useDashboardStats();\n\n if (isLoading) return <LoadingBlock label=\"Loading practice overview…\" />;\n if (error) return <ErrorState error={error} onRetry={() => void refetch()} />;\n if (!data) return null;\n\n return (\n <div className=\"space-y-6\">\n <PageHeader\n title=\"Practice overview\"\n subtitle=\"One governed view of clients, engagements, matters, time and billing across your firm.\"\n />\n\n <div className=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <MetricCard\n label=\"Active clients\"\n value={data.activeClients}\n hint={`${data.totalClients} total`}\n icon={<Users className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n <MetricCard\n label=\"Active engagements\"\n value={data.activeEngagements}\n icon={<Briefcase className=\"h-4 w-4\" />}\n tone=\"accent\"\n />\n <MetricCard\n label=\"Open matters\"\n value={data.openMatters}\n icon={<FolderKanban className=\"h-4 w-4\" />}\n tone=\"info\"\n />\n <MetricCard\n label=\"Unbilled hours\"\n value={fmtHours(data.unbilledHours)}\n hint={`${fmtHours(data.billedHours)} billed`}\n icon={<Clock className=\"h-4 w-4\" />}\n tone=\"warning\"\n />\n <MetricCard\n label=\"Outstanding\"\n value={fmtMoney(data.outstandingInvoiceTotal)}\n hint=\"Sent + overdue\"\n icon={<Receipt className=\"h-4 w-4\" />}\n tone=\"warning\"\n />\n <MetricCard\n label=\"Collected\"\n value={fmtMoney(data.paidInvoiceTotal)}\n icon={<Receipt className=\"h-4 w-4\" />}\n tone=\"success\"\n />\n <MetricCard\n label=\"Compliance due\"\n value={data.pendingComplianceChecks}\n icon={<ShieldCheck className=\"h-4 w-4\" />}\n tone={data.pendingComplianceChecks ? 'warning' : 'success'}\n />\n <MetricCard\n label=\"Open conflicts\"\n value={data.openConflictChecks}\n icon={<GitBranch className=\"h-4 w-4\" />}\n tone={data.openConflictChecks ? 'danger' : 'success'}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <SectionCard title=\"Engagements by status\">\n <StatusBreakdown items={data.engagementsByStatus} />\n </SectionCard>\n <SectionCard title=\"Matters by status\">\n <StatusBreakdown items={data.mattersByStatus} />\n </SectionCard>\n <SectionCard title=\"Revenue (last months)\">\n <RevenueBars data={data.revenueByMonth} />\n </SectionCard>\n </div>\n\n <SectionCard title=\"Jump to\">\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {QUICK.map((q) => (\n <button\n key={q.to}\n type=\"button\"\n onClick={() => nav(q.to)}\n className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-canvas px-3 py-2.5 text-sm text-text-primary transition hover:border-accent\"\n >\n <span className=\"flex items-center gap-2\">\n <span className=\"text-accent\">{q.icon}</span>\n {q.label}\n </span>\n <ArrowRight className=\"h-4 w-4 text-text-tertiary\" />\n </button>\n ))}\n </div>\n </SectionCard>\n </div>\n );\n};\n\nconst StatusBreakdown: FC<{ items: { status: string; count: number }[] }> = ({ items }) => {\n if (!items.length) return <p className=\"text-sm text-text-tertiary\">No records yet.</p>;\n const max = Math.max(...items.map((i) => i.count), 1);\n return (\n <ul className=\"space-y-2.5\">\n {items.map((i) => (\n <li key={i.status} className=\"flex items-center gap-3\">\n <div className=\"w-28 shrink-0\">\n <StatusPill status={i.status} />\n </div>\n <div className=\"h-2 flex-1 overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-full rounded-full bg-accent\"\n style={{ width: `${(i.count / max) * 100}%` }}\n />\n </div>\n <span className=\"w-8 text-right text-sm font-medium text-text-primary\">{i.count}</span>\n </li>\n ))}\n </ul>\n );\n};\n\nconst RevenueBars: FC<{ data: { month: string; amount: number }[] }> = ({ data }) => {\n if (!data.length) return <p className=\"text-sm text-text-tertiary\">No invoiced revenue yet.</p>;\n const max = Math.max(...data.map((d) => d.amount), 1);\n return (\n <div className=\"flex h-40 items-end gap-1.5\">\n {data.map((d) => (\n <div key={d.month} className=\"flex flex-1 flex-col items-center gap-1\">\n <div className=\"flex w-full flex-1 items-end\">\n <div\n className=\"w-full rounded-t bg-accent/80\"\n style={{ height: `${Math.max((d.amount / max) * 100, 2)}%` }}\n title={fmtMoney(d.amount)}\n />\n </div>\n <span className=\"text-[10px] text-text-tertiary\">{d.month.slice(5)}</span>\n </div>\n ))}\n </div>\n );\n};\n"],"mappings":"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"}