@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,563 @@
1
+ import { useProServiceWorldStore as e } from "../store/proserviceworldStore.js";
2
+ import { useState as t } from "react";
3
+ import { ArrowLeft as n, BookOpen as r, Calendar as i, CheckCircle2 as a, ChevronDown as o, ChevronUp as s, ClipboardList as c, Clock as l, DollarSign as u, FileText as d, MessageSquare as f, Package as p, Shield as m, Star as h, Tag as g, User as _ } from "lucide-react";
4
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
5
+ import { Badge as b, Button as x, Card as S, CardContent as C, CardHeader as w, CardTitle as T } from "@burdenoff/fe-libs/ui";
6
+ //#region src/proserviceworld/pages/ServiceDetailsPage.tsx
7
+ function E() {
8
+ let { services: E, providers: D } = e(), [O, k] = t(E[0]?.id ?? ""), [A, j] = t("packages"), [M, N] = t(null), [P, F] = t(!1), [I, L] = t(null), R = E.find((e) => e.id === O) ?? E[0], z = R ? D.find((e) => e.id === R.providerId) : null;
9
+ if (!R) return /* @__PURE__ */ v("div", {
10
+ className: "flex items-center justify-center p-12",
11
+ children: /* @__PURE__ */ v("p", {
12
+ className: "text-muted-foreground",
13
+ children: "No services available."
14
+ })
15
+ });
16
+ let B = [
17
+ {
18
+ key: "packages",
19
+ label: "Packages",
20
+ icon: p
21
+ },
22
+ {
23
+ key: "deliverables",
24
+ label: "Deliverables",
25
+ icon: d
26
+ },
27
+ {
28
+ key: "requirements",
29
+ label: "Requirements",
30
+ icon: c
31
+ },
32
+ {
33
+ key: "faq",
34
+ label: "FAQ",
35
+ icon: r
36
+ }
37
+ ], V = R.pricing.type === "hourly" ? `$${R.pricing.hourlyRate}/hr` : R.pricing.type === "fixed" ? `$${R.pricing.basePrice.toLocaleString()} fixed` : `From $${R.pricing.basePrice.toLocaleString()}`;
38
+ return /* @__PURE__ */ y("div", {
39
+ className: "space-y-6 p-6",
40
+ children: [
41
+ /* @__PURE__ */ y("div", {
42
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
43
+ children: [/* @__PURE__ */ y("div", {
44
+ className: "flex items-center gap-3",
45
+ children: [
46
+ /* @__PURE__ */ y(x, {
47
+ variant: "outline",
48
+ size: "sm",
49
+ onClick: () => k(E[0]?.id ?? ""),
50
+ children: [/* @__PURE__ */ v(n, { className: "mr-2 h-4 w-4" }), " Services"]
51
+ }),
52
+ /* @__PURE__ */ v("span", {
53
+ className: "text-muted-foreground",
54
+ children: "/"
55
+ }),
56
+ /* @__PURE__ */ v("select", {
57
+ className: "rounded border bg-background px-2 py-1 text-sm",
58
+ value: O,
59
+ onChange: (e) => k(e.target.value),
60
+ children: E.map((e) => /* @__PURE__ */ v("option", {
61
+ value: e.id,
62
+ children: e.title
63
+ }, e.id))
64
+ })
65
+ ]
66
+ }), /* @__PURE__ */ y(x, {
67
+ size: "sm",
68
+ onClick: () => F(!0),
69
+ children: [/* @__PURE__ */ v(i, { className: "mr-2 h-4 w-4" }), " Book This Service"]
70
+ })]
71
+ }),
72
+ /* @__PURE__ */ y("div", {
73
+ className: "grid gap-6 lg:grid-cols-3",
74
+ children: [/* @__PURE__ */ y("div", {
75
+ className: "space-y-6 lg:col-span-2",
76
+ children: [
77
+ /* @__PURE__ */ v(S, { children: /* @__PURE__ */ y(C, {
78
+ className: "pt-6",
79
+ children: [
80
+ /* @__PURE__ */ y("div", {
81
+ className: "flex flex-wrap items-start justify-between gap-4",
82
+ children: [/* @__PURE__ */ y("div", {
83
+ className: "space-y-2",
84
+ children: [
85
+ /* @__PURE__ */ y("div", {
86
+ className: "flex items-center gap-2",
87
+ children: [
88
+ R.featured && /* @__PURE__ */ v(b, { children: "Featured" }),
89
+ /* @__PURE__ */ v(b, {
90
+ variant: "secondary",
91
+ children: R.category.replace(/_/g, " ")
92
+ }),
93
+ /* @__PURE__ */ v(b, {
94
+ variant: "outline",
95
+ children: R.subcategory
96
+ })
97
+ ]
98
+ }),
99
+ /* @__PURE__ */ v("h1", {
100
+ className: "text-2xl font-bold",
101
+ children: R.title
102
+ }),
103
+ /* @__PURE__ */ v("p", {
104
+ className: "max-w-2xl text-muted-foreground",
105
+ children: R.description
106
+ })
107
+ ]
108
+ }), /* @__PURE__ */ y("div", {
109
+ className: "text-right",
110
+ children: [/* @__PURE__ */ v("p", {
111
+ className: "text-2xl font-bold text-primary",
112
+ children: V
113
+ }), /* @__PURE__ */ y("p", {
114
+ className: "text-xs text-muted-foreground",
115
+ children: [R.pricing.type, " pricing"]
116
+ })]
117
+ })]
118
+ }),
119
+ /* @__PURE__ */ y("div", {
120
+ className: "mt-6 flex flex-wrap gap-6 border-t pt-4",
121
+ children: [
122
+ /* @__PURE__ */ y("div", {
123
+ className: "flex items-center gap-2",
124
+ children: [
125
+ /* @__PURE__ */ v(h, { className: "h-4 w-4 text-yellow-500" }),
126
+ /* @__PURE__ */ v("span", {
127
+ className: "text-sm font-medium",
128
+ children: R.rating
129
+ }),
130
+ /* @__PURE__ */ y("span", {
131
+ className: "text-xs text-muted-foreground",
132
+ children: [
133
+ "(",
134
+ R.providerReviews,
135
+ " reviews)"
136
+ ]
137
+ })
138
+ ]
139
+ }),
140
+ /* @__PURE__ */ y("div", {
141
+ className: "flex items-center gap-2",
142
+ children: [/* @__PURE__ */ v(l, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ y("span", {
143
+ className: "text-sm",
144
+ children: [R.duration.typical, " days typical"]
145
+ })]
146
+ }),
147
+ /* @__PURE__ */ y("div", {
148
+ className: "flex items-center gap-2",
149
+ children: [/* @__PURE__ */ v(a, { className: "h-4 w-4 text-green-500" }), /* @__PURE__ */ y("span", {
150
+ className: "text-sm",
151
+ children: [R.totalBookings, " bookings"]
152
+ })]
153
+ }),
154
+ /* @__PURE__ */ y("div", {
155
+ className: "flex items-center gap-2",
156
+ children: [/* @__PURE__ */ v(i, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ y("span", {
157
+ className: "text-sm",
158
+ children: [
159
+ R.duration.min,
160
+ "-",
161
+ R.duration.max,
162
+ " days range"
163
+ ]
164
+ })]
165
+ })
166
+ ]
167
+ }),
168
+ R.tags.length > 0 && /* @__PURE__ */ y("div", {
169
+ className: "mt-4 flex flex-wrap gap-2",
170
+ children: [/* @__PURE__ */ v(g, { className: "h-4 w-4 text-muted-foreground" }), R.tags.map((e) => /* @__PURE__ */ v(b, {
171
+ variant: "outline",
172
+ className: "text-xs",
173
+ children: e
174
+ }, e))]
175
+ })
176
+ ]
177
+ }) }),
178
+ /* @__PURE__ */ v("div", {
179
+ className: "flex gap-1 border-b",
180
+ children: B.map(({ key: e, label: t, icon: n }) => /* @__PURE__ */ y("button", {
181
+ onClick: () => j(e),
182
+ className: `flex items-center gap-2 border-b-2 px-4 py-2 text-sm font-medium transition-colors ${A === e ? "border-primary text-primary" : "border-transparent text-muted-foreground hover:text-foreground"}`,
183
+ children: [/* @__PURE__ */ v(n, { className: "h-4 w-4" }), t]
184
+ }, e))
185
+ }),
186
+ A === "packages" && /* @__PURE__ */ v("div", {
187
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
188
+ children: R.packages.map((e) => /* @__PURE__ */ y(S, {
189
+ className: `relative ${e.popular ? "border-primary ring-1 ring-primary" : ""} ${I === e.id ? "bg-primary/5" : ""}`,
190
+ children: [
191
+ e.popular && /* @__PURE__ */ v("div", {
192
+ className: "absolute -top-3 left-1/2 -translate-x-1/2",
193
+ children: /* @__PURE__ */ v(b, {
194
+ className: "bg-primary text-primary-foreground",
195
+ children: "Most Popular"
196
+ })
197
+ }),
198
+ /* @__PURE__ */ y(w, {
199
+ className: "pb-3",
200
+ children: [/* @__PURE__ */ v(T, {
201
+ className: "text-lg",
202
+ children: e.name
203
+ }), /* @__PURE__ */ v("p", {
204
+ className: "text-sm text-muted-foreground",
205
+ children: e.description
206
+ })]
207
+ }),
208
+ /* @__PURE__ */ y(C, {
209
+ className: "space-y-4",
210
+ children: [
211
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ y("span", {
212
+ className: "text-3xl font-bold",
213
+ children: ["$", e.price.toLocaleString()]
214
+ }), /* @__PURE__ */ y("span", {
215
+ className: "text-sm text-muted-foreground",
216
+ children: [
217
+ " / ",
218
+ e.duration,
219
+ " days"
220
+ ]
221
+ })] }),
222
+ /* @__PURE__ */ v("ul", {
223
+ className: "space-y-2",
224
+ children: e.features.map((e, t) => /* @__PURE__ */ y("li", {
225
+ className: "flex items-start gap-2 text-sm",
226
+ children: [/* @__PURE__ */ v(a, { className: "mt-0.5 h-4 w-4 shrink-0 text-green-500" }), e]
227
+ }, t))
228
+ }),
229
+ /* @__PURE__ */ v(x, {
230
+ className: "w-full",
231
+ variant: e.popular ? "default" : "outline",
232
+ onClick: () => {
233
+ L(e.id), F(!0);
234
+ },
235
+ children: "Select Package"
236
+ })
237
+ ]
238
+ })
239
+ ]
240
+ }, e.id))
241
+ }),
242
+ A === "deliverables" && /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, {
243
+ className: "text-base",
244
+ children: "What You'll Receive"
245
+ }) }), /* @__PURE__ */ v(C, { children: /* @__PURE__ */ v("ul", {
246
+ className: "grid gap-3 sm:grid-cols-2",
247
+ children: R.deliverables.map((e, t) => /* @__PURE__ */ y("li", {
248
+ className: "flex items-center gap-3 rounded-lg border p-3",
249
+ children: [/* @__PURE__ */ v(d, { className: "h-5 w-5 text-primary" }), /* @__PURE__ */ v("span", {
250
+ className: "text-sm font-medium",
251
+ children: e
252
+ })]
253
+ }, t))
254
+ }) })] }),
255
+ A === "requirements" && /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, {
256
+ className: "text-base",
257
+ children: "What We Need From You"
258
+ }) }), /* @__PURE__ */ v(C, { children: /* @__PURE__ */ v("ul", {
259
+ className: "space-y-3",
260
+ children: R.requirements.map((e, t) => /* @__PURE__ */ y("li", {
261
+ className: "flex items-start gap-3 rounded-lg border p-3",
262
+ children: [/* @__PURE__ */ v(c, { className: "mt-0.5 h-5 w-5 text-orange-500" }), /* @__PURE__ */ v("span", {
263
+ className: "text-sm",
264
+ children: e
265
+ })]
266
+ }, t))
267
+ }) })] }),
268
+ A === "faq" && /* @__PURE__ */ v("div", {
269
+ className: "space-y-3",
270
+ children: R.faq.length === 0 ? /* @__PURE__ */ v(S, { children: /* @__PURE__ */ v(C, {
271
+ className: "py-8 text-center text-muted-foreground",
272
+ children: "No FAQ items for this service yet."
273
+ }) }) : R.faq.map((e) => /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ y("button", {
274
+ className: "flex w-full items-center justify-between p-4 text-left",
275
+ onClick: () => N(M === e.id ? null : e.id),
276
+ children: [/* @__PURE__ */ v("span", {
277
+ className: "font-medium",
278
+ children: e.question
279
+ }), M === e.id ? /* @__PURE__ */ v(s, { className: "h-4 w-4 text-muted-foreground" }) : /* @__PURE__ */ v(o, { className: "h-4 w-4 text-muted-foreground" })]
280
+ }), M === e.id && /* @__PURE__ */ v(C, {
281
+ className: "border-t pt-4",
282
+ children: /* @__PURE__ */ v("p", {
283
+ className: "text-sm text-muted-foreground",
284
+ children: e.answer
285
+ })
286
+ })] }, e.id))
287
+ })
288
+ ]
289
+ }), /* @__PURE__ */ y("div", {
290
+ className: "space-y-4",
291
+ children: [z && /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, {
292
+ className: "text-base",
293
+ children: "Service Provider"
294
+ }) }), /* @__PURE__ */ y(C, {
295
+ className: "space-y-4",
296
+ children: [
297
+ /* @__PURE__ */ y("div", {
298
+ className: "flex items-center gap-3",
299
+ children: [/* @__PURE__ */ v("div", {
300
+ className: "flex h-12 w-12 items-center justify-center rounded-full bg-primary/10 text-primary font-semibold",
301
+ children: z.name.charAt(0)
302
+ }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
303
+ className: "font-medium",
304
+ children: z.name
305
+ }), /* @__PURE__ */ v("p", {
306
+ className: "text-sm text-muted-foreground",
307
+ children: z.businessName
308
+ })] })]
309
+ }),
310
+ z.verified && /* @__PURE__ */ y("div", {
311
+ className: "flex items-center gap-2 rounded-lg bg-green-50 p-2 dark:bg-green-950",
312
+ children: [/* @__PURE__ */ v(m, { className: "h-4 w-4 text-green-600" }), /* @__PURE__ */ v("span", {
313
+ className: "text-sm font-medium text-green-700 dark:text-green-400",
314
+ children: "Verified Provider"
315
+ })]
316
+ }),
317
+ /* @__PURE__ */ y("div", {
318
+ className: "space-y-3 text-sm",
319
+ children: [
320
+ /* @__PURE__ */ y("div", {
321
+ className: "flex items-center justify-between",
322
+ children: [/* @__PURE__ */ v("span", {
323
+ className: "text-muted-foreground",
324
+ children: "Rating"
325
+ }), /* @__PURE__ */ y("div", {
326
+ className: "flex items-center gap-1",
327
+ children: [
328
+ /* @__PURE__ */ v(h, { className: "h-4 w-4 text-yellow-500" }),
329
+ /* @__PURE__ */ v("span", {
330
+ className: "font-medium",
331
+ children: z.rating
332
+ }),
333
+ /* @__PURE__ */ y("span", {
334
+ className: "text-muted-foreground",
335
+ children: [
336
+ "(",
337
+ z.totalReviews,
338
+ ")"
339
+ ]
340
+ })
341
+ ]
342
+ })]
343
+ }),
344
+ /* @__PURE__ */ y("div", {
345
+ className: "flex items-center justify-between",
346
+ children: [/* @__PURE__ */ v("span", {
347
+ className: "text-muted-foreground",
348
+ children: "Completion Rate"
349
+ }), /* @__PURE__ */ y("span", {
350
+ className: "font-medium",
351
+ children: [z.completionRate, "%"]
352
+ })]
353
+ }),
354
+ /* @__PURE__ */ y("div", {
355
+ className: "flex items-center justify-between",
356
+ children: [/* @__PURE__ */ v("span", {
357
+ className: "text-muted-foreground",
358
+ children: "Response Time"
359
+ }), /* @__PURE__ */ y("span", {
360
+ className: "font-medium",
361
+ children: [z.responseTime, "h avg"]
362
+ })]
363
+ }),
364
+ /* @__PURE__ */ y("div", {
365
+ className: "flex items-center justify-between",
366
+ children: [/* @__PURE__ */ v("span", {
367
+ className: "text-muted-foreground",
368
+ children: "Experience"
369
+ }), /* @__PURE__ */ y("span", {
370
+ className: "font-medium",
371
+ children: [z.yearsExperience, " years"]
372
+ })]
373
+ }),
374
+ /* @__PURE__ */ y("div", {
375
+ className: "flex items-center justify-between",
376
+ children: [/* @__PURE__ */ v("span", {
377
+ className: "text-muted-foreground",
378
+ children: "Projects Done"
379
+ }), /* @__PURE__ */ v("span", {
380
+ className: "font-medium",
381
+ children: z.projectsCompleted
382
+ })]
383
+ }),
384
+ /* @__PURE__ */ y("div", {
385
+ className: "flex items-center justify-between",
386
+ children: [/* @__PURE__ */ v("span", {
387
+ className: "text-muted-foreground",
388
+ children: "Hourly Rate"
389
+ }), /* @__PURE__ */ y("span", {
390
+ className: "font-medium",
391
+ children: [
392
+ "$",
393
+ z.hourlyRate,
394
+ "/hr"
395
+ ]
396
+ })]
397
+ }),
398
+ /* @__PURE__ */ y("div", {
399
+ className: "flex items-center justify-between",
400
+ children: [/* @__PURE__ */ v("span", {
401
+ className: "text-muted-foreground",
402
+ children: "Location"
403
+ }), /* @__PURE__ */ v("span", {
404
+ className: "font-medium",
405
+ children: z.location
406
+ })]
407
+ })
408
+ ]
409
+ }),
410
+ /* @__PURE__ */ y("div", {
411
+ className: "space-y-2 border-t pt-3",
412
+ children: [/* @__PURE__ */ v("p", {
413
+ className: "text-xs font-medium text-muted-foreground",
414
+ children: "Certifications"
415
+ }), /* @__PURE__ */ v("div", {
416
+ className: "flex flex-wrap gap-1",
417
+ children: z.certifications.map((e) => /* @__PURE__ */ v(b, {
418
+ variant: "secondary",
419
+ className: "text-xs",
420
+ children: e
421
+ }, e))
422
+ })]
423
+ }),
424
+ /* @__PURE__ */ y("div", {
425
+ className: "space-y-2 border-t pt-3",
426
+ children: [/* @__PURE__ */ v("p", {
427
+ className: "text-xs font-medium text-muted-foreground",
428
+ children: "Languages"
429
+ }), /* @__PURE__ */ v("div", {
430
+ className: "flex flex-wrap gap-1",
431
+ children: z.languages.map((e) => /* @__PURE__ */ v(b, {
432
+ variant: "outline",
433
+ className: "text-xs",
434
+ children: e
435
+ }, e))
436
+ })]
437
+ }),
438
+ /* @__PURE__ */ y("div", {
439
+ className: "flex gap-2 border-t pt-3",
440
+ children: [/* @__PURE__ */ y(x, {
441
+ className: "flex-1",
442
+ size: "sm",
443
+ variant: "outline",
444
+ children: [/* @__PURE__ */ v(_, { className: "mr-2 h-4 w-4" }), " View Profile"]
445
+ }), /* @__PURE__ */ y(x, {
446
+ className: "flex-1",
447
+ size: "sm",
448
+ variant: "outline",
449
+ children: [/* @__PURE__ */ v(f, { className: "mr-2 h-4 w-4" }), " Message"]
450
+ })]
451
+ })
452
+ ]
453
+ })] }), /* @__PURE__ */ y(S, { children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ v(T, {
454
+ className: "text-base",
455
+ children: "Quick Book"
456
+ }) }), /* @__PURE__ */ y(C, {
457
+ className: "space-y-3",
458
+ children: [
459
+ /* @__PURE__ */ y("div", {
460
+ className: "flex items-center justify-between text-sm",
461
+ children: [/* @__PURE__ */ v("span", {
462
+ className: "text-muted-foreground",
463
+ children: "Starting from"
464
+ }), /* @__PURE__ */ y("span", {
465
+ className: "text-lg font-bold text-primary",
466
+ children: ["$", R.pricing.basePrice.toLocaleString()]
467
+ })]
468
+ }),
469
+ /* @__PURE__ */ y("div", {
470
+ className: "flex items-center gap-2 text-sm text-muted-foreground",
471
+ children: [/* @__PURE__ */ v(l, { className: "h-4 w-4" }), /* @__PURE__ */ y("span", { children: [
472
+ "Typical duration: ",
473
+ R.duration.typical,
474
+ " days"
475
+ ] })]
476
+ }),
477
+ /* @__PURE__ */ y("div", {
478
+ className: "flex items-center gap-2 text-sm text-muted-foreground",
479
+ children: [/* @__PURE__ */ v(u, { className: "h-4 w-4" }), /* @__PURE__ */ y("span", { children: [R.pricing.type, " pricing model"] })]
480
+ }),
481
+ /* @__PURE__ */ y(x, {
482
+ className: "w-full",
483
+ onClick: () => F(!0),
484
+ children: [/* @__PURE__ */ v(i, { className: "mr-2 h-4 w-4" }), " Book Now"]
485
+ })
486
+ ]
487
+ })] })]
488
+ })]
489
+ }),
490
+ P && /* @__PURE__ */ v("div", {
491
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
492
+ children: /* @__PURE__ */ y(S, {
493
+ className: "w-full max-w-lg mx-4",
494
+ children: [/* @__PURE__ */ v(w, { children: /* @__PURE__ */ y("div", {
495
+ className: "flex items-center justify-between",
496
+ children: [/* @__PURE__ */ v(T, { children: "Book Service" }), /* @__PURE__ */ v(x, {
497
+ variant: "outline",
498
+ size: "sm",
499
+ onClick: () => F(!1),
500
+ children: "Close"
501
+ })]
502
+ }) }), /* @__PURE__ */ y(C, {
503
+ className: "space-y-4",
504
+ children: [
505
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
506
+ className: "font-medium",
507
+ children: R.title
508
+ }), /* @__PURE__ */ y("p", {
509
+ className: "text-sm text-muted-foreground",
510
+ children: ["by ", R.providerName]
511
+ })] }),
512
+ /* @__PURE__ */ y("div", {
513
+ className: "space-y-2",
514
+ children: [/* @__PURE__ */ v("p", {
515
+ className: "text-sm font-medium",
516
+ children: "Select Package"
517
+ }), R.packages.map((e) => /* @__PURE__ */ y("button", {
518
+ onClick: () => L(e.id),
519
+ className: `w-full rounded-lg border p-3 text-left transition-colors ${I === e.id ? "border-primary bg-primary/5" : "hover:bg-muted/50"}`,
520
+ children: [/* @__PURE__ */ y("div", {
521
+ className: "flex items-center justify-between",
522
+ children: [/* @__PURE__ */ v("span", {
523
+ className: "font-medium",
524
+ children: e.name
525
+ }), /* @__PURE__ */ y("span", {
526
+ className: "font-bold",
527
+ children: ["$", e.price.toLocaleString()]
528
+ })]
529
+ }), /* @__PURE__ */ y("p", {
530
+ className: "text-xs text-muted-foreground",
531
+ children: [
532
+ e.description,
533
+ " - ",
534
+ e.duration,
535
+ " days"
536
+ ]
537
+ })]
538
+ }, e.id))]
539
+ }),
540
+ /* @__PURE__ */ y("div", {
541
+ className: "flex gap-2",
542
+ children: [/* @__PURE__ */ v(x, {
543
+ variant: "outline",
544
+ className: "flex-1",
545
+ onClick: () => F(!1),
546
+ children: "Cancel"
547
+ }), /* @__PURE__ */ v(x, {
548
+ className: "flex-1",
549
+ disabled: !I,
550
+ children: "Confirm Booking"
551
+ })]
552
+ })
553
+ ]
554
+ })]
555
+ })
556
+ })
557
+ ]
558
+ });
559
+ }
560
+ //#endregion
561
+ export { E as ServiceDetailsPage };
562
+
563
+ //# sourceMappingURL=ServiceDetailsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServiceDetailsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/ServiceDetailsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Badge, Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n Star,\n Clock,\n CheckCircle2,\n ChevronDown,\n ChevronUp,\n Package,\n FileText,\n ClipboardList,\n Tag,\n Shield,\n Calendar,\n DollarSign,\n User,\n MessageSquare,\n BookOpen,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\n\ntype Tab = 'packages' | 'deliverables' | 'requirements' | 'faq';\n\nexport function ServiceDetailsPage() {\n const { services, providers } = useProServiceWorldStore();\n const [selectedServiceId, setSelectedServiceId] = useState(services[0]?.id ?? '');\n const [activeTab, setActiveTab] = useState<Tab>('packages');\n const [expandedFaq, setExpandedFaq] = useState<string | null>(null);\n const [showBookingModal, setShowBookingModal] = useState(false);\n const [selectedPackageId, setSelectedPackageId] = useState<string | null>(null);\n\n const service = services.find((s) => s.id === selectedServiceId) ?? services[0];\n const provider = service ? providers.find((p) => p.id === service.providerId) : null;\n\n if (!service) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <p className=\"text-muted-foreground\">No services available.</p>\n </div>\n );\n }\n\n const tabs: { key: Tab; label: string; icon: typeof Package }[] = [\n { key: 'packages', label: 'Packages', icon: Package },\n { key: 'deliverables', label: 'Deliverables', icon: FileText },\n { key: 'requirements', label: 'Requirements', icon: ClipboardList },\n { key: 'faq', label: 'FAQ', icon: BookOpen },\n ];\n\n const pricingLabel =\n service.pricing.type === 'hourly'\n ? `$${service.pricing.hourlyRate}/hr`\n : service.pricing.type === 'fixed'\n ? `$${service.pricing.basePrice.toLocaleString()} fixed`\n : `From $${service.pricing.basePrice.toLocaleString()}`;\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Breadcrumb + Service selector */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setSelectedServiceId(services[0]?.id ?? '')}\n >\n <ArrowLeft className=\"mr-2 h-4 w-4\" /> Services\n </Button>\n <span className=\"text-muted-foreground\">/</span>\n <select\n className=\"rounded border bg-background px-2 py-1 text-sm\"\n value={selectedServiceId}\n onChange={(e) => setSelectedServiceId(e.target.value)}\n >\n {services.map((s) => (\n <option key={s.id} value={s.id}>\n {s.title}\n </option>\n ))}\n </select>\n </div>\n <Button size=\"sm\" onClick={() => setShowBookingModal(true)}>\n <Calendar className=\"mr-2 h-4 w-4\" /> Book This Service\n </Button>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main content — 2 columns */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* Service header */}\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 {service.featured && <Badge>Featured</Badge>}\n <Badge variant=\"secondary\">{service.category.replace(/_/g, ' ')}</Badge>\n <Badge variant=\"outline\">{service.subcategory}</Badge>\n </div>\n <h1 className=\"text-2xl font-bold\">{service.title}</h1>\n <p className=\"max-w-2xl text-muted-foreground\">{service.description}</p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-2xl font-bold text-primary\">{pricingLabel}</p>\n <p className=\"text-xs text-muted-foreground\">{service.pricing.type} pricing</p>\n </div>\n </div>\n\n {/* Stats row */}\n <div className=\"mt-6 flex flex-wrap gap-6 border-t pt-4\">\n <div className=\"flex items-center gap-2\">\n <Star className=\"h-4 w-4 text-yellow-500\" />\n <span className=\"text-sm font-medium\">{service.rating}</span>\n <span className=\"text-xs text-muted-foreground\">\n ({service.providerReviews} reviews)\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm\">{service.duration.typical} days typical</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-500\" />\n <span className=\"text-sm\">{service.totalBookings} bookings</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"text-sm\">\n {service.duration.min}-{service.duration.max} days range\n </span>\n </div>\n </div>\n\n {/* Tags */}\n {service.tags.length > 0 && (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n <Tag className=\"h-4 w-4 text-muted-foreground\" />\n {service.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 {/* Tabs */}\n <div className=\"flex gap-1 border-b\">\n {tabs.map(({ key, label, icon: Icon }) => (\n <button\n key={key}\n onClick={() => setActiveTab(key)}\n className={`flex items-center gap-2 border-b-2 px-4 py-2 text-sm font-medium transition-colors ${\n activeTab === key\n ? 'border-primary text-primary'\n : 'border-transparent text-muted-foreground hover:text-foreground'\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {activeTab === 'packages' && (\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {service.packages.map((pkg) => (\n <Card\n key={pkg.id}\n className={`relative ${pkg.popular ? 'border-primary ring-1 ring-primary' : ''} ${\n selectedPackageId === pkg.id ? 'bg-primary/5' : ''\n }`}\n >\n {pkg.popular && (\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <Badge className=\"bg-primary text-primary-foreground\">Most Popular</Badge>\n </div>\n )}\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-lg\">{pkg.name}</CardTitle>\n <p className=\"text-sm text-muted-foreground\">{pkg.description}</p>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <span className=\"text-3xl font-bold\">${pkg.price.toLocaleString()}</span>\n <span className=\"text-sm text-muted-foreground\"> / {pkg.duration} days</span>\n </div>\n <ul className=\"space-y-2\">\n {pkg.features.map((feature, i) => (\n <li key={i} className=\"flex items-start gap-2 text-sm\">\n <CheckCircle2 className=\"mt-0.5 h-4 w-4 shrink-0 text-green-500\" />\n {feature}\n </li>\n ))}\n </ul>\n <Button\n className=\"w-full\"\n variant={pkg.popular ? 'default' : 'outline'}\n onClick={() => {\n setSelectedPackageId(pkg.id);\n setShowBookingModal(true);\n }}\n >\n Select Package\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {activeTab === 'deliverables' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">What You&apos;ll Receive</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"grid gap-3 sm:grid-cols-2\">\n {service.deliverables.map((item, i) => (\n <li key={i} className=\"flex items-center gap-3 rounded-lg border p-3\">\n <FileText className=\"h-5 w-5 text-primary\" />\n <span className=\"text-sm font-medium\">{item}</span>\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'requirements' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">What We Need From You</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-3\">\n {service.requirements.map((item, i) => (\n <li key={i} className=\"flex items-start gap-3 rounded-lg border p-3\">\n <ClipboardList className=\"mt-0.5 h-5 w-5 text-orange-500\" />\n <span className=\"text-sm\">{item}</span>\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n )}\n\n {activeTab === 'faq' && (\n <div className=\"space-y-3\">\n {service.faq.length === 0 ? (\n <Card>\n <CardContent className=\"py-8 text-center text-muted-foreground\">\n No FAQ items for this service yet.\n </CardContent>\n </Card>\n ) : (\n service.faq.map((item) => (\n <Card key={item.id}>\n <button\n className=\"flex w-full items-center justify-between p-4 text-left\"\n onClick={() => setExpandedFaq(expandedFaq === item.id ? null : item.id)}\n >\n <span className=\"font-medium\">{item.question}</span>\n {expandedFaq === item.id ? (\n <ChevronUp className=\"h-4 w-4 text-muted-foreground\" />\n ) : (\n <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />\n )}\n </button>\n {expandedFaq === item.id && (\n <CardContent className=\"border-t pt-4\">\n <p className=\"text-sm text-muted-foreground\">{item.answer}</p>\n </CardContent>\n )}\n </Card>\n ))\n )}\n </div>\n )}\n </div>\n\n {/* Provider sidebar */}\n <div className=\"space-y-4\">\n {provider && (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Service Provider</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-primary/10 text-primary font-semibold\">\n {provider.name.charAt(0)}\n </div>\n <div>\n <p className=\"font-medium\">{provider.name}</p>\n <p className=\"text-sm text-muted-foreground\">{provider.businessName}</p>\n </div>\n </div>\n\n {provider.verified && (\n <div className=\"flex items-center gap-2 rounded-lg bg-green-50 p-2 dark:bg-green-950\">\n <Shield className=\"h-4 w-4 text-green-600\" />\n <span className=\"text-sm font-medium text-green-700 dark:text-green-400\">\n Verified Provider\n </span>\n </div>\n )}\n\n <div className=\"space-y-3 text-sm\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Rating</span>\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-4 w-4 text-yellow-500\" />\n <span className=\"font-medium\">{provider.rating}</span>\n <span className=\"text-muted-foreground\">({provider.totalReviews})</span>\n </div>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Completion Rate</span>\n <span className=\"font-medium\">{provider.completionRate}%</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Response Time</span>\n <span className=\"font-medium\">{provider.responseTime}h avg</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Experience</span>\n <span className=\"font-medium\">{provider.yearsExperience} years</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Projects Done</span>\n <span className=\"font-medium\">{provider.projectsCompleted}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Hourly Rate</span>\n <span className=\"font-medium\">${provider.hourlyRate}/hr</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-muted-foreground\">Location</span>\n <span className=\"font-medium\">{provider.location}</span>\n </div>\n </div>\n\n <div className=\"space-y-2 border-t pt-3\">\n <p className=\"text-xs font-medium text-muted-foreground\">Certifications</p>\n <div className=\"flex flex-wrap gap-1\">\n {provider.certifications.map((cert) => (\n <Badge key={cert} variant=\"secondary\" className=\"text-xs\">\n {cert}\n </Badge>\n ))}\n </div>\n </div>\n\n <div className=\"space-y-2 border-t pt-3\">\n <p className=\"text-xs font-medium text-muted-foreground\">Languages</p>\n <div className=\"flex flex-wrap gap-1\">\n {provider.languages.map((lang) => (\n <Badge key={lang} variant=\"outline\" className=\"text-xs\">\n {lang}\n </Badge>\n ))}\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 <User className=\"mr-2 h-4 w-4\" /> View Profile\n </Button>\n <Button className=\"flex-1\" size=\"sm\" variant=\"outline\">\n <MessageSquare className=\"mr-2 h-4 w-4\" /> Message\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Quick booking card */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Quick Book</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">Starting from</span>\n <span className=\"text-lg font-bold text-primary\">\n ${service.pricing.basePrice.toLocaleString()}\n </span>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Clock className=\"h-4 w-4\" />\n <span>Typical duration: {service.duration.typical} days</span>\n </div>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <DollarSign className=\"h-4 w-4\" />\n <span>{service.pricing.type} pricing model</span>\n </div>\n <Button className=\"w-full\" onClick={() => setShowBookingModal(true)}>\n <Calendar className=\"mr-2 h-4 w-4\" /> Book Now\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* Booking Modal */}\n {showBookingModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"w-full max-w-lg mx-4\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Book Service</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowBookingModal(false)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"font-medium\">{service.title}</p>\n <p className=\"text-sm text-muted-foreground\">by {service.providerName}</p>\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">Select Package</p>\n {service.packages.map((pkg) => (\n <button\n key={pkg.id}\n onClick={() => setSelectedPackageId(pkg.id)}\n className={`w-full rounded-lg border p-3 text-left transition-colors ${\n selectedPackageId === pkg.id\n ? 'border-primary bg-primary/5'\n : 'hover:bg-muted/50'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"font-medium\">{pkg.name}</span>\n <span className=\"font-bold\">${pkg.price.toLocaleString()}</span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {pkg.description} - {pkg.duration} days\n </p>\n </button>\n ))}\n </div>\n\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => setShowBookingModal(false)}\n >\n Cancel\n </Button>\n <Button className=\"flex-1\" disabled={!selectedPackageId}>\n Confirm Booking\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ServicesPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ServicesPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServicesPage.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/pages/ServicesPage.tsx"],"names":[],"mappings":"AAkDA,wBAAgB,YAAY,4CA6P3B"}