@burdenoff/microfe-proserviceworld 2026.509.101

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 (106) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +18199 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +2 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +43046 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
  16. package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
  17. package/dist/proserviceworld/ProServiceWorldRoot.js +151 -0
  18. package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -0
  19. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
  20. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
  21. package/dist/proserviceworld/ProServiceWorldRoutes.js +91 -0
  22. package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -0
  23. package/dist/proserviceworld/index.d.ts +5 -0
  24. package/dist/proserviceworld/index.d.ts.map +1 -0
  25. package/dist/proserviceworld/index.js +3 -0
  26. package/dist/proserviceworld/pages/AdminReportsPage.d.ts +2 -0
  27. package/dist/proserviceworld/pages/AdminReportsPage.d.ts.map +1 -0
  28. package/dist/proserviceworld/pages/AdminReportsPage.js +512 -0
  29. package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -0
  30. package/dist/proserviceworld/pages/AdminUsersPage.d.ts +2 -0
  31. package/dist/proserviceworld/pages/AdminUsersPage.d.ts.map +1 -0
  32. package/dist/proserviceworld/pages/AdminUsersPage.js +444 -0
  33. package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -0
  34. package/dist/proserviceworld/pages/AnalyticsPage.d.ts +2 -0
  35. package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
  36. package/dist/proserviceworld/pages/AnalyticsPage.js +433 -0
  37. package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -0
  38. package/dist/proserviceworld/pages/BookingsPage.d.ts +2 -0
  39. package/dist/proserviceworld/pages/BookingsPage.d.ts.map +1 -0
  40. package/dist/proserviceworld/pages/BookingsPage.js +425 -0
  41. package/dist/proserviceworld/pages/BookingsPage.js.map +1 -0
  42. package/dist/proserviceworld/pages/DashboardPage.d.ts +2 -0
  43. package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
  44. package/dist/proserviceworld/pages/DashboardPage.js +583 -0
  45. package/dist/proserviceworld/pages/DashboardPage.js.map +1 -0
  46. package/dist/proserviceworld/pages/DocumentsPage.d.ts +2 -0
  47. package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
  48. package/dist/proserviceworld/pages/DocumentsPage.js +494 -0
  49. package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -0
  50. package/dist/proserviceworld/pages/MessagesPage.d.ts +2 -0
  51. package/dist/proserviceworld/pages/MessagesPage.d.ts.map +1 -0
  52. package/dist/proserviceworld/pages/MessagesPage.js +229 -0
  53. package/dist/proserviceworld/pages/MessagesPage.js.map +1 -0
  54. package/dist/proserviceworld/pages/PaymentsPage.d.ts +2 -0
  55. package/dist/proserviceworld/pages/PaymentsPage.d.ts.map +1 -0
  56. package/dist/proserviceworld/pages/PaymentsPage.js +479 -0
  57. package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -0
  58. package/dist/proserviceworld/pages/ProjectsPage.d.ts +2 -0
  59. package/dist/proserviceworld/pages/ProjectsPage.d.ts.map +1 -0
  60. package/dist/proserviceworld/pages/ProjectsPage.js +547 -0
  61. package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -0
  62. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts +2 -0
  63. package/dist/proserviceworld/pages/ProviderDetailPage.d.ts.map +1 -0
  64. package/dist/proserviceworld/pages/ProviderDetailPage.js +464 -0
  65. package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -0
  66. package/dist/proserviceworld/pages/ProvidersPage.d.ts +2 -0
  67. package/dist/proserviceworld/pages/ProvidersPage.d.ts.map +1 -0
  68. package/dist/proserviceworld/pages/ProvidersPage.js +342 -0
  69. package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -0
  70. package/dist/proserviceworld/pages/ReviewsPage.d.ts +2 -0
  71. package/dist/proserviceworld/pages/ReviewsPage.d.ts.map +1 -0
  72. package/dist/proserviceworld/pages/ReviewsPage.js +339 -0
  73. package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -0
  74. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts +2 -0
  75. package/dist/proserviceworld/pages/ServiceDetailsPage.d.ts.map +1 -0
  76. package/dist/proserviceworld/pages/ServiceDetailsPage.js +563 -0
  77. package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -0
  78. package/dist/proserviceworld/pages/ServicesPage.d.ts +2 -0
  79. package/dist/proserviceworld/pages/ServicesPage.d.ts.map +1 -0
  80. package/dist/proserviceworld/pages/ServicesPage.js +337 -0
  81. package/dist/proserviceworld/pages/ServicesPage.js.map +1 -0
  82. package/dist/proserviceworld/pages/VerificationPage.d.ts +2 -0
  83. package/dist/proserviceworld/pages/VerificationPage.d.ts.map +1 -0
  84. package/dist/proserviceworld/pages/VerificationPage.js +357 -0
  85. package/dist/proserviceworld/pages/VerificationPage.js.map +1 -0
  86. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
  87. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
  88. package/dist/proserviceworld/providers/ProServiceWorldProvider.js +27 -0
  89. package/dist/proserviceworld/providers/ProServiceWorldProvider.js.map +1 -0
  90. package/dist/proserviceworld/store/proserviceworldStore.d.ts +32 -0
  91. package/dist/proserviceworld/store/proserviceworldStore.d.ts.map +1 -0
  92. package/dist/proserviceworld/store/proserviceworldStore.js +2490 -0
  93. package/dist/proserviceworld/store/proserviceworldStore.js.map +1 -0
  94. package/dist/proserviceworld/types/index.d.ts +338 -0
  95. package/dist/proserviceworld/types/index.d.ts.map +1 -0
  96. package/dist/proserviceworld/utils/cn.d.ts +4 -0
  97. package/dist/proserviceworld/utils/cn.d.ts.map +1 -0
  98. package/dist/proserviceworld/utils/i18n.d.ts +6 -0
  99. package/dist/proserviceworld/utils/i18n.d.ts.map +1 -0
  100. package/dist/proserviceworld/utils/i18n.js +15 -0
  101. package/dist/proserviceworld/utils/i18n.js.map +1 -0
  102. package/dist/proserviceworld/utils/navigation.d.ts +2 -0
  103. package/dist/proserviceworld/utils/navigation.d.ts.map +1 -0
  104. package/dist/proserviceworld/utils/navigation.js +8 -0
  105. package/dist/proserviceworld/utils/navigation.js.map +1 -0
  106. package/package.json +107 -0
@@ -0,0 +1,547 @@
1
+ import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
2
+ import { useMemo as t, useState as n } from "react";
3
+ import { AlertTriangle as r, BarChart3 as i, Calendar as a, CheckCircle2 as o, ChevronRight as s, Clock as c, DollarSign as l, Flag as u, Plus as d, Search as f, Tag as p, Target as m, Users as h } from "lucide-react";
4
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
5
+ import { Badge as y, Button as b, Card as x, CardContent as S, CardHeader as C, CardTitle as w, Input as T } from "@burdenoff/fe-libs/ui";
6
+ //#region src/proserviceworld/pages/ProjectsPage.tsx
7
+ var E = {
8
+ planning: {
9
+ label: "Planning",
10
+ color: "text-yellow-600",
11
+ bgColor: "bg-yellow-100 dark:bg-yellow-950"
12
+ },
13
+ active: {
14
+ label: "Active",
15
+ color: "text-blue-600",
16
+ bgColor: "bg-blue-100 dark:bg-blue-950"
17
+ },
18
+ on_hold: {
19
+ label: "On Hold",
20
+ color: "text-orange-600",
21
+ bgColor: "bg-orange-100 dark:bg-orange-950"
22
+ },
23
+ completed: {
24
+ label: "Completed",
25
+ color: "text-green-600",
26
+ bgColor: "bg-green-100 dark:bg-green-950"
27
+ },
28
+ cancelled: {
29
+ label: "Cancelled",
30
+ color: "text-red-600",
31
+ bgColor: "bg-red-100 dark:bg-red-950"
32
+ }
33
+ }, D = {
34
+ low: {
35
+ label: "Low",
36
+ variant: "outline"
37
+ },
38
+ medium: {
39
+ label: "Medium",
40
+ variant: "secondary"
41
+ },
42
+ high: {
43
+ label: "High",
44
+ variant: "default"
45
+ },
46
+ critical: {
47
+ label: "Critical",
48
+ variant: "destructive"
49
+ }
50
+ };
51
+ function O() {
52
+ let { projects: O } = e(), [k, A] = n(""), [j, M] = n("all"), [N, P] = n(O[0]?.id ?? ""), [F, I] = n("overview"), L = t(() => {
53
+ let e = [...O];
54
+ if (j !== "all" && (e = e.filter((e) => e.status === j)), k.trim()) {
55
+ let t = k.toLowerCase();
56
+ e = e.filter((e) => e.title.toLowerCase().includes(t) || e.category.toLowerCase().includes(t));
57
+ }
58
+ return e;
59
+ }, [
60
+ O,
61
+ j,
62
+ k
63
+ ]), R = O.find((e) => e.id === N);
64
+ return /* @__PURE__ */ v("div", {
65
+ className: "space-y-6 p-6",
66
+ children: [/* @__PURE__ */ v("div", {
67
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
68
+ children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
69
+ className: "text-2xl font-semibold",
70
+ children: "Projects"
71
+ }), /* @__PURE__ */ _("p", {
72
+ className: "text-sm text-muted-foreground",
73
+ children: "Track progress and manage your professional service projects."
74
+ })] }), /* @__PURE__ */ v(b, {
75
+ size: "sm",
76
+ children: [/* @__PURE__ */ _(d, { className: "mr-2 h-4 w-4" }), " New Project"]
77
+ })]
78
+ }), /* @__PURE__ */ v("div", {
79
+ className: "grid gap-6 lg:grid-cols-3",
80
+ children: [/* @__PURE__ */ v("div", {
81
+ className: "space-y-4",
82
+ children: [
83
+ /* @__PURE__ */ v("div", {
84
+ className: "relative",
85
+ children: [/* @__PURE__ */ _(f, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ _(T, {
86
+ placeholder: "Search projects...",
87
+ value: k,
88
+ onChange: (e) => A(e.target.value),
89
+ className: "pl-10"
90
+ })]
91
+ }),
92
+ /* @__PURE__ */ _("div", {
93
+ className: "flex flex-wrap gap-1",
94
+ children: [
95
+ "all",
96
+ "active",
97
+ "planning",
98
+ "completed",
99
+ "on_hold",
100
+ "cancelled"
101
+ ].map((e) => /* @__PURE__ */ _("button", {
102
+ onClick: () => M(e),
103
+ className: `rounded px-2 py-1 text-xs font-medium transition-colors ${j === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground hover:bg-muted/80"}`,
104
+ children: e === "all" ? "All" : E[e].label
105
+ }, e))
106
+ }),
107
+ /* @__PURE__ */ _("div", {
108
+ className: "space-y-2",
109
+ children: L.length === 0 ? /* @__PURE__ */ _("p", {
110
+ className: "py-8 text-center text-sm text-muted-foreground",
111
+ children: "No projects found."
112
+ }) : L.map((e) => {
113
+ let t = E[e.status];
114
+ return /* @__PURE__ */ v("button", {
115
+ onClick: () => {
116
+ P(e.id), I("overview");
117
+ },
118
+ className: `w-full rounded-lg border p-3 text-left transition-colors ${N === e.id ? "border-primary bg-primary/5" : "hover:bg-muted/50"}`,
119
+ children: [
120
+ /* @__PURE__ */ v("div", {
121
+ className: "flex items-center justify-between",
122
+ children: [/* @__PURE__ */ _("h3", {
123
+ className: "font-medium text-sm truncate pr-2",
124
+ children: e.title
125
+ }), /* @__PURE__ */ _(s, { className: "h-4 w-4 shrink-0 text-muted-foreground" })]
126
+ }),
127
+ /* @__PURE__ */ v("div", {
128
+ className: "mt-2 flex items-center gap-2",
129
+ children: [/* @__PURE__ */ _(y, {
130
+ variant: D[e.priority].variant,
131
+ className: "text-xs",
132
+ children: e.priority
133
+ }), /* @__PURE__ */ _("span", {
134
+ className: `text-xs ${t.color}`,
135
+ children: t.label
136
+ })]
137
+ }),
138
+ /* @__PURE__ */ v("div", {
139
+ className: "mt-2",
140
+ children: [/* @__PURE__ */ v("div", {
141
+ className: "flex items-center justify-between text-xs text-muted-foreground",
142
+ children: [/* @__PURE__ */ _("span", { children: "Progress" }), /* @__PURE__ */ v("span", { children: [e.progress, "%"] })]
143
+ }), /* @__PURE__ */ _("div", {
144
+ className: "mt-1 h-1.5 overflow-hidden rounded-full bg-muted",
145
+ children: /* @__PURE__ */ _("div", {
146
+ className: "h-1.5 rounded-full bg-primary transition-all",
147
+ style: { width: `${e.progress}%` }
148
+ })
149
+ })]
150
+ })
151
+ ]
152
+ }, e.id);
153
+ })
154
+ })
155
+ ]
156
+ }), /* @__PURE__ */ _("div", {
157
+ className: "space-y-4 lg:col-span-2",
158
+ children: R ? /* @__PURE__ */ v(g, { children: [
159
+ /* @__PURE__ */ _(x, { children: /* @__PURE__ */ v(S, {
160
+ className: "pt-6",
161
+ children: [
162
+ /* @__PURE__ */ v("div", {
163
+ className: "flex flex-wrap items-start justify-between gap-4",
164
+ children: [/* @__PURE__ */ v("div", {
165
+ className: "space-y-2",
166
+ children: [
167
+ /* @__PURE__ */ v("div", {
168
+ className: "flex items-center gap-2",
169
+ children: [/* @__PURE__ */ v(y, {
170
+ variant: D[R.priority].variant,
171
+ children: [R.priority, " priority"]
172
+ }), /* @__PURE__ */ _("span", {
173
+ className: `text-sm font-medium ${E[R.status].color}`,
174
+ children: E[R.status].label
175
+ })]
176
+ }),
177
+ /* @__PURE__ */ _("h2", {
178
+ className: "text-xl font-bold",
179
+ children: R.title
180
+ }),
181
+ /* @__PURE__ */ _("p", {
182
+ className: "text-sm text-muted-foreground",
183
+ children: R.description
184
+ })
185
+ ]
186
+ }), /* @__PURE__ */ v("div", {
187
+ className: "text-right",
188
+ children: [
189
+ /* @__PURE__ */ _("p", {
190
+ className: "text-sm text-muted-foreground",
191
+ children: "Budget"
192
+ }),
193
+ /* @__PURE__ */ v("p", {
194
+ className: "text-xl font-bold",
195
+ children: ["$", R.budget.toLocaleString()]
196
+ }),
197
+ /* @__PURE__ */ v("p", {
198
+ className: "text-xs text-muted-foreground",
199
+ children: [
200
+ "Spent: $",
201
+ R.spent.toLocaleString(),
202
+ " (",
203
+ Math.round(R.spent / R.budget * 100),
204
+ "%)"
205
+ ]
206
+ })
207
+ ]
208
+ })]
209
+ }),
210
+ /* @__PURE__ */ v("div", {
211
+ className: "mt-4",
212
+ children: [/* @__PURE__ */ v("div", {
213
+ className: "flex items-center justify-between text-sm",
214
+ children: [/* @__PURE__ */ _("span", {
215
+ className: "text-muted-foreground",
216
+ children: "Overall Progress"
217
+ }), /* @__PURE__ */ v("span", {
218
+ className: "font-medium",
219
+ children: [R.progress, "%"]
220
+ })]
221
+ }), /* @__PURE__ */ _("div", {
222
+ className: "mt-1 h-3 overflow-hidden rounded-full bg-muted",
223
+ children: /* @__PURE__ */ _("div", {
224
+ className: "h-3 rounded-full bg-primary transition-all",
225
+ style: { width: `${R.progress}%` }
226
+ })
227
+ })]
228
+ }),
229
+ /* @__PURE__ */ v("div", {
230
+ className: "mt-4 flex flex-wrap gap-4 text-sm",
231
+ children: [
232
+ /* @__PURE__ */ v("span", {
233
+ className: "flex items-center gap-1 text-muted-foreground",
234
+ children: [
235
+ /* @__PURE__ */ _(a, { className: "h-4 w-4" }),
236
+ " ",
237
+ R.startDate,
238
+ " -",
239
+ " ",
240
+ R.endDate
241
+ ]
242
+ }),
243
+ /* @__PURE__ */ v("span", {
244
+ className: "flex items-center gap-1 text-muted-foreground",
245
+ children: [
246
+ /* @__PURE__ */ _(h, { className: "h-4 w-4" }),
247
+ " ",
248
+ R.teamMembers.length,
249
+ " members"
250
+ ]
251
+ }),
252
+ /* @__PURE__ */ v("span", {
253
+ className: "flex items-center gap-1 text-muted-foreground",
254
+ children: [
255
+ /* @__PURE__ */ _(m, { className: "h-4 w-4" }),
256
+ " ",
257
+ R.milestones.length,
258
+ " milestones"
259
+ ]
260
+ })
261
+ ]
262
+ }),
263
+ R.tags.length > 0 && /* @__PURE__ */ v("div", {
264
+ className: "mt-3 flex items-center gap-2",
265
+ children: [/* @__PURE__ */ _(p, { className: "h-4 w-4 text-muted-foreground" }), R.tags.map((e) => /* @__PURE__ */ _(y, {
266
+ variant: "outline",
267
+ className: "text-xs",
268
+ children: e
269
+ }, e))]
270
+ })
271
+ ]
272
+ }) }),
273
+ /* @__PURE__ */ _("div", {
274
+ className: "flex gap-1 border-b",
275
+ children: [
276
+ {
277
+ key: "overview",
278
+ label: "Overview"
279
+ },
280
+ {
281
+ key: "timeline",
282
+ label: "Timeline"
283
+ },
284
+ {
285
+ key: "milestones",
286
+ label: "Milestones"
287
+ },
288
+ {
289
+ key: "team",
290
+ label: "Team"
291
+ }
292
+ ].map(({ key: e, label: t }) => /* @__PURE__ */ _("button", {
293
+ onClick: () => I(e),
294
+ className: `border-b-2 px-4 py-2 text-sm font-medium transition-colors ${F === e ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
295
+ children: t
296
+ }, e))
297
+ }),
298
+ F === "overview" && /* @__PURE__ */ v("div", {
299
+ className: "grid gap-4 sm:grid-cols-2",
300
+ children: [/* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ v(w, {
301
+ className: "text-base flex items-center gap-2",
302
+ children: [/* @__PURE__ */ _(l, { className: "h-4 w-4" }), " Budget Overview"]
303
+ }) }), /* @__PURE__ */ v(S, {
304
+ className: "space-y-3",
305
+ children: [
306
+ /* @__PURE__ */ v("div", {
307
+ className: "flex justify-between text-sm",
308
+ children: [/* @__PURE__ */ _("span", {
309
+ className: "text-muted-foreground",
310
+ children: "Total Budget"
311
+ }), /* @__PURE__ */ v("span", {
312
+ className: "font-medium",
313
+ children: ["$", R.budget.toLocaleString()]
314
+ })]
315
+ }),
316
+ /* @__PURE__ */ v("div", {
317
+ className: "flex justify-between text-sm",
318
+ children: [/* @__PURE__ */ _("span", {
319
+ className: "text-muted-foreground",
320
+ children: "Spent"
321
+ }), /* @__PURE__ */ v("span", {
322
+ className: "font-medium",
323
+ children: ["$", R.spent.toLocaleString()]
324
+ })]
325
+ }),
326
+ /* @__PURE__ */ v("div", {
327
+ className: "flex justify-between text-sm",
328
+ children: [/* @__PURE__ */ _("span", {
329
+ className: "text-muted-foreground",
330
+ children: "Remaining"
331
+ }), /* @__PURE__ */ v("span", {
332
+ className: "font-medium text-green-600",
333
+ children: ["$", (R.budget - R.spent).toLocaleString()]
334
+ })]
335
+ }),
336
+ /* @__PURE__ */ _("div", {
337
+ className: "h-2 overflow-hidden rounded-full bg-muted",
338
+ children: /* @__PURE__ */ _("div", {
339
+ className: "h-2 rounded-full bg-primary",
340
+ style: { width: `${Math.round(R.spent / R.budget * 100)}%` }
341
+ })
342
+ })
343
+ ]
344
+ })] }), /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ v(w, {
345
+ className: "text-base flex items-center gap-2",
346
+ children: [/* @__PURE__ */ _(i, { className: "h-4 w-4" }), " Milestone Summary"]
347
+ }) }), /* @__PURE__ */ _(S, {
348
+ className: "space-y-3",
349
+ children: [
350
+ "completed",
351
+ "in_progress",
352
+ "pending",
353
+ "overdue"
354
+ ].map((e) => {
355
+ let t = R.milestones.filter((t) => t.status === e).length;
356
+ return /* @__PURE__ */ v("div", {
357
+ className: "flex items-center justify-between text-sm",
358
+ children: [/* @__PURE__ */ _("span", {
359
+ className: "text-muted-foreground capitalize",
360
+ children: e.replace("_", " ")
361
+ }), /* @__PURE__ */ _("span", {
362
+ className: "font-medium",
363
+ children: t
364
+ })]
365
+ }, e);
366
+ })
367
+ })] })]
368
+ }),
369
+ F === "timeline" && /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
370
+ className: "pt-6",
371
+ children: /* @__PURE__ */ _("div", {
372
+ className: "relative space-y-0",
373
+ children: R.milestones.map((e, t) => /* @__PURE__ */ v("div", {
374
+ className: "relative flex gap-4 pb-8",
375
+ children: [
376
+ t !== R.milestones.length - 1 && /* @__PURE__ */ _("div", { className: "absolute left-[11px] top-6 h-full w-0.5 bg-muted" }),
377
+ /* @__PURE__ */ v("div", {
378
+ className: `relative z-10 mt-1 h-6 w-6 shrink-0 rounded-full ${{
379
+ completed: "bg-green-500",
380
+ in_progress: "bg-blue-500",
381
+ pending: "bg-gray-300",
382
+ overdue: "bg-red-500"
383
+ }[e.status]} flex items-center justify-center`,
384
+ children: [e.status === "completed" && /* @__PURE__ */ _(o, { className: "h-4 w-4 text-white" }), e.status === "in_progress" && /* @__PURE__ */ _(c, { className: "h-4 w-4 text-white" })]
385
+ }),
386
+ /* @__PURE__ */ v("div", {
387
+ className: "flex-1",
388
+ children: [
389
+ /* @__PURE__ */ v("div", {
390
+ className: "flex items-center gap-2",
391
+ children: [/* @__PURE__ */ _("h4", {
392
+ className: "font-medium",
393
+ children: e.title
394
+ }), /* @__PURE__ */ _(y, {
395
+ variant: D[e.priority].variant,
396
+ className: "text-xs",
397
+ children: e.priority
398
+ })]
399
+ }),
400
+ /* @__PURE__ */ _("p", {
401
+ className: "mt-1 text-sm text-muted-foreground",
402
+ children: e.description
403
+ }),
404
+ /* @__PURE__ */ v("div", {
405
+ className: "mt-2 flex flex-wrap gap-3 text-xs text-muted-foreground",
406
+ children: [/* @__PURE__ */ v("span", {
407
+ className: "flex items-center gap-1",
408
+ children: [
409
+ /* @__PURE__ */ _(a, { className: "h-3 w-3" }),
410
+ " Due: ",
411
+ e.dueDate
412
+ ]
413
+ }), e.completedAt && /* @__PURE__ */ v("span", {
414
+ className: "flex items-center gap-1 text-green-600",
415
+ children: [
416
+ /* @__PURE__ */ _(o, { className: "h-3 w-3" }),
417
+ " Completed:",
418
+ " ",
419
+ e.completedAt
420
+ ]
421
+ })]
422
+ })
423
+ ]
424
+ })
425
+ ]
426
+ }, e.id))
427
+ })
428
+ }) }),
429
+ F === "milestones" && /* @__PURE__ */ _("div", {
430
+ className: "space-y-3",
431
+ children: R.milestones.map((e) => /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
432
+ className: "pt-4",
433
+ children: /* @__PURE__ */ v("div", {
434
+ className: "flex items-start gap-3",
435
+ children: [/* @__PURE__ */ _({
436
+ completed: o,
437
+ in_progress: c,
438
+ pending: m,
439
+ overdue: r
440
+ }[e.status] ?? m, { className: `mt-0.5 h-5 w-5 ${{
441
+ completed: "text-green-600",
442
+ in_progress: "text-blue-600",
443
+ pending: "text-gray-400",
444
+ overdue: "text-red-600"
445
+ }[e.status]}` }), /* @__PURE__ */ v("div", {
446
+ className: "flex-1",
447
+ children: [
448
+ /* @__PURE__ */ v("div", {
449
+ className: "flex items-center gap-2",
450
+ children: [/* @__PURE__ */ _("h4", {
451
+ className: "font-medium",
452
+ children: e.title
453
+ }), /* @__PURE__ */ _(y, {
454
+ variant: D[e.priority].variant,
455
+ className: "text-xs",
456
+ children: e.priority
457
+ })]
458
+ }),
459
+ /* @__PURE__ */ _("p", {
460
+ className: "mt-1 text-sm text-muted-foreground",
461
+ children: e.description
462
+ }),
463
+ e.deliverables.length > 0 && /* @__PURE__ */ v("div", {
464
+ className: "mt-3",
465
+ children: [/* @__PURE__ */ _("p", {
466
+ className: "text-xs font-medium text-muted-foreground",
467
+ children: "Deliverables"
468
+ }), /* @__PURE__ */ _("div", {
469
+ className: "mt-1 flex flex-wrap gap-1",
470
+ children: e.deliverables.map((e) => /* @__PURE__ */ _(y, {
471
+ variant: "outline",
472
+ className: "text-xs",
473
+ children: e
474
+ }, e))
475
+ })]
476
+ }),
477
+ /* @__PURE__ */ v("div", {
478
+ className: "mt-3 flex flex-wrap gap-4 text-xs text-muted-foreground",
479
+ children: [
480
+ /* @__PURE__ */ v("span", {
481
+ className: "flex items-center gap-1",
482
+ children: [
483
+ /* @__PURE__ */ _(a, { className: "h-3 w-3" }),
484
+ " Due: ",
485
+ e.dueDate
486
+ ]
487
+ }),
488
+ e.completedAt && /* @__PURE__ */ v("span", {
489
+ className: "flex items-center gap-1 text-green-600",
490
+ children: [
491
+ /* @__PURE__ */ _(o, { className: "h-3 w-3" }),
492
+ " ",
493
+ e.completedAt
494
+ ]
495
+ }),
496
+ e.dependencies.length > 0 && /* @__PURE__ */ v("span", {
497
+ className: "flex items-center gap-1",
498
+ children: [
499
+ /* @__PURE__ */ _(u, { className: "h-3 w-3" }),
500
+ " ",
501
+ e.dependencies.length,
502
+ " ",
503
+ "dependencies"
504
+ ]
505
+ })
506
+ ]
507
+ }),
508
+ e.notes && /* @__PURE__ */ _("p", {
509
+ className: "mt-2 rounded bg-muted/50 p-2 text-xs text-muted-foreground italic",
510
+ children: e.notes
511
+ })
512
+ ]
513
+ })]
514
+ })
515
+ }) }, e.id))
516
+ }),
517
+ F === "team" && /* @__PURE__ */ v(x, { children: [/* @__PURE__ */ _(C, { children: /* @__PURE__ */ _(w, {
518
+ className: "text-base",
519
+ children: "Team Members"
520
+ }) }), /* @__PURE__ */ _(S, { children: /* @__PURE__ */ _("div", {
521
+ className: "space-y-3",
522
+ children: R.teamMembers.map((e, t) => /* @__PURE__ */ v("div", {
523
+ className: "flex items-center gap-3 rounded-lg border p-3",
524
+ children: [/* @__PURE__ */ _("div", {
525
+ className: "flex h-10 w-10 items-center justify-center rounded-full bg-primary/10 font-semibold text-primary",
526
+ children: e.name.charAt(0)
527
+ }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
528
+ className: "font-medium",
529
+ children: e.name
530
+ }), /* @__PURE__ */ _("p", {
531
+ className: "text-sm text-muted-foreground",
532
+ children: e.role
533
+ })] })]
534
+ }, t))
535
+ }) })] })
536
+ ] }) : /* @__PURE__ */ _(x, { children: /* @__PURE__ */ _(S, {
537
+ className: "py-12 text-center text-muted-foreground",
538
+ children: "Select a project from the sidebar to view details."
539
+ }) })
540
+ })]
541
+ })]
542
+ });
543
+ }
544
+ //#endregion
545
+ export { O as ProjectsPage };
546
+
547
+ //# sourceMappingURL=ProjectsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/ProjectsPage.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 Plus,\n Calendar,\n DollarSign,\n Users,\n CheckCircle2,\n Clock,\n AlertTriangle,\n Target,\n Tag,\n ChevronRight,\n BarChart3,\n Flag,\n Milestone as MilestoneIcon,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport type { ProjectStatus, Priority } from '../types';\n\ntype DetailTab = 'overview' | 'timeline' | 'milestones' | 'team';\n\nconst statusConfig: Record<ProjectStatus, { label: string; color: string; bgColor: string }> = {\n planning: {\n label: 'Planning',\n color: 'text-yellow-600',\n bgColor: 'bg-yellow-100 dark:bg-yellow-950',\n },\n active: { label: 'Active', color: 'text-blue-600', bgColor: 'bg-blue-100 dark:bg-blue-950' },\n on_hold: {\n label: 'On Hold',\n color: 'text-orange-600',\n bgColor: 'bg-orange-100 dark:bg-orange-950',\n },\n completed: {\n label: 'Completed',\n color: 'text-green-600',\n bgColor: 'bg-green-100 dark:bg-green-950',\n },\n cancelled: { label: 'Cancelled', color: 'text-red-600', bgColor: 'bg-red-100 dark:bg-red-950' },\n};\n\nconst priorityConfig: Record<\n Priority,\n { label: string; variant: 'default' | 'secondary' | 'outline' | 'destructive' }\n> = {\n low: { label: 'Low', variant: 'outline' },\n medium: { label: 'Medium', variant: 'secondary' },\n high: { label: 'High', variant: 'default' },\n critical: { label: 'Critical', variant: 'destructive' },\n};\n\nexport function ProjectsPage() {\n const { projects } = useProServiceWorldStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [statusFilter, setStatusFilter] = useState<ProjectStatus | 'all'>('all');\n const [selectedProjectId, setSelectedProjectId] = useState<string>(projects[0]?.id ?? '');\n const [detailTab, setDetailTab] = useState<DetailTab>('overview');\n\n const filteredProjects = useMemo(() => {\n let result = [...projects];\n if (statusFilter !== 'all') result = result.filter((p) => p.status === statusFilter);\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (p) => p.title.toLowerCase().includes(q) || p.category.toLowerCase().includes(q)\n );\n }\n return result;\n }, [projects, statusFilter, searchQuery]);\n\n const selectedProject = projects.find((p) => p.id === selectedProjectId);\n\n const detailTabs: { key: DetailTab; label: string }[] = [\n { key: 'overview', label: 'Overview' },\n { key: 'timeline', label: 'Timeline' },\n { key: 'milestones', label: 'Milestones' },\n { key: 'team', label: 'Team' },\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\">Projects</h1>\n <p className=\"text-sm text-muted-foreground\">\n Track progress and manage your professional service projects.\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" /> New Project\n </Button>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Project sidebar */}\n <div className=\"space-y-4\">\n <div className=\"relative\">\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 projects...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {(['all', 'active', 'planning', 'completed', 'on_hold', 'cancelled'] as const).map(\n (status) => (\n <button\n key={status}\n onClick={() => setStatusFilter(status)}\n className={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n statusFilter === status\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n >\n {status === 'all' ? 'All' : statusConfig[status].label}\n </button>\n )\n )}\n </div>\n\n <div className=\"space-y-2\">\n {filteredProjects.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">No projects found.</p>\n ) : (\n filteredProjects.map((project) => {\n const cfg = statusConfig[project.status];\n return (\n <button\n key={project.id}\n onClick={() => {\n setSelectedProjectId(project.id);\n setDetailTab('overview');\n }}\n className={`w-full rounded-lg border p-3 text-left transition-colors ${\n selectedProjectId === project.id\n ? 'border-primary bg-primary/5'\n : 'hover:bg-muted/50'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-medium text-sm truncate pr-2\">{project.title}</h3>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <Badge variant={priorityConfig[project.priority].variant} className=\"text-xs\">\n {project.priority}\n </Badge>\n <span className={`text-xs ${cfg.color}`}>{cfg.label}</span>\n </div>\n <div className=\"mt-2\">\n <div className=\"flex items-center justify-between text-xs text-muted-foreground\">\n <span>Progress</span>\n <span>{project.progress}%</span>\n </div>\n <div className=\"mt-1 h-1.5 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-1.5 rounded-full bg-primary transition-all\"\n style={{ width: `${project.progress}%` }}\n />\n </div>\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n\n {/* Detail panel */}\n <div className=\"space-y-4 lg:col-span-2\">\n {selectedProject ? (\n <>\n {/* Project header card */}\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant={priorityConfig[selectedProject.priority].variant}>\n {selectedProject.priority} priority\n </Badge>\n <span\n className={`text-sm font-medium ${statusConfig[selectedProject.status].color}`}\n >\n {statusConfig[selectedProject.status].label}\n </span>\n </div>\n <h2 className=\"text-xl font-bold\">{selectedProject.title}</h2>\n <p className=\"text-sm text-muted-foreground\">{selectedProject.description}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm text-muted-foreground\">Budget</p>\n <p className=\"text-xl font-bold\">\n ${selectedProject.budget.toLocaleString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Spent: ${selectedProject.spent.toLocaleString()} (\n {Math.round((selectedProject.spent / selectedProject.budget) * 100)}%)\n </p>\n </div>\n </div>\n\n {/* Progress bar */}\n <div className=\"mt-4\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">Overall Progress</span>\n <span className=\"font-medium\">{selectedProject.progress}%</span>\n </div>\n <div className=\"mt-1 h-3 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-3 rounded-full bg-primary transition-all\"\n style={{ width: `${selectedProject.progress}%` }}\n />\n </div>\n </div>\n\n {/* Quick stats */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm\">\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Calendar className=\"h-4 w-4\" /> {selectedProject.startDate} -{' '}\n {selectedProject.endDate}\n </span>\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Users className=\"h-4 w-4\" /> {selectedProject.teamMembers.length} members\n </span>\n <span className=\"flex items-center gap-1 text-muted-foreground\">\n <Target className=\"h-4 w-4\" /> {selectedProject.milestones.length} milestones\n </span>\n </div>\n\n {/* Tags */}\n {selectedProject.tags.length > 0 && (\n <div className=\"mt-3 flex items-center gap-2\">\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n {selectedProject.tags.map((tag) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Detail tabs */}\n <div className=\"flex gap-1 border-b\">\n {detailTabs.map(({ key, label }) => (\n <button\n key={key}\n onClick={() => setDetailTab(key)}\n className={`border-b-2 px-4 py-2 text-sm font-medium transition-colors ${\n detailTab === key\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n\n {/* Overview tab */}\n {detailTab === 'overview' && (\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base flex items-center gap-2\">\n <DollarSign className=\"h-4 w-4\" /> Budget Overview\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Total Budget</span>\n <span className=\"font-medium\">\n ${selectedProject.budget.toLocaleString()}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Spent</span>\n <span className=\"font-medium\">\n ${selectedProject.spent.toLocaleString()}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-muted-foreground\">Remaining</span>\n <span className=\"font-medium text-green-600\">\n ${(selectedProject.budget - selectedProject.spent).toLocaleString()}\n </span>\n </div>\n <div className=\"h-2 overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{\n width: `${Math.round((selectedProject.spent / selectedProject.budget) * 100)}%`,\n }}\n />\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base flex items-center gap-2\">\n <BarChart3 className=\"h-4 w-4\" /> Milestone Summary\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {['completed', 'in_progress', 'pending', 'overdue'].map((status) => {\n const count = selectedProject.milestones.filter(\n (m) => m.status === status\n ).length;\n return (\n <div key={status} className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground capitalize\">\n {status.replace('_', ' ')}\n </span>\n <span className=\"font-medium\">{count}</span>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Timeline tab */}\n {detailTab === 'timeline' && (\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"relative space-y-0\">\n {selectedProject.milestones.map((milestone, idx) => {\n const isLast = idx === selectedProject.milestones.length - 1;\n const statusColors: Record<string, string> = {\n completed: 'bg-green-500',\n in_progress: 'bg-blue-500',\n pending: 'bg-gray-300',\n overdue: 'bg-red-500',\n };\n return (\n <div key={milestone.id} className=\"relative flex gap-4 pb-8\">\n {/* Timeline line */}\n {!isLast && (\n <div className=\"absolute left-[11px] top-6 h-full w-0.5 bg-muted\" />\n )}\n {/* Dot */}\n <div\n className={`relative z-10 mt-1 h-6 w-6 shrink-0 rounded-full ${statusColors[milestone.status]} flex items-center justify-center`}\n >\n {milestone.status === 'completed' && (\n <CheckCircle2 className=\"h-4 w-4 text-white\" />\n )}\n {milestone.status === 'in_progress' && (\n <Clock className=\"h-4 w-4 text-white\" />\n )}\n </div>\n {/* Content */}\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-medium\">{milestone.title}</h4>\n <Badge\n variant={priorityConfig[milestone.priority].variant}\n className=\"text-xs\"\n >\n {milestone.priority}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {milestone.description}\n </p>\n <div className=\"mt-2 flex flex-wrap gap-3 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> Due: {milestone.dueDate}\n </span>\n {milestone.completedAt && (\n <span className=\"flex items-center gap-1 text-green-600\">\n <CheckCircle2 className=\"h-3 w-3\" /> Completed:{' '}\n {milestone.completedAt}\n </span>\n )}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Milestones tab */}\n {detailTab === 'milestones' && (\n <div className=\"space-y-3\">\n {selectedProject.milestones.map((milestone) => {\n const statusIcons: Record<string, typeof CheckCircle2> = {\n completed: CheckCircle2,\n in_progress: Clock,\n pending: Target,\n overdue: AlertTriangle,\n };\n const statusColors: Record<string, string> = {\n completed: 'text-green-600',\n in_progress: 'text-blue-600',\n pending: 'text-gray-400',\n overdue: 'text-red-600',\n };\n const Icon = statusIcons[milestone.status] ?? Target;\n return (\n <Card key={milestone.id}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start gap-3\">\n <Icon className={`mt-0.5 h-5 w-5 ${statusColors[milestone.status]}`} />\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-medium\">{milestone.title}</h4>\n <Badge\n variant={priorityConfig[milestone.priority].variant}\n className=\"text-xs\"\n >\n {milestone.priority}\n </Badge>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {milestone.description}\n </p>\n\n {/* Deliverables */}\n {milestone.deliverables.length > 0 && (\n <div className=\"mt-3\">\n <p className=\"text-xs font-medium text-muted-foreground\">\n Deliverables\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1\">\n {milestone.deliverables.map((d) => (\n <Badge key={d} variant=\"outline\" className=\"text-xs\">\n {d}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"mt-3 flex flex-wrap gap-4 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" /> Due: {milestone.dueDate}\n </span>\n {milestone.completedAt && (\n <span className=\"flex items-center gap-1 text-green-600\">\n <CheckCircle2 className=\"h-3 w-3\" /> {milestone.completedAt}\n </span>\n )}\n {milestone.dependencies.length > 0 && (\n <span className=\"flex items-center gap-1\">\n <Flag className=\"h-3 w-3\" /> {milestone.dependencies.length}{' '}\n dependencies\n </span>\n )}\n </div>\n\n {milestone.notes && (\n <p className=\"mt-2 rounded bg-muted/50 p-2 text-xs text-muted-foreground italic\">\n {milestone.notes}\n </p>\n )}\n </div>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n )}\n\n {/* Team tab */}\n {detailTab === 'team' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Team Members</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {selectedProject.teamMembers.map((member, idx) => (\n <div key={idx} className=\"flex items-center gap-3 rounded-lg border p-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-primary/10 font-semibold text-primary\">\n {member.name.charAt(0)}\n </div>\n <div>\n <p className=\"font-medium\">{member.name}</p>\n <p className=\"text-sm text-muted-foreground\">{member.role}</p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </>\n ) : (\n <Card>\n <CardContent className=\"py-12 text-center text-muted-foreground\">\n Select a project from the sidebar to view details.\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ProviderDetailPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ProviderDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderDetailPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ProviderDetailPage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,kBAAkB,4CAkVjC"}