@burdenoff/microfe-hookmovies 2026.615.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 (110) hide show
  1. package/dist/hookmovies/components/EmptyState.js +9 -23
  2. package/dist/hookmovies/components/EmptyState.js.map +1 -1
  3. package/dist/hookmovies/components/InvestmentCard.js +29 -28
  4. package/dist/hookmovies/components/InvestmentCard.js.map +1 -1
  5. package/dist/hookmovies/components/MetricsCard.js +21 -15
  6. package/dist/hookmovies/components/MetricsCard.js.map +1 -1
  7. package/dist/hookmovies/components/PageLayout.js +23 -15
  8. package/dist/hookmovies/components/PageLayout.js.map +1 -1
  9. package/dist/hookmovies/components/RatingDisplay.js +3 -3
  10. package/dist/hookmovies/components/RatingDisplay.js.map +1 -1
  11. package/dist/hookmovies/components/StatusBadge.js +28 -15
  12. package/dist/hookmovies/components/StatusBadge.js.map +1 -1
  13. package/dist/hookmovies/pages/HomePage.js +287 -278
  14. package/dist/hookmovies/pages/HomePage.js.map +1 -1
  15. package/dist/hookmovies/pages/admin/AdminAnalyticsPage.js +87 -87
  16. package/dist/hookmovies/pages/admin/AdminAnalyticsPage.js.map +1 -1
  17. package/dist/hookmovies/pages/admin/AdminDashboard.js +272 -269
  18. package/dist/hookmovies/pages/admin/AdminDashboard.js.map +1 -1
  19. package/dist/hookmovies/pages/admin/AdminFinancialPage.js +48 -48
  20. package/dist/hookmovies/pages/admin/AdminFinancialPage.js.map +1 -1
  21. package/dist/hookmovies/pages/admin/AdminOrdersPage.js +96 -96
  22. package/dist/hookmovies/pages/admin/AdminOrdersPage.js.map +1 -1
  23. package/dist/hookmovies/pages/admin/AdminProfilePage.js +94 -92
  24. package/dist/hookmovies/pages/admin/AdminProfilePage.js.map +1 -1
  25. package/dist/hookmovies/pages/admin/AdminSettingsPage.js +40 -40
  26. package/dist/hookmovies/pages/admin/AdminSettingsPage.js.map +1 -1
  27. package/dist/hookmovies/pages/admin/CartManagementPage.js +104 -104
  28. package/dist/hookmovies/pages/admin/CartManagementPage.js.map +1 -1
  29. package/dist/hookmovies/pages/admin/UserManagementPage.js +99 -99
  30. package/dist/hookmovies/pages/admin/UserManagementPage.js.map +1 -1
  31. package/dist/hookmovies/pages/cart-owner/AnalyticsDashboard.js +117 -117
  32. package/dist/hookmovies/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  33. package/dist/hookmovies/pages/cart-owner/BusinessSettingsPage.js +34 -34
  34. package/dist/hookmovies/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  35. package/dist/hookmovies/pages/cart-owner/CartOwnerDashboard.js +169 -156
  36. package/dist/hookmovies/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  37. package/dist/hookmovies/pages/cart-owner/CartOwnerProfilePage.js +117 -117
  38. package/dist/hookmovies/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  39. package/dist/hookmovies/pages/cart-owner/CartServiceConfigPage.js +89 -89
  40. package/dist/hookmovies/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  41. package/dist/hookmovies/pages/cart-owner/InventoryManagementPage.js +109 -109
  42. package/dist/hookmovies/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  43. package/dist/hookmovies/pages/cart-owner/OrderManagementPage.js +89 -89
  44. package/dist/hookmovies/pages/cart-owner/OrderManagementPage.js.map +1 -1
  45. package/dist/hookmovies/pages/cart-owner/StaffManagementPage.js +97 -97
  46. package/dist/hookmovies/pages/cart-owner/StaffManagementPage.js.map +1 -1
  47. package/dist/hookmovies/pages/common/HelpSupportPage.js +138 -138
  48. package/dist/hookmovies/pages/common/HelpSupportPage.js.map +1 -1
  49. package/dist/hookmovies/pages/common/NotificationCenterPage.js +66 -66
  50. package/dist/hookmovies/pages/common/NotificationCenterPage.js.map +1 -1
  51. package/dist/hookmovies/pages/common/SettingsPage.js +116 -116
  52. package/dist/hookmovies/pages/common/SettingsPage.js.map +1 -1
  53. package/dist/hookmovies/pages/customer/BookingDetailsPage.js +72 -72
  54. package/dist/hookmovies/pages/customer/BookingDetailsPage.js.map +1 -1
  55. package/dist/hookmovies/pages/customer/CartDetailPage.js +89 -89
  56. package/dist/hookmovies/pages/customer/CartDetailPage.js.map +1 -1
  57. package/dist/hookmovies/pages/customer/CartDiscoveryPage.js +66 -66
  58. package/dist/hookmovies/pages/customer/CartDiscoveryPage.js.map +1 -1
  59. package/dist/hookmovies/pages/customer/CheckoutPage.js +80 -80
  60. package/dist/hookmovies/pages/customer/CheckoutPage.js.map +1 -1
  61. package/dist/hookmovies/pages/customer/CustomerDashboard.js +156 -154
  62. package/dist/hookmovies/pages/customer/CustomerDashboard.js.map +1 -1
  63. package/dist/hookmovies/pages/customer/CustomerProfilePage.js +84 -84
  64. package/dist/hookmovies/pages/customer/CustomerProfilePage.js.map +1 -1
  65. package/dist/hookmovies/pages/customer/DirectServiceBookingPage.js +91 -91
  66. package/dist/hookmovies/pages/customer/DirectServiceBookingPage.js.map +1 -1
  67. package/dist/hookmovies/pages/customer/FavoritesPage.js +33 -33
  68. package/dist/hookmovies/pages/customer/FavoritesPage.js.map +1 -1
  69. package/dist/hookmovies/pages/customer/OrderHistoryPage.js +43 -43
  70. package/dist/hookmovies/pages/customer/OrderHistoryPage.js.map +1 -1
  71. package/dist/hookmovies/pages/customer/OrderTrackingPage.js +60 -60
  72. package/dist/hookmovies/pages/customer/OrderTrackingPage.js.map +1 -1
  73. package/dist/hookmovies/pages/customer/PaymentMethodsPage.js +58 -58
  74. package/dist/hookmovies/pages/customer/PaymentMethodsPage.js.map +1 -1
  75. package/dist/hookmovies/pages/customer/ReviewsPage.js +48 -48
  76. package/dist/hookmovies/pages/customer/ReviewsPage.js.map +1 -1
  77. package/dist/hookmovies/pages/customer/SavedAddressesPage.js +46 -46
  78. package/dist/hookmovies/pages/customer/SavedAddressesPage.js.map +1 -1
  79. package/dist/hookmovies/pages/investor/InvestmentDetailsPage.js +129 -129
  80. package/dist/hookmovies/pages/investor/InvestmentDetailsPage.js.map +1 -1
  81. package/dist/hookmovies/pages/investor/InvestmentOpportunitiesPage.js +88 -88
  82. package/dist/hookmovies/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  83. package/dist/hookmovies/pages/investor/InvestorAnalyticsPage.js +88 -88
  84. package/dist/hookmovies/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  85. package/dist/hookmovies/pages/investor/InvestorDashboard.js +189 -181
  86. package/dist/hookmovies/pages/investor/InvestorDashboard.js.map +1 -1
  87. package/dist/hookmovies/pages/investor/InvestorInvestmentsPage.js +38 -38
  88. package/dist/hookmovies/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  89. package/dist/hookmovies/pages/investor/InvestorPortfolioPage.js +66 -66
  90. package/dist/hookmovies/pages/investor/InvestorPortfolioPage.js.map +1 -1
  91. package/dist/hookmovies/pages/investor/InvestorProfilePage.js +154 -154
  92. package/dist/hookmovies/pages/investor/InvestorProfilePage.js.map +1 -1
  93. package/dist/hookmovies/pages/worker/TaskDetailsPage.js +79 -79
  94. package/dist/hookmovies/pages/worker/TaskDetailsPage.js.map +1 -1
  95. package/dist/hookmovies/pages/worker/WorkerDashboard.js +172 -164
  96. package/dist/hookmovies/pages/worker/WorkerDashboard.js.map +1 -1
  97. package/dist/hookmovies/pages/worker/WorkerOrdersPage.js +72 -72
  98. package/dist/hookmovies/pages/worker/WorkerOrdersPage.js.map +1 -1
  99. package/dist/hookmovies/pages/worker/WorkerProfilePage.js +108 -108
  100. package/dist/hookmovies/pages/worker/WorkerProfilePage.js.map +1 -1
  101. package/dist/hookmovies/pages/worker/WorkerSchedulePage.js +69 -69
  102. package/dist/hookmovies/pages/worker/WorkerSchedulePage.js.map +1 -1
  103. package/dist/hookmovies/utils/cn.js +2 -2
  104. package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
  105. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  106. package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
  107. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  108. package/package.json +3 -3
  109. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
  110. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
