@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.2

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 (103) hide show
  1. package/dist/adaptercloud/components/EmptyState.js +17 -21
  2. package/dist/adaptercloud/components/EmptyState.js.map +1 -1
  3. package/dist/adaptercloud/components/InvestmentCard.js +25 -23
  4. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
  5. package/dist/adaptercloud/components/MetricsCard.js +18 -12
  6. package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
  7. package/dist/adaptercloud/components/PageLayout.js +45 -19
  8. package/dist/adaptercloud/components/PageLayout.js.map +1 -1
  9. package/dist/adaptercloud/components/RatingDisplay.js +3 -3
  10. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
  11. package/dist/adaptercloud/components/StatusBadge.js +36 -16
  12. package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
  13. package/dist/adaptercloud/pages/HomePage.js +244 -231
  14. package/dist/adaptercloud/pages/HomePage.js.map +1 -1
  15. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +121 -113
  16. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/admin/AdminDashboard.js +102 -76
  18. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +70 -65
  20. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +108 -103
  22. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +61 -59
  24. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +119 -105
  26. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/admin/CartManagementPage.js +165 -160
  28. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/admin/UserManagementPage.js +174 -169
  30. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +103 -97
  32. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +186 -172
  34. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +109 -81
  36. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +111 -109
  38. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +127 -124
  40. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +310 -316
  42. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +251 -257
  44. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +142 -148
  46. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/adaptercloud/pages/common/HelpSupportPage.js +287 -283
  48. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +120 -114
  50. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
  52. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +83 -80
  54. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/adaptercloud/pages/customer/CartDetailPage.js +120 -117
  56. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +231 -226
  58. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/adaptercloud/pages/customer/CheckoutPage.js +97 -95
  60. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +418 -389
  62. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +134 -132
  64. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +108 -102
  66. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/adaptercloud/pages/customer/FavoritesPage.js +62 -59
  68. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +117 -111
  70. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +71 -68
  72. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +97 -81
  74. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/adaptercloud/pages/customer/ReviewsPage.js +83 -80
  76. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +82 -66
  78. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +93 -91
  80. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +100 -97
  82. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +83 -81
  84. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +344 -311
  86. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +43 -40
  88. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +59 -57
  90. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +394 -392
  92. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +354 -324
  94. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +122 -97
  96. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +107 -104
  98. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +109 -107
  100. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +94 -90
  102. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/package.json +3 -3
@@ -8,8 +8,9 @@ import { useMemo as s, useState as c } from "react";
8
8
  import { AlertTriangle as l, ArrowLeft as u, Calendar as d, CalendarCheck as f, CheckCircle2 as p, Circle as m, Clock as h, Headphones as g, MapPin as _, Phone as v, ShoppingBag as y, Star as b, XCircle as x } from "lucide-react";
9
9
  import { useParams as S } from "react-router-dom";
10
10
  import { jsx as C, jsxs as w } from "react/jsx-runtime";
11
+ import { EmphasisPanel as T } from "@burdenoff/fe-libs/ui";
11
12
  //#region src/adaptercloud/pages/customer/BookingDetailsPage.tsx
