@burdenoff/microfe-kadaikodi 2026.624.1 → 2026.626.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 (103) hide show
  1. package/dist/kadaikodi/components/EmptyState.js +8 -21
  2. package/dist/kadaikodi/components/EmptyState.js.map +1 -1
  3. package/dist/kadaikodi/components/InvestmentCard.js +24 -22
  4. package/dist/kadaikodi/components/InvestmentCard.js.map +1 -1
  5. package/dist/kadaikodi/components/MetricsCard.js +16 -13
  6. package/dist/kadaikodi/components/MetricsCard.js.map +1 -1
  7. package/dist/kadaikodi/components/PageLayout.js +29 -19
  8. package/dist/kadaikodi/components/PageLayout.js.map +1 -1
  9. package/dist/kadaikodi/components/RatingDisplay.js +1 -1
  10. package/dist/kadaikodi/components/RatingDisplay.js.map +1 -1
  11. package/dist/kadaikodi/components/StatusBadge.js +28 -15
  12. package/dist/kadaikodi/components/StatusBadge.js.map +1 -1
  13. package/dist/kadaikodi/pages/HomePage.js +54 -48
  14. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  15. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +144 -108
  16. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/kadaikodi/pages/admin/AdminDashboard.js +143 -120
  18. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +146 -130
  20. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +261 -243
  22. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/kadaikodi/pages/admin/AdminProfilePage.js +129 -128
  24. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +178 -150
  26. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/kadaikodi/pages/admin/CartManagementPage.js +200 -177
  28. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/kadaikodi/pages/admin/UserManagementPage.js +340 -318
  30. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +502 -471
  32. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +536 -505
  34. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +97 -72
  36. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +114 -107
  38. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +143 -142
  40. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +677 -674
  42. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +527 -524
  44. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +155 -140
  46. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/kadaikodi/pages/common/HelpSupportPage.js +334 -343
  48. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/kadaikodi/pages/common/NotificationCenterPage.js +126 -114
  50. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/kadaikodi/pages/common/SettingsPage.js +766 -734
  52. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +366 -356
  54. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/kadaikodi/pages/customer/CartDetailPage.js +250 -220
  56. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +208 -202
  58. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/kadaikodi/pages/customer/CheckoutPage.js +100 -94
  60. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +438 -395
  62. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +488 -478
  64. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +523 -512
  66. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/customer/FavoritesPage.js +90 -81
  68. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +118 -110
  70. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +72 -66
  72. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +97 -79
  74. package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/customer/ReviewsPage.js +95 -87
  76. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +83 -65
  78. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +302 -268
  80. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +103 -95
  82. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +86 -77
  84. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +342 -313
  86. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +46 -38
  88. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +183 -159
  90. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +394 -390
  92. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +309 -280
  94. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +115 -87
  96. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +108 -101
  98. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +113 -109
  100. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +96 -89
  102. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/package.json +2 -2
@@ -1,26 +1,13 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ import { IllustratedEmptyState as n } from "@burdenoff/fe-libs/ui";
3
4
  //#region src/kadaikodi/components/EmptyState.tsx
4
- var r = ({ icon: r, title: i, description: a, action: o, className: s }) => /* @__PURE__ */ n("div", {
5
- className: e("flex flex-col items-center justify-center py-12 px-4 text-center", s),
6
- children: [
7
- r && /* @__PURE__ */ t("div", {
8
- className: "mb-4 text-text-secondary opacity-50",
9
- children: r
10
- }),
11
- /* @__PURE__ */ t("h3", {
12
- className: "text-lg font-medium text-text-primary",
13
- children: i
14
- }),
15
- a && /* @__PURE__ */ t("p", {
16
- className: "mt-2 text-sm text-text-secondary max-w-sm",
17
- children: a
18
- }),
19
- o && /* @__PURE__ */ t("div", {
20
- className: "mt-6",
21
- children: o
22
- })
23
- ]
5
+ var r = ({ icon: r, title: i, description: a, action: o, className: s, illustration: c = "empty-data" }) => /* @__PURE__ */ t(n, {
6
+ illustration: c,
7
+ title: i,
8
+ description: a,
9
+ action: o,
10
+ className: e(s)
24
11
  });
25
12
  //#endregion
26
13
  export { r as EmptyState };
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/kadaikodi/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module kadaikodi/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n title,\n description,\n action,\n className,\n}) => {\n return (\n <div\n className={cn('flex flex-col items-center justify-center py-12 px-4 text-center', className)}\n >\n {icon && <div className=\"mb-4 text-text-secondary opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-text-secondary max-w-sm\">{description}</p>}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;AAgBA,IAAa,KAAmC,EAC9C,SACA,UACA,gBACA,WACA,mBAGE,kBAAC,OAAD;CACE,WAAW,EAAG,oEAAoE,EAAU;WAD9F;EAGG,KAAQ,kBAAC,OAAD;GAAK,WAAU;aAAuC;GAAW,CAAA;EAC1E,kBAAC,MAAD;GAAI,WAAU;aAAyC;GAAW,CAAA;EACjE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAA6C;GAAgB,CAAA;EACzF,KAAU,kBAAC,OAAD;GAAK,WAAU;aAAQ;GAAa,CAAA;EAC3C"}
1
+ {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/kadaikodi/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module kadaikodi/components\n *\n * Boff UI 2.0: zero states route through the shared IllustratedEmptyState\n * primitive (on-brand illustration + calm, centered layout). The legacy `icon`\n * prop is still accepted for back-compat but the illustration takes precedence.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n /**\n * Illustration name served by the host shell at /illustrations/<name>.webp.\n * Defaults to the generic data-empty illustration.\n */\n illustration?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n // icon is accepted for back-compat; the on-brand illustration replaces it.\n icon: _icon,\n title,\n description,\n action,\n className,\n illustration = 'empty-data',\n}) => {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={cn(className)}\n />\n );\n};\n"],"mappings":";;;;AA0BA,IAAa,KAAmC,EAE9C,MAAM,GACN,UACA,gBACA,WACA,cACA,kBAAe,mBAGb,kBAAC,GAAD;CACgB;CACP;CACM;CACL;CACR,WAAW,EAAG,EAAU;CACxB,CAAA"}
@@ -2,44 +2,46 @@ import { cn as e } from "../utils/cn.js";
2
2
  import { StatusBadge as t } from "./StatusBadge.js";
3
3
  import { AlertTriangle as n, Shield as r, TrendingUp as i } from "lucide-react";
4
4
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
+ import { GlassCard as s } from "@burdenoff/fe-libs/ui";
5
6
  //#region src/kadaikodi/components/InvestmentCard.tsx
6
- var s = {
7
+ var c = {
7
8
  low: {
8
9
  label: "Low Risk",
9
10
  icon: r,
10
- color: "text-green-600 dark:text-green-400"
11
+ color: "text-status-success-text"
11
12
  },
12
13
  medium: {
13
14
  label: "Medium Risk",
14
15
  icon: n,
15
- color: "text-yellow-600 dark:text-yellow-400"
16
+ color: "text-status-warning-text"
16
17
  },
17
18
  high: {
18
19
  label: "High Risk",
19
20
  icon: n,
20
- color: "text-red-600 dark:text-red-400"
21
+ color: "text-status-error-text"
21
22
  }
22
- }, c = ({ id: n, cartName: r, targetAmount: c, raisedAmount: l, currency: u = "INR", expectedReturns: d, riskLevel: f, status: p, onClick: m, className: h }) => {
23
- let g = c > 0 ? Math.min(l / c * 100, 100) : 0, _ = s[f], v = _.icon, y = (e) => new Intl.NumberFormat(void 0, {
23
+ }, l = ({ id: n, cartName: r, targetAmount: l, raisedAmount: u, currency: d = "INR", expectedReturns: f, riskLevel: p, status: m, onClick: h, className: g }) => {
24
+ let _ = l > 0 ? Math.min(u / l * 100, 100) : 0, v = c[p], y = v.icon, b = (e) => new Intl.NumberFormat(void 0, {
24
25
  style: "currency",
25
- currency: u,
26
+ currency: d,
26
27
  maximumFractionDigits: 0
27
28
  }).format(e);
28
- return /* @__PURE__ */ o("div", {
29
+ return /* @__PURE__ */ o(s, {
30
+ treatment: "plain",
29
31
  role: "button",
30
32
  tabIndex: 0,
31
- onClick: () => m?.(n),
33
+ onClick: () => h?.(n),
32
34
  onKeyDown: (e) => {
33
- (e.key === "Enter" || e.key === " ") && (e.preventDefault(), m?.(n));
35
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), h?.(n));
34
36
  },
35
- className: e("rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors", "hover:border-accent-foreground/20 hover:shadow-md cursor-pointer", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", h),
37
+ className: e("p-4 border-border-seam cursor-pointer", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", g),
36
38
  children: [
37
39
  /* @__PURE__ */ o("div", {
38
40
  className: "flex items-start justify-between",
39
41
  children: [/* @__PURE__ */ a("h3", {
40
42
  className: "text-base font-semibold text-text-primary truncate",
41
43
  children: r
42
- }), /* @__PURE__ */ a(t, { status: p })]
44
+ }), /* @__PURE__ */ a(t, { status: m })]
43
45
  }),
44
46
  /* @__PURE__ */ o("div", {
45
47
  className: "mt-4",
@@ -51,19 +53,19 @@ var s = {
51
53
  children: "Raised"
52
54
  }), /* @__PURE__ */ o("span", {
53
55
  className: "font-medium text-text-primary",
54
- children: [Math.round(g), "%"]
56
+ children: [Math.round(_), "%"]
55
57
  })]
56
58
  }),
57
59
  /* @__PURE__ */ a("div", {
58
60
  className: "mt-1.5 h-2 w-full rounded-full bg-bg-sunken overflow-hidden",
59
61
  children: /* @__PURE__ */ a("div", {
60
- className: "h-full rounded-full bg-action-primary-bg transition-all duration-300",
61
- style: { width: `${g}%` }
62
+ className: "h-full rounded-full bg-action-primary-bg shadow-[var(--shadow-glow)] transition-all duration-300",
63
+ style: { width: `${_}%` }
62
64
  })
63
65
  }),
64
66
  /* @__PURE__ */ o("div", {
65
67
  className: "mt-1.5 flex items-center justify-between text-xs text-text-secondary",
66
- children: [/* @__PURE__ */ a("span", { children: y(l) }), /* @__PURE__ */ a("span", { children: y(c) })]
68
+ children: [/* @__PURE__ */ a("span", { children: b(u) }), /* @__PURE__ */ a("span", { children: b(l) })]
67
69
  })
68
70
  ]
69
71
  }),
@@ -72,10 +74,10 @@ var s = {
72
74
  children: [/* @__PURE__ */ o("div", {
73
75
  className: "flex items-center gap-1.5 text-sm",
74
76
  children: [
75
- /* @__PURE__ */ a(i, { className: "h-3.5 w-3.5 text-green-600 dark:text-green-400" }),
77
+ /* @__PURE__ */ a(i, { className: "h-3.5 w-3.5 text-status-success-text" }),
76
78
  /* @__PURE__ */ a("span", {
77
- className: "font-medium text-text-primary",
78
- children: d
79
+ className: "font-medium tabular-nums text-text-primary",
80
+ children: f
79
81
  }),
80
82
  /* @__PURE__ */ a("span", {
81
83
  className: "text-text-secondary",
@@ -83,14 +85,14 @@ var s = {
83
85
  })
84
86
  ]
85
87
  }), /* @__PURE__ */ o("div", {
86
- className: e("flex items-center gap-1 text-xs font-medium", _.color),
87
- children: [/* @__PURE__ */ a(v, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ a("span", { children: _.label })]
88
+ className: e("flex items-center gap-1 text-xs font-medium", v.color),
89
+ children: [/* @__PURE__ */ a(y, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ a("span", { children: v.label })]
88
90
  })]
89
91
  })
90
92
  ]
91
93
  });
92
94
  };
93
95
  //#endregion
94
- export { c as InvestmentCard };
96
+ export { l as InvestmentCard };
95
97
 
96
98
  //# sourceMappingURL=InvestmentCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentCard.js","names":[],"sources":["../../../src/kadaikodi/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module kadaikodi/components\n *\n * Displays an investment opportunity with cart name, target/raised amounts,\n * progress bar, expected returns, risk level, and status.\n */\n\nimport type { FC } from 'react';\nimport { TrendingUp, AlertTriangle, Shield } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { StatusBadge } from './StatusBadge';\nimport type { InvestmentStatus, RiskLevel } from '../types';\n\ninterface InvestmentCardProps {\n id: string;\n cartName: string;\n targetAmount: number;\n raisedAmount: number;\n currency?: string;\n expectedReturns: string;\n riskLevel: RiskLevel;\n status: InvestmentStatus;\n onClick?: (id: string) => void;\n className?: string;\n}\n\nconst riskConfig: Record<RiskLevel, { label: string; icon: typeof Shield; color: string }> = {\n low: {\n label: 'Low Risk',\n icon: Shield,\n color: 'text-green-600 dark:text-green-400',\n },\n medium: {\n label: 'Medium Risk',\n icon: AlertTriangle,\n color: 'text-yellow-600 dark:text-yellow-400',\n },\n high: {\n label: 'High Risk',\n icon: AlertTriangle,\n color: 'text-red-600 dark:text-red-400',\n },\n};\n\nexport const InvestmentCard: FC<InvestmentCardProps> = ({\n id,\n cartName,\n targetAmount,\n raisedAmount,\n currency = 'INR',\n expectedReturns,\n riskLevel,\n status,\n onClick,\n className,\n}) => {\n const progress = targetAmount > 0 ? Math.min((raisedAmount / targetAmount) * 100, 100) : 0;\n const risk = riskConfig[riskLevel];\n const RiskIcon = risk.icon;\n\n const formatAmount = (amount: number) =>\n new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(amount);\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => onClick?.(id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(id);\n }\n }}\n className={cn(\n 'rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors',\n 'hover:border-accent-foreground/20 hover:shadow-md cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">{cartName}</h3>\n <StatusBadge status={status} />\n </div>\n\n {/* Progress Bar */}\n <div className=\"mt-4\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Raised</span>\n <span className=\"font-medium text-text-primary\">{Math.round(progress)}%</span>\n </div>\n <div className=\"mt-1.5 h-2 w-full rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <div className=\"mt-1.5 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatAmount(raisedAmount)}</span>\n <span>{formatAmount(targetAmount)}</span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5 text-sm\">\n <TrendingUp className=\"h-3.5 w-3.5 text-green-600 dark:text-green-400\" />\n <span className=\"font-medium text-text-primary\">{expectedReturns}</span>\n <span className=\"text-text-secondary\">returns</span>\n </div>\n <div className={cn('flex items-center gap-1 text-xs font-medium', risk.color)}>\n <RiskIcon className=\"h-3.5 w-3.5\" />\n <span>{risk.label}</span>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;AA2BA,IAAM,IAAuF;CAC3F,KAAK;EACH,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD,QAAQ;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD,MAAM;EACJ,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACF,EAEY,KAA2C,EACtD,OACA,aACA,iBACA,iBACA,cAAW,OACX,oBACA,cACA,WACA,YACA,mBACI;CACJ,IAAM,IAAW,IAAe,IAAI,KAAK,IAAK,IAAe,IAAgB,KAAK,IAAI,GAAG,GACnF,IAAO,EAAW,IAClB,IAAW,EAAK,MAEhB,KAAgB,MACpB,IAAI,KAAK,aAAa,KAAA,GAAW;EAC/B,OAAO;EACP;EACA,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAO;AAEnB,QACE,kBAAC,OAAD;EACE,MAAK;EACL,UAAU;EACV,eAAe,IAAU,EAAG;EAC5B,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,IAAU,EAAG;;EAGjB,WAAW,EACT,wFACA,oEACA,gGACA,EACD;YAfH;GAkBE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAsD;KAAc,CAAA,EAClF,kBAAC,GAAD,EAAqB,WAAU,CAAA,CAC3B;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAsB;OAAa,CAAA,EACnD,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAAiD,KAAK,MAAM,EAAS,EAAC,IAAQ;SAC1E;;KACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OACE,WAAU;OACV,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;OAChC,CAAA;MACE,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,EAAa,EAAa,EAAQ,CAAA,EACzC,kBAAC,QAAD,EAAA,UAAO,EAAa,EAAa,EAAQ,CAAA,CACrC;;KACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAY,WAAU,kDAAmD,CAAA;MACzE,kBAAC,QAAD;OAAM,WAAU;iBAAiC;OAAuB,CAAA;MACxE,kBAAC,QAAD;OAAM,WAAU;iBAAsB;OAAc,CAAA;MAChD;QACN,kBAAC,OAAD;KAAK,WAAW,EAAG,+CAA+C,EAAK,MAAM;eAA7E,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EACpC,kBAAC,QAAD,EAAA,UAAO,EAAK,OAAa,CAAA,CACrB;OACF;;GACF"}
1
+ {"version":3,"file":"InvestmentCard.js","names":[],"sources":["../../../src/kadaikodi/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module kadaikodi/components\n *\n * Displays an investment opportunity with cart name, target/raised amounts,\n * progress bar, expected returns, risk level, and status.\n */\n\nimport type { FC } from 'react';\nimport { TrendingUp, AlertTriangle, Shield } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\nimport { StatusBadge } from './StatusBadge';\nimport type { InvestmentStatus, RiskLevel } from '../types';\n\ninterface InvestmentCardProps {\n id: string;\n cartName: string;\n targetAmount: number;\n raisedAmount: number;\n currency?: string;\n expectedReturns: string;\n riskLevel: RiskLevel;\n status: InvestmentStatus;\n onClick?: (id: string) => void;\n className?: string;\n}\n\nconst riskConfig: Record<RiskLevel, { label: string; icon: typeof Shield; color: string }> = {\n low: {\n label: 'Low Risk',\n icon: Shield,\n color: 'text-status-success-text',\n },\n medium: {\n label: 'Medium Risk',\n icon: AlertTriangle,\n color: 'text-status-warning-text',\n },\n high: {\n label: 'High Risk',\n icon: AlertTriangle,\n color: 'text-status-error-text',\n },\n};\n\nexport const InvestmentCard: FC<InvestmentCardProps> = ({\n id,\n cartName,\n targetAmount,\n raisedAmount,\n currency = 'INR',\n expectedReturns,\n riskLevel,\n status,\n onClick,\n className,\n}) => {\n const progress = targetAmount > 0 ? Math.min((raisedAmount / targetAmount) * 100, 100) : 0;\n const risk = riskConfig[riskLevel];\n const RiskIcon = risk.icon;\n\n const formatAmount = (amount: number) =>\n new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(amount);\n\n return (\n <GlassCard\n treatment=\"plain\"\n role=\"button\"\n tabIndex={0}\n onClick={() => onClick?.(id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick?.(id);\n }\n }}\n className={cn(\n 'p-4 border-border-seam cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">{cartName}</h3>\n <StatusBadge status={status} />\n </div>\n\n {/* Progress Bar */}\n <div className=\"mt-4\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Raised</span>\n <span className=\"font-medium text-text-primary\">{Math.round(progress)}%</span>\n </div>\n <div className=\"mt-1.5 h-2 w-full rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg shadow-[var(--shadow-glow)] transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <div className=\"mt-1.5 flex items-center justify-between text-xs text-text-secondary\">\n <span>{formatAmount(raisedAmount)}</span>\n <span>{formatAmount(targetAmount)}</span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5 text-sm\">\n <TrendingUp className=\"h-3.5 w-3.5 text-status-success-text\" />\n <span className=\"font-medium tabular-nums text-text-primary\">{expectedReturns}</span>\n <span className=\"text-text-secondary\">returns</span>\n </div>\n <div className={cn('flex items-center gap-1 text-xs font-medium', risk.color)}>\n <RiskIcon className=\"h-3.5 w-3.5\" />\n <span>{risk.label}</span>\n </div>\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;;AA4BA,IAAM,IAAuF;CAC3F,KAAK;EACH,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD,QAAQ;EACN,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACD,MAAM;EACJ,OAAO;EACP,MAAM;EACN,OAAO;EACR;CACF,EAEY,KAA2C,EACtD,OACA,aACA,iBACA,iBACA,cAAW,OACX,oBACA,cACA,WACA,YACA,mBACI;CACJ,IAAM,IAAW,IAAe,IAAI,KAAK,IAAK,IAAe,IAAgB,KAAK,IAAI,GAAG,GACnF,IAAO,EAAW,IAClB,IAAW,EAAK,MAEhB,KAAgB,MACpB,IAAI,KAAK,aAAa,KAAA,GAAW;EAC/B,OAAO;EACP;EACA,uBAAuB;EACxB,CAAC,CAAC,OAAO,EAAO;AAEnB,QACE,kBAAC,GAAD;EACE,WAAU;EACV,MAAK;EACL,UAAU;EACV,eAAe,IAAU,EAAG;EAC5B,YAAY,MAAM;AAChB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,IAAU,EAAG;;EAGjB,WAAW,EACT,yCACA,gGACA,EACD;YAfH;GAkBE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAsD;KAAc,CAAA,EAClF,kBAAC,GAAD,EAAqB,WAAU,CAAA,CAC3B;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAsB;OAAa,CAAA,EACnD,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAAiD,KAAK,MAAM,EAAS,EAAC,IAAQ;SAC1E;;KACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OACE,WAAU;OACV,OAAO,EAAE,OAAO,GAAG,EAAS,IAAI;OAChC,CAAA;MACE,CAAA;KACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,EAAa,EAAa,EAAQ,CAAA,EACzC,kBAAC,QAAD,EAAA,UAAO,EAAa,EAAa,EAAQ,CAAA,CACrC;;KACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD,EAAY,WAAU,wCAAyC,CAAA;MAC/D,kBAAC,QAAD;OAAM,WAAU;iBAA8C;OAAuB,CAAA;MACrF,kBAAC,QAAD;OAAM,WAAU;iBAAsB;OAAc,CAAA;MAChD;QACN,kBAAC,OAAD;KAAK,WAAW,EAAG,+CAA+C,EAAK,MAAM;eAA7E,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EACpC,kBAAC,QAAD,EAAA,UAAO,EAAK,OAAa,CAAA,CACrB;OACF;;GACI"}
@@ -1,37 +1,40 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { Minus as t, TrendingDown as n, TrendingUp as r } from "lucide-react";
3
3
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
+ import { GlassCard as o } from "@burdenoff/fe-libs/ui";
4
5
  //#region src/kadaikodi/components/MetricsCard.tsx
5
- var o = {
6
+ var s = {
6
7
  up: {
7
8
  icon: r,
8
- color: "text-green-600 dark:text-green-400"
9
+ color: "text-status-success-text"
9
10
  },
10
11
  down: {
11
12
  icon: n,
12
- color: "text-red-600 dark:text-red-400"
13
+ color: "text-status-error-text"
13
14
  },
14
15
  neutral: {
15
16
  icon: t,
16
17
  color: "text-text-secondary"
17
18
  }
18
- }, s = ({ icon: t, value: n, label: r, trend: s, trendValue: c, className: l }) => {
19
- let u = s ? o[s] : null, d = u?.icon;
20
- return /* @__PURE__ */ a("div", {
21
- className: e("rounded-lg border border-border-subtle bg-bg-surface p-6 shadow-sm", l),
19
+ }, c = ({ icon: t, value: n, label: r, trend: c, trendValue: l, className: u, featured: d = !1 }) => {
20
+ let f = c ? s[c] : null, p = f?.icon;
21
+ return /* @__PURE__ */ a(o, {
22
+ treatment: d ? "glass" : "metric",
23
+ glow: d,
24
+ className: e("p-6", u),
22
25
  children: [/* @__PURE__ */ a("div", {
23
26
  className: "flex items-center justify-between",
24
27
  children: [/* @__PURE__ */ i("div", {
25
- className: "text-text-secondary",
28
+ className: "flex size-9 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:h-4 [&>svg]:w-4",
26
29
  children: t
27
- }), s && u && d && /* @__PURE__ */ a("div", {
28
- className: e("flex items-center gap-1 text-xs font-medium", u.color),
29
- children: [/* @__PURE__ */ i(d, { className: "h-3.5 w-3.5" }), c && /* @__PURE__ */ i("span", { children: c })]
30
+ }), c && f && p && /* @__PURE__ */ a("div", {
31
+ className: e("flex items-center gap-1 text-xs font-medium tabular-nums", f.color),
32
+ children: [/* @__PURE__ */ i(p, { className: "h-3.5 w-3.5" }), l && /* @__PURE__ */ i("span", { children: l })]
30
33
  })]
31
34
  }), /* @__PURE__ */ a("div", {
32
35
  className: "mt-3",
33
36
  children: [/* @__PURE__ */ i("p", {
34
- className: "text-2xl font-bold text-text-primary",
37
+ className: "text-2xl font-bold tabular-nums text-text-primary",
35
38
  children: n
36
39
  }), /* @__PURE__ */ i("p", {
37
40
  className: "mt-1 text-sm text-text-secondary",
@@ -41,6 +44,6 @@ var o = {
41
44
  });
42
45
  };
43
46
  //#endregion
44
- export { s as MetricsCard };
47
+ export { c as MetricsCard };
45
48
 
46
49
  //# sourceMappingURL=MetricsCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/kadaikodi/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module kadaikodi/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport type { TrendDirection } from '../types';\n\ninterface MetricsCardProps {\n icon: ReactNode;\n value: string | number;\n label: string;\n trend?: TrendDirection;\n trendValue?: string;\n className?: string;\n}\n\nconst trendConfig: Record<TrendDirection, { icon: typeof TrendingUp; color: string }> = {\n up: { icon: TrendingUp, color: 'text-green-600 dark:text-green-400' },\n down: { icon: TrendingDown, color: 'text-red-600 dark:text-red-400' },\n neutral: { icon: Minus, color: 'text-text-secondary' },\n};\n\nexport const MetricsCard: FC<MetricsCardProps> = ({\n icon,\n value,\n label,\n trend,\n trendValue,\n className,\n}) => {\n const trendInfo = trend ? trendConfig[trend] : null;\n const TrendIcon = trendInfo?.icon;\n\n return (\n <div className={cn('rounded-lg border border-border-subtle bg-bg-surface p-6 shadow-sm', className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-text-secondary\">{icon}</div>\n {trend && trendInfo && TrendIcon && (\n <div className={cn('flex items-center gap-1 text-xs font-medium', trendInfo.color)}>\n <TrendIcon className=\"h-3.5 w-3.5\" />\n {trendValue && <span>{trendValue}</span>}\n </div>\n )}\n </div>\n <div className=\"mt-3\">\n <p className=\"text-2xl font-bold text-text-primary\">{value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{label}</p>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;AAmBA,IAAM,IAAkF;CACtF,IAAI;EAAE,MAAM;EAAY,OAAO;EAAsC;CACrE,MAAM;EAAE,MAAM;EAAc,OAAO;EAAkC;CACrE,SAAS;EAAE,MAAM;EAAO,OAAO;EAAuB;CACvD,EAEY,KAAqC,EAChD,SACA,UACA,UACA,UACA,eACA,mBACI;CACJ,IAAM,IAAY,IAAQ,EAAY,KAAS,MACzC,IAAY,GAAW;AAE7B,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,sEAAsE,EAAU;YAAnG,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAuB;IAAW,CAAA,EAChD,KAAS,KAAa,KACrB,kBAAC,OAAD;IAAK,WAAW,EAAG,+CAA+C,EAAU,MAAM;cAAlF,CACE,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACpC,KAAc,kBAAC,QAAD,EAAA,UAAO,GAAkB,CAAA,CACpC;MAEJ;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAwC;IAAU,CAAA,EAC/D,kBAAC,KAAD;IAAG,WAAU;cAAoC;IAAU,CAAA,CACvD;KACF"}
1
+ {"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/kadaikodi/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module kadaikodi/components\n *\n * Boff UI 2.0: KPI tiles render on the GlassCard \"metric\" treatment (accent\n * wash + seam border + soft pop-lift, no hover movement). Numbers are\n * tabular-nums; trend deltas use semantic status tokens.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\nimport type { TrendDirection } from '../types';\n\ninterface MetricsCardProps {\n icon: ReactNode;\n value: string | number;\n label: string;\n trend?: TrendDirection;\n trendValue?: string;\n className?: string;\n /** Lead/hero metric → glass treatment with accent glow. */\n featured?: boolean;\n}\n\nconst trendConfig: Record<TrendDirection, { icon: typeof TrendingUp; color: string }> = {\n up: { icon: TrendingUp, color: 'text-status-success-text' },\n down: { icon: TrendingDown, color: 'text-status-error-text' },\n neutral: { icon: Minus, color: 'text-text-secondary' },\n};\n\nexport const MetricsCard: FC<MetricsCardProps> = ({\n icon,\n value,\n label,\n trend,\n trendValue,\n className,\n featured = false,\n}) => {\n const trendInfo = trend ? trendConfig[trend] : null;\n const TrendIcon = trendInfo?.icon;\n\n return (\n <GlassCard\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n className={cn('p-6', className)}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex size-9 items-center justify-center rounded-lg bg-[var(--color-accent-soft)] text-text-primary [&>svg]:h-4 [&>svg]:w-4\">\n {icon}\n </div>\n {trend && trendInfo && TrendIcon && (\n <div\n className={cn(\n 'flex items-center gap-1 text-xs font-medium tabular-nums',\n trendInfo.color\n )}\n >\n <TrendIcon className=\"h-3.5 w-3.5\" />\n {trendValue && <span>{trendValue}</span>}\n </div>\n )}\n </div>\n <div className=\"mt-3\">\n <p className=\"text-2xl font-bold tabular-nums text-text-primary\">{value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{label}</p>\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;AA0BA,IAAM,IAAkF;CACtF,IAAI;EAAE,MAAM;EAAY,OAAO;EAA4B;CAC3D,MAAM;EAAE,MAAM;EAAc,OAAO;EAA0B;CAC7D,SAAS;EAAE,MAAM;EAAO,OAAO;EAAuB;CACvD,EAEY,KAAqC,EAChD,SACA,UACA,UACA,UACA,eACA,cACA,cAAW,SACP;CACJ,IAAM,IAAY,IAAQ,EAAY,KAAS,MACzC,IAAY,GAAW;AAE7B,QACE,kBAAC,GAAD;EACE,WAAW,IAAW,UAAU;EAChC,MAAM;EACN,WAAW,EAAG,OAAO,EAAU;YAHjC,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACZ;IACG,CAAA,EACL,KAAS,KAAa,KACrB,kBAAC,OAAD;IACE,WAAW,EACT,4DACA,EAAU,MACX;cAJH,CAME,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACpC,KAAc,kBAAC,QAAD,EAAA,UAAO,GAAkB,CAAA,CACpC;MAEJ;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAqD;IAAU,CAAA,EAC5E,kBAAC,KAAD;IAAG,WAAU;cAAoC;IAAU,CAAA,CACvD;KACI"}
@@ -1,26 +1,36 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ import { AuroraBackground as r, GradientText as i } from "@burdenoff/fe-libs/ui";
3
4
  //#region src/kadaikodi/components/PageLayout.tsx
4
- var r = ({ title: r, description: i, actions: a, children: o, className: s }) => /* @__PURE__ */ n("div", {
5
- className: e("flex flex-col h-full", s),
6
- children: [/* @__PURE__ */ n("div", {
7
- className: "flex items-center justify-between px-6 py-4 border-b border-border-subtle bg-bg-surface",
8
- children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("h1", {
9
- className: "text-2xl font-semibold text-text-primary",
10
- children: r
11
- }), i && /* @__PURE__ */ t("p", {
12
- className: "mt-1 text-sm text-text-secondary",
13
- children: i
14
- })] }), a && /* @__PURE__ */ t("div", {
15
- className: "flex items-center gap-3",
16
- children: a
5
+ var a = ({ title: a, description: o, actions: s, children: c, className: l }) => {
6
+ let u = typeof a == "string" ? /* @__PURE__ */ t(i, { children: a }) : a;
7
+ return /* @__PURE__ */ n("div", {
8
+ className: e("flex flex-col h-full bg-bg-canvas", l),
9
+ children: [/* @__PURE__ */ n("div", {
10
+ className: "relative overflow-hidden border-b border-border-seam bg-accent-wash",
11
+ children: [/* @__PURE__ */ t(r, { intensity: "subtle" }), /* @__PURE__ */ n("div", {
12
+ className: "relative z-[1] flex flex-col gap-3 px-6 py-5 sm:flex-row sm:items-center sm:justify-between",
13
+ children: [/* @__PURE__ */ n("div", {
14
+ className: "min-w-0",
15
+ children: [/* @__PURE__ */ t("h1", {
16
+ className: "text-2xl font-semibold tracking-tight text-text-primary",
17
+ children: u
18
+ }), o && /* @__PURE__ */ t("p", {
19
+ className: "mt-1 text-sm text-text-secondary",
20
+ children: o
21
+ })]
22
+ }), s && /* @__PURE__ */ t("div", {
23
+ className: "flex flex-wrap items-center gap-3",
24
+ children: s
25
+ })]
26
+ })]
27
+ }), /* @__PURE__ */ t("div", {
28
+ className: "flex-1 overflow-auto p-6",
29
+ children: c
17
30
  })]
18
- }), /* @__PURE__ */ t("div", {
19
- className: "flex-1 overflow-auto p-6",
20
- children: o
21
- })]
22
- });
31
+ });
32
+ };
23
33
  //#endregion
24
- export { r as PageLayout };
34
+ export { a as PageLayout };
25
35
 
26
36
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/kadaikodi/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module kadaikodi/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-subtle bg-bg-surface\">\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;AAgBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAA4C;GAAW,CAAA,EACpE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAAoC;GAAgB,CAAA,CAC7E,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KAGN,kBAAC,OAAD;EAAK,WAAU;EAA4B;EAAe,CAAA,CACtD"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/kadaikodi/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module kadaikodi/components\n *\n * Boff UI 2.0: the page header doubles as the MFE's ONE hero zone — a subtle\n * AuroraBackground drifts behind it (never moves content, static under reduced\n * motion) and a plain-string title is rendered through GradientText so the key\n * heading reads as an on-brand hero. Header surface uses the seam border + a\n * faint accent wash for a quiet glass read.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground, GradientText } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n}) => {\n // Only a plain string title becomes the gradient hero heading; rich ReactNode\n // titles (already-composed headers) are rendered as-is to preserve layout.\n const heading = typeof title === 'string' ? <GradientText>{title}</GradientText> : title;\n\n return (\n <div className={cn('flex flex-col h-full bg-bg-canvas', className)}>\n {/* Hero header — the ONE aurora backdrop for this MFE. */}\n <div className=\"relative overflow-hidden border-b border-border-seam bg-accent-wash\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative z-[1] flex flex-col gap-3 px-6 py-5 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{heading}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-wrap items-center gap-3\">{actions}</div>}\n </div>\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAuBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,mBACI;CAGJ,IAAM,IAAU,OAAO,KAAU,WAAW,kBAAC,GAAD,EAAA,UAAe,GAAqB,CAAA,GAAG;AAEnF,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,qCAAqC,EAAU;YAAlE,CAEE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA,EACvC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA2D;MAAa,CAAA,EACrF,KAAe,kBAAC,KAAD;MAAG,WAAU;gBAAoC;MAAgB,CAAA,CAC7E;QACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAAqC;KAAc,CAAA,CAC1E;MACF;MAGN,kBAAC,OAAD;GAAK,WAAU;GAA4B;GAAe,CAAA,CACtD"}
@@ -11,7 +11,7 @@ var i = ({ value: i, count: a, maxStars: o = 5, size: s = "sm", className: c })
11
11
  className: "flex items-center",
12
12
  children: Array.from({ length: o }, (r, i) => {
13
13
  let a = i < Math.floor(u);
14
- return /* @__PURE__ */ n(t, { className: e(l, a ? "fill-yellow-400 text-yellow-400" : !a && i < u ? "fill-yellow-400/50 text-yellow-400" : "fill-none text-text-secondary/40") }, i);
14
+ return /* @__PURE__ */ n(t, { className: e(l, a ? "fill-status-warning-text text-status-warning-text" : !a && i < u ? "fill-status-warning-text/50 text-status-warning-text" : "fill-none text-text-secondary/40") }, i);
15
15
  })
16
16
  }),
17
17
  /* @__PURE__ */ n("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/kadaikodi/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module kadaikodi/components\n *\n * Star rating display with value and review count.\n */\n\nimport type { FC } from 'react';\nimport { Star } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\ninterface RatingDisplayProps {\n value: number;\n count?: number;\n maxStars?: number;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport const RatingDisplay: FC<RatingDisplayProps> = ({\n value,\n count,\n maxStars = 5,\n size = 'sm',\n className,\n}) => {\n const starSize = size === 'sm' ? 'h-3.5 w-3.5' : 'h-4.5 w-4.5';\n const clampedValue = Math.min(Math.max(value, 0), maxStars);\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n <div className=\"flex items-center\">\n {Array.from({ length: maxStars }, (_, i) => {\n const filled = i < Math.floor(clampedValue);\n const halfFilled = !filled && i < clampedValue;\n\n return (\n <Star\n key={i}\n className={cn(\n starSize,\n filled\n ? 'fill-yellow-400 text-yellow-400'\n : halfFilled\n ? 'fill-yellow-400/50 text-yellow-400'\n : 'fill-none text-text-secondary/40'\n )}\n />\n );\n })}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">{clampedValue.toFixed(1)}</span>\n {count !== undefined && <span className=\"text-xs text-text-secondary\">({count})</span>}\n </div>\n );\n};\n"],"mappings":";;;;AAmBA,IAAa,KAAyC,EACpD,UACA,UACA,cAAW,GACX,UAAO,MACP,mBACI;CACJ,IAAM,IAAW,MAAS,OAAO,gBAAgB,eAC3C,IAAe,KAAK,IAAI,KAAK,IAAI,GAAO,EAAE,EAAE,EAAS;AAE3D,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,2BAA2B,EAAU;YAAxD;GACE,kBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,EAAE,QAAQ,GAAU,GAAG,GAAG,MAAM;KAC1C,IAAM,IAAS,IAAI,KAAK,MAAM,EAAa;AAG3C,YACE,kBAAC,GAAD,EAEE,WAAW,EACT,GACA,IACI,oCARS,CAAC,KAAU,IAAI,IAUtB,uCACA,mCACP,EACD,EATK,EASL;MAEJ;IACE,CAAA;GACN,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAa,QAAQ,EAAE;IAAQ,CAAA;GACvF,MAAU,KAAA,KAAa,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAA8C;KAAE;KAAM;KAAQ;;GAClF"}
1
+ {"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/kadaikodi/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module kadaikodi/components\n *\n * Star rating display with value and review count.\n */\n\nimport type { FC } from 'react';\nimport { Star } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\ninterface RatingDisplayProps {\n value: number;\n count?: number;\n maxStars?: number;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport const RatingDisplay: FC<RatingDisplayProps> = ({\n value,\n count,\n maxStars = 5,\n size = 'sm',\n className,\n}) => {\n const starSize = size === 'sm' ? 'h-3.5 w-3.5' : 'h-4.5 w-4.5';\n const clampedValue = Math.min(Math.max(value, 0), maxStars);\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n <div className=\"flex items-center\">\n {Array.from({ length: maxStars }, (_, i) => {\n const filled = i < Math.floor(clampedValue);\n const halfFilled = !filled && i < clampedValue;\n\n return (\n <Star\n key={i}\n className={cn(\n starSize,\n filled\n ? 'fill-status-warning-text text-status-warning-text'\n : halfFilled\n ? 'fill-status-warning-text/50 text-status-warning-text'\n : 'fill-none text-text-secondary/40'\n )}\n />\n );\n })}\n </div>\n <span className=\"text-xs font-medium text-text-primary\">{clampedValue.toFixed(1)}</span>\n {count !== undefined && <span className=\"text-xs text-text-secondary\">({count})</span>}\n </div>\n );\n};\n"],"mappings":";;;;AAmBA,IAAa,KAAyC,EACpD,UACA,UACA,cAAW,GACX,UAAO,MACP,mBACI;CACJ,IAAM,IAAW,MAAS,OAAO,gBAAgB,eAC3C,IAAe,KAAK,IAAI,KAAK,IAAI,GAAO,EAAE,EAAE,EAAS;AAE3D,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,2BAA2B,EAAU;YAAxD;GACE,kBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,EAAE,QAAQ,GAAU,GAAG,GAAG,MAAM;KAC1C,IAAM,IAAS,IAAI,KAAK,MAAM,EAAa;AAG3C,YACE,kBAAC,GAAD,EAEE,WAAW,EACT,GACA,IACI,sDARS,CAAC,KAAU,IAAI,IAUtB,yDACA,mCACP,EACD,EATK,EASL;MAEJ;IACE,CAAA;GACN,kBAAC,QAAD;IAAM,WAAU;cAAyC,EAAa,QAAQ,EAAE;IAAQ,CAAA;GACvF,MAAU,KAAA,KAAa,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAA8C;KAAE;KAAM;KAAQ;;GAClF"}
@@ -1,14 +1,21 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
- import { jsx as t } from "react/jsx-runtime";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  //#region src/kadaikodi/components/StatusBadge.tsx
4
- var n = {
5
- success: "bg-green-500/20 text-green-600 dark:text-green-400",
6
- warning: "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400",
7
- destructive: "bg-status-error-bg/20 text-status-error-text",
8
- secondary: "bg-secondary text-secondary-foreground",
9
- info: "bg-blue-500/20 text-blue-600 dark:text-blue-400",
10
- outline: "border border-border-subtle text-text-primary"
11
- }, r = {
4
+ var r = {
5
+ success: "bg-status-success-bg-subtle text-status-success-text",
6
+ warning: "bg-status-warning-bg-subtle text-status-warning-text",
7
+ destructive: "bg-status-error-bg-subtle text-status-error-text",
8
+ secondary: "bg-bg-sunken text-text-secondary",
9
+ info: "bg-[var(--color-accent-soft)] text-text-primary",
10
+ outline: "border border-border-seam text-text-primary"
11
+ }, i = new Set([
12
+ "open",
13
+ "active",
14
+ "preparing",
15
+ "out_for_delivery",
16
+ "processing",
17
+ "returning"
18
+ ]), a = {
12
19
  open: "success",
13
20
  closed: "destructive",
14
21
  busy: "warning",
@@ -32,14 +39,20 @@ var n = {
32
39
  processing: "warning",
33
40
  completed: "success"
34
41
  };
35
- function i(e) {
42
+ function o(e) {
36
43
  return e.replace(/_/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
37
44
  }
38
- var a = ({ status: a, className: o }) => /* @__PURE__ */ t("span", {
39
- className: e("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", n[r[a.toLowerCase()] || "secondary"], o),
40
- children: i(a)
41
- });
45
+ var s = ({ status: s, className: c }) => {
46
+ let l = s.toLowerCase(), u = a[l] || "secondary", d = i.has(l);
47
+ return /* @__PURE__ */ n("span", {
48
+ className: e("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium", r[u], c),
49
+ children: [d && /* @__PURE__ */ t("span", {
50
+ "aria-hidden": "true",
51
+ className: "size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse"
52
+ }), o(s)]
53
+ });
54
+ };
42
55
  //#endregion
43
- export { a as StatusBadge };
56
+ export { s as StatusBadge };
44
57
 
45
58
  //# sourceMappingURL=StatusBadge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/kadaikodi/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module kadaikodi/components\n *\n * A colored badge based on status value with semantic color mapping\n * for various order, cart, and investment statuses.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-green-500/20 text-green-600 dark:text-green-400',\n warning: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n destructive: 'bg-status-error-bg/20 text-status-error-text',\n secondary: 'bg-secondary text-secondary-foreground',\n info: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n outline: 'border border-border-subtle text-text-primary',\n};\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Cart statuses\n open: 'success',\n closed: 'destructive',\n busy: 'warning',\n temporarily_closed: 'warning',\n\n // Order statuses\n pending: 'secondary',\n confirmed: 'info',\n preparing: 'warning',\n ready: 'success',\n out_for_delivery: 'info',\n delivered: 'success',\n cancelled: 'destructive',\n refunded: 'outline',\n\n // Investment statuses\n funded: 'success',\n returning: 'info',\n\n // Generic statuses\n active: 'success',\n inactive: 'secondary',\n draft: 'secondary',\n archived: 'outline',\n error: 'destructive',\n failed: 'destructive',\n processing: 'warning',\n completed: 'success',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status.replace(/_/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const variant = statusVariantMap[status.toLowerCase()] || 'secondary';\n\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAkBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAEK,IAAiD;CAErD,MAAM;CACN,QAAQ;CACR,MAAM;CACN,oBAAoB;CAGpB,SAAS;CACT,WAAW;CACX,WAAW;CACX,OAAO;CACP,kBAAkB;CAClB,WAAW;CACX,WAAW;CACX,UAAU;CAGV,QAAQ;CACR,WAAW;CAGX,QAAQ;CACR,UAAU;CACV,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGjF,IAAa,KAAqC,EAAE,WAAQ,mBAIxD,kBAAC,QAAD;CACE,WAAW,EACT,2EACA,EANU,EAAiB,EAAO,aAAa,KAAK,cAOpD,EACD;WAEA,EAAkB,EAAO;CACrB,CAAA"}
1
+ {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/kadaikodi/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module kadaikodi/components\n *\n * A colored badge based on status value with semantic color mapping\n * for various order, cart, and investment statuses.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-[var(--color-accent-soft)] text-text-primary',\n outline: 'border border-border-seam text-text-primary',\n};\n\n// Statuses that represent a \"live\" / in-progress condition get a subtle,\n// opacity-only glow pulse (reduced-motion safe via motion-safe:).\nconst liveStatuses = new Set([\n 'open',\n 'active',\n 'preparing',\n 'out_for_delivery',\n 'processing',\n 'returning',\n]);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Cart statuses\n open: 'success',\n closed: 'destructive',\n busy: 'warning',\n temporarily_closed: 'warning',\n\n // Order statuses\n pending: 'secondary',\n confirmed: 'info',\n preparing: 'warning',\n ready: 'success',\n out_for_delivery: 'info',\n delivered: 'success',\n cancelled: 'destructive',\n refunded: 'outline',\n\n // Investment statuses\n funded: 'success',\n returning: 'info',\n\n // Generic statuses\n active: 'success',\n inactive: 'secondary',\n draft: 'secondary',\n archived: 'outline',\n error: 'destructive',\n failed: 'destructive',\n processing: 'warning',\n completed: 'success',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status.replace(/_/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const key = status.toLowerCase();\n const variant = statusVariantMap[key] || 'secondary';\n const isLive = liveStatuses.has(key);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n {isLive && (\n <span\n aria-hidden=\"true\"\n className=\"size-1.5 rounded-full bg-current motion-safe:animate-vc-glow-pulse\"\n />\n )}\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAkBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAIK,IAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC,EAEI,IAAiD;CAErD,MAAM;CACN,QAAQ;CACR,MAAM;CACN,oBAAoB;CAGpB,SAAS;CACT,WAAW;CACX,WAAW;CACX,OAAO;CACP,kBAAkB;CAClB,WAAW;CACX,WAAW;CACX,UAAU;CAGV,QAAQ;CACR,WAAW;CAGX,QAAQ;CACR,UAAU;CACV,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGjF,IAAa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAM,EAAO,aAAa,EAC1B,IAAU,EAAiB,MAAQ,aACnC,IAAS,EAAa,IAAI,EAAI;AAEpC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;YALH,CAOG,KACC,kBAAC,QAAD;GACE,eAAY;GACZ,WAAU;GACV,CAAA,EAEH,EAAkB,EAAO,CACrB"}