@@ -1,28 +1,14 @@
1
- import { cn as e } from "../utils/cn.js";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import { IllustratedEmptyState as t } from "@burdenoff/fe-libs/ui";
3
3
  //#region src/hookmovies/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-muted-foreground opacity-50",
9
- children: r
10
- }),
11
- /* @__PURE__ */ t("h3", {
12
- className: "text-lg font-medium text-foreground",
13
- children: i
14
- }),
15
- a && /* @__PURE__ */ t("p", {
16
- className: "mt-2 text-sm text-muted-foreground max-w-sm",
17
- children: a
18
- }),
19
- o && /* @__PURE__ */ t("div", {
20
- className: "mt-6",
21
- children: o
22
- })
23
- ]
4
+ var n = ({ title: n, description: r, action: i, illustration: a = "empty-data", className: o }) => /* @__PURE__ */ e(t, {
5
+ illustration: a,
6
+ title: n,
7
+ description: r,
8
+ action: i,
9
+ className: o
24
10
  });
25
11
  //#endregion
26
- export { r as EmptyState };
12
+ export { n as EmptyState };
27
13
 
28
14
  //# sourceMappingURL=EmptyState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/hookmovies/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module hookmovies/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-muted-foreground opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-foreground\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-muted-foreground 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;aAAyC;GAAW,CAAA;EAC5E,kBAAC,MAAD;GAAI,WAAU;aAAuC;GAAW,CAAA;EAC/D,KAAe,kBAAC,KAAD;GAAG,WAAU;aAA+C;GAAgB,CAAA;EAC3F,KAAU,kBAAC,OAAD;GAAK,WAAU;aAAQ;GAAa,CAAA;EAC3C"}