12
- var T = [
13
+ var E = [
13
14
  {
14
15
  id: "BK-001",
15
16
  serviceName: "Men's Haircut + Beard Trim",
@@ -184,103 +185,105 @@ var T = [
184
185
  }
185
186
  ]
186
187
  }
187
- ], E = (e) => T.find((t) => t.id === e);
188
- function D() {
189
- let { bookingId: T } = S(), { navigateTo: D } = e(), [O, k] = c(null), A = s(() => T ? E(T) : void 0, [T]), j = (e) => {
190
- k(e), setTimeout(() => k(null), 3e3);
188
+ ], D = (e) => E.find((t) => t.id === e);
189
+ function O() {
190
+ let { bookingId: E } = S(), { navigateTo: O } = e(), [k, A] = c(null), j = s(() => E ? D(E) : void 0, [E]), M = (e) => {
191
+ A(e), setTimeout(() => A(null), 3e3);
191
192
  };
192
- if (!A) return /* @__PURE__ */ C(n, {
193
+ if (!j) return /* @__PURE__ */ C(n, {
193
194
  title: "Booking Not Found",
194
195
  children: /* @__PURE__ */ C(i, {
196
+ illustration: "empty-generic",
195
197
  icon: /* @__PURE__ */ C(f, { className: "h-12 w-12" }),
196
198
  title: "Booking not found",
197
- description: `No booking found with ID "${T}".`,
199
+ description: `No booking found with ID"${E}".`,
198
200
  action: /* @__PURE__ */ C("button", {
199
201
  type: "button",
200
- onClick: () => D("/customer/dashboard"),
202
+ onClick: () => O("/customer/dashboard"),
201
203
  className: "rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity",
202
204
  children: "Go to Dashboard"
203
205
  })
204
206
  })
205
207
  });
206
- let M = A.status === "cancelled", N = A.status === "completed", P = !M && !N;
208
+ let N = j.status === "cancelled", P = j.status === "completed", F = !N && !P;
207
209
  return /* @__PURE__ */ w(n, {
208
210
  title: /* @__PURE__ */ w("div", {
209
211
  className: "flex items-center gap-3",
210
212
  children: [/* @__PURE__ */ C("button", {
211
213
  type: "button",
212
- onClick: () => D("/customer/dashboard"),
214
+ onClick: () => O("/customer/dashboard"),
213
215
  className: "rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
214
216
  children: /* @__PURE__ */ C(u, { className: "h-5 w-5" })
215
- }), /* @__PURE__ */ w("span", { children: ["Booking #", A.id] })]
217
+ }), /* @__PURE__ */ w("span", { children: ["Booking #", j.id] })]
216
218
  }),
217
- actions: /* @__PURE__ */ C(r, { status: A.status }),
218
- children: [O && /* @__PURE__ */ w("div", {
219
- className: "mb-4 rounded-lg border border-green-500/30 bg-green-500/10 p-3 flex items-center gap-2",
220
- children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-green-600 dark:text-green-400 shrink-0" }), /* @__PURE__ */ C("p", {
221
- className: "text-sm text-green-600 dark:text-green-400",
222
- children: O
219
+ purpose: "Everything about this service booking in one place — the service, schedule, and price, the cart you booked with, and the actions you can take such as rescheduling, contacting the provider, or cancelling.",
220
+ actions: /* @__PURE__ */ C(r, { status: j.status }),
221
+ children: [k && /* @__PURE__ */ w("div", {
222
+ className: "mb-4 rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-3 flex items-center gap-2",
223
+ children: [/* @__PURE__ */ C(p, { className: "h-4 w-4 text-status-success-text shrink-0" }), /* @__PURE__ */ C("p", {
224
+ className: "text-sm text-status-success-text",
225
+ children: k
223
226
  })]
224
227
  }), /* @__PURE__ */ w("div", {
225
228
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
226
229
  children: [/* @__PURE__ */ w("div", {
227
230
  className: "lg:col-span-2 space-y-6",
228
231
  children: [
229
- /* @__PURE__ */ w("div", {
230
- className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
232
+ /* @__PURE__ */ w(T, {
233
+ className: "p-6",
231
234
  children: [
232
235
  /* @__PURE__ */ C("h2", {
233
236
  className: "text-lg font-semibold text-text-primary",
234
- children: A.serviceName
237
+ children: j.serviceName
235
238
  }),
236
239
  /* @__PURE__ */ C("p", {
237
240
  className: "mt-1 text-sm text-text-secondary",
238
- children: A.serviceDescription
241
+ children: j.serviceDescription
239
242
  }),
240
243
  /* @__PURE__ */ w("div", {
241
244
  className: "mt-4 flex flex-wrap gap-4 text-sm text-text-secondary",
242
245
  children: [
243
246
  /* @__PURE__ */ w("div", {
244
247
  className: "flex items-center gap-1.5",
245
- children: [/* @__PURE__ */ C(d, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: A.scheduledDate })]
248
+ children: [/* @__PURE__ */ C(d, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: j.scheduledDate })]
246
249
  }),
247
250
  /* @__PURE__ */ w("div", {
248
251
  className: "flex items-center gap-1.5",
249
- children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: A.scheduledTime })]
252
+ children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ C("span", { children: j.scheduledTime })]
250
253
  }),
251
254
  /* @__PURE__ */ w("div", {
252
255
  className: "flex items-center gap-1.5",
253
- children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ w("span", { children: [A.duration, " min"] })]
256
+ children: [/* @__PURE__ */ C(h, { className: "h-4 w-4" }), /* @__PURE__ */ w("span", { children: [j.duration, " min"] })]
254
257
  })
255
258
  ]
256
259
  }),
257
- A.notes && /* @__PURE__ */ w("div", {
260
+ j.notes && /* @__PURE__ */ w("div", {
258
261
  className: "mt-4 rounded-md bg-bg-sunken p-3",
259
262
  children: [/* @__PURE__ */ C("p", {
260
263
  className: "text-xs text-text-secondary mb-1",
261
264
  children: "Notes"
262
265
  }), /* @__PURE__ */ C("p", {
263
266
  className: "text-sm text-text-primary",
264
- children: A.notes
267
+ children: j.notes
265
268
  })]
266
269
  }),
267
- A.cancellationReason && /* @__PURE__ */ w("div", {
268
- className: "mt-4 rounded-md bg-red-500/5 border border-red-500/20 p-3",
270
+ j.cancellationReason && /* @__PURE__ */ w("div", {
271
+ className: "mt-4 rounded-md bg-status-error-bg-subtle/5 border border-status-error-border/20 p-3",
269
272
  children: [/* @__PURE__ */ w("div", {
270
273
  className: "flex items-center gap-2 mb-1",
271
- children: [/* @__PURE__ */ C(l, { className: "h-3.5 w-3.5 text-red-600 dark:text-red-400" }), /* @__PURE__ */ C("p", {
272
- className: "text-xs font-medium text-red-600 dark:text-red-400",
274
+ children: [/* @__PURE__ */ C(l, { className: "h-3.5 w-3.5 text-status-error-text" }), /* @__PURE__ */ C("p", {
275
+ className: "text-xs font-medium text-status-error-text",
273
276
  children: "Cancellation Reason"
274
277
  })]
275
278
  }), /* @__PURE__ */ C("p", {
276
279
  className: "text-sm text-text-primary",
277
- children: A.cancellationReason
280
+ children: j.cancellationReason
278
281
  })]
279
282
  })
280
283
  ]
281
284
  }),
282
285
  /* @__PURE__ */ w("div", {
283
- className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
286
+ className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
284
287
  children: [
285
288
  /* @__PURE__ */ C("h2", {
286
289
  className: "text-base font-semibold text-text-primary mb-4",
@@ -298,23 +301,23 @@ function D() {
298
301
  children: [
299
302
  /* @__PURE__ */ C("p", {
300
303
  className: "text-sm font-semibold text-text-primary",
301
- children: A.provider.name
304
+ children: j.provider.name
302
305
  }),
303
306
  /* @__PURE__ */ C("p", {
304
307
  className: "text-xs text-text-secondary",
305
- children: A.provider.category
308
+ children: j.provider.category
306
309
  }),
307
310
  /* @__PURE__ */ w("div", {
308
311
  className: "flex items-center gap-1 mt-1",
309
- children: [/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), /* @__PURE__ */ C("span", {
312
+ children: [/* @__PURE__ */ C(b, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ C("span", {
310
313
  className: "text-xs font-medium text-text-primary",
311
- children: A.provider.rating
314
+ children: j.provider.rating
312
315
  })]
313
316
  })
314
317
  ]
315
318
  }),
316
319
  /* @__PURE__ */ C("a", {
317
- href: `tel:${A.provider.phone}`,
320
+ href: `tel:${j.provider.phone}`,
318
321
  className: "flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
319
322
  children: /* @__PURE__ */ C(v, { className: "h-4 w-4" })
320
323
  })
@@ -322,27 +325,27 @@ function D() {
322
325
  }),
323
326
  /* @__PURE__ */ w("div", {
324
327
  className: "mt-3 flex items-center gap-2 text-sm text-text-secondary",
325
- children: [/* @__PURE__ */ C(v, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ C("span", { children: A.provider.phone })]
328
+ children: [/* @__PURE__ */ C(v, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ C("span", { children: j.provider.phone })]
326
329
  })
327
330
  ]
328
331
  }),
329
332
  /* @__PURE__ */ w("div", {
330
- className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
333
+ className: "rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop",
331
334
  children: [/* @__PURE__ */ C("h2", {
332
335
  className: "text-base font-semibold text-text-primary mb-5",
333
336
  children: "Booking Timeline"
334
337
  }), /* @__PURE__ */ C("div", {
335
338
  className: "relative",
336
- children: A.timeline.map((e, n) => {
337
- let r = n === A.timeline.length - 1, i = e.status === "cancelled", a = i ? x : e.completed ? p : m;
339
+ children: j.timeline.map((e, n) => {
340
+ let r = n === j.timeline.length - 1, i = e.status === "cancelled", a = i ? x : e.completed ? p : m;
338
341
  return /* @__PURE__ */ w("div", {
339
342
  className: "flex gap-4",
340
343
  children: [/* @__PURE__ */ w("div", {
341
344
  className: "flex flex-col items-center",
342
345
  children: [/* @__PURE__ */ C("div", {
343
- className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full", i ? "bg-red-500/10 text-red-600 dark:text-red-400" : e.completed ? "bg-green-500/10 text-green-600 dark:text-green-400" : "bg-bg-sunken text-text-secondary"),
346
+ className: t("flex h-8 w-8 shrink-0 items-center justify-center rounded-full", i ? "bg-status-error-bg-subtle/10 text-status-error-text" : e.completed ? "bg-status-success-bg-subtle/10 text-status-success-text" : "bg-bg-sunken text-text-secondary"),
344
347
  children: /* @__PURE__ */ C(a, { className: "h-4 w-4" })
345
- }), !r && /* @__PURE__ */ C("div", { className: t("w-0.5 flex-1 my-1", e.completed ? "bg-green-500/30" : "bg-border") })]
348
+ }), !r && /* @__PURE__ */ C("div", { className: t("w-0.5 flex-1 my-1", e.completed ? "bg-status-success-bg-subtle/30" : "bg-border") })]
346
349
  }), /* @__PURE__ */ w("div", {
347
350
  className: t("pb-6", r && "pb-0"),
348
351
  children: [/* @__PURE__ */ C("p", {
@@ -362,14 +365,14 @@ function D() {
362
365
  children: [/* @__PURE__ */ w("button", {
363
366
  type: "button",
364
367
  onClick: () => {
365
- j("Support team will contact you shortly.");
368
+ M("Support team will contact you shortly.");
366
369
  },
367
370
  className: "flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
368
371
  children: [/* @__PURE__ */ C(g, { className: "h-4 w-4" }), "Contact Support"]
369
- }), N && /* @__PURE__ */ w("button", {
372
+ }), P && /* @__PURE__ */ w("button", {
370
373
  type: "button",
371
374
  onClick: () => {
372
- j("Thank you! Rating feature coming soon.");
375
+ M("Thank you! Rating feature coming soon.");
373
376
  },
374
377
  className: "flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity",
375
378
  children: [/* @__PURE__ */ C(b, { className: "h-4 w-4" }), "Rate Service"]
@@ -380,7 +383,7 @@ function D() {
380
383
  className: "space-y-6",
381
384
  children: [
382
385
  /* @__PURE__ */ w("div", {
383
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
386
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
384
387
  children: [
385
388
  /* @__PURE__ */ C("h3", {
386
389
  className: "text-base font-semibold text-text-primary mb-3",
@@ -389,33 +392,33 @@ function D() {
389
392
  /* @__PURE__ */ w("div", {
390
393
  className: "flex items-center gap-3 mb-4",
391
394
  children: [/* @__PURE__ */ C("img", {
392
- src: A.provider.image,
393
- alt: A.provider.name,
395
+ src: j.provider.image,
396
+ alt: j.provider.name,
394
397
  className: "h-14 w-14 rounded-lg object-cover"
395
398
  }), /* @__PURE__ */ w("div", {
396
399
  className: "min-w-0",
397
400
  children: [
398
401
  /* @__PURE__ */ C("p", {
399
402
  className: "text-sm font-semibold text-text-primary",
400
- children: A.provider.name
403
+ children: j.provider.name
401
404
  }),
402
405
  /* @__PURE__ */ C("p", {
403
406
  className: "text-xs text-text-secondary",
404
- children: A.provider.category
407
+ children: j.provider.category
405
408
  }),
406
409
  /* @__PURE__ */ w("div", {
407
410
  className: "flex items-center gap-1 mt-0.5",
408
411
  children: [
409
- /* @__PURE__ */ C(b, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }),
412
+ /* @__PURE__ */ C(b, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }),
410
413
  /* @__PURE__ */ C("span", {
411
414
  className: "text-xs font-medium text-text-primary",
412
- children: A.provider.rating
415
+ children: j.provider.rating
413
416
  }),
414
417
  /* @__PURE__ */ w("span", {
415
418
  className: "text-xs text-text-secondary",
416
419
  children: [
417
420
  "(",
418
- A.provider.reviewCount,
421
+ j.provider.reviewCount,
419
422
  ")"
420
423
  ]
421
424
  })
@@ -430,20 +433,20 @@ function D() {
430
433
  className: "flex items-start gap-2",
431
434
  children: [/* @__PURE__ */ C(_, { className: "h-4 w-4 text-text-secondary shrink-0 mt-0.5" }), /* @__PURE__ */ C("span", {
432
435
  className: "text-text-secondary",
433
- children: A.provider.location
436
+ children: j.provider.location
434
437
  })]
435
438
  })
436
439
  }),
437
440
  /* @__PURE__ */ C("button", {
438
441
  type: "button",
439
- onClick: () => D(`/customer/carts/${A.provider.id}`),
442
+ onClick: () => O(`/customer/carts/${j.provider.id}`),
440
443
  className: "w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
441
444
  children: "View Cart Menu"
442
445
  })
443
446
  ]
444
447
  }),
445
448
  /* @__PURE__ */ w("div", {
446
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
449
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
447
450
  children: [/* @__PURE__ */ C("h3", {
448
451
  className: "text-base font-semibold text-text-primary mb-3",
449
452
  children: "Service Location"
@@ -452,27 +455,27 @@ function D() {
452
455
  children: [/* @__PURE__ */ C(_, { className: "mt-0.5 h-5 w-5 shrink-0 text-text-secondary" }), /* @__PURE__ */ w("div", { children: [
453
456
  /* @__PURE__ */ C("p", {
454
457
  className: "text-sm text-text-primary",
455
- children: A.location.street
458
+ children: j.location.street
456
459
  }),
457
460
  /* @__PURE__ */ w("p", {
458
461
  className: "text-sm text-text-secondary",
459
462
  children: [
460
- A.location.area,
463
+ j.location.area,
461
464
  ", ",
462
- A.location.city,
465
+ j.location.city,
463
466
  " - ",
464
- A.location.pincode
467
+ j.location.pincode
465
468
  ]
466
469
  }),
467
- A.location.landmark && /* @__PURE__ */ w("p", {
470
+ j.location.landmark && /* @__PURE__ */ w("p", {
468
471
  className: "text-xs text-text-secondary mt-1",
469
- children: ["Landmark: ", A.location.landmark]
472
+ children: ["Landmark: ", j.location.landmark]
470
473
  })
471
474
  ] })]
472
475
  })]
473
476
  }),
474
477
  /* @__PURE__ */ w("div", {
475
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
478
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
476
479
  children: [/* @__PURE__ */ C("h3", {
477
480
  className: "text-base font-semibold text-text-primary mb-3",
478
481
  children: "Price Breakdown"
@@ -486,7 +489,7 @@ function D() {
486
489
  children: "Service Charge"
487
490
  }), /* @__PURE__ */ C("span", {
488
491
  className: "text-text-primary",
489
- children: a(A.pricing.serviceCharge, { minimumFractionDigits: 0 })
492
+ children: a(j.pricing.serviceCharge, { minimumFractionDigits: 0 })
490
493
  })]
491
494
  }),
492
495
  /* @__PURE__ */ w("div", {
@@ -496,7 +499,7 @@ function D() {
496
499
  children: "Convenience Fee"
497
500
  }), /* @__PURE__ */ C("span", {
498
501
  className: "text-text-primary",
499
- children: a(A.pricing.convenienceFee, { minimumFractionDigits: 0 })
502
+ children: a(j.pricing.convenienceFee, { minimumFractionDigits: 0 })
500
503
  })]
501
504
  }),
502
505
  /* @__PURE__ */ w("div", {
@@ -506,17 +509,17 @@ function D() {
506
509
  children: "Tax"
507
510
  }), /* @__PURE__ */ C("span", {
508
511
  className: "text-text-primary",
509
- children: a(A.pricing.tax, { minimumFractionDigits: 0 })
512
+ children: a(j.pricing.tax, { minimumFractionDigits: 0 })
510
513
  })]
511
514
  }),
512
- A.pricing.discount > 0 && /* @__PURE__ */ w("div", {
515
+ j.pricing.discount > 0 && /* @__PURE__ */ w("div", {
513
516
  className: "flex justify-between",
514
517
  children: [/* @__PURE__ */ C("span", {
515
- className: "text-green-600 dark:text-green-400",
518
+ className: "text-status-success-text",
516
519
  children: "Discount"
517
520
  }), /* @__PURE__ */ w("span", {
518
- className: "text-green-600 dark:text-green-400",
519
- children: ["-", a(A.pricing.discount, { minimumFractionDigits: 0 })]
521
+ className: "text-status-success-text",
522
+ children: ["-", a(j.pricing.discount, { minimumFractionDigits: 0 })]
520
523
  })]
521
524
  }),
522
525
  /* @__PURE__ */ w("div", {
@@ -526,14 +529,14 @@ function D() {
526
529
  children: "Total"
527
530
  }), /* @__PURE__ */ C("span", {
528
531
  className: "font-bold text-text-primary",
529
- children: a(A.pricing.total, { minimumFractionDigits: 0 })
532
+ children: a(j.pricing.total, { minimumFractionDigits: 0 })
530
533
  })]
531
534
  })
532
535
  ]
533
536
  })]
534
537
  }),
535
538
  /* @__PURE__ */ w("div", {
536
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
539
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
537
540
  children: [/* @__PURE__ */ C("h3", {
538
541
  className: "text-base font-semibold text-text-primary mb-3",
539
542
  children: "Booking Info"
@@ -547,7 +550,7 @@ function D() {
547
550
  children: "Booked On"
548
551
  }), /* @__PURE__ */ C("p", {
549
552
  className: "text-sm text-text-primary",
550
- children: o(A.createdAt)
553
+ children: o(j.createdAt)
551
554
  })] })]
552
555
  }),
553
556
  /* @__PURE__ */ w("div", {
@@ -558,9 +561,9 @@ function D() {
558
561
  }), /* @__PURE__ */ w("p", {
559
562
  className: "text-sm text-text-primary",
560
563
  children: [
561
- A.scheduledDate,
564
+ j.scheduledDate,
562
565
  " at ",
563
- A.scheduledTime
566
+ j.scheduledTime
564
567
  ]
565
568
  })] })]
566
569
  }),
@@ -571,15 +574,15 @@ function D() {
571
574
  children: "Duration"
572
575
  }), /* @__PURE__ */ w("p", {
573
576
  className: "text-sm text-text-primary",
574
- children: [A.duration, " minutes"]
577
+ children: [j.duration, " minutes"]
575
578
  })] })]
576
579
  })
577
580
  ]
578
581
  })]
579
582
  }),
580
- P && /* @__PURE__ */ w("button", {
583
+ F && /* @__PURE__ */ w("button", {
581
584
  type: "button",
582
- className: "w-full inline-flex items-center justify-center gap-2 rounded-lg border border-red-500/30 bg-red-500/5 px-4 py-3 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-500/10 transition-colors",
585
+ className: "w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/5 px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle/10 transition-colors",
583
586
  children: [/* @__PURE__ */ C(x, { className: "h-4 w-4" }), "Cancel Booking"]
584
587
  })
585
588
  ]
@@ -588,6 +591,6 @@ function D() {
588
591
  });
589
592
  }
590
593
  //#endregion
591
- export { D as BookingDetailsPage };
594
+ export { O as BookingDetailsPage };
592
595
 
593
596
  //# sourceMappingURL=BookingDetailsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module adaptercloud/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-green-500/30 bg-green-500/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400 shrink-0\" />\n <p className=\"text-sm text-green-600 dark:text-green-400\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary mb-1\">Notes</p>\n <p className=\"text-sm text-text-primary\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-red-500/5 border border-red-500/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n <p className=\"text-xs font-medium text-red-600 dark:text-red-400\">\n Cancellation Reason\n </p>\n </div>\n <p className=\"text-sm text-text-primary\">{booking.cancellationReason}</p>\n </div>\n )}\n </div>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-text-secondary\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-red-500/10 text-red-600 dark:text-red-400'\n : event.completed\n ? 'bg-green-500/10 text-green-600 dark:text-green-400'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-green-500/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-text-secondary\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <span className=\"text-text-secondary\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm text-text-primary\">{booking.location.street}</p>\n <p className=\"text-sm text-text-secondary\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service Charge</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Convenience Fee</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Scheduled</p>\n <p className=\"text-sm text-text-primary\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n <p className=\"text-sm text-text-primary\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-red-500/30 bg-red-500/5 px-4 py-3 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-500/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module adaptercloud/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from'react';\nimport { useParams } from'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { StatusBadge } from'../../components/StatusBadge';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate } from'../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useAdapterCloud();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID\"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n purpose=\"Everything about this service booking in one place — the service, schedule, and price, the cart you booked with, and the actions you can take such as rescheduling, contacting the provider, or cancelling.\"\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-status-success-border/30 bg-status-success-bg-subtle/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n <p className=\"text-sm text-status-success-text\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info (emphasis zone) */}\n <EmphasisPanel className=\"p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary mb-1\">Notes</p>\n <p className=\"text-sm text-text-primary\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-status-error-bg-subtle/5 border border-status-error-border/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-status-error-text\" />\n <p className=\"text-xs font-medium text-status-error-text\">\n Cancellation Reason\n </p>\n </div>\n <p className=\"text-sm text-text-primary\">{booking.cancellationReason}</p>\n </div>\n )}\n </EmphasisPanel>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-text-secondary\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6 bg-gloss-card shadow-pop\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-status-error-bg-subtle/10 text-status-error-text'\n : event.completed\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg-subtle/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-text-secondary\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <span className=\"text-text-secondary\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm text-text-primary\">{booking.location.street}</p>\n <p className=\"text-sm text-text-secondary\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service Charge</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Convenience Fee</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Scheduled</p>\n <p className=\"text-sm text-text-primary\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n <p className=\"text-sm text-text-primary\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-border/30 bg-status-error-bg-subtle/5 px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}