@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.625.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/subscriberbot/components/EmptyState.js +17 -10
  2. package/dist/subscriberbot/components/EmptyState.js.map +1 -1
  3. package/dist/subscriberbot/components/InvestmentCard.js +23 -22
  4. package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
  5. package/dist/subscriberbot/components/MetricsCard.js +15 -12
  6. package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
  7. package/dist/subscriberbot/components/PageLayout.js +27 -15
  8. package/dist/subscriberbot/components/PageLayout.js.map +1 -1
  9. package/dist/subscriberbot/components/RatingDisplay.js +3 -3
  10. package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
  11. package/dist/subscriberbot/components/StatusBadge.js +25 -13
  12. package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
  13. package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
  14. package/dist/subscriberbot/pages/HomePage.js +67 -63
  15. package/dist/subscriberbot/pages/HomePage.js.map +1 -1
  16. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
  17. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
  18. package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
  19. package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
  20. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
  21. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
  22. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
  23. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
  24. package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
  25. package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
  26. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
  27. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
  28. package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
  29. package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
  30. package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
  31. package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
  32. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
  33. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  34. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
  35. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  36. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
  37. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  38. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
  39. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  40. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
  41. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  42. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
  43. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  44. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
  45. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
  46. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
  47. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
  48. package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
  49. package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
  50. package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
  51. package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
  52. package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
  53. package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
  54. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
  55. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
  56. package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
  57. package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
  58. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
  59. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
  60. package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
  61. package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
  62. package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
  63. package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
  64. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
  65. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
  66. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
  67. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
  68. package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
  69. package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
  70. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
  71. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
  72. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
  73. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
  74. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
  75. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
  76. package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
  77. package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
  78. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
  79. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
  80. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
  81. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
  82. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
  83. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  84. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
  85. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  86. package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
  87. package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
  88. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
  89. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  90. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
  91. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
  92. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
  93. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
  94. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
  95. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
  96. package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
  97. package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
  98. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
  99. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
  100. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
  101. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
  102. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
  103. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
  104. package/package.json +3 -3