1
+ {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/hookmovies/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module hookmovies/components\n *\n * Thin wrapper over the fe-libs IllustratedEmptyState so every zero/empty\n * surface in the MFE gets an on-brand illustration. The legacy `icon` prop is\n * still accepted for source compatibility but the illustration takes priority.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\n\ninterface EmptyStateProps {\n /** Legacy decorative icon — superseded by the illustration; kept for compatibility. */\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n /**\n * Illustration name served by the host shell at /illustrations/<name>.webp.\n * Defaults to the generic \"empty-data\" asset.\n */\n illustration?: string;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n title,\n description,\n action,\n illustration = 'empty-data',\n className,\n}) => {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={className}\n />\n );\n};\n"],"mappings":";;;AA0BA,IAAa,KAAmC,EAC9C,UACA,gBACA,WACA,kBAAe,cACf,mBAGE,kBAAC,GAAD;CACgB;CACP;CACM;CACL;CACG;CACX,CAAA"}
@@ -2,44 +2,45 @@ 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/hookmovies/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, {
29
30
  role: "button",
30
31
  tabIndex: 0,
31
- onClick: () => m?.(n),
32
+ onClick: () => h?.(n),
32
33
  onKeyDown: (e) => {
33
- (e.key === "Enter" || e.key === " ") && (e.preventDefault(), m?.(n));
34
+ (e.key === "Enter" || e.key === " ") && (e.preventDefault(), h?.(n));
34
35
  },
35
- className: e("rounded-lg border border-border bg-card 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-ring", h),
36
+ className: e("border-border-seam p-4 cursor-pointer", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", g),
36
37
  children: [
37
38
  /* @__PURE__ */ o("div", {
38
39
  className: "flex items-start justify-between",
39
40
  children: [/* @__PURE__ */ a("h3", {
40
- className: "text-base font-semibold text-foreground truncate",
41
+ className: "text-base font-semibold text-text-primary truncate",
41
42
  children: r
42
- }), /* @__PURE__ */ a(t, { status: p })]
43
+ }), /* @__PURE__ */ a(t, { status: m })]
43
44
  }),
