@burdenoff/microfe-proserviceworld 2026.512.1 → 2026.624.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 (91) hide show
  1. package/dist/proserviceworld/pages/AdminReportsPage.js +28 -28
  2. package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -1
  3. package/dist/proserviceworld/pages/AdminUsersPage.js +19 -19
  4. package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -1
  5. package/dist/proserviceworld/pages/AnalyticsPage.js +27 -27
  6. package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
  7. package/dist/proserviceworld/pages/BookingsPage.js +24 -24
  8. package/dist/proserviceworld/pages/BookingsPage.js.map +1 -1
  9. package/dist/proserviceworld/pages/DashboardPage.js +33 -33
  10. package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
  11. package/dist/proserviceworld/pages/DocumentsPage.js +29 -29
  12. package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
  13. package/dist/proserviceworld/pages/MessagesPage.js +15 -15
  14. package/dist/proserviceworld/pages/MessagesPage.js.map +1 -1
  15. package/dist/proserviceworld/pages/PaymentsPage.js +19 -19
  16. package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -1
  17. package/dist/proserviceworld/pages/ProjectsPage.js +36 -36
  18. package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -1
  19. package/dist/proserviceworld/pages/ProviderDetailPage.js +36 -36
  20. package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -1
  21. package/dist/proserviceworld/pages/ProvidersPage.js +19 -19
  22. package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -1
  23. package/dist/proserviceworld/pages/ReviewsPage.js +22 -22
  24. package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -1
  25. package/dist/proserviceworld/pages/ServiceDetailsPage.js +35 -35
  26. package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -1
  27. package/dist/proserviceworld/pages/ServicesPage.js +14 -14
  28. package/dist/proserviceworld/pages/ServicesPage.js.map +1 -1
  29. package/dist/proserviceworld/pages/VerificationPage.js +23 -23
  30. package/dist/proserviceworld/pages/VerificationPage.js.map +1 -1
  31. package/package.json +1 -1
  32. package/dist/dev/main.d.ts +0 -2
  33. package/dist/dev/main.d.ts.map +0 -1
  34. package/dist/generated/global-operations.d.ts +0 -2
  35. package/dist/generated/global-operations.d.ts.map +0 -1
  36. package/dist/generated/global-types.d.ts +0 -18199
  37. package/dist/generated/global-types.d.ts.map +0 -1
  38. package/dist/generated/wspace-operations.d.ts +0 -2
  39. package/dist/generated/wspace-operations.d.ts.map +0 -1
  40. package/dist/generated/wspace-types.d.ts +0 -43046
  41. package/dist/generated/wspace-types.d.ts.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/proserviceworld/ProServiceWorldRoot.d.ts +0 -5
  45. package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +0 -1
  46. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +0 -2
  47. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +0 -1
  48. package/dist/proserviceworld/index.d.ts +0 -5
  49. package/dist/proserviceworld/index.d.ts.map +0 -1
  50. package/dist/proserviceworld/pages/AdminReportsPage.d.ts +0 -2
  51. package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +0 -1
  52. package/dist/proserviceworld/pages/AdminUsersPage.d.ts +0 -2
  53. package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +0 -1
  54. package/dist/proserviceworld/pages/AnalyticsPage.d.ts +0 -2
  55. package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +0 -1
  56. package/dist/proserviceworld/pages/BookingsPage.d.ts +0 -2
  57. package/dist/proserviceworld/pages/BookingsPage.d.ts.map +0 -1
  58. package/dist/proserviceworld/pages/DashboardPage.d.ts +0 -2
  59. package/dist/proserviceworld/pages/DashboardPage.d.ts.map +0 -1
  60. package/dist/proserviceworld/pages/DocumentsPage.d.ts +0 -2
  61. package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +0 -1
  62. package/dist/proserviceworld/pages/MessagesPage.d.ts +0 -2
  63. package/dist/proserviceworld/pages/MessagesPage.d.ts.map +0 -1
  64. package/dist/proserviceworld/pages/PaymentsPage.d.ts +0 -2
  65. package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +0 -1
  66. package/dist/proserviceworld/pages/ProjectsPage.d.ts +0 -2
  67. package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +0 -1
  68. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +0 -2
  69. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +0 -1
  70. package/dist/proserviceworld/pages/ProvidersPage.d.ts +0 -2
  71. package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +0 -1
  72. package/dist/proserviceworld/pages/ReviewsPage.d.ts +0 -2
  73. package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +0 -1
  74. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +0 -2
  75. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +0 -1
  76. package/dist/proserviceworld/pages/ServicesPage.d.ts +0 -2
  77. package/dist/proserviceworld/pages/ServicesPage.d.ts.map +0 -1
  78. package/dist/proserviceworld/pages/VerificationPage.d.ts +0 -2
  79. package/dist/proserviceworld/pages/VerificationPage.d.ts.map +0 -1
  80. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +0 -6
  81. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +0 -1
  82. package/dist/proserviceworld/store/proserviceworldStore.d.ts +0 -32
  83. package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +0 -1
  84. package/dist/proserviceworld/types/index.d.ts +0 -338
  85. package/dist/proserviceworld/types/index.d.ts.map +0 -1
  86. package/dist/proserviceworld/utils/cn.d.ts +0 -4
  87. package/dist/proserviceworld/utils/cn.d.ts.map +0 -1
  88. package/dist/proserviceworld/utils/i18n.d.ts +0 -6
  89. package/dist/proserviceworld/utils/i18n.d.ts.map +0 -1
  90. package/dist/proserviceworld/utils/navigation.d.ts +0 -2
  91. package/dist/proserviceworld/utils/navigation.d.ts.map +0 -1
@@ -63,7 +63,7 @@ function w() {
63
63
  className: "text-2xl font-semibold",
64
64
  children: "Bookings"
65
65
  }), /* @__PURE__ */ m("p", {
66
- className: "text-sm text-muted-foreground",
66
+ className: "text-sm text-text-secondary",
67
67
  children: "Manage and track all your service bookings."
68
68
  })] }), /* @__PURE__ */ h(_, {
69
69
  size: "sm",
@@ -84,7 +84,7 @@ function w() {
84
84
  className: "text-2xl font-bold",
85
85
  children: s.length
86
86
  }), /* @__PURE__ */ m("p", {
87
- className: "text-xs text-muted-foreground",
87
+ className: "text-xs text-text-secondary",
88
88
  children: "Total Bookings"
89
89
  })] })]
90
90
  })
@@ -100,7 +100,7 @@ function w() {
100
100
  className: "text-2xl font-bold",
101
101
  children: F.completed ?? 0
102
102
  }), /* @__PURE__ */ m("p", {
103
- className: "text-xs text-muted-foreground",
103
+ className: "text-xs text-text-secondary",
104
104
  children: "Completed"
105
105
  })] })]
106
106
  })
@@ -116,7 +116,7 @@ function w() {
116
116
  className: "text-2xl font-bold",
117
117
  children: [L, "%"]
118
118
  }), /* @__PURE__ */ m("p", {
119
- className: "text-xs text-muted-foreground",
119
+ className: "text-xs text-text-secondary",
120
120
  children: "Avg. In-Progress"
121
121
  })] })]
122
122
  })
@@ -132,7 +132,7 @@ function w() {
132
132
  className: "text-2xl font-bold",
133
133
  children: ["$", I.toLocaleString()]
134
134
  }), /* @__PURE__ */ m("p", {
135
- className: "text-xs text-muted-foreground",
135
+ className: "text-xs text-text-secondary",
136
136
  children: "Total Budget"
137
137
  })] })]
138
138
  })