@@ -137,8 +137,8 @@ var y = [
137
137
  ], b = {
138
138
  active: {
139
139
  label: "Active",
140
- color: "text-green-600 dark:text-green-400",
141
- dot: "bg-green-500"
140
+ color: "text-status-success-text",
141
+ dot: "bg-status-success-text"
142
142
  },
143
143
  inactive: {
144
144
  label: "Inactive",
@@ -147,34 +147,34 @@ var y = [
147
147
  },
148
148
  "on-leave": {
149
149
  label: "On Leave",
150
- color: "text-yellow-600 dark:text-yellow-400",
151
- dot: "bg-yellow-500"
150
+ color: "text-status-warning-text",
151
+ dot: "bg-status-warning-text"
152
152
  },
153
153
  terminated: {
154
154
  label: "Terminated",
155
- color: "text-red-600 dark:text-red-400",
156
- dot: "bg-red-500"
155
+ color: "text-status-error-text",
156
+ dot: "bg-status-error-text"
157
157
  }
158
158
  }, x = {
159
159
  manager: {
160
160
  label: "Manager",
161
- color: "bg-purple-500/20 text-purple-600 dark:text-purple-400"
161
+ color: "bg-accent-purple-subtle text-accent-purple"
162
162
  },
163
163
  chef: {
164
164
  label: "Chef",
165
- color: "bg-orange-500/20 text-orange-600 dark:text-orange-400"
165
+ color: "bg-status-warning-bg/20 text-status-warning-text"
166
166
  },
167
167
  server: {
168
168
  label: "Server",
169
- color: "bg-blue-500/20 text-blue-600 dark:text-blue-400"
169
+ color: "bg-status-info-bg/20 text-status-info-text"
170
170
  },
171
171
  delivery: {
172
172
  label: "Delivery",
173
- color: "bg-green-500/20 text-green-600 dark:text-green-400"
173
+ color: "bg-status-success-bg/20 text-status-success-text"
174
174
  },
175
175
  cashier: {
176
176
  label: "Cashier",
177
- color: "bg-cyan-500/20 text-cyan-600 dark:text-cyan-400"
177
+ color: "bg-status-info-bg/20 text-status-info-text"
178
178
  }
179
179
  }, S = {
180
180
  email: "",
@@ -292,9 +292,9 @@ var y = [
292
292
  className: "space-y-4",
293
293
  children: [
294
294
  W && /* @__PURE__ */ v("div", {
295
- className: t("flex items-center gap-2 rounded-lg border p-3", W.type === "success" ? "border-green-500/30 bg-green-500/10" : "border-red-500/30 bg-red-500/10"),
296
- children: [W.type === "success" ? /* @__PURE__ */ _(o, { className: "h-4 w-4 text-green-600 dark:text-green-400" }) : /* @__PURE__ */ _(a, { className: "h-4 w-4 text-red-600 dark:text-red-400" }), /* @__PURE__ */ _("span", {
297
- className: t("text-sm font-medium", W.type === "success" ? "text-green-600 dark:text-green-400" : "text-red-600 dark:text-red-400"),
295
+ className: t("flex items-center gap-2 rounded-lg border p-3", W.type === "success" ? "border-status-success-border/30 bg-status-success-bg/10" : "border-status-error-border/30 bg-status-error-bg/10"),
296
+ children: [W.type === "success" ? /* @__PURE__ */ _(o, { className: "h-4 w-4 text-status-success-text" }) : /* @__PURE__ */ _(a, { className: "h-4 w-4 text-status-error-text" }), /* @__PURE__ */ _("span", {
297
+ className: t("text-sm font-medium", W.type === "success" ? "text-status-success-text" : "text-status-error-text"),
298
298
  children: W.text
299
299
  })]
300
300
  }),
@@ -302,7 +302,7 @@ var y = [
302
302
  className: "grid grid-cols-2 sm:grid-cols-4 gap-3",
303
303
  children: [
304
304
  /* @__PURE__ */ v("div", {
305
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
305
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm",
306
306
  children: [/* @__PURE__ */ _("p", {
307
307
  className: "text-2xl font-bold text-text-primary",
308
308
  children: w.length
@@ -312,9 +312,9 @@ var y = [
312
312
  })]
313
313
  }),
314
314
  /* @__PURE__ */ v("div", {
315
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
315
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm",
316
316
  children: [/* @__PURE__ */ _("p", {
317
- className: "text-2xl font-bold text-green-600 dark:text-green-400",
317
+ className: "text-2xl font-bold text-status-success-text",
318
318
  children: q
319
319
  }), /* @__PURE__ */ _("p", {
320
320
  className: "text-xs text-text-secondary",
@@ -322,9 +322,9 @@ var y = [
322
322
  })]
323
323
  }),
324
324
  /* @__PURE__ */ v("div", {
325
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
325
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm",
326
326
  children: [/* @__PURE__ */ _("p", {
327
- className: "text-2xl font-bold text-yellow-600 dark:text-yellow-400",
327
+ className: "text-2xl font-bold text-status-warning-text",
328
328
  children: J
329
329
  }), /* @__PURE__ */ _("p", {
330
330
  className: "text-xs text-text-secondary",
@@ -332,7 +332,7 @@ var y = [
332
332
  })]
333
333
  }),
334
334
  /* @__PURE__ */ v("div", {
335
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
335
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm",
336
336
  children: [/* @__PURE__ */ _("p", {
337
337
  className: "text-2xl font-bold text-text-primary",
338
338
  children: Y
@@ -344,7 +344,7 @@ var y = [
344
344
  ]
345
345
  }),
346
346
  /* @__PURE__ */ _("div", {
347
- className: "rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm",
347
+ className: "rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm",
348
348
  children: /* @__PURE__ */ v("div", {
349
349
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",
350
350
  children: [
@@ -355,13 +355,13 @@ var y = [
355
355
  placeholder: "Search staff...",
356
356
  value: E,
357
357
  onChange: (e) => D(e.target.value),
358
- className: "w-full rounded-md border border-border-subtle bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
358
+ className: "w-full rounded-md border border-border-seam bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
359
359
  })]
360
360
  }),
361
361
  /* @__PURE__ */ v("select", {
362
362
  value: O,
363
363
  onChange: (e) => k(e.target.value),
364
- className: "rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
364
+ className: "rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
365
365
  children: [/* @__PURE__ */ _("option", {
366
366
  value: "",
367
367
  children: "All Roles"
@@ -373,7 +373,7 @@ var y = [
373
373
  /* @__PURE__ */ v("select", {
374
374
  value: A,
375
375
  onChange: (e) => j(e.target.value),
376
- className: "rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
376
+ className: "rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
377
377
  children: [/* @__PURE__ */ _("option", {
378
378
  value: "",
379
379
  children: "All Status"
@@ -385,7 +385,7 @@ var y = [
385
385
  /* @__PURE__ */ v("select", {
386
386
  value: M,
387
387
  onChange: (e) => N(e.target.value),
388
- className: "rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
388
+ className: "rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
389
389
  children: [
390
390
  /* @__PURE__ */ _("option", {
391
391
  value: "name",
@@ -409,7 +409,7 @@ var y = [
409
409
  })
410
410
  }),
411
411
  X.length === 0 ? /* @__PURE__ */ v("div", {
412
- className: "flex flex-col items-center justify-center py-16 rounded-lg border border-border-subtle bg-bg-surface shadow-sm text-center",
412
+ className: "flex flex-col items-center justify-center py-16 rounded-lg border border-border-seam bg-bg-surface shadow-sm text-center",
413
413
  children: [
414
414
  /* @__PURE__ */ _(h, { className: "h-12 w-12 text-text-secondary opacity-40 mb-3" }),
415
415
  /* @__PURE__ */ _("p", {
@@ -422,7 +422,7 @@ var y = [
422
422
  })
423
423
  ]
424
424
  }) : /* @__PURE__ */ _("div", {
425
- className: "rounded-lg border border-border-subtle bg-bg-surface shadow-sm divide-y divide-border",
425
+ className: "rounded-lg border border-border-seam bg-bg-surface shadow-sm divide-y divide-border",
426
426
  children: X.map((e) => {
427
427
  let n = b[e.status], r = x[e.role];
428
428
  return /* @__PURE__ */ v("div", {
@@ -479,7 +479,7 @@ var y = [
479
479
  className: "text-center",
480
480
  children: [/* @__PURE__ */ v("p", {
481
481
  className: "font-bold text-text-primary flex items-center gap-0.5 justify-center",
482
- children: [/* @__PURE__ */ _(f, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), e.performance.rating]
482
+ children: [/* @__PURE__ */ _(f, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), e.performance.rating]
483
483
  }), /* @__PURE__ */ _("p", {
484
484
  className: "text-text-secondary",
485
485
  children: "Rating"
@@ -522,9 +522,9 @@ var y = [
522
522
  /* @__PURE__ */ _("button", {
523
523
  type: "button",
524
524
  onClick: () => ee(e.id),
525
- className: t("h-6 w-11 rounded-full transition-colors relative", e.status === "active" ? "bg-green-500" : "bg-muted-foreground/30"),
525
+ className: t("h-6 w-11 rounded-full transition-colors relative", e.status === "active" ? "bg-status-success-text" : "bg-muted-foreground/30"),
526
526
  title: e.status === "active" ? "Deactivate" : "Activate",
527
- children: /* @__PURE__ */ _("div", { className: t("absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform", e.status === "active" ? "translate-x-5" : "translate-x-0.5") })
527
+ children: /* @__PURE__ */ _("div", { className: t("absolute top-0.5 h-5 w-5 rounded-full bg-bg-surface transition-transform", e.status === "active" ? "translate-x-5" : "translate-x-0.5") })
528
528
  }),
529
529
  /* @__PURE__ */ _("button", {
530
530
  type: "button",
@@ -536,7 +536,7 @@ var y = [
536
536
  /* @__PURE__ */ _("button", {
537
537
  type: "button",
538
538
  onClick: () => te(e.id),
539
- className: "rounded p-1.5 text-text-secondary hover:bg-red-500/10 hover:text-red-600 transition-colors",
539
+ className: "rounded p-1.5 text-text-secondary hover:bg-status-error-bg/10 hover:text-status-error-text transition-colors",
540
540
  title: "Remove",
541
541
  children: /* @__PURE__ */ _(p, { className: "h-4 w-4" })
542
542
  })
@@ -548,7 +548,7 @@ var y = [
548
548
  children: [
549
549
  /* @__PURE__ */ v("span", {
550
550
  className: "flex items-center gap-0.5",
551
- children: [/* @__PURE__ */ _(f, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), e.performance.rating]
551
+ children: [/* @__PURE__ */ _(f, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), e.performance.rating]
552
552
  }),
553
553
  /* @__PURE__ */ v("span", { children: [e.performance.tasksCompleted, " tasks"] }),
554
554
  /* @__PURE__ */ v("span", { children: [e.performance.punctuality, "% on time"] }),
@@ -565,9 +565,9 @@ var y = [
565
565
  ]
566
566
  }),
567
567
  P && /* @__PURE__ */ _("div", {
568
- className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",
568
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4",
569
569
  children: /* @__PURE__ */ _("div", {
570
- className: "w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl",
570
+ className: "w-full max-w-lg rounded-lg border border-border-seam bg-bg-surface shadow-xl",
571
571
  children: /* @__PURE__ */ v("div", {
572
572
  className: "p-6",
573
573
  children: [
@@ -598,7 +598,7 @@ var y = [
598
598
  ...t,
599
599
  firstName: e.target.value
600
600
  })),
601
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
601
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
602
602
  })] }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
603
603
  className: "block text-sm font-medium text-text-primary mb-1",
604
604
  children: "Last Name *"
@@ -609,7 +609,7 @@ var y = [
609
609
  ...t,
610
610
  lastName: e.target.value
611
611
  })),
612
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
612
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
613
613
  })] })]
614
614
  }),
615
615
  /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
@@ -622,7 +622,7 @@ var y = [
622
622
  ...t,
623
623
  email: e.target.value
624
624
  })),
625
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
625
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
626
626
  })] }),
627
627
  /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
628
628
  className: "block text-sm font-medium text-text-primary mb-1",
@@ -634,7 +634,7 @@ var y = [
634
634
  ...t,
635
635
  phone: e.target.value
636
636
  })),
637
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
637
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
638
638
  })] }),
639
639
  /* @__PURE__ */ v("div", {
640
640
  className: "grid grid-cols-2 gap-4",
@@ -647,7 +647,7 @@ var y = [
647
647
  ...t,
648
648
  role: e.target.value
649
649
  })),
650
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
650
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
651
651
  children: Object.entries(x).map(([e, t]) => /* @__PURE__ */ _("option", {
652
652
  value: e,
653
653
  children: t.label
@@ -662,7 +662,7 @@ var y = [
662
662
  ...t,
663
663
  hourlyRate: parseInt(e.target.value) || 0
664
664
  })),
665
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
665
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
666
666
  })] })]
667
667
  })
668
668
  ]
@@ -672,7 +672,7 @@ var y = [
672
672
  children: [/* @__PURE__ */ _("button", {
673
673
  type: "button",
674
674
  onClick: () => F(!1),
675
- className: "flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
675
+ className: "flex-1 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
676
676
  children: "Cancel"
677
677
  }), /* @__PURE__ */ _("button", {
678
678
  type: "button",
@@ -686,9 +686,9 @@ var y = [
686
686
  })
687
687
  }),
688
688
  I && R && /* @__PURE__ */ _("div", {
689
- className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",
689
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4",
690
690
  children: /* @__PURE__ */ _("div", {
691
- className: "w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl",
691
+ className: "w-full max-w-lg rounded-lg border border-border-seam bg-bg-surface shadow-xl",
692
692
  children: /* @__PURE__ */ v("div", {
693
693
  className: "p-6",
694
694
  children: [
@@ -719,7 +719,7 @@ var y = [
719
719
  ...t,
720
720
  firstName: e.target.value
721
721
  })),
722
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
722
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
723
723
  })] }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
724
724
  className: "block text-sm font-medium text-text-primary mb-1",
725
725
  children: "Last Name"
@@ -730,7 +730,7 @@ var y = [
730
730
  ...t,
731
731
  lastName: e.target.value
732
732
  })),
733
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
733
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
734
734
  })] })]
735
735
  }),
736
736
  /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
@@ -743,7 +743,7 @@ var y = [
743
743
  ...t,
744
744
  email: e.target.value
745
745
  })),
746
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
746
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
747
747
  })] }),
748
748
  /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
749
749
  className: "block text-sm font-medium text-text-primary mb-1",
@@ -755,7 +755,7 @@ var y = [
755
755
  ...t,
756
756
  phone: e.target.value
757
757
  })),
758
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
758
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
759
759
  })] }),
760
760
  /* @__PURE__ */ v("div", {
761
761
  className: "grid grid-cols-3 gap-4",
@@ -769,7 +769,7 @@ var y = [
769
769
  ...t,
770
770
  role: e.target.value
771
771
  })),
772
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
772
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
773
773
  children: Object.entries(x).map(([e, t]) => /* @__PURE__ */ _("option", {
774
774
  value: e,
775
775
  children: t.label
@@ -785,7 +785,7 @@ var y = [
785
785
  ...t,
786
786
  hourlyRate: parseInt(e.target.value) || 0
787
787
  })),
788
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary"
788
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary"
789
789
  })] }),
790
790
  /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("label", {
791
791
  className: "block text-sm font-medium text-text-primary mb-1",
@@ -796,7 +796,7 @@ var y = [
796
796
  ...t,
797
797
  status: e.target.value
798
798
  })),