44
45
  /* @__PURE__ */ o("div", {
45
46
  className: "mt-4",
@@ -47,23 +48,23 @@ var s = {
47
48
  /* @__PURE__ */ o("div", {
48
49
  className: "flex items-center justify-between text-sm",
49
50
  children: [/* @__PURE__ */ a("span", {
50
- className: "text-muted-foreground",
51
+ className: "text-text-secondary",
51
52
  children: "Raised"
52
53
  }), /* @__PURE__ */ o("span", {
53
- className: "font-medium text-foreground",
54
- children: [Math.round(g), "%"]
54
+ className: "font-medium text-text-primary tabular-nums",
55
+ children: [Math.round(_), "%"]
55
56
  })]
56
57
  }),
57
58
  /* @__PURE__ */ a("div", {
58
- className: "mt-1.5 h-2 w-full rounded-full bg-muted overflow-hidden",
59
+ className: "mt-1.5 h-2 w-full rounded-full bg-bg-sunken overflow-hidden",
59
60
  children: /* @__PURE__ */ a("div", {
60
- className: "h-full rounded-full bg-primary transition-all duration-300",
61
- style: { width: `${g}%` }
61
+ className: "h-full rounded-full bg-action-primary-bg shadow-[var(--shadow-glow)] transition-all duration-300",
62
+ style: { width: `${_}%` }
62
63
  })
63
64
  }),
64
65
  /* @__PURE__ */ o("div", {
65
- className: "mt-1.5 flex items-center justify-between text-xs text-muted-foreground",
66
- children: [/* @__PURE__ */ a("span", { children: y(l) }), /* @__PURE__ */ a("span", { children: y(c) })]
66
+ className: "mt-1.5 flex items-center justify-between text-xs text-text-secondary tabular-nums",
67
+ children: [/* @__PURE__ */ a("span", { children: b(u) }), /* @__PURE__ */ a("span", { children: b(l) })]
67
68
  })
68
69
  ]
69
70
  }),
@@ -72,25 +73,25 @@ var s = {
72
73
  children: [/* @__PURE__ */ o("div", {
73
74
  className: "flex items-center gap-1.5 text-sm",
74
75
  children: [
75
- /* @__PURE__ */ a(i, { className: "h-3.5 w-3.5 text-green-600 dark:text-green-400" }),
76
+ /* @__PURE__ */ a(i, { className: "h-3.5 w-3.5 text-status-success-text" }),
76
77
  /* @__PURE__ */ a("span", {
77
- className: "font-medium text-foreground",
78
- children: d
78
+ className: "font-medium text-text-primary tabular-nums",
79
+ children: f
79
80
  }),
80
81
  /* @__PURE__ */ a("span", {
81
- className: "text-muted-foreground",
82
+ className: "text-text-secondary",
82
83
  children: "returns"
83
84
  })
84
85
  ]
85
86
  }), /* @__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 })]
87
+ className: e("flex items-center gap-1 text-xs font-medium", v.color),
88
+ children: [/* @__PURE__ */ a(y, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ a("span", { children: v.label })]
88
89
  })]
89
90
  })
90
91
  ]
91
92
  });
92
93
  };
93
94
  //#endregion
94
- export { c as InvestmentCard };
95
+ export { l as InvestmentCard };
95
96
 
96
97
  //# sourceMappingURL=InvestmentCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvestmentCard.js","names":[],"sources":["../../../src/hookmovies/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module hookmovies/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 bg-card 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-ring',\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between\">\n <h3 className=\"text-base font-semibold text-foreground 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-muted-foreground\">Raised</span>\n <span className=\"font-medium text-foreground\">{Math.round(progress)}%</span>\n </div>\n <div className=\"mt-1.5 h-2 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-primary 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-muted-foreground\">\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-foreground\">{expectedReturns}</span>\n <span className=\"text-muted-foreground\">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,2EACA,oEACA,2EACA,EACD;YAfH;GAkBE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAoD;KAAc,CAAA,EAChF,kBAAC,GAAD,EAAqB,WAAU,CAAA,CAC3B;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAwB;OAAa,CAAA,EACrD,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CAA+C,KAAK,MAAM,EAAS,EAAC,IAAQ;SACxE;;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;iBAA+B;OAAuB,CAAA;MACtE,kBAAC,QAAD;OAAM,WAAU;iBAAwB;OAAc,CAAA;MAClD;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/hookmovies/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module hookmovies/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 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 'border-border-seam p-4 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 tabular-nums\">\n {Math.round(progress)}%\n </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 tabular-nums\">\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 text-text-primary tabular-nums\">{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,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;YAdH;GAiBE,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,CACG,KAAK,MAAM,EAAS,EAAC,IACjB;SACH;;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,46 +1,52 @@
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/hookmovies/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
- color: "text-muted-foreground"
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 bg-card p-6 shadow-sm", l),
19
+ }, c = ({ icon: t, value: n, label: r, trend: c, trendValue: l, featured: u = !1, className: d }) => {
20
+ let f = c ? s[c] : null, p = f?.icon;
21
+ return /* @__PURE__ */ a(o, {
22
+ treatment: u ? "glass" : "metric",
23
+ glow: u,
24
+ className: e("border-border-seam p-6", d),
22
25
  children: [/* @__PURE__ */ a("div", {
23
26
  className: "flex items-center justify-between",
24
27
  children: [/* @__PURE__ */ i("div", {
25
- className: "text-muted-foreground",
28
+ className: "text-text-secondary",
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", f.color),
32
+ children: [/* @__PURE__ */ i(p, { className: "h-3.5 w-3.5" }), l && /* @__PURE__ */ i("span", {
33
+ className: "tabular-nums",
34
+ children: l
35
+ })]
30
36
  })]
31
37
  }), /* @__PURE__ */ a("div", {
32
38
  className: "mt-3",
33
39
  children: [/* @__PURE__ */ i("p", {
34
- className: "text-2xl font-bold text-foreground",
40
+ className: "text-2xl font-bold text-text-primary tabular-nums",
35
41
  children: n
36
42
  }), /* @__PURE__ */ i("p", {
37
- className: "mt-1 text-sm text-muted-foreground",
43
+ className: "mt-1 text-sm text-text-secondary",
38
44
  children: r
39
45
  })]
40
46
  })]
41
47
  });
42
48
  };
43
49
  //#endregion
44
- export { s as MetricsCard };
50
+ export { c as MetricsCard };
45
51
 
46
52
  //# sourceMappingURL=MetricsCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/hookmovies/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module hookmovies/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-muted-foreground' },\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 bg-card p-6 shadow-sm', className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-muted-foreground\">{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-foreground\">{value}</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">{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;EAAyB;CACzD,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,yDAAyD,EAAU;YAAtF,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAyB;IAAW,CAAA,EAClD,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;cAAsC;IAAU,CAAA,EAC7D,kBAAC,KAAD;IAAG,WAAU;cAAsC;IAAU,CAAA,CACzD;KACF"}
1
+ {"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/hookmovies/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module hookmovies/components\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 /** Render as the single featured hero metric (glass treatment + glow). */\n featured?: boolean;\n className?: string;\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 featured = false,\n className,\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('border-border-seam p-6', className)}\n >\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 className=\"tabular-nums\">{trendValue}</span>}\n </div>\n )}\n </div>\n <div className=\"mt-3\">\n <p className=\"text-2xl font-bold text-text-primary tabular-nums\">{value}</p>\n <p className=\"mt-1 text-sm text-text-secondary\">{label}</p>\n </div>\n </GlassCard>\n );\n};\n"],"mappings":";;;;;AAsBA,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,cAAW,IACX,mBACI;CACJ,IAAM,IAAY,IAAQ,EAAY,KAAS,MACzC,IAAY,GAAW;AAE7B,QACE,kBAAC,GAAD;EACE,WAAW,IAAW,UAAU;EAChC,MAAM;EACN,WAAW,EAAG,0BAA0B,EAAU;YAHpD,CAKE,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;KAAM,WAAU;eAAgB;KAAkB,CAAA,CAC7D;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,34 @@
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 } from "@burdenoff/fe-libs/ui";
3
4
  //#region src/hookmovies/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),
5
+ var i = ({ title: i, description: a, actions: o, children: s, className: c, hero: l = !1 }) => /* @__PURE__ */ n("div", {
6
+ className: e("flex flex-col h-full", c),
6
7
  children: [/* @__PURE__ */ n("div", {
7
- className: "flex items-center justify-between px-6 py-4 border-b border-border bg-card",
8
- children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("h1", {
9
- className: "text-2xl font-semibold text-foreground",
10
- children: r
11
- }), i && /* @__PURE__ */ t("p", {
12
- className: "mt-1 text-sm text-muted-foreground",
13
- children: i
14
- })] }), a && /* @__PURE__ */ t("div", {
15
- className: "flex items-center gap-3",
16
- children: a
17
- })]
8
+ className: e("relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam", l ? "bg-hero-mesh" : "bg-bg-surface"),
9
+ children: [
10
+ l && /* @__PURE__ */ t(r, { intensity: "subtle" }),
11
+ /* @__PURE__ */ n("div", {
12
+ className: "min-w-0",
13
+ children: [/* @__PURE__ */ t("h1", {
14
+ className: "text-2xl font-semibold tracking-tight text-text-primary",
15
+ children: i
16
+ }), a && /* @__PURE__ */ t("p", {
17
+ className: "mt-1 text-sm text-text-secondary",
18
+ children: a
19
+ })]
20
+ }),
21
+ o && /* @__PURE__ */ t("div", {
22
+ className: "flex items-center gap-3 shrink-0",
23
+ children: o
24
+ })
25
+ ]
18
26
  }), /* @__PURE__ */ t("div", {
19
27
  className: "flex-1 overflow-auto p-6",
20
- children: o
28
+ children: s
21
29
  })]
22
30
  });
23
31
  //#endregion
24
- export { r as PageLayout };
32
+ export { i as PageLayout };
25
33
 
26
34
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/hookmovies/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module hookmovies/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 bg-card\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{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;aAA0C;GAAW,CAAA,EAClE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAAsC;GAAgB,CAAA,CAC/E,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/hookmovies/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module hookmovies/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } 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 * Render a subtle aurora backdrop behind the page header. Use on the MFE's\n * primary landing/hero page only (one aurora per surface).\n */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative overflow-hidden flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight 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 shrink-0\">{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":";;;;AAsBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EACE,WAAW,EACT,0GACA,IAAO,iBAAiB,gBACzB;YAJH;GAMG,KAAQ,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;GAChD,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA2D;KAAW,CAAA,EACnF,KAAe,kBAAC,KAAD;KAAG,WAAU;eAAoC;KAAgB,CAAA,CAC7E;;GACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAoC;IAAc,CAAA;GACzE;KAGN,kBAAC,OAAD;EAAK,WAAU;EAA4B;EAAe,CAAA,CACtD"}
@@ -11,15 +11,15 @@ 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-muted-foreground/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", {
18
- className: "text-xs font-medium text-foreground",
18
+ className: "text-xs font-medium text-text-primary",
19
19
  children: u.toFixed(1)
20
20
  }),
21
21
  a !== void 0 && /* @__PURE__ */ r("span", {
22
- className: "text-xs text-muted-foreground",
22
+ className: "text-xs text-text-secondary",
23
23
  children: [
24
24
  "(",
25
25
  a,
@@ -1 +1 @@
1
- {"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/hookmovies/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module hookmovies/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-muted-foreground/40'\n )}\n />\n );\n })}\n </div>\n <span className=\"text-xs font-medium text-foreground\">{clampedValue.toFixed(1)}</span>\n {count !== undefined && <span className=\"text-xs text-muted-foreground\">({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,qCACP,EACD,EATK,EASL;MAEJ;IACE,CAAA;GACN,kBAAC,QAAD;IAAM,WAAU;cAAuC,EAAa,QAAQ,EAAE;IAAQ,CAAA;GACrF,MAAU,KAAA,KAAa,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAAgD;KAAE;KAAM;KAAQ;;GACpF"}
1
+ {"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/hookmovies/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module hookmovies/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,14 @@
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/hookmovies/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-destructive/20 text-destructive",
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 text-foreground"
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-status-info-bg-subtle text-status-info-text",
10
+ outline: "border border-border-seam text-text-primary"
11
+ }, i = new Set(["success", "info"]), a = {
12
12
  open: "success",
13
13
  closed: "destructive",
14
14
  busy: "warning",
@@ -31,15 +31,28 @@ var n = {
31
31
  failed: "destructive",
32
32
  processing: "warning",
33
33
  completed: "success"
34
+ }, o = {
35
+ success: "bg-status-success-text",
36
+ warning: "bg-status-warning-text",
37
+ destructive: "bg-status-error-text",
38
+ secondary: "bg-text-muted",
39
+ info: "bg-status-info-text",
40
+ outline: "bg-text-muted"
34
41
  };
35
- function i(e) {
42
+ function s(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 c = ({ status: c, className: l }) => {
46
+ let u = a[c.toLowerCase()] || "secondary", d = i.has(u);
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], l),
49
+ children: [/* @__PURE__ */ t("span", {
50
+ className: e("size-1.5 rounded-full", o[u], d && "motion-safe:animate-vc-glow-pulse"),
51
+ "aria-hidden": "true"
52
+ }), s(c)]
53
+ });
54
+ };
42
55
  //#endregion
43
- export { a as StatusBadge };
56
+ export { c as StatusBadge };
44
57
 
45
58
  //# sourceMappingURL=StatusBadge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/hookmovies/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module hookmovies/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-destructive/20 text-destructive',\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 text-foreground',\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/hookmovies/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module hookmovies/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-status-info-bg-subtle text-status-info-text',\n outline: 'border border-border-seam text-text-primary',\n};\n\n/** Statuses that represent a live/active state get an opacity-only glow pulse on their dot. */\nconst liveVariants: ReadonlySet<BadgeVariant> = new Set<BadgeVariant>(['success', 'info']);\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\nconst dotColor: Record<BadgeVariant, string> = {\n success: 'bg-status-success-text',\n warning: 'bg-status-warning-text',\n destructive: 'bg-status-error-text',\n secondary: 'bg-text-muted',\n info: 'bg-status-info-text',\n outline: 'bg-text-muted',\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 const isLive = liveVariants.has(variant);\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 <span\n className={cn(\n 'size-1.5 rounded-full',\n dotColor[variant],\n isLive && 'motion-safe:animate-vc-glow-pulse'\n )}\n aria-hidden=\"true\"\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,EAGK,IAA0C,IAAI,IAAkB,CAAC,WAAW,OAAO,CAAC,EAEpF,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,EAEK,IAAyC;CAC7C,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV;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,IAAU,EAAiB,EAAO,aAAa,KAAK,aACpD,IAAS,EAAa,IAAI,EAAQ;AAExC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;YALH,CAOE,kBAAC,QAAD;GACE,WAAW,EACT,yBACA,EAAS,IACT,KAAU,oCACX;GACD,eAAY;GACZ,CAAA,EACD,EAAkB,EAAO,CACrB"}