@@ -143,7 +143,7 @@ function w() {
143
143
  className: "flex flex-col gap-4 sm:flex-row sm:items-center",
144
144
  children: [/* @__PURE__ */ h("div", {
145
145
  className: "relative flex-1",
146
- children: [/* @__PURE__ */ m(d, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ m(S, {
146
+ children: [/* @__PURE__ */ m(d, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ m(S, {
147
147
  placeholder: "Search bookings by title, provider, or service...",
148
148
  value: p,
149
149
  onChange: (e) => w(e.target.value),
@@ -151,7 +151,7 @@ function w() {
151
151
  })]
152
152
  }), /* @__PURE__ */ h("div", {
153
153
  className: "flex items-center gap-2",
154
- children: [/* @__PURE__ */ m(l, { className: "h-4 w-4 text-muted-foreground" }), [
154
+ children: [/* @__PURE__ */ m(l, { className: "h-4 w-4 text-text-secondary" }), [
155
155
  "all",
156
156
  "pending",
157
157
  "in_progress",
@@ -189,7 +189,7 @@ function w() {
189
189
  }
190
190
  ].map(({ field: e, label: t }) => /* @__PURE__ */ h("button", {
191
191
  onClick: () => R(e),
192
- className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${D === e ? "border-primary bg-primary/5 text-primary" : "text-muted-foreground hover:bg-muted/50"}`,
192
+ className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${D === e ? "border-primary bg-action-primary-bg/5 text-primary" : "text-text-secondary hover:bg-bg-sunken/50"}`,
193
193
  children: [/* @__PURE__ */ m(r, { className: "h-3 w-3" }), t]
194
194
  }, e))
195
195
  }),
@@ -198,12 +198,12 @@ function w() {
198
198
  children: [/* @__PURE__ */ m("div", {
199
199
  className: `space-y-3 ${P ? "lg:col-span-2" : "lg:col-span-3"}`,
200
200
  children: N.length === 0 ? /* @__PURE__ */ m(v, { children: /* @__PURE__ */ m(y, {
201
- className: "py-12 text-center text-muted-foreground",
201
+ className: "py-12 text-center text-text-secondary",
202
202
  children: "No bookings match your filters."
203
203
  }) }) : N.map((e) => {
204
204
  let t = C[e.status], n = t.icon;
205
205
  return /* @__PURE__ */ m(v, {
206
- className: `cursor-pointer transition-colors hover:bg-muted/30 ${j === e.id ? "border-primary ring-1 ring-primary" : ""}`,
206
+ className: `cursor-pointer transition-colors hover:bg-bg-sunken/30 ${j === e.id ? "border-primary ring-1 ring-primary" : ""}`,
207
207
  onClick: () => M(j === e.id ? null : e.id),
208
208
  children: /* @__PURE__ */ h(y, {
209
209
  className: "pt-4",
@@ -220,11 +220,11 @@ function w() {
220
220
  })]
221
221
  }),
222
222
  /* @__PURE__ */ m("p", {
223
- className: "text-sm text-muted-foreground line-clamp-1",
223
+ className: "text-sm text-text-secondary line-clamp-1",
224
224
  children: e.description
225
225
  }),
226
226
  /* @__PURE__ */ h("div", {
227
- className: "flex flex-wrap items-center gap-4 text-xs text-muted-foreground",
227
+ className: "flex flex-wrap items-center gap-4 text-xs text-text-secondary",
228
228
  children: [
229
229
  /* @__PURE__ */ h("span", {
230
230
  className: "flex items-center gap-1",
@@ -264,13 +264,13 @@ function w() {
264
264
  className: "text-sm font-medium",
265
265
  children: [e.progress, "%"]
266
266
  }),
267
- /* @__PURE__ */ m(o, { className: "h-4 w-4 text-muted-foreground" })
267
+ /* @__PURE__ */ m(o, { className: "h-4 w-4 text-text-secondary" })
268
268
  ]
269
269
  })]
270
270
  }), e.status === "in_progress" && /* @__PURE__ */ m("div", {
271
271
  className: "mt-3",
272
272
  children: /* @__PURE__ */ m("div", {
273
- className: "h-2 w-full overflow-hidden rounded-full bg-muted",
273
+ className: "h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
274
274
  children: /* @__PURE__ */ m("div", {
275
275
  className: "h-2 rounded-full bg-blue-500 transition-all",
276
276
  style: { width: `${e.progress}%` }
@@ -300,7 +300,7 @@ function w() {
300
300
  className: "font-semibold",
301
301
  children: P.title
302
302
  }), /* @__PURE__ */ m("p", {
303
- className: "mt-1 text-sm text-muted-foreground",
303
+ className: "mt-1 text-sm text-text-secondary",
304
304
  children: P.description
305
305
  })] }),
306
306
  /* @__PURE__ */ m(g, {
@@ -310,14 +310,14 @@ function w() {
310
310
  P.status === "in_progress" && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
311
311
  className: "flex items-center justify-between text-sm",
312
312
  children: [/* @__PURE__ */ m("span", {
313
- className: "text-muted-foreground",
313
+ className: "text-text-secondary",
314
314
  children: "Progress"
315
315
  }), /* @__PURE__ */ h("span", {
316
316
  className: "font-medium",
317
317
  children: [P.progress, "%"]
318
318
  })]
319
319
  }), /* @__PURE__ */ m("div", {
320
- className: "mt-1 h-2 w-full overflow-hidden rounded-full bg-muted",
320
+ className: "mt-1 h-2 w-full overflow-hidden rounded-full bg-bg-sunken",
321
321
  children: /* @__PURE__ */ m("div", {
322
322
  className: "h-2 rounded-full bg-blue-500",
323
323
  style: { width: `${P.progress}%` }
@@ -329,7 +329,7 @@ function w() {
329
329
  /* @__PURE__ */ h("div", {
330
330
  className: "flex justify-between",
331
331
  children: [/* @__PURE__ */ m("span", {
332
- className: "text-muted-foreground",
332
+ className: "text-text-secondary",
333
333
  children: "Service"
334
334
  }), /* @__PURE__ */ m("span", {
335
335
  className: "font-medium",
@@ -339,7 +339,7 @@ function w() {
339
339
  /* @__PURE__ */ h("div", {
340
340
  className: "flex justify-between",
341
341
  children: [/* @__PURE__ */ m("span", {
342
- className: "text-muted-foreground",
342
+ className: "text-text-secondary",
343
343
  children: "Provider"
344
344
  }), /* @__PURE__ */ m("span", {
345
345
  className: "font-medium",
@@ -349,7 +349,7 @@ function w() {
349
349
  /* @__PURE__ */ h("div", {
350
350
  className: "flex justify-between",
351
351
  children: [/* @__PURE__ */ m("span", {
352
- className: "text-muted-foreground",
352
+ className: "text-text-secondary",
353
353
  children: "Budget"
354
354
  }), /* @__PURE__ */ h("span", {
355
355
  className: "font-medium",
@@ -359,7 +359,7 @@ function w() {
359
359
  /* @__PURE__ */ h("div", {
360
360
  className: "flex justify-between",
361
361
  children: [/* @__PURE__ */ m("span", {
362
- className: "text-muted-foreground",
362
+ className: "text-text-secondary",
363
363
  children: "Start Date"
364
364
  }), /* @__PURE__ */ m("span", {
365
365
  className: "font-medium",
@@ -369,7 +369,7 @@ function w() {
369
369
  /* @__PURE__ */ h("div", {
370
370
  className: "flex justify-between",
371
371
  children: [/* @__PURE__ */ m("span", {
372
- className: "text-muted-foreground",
372
+ className: "text-text-secondary",
373
373
  children: "End Date"
374
374
  }), /* @__PURE__ */ m("span", {
375
375
  className: "font-medium",
@@ -379,7 +379,7 @@ function w() {
379
379
  /* @__PURE__ */ h("div", {
380
380
  className: "flex justify-between",
381
381
  children: [/* @__PURE__ */ m("span", {
382
- className: "text-muted-foreground",
382
+ className: "text-text-secondary",
383
383
  children: "Payment"
384
384
  }), /* @__PURE__ */ m(g, {
385
385
  variant: "secondary",
@@ -389,7 +389,7 @@ function w() {
389
389
  /* @__PURE__ */ h("div", {
390
390
  className: "flex justify-between",
391
391
  children: [/* @__PURE__ */ m("span", {
392
- className: "text-muted-foreground",
392
+ className: "text-text-secondary",
393
393
  children: "Method"
394
394
  }), /* @__PURE__ */ m("span", {
395
395
  className: "font-medium",
@@ -1 +1 @@
1
- {"version":3,"file":"BookingsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/BookingsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Clock,\n CheckCircle2,\n XCircle,\n Loader2,\n Calendar,\n DollarSign,\n User,\n ChevronRight,\n Filter,\n ArrowUpDown,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { BookingStatus } from '../types';\n\nconst statusConfig: Record<\n BookingStatus,\n {\n label: string;\n color: string;\n icon: typeof Clock;\n badgeVariant: 'default' | 'secondary' | 'outline' | 'destructive';\n }\n> = {\n pending: { label: 'Pending', color: 'text-yellow-600', icon: Clock, badgeVariant: 'secondary' },\n in_progress: {\n label: 'In Progress',\n color: 'text-blue-600',\n icon: Loader2,\n badgeVariant: 'default',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n icon: CheckCircle2,\n badgeVariant: 'outline',\n },\n cancelled: {\n label: 'Cancelled',\n color: 'text-red-600',\n icon: XCircle,\n badgeVariant: 'destructive',\n },\n};\n\ntype SortField = 'date' | 'budget' | 'progress';\n\nexport function BookingsPage() {\n const { bookings } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState<BookingStatus | 'all'>('all');\n const [sortField, setSortField] = useState<SortField>('date');\n const [sortAsc, setSortAsc] = useState(false);\n const [selectedBookingId, setSelectedBookingId] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = bookings;\n\n if (statusFilter !== 'all') {\n result = result.filter((b) => b.status === statusFilter);\n }\n\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (b) =>\n b.title.toLowerCase().includes(q) ||\n b.providerName.toLowerCase().includes(q) ||\n b.serviceName.toLowerCase().includes(q)\n );\n }\n\n result = [...result].sort((a, b) => {\n const cmp =\n sortField === 'date'\n ? new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n : sortField === 'budget'\n ? b.budget - a.budget\n : b.progress - a.progress;\n return sortAsc ? -cmp : cmp;\n });\n\n return result;\n }, [bookings, searchQuery, statusFilter, sortField, sortAsc]);\n\n const selectedBooking = selectedBookingId\n ? bookings.find((b) => b.id === selectedBookingId)\n : null;\n\n const statusCounts = useMemo(() => {\n const counts: Record<string, number> = { all: bookings.length };\n for (const b of bookings) {\n counts[b.status] = (counts[b.status] ?? 0) + 1;\n }\n return counts;\n }, [bookings]);\n\n const totalBudget = bookings.reduce((sum, b) => sum + b.budget, 0);\n const avgProgress = Math.round(\n bookings.filter((b) => b.status === 'in_progress').reduce((sum, b) => sum + b.progress, 0) /\n Math.max(1, bookings.filter((b) => b.status === 'in_progress').length)\n );\n\n const handleSort = (field: SortField) => {\n if (sortField === field) setSortAsc(!sortAsc);\n else {\n setSortField(field);\n setSortAsc(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\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\">Bookings</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage and track all your service bookings.\n </p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-2 h-4 w-4\" /> New Booking\n </Button>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <Calendar className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-xs text-muted-foreground\">Total Bookings</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <CheckCircle2 className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{statusCounts.completed ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Loader2 className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{avgProgress}%</p>\n <p className=\"text-xs text-muted-foreground\">Avg. In-Progress</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <DollarSign className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalBudget.toLocaleString()}</p>\n <p className=\"text-xs text-muted-foreground\">Total Budget</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search bookings by title, provider, or service...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n {(['all', 'pending', 'in_progress', 'completed', 'cancelled'] as const).map((status) => (\n <Button\n key={status}\n variant={statusFilter === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setStatusFilter(status)}\n >\n {status === 'all' ? 'All' : statusConfig[status].label}\n <span className=\"ml-1 text-xs opacity-70\">({statusCounts[status] ?? 0})</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Sort controls */}\n <div className=\"flex gap-2\">\n {[\n { field: 'date' as SortField, label: 'Date' },\n { field: 'budget' as SortField, label: 'Budget' },\n { field: 'progress' as SortField, label: 'Progress' },\n ].map(({ field, label }) => (\n <button\n key={field}\n onClick={() => handleSort(field)}\n className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortField === field\n ? 'border-primary bg-primary/5 text-primary'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}\n >\n <ArrowUpDown className=\"h-3 w-3\" />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Booking list */}\n <div className={`space-y-3 ${selectedBooking ? 'lg:col-span-2' : 'lg:col-span-3'}`}>\n {filtered.length === 0 ? (\n <Card>\n <CardContent className=\"py-12 text-center text-muted-foreground\">\n No bookings match your filters.\n </CardContent>\n </Card>\n ) : (\n filtered.map((booking) => {\n const config = statusConfig[booking.status];\n const StatusIcon = config.icon;\n return (\n <Card\n key={booking.id}\n className={`cursor-pointer transition-colors hover:bg-muted/30 ${\n selectedBookingId === booking.id ? 'border-primary ring-1 ring-primary' : ''\n }`}\n onClick={() =>\n setSelectedBookingId(selectedBookingId === booking.id ? null : booking.id)\n }\n >\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-4 w-4 ${config.color}`} />\n <h3 className=\"font-medium\">{booking.title}</h3>\n </div>\n <p className=\"text-sm text-muted-foreground line-clamp-1\">\n {booking.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" /> {booking.providerName}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> {booking.startDate}\n </span>\n <span className=\"flex items-center gap-1\">\n <DollarSign className=\"h-3 w-3\" /> ${booking.budget.toLocaleString()}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <Badge variant={config.badgeVariant}>{config.label}</Badge>\n {booking.status === 'in_progress' && (\n <span className=\"text-sm font-medium\">{booking.progress}%</span>\n )}\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n </div>\n\n {/* Progress bar for in-progress bookings */}\n {booking.status === 'in_progress' && (\n <div className=\"mt-3\">\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-blue-500 transition-all\"\n style={{ width: `${booking.progress}%` }}\n />\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n );\n })\n )}\n </div>\n\n {/* Detail panel */}\n {selectedBooking && (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Booking Details</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSelectedBookingId(null)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <h3 className=\"font-semibold\">{selectedBooking.title}</h3>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {selectedBooking.description}\n </p>\n </div>\n\n <Badge variant={statusConfig[selectedBooking.status].badgeVariant}>\n {statusConfig[selectedBooking.status].label}\n </Badge>\n\n {selectedBooking.status === 'in_progress' && (\n <div>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">Progress</span>\n <span className=\"font-medium\">{selectedBooking.progress}%</span>\n </div>\n <div className=\"mt-1 h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-blue-500\"\n style={{ width: `${selectedBooking.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-2 border-t pt-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Service</span>\n <span className=\"font-medium\">{selectedBooking.serviceName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Provider</span>\n <span className=\"font-medium\">{selectedBooking.providerName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Budget</span>\n <span className=\"font-medium\">${selectedBooking.budget.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Start Date</span>\n <span className=\"font-medium\">{selectedBooking.startDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">End Date</span>\n <span className=\"font-medium\">{selectedBooking.endDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Payment</span>\n <Badge variant=\"secondary\">{selectedBooking.paymentStatus}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Method</span>\n <span className=\"font-medium\">\n {selectedBooking.paymentMethod.replace('_', ' ')}\n </span>\n </div>\n </div>\n\n <div className=\"flex gap-2 border-t pt-3\">\n <Button className=\"flex-1\" size=\"sm\" variant=\"outline\">\n Message Provider\n </Button>\n {selectedBooking.status === 'pending' && (\n <Button className=\"flex-1\" size=\"sm\" variant=\"destructive\">\n Cancel\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AA0BA,IAAM,IAQF;CACF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAmB,MAAM;EAAO,cAAc;EAAa;CAC/F,aAAa;EACX,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACD,WAAW;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACD,WAAW;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACF;AAID,SAAgB,IAAe;CAC7B,IAAM,EAAE,gBAAa,GAAyB,EACxC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAc,KAAmB,EAAgC,MAAM,EACxE,CAAC,GAAW,KAAgB,EAAoB,OAAO,EACvD,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAmB,KAAwB,EAAwB,KAAK,EAEzE,IAAW,QAAc;EAC7B,IAAI,IAAS;AAMb,MAJI,MAAiB,UACnB,IAAS,EAAO,QAAQ,MAAM,EAAE,WAAW,EAAa,GAGtD,EAAY,MAAM,EAAE;GACtB,IAAM,IAAI,EAAY,aAAa;AACnC,OAAS,EAAO,QACb,MACC,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,IACjC,EAAE,aAAa,aAAa,CAAC,SAAS,EAAE,IACxC,EAAE,YAAY,aAAa,CAAC,SAAS,EAAE,CAC1C;;AAaH,SAVA,IAAS,CAAC,GAAG,EAAO,CAAC,MAAM,GAAG,MAAM;GAClC,IAAM,IACJ,MAAc,SACV,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GACjE,MAAc,WACZ,EAAE,SAAS,EAAE,SACb,EAAE,WAAW,EAAE;AACvB,UAAO,IAAU,CAAC,IAAM;IACxB,EAEK;IACN;EAAC;EAAU;EAAa;EAAc;EAAW;EAAQ,CAAC,EAEvD,IAAkB,IACpB,EAAS,MAAM,MAAM,EAAE,OAAO,EAAkB,GAChD,MAEE,IAAe,QAAc;EACjC,IAAM,IAAiC,EAAE,KAAK,EAAS,QAAQ;AAC/D,OAAK,IAAM,KAAK,EACd,GAAO,EAAE,WAAW,EAAO,EAAE,WAAW,KAAK;AAE/C,SAAO;IACN,CAAC,EAAS,CAAC,EAER,IAAc,EAAS,QAAQ,GAAK,MAAM,IAAM,EAAE,QAAQ,EAAE,EAC5D,IAAc,KAAK,MACvB,EAAS,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC,QAAQ,GAAK,MAAM,IAAM,EAAE,UAAU,EAAE,GACxF,KAAK,IAAI,GAAG,EAAS,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC,OAAO,CACzE,EAEK,KAAc,MAAqB;AACvC,EAAI,MAAc,IAAO,EAAW,CAAC,EAAQ,IAE3C,EAAa,EAAM,EACnB,EAAW,GAAM;;AAIrB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAyB;KAAa,CAAA,EACpD,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,eAC9B;OACL;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAU,WAAU,yBAA0B,CAAA;QAC1C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAS;QAAW,CAAA,EACvD,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAkB,CAAA,CAC3D,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAc,WAAU,0BAA2B,CAAA;QAC/C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAa,aAAa;QAAM,CAAA,EACnE,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAa,CAAA,CACtD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAS,WAAU,2BAA4B,CAAA;QAC3C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAmC,GAAY,IAAK;WACpD,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAoB,CAAA,CAC7D,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAY,WAAU,2BAA4B,CAAA;QAC9C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAkC,KAAE,EAAY,gBAAgB,CAAK;WACrE,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAgB,CAAA,CACzD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACH;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,iCAAkC,CAAA,EAClD;MAAC;MAAO;MAAW;MAAe;MAAa;MAAY,CAAW,KAAK,MAC3E,kBAAC,GAAD;MAEE,SAAS,MAAiB,IAAS,YAAY;MAC/C,MAAK;MACL,eAAe,EAAgB,EAAO;gBAJxC,CAMG,MAAW,QAAQ,QAAQ,EAAa,GAAQ,OACjD,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0C;QAAE,EAAa,MAAW;QAAE;QAAQ;SACvE;QAPF,EAOE,CACT,CACE;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,OAAO;MAAqB,OAAO;MAAQ;KAC7C;MAAE,OAAO;MAAuB,OAAO;MAAU;KACjD;MAAE,OAAO;MAAyB,OAAO;MAAY;KACtD,CAAC,KAAK,EAAE,UAAO,eACd,kBAAC,UAAD;KAEE,eAAe,EAAW,EAAM;KAChC,WAAW,4DACT,MAAc,IACV,6CACA;eANR,CASE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAClC,EACM;OAVF,EAUE,CACT;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAW,aAAa,IAAkB,kBAAkB;eAC9D,EAAS,WAAW,IACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAA0C;MAEnD,CAAA,EACT,CAAA,GAEP,EAAS,KAAK,MAAY;MACxB,IAAM,IAAS,EAAa,EAAQ,SAC9B,IAAa,EAAO;AAC1B,aACE,kBAAC,GAAD;OAEE,WAAW,sDACT,MAAsB,EAAQ,KAAK,uCAAuC;OAE5E,eACE,EAAqB,MAAsB,EAAQ,KAAK,OAAO,EAAQ,GAAG;iBAG5E,kBAAC,GAAD;QAAa,WAAU;kBAAvB,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD,EAAY,WAAW,WAAW,EAAO,SAAW,CAAA,EACpD,kBAAC,MAAD;aAAI,WAAU;uBAAe,EAAQ;aAAW,CAAA,CAC5C;;WACN,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAQ;YACP,CAAA;WACJ,kBAAC,OAAD;YAAK,WAAU;sBAAf;aACE,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;;eAAE,EAAQ;eACjC;;aACP,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;;eAAE,EAAQ;eACrC;;aACP,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;;eAAG,EAAQ,OAAO,gBAAgB;eAC/D;;aACH;;WACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAS,EAAO;sBAAe,EAAO;YAAc,CAAA;WAC1D,EAAQ,WAAW,iBAClB,kBAAC,QAAD;YAAM,WAAU;sBAAhB,CAAuC,EAAQ,UAAS,IAAQ;;WAElE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA;WACtD;YACF;YAGL,EAAQ,WAAW,iBAClB,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAU;WACV,OAAO,EAAE,OAAO,GAAG,EAAQ,SAAS,IAAI;WACxC,CAAA;UACE,CAAA;SACF,CAAA,CAEI;;OACT,EAnDA,EAAQ,GAmDR;OAET;KAEA,CAAA,EAGL,KACC,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,WAAU;iBAAY;OAA2B,CAAA,EAC5D,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,EAAqB,KAAK;iBAAE;OAEtE,CAAA,CACL;SACK,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAiB,EAAgB;QAAW,CAAA,EAC1D,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAgB;QACf,CAAA,CACA,EAAA,CAAA;OAEN,kBAAC,GAAD;QAAO,SAAS,EAAa,EAAgB,QAAQ;kBAClD,EAAa,EAAgB,QAAQ;QAChC,CAAA;OAEP,EAAgB,WAAW,iBAC1B,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwB;SAAe,CAAA,EACvD,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAA+B,EAAgB,UAAS,IAAQ;WAC5D;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAgB,SAAS,IAAI;SAChD,CAAA;QACE,CAAA,CACF,EAAA,CAAA;OAGR,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAc,CAAA,EACtD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAmB,CAAA,CAC9D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAe,CAAA,EACvD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAoB,CAAA,CAC/D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAa,CAAA,EACrD,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CAA8B,KAAE,EAAgB,OAAO,gBAAgB,CAAQ;aAC3E;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAiB,CAAA,EACzD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAiB,CAAA,CAC5D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAe,CAAA,EACvD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAe,CAAA,CAC1D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAc,CAAA,EACtD,kBAAC,GAAD;WAAO,SAAQ;qBAAa,EAAgB;WAAsB,CAAA,CAC9D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAwB;WAAa,CAAA,EACrD,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAgB,cAAc,QAAQ,KAAK,IAAI;WAC3C,CAAA,CACH;;SACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAQ,WAAU;SAAS,MAAK;SAAK,SAAQ;mBAAU;SAE9C,CAAA,EACR,EAAgB,WAAW,aAC1B,kBAAC,GAAD;SAAQ,WAAU;SAAS,MAAK;SAAK,SAAQ;mBAAc;SAElD,CAAA,CAEP;;OACM;QACT,EAAA,CAAA;KACH,CAAA,CAEJ;;GACF"}
1
+ {"version":3,"file":"BookingsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/BookingsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Clock,\n CheckCircle2,\n XCircle,\n Loader2,\n Calendar,\n DollarSign,\n User,\n ChevronRight,\n Filter,\n ArrowUpDown,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { BookingStatus } from '../types';\n\nconst statusConfig: Record<\n BookingStatus,\n {\n label: string;\n color: string;\n icon: typeof Clock;\n badgeVariant: 'default' | 'secondary' | 'outline' | 'destructive';\n }\n> = {\n pending: { label: 'Pending', color: 'text-yellow-600', icon: Clock, badgeVariant: 'secondary' },\n in_progress: {\n label: 'In Progress',\n color: 'text-blue-600',\n icon: Loader2,\n badgeVariant: 'default',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n icon: CheckCircle2,\n badgeVariant: 'outline',\n },\n cancelled: {\n label: 'Cancelled',\n color: 'text-red-600',\n icon: XCircle,\n badgeVariant: 'destructive',\n },\n};\n\ntype SortField = 'date' | 'budget' | 'progress';\n\nexport function BookingsPage() {\n const { bookings } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState<BookingStatus | 'all'>('all');\n const [sortField, setSortField] = useState<SortField>('date');\n const [sortAsc, setSortAsc] = useState(false);\n const [selectedBookingId, setSelectedBookingId] = useState<string | null>(null);\n\n const filtered = useMemo(() => {\n let result = bookings;\n\n if (statusFilter !== 'all') {\n result = result.filter((b) => b.status === statusFilter);\n }\n\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (b) =>\n b.title.toLowerCase().includes(q) ||\n b.providerName.toLowerCase().includes(q) ||\n b.serviceName.toLowerCase().includes(q)\n );\n }\n\n result = [...result].sort((a, b) => {\n const cmp =\n sortField === 'date'\n ? new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n : sortField === 'budget'\n ? b.budget - a.budget\n : b.progress - a.progress;\n return sortAsc ? -cmp : cmp;\n });\n\n return result;\n }, [bookings, searchQuery, statusFilter, sortField, sortAsc]);\n\n const selectedBooking = selectedBookingId\n ? bookings.find((b) => b.id === selectedBookingId)\n : null;\n\n const statusCounts = useMemo(() => {\n const counts: Record<string, number> = { all: bookings.length };\n for (const b of bookings) {\n counts[b.status] = (counts[b.status] ?? 0) + 1;\n }\n return counts;\n }, [bookings]);\n\n const totalBudget = bookings.reduce((sum, b) => sum + b.budget, 0);\n const avgProgress = Math.round(\n bookings.filter((b) => b.status === 'in_progress').reduce((sum, b) => sum + b.progress, 0) /\n Math.max(1, bookings.filter((b) => b.status === 'in_progress').length)\n );\n\n const handleSort = (field: SortField) => {\n if (sortField === field) setSortAsc(!sortAsc);\n else {\n setSortField(field);\n setSortAsc(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\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\">Bookings</h1>\n <p className=\"text-sm text-text-secondary\">\n Manage and track all your service bookings.\n </p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-2 h-4 w-4\" /> New Booking\n </Button>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <Calendar className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Bookings</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <CheckCircle2 className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{statusCounts.completed ?? 0}</p>\n <p className=\"text-xs text-text-secondary\">Completed</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Loader2 className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{avgProgress}%</p>\n <p className=\"text-xs text-text-secondary\">Avg. In-Progress</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <DollarSign className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">${totalBudget.toLocaleString()}</p>\n <p className=\"text-xs text-text-secondary\">Total Budget</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search bookings by title, provider, or service...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-text-secondary\" />\n {(['all', 'pending', 'in_progress', 'completed', 'cancelled'] as const).map((status) => (\n <Button\n key={status}\n variant={statusFilter === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setStatusFilter(status)}\n >\n {status === 'all' ? 'All' : statusConfig[status].label}\n <span className=\"ml-1 text-xs opacity-70\">({statusCounts[status] ?? 0})</span>\n </Button>\n ))}\n </div>\n </div>\n\n {/* Sort controls */}\n <div className=\"flex gap-2\">\n {[\n { field: 'date' as SortField, label: 'Date' },\n { field: 'budget' as SortField, label: 'Budget' },\n { field: 'progress' as SortField, label: 'Progress' },\n ].map(({ field, label }) => (\n <button\n key={field}\n onClick={() => handleSort(field)}\n className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortField === field\n ? 'border-primary bg-action-primary-bg/5 text-primary'\n : 'text-text-secondary hover:bg-bg-sunken/50'\n }`}\n >\n <ArrowUpDown className=\"h-3 w-3\" />\n {label}\n </button>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Booking list */}\n <div className={`space-y-3 ${selectedBooking ? 'lg:col-span-2' : 'lg:col-span-3'}`}>\n {filtered.length === 0 ? (\n <Card>\n <CardContent className=\"py-12 text-center text-text-secondary\">\n No bookings match your filters.\n </CardContent>\n </Card>\n ) : (\n filtered.map((booking) => {\n const config = statusConfig[booking.status];\n const StatusIcon = config.icon;\n return (\n <Card\n key={booking.id}\n className={`cursor-pointer transition-colors hover:bg-bg-sunken/30 ${\n selectedBookingId === booking.id ? 'border-primary ring-1 ring-primary' : ''\n }`}\n onClick={() =>\n setSelectedBookingId(selectedBookingId === booking.id ? null : booking.id)\n }\n >\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <StatusIcon className={`h-4 w-4 ${config.color}`} />\n <h3 className=\"font-medium\">{booking.title}</h3>\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {booking.description}\n </p>\n <div className=\"flex flex-wrap items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <User className=\"h-3 w-3\" /> {booking.providerName}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> {booking.startDate}\n </span>\n <span className=\"flex items-center gap-1\">\n <DollarSign className=\"h-3 w-3\" /> ${booking.budget.toLocaleString()}\n </span>\n </div>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <Badge variant={config.badgeVariant}>{config.label}</Badge>\n {booking.status === 'in_progress' && (\n <span className=\"text-sm font-medium\">{booking.progress}%</span>\n )}\n <ChevronRight className=\"h-4 w-4 text-text-secondary\" />\n </div>\n </div>\n\n {/* Progress bar for in-progress bookings */}\n {booking.status === 'in_progress' && (\n <div className=\"mt-3\">\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-blue-500 transition-all\"\n style={{ width: `${booking.progress}%` }}\n />\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n );\n })\n )}\n </div>\n\n {/* Detail panel */}\n {selectedBooking && (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Booking Details</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSelectedBookingId(null)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <h3 className=\"font-semibold\">{selectedBooking.title}</h3>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {selectedBooking.description}\n </p>\n </div>\n\n <Badge variant={statusConfig[selectedBooking.status].badgeVariant}>\n {statusConfig[selectedBooking.status].label}\n </Badge>\n\n {selectedBooking.status === 'in_progress' && (\n <div>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Progress</span>\n <span className=\"font-medium\">{selectedBooking.progress}%</span>\n </div>\n <div className=\"mt-1 h-2 w-full overflow-hidden rounded-full bg-bg-sunken\">\n <div\n className=\"h-2 rounded-full bg-blue-500\"\n style={{ width: `${selectedBooking.progress}%` }}\n />\n </div>\n </div>\n )}\n\n <div className=\"space-y-2 border-t pt-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service</span>\n <span className=\"font-medium\">{selectedBooking.serviceName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Provider</span>\n <span className=\"font-medium\">{selectedBooking.providerName}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Budget</span>\n <span className=\"font-medium\">${selectedBooking.budget.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Start Date</span>\n <span className=\"font-medium\">{selectedBooking.startDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">End Date</span>\n <span className=\"font-medium\">{selectedBooking.endDate}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Payment</span>\n <Badge variant=\"secondary\">{selectedBooking.paymentStatus}</Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Method</span>\n <span className=\"font-medium\">\n {selectedBooking.paymentMethod.replace('_', ' ')}\n </span>\n </div>\n </div>\n\n <div className=\"flex gap-2 border-t pt-3\">\n <Button className=\"flex-1\" size=\"sm\" variant=\"outline\">\n Message Provider\n </Button>\n {selectedBooking.status === 'pending' && (\n <Button className=\"flex-1\" size=\"sm\" variant=\"destructive\">\n Cancel\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AA0BA,IAAM,IAQF;CACF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAmB,MAAM;EAAO,cAAc;EAAa;CAC/F,aAAa;EACX,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACD,WAAW;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACD,WAAW;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,cAAc;EACf;CACF;AAID,SAAgB,IAAe;CAC7B,IAAM,EAAE,gBAAa,GAAyB,EACxC,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAc,KAAmB,EAAgC,MAAM,EACxE,CAAC,GAAW,KAAgB,EAAoB,OAAO,EACvD,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAmB,KAAwB,EAAwB,KAAK,EAEzE,IAAW,QAAc;EAC7B,IAAI,IAAS;AAMb,MAJI,MAAiB,UACnB,IAAS,EAAO,QAAQ,MAAM,EAAE,WAAW,EAAa,GAGtD,EAAY,MAAM,EAAE;GACtB,IAAM,IAAI,EAAY,aAAa;AACnC,OAAS,EAAO,QACb,MACC,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,IACjC,EAAE,aAAa,aAAa,CAAC,SAAS,EAAE,IACxC,EAAE,YAAY,aAAa,CAAC,SAAS,EAAE,CAC1C;;AAaH,SAVA,IAAS,CAAC,GAAG,EAAO,CAAC,MAAM,GAAG,MAAM;GAClC,IAAM,IACJ,MAAc,SACV,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GACjE,MAAc,WACZ,EAAE,SAAS,EAAE,SACb,EAAE,WAAW,EAAE;AACvB,UAAO,IAAU,CAAC,IAAM;IACxB,EAEK;IACN;EAAC;EAAU;EAAa;EAAc;EAAW;EAAQ,CAAC,EAEvD,IAAkB,IACpB,EAAS,MAAM,MAAM,EAAE,OAAO,EAAkB,GAChD,MAEE,IAAe,QAAc;EACjC,IAAM,IAAiC,EAAE,KAAK,EAAS,QAAQ;AAC/D,OAAK,IAAM,KAAK,EACd,GAAO,EAAE,WAAW,EAAO,EAAE,WAAW,KAAK;AAE/C,SAAO;IACN,CAAC,EAAS,CAAC,EAER,IAAc,EAAS,QAAQ,GAAK,MAAM,IAAM,EAAE,QAAQ,EAAE,EAC5D,IAAc,KAAK,MACvB,EAAS,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC,QAAQ,GAAK,MAAM,IAAM,EAAE,UAAU,EAAE,GACxF,KAAK,IAAI,GAAG,EAAS,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC,OAAO,CACzE,EAEK,KAAc,MAAqB;AACvC,EAAI,MAAc,IAAO,EAAW,CAAC,EAAQ,IAE3C,EAAa,EAAM,EACnB,EAAW,GAAM;;AAIrB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAyB;KAAa,CAAA,EACpD,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,eAC9B;OACL;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAU,WAAU,yBAA0B,CAAA;QAC1C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAS;QAAW,CAAA,EACvD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAkB,CAAA,CACzD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAc,WAAU,0BAA2B,CAAA;QAC/C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAa,aAAa;QAAM,CAAA,EACnE,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAa,CAAA,CACpD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAS,WAAU,2BAA4B,CAAA;QAC3C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAmC,GAAY,IAAK;WACpD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAoB,CAAA,CAC3D,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAY,WAAU,2BAA4B,CAAA;QAC9C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAkC,KAAE,EAAY,gBAAgB,CAAK;WACrE,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAgB,CAAA,CACvD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACH;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EAChD;MAAC;MAAO;MAAW;MAAe;MAAa;MAAY,CAAW,KAAK,MAC3E,kBAAC,GAAD;MAEE,SAAS,MAAiB,IAAS,YAAY;MAC/C,MAAK;MACL,eAAe,EAAgB,EAAO;gBAJxC,CAMG,MAAW,QAAQ,QAAQ,EAAa,GAAQ,OACjD,kBAAC,QAAD;OAAM,WAAU;iBAAhB;QAA0C;QAAE,EAAa,MAAW;QAAE;QAAQ;SACvE;QAPF,EAOE,CACT,CACE;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,OAAO;MAAqB,OAAO;MAAQ;KAC7C;MAAE,OAAO;MAAuB,OAAO;MAAU;KACjD;MAAE,OAAO;MAAyB,OAAO;MAAY;KACtD,CAAC,KAAK,EAAE,UAAO,eACd,kBAAC,UAAD;KAEE,eAAe,EAAW,EAAM;KAChC,WAAW,4DACT,MAAc,IACV,uDACA;eANR,CASE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAClC,EACM;OAVF,EAUE,CACT;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CAEE,kBAAC,OAAD;KAAK,WAAW,aAAa,IAAkB,kBAAkB;eAC9D,EAAS,WAAW,IACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAwC;MAEjD,CAAA,EACT,CAAA,GAEP,EAAS,KAAK,MAAY;MACxB,IAAM,IAAS,EAAa,EAAQ,SAC9B,IAAa,EAAO;AAC1B,aACE,kBAAC,GAAD;OAEE,WAAW,0DACT,MAAsB,EAAQ,KAAK,uCAAuC;OAE5E,eACE,EAAqB,MAAsB,EAAQ,KAAK,OAAO,EAAQ,GAAG;iBAG5E,kBAAC,GAAD;QAAa,WAAU;kBAAvB,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,GAAD,EAAY,WAAW,WAAW,EAAO,SAAW,CAAA,EACpD,kBAAC,MAAD;aAAI,WAAU;uBAAe,EAAQ;aAAW,CAAA,CAC5C;;WACN,kBAAC,KAAD;YAAG,WAAU;sBACV,EAAQ;YACP,CAAA;WACJ,kBAAC,OAAD;YAAK,WAAU;sBAAf;aACE,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;;eAAE,EAAQ;eACjC;;aACP,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;;eAAE,EAAQ;eACrC;;aACP,kBAAC,QAAD;cAAM,WAAU;wBAAhB;eACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA;;eAAG,EAAQ,OAAO,gBAAgB;eAC/D;;aACH;;WACF;aACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAO,SAAS,EAAO;sBAAe,EAAO;YAAc,CAAA;WAC1D,EAAQ,WAAW,iBAClB,kBAAC,QAAD;YAAM,WAAU;sBAAhB,CAAuC,EAAQ,UAAS,IAAQ;;WAElE,kBAAC,GAAD,EAAc,WAAU,+BAAgC,CAAA;WACpD;YACF;YAGL,EAAQ,WAAW,iBAClB,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAU;WACV,OAAO,EAAE,OAAO,GAAG,EAAQ,SAAS,IAAI;WACxC,CAAA;UACE,CAAA;SACF,CAAA,CAEI;;OACT,EAnDA,EAAQ,GAmDR;OAET;KAEA,CAAA,EAGL,KACC,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,WAAU;iBAAY;OAA2B,CAAA,EAC5D,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,EAAqB,KAAK;iBAAE;OAEtE,CAAA,CACL;SACK,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;QAAI,WAAU;kBAAiB,EAAgB;QAAW,CAAA,EAC1D,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAgB;QACf,CAAA,CACA,EAAA,CAAA;OAEN,kBAAC,GAAD;QAAO,SAAS,EAAa,EAAgB,QAAQ;kBAClD,EAAa,EAAgB,QAAQ;QAChC,CAAA;OAEP,EAAgB,WAAW,iBAC1B,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAsB;SAAe,CAAA,EACrD,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CAA+B,EAAgB,UAAS,IAAQ;WAC5D;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,EAAgB,SAAS,IAAI;SAChD,CAAA;QACE,CAAA,CACF,EAAA,CAAA;OAGR,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAc,CAAA,EACpD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAmB,CAAA,CAC9D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAe,CAAA,EACrD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAoB,CAAA,CAC/D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAa,CAAA,EACnD,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CAA8B,KAAE,EAAgB,OAAO,gBAAgB,CAAQ;aAC3E;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAiB,CAAA,EACvD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAiB,CAAA,CAC5D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAe,CAAA,EACrD,kBAAC,QAAD;WAAM,WAAU;qBAAe,EAAgB;WAAe,CAAA,CAC1D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAc,CAAA,EACpD,kBAAC,GAAD;WAAO,SAAQ;qBAAa,EAAgB;WAAsB,CAAA,CAC9D;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAa,CAAA,EACnD,kBAAC,QAAD;WAAM,WAAU;qBACb,EAAgB,cAAc,QAAQ,KAAK,IAAI;WAC3C,CAAA,CACH;;SACF;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAQ,WAAU;SAAS,MAAK;SAAK,SAAQ;mBAAU;SAE9C,CAAA,EACR,EAAgB,WAAW,aAC1B,kBAAC,GAAD;SAAQ,WAAU;SAAS,MAAK;SAAK,SAAQ;mBAAc;SAElD,CAAA,CAEP;;OACM;QACT,EAAA,CAAA;KACH,CAAA,CAEJ;;GACF"}
@@ -34,15 +34,15 @@ function E() {
34
34
  className: "text-2xl font-semibold",
35
35
  children: D("proserviceworld.dashboard.title", "Dashboard")
36
36
  }), /* @__PURE__ */ v("p", {
37
- className: "text-sm text-muted-foreground",
37
+ className: "text-sm text-text-secondary",
38
38
  children: D("proserviceworld.dashboard.subtitle", "Welcome back! Here is your activity overview.")
39
39
  })] }), /* @__PURE__ */ y("div", {
40
40
  className: "flex items-center gap-2",
41
41
  children: [/* @__PURE__ */ v("div", {
42
- className: "flex bg-muted rounded-lg p-1",
42
+ className: "flex bg-bg-sunken rounded-lg p-1",
43
43
  children: B.map((e) => /* @__PURE__ */ v("button", {
44
44
  onClick: () => P(e.id),
45
- className: `px-3 py-1.5 rounded text-sm font-medium transition-colors ${N === e.id ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground"}`,
45
+ className: `px-3 py-1.5 rounded text-sm font-medium transition-colors ${N === e.id ? "bg-bg-surface text-text-primary shadow-sm" : "text-text-secondary hover:text-text-primary"}`,
46
46
  children: e.label
47
47
  }, e.id))
48
48
  }), z > 0 && /* @__PURE__ */ y(x, {
@@ -63,7 +63,7 @@ function E() {
63
63
  className: "text-xl font-bold",
64
64
  children: D("proserviceworld.dashboard.client.welcomeTitle", "Welcome back, Alex!")
65
65
  }), /* @__PURE__ */ v("p", {
66
- className: "text-muted-foreground mt-1",
66
+ className: "text-text-secondary mt-1",
67
67
  children: D("proserviceworld.dashboard.client.welcomeSubtitle", "Manage your services, bookings, and find new providers")
68
68
  })] }), /* @__PURE__ */ y(x, {
69
69
  size: "sm",
@@ -84,7 +84,7 @@ function E() {
84
84
  className: "text-2xl font-bold",
85
85
  children: F.length
86
86
  }), /* @__PURE__ */ v("p", {
87
- className: "text-sm text-muted-foreground",
87
+ className: "text-sm text-text-secondary",
88
88
  children: D("proserviceworld.dashboard.client.metrics.activeBookings", "Active Bookings")
89
89
  })]
90
90
  })]
@@ -100,7 +100,7 @@ function E() {
100
100
  className: "text-2xl font-bold",
101
101
  children: "4.8"
102
102
  }), /* @__PURE__ */ v("p", {
103
- className: "text-sm text-muted-foreground",
103
+ className: "text-sm text-text-secondary",
104
104
  children: D("proserviceworld.dashboard.client.metrics.avgRatingGiven", "Avg. Rating Given")
105
105
  })]
106
106
  })]
@@ -116,7 +116,7 @@ function E() {
116
116
  className: "text-2xl font-bold",
117
117
  children: I.length
118
118
  }), /* @__PURE__ */ v("p", {
119
- className: "text-sm text-muted-foreground",
119
+ className: "text-sm text-text-secondary",
120
120
  children: D("proserviceworld.dashboard.client.metrics.completedProjects", "Completed Projects")
121
121
  })]
122
122
  })]
@@ -132,7 +132,7 @@ function E() {
132
132
  className: "text-2xl font-bold",
133
133
  children: ["$", R.toLocaleString()]
134
134
  }), /* @__PURE__ */ v("p", {
135
- className: "text-sm text-muted-foreground",
135
+ className: "text-sm text-text-secondary",
136
136
  children: D("proserviceworld.dashboard.client.metrics.totalSpent", "Total Spent")
137
137
  })]
138
138
  })]
@@ -154,13 +154,13 @@ function E() {
154
154
  children: [/* @__PURE__ */ y("div", {
155
155
  className: "flex items-center space-x-4",
156
156
  children: [/* @__PURE__ */ v("div", {
157
- className: "h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center",
157
+ className: "h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center",
158
158
  children: /* @__PURE__ */ v(o, { className: "h-5 w-5 text-primary" })
159
159
  }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
160
160
  className: "font-medium",
161
161
  children: e.title
162
162
  }), /* @__PURE__ */ v("p", {
163
- className: "text-sm text-muted-foreground",
163
+ className: "text-sm text-text-secondary",
164
164
  children: D("proserviceworld.dashboard.client.booking.provider", "Provider: {{name}}", { name: e.providerName })
165
165
  })] })]
166
166
  }), /* @__PURE__ */ y("div", {
@@ -188,7 +188,7 @@ function E() {
188
188
  className: "text-xl font-bold",
189
189
  children: D("proserviceworld.dashboard.provider.welcomeTitle", "Welcome back, Provider!")
190
190
  }), /* @__PURE__ */ v("p", {
191
- className: "text-muted-foreground mt-1",
191
+ className: "text-text-secondary mt-1",
192
192
  children: D("proserviceworld.dashboard.provider.welcomeSubtitle", "Manage your services, bookings, and grow your business")
193
193
  })] }), /* @__PURE__ */ y("div", {
194
194
  className: "flex gap-2",
@@ -216,7 +216,7 @@ function E() {
216
216
  className: "text-2xl font-bold",
217
217
  children: "4.9"
218
218
  }), /* @__PURE__ */ v("p", {
219
- className: "text-sm text-muted-foreground",
219
+ className: "text-sm text-text-secondary",
220
220
  children: D("proserviceworld.dashboard.provider.metrics.rating", "Rating ({{count}} reviews)", { count: j.length })
221
221
  })]
222
222
  })]
@@ -232,7 +232,7 @@ function E() {
232
232
  className: "text-2xl font-bold",
233
233
  children: F.length
234
234
  }), /* @__PURE__ */ v("p", {
235
- className: "text-sm text-muted-foreground",
235
+ className: "text-sm text-text-secondary",
236
236
  children: D("proserviceworld.dashboard.provider.metrics.activeProjects", "Active Projects")
237
237
  })]
238
238
  })]
@@ -248,7 +248,7 @@ function E() {
248
248
  className: "text-2xl font-bold",
249
249
  children: "98%"
250
250
  }), /* @__PURE__ */ v("p", {
251
- className: "text-sm text-muted-foreground",
251
+ className: "text-sm text-text-secondary",
252
252
  children: D("proserviceworld.dashboard.provider.metrics.completionRate", "Completion Rate")
253
253
  })]
254
254
  })]
@@ -264,7 +264,7 @@ function E() {
264
264
  className: "text-2xl font-bold",
265
265
  children: "$12,850"
266
266
  }), /* @__PURE__ */ v("p", {
267
- className: "text-sm text-muted-foreground",
267
+ className: "text-sm text-text-secondary",
268
268
  children: D("proserviceworld.dashboard.provider.metrics.thisMonth", "This Month")
269
269
  })]
270
270
  })]
@@ -295,7 +295,7 @@ function E() {
295
295
  children: e.title
296
296
  }),
297
297
  /* @__PURE__ */ v("p", {
298
- className: "text-sm text-muted-foreground mb-2 line-clamp-2",
298
+ className: "text-sm text-text-secondary mb-2 line-clamp-2",
299
299
  children: e.description
300
300
  }),
301
301
  /* @__PURE__ */ y("div", {
@@ -324,7 +324,7 @@ function E() {
324
324
  className: "text-xl font-bold",
325
325
  children: D("proserviceworld.dashboard.admin.title", "Admin Dashboard")
326
326
  }), /* @__PURE__ */ v("p", {
327
- className: "text-muted-foreground mt-1",
327
+ className: "text-text-secondary mt-1",
328
328
  children: D("proserviceworld.dashboard.admin.subtitle", "Monitor platform activity and manage users")
329
329
  })] }), /* @__PURE__ */ y("div", {
330
330
  className: "flex gap-2",
@@ -352,7 +352,7 @@ function E() {
352
352
  className: "text-2xl font-bold",
353
353
  children: k.length
354
354
  }), /* @__PURE__ */ v("p", {
355
- className: "text-sm text-muted-foreground",
355
+ className: "text-sm text-text-secondary",
356
356
  children: D("proserviceworld.dashboard.admin.metrics.totalProviders", "Total Providers")
357
357
  })]
358
358
  })]
@@ -368,7 +368,7 @@ function E() {
368
368
  className: "text-2xl font-bold",
369
369
  children: A.length
370
370
  }), /* @__PURE__ */ v("p", {
371
- className: "text-sm text-muted-foreground",
371
+ className: "text-sm text-text-secondary",
372
372
  children: D("proserviceworld.dashboard.admin.metrics.totalServices", "Total Services")
373
373
  })]
374
374
  })]
@@ -384,7 +384,7 @@ function E() {
384
384
  className: "text-2xl font-bold",
385
385
  children: O.length
386
386
  }), /* @__PURE__ */ v("p", {
387
- className: "text-sm text-muted-foreground",
387
+ className: "text-sm text-text-secondary",
388
388
  children: D("proserviceworld.dashboard.admin.metrics.totalBookings", "Total Bookings")
389
389
  })]
390
390
  })]
@@ -400,7 +400,7 @@ function E() {
400
400
  className: "text-2xl font-bold",
401
401
  children: "$45,670"
402
402
  }), /* @__PURE__ */ v("p", {
403
- className: "text-sm text-muted-foreground",
403
+ className: "text-sm text-text-secondary",
404
404
  children: D("proserviceworld.dashboard.admin.metrics.totalRevenue", "Total Revenue")
405
405
  })]
406
406
  })]
@@ -416,7 +416,7 @@ function E() {
416
416
  className: "flex items-center space-x-4",
417
417
  children: [
418
418
  /* @__PURE__ */ v("div", {
419
- className: "h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center",
419
+ className: "h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center",
420
420
  children: /* @__PURE__ */ v("span", {
421
421
  className: "text-primary font-medium",
422
422
  children: e.name.charAt(0)
@@ -428,7 +428,7 @@ function E() {
428
428
  className: "font-medium",
429
429
  children: e.businessName
430
430
  }), /* @__PURE__ */ v("p", {
431
- className: "text-sm text-muted-foreground",
431
+ className: "text-sm text-text-secondary",
432
432
  children: e.specializations[0]
433
433
  })]
434
434
  }),
@@ -447,7 +447,7 @@ function E() {
447
447
  className: "font-medium text-sm",
448
448
  children: D("proserviceworld.dashboard.admin.alerts.pendingVerifications.title", "Pending Verifications")
449
449
  }), /* @__PURE__ */ v("p", {
450
- className: "text-sm text-muted-foreground",
450
+ className: "text-sm text-text-secondary",
451
451
  children: D("proserviceworld.dashboard.admin.alerts.pendingVerifications.description", "3 providers awaiting verification")
452
452
  })] })]
453
453
  }),
@@ -457,7 +457,7 @@ function E() {
457
457
  className: "font-medium text-sm",
458
458
  children: D("proserviceworld.dashboard.admin.alerts.systemStatus.title", "System Status")
459
459
  }), /* @__PURE__ */ v("p", {
460
- className: "text-sm text-muted-foreground",
460
+ className: "text-sm text-text-secondary",
461
461
  children: D("proserviceworld.dashboard.admin.alerts.systemStatus.description", "All systems operational")
462
462
  })] })]
463
463
  }),
@@ -467,7 +467,7 @@ function E() {
467
467
  className: "font-medium text-sm",
468
468
  children: D("proserviceworld.dashboard.admin.alerts.newReviews.title", "New Reviews")
469
469
  }), /* @__PURE__ */ v("p", {
470
- className: "text-sm text-muted-foreground",
470
+ className: "text-sm text-text-secondary",
471
471
  children: D("proserviceworld.dashboard.admin.alerts.newReviews.description", "12 new reviews this week")
472
472
  })] })]
473
473
  })
@@ -487,7 +487,7 @@ function E() {
487
487
  className: "text-xl font-bold",
488
488
  children: D("proserviceworld.dashboard.team.title", "Welcome, Team Member!")
489
489
  }), /* @__PURE__ */ v("p", {
490
- className: "text-muted-foreground mt-1",
490
+ className: "text-text-secondary mt-1",
491
491
  children: D("proserviceworld.dashboard.team.subtitle", "Manage assigned tasks and projects")
492
492
  })] }), /* @__PURE__ */ y(x, {
493
493
  variant: "outline",
@@ -509,7 +509,7 @@ function E() {
509
509
  className: "text-2xl font-bold",
510
510
  children: "8"
511
511
  }), /* @__PURE__ */ v("p", {
512
- className: "text-sm text-muted-foreground",
512
+ className: "text-sm text-text-secondary",
513
513
  children: D("proserviceworld.dashboard.team.metrics.tasksCompleted", "Tasks Completed")
514
514
  })]
515
515
  })]
@@ -525,7 +525,7 @@ function E() {
525
525
  className: "text-2xl font-bold",
526
526
  children: L.length
527
527
  }), /* @__PURE__ */ v("p", {
528
- className: "text-sm text-muted-foreground",
528
+ className: "text-sm text-text-secondary",
529
529
  children: D("proserviceworld.dashboard.team.metrics.pendingTasks", "Pending Tasks")
530
530
  })]
531
531
  })]
@@ -541,7 +541,7 @@ function E() {
541
541
  className: "text-2xl font-bold",
542
542
  children: "4.9"
543
543
  }), /* @__PURE__ */ v("p", {
544
- className: "text-sm text-muted-foreground",
544
+ className: "text-sm text-text-secondary",
545
545
  children: D("proserviceworld.dashboard.team.metrics.performanceScore", "Performance Score")
546
546
  })]
547
547
  })]
@@ -557,7 +557,7 @@ function E() {
557
557
  className: "text-2xl font-bold",
558
558
  children: F.length
559
559
  }), /* @__PURE__ */ v("p", {
560
- className: "text-sm text-muted-foreground",
560
+ className: "text-sm text-text-secondary",
561
561
  children: D("proserviceworld.dashboard.team.metrics.activeProjects", "Active Projects")
562
562
  })]
563
563
  })]
@@ -567,8 +567,8 @@ function E() {
567
567
  }),
568
568
  /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, { children: D("proserviceworld.dashboard.team.sections.recentActivity", "Recent Activity") }) }), /* @__PURE__ */ y(C, {
569
569
  className: "text-center py-8",
570
- children: [/* @__PURE__ */ v(f, { className: "h-12 w-12 mx-auto text-muted-foreground mb-4" }), /* @__PURE__ */ v("p", {
571
- className: "text-muted-foreground",
570
+ children: [/* @__PURE__ */ v(f, { className: "h-12 w-12 mx-auto text-text-secondary mb-4" }), /* @__PURE__ */ v("p", {
571
+ className: "text-text-secondary",
572
572
  children: D("proserviceworld.dashboard.team.sections.comingSoon", "Team member features coming soon")
573
573
  })]
574
574
  })] })