799
- className: "w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary",
799
+ className: "w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary",
800
800
  children: Object.entries(b).map(([e, t]) => /* @__PURE__ */ _("option", {
801
801
  value: e,
802
802
  children: t.label
@@ -811,7 +811,7 @@ var y = [
811
811
  children: [/* @__PURE__ */ _("button", {
812
812
  type: "button",
813
813
  onClick: () => L(!1),
814
- className: "flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
814
+ className: "flex-1 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
815
815
  children: "Cancel"
816
816
  }), /* @__PURE__ */ _("button", {
817
817
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"StaffManagementPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/cart-owner/StaffManagementPage.tsx"],"sourcesContent":["/**\n * Staff Management Page\n *\n * Stats overview, staff list with filters (role/status/search/sort),\n * invite staff modal, edit staff modal, performance metrics per staff,\n * status toggle (activate/deactivate), role badges, schedule info.\n *\n * @module subscriberbot/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Users,\n Plus,\n Trash2,\n Calendar,\n Clock,\n UserPlus,\n Phone,\n Star,\n Search,\n Edit2,\n X,\n Mail,\n CheckCircle2,\n AlertCircle,\n Shield,\n Target,\n Award,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype StaffRole = 'manager' | 'chef' | 'server' | 'delivery' | 'cashier';\ntype StaffStatus = 'active' | 'inactive' | 'on-leave' | 'terminated';\n\ninterface StaffMember {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n status: StaffStatus;\n dateJoined: string;\n lastActive?: string;\n hourlyRate: number;\n hoursWorked: number;\n totalEarnings: number;\n performance: {\n rating: number;\n tasksCompleted: number;\n customerRating: number;\n punctuality: number;\n };\n currentShift?: string;\n shiftsThisWeek: number;\n}\n\ninterface InviteForm {\n email: string;\n firstName: string;\n lastName: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n}\n\ninterface EditForm {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n status: StaffStatus;\n}\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst initialStaff: StaffMember[] = [\n {\n id: 'staff-001',\n firstName: 'Ravi',\n lastName: 'Kumar',\n email: 'ravi@dosaexpress.in',\n phone: '+91-9876543210',\n role: 'delivery',\n status: 'active',\n dateJoined: '2023-06-15',\n lastActive: '2024-01-16T10:00:00Z',\n hourlyRate: 200,\n hoursWorked: 160,\n totalEarnings: 32000,\n performance: { rating: 4.8, tasksCompleted: 245, customerRating: 4.7, punctuality: 95 },\n currentShift: '09:00 - 17:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-002',\n firstName: 'Suresh',\n lastName: 'Worker',\n email: 'suresh@dosaexpress.in',\n phone: '+91-9876543211',\n role: 'chef',\n status: 'active',\n dateJoined: '2023-08-20',\n lastActive: '2024-01-16T09:30:00Z',\n hourlyRate: 250,\n hoursWorked: 148,\n totalEarnings: 37000,\n performance: { rating: 4.6, tasksCompleted: 312, customerRating: 4.5, punctuality: 90 },\n currentShift: '10:00 - 18:00',\n shiftsThisWeek: 4,\n },\n {\n id: 'staff-003',\n firstName: 'Amit',\n lastName: 'Sharma',\n email: 'amit@dosaexpress.in',\n phone: '+91-9876543212',\n role: 'delivery',\n status: 'on-leave',\n dateJoined: '2023-10-01',\n hourlyRate: 180,\n hoursWorked: 120,\n totalEarnings: 21600,\n performance: { rating: 4.4, tasksCompleted: 178, customerRating: 4.3, punctuality: 85 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-004',\n firstName: 'Priya',\n lastName: 'Helper',\n email: 'priya@dosaexpress.in',\n phone: '+91-9876543213',\n role: 'server',\n status: 'inactive',\n dateJoined: '2024-01-05',\n hourlyRate: 150,\n hoursWorked: 40,\n totalEarnings: 6000,\n performance: { rating: 4.7, tasksCompleted: 56, customerRating: 4.8, punctuality: 98 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-005',\n firstName: 'Kiran',\n lastName: 'B.',\n email: 'kiran@dosaexpress.in',\n phone: '+91-9876543214',\n role: 'cashier',\n status: 'active',\n dateJoined: '2023-12-10',\n lastActive: '2024-01-16T11:00:00Z',\n hourlyRate: 175,\n hoursWorked: 80,\n totalEarnings: 14000,\n performance: { rating: 4.3, tasksCompleted: 134, customerRating: 4.2, punctuality: 88 },\n currentShift: '11:00 - 19:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-006',\n firstName: 'Meera',\n lastName: 'Devi',\n email: 'meera@dosaexpress.in',\n phone: '+91-9876543215',\n role: 'manager',\n status: 'active',\n dateJoined: '2023-04-01',\n lastActive: '2024-01-16T08:00:00Z',\n hourlyRate: 350,\n hoursWorked: 168,\n totalEarnings: 58800,\n performance: { rating: 4.9, tasksCompleted: 420, customerRating: 4.9, punctuality: 99 },\n currentShift: '08:00 - 16:00',\n shiftsThisWeek: 6,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<StaffStatus, { label: string; color: string; dot: string }> = {\n active: { label: 'Active', color: 'text-green-600 dark:text-green-400', dot: 'bg-green-500' },\n inactive: { label: 'Inactive', color: 'text-text-secondary', dot: 'bg-muted-foreground' },\n 'on-leave': {\n label: 'On Leave',\n color: 'text-yellow-600 dark:text-yellow-400',\n dot: 'bg-yellow-500',\n },\n terminated: { label: 'Terminated', color: 'text-red-600 dark:text-red-400', dot: 'bg-red-500' },\n};\n\nconst roleConfig: Record<StaffRole, { label: string; color: string }> = {\n manager: { label: 'Manager', color: 'bg-purple-500/20 text-purple-600 dark:text-purple-400' },\n chef: { label: 'Chef', color: 'bg-orange-500/20 text-orange-600 dark:text-orange-400' },\n server: { label: 'Server', color: 'bg-blue-500/20 text-blue-600 dark:text-blue-400' },\n delivery: { label: 'Delivery', color: 'bg-green-500/20 text-green-600 dark:text-green-400' },\n cashier: { label: 'Cashier', color: 'bg-cyan-500/20 text-cyan-600 dark:text-cyan-400' },\n};\n\nconst emptyInviteForm: InviteForm = {\n email: '',\n firstName: '',\n lastName: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const StaffManagementPage = () => {\n const { navigateTo } = useSubscriberBot();\n\n // Data\n const [staff, setStaff] = useState<StaffMember[]>(initialStaff);\n\n // Filters\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState('');\n const [statusFilter, setStatusFilter] = useState('');\n const [sortBy, setSortBy] = useState('name');\n\n // Modals\n const [showInviteModal, setShowInviteModal] = useState(false);\n const [showEditModal, setShowEditModal] = useState(false);\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null);\n const [inviteForm, setInviteForm] = useState<InviteForm>(emptyInviteForm);\n const [editForm, setEditForm] = useState<EditForm>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n status: 'active',\n });\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const activeCount = staff.filter((s) => s.status === 'active').length;\n const onLeaveCount = staff.filter((s) => s.status === 'on-leave').length;\n const avgRating =\n staff.length > 0\n ? (staff.reduce((a, s) => a + s.performance.rating, 0) / staff.length).toFixed(1)\n : '0';\n const totalEarnings = staff.reduce((a, s) => a + s.totalEarnings, 0);\n\n // ---- Filtered staff ----\n const filteredStaff = useMemo(() => {\n let result = [...staff];\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (s) =>\n `${s.firstName} ${s.lastName}`.toLowerCase().includes(q) ||\n s.email.toLowerCase().includes(q) ||\n s.phone.includes(q)\n );\n }\n if (roleFilter) result = result.filter((s) => s.role === roleFilter);\n if (statusFilter) result = result.filter((s) => s.status === statusFilter);\n\n switch (sortBy) {\n case 'name':\n result.sort((a, b) =>\n `${a.firstName} ${a.lastName}`.localeCompare(`${b.firstName} ${b.lastName}`)\n );\n break;\n case 'rating':\n result.sort((a, b) => b.performance.rating - a.performance.rating);\n break;\n case 'hours':\n result.sort((a, b) => b.hoursWorked - a.hoursWorked);\n break;\n case 'joined':\n result.sort((a, b) => new Date(b.dateJoined).getTime() - new Date(a.dateJoined).getTime());\n break;\n }\n\n return result;\n }, [staff, searchQuery, roleFilter, statusFilter, sortBy]);\n\n // ---- Handlers ----\n const handleInviteStaff = () => {\n if (!inviteForm.email || !inviteForm.firstName || !inviteForm.lastName) {\n showStatus('Please fill in all required fields', 'error');\n return;\n }\n const newStaff: StaffMember = {\n id: `staff-${Date.now()}`,\n ...inviteForm,\n status: 'active',\n dateJoined: new Date().toISOString().split('T')[0],\n hoursWorked: 0,\n totalEarnings: 0,\n performance: { rating: 0, tasksCompleted: 0, customerRating: 0, punctuality: 0 },\n shiftsThisWeek: 0,\n };\n setStaff((prev) => [...prev, newStaff]);\n setShowInviteModal(false);\n setInviteForm(emptyInviteForm);\n showStatus('Staff member invited successfully', 'success');\n };\n\n const handleEditStaff = (member: StaffMember) => {\n setSelectedStaff(member);\n setEditForm({\n firstName: member.firstName,\n lastName: member.lastName,\n email: member.email,\n phone: member.phone,\n role: member.role,\n hourlyRate: member.hourlyRate,\n status: member.status,\n });\n setShowEditModal(true);\n };\n\n const handleSaveEdit = () => {\n if (!selectedStaff) return;\n setStaff((prev) => prev.map((s) => (s.id === selectedStaff.id ? { ...s, ...editForm } : s)));\n setShowEditModal(false);\n showStatus('Staff member updated successfully', 'success');\n };\n\n const handleToggleStatus = (id: string) => {\n setStaff((prev) =>\n prev.map((s) => {\n if (s.id === id) {\n const newStatus: StaffStatus = s.status === 'active' ? 'inactive' : 'active';\n return { ...s, status: newStatus };\n }\n return s;\n })\n );\n showStatus('Staff status updated', 'success');\n };\n\n const handleRemoveStaff = (id: string) => {\n if (!confirm('Are you sure you want to remove this staff member?')) return;\n setStaff((prev) => prev.filter((s) => s.id !== id));\n showStatus('Staff member removed', 'success');\n };\n\n return (\n <PageLayout\n title=\"Staff Management\"\n description=\"Manage your workers, delivery partners, and shifts\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n }\n >\n <div className=\"space-y-4\">\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-green-500/30 bg-green-500/10'\n : 'border-red-500/30 bg-red-500/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Summary Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{staff.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Staff</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-green-600 dark:text-green-400\">{activeCount}</p>\n <p className=\"text-xs text-text-secondary\">Active Now</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-yellow-600 dark:text-yellow-400\">\n {onLeaveCount}\n </p>\n <p className=\"text-xs text-text-secondary\">On Leave</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{avgRating}</p>\n <p className=\"text-xs text-text-secondary\">Avg. Rating</p>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search staff...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={roleFilter}\n onChange={(e) => setRoleFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Roles</option>\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Status</option>\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Rating: High to Low</option>\n <option value=\"hours\">Hours: Most Worked</option>\n <option value=\"joined\">Recently Joined</option>\n </select>\n </div>\n </div>\n\n {/* Staff List */}\n {filteredStaff.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 rounded-lg border border-border-subtle bg-bg-surface shadow-sm text-center\">\n <Users className=\"h-12 w-12 text-text-secondary opacity-40 mb-3\" />\n <p className=\"text-sm font-medium text-text-primary\">No staff members found</p>\n <p className=\"text-xs text-text-secondary mt-1\">Try adjusting your filters</p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm divide-y divide-border\">\n {filteredStaff.map((member) => {\n const status = statusConfig[member.status];\n const role = roleConfig[member.role];\n const initials = `${member.firstName[0]}${member.lastName[0]}`;\n\n return (\n <div key={member.id} className=\"p-4 sm:p-5 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Avatar + Info */}\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n <div className=\"relative shrink-0\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-primary\">\n {initials}\n </div>\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full border-2 border-card',\n status.dot\n )}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-sm font-medium text-text-primary\">\n {member.firstName} {member.lastName}\n </p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n role.color\n )}\n >\n {role.label}\n </span>\n <span className={cn('text-xs', status.color)}>{status.label}</span>\n </div>\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary flex-wrap\">\n <span className=\"flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {member.email}\n </span>\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {member.phone}\n </span>\n </div>\n </div>\n </div>\n\n {/* Performance + Actions */}\n <div className=\"flex items-center gap-4 sm:gap-6\">\n {/* Performance metrics */}\n <div className=\"hidden md:flex items-center gap-4 text-xs\">\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </p>\n <p className=\"text-text-secondary\">Rating</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.tasksCompleted}\n </p>\n <p className=\"text-text-secondary\">Tasks</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.punctuality}%\n </p>\n <p className=\"text-text-secondary\">On Time</p>\n </div>\n {member.currentShift && (\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Clock className=\"h-3 w-3 text-text-secondary\" />\n {member.currentShift}\n </p>\n <p className=\"text-text-secondary\">Shift</p>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleToggleStatus(member.id)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n member.status === 'active' ? 'bg-green-500' : 'bg-muted-foreground/30'\n )}\n title={member.status === 'active' ? 'Deactivate' : 'Activate'}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n member.status === 'active' ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleEditStaff(member)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStaff(member.id)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-red-500/10 hover:text-red-600 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Mobile performance row */}\n <div className=\"md:hidden flex items-center gap-4 mt-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {member.performance.rating}\n </span>\n <span>{member.performance.tasksCompleted} tasks</span>\n <span>{member.performance.punctuality}% on time</span>\n {member.currentShift && (\n <span className=\"flex items-center gap-0.5\">\n <Clock className=\"h-3 w-3\" />\n {member.currentShift}\n </span>\n )}\n <span>{member.shiftsThisWeek} shifts/wk</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Invite Staff Modal */}\n {showInviteModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Invite Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.firstName}\n onChange={(e) => setInviteForm((p) => ({ ...p, firstName: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.lastName}\n onChange={(e) => setInviteForm((p) => ({ ...p, lastName: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email *</label>\n <input\n type=\"email\"\n value={inviteForm.email}\n onChange={(e) => setInviteForm((p) => ({ ...p, email: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={inviteForm.phone}\n onChange={(e) => setInviteForm((p) => ({ ...p, phone: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={inviteForm.role}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Hourly Rate (₹)\n </label>\n <input\n type=\"number\"\n value={inviteForm.hourlyRate}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInviteStaff}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Send Invite\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Staff Modal */}\n {showEditModal && selectedStaff && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-subtle bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Edit Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name\n </label>\n <input\n type=\"text\"\n value={editForm.firstName}\n onChange={(e) => setEditForm((p) => ({ ...p, firstName: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={editForm.lastName}\n onChange={(e) => setEditForm((p) => ({ ...p, lastName: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email</label>\n <input\n type=\"email\"\n value={editForm.email}\n onChange={(e) => setEditForm((p) => ({ ...p, email: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={editForm.phone}\n onChange={(e) => setEditForm((p) => ({ ...p, phone: e.target.value }))}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={editForm.role}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Rate (₹/hr)\n </label>\n <input\n type=\"number\"\n value={editForm.hourlyRate}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Status</label>\n <select\n value={editForm.status}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, status: e.target.value as StaffStatus }))\n }\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"flex-1 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSaveEdit}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;AA6FA,IAAM,IAA8B;CAClC;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAK,gBAAgB;GAAK,aAAa;GAAI;EACvF,cAAc;EACd,gBAAgB;EACjB;CACD;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAK,gBAAgB;GAAK,aAAa;GAAI;EACvF,cAAc;EACd,gBAAgB;EACjB;CACD;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAK,gBAAgB;GAAK,aAAa;GAAI;EACvF,gBAAgB;EACjB;CACD;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAI,gBAAgB;GAAK,aAAa;GAAI;EACtF,gBAAgB;EACjB;CACD;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAK,gBAAgB;GAAK,aAAa;GAAI;EACvF,cAAc;EACd,gBAAgB;EACjB;CACD;EACE,IAAI;EACJ,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,YAAY;EACZ,aAAa;EACb,eAAe;EACf,aAAa;GAAE,QAAQ;GAAK,gBAAgB;GAAK,gBAAgB;GAAK,aAAa;GAAI;EACvF,cAAc;EACd,gBAAgB;EACjB;CACF,EAMK,IAAmF;CACvF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAsC,KAAK;EAAgB;CAC7F,UAAU;EAAE,OAAO;EAAY,OAAO;EAAuB,KAAK;EAAuB;CACzF,YAAY;EACV,OAAO;EACP,OAAO;EACP,KAAK;EACN;CACD,YAAY;EAAE,OAAO;EAAc,OAAO;EAAkC,KAAK;EAAc;CAChG,EAEK,IAAkE;CACtE,SAAS;EAAE,OAAO;EAAW,OAAO;EAAyD;CAC7F,MAAM;EAAE,OAAO;EAAQ,OAAO;EAAyD;CACvF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAmD;CACrF,UAAU;EAAE,OAAO;EAAY,OAAO;EAAsD;CAC5F,SAAS;EAAE,OAAO;EAAW,OAAO;EAAmD;CACxF,EAEK,IAA8B;CAClC,OAAO;CACP,WAAW;CACX,UAAU;CACV,OAAO;CACP,MAAM;CACN,YAAY;CACb,EAMY,UAA4B;CACvC,IAAM,EAAE,kBAAe,GAAkB,EAGnC,CAAC,GAAO,KAAY,EAAwB,EAAa,EAGzD,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAY,KAAiB,EAAS,GAAG,EAC1C,CAAC,GAAc,KAAmB,EAAS,GAAG,EAC9C,CAAC,GAAQ,KAAa,EAAS,OAAO,EAGtC,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAe,KAAoB,EAA6B,KAAK,EACtE,CAAC,GAAY,KAAiB,EAAqB,EAAgB,EACnE,CAAC,GAAU,KAAe,EAAmB;EACjD,WAAW;EACX,UAAU;EACV,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,QAAQ;EACT,CAAC,EAGI,CAAC,GAAe,KAAoB,EAA+B,KAAK,EAExE,KAAc,GAAc,MAA8B;AAE9D,EADA,EAAiB;GAAE;GAAM;GAAM,CAAC,EAChC,iBAAiB,EAAiB,KAAK,EAAE,IAAK;IAI1C,IAAc,EAAM,QAAQ,MAAM,EAAE,WAAW,SAAS,CAAC,QACzD,IAAe,EAAM,QAAQ,MAAM,EAAE,WAAW,WAAW,CAAC,QAC5D,IACJ,EAAM,SAAS,KACV,EAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,YAAY,QAAQ,EAAE,GAAG,EAAM,QAAQ,QAAQ,EAAE,GAC/E;AACgB,GAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,eAAe,EAAE;CAGpE,IAAM,IAAgB,QAAc;EAClC,IAAI,IAAS,CAAC,GAAG,EAAM;AAEvB,MAAI,GAAa;GACf,IAAM,IAAI,EAAY,aAAa;AACnC,OAAS,EAAO,QACb,MACC,GAAG,EAAE,UAAU,GAAG,EAAE,WAAW,aAAa,CAAC,SAAS,EAAE,IACxD,EAAE,MAAM,aAAa,CAAC,SAAS,EAAE,IACjC,EAAE,MAAM,SAAS,EAAE,CACtB;;AAKH,UAHI,MAAY,IAAS,EAAO,QAAQ,MAAM,EAAE,SAAS,EAAW,GAChE,MAAc,IAAS,EAAO,QAAQ,MAAM,EAAE,WAAW,EAAa,GAElE,GAAR;GACE,KAAK;AACH,MAAO,MAAM,GAAG,MACd,GAAG,EAAE,UAAU,GAAG,EAAE,WAAW,cAAc,GAAG,EAAE,UAAU,GAAG,EAAE,WAAW,CAC7E;AACD;GACF,KAAK;AACH,MAAO,MAAM,GAAG,MAAM,EAAE,YAAY,SAAS,EAAE,YAAY,OAAO;AAClE;GACF,KAAK;AACH,MAAO,MAAM,GAAG,MAAM,EAAE,cAAc,EAAE,YAAY;AACpD;GACF,KAAK;AACH,MAAO,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,WAAW,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC;AAC1F;;AAGJ,SAAO;IACN;EAAC;EAAO;EAAa;EAAY;EAAc;EAAO,CAAC,EAGpD,UAA0B;AAC9B,MAAI,CAAC,EAAW,SAAS,CAAC,EAAW,aAAa,CAAC,EAAW,UAAU;AACtE,KAAW,sCAAsC,QAAQ;AACzD;;EAEF,IAAM,IAAwB;GAC5B,IAAI,SAAS,KAAK,KAAK;GACvB,GAAG;GACH,QAAQ;GACR,6BAAY,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC;GAChD,aAAa;GACb,eAAe;GACf,aAAa;IAAE,QAAQ;IAAG,gBAAgB;IAAG,gBAAgB;IAAG,aAAa;IAAG;GAChF,gBAAgB;GACjB;AAID,EAHA,GAAU,MAAS,CAAC,GAAG,GAAM,EAAS,CAAC,EACvC,EAAmB,GAAM,EACzB,EAAc,EAAgB,EAC9B,EAAW,qCAAqC,UAAU;IAGtD,KAAmB,MAAwB;AAW/C,EAVA,EAAiB,EAAO,EACxB,EAAY;GACV,WAAW,EAAO;GAClB,UAAU,EAAO;GACjB,OAAO,EAAO;GACd,OAAO,EAAO;GACd,MAAM,EAAO;GACb,YAAY,EAAO;GACnB,QAAQ,EAAO;GAChB,CAAC,EACF,EAAiB,GAAK;IAGlB,UAAuB;AACtB,QACL,GAAU,MAAS,EAAK,KAAK,MAAO,EAAE,OAAO,EAAc,KAAK;GAAE,GAAG;GAAG,GAAG;GAAU,GAAG,EAAG,CAAC,EAC5F,EAAiB,GAAM,EACvB,EAAW,qCAAqC,UAAU;IAGtD,MAAsB,MAAe;AAUzC,EATA,GAAU,MACR,EAAK,KAAK,MAAM;AACd,OAAI,EAAE,OAAO,GAAI;IACf,IAAM,IAAyB,EAAE,WAAW,WAAW,aAAa;AACpE,WAAO;KAAE,GAAG;KAAG,QAAQ;KAAW;;AAEpC,UAAO;IACP,CACH,EACD,EAAW,wBAAwB,UAAU;IAGzC,MAAqB,MAAe;AACnC,UAAQ,qDAAqD,KAClE,GAAU,MAAS,EAAK,QAAQ,MAAM,EAAE,OAAO,EAAG,CAAC,EACnD,EAAW,wBAAwB,UAAU;;AAG/C,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GACE,MAAK;GACL,eAAe;AAEb,IADA,EAAc,EAAgB,EAC9B,EAAmB,GAAK;;GAE1B,WAAU;aANZ,CAQE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,eAEzB;;YAdb;GAiBE,kBAAC,OAAD;IAAK,WAAU;cAAf;KAEG,KACC,kBAAC,OAAD;MACE,WAAW,EACT,iDACA,EAAc,SAAS,YACnB,wCACA,kCACL;gBANH,CAQG,EAAc,SAAS,YACtB,kBAAC,GAAD,EAAc,WAAU,8CAA+C,CAAA,GAEvE,kBAAC,GAAD,EAAa,WAAU,0CAA2C,CAAA,EAEpE,kBAAC,QAAD;OACE,WAAW,EACT,uBACA,EAAc,SAAS,YACnB,uCACA,iCACL;iBAEA,EAAc;OACV,CAAA,CACH;;KAIR,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAwC,EAAM;SAAW,CAAA,EACtE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAe,CAAA,CACtD;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAyD;SAAgB,CAAA,EACtF,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAc,CAAA,CACrD;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBACV;SACC,CAAA,EACJ,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAY,CAAA,CACnD;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAwC;SAAc,CAAA,EACnE,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAe,CAAA,CACtD;;OACF;;KAGN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,SAAD;UACE,MAAK;UACL,aAAY;UACZ,OAAO;UACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;UAC/C,WAAU;UACV,CAAA,CACE;;QACN,kBAAC,UAAD;SACE,OAAO;SACP,WAAW,MAAM,EAAc,EAAE,OAAO,MAAM;SAC9C,WAAU;mBAHZ,CAKE,kBAAC,UAAD;UAAQ,OAAM;oBAAG;UAAkB,CAAA,EAClC,OAAO,QAAQ,EAAW,CAAC,KAAK,CAAC,GAAK,OACrC,kBAAC,UAAD;UAAkB,OAAO;oBACtB,EAAI;UACE,EAFI,EAEJ,CACT,CACK;;QACT,kBAAC,UAAD;SACE,OAAO;SACP,WAAW,MAAM,EAAgB,EAAE,OAAO,MAAM;SAChD,WAAU;mBAHZ,CAKE,kBAAC,UAAD;UAAQ,OAAM;oBAAG;UAAmB,CAAA,EACnC,OAAO,QAAQ,EAAa,CAAC,KAAK,CAAC,GAAK,OACvC,kBAAC,UAAD;UAAkB,OAAO;oBACtB,EAAI;UACE,EAFI,EAEJ,CACT,CACK;;QACT,kBAAC,UAAD;SACE,OAAO;SACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;SAC1C,WAAU;mBAHZ;UAKE,kBAAC,UAAD;WAAQ,OAAM;qBAAO;WAAiB,CAAA;UACtC,kBAAC,UAAD;WAAQ,OAAM;qBAAS;WAA4B,CAAA;UACnD,kBAAC,UAAD;WAAQ,OAAM;qBAAQ;WAA2B,CAAA;UACjD,kBAAC,UAAD;WAAQ,OAAM;qBAAS;WAAwB,CAAA;UACxC;;QACL;;MACF,CAAA;KAGL,EAAc,WAAW,IACxB,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD,EAAO,WAAU,iDAAkD,CAAA;OACnE,kBAAC,KAAD;QAAG,WAAU;kBAAwC;QAA0B,CAAA;OAC/E,kBAAC,KAAD;QAAG,WAAU;kBAAmC;QAA8B,CAAA;OAC1E;UAEN,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAc,KAAK,MAAW;OAC7B,IAAM,IAAS,EAAa,EAAO,SAC7B,IAAO,EAAW,EAAO;AAG/B,cACE,kBAAC,OAAD;QAAqB,WAAU;kBAA/B,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CAEE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,OAAD;YAAK,WAAU;sBARR,GAAG,EAAO,UAAU,KAAK,EAAO,SAAS;YAU1C,CAAA,EACN,kBAAC,QAAD,EACE,WAAW,EACT,iFACA,EAAO,IACR,EACD,CAAA,CACE;cACN,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,OAAD;YAAK,WAAU;sBAAf;aACE,kBAAC,KAAD;cAAG,WAAU;wBAAb;eACG,EAAO;eAAU;eAAE,EAAO;eACzB;;aACJ,kBAAC,QAAD;cACE,WAAW,EACT,6EACA,EAAK,MACN;wBAEA,EAAK;cACD,CAAA;aACP,kBAAC,QAAD;cAAM,WAAW,EAAG,WAAW,EAAO,MAAM;wBAAG,EAAO;cAAa,CAAA;aAC/D;eACN,kBAAC,OAAD;YAAK,WAAU;sBAAf,CACE,kBAAC,QAAD;aAAM,WAAU;uBAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAO,MACH;gBACP,kBAAC,QAAD;aAAM,WAAU;uBAAhB,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC5B,EAAO,MACH;eACH;cACF;aACF;aAGN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CAEE,kBAAC,OAAD;WAAK,WAAU;qBAAf;YACE,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,KAAD;cAAG,WAAU;wBAAb,CACE,kBAAC,GAAD,EAAM,WAAU,2CAA4C,CAAA,EAC3D,EAAO,YAAY,OAClB;iBACJ,kBAAC,KAAD;cAAG,WAAU;wBAAsB;cAAU,CAAA,CACzC;;YACN,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,KAAD;cAAG,WAAU;wBACV,EAAO,YAAY;cAClB,CAAA,EACJ,kBAAC,KAAD;cAAG,WAAU;wBAAsB;cAAS,CAAA,CACxC;;YACN,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,KAAD;cAAG,WAAU;wBAAb,CACG,EAAO,YAAY,aAAY,IAC9B;iBACJ,kBAAC,KAAD;cAAG,WAAU;wBAAsB;cAAW,CAAA,CAC1C;;YACL,EAAO,gBACN,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACE,kBAAC,KAAD;cAAG,WAAU;wBAAb,CACE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,EAChD,EAAO,aACN;iBACJ,kBAAC,KAAD;cAAG,WAAU;wBAAsB;cAAS,CAAA,CACxC;;YAEJ;cAGN,kBAAC,OAAD;WAAK,WAAU;qBAAf;YACE,kBAAC,UAAD;aACE,MAAK;aACL,eAAe,GAAmB,EAAO,GAAG;aAC5C,WAAW,EACT,oDACA,EAAO,WAAW,WAAW,iBAAiB,yBAC/C;aACD,OAAO,EAAO,WAAW,WAAW,eAAe;uBAEnD,kBAAC,OAAD,EACE,WAAW,EACT,uEACA,EAAO,WAAW,WAAW,kBAAkB,kBAChD,EACD,CAAA;aACK,CAAA;YACT,kBAAC,UAAD;aACE,MAAK;aACL,eAAe,EAAgB,EAAO;aACtC,WAAU;aACV,OAAM;uBAEN,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;aACtB,CAAA;YACT,kBAAC,UAAD;aACE,MAAK;aACL,eAAe,GAAkB,EAAO,GAAG;aAC3C,WAAU;aACV,OAAM;uBAEN,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;aACvB,CAAA;YACL;aACF;YACF;YAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,2CAA4C,CAAA,EAC3D,EAAO,YAAY,OACf;;UACP,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAO,YAAY,gBAAe,SAAa,EAAA,CAAA;UACtD,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAO,YAAY,aAAY,YAAgB,EAAA,CAAA;UACrD,EAAO,gBACN,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAC5B,EAAO,aACH;;UAET,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAO,gBAAe,aAAiB,EAAA,CAAA;UAC1C;WACF;UAnII,EAAO,GAmIX;QAER;MACE,CAAA;KAEJ;;GAGL,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,MAAD;SAAI,WAAU;mBAA0C;SAAwB,CAAA,EAChF,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAmB,GAAM;SACxC,WAAU;mBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;SAClB,CAAA,CACL;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAE5D,CAAA,EACR,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAW;WAClB,WAAW,MAAM,GAAe,OAAO;YAAE,GAAG;YAAG,WAAW,EAAE,OAAO;YAAO,EAAE;WAC5E,WAAU;WACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAE5D,CAAA,EACR,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAW;WAClB,WAAW,MAAM,GAAe,OAAO;YAAE,GAAG;YAAG,UAAU,EAAE,OAAO;YAAO,EAAE;WAC3E,WAAU;WACV,CAAA,CACE,EAAA,CAAA,CACF;;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAmD;UAAe,CAAA,EACnF,kBAAC,SAAD;UACE,MAAK;UACL,OAAO,EAAW;UAClB,WAAW,MAAM,GAAe,OAAO;WAAE,GAAG;WAAG,OAAO,EAAE,OAAO;WAAO,EAAE;UACxE,WAAU;UACV,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAmD;UAAa,CAAA,EACjF,kBAAC,SAAD;UACE,MAAK;UACL,OAAO,EAAW;UAClB,WAAW,MAAM,GAAe,OAAO;WAAE,GAAG;WAAG,OAAO,EAAE,OAAO;WAAO,EAAE;UACxE,WAAU;UACV,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAAY,CAAA,EAChF,kBAAC,UAAD;WACE,OAAO,EAAW;WAClB,WAAW,MACT,GAAe,OAAO;YAAE,GAAG;YAAG,MAAM,EAAE,OAAO;YAAoB,EAAE;WAErE,WAAU;qBAET,OAAO,QAAQ,EAAW,CAAC,KAAK,CAAC,GAAK,OACrC,kBAAC,UAAD;YAAkB,OAAO;sBACtB,EAAI;YACE,EAFI,EAEJ,CACT;WACK,CAAA,CACL,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAE5D,CAAA,EACR,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAW;WAClB,WAAW,MACT,GAAe,OAAO;YAAE,GAAG;YAAG,YAAY,SAAS,EAAE,OAAO,MAAM,IAAI;YAAG,EAAE;WAE7E,WAAU;WACV,CAAA,CACE,EAAA,CAAA,CACF;;SACF;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAmB,GAAM;SACxC,WAAU;mBACX;SAEQ,CAAA,EACT,kBAAC,UAAD;SACE,MAAK;SACL,SAAS;SACT,WAAU;mBACX;SAEQ,CAAA,CACL;;OACF;;KACF,CAAA;IACF,CAAA;GAIP,KAAiB,KAChB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,MAAD;SAAI,WAAU;mBAA0C;SAAsB,CAAA,EAC9E,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAiB,GAAM;SACtC,WAAU;mBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;SAClB,CAAA,CACL;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAE5D,CAAA,EACR,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAS;WAChB,WAAW,MAAM,GAAa,OAAO;YAAE,GAAG;YAAG,WAAW,EAAE,OAAO;YAAO,EAAE;WAC1E,WAAU;WACV,CAAA,CACE,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAmD;WAE5D,CAAA,EACR,kBAAC,SAAD;WACE,MAAK;WACL,OAAO,EAAS;WAChB,WAAW,MAAM,GAAa,OAAO;YAAE,GAAG;YAAG,UAAU,EAAE,OAAO;YAAO,EAAE;WACzE,WAAU;WACV,CAAA,CACE,EAAA,CAAA,CACF;;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAmD;UAAa,CAAA,EACjF,kBAAC,SAAD;UACE,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MAAM,GAAa,OAAO;WAAE,GAAG;WAAG,OAAO,EAAE,OAAO;WAAO,EAAE;UACtE,WAAU;UACV,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;UAAO,WAAU;oBAAmD;UAAa,CAAA,EACjF,kBAAC,SAAD;UACE,MAAK;UACL,OAAO,EAAS;UAChB,WAAW,MAAM,GAAa,OAAO;WAAE,GAAG;WAAG,OAAO,EAAE,OAAO;WAAO,EAAE;UACtE,WAAU;UACV,CAAA,CACE,EAAA,CAAA;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;YAAO,WAAU;sBAAmD;YAAY,CAAA,EAChF,kBAAC,UAAD;YACE,OAAO,EAAS;YAChB,WAAW,MACT,GAAa,OAAO;aAAE,GAAG;aAAG,MAAM,EAAE,OAAO;aAAoB,EAAE;YAEnE,WAAU;sBAET,OAAO,QAAQ,EAAW,CAAC,KAAK,CAAC,GAAK,OACrC,kBAAC,UAAD;aAAkB,OAAO;uBACtB,EAAI;aACE,EAFI,EAEJ,CACT;YACK,CAAA,CACL,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;YAAO,WAAU;sBAAmD;YAE5D,CAAA,EACR,kBAAC,SAAD;YACE,MAAK;YACL,OAAO,EAAS;YAChB,WAAW,MACT,GAAa,OAAO;aAAE,GAAG;aAAG,YAAY,SAAS,EAAE,OAAO,MAAM,IAAI;aAAG,EAAE;YAE3E,WAAU;YACV,CAAA,CACE,EAAA,CAAA;WACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;YAAO,WAAU;sBAAmD;YAAc,CAAA,EAClF,kBAAC,UAAD;YACE,OAAO,EAAS;YAChB,WAAW,MACT,GAAa,OAAO;aAAE,GAAG;aAAG,QAAQ,EAAE,OAAO;aAAsB,EAAE;YAEvE,WAAU;sBAET,OAAO,QAAQ,EAAa,CAAC,KAAK,CAAC,GAAK,OACvC,kBAAC,UAAD;aAAkB,OAAO;uBACtB,EAAI;aACE,EAFI,EAEJ,CACT;YACK,CAAA,CACL,EAAA,CAAA;WACF;;SACF;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,UAAD;SACE,MAAK;SACL,eAAe,EAAiB,GAAM;SACtC,WAAU;mBACX;SAEQ,CAAA,EACT,kBAAC,UAAD;SACE,MAAK;SACL,SAAS;SACT,WAAU;mBACX;SAEQ,CAAA,CACL;;OACF;;KACF,CAAA;IACF,CAAA;GAEG"}
1
+ {"version":3,"file":"StaffManagementPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/cart-owner/StaffManagementPage.tsx"],"sourcesContent":["/**\n * Staff Management Page\n *\n * Stats overview, staff list with filters (role/status/search/sort),\n * invite staff modal, edit staff modal, performance metrics per staff,\n * status toggle (activate/deactivate), role badges, schedule info.\n *\n * @module subscriberbot/pages/cart-owner\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Users,\n Plus,\n Trash2,\n Calendar,\n Clock,\n UserPlus,\n Phone,\n Star,\n Search,\n Edit2,\n X,\n Mail,\n CheckCircle2,\n AlertCircle,\n Shield,\n Target,\n Award,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { formatCurrency } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype StaffRole = 'manager' | 'chef' | 'server' | 'delivery' | 'cashier';\ntype StaffStatus = 'active' | 'inactive' | 'on-leave' | 'terminated';\n\ninterface StaffMember {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n status: StaffStatus;\n dateJoined: string;\n lastActive?: string;\n hourlyRate: number;\n hoursWorked: number;\n totalEarnings: number;\n performance: {\n rating: number;\n tasksCompleted: number;\n customerRating: number;\n punctuality: number;\n };\n currentShift?: string;\n shiftsThisWeek: number;\n}\n\ninterface InviteForm {\n email: string;\n firstName: string;\n lastName: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n}\n\ninterface EditForm {\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n role: StaffRole;\n hourlyRate: number;\n status: StaffStatus;\n}\n\ninterface StatusMessage {\n text: string;\n type: 'success' | 'error';\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst initialStaff: StaffMember[] = [\n {\n id: 'staff-001',\n firstName: 'Ravi',\n lastName: 'Kumar',\n email: 'ravi@dosaexpress.in',\n phone: '+91-9876543210',\n role: 'delivery',\n status: 'active',\n dateJoined: '2023-06-15',\n lastActive: '2024-01-16T10:00:00Z',\n hourlyRate: 200,\n hoursWorked: 160,\n totalEarnings: 32000,\n performance: { rating: 4.8, tasksCompleted: 245, customerRating: 4.7, punctuality: 95 },\n currentShift: '09:00 - 17:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-002',\n firstName: 'Suresh',\n lastName: 'Worker',\n email: 'suresh@dosaexpress.in',\n phone: '+91-9876543211',\n role: 'chef',\n status: 'active',\n dateJoined: '2023-08-20',\n lastActive: '2024-01-16T09:30:00Z',\n hourlyRate: 250,\n hoursWorked: 148,\n totalEarnings: 37000,\n performance: { rating: 4.6, tasksCompleted: 312, customerRating: 4.5, punctuality: 90 },\n currentShift: '10:00 - 18:00',\n shiftsThisWeek: 4,\n },\n {\n id: 'staff-003',\n firstName: 'Amit',\n lastName: 'Sharma',\n email: 'amit@dosaexpress.in',\n phone: '+91-9876543212',\n role: 'delivery',\n status: 'on-leave',\n dateJoined: '2023-10-01',\n hourlyRate: 180,\n hoursWorked: 120,\n totalEarnings: 21600,\n performance: { rating: 4.4, tasksCompleted: 178, customerRating: 4.3, punctuality: 85 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-004',\n firstName: 'Priya',\n lastName: 'Helper',\n email: 'priya@dosaexpress.in',\n phone: '+91-9876543213',\n role: 'server',\n status: 'inactive',\n dateJoined: '2024-01-05',\n hourlyRate: 150,\n hoursWorked: 40,\n totalEarnings: 6000,\n performance: { rating: 4.7, tasksCompleted: 56, customerRating: 4.8, punctuality: 98 },\n shiftsThisWeek: 0,\n },\n {\n id: 'staff-005',\n firstName: 'Kiran',\n lastName: 'B.',\n email: 'kiran@dosaexpress.in',\n phone: '+91-9876543214',\n role: 'cashier',\n status: 'active',\n dateJoined: '2023-12-10',\n lastActive: '2024-01-16T11:00:00Z',\n hourlyRate: 175,\n hoursWorked: 80,\n totalEarnings: 14000,\n performance: { rating: 4.3, tasksCompleted: 134, customerRating: 4.2, punctuality: 88 },\n currentShift: '11:00 - 19:00',\n shiftsThisWeek: 5,\n },\n {\n id: 'staff-006',\n firstName: 'Meera',\n lastName: 'Devi',\n email: 'meera@dosaexpress.in',\n phone: '+91-9876543215',\n role: 'manager',\n status: 'active',\n dateJoined: '2023-04-01',\n lastActive: '2024-01-16T08:00:00Z',\n hourlyRate: 350,\n hoursWorked: 168,\n totalEarnings: 58800,\n performance: { rating: 4.9, tasksCompleted: 420, customerRating: 4.9, punctuality: 99 },\n currentShift: '08:00 - 16:00',\n shiftsThisWeek: 6,\n },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nconst statusConfig: Record<StaffStatus, { label: string; color: string; dot: string }> = {\n active: { label: 'Active', color: 'text-status-success-text', dot: 'bg-status-success-text' },\n inactive: { label: 'Inactive', color: 'text-text-secondary', dot: 'bg-muted-foreground' },\n 'on-leave': {\n label: 'On Leave',\n color: 'text-status-warning-text',\n dot: 'bg-status-warning-text',\n },\n terminated: { label: 'Terminated', color: 'text-status-error-text', dot: 'bg-status-error-text' },\n};\n\nconst roleConfig: Record<StaffRole, { label: string; color: string }> = {\n manager: { label: 'Manager', color: 'bg-accent-purple-subtle text-accent-purple' },\n chef: { label: 'Chef', color: 'bg-status-warning-bg/20 text-status-warning-text' },\n server: { label: 'Server', color: 'bg-status-info-bg/20 text-status-info-text' },\n delivery: { label: 'Delivery', color: 'bg-status-success-bg/20 text-status-success-text' },\n cashier: { label: 'Cashier', color: 'bg-status-info-bg/20 text-status-info-text' },\n};\n\nconst emptyInviteForm: InviteForm = {\n email: '',\n firstName: '',\n lastName: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const StaffManagementPage = () => {\n const { navigateTo } = useSubscriberBot();\n\n // Data\n const [staff, setStaff] = useState<StaffMember[]>(initialStaff);\n\n // Filters\n const [searchQuery, setSearchQuery] = useState('');\n const [roleFilter, setRoleFilter] = useState('');\n const [statusFilter, setStatusFilter] = useState('');\n const [sortBy, setSortBy] = useState('name');\n\n // Modals\n const [showInviteModal, setShowInviteModal] = useState(false);\n const [showEditModal, setShowEditModal] = useState(false);\n const [selectedStaff, setSelectedStaff] = useState<StaffMember | null>(null);\n const [inviteForm, setInviteForm] = useState<InviteForm>(emptyInviteForm);\n const [editForm, setEditForm] = useState<EditForm>({\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n role: 'server',\n hourlyRate: 150,\n status: 'active',\n });\n\n // Status\n const [statusMessage, setStatusMessage] = useState<StatusMessage | null>(null);\n\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // ---- Stats ----\n const activeCount = staff.filter((s) => s.status === 'active').length;\n const onLeaveCount = staff.filter((s) => s.status === 'on-leave').length;\n const avgRating =\n staff.length > 0\n ? (staff.reduce((a, s) => a + s.performance.rating, 0) / staff.length).toFixed(1)\n : '0';\n const totalEarnings = staff.reduce((a, s) => a + s.totalEarnings, 0);\n\n // ---- Filtered staff ----\n const filteredStaff = useMemo(() => {\n let result = [...staff];\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (s) =>\n `${s.firstName} ${s.lastName}`.toLowerCase().includes(q) ||\n s.email.toLowerCase().includes(q) ||\n s.phone.includes(q)\n );\n }\n if (roleFilter) result = result.filter((s) => s.role === roleFilter);\n if (statusFilter) result = result.filter((s) => s.status === statusFilter);\n\n switch (sortBy) {\n case 'name':\n result.sort((a, b) =>\n `${a.firstName} ${a.lastName}`.localeCompare(`${b.firstName} ${b.lastName}`)\n );\n break;\n case 'rating':\n result.sort((a, b) => b.performance.rating - a.performance.rating);\n break;\n case 'hours':\n result.sort((a, b) => b.hoursWorked - a.hoursWorked);\n break;\n case 'joined':\n result.sort((a, b) => new Date(b.dateJoined).getTime() - new Date(a.dateJoined).getTime());\n break;\n }\n\n return result;\n }, [staff, searchQuery, roleFilter, statusFilter, sortBy]);\n\n // ---- Handlers ----\n const handleInviteStaff = () => {\n if (!inviteForm.email || !inviteForm.firstName || !inviteForm.lastName) {\n showStatus('Please fill in all required fields', 'error');\n return;\n }\n const newStaff: StaffMember = {\n id: `staff-${Date.now()}`,\n ...inviteForm,\n status: 'active',\n dateJoined: new Date().toISOString().split('T')[0],\n hoursWorked: 0,\n totalEarnings: 0,\n performance: { rating: 0, tasksCompleted: 0, customerRating: 0, punctuality: 0 },\n shiftsThisWeek: 0,\n };\n setStaff((prev) => [...prev, newStaff]);\n setShowInviteModal(false);\n setInviteForm(emptyInviteForm);\n showStatus('Staff member invited successfully', 'success');\n };\n\n const handleEditStaff = (member: StaffMember) => {\n setSelectedStaff(member);\n setEditForm({\n firstName: member.firstName,\n lastName: member.lastName,\n email: member.email,\n phone: member.phone,\n role: member.role,\n hourlyRate: member.hourlyRate,\n status: member.status,\n });\n setShowEditModal(true);\n };\n\n const handleSaveEdit = () => {\n if (!selectedStaff) return;\n setStaff((prev) => prev.map((s) => (s.id === selectedStaff.id ? { ...s, ...editForm } : s)));\n setShowEditModal(false);\n showStatus('Staff member updated successfully', 'success');\n };\n\n const handleToggleStatus = (id: string) => {\n setStaff((prev) =>\n prev.map((s) => {\n if (s.id === id) {\n const newStatus: StaffStatus = s.status === 'active' ? 'inactive' : 'active';\n return { ...s, status: newStatus };\n }\n return s;\n })\n );\n showStatus('Staff status updated', 'success');\n };\n\n const handleRemoveStaff = (id: string) => {\n if (!confirm('Are you sure you want to remove this staff member?')) return;\n setStaff((prev) => prev.filter((s) => s.id !== id));\n showStatus('Staff member removed', 'success');\n };\n\n return (\n <PageLayout\n title=\"Staff Management\"\n description=\"Manage your workers, delivery partners, and shifts\"\n actions={\n <button\n type=\"button\"\n onClick={() => {\n setInviteForm(emptyInviteForm);\n setShowInviteModal(true);\n }}\n className=\"inline-flex items-center gap-2 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80 transition-colors\"\n >\n <UserPlus className=\"h-4 w-4\" />\n Invite Staff\n </button>\n }\n >\n <div className=\"space-y-4\">\n {/* Status Message */}\n {statusMessage && (\n <div\n className={cn(\n 'flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-status-success-border/30 bg-status-success-bg/10'\n : 'border-status-error-border/30 bg-status-error-bg/10'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* Summary Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-4 gap-3\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{staff.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Staff</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-status-success-text\">{activeCount}</p>\n <p className=\"text-xs text-text-secondary\">Active Now</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-status-warning-text\">{onLeaveCount}</p>\n <p className=\"text-xs text-text-secondary\">On Leave</p>\n </div>\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <p className=\"text-2xl font-bold text-text-primary\">{avgRating}</p>\n <p className=\"text-xs text-text-secondary\">Avg. Rating</p>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 shadow-sm\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search staff...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface pl-10 pr-4 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <select\n value={roleFilter}\n onChange={(e) => setRoleFilter(e.target.value)}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Roles</option>\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value)}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"\">All Status</option>\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Rating: High to Low</option>\n <option value=\"hours\">Hours: Most Worked</option>\n <option value=\"joined\">Recently Joined</option>\n </select>\n </div>\n </div>\n\n {/* Staff List */}\n {filteredStaff.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-16 rounded-lg border border-border-seam bg-bg-surface shadow-sm text-center\">\n <Users className=\"h-12 w-12 text-text-secondary opacity-40 mb-3\" />\n <p className=\"text-sm font-medium text-text-primary\">No staff members found</p>\n <p className=\"text-xs text-text-secondary mt-1\">Try adjusting your filters</p>\n </div>\n ) : (\n <div className=\"rounded-lg border border-border-seam bg-bg-surface shadow-sm divide-y divide-border\">\n {filteredStaff.map((member) => {\n const status = statusConfig[member.status];\n const role = roleConfig[member.role];\n const initials = `${member.firstName[0]}${member.lastName[0]}`;\n\n return (\n <div key={member.id} className=\"p-4 sm:p-5 hover:bg-bg-sunken/30 transition-colors\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Avatar + Info */}\n <div className=\"flex items-center gap-4 flex-1 min-w-0\">\n <div className=\"relative shrink-0\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-sm font-semibold text-text-primary\">\n {initials}\n </div>\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 h-3.5 w-3.5 rounded-full border-2 border-card',\n status.dot\n )}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <p className=\"text-sm font-medium text-text-primary\">\n {member.firstName} {member.lastName}\n </p>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium',\n role.color\n )}\n >\n {role.label}\n </span>\n <span className={cn('text-xs', status.color)}>{status.label}</span>\n </div>\n <div className=\"flex items-center gap-3 mt-1 text-xs text-text-secondary flex-wrap\">\n <span className=\"flex items-center gap-1\">\n <Mail className=\"h-3 w-3\" />\n {member.email}\n </span>\n <span className=\"flex items-center gap-1\">\n <Phone className=\"h-3 w-3\" />\n {member.phone}\n </span>\n </div>\n </div>\n </div>\n\n {/* Performance + Actions */}\n <div className=\"flex items-center gap-4 sm:gap-6\">\n {/* Performance metrics */}\n <div className=\"hidden md:flex items-center gap-4 text-xs\">\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {member.performance.rating}\n </p>\n <p className=\"text-text-secondary\">Rating</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.tasksCompleted}\n </p>\n <p className=\"text-text-secondary\">Tasks</p>\n </div>\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary\">\n {member.performance.punctuality}%\n </p>\n <p className=\"text-text-secondary\">On Time</p>\n </div>\n {member.currentShift && (\n <div className=\"text-center\">\n <p className=\"font-bold text-text-primary flex items-center gap-0.5 justify-center\">\n <Clock className=\"h-3 w-3 text-text-secondary\" />\n {member.currentShift}\n </p>\n <p className=\"text-text-secondary\">Shift</p>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => handleToggleStatus(member.id)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n member.status === 'active'\n ? 'bg-status-success-text'\n : 'bg-muted-foreground/30'\n )}\n title={member.status === 'active' ? 'Deactivate' : 'Activate'}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-bg-surface transition-transform',\n member.status === 'active' ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleEditStaff(member)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-bg-sunken hover:text-text-primary transition-colors\"\n title=\"Edit\"\n >\n <Edit2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStaff(member.id)}\n className=\"rounded p-1.5 text-text-secondary hover:bg-status-error-bg/10 hover:text-status-error-text transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Mobile performance row */}\n <div className=\"md:hidden flex items-center gap-4 mt-3 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {member.performance.rating}\n </span>\n <span>{member.performance.tasksCompleted} tasks</span>\n <span>{member.performance.punctuality}% on time</span>\n {member.currentShift && (\n <span className=\"flex items-center gap-0.5\">\n <Clock className=\"h-3 w-3\" />\n {member.currentShift}\n </span>\n )}\n <span>{member.shiftsThisWeek} shifts/wk</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Invite Staff Modal */}\n {showInviteModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-seam bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Invite Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.firstName}\n onChange={(e) => setInviteForm((p) => ({ ...p, firstName: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name *\n </label>\n <input\n type=\"text\"\n value={inviteForm.lastName}\n onChange={(e) => setInviteForm((p) => ({ ...p, lastName: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Email *\n </label>\n <input\n type=\"email\"\n value={inviteForm.email}\n onChange={(e) => setInviteForm((p) => ({ ...p, email: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={inviteForm.phone}\n onChange={(e) => setInviteForm((p) => ({ ...p, phone: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={inviteForm.role}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Hourly Rate (₹)\n </label>\n <input\n type=\"number\"\n value={inviteForm.hourlyRate}\n onChange={(e) =>\n setInviteForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowInviteModal(false)}\n className=\"flex-1 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleInviteStaff}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Send Invite\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Staff Modal */}\n {showEditModal && selectedStaff && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-lg rounded-lg border border-border-seam bg-bg-surface shadow-xl\">\n <div className=\"p-6\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Edit Staff Member</h3>\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-bg-sunken\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n First Name\n </label>\n <input\n type=\"text\"\n value={editForm.firstName}\n onChange={(e) => setEditForm((p) => ({ ...p, firstName: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Last Name\n </label>\n <input\n type=\"text\"\n value={editForm.lastName}\n onChange={(e) => setEditForm((p) => ({ ...p, lastName: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Email</label>\n <input\n type=\"email\"\n value={editForm.email}\n onChange={(e) => setEditForm((p) => ({ ...p, email: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Phone</label>\n <input\n type=\"tel\"\n value={editForm.phone}\n onChange={(e) => setEditForm((p) => ({ ...p, phone: e.target.value }))}\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div className=\"grid grid-cols-3 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">Role</label>\n <select\n value={editForm.role}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, role: e.target.value as StaffRole }))\n }\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(roleConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Rate (₹/hr)\n </label>\n <input\n type=\"number\"\n value={editForm.hourlyRate}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, hourlyRate: parseInt(e.target.value) || 0 }))\n }\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n Status\n </label>\n <select\n value={editForm.status}\n onChange={(e) =>\n setEditForm((p) => ({ ...p, status: e.target.value as StaffStatus }))\n }\n className=\"w-full rounded-md border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n {Object.entries(statusConfig).map(([key, val]) => (\n <option key={key} value={key}>\n {val.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n </div>\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => setShowEditModal(false)}\n className=\"flex-1 rounded-md border border-border-seam px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleSaveEdit}\n className=\"flex-1 rounded-md bg-accent px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent/80\"\n >\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}