@burdenoff/microfe-adaptercloud 2026.624.1 → 2026.625.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adaptercloud/components/EmptyState.js +17 -21
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +25 -23
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +18 -12
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +45 -19
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +36 -16
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +244 -231
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +121 -113
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +102 -76
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +70 -65
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +108 -103
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +61 -59
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +119 -105
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +165 -160
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +174 -169
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +103 -97
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +186 -172
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +109 -81
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +111 -109
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +127 -124
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +310 -316
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +251 -257
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +142 -148
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +287 -283
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +120 -114
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +83 -80
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +120 -117
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +231 -226
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +97 -95
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +418 -389
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +134 -132
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +108 -102
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +62 -59
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +117 -111
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +71 -68
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +97 -81
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +83 -80
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +82 -66
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +93 -91
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +100 -97
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +83 -81
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +344 -311
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +43 -40
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +59 -57
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +394 -392
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +354 -324
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +122 -97
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +107 -104
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +109 -107
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +94 -90
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,28 +1,24 @@
|
|
|
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 { IllustratedEmptyState as r } from "@burdenoff/fe-libs/ui";
|
|
3
4
|
//#region src/adaptercloud/components/EmptyState.tsx
|
|
4
|
-
var
|
|
5
|
-
className: e("
|
|
6
|
-
children:
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
o && /* @__PURE__ */ t("div", {
|
|
20
|
-
className: "mt-6",
|
|
21
|
-
children: o
|
|
22
|
-
})
|
|
23
|
-
]
|
|
5
|
+
var i = ({ icon: i, title: a, description: o, action: s, className: c, illustration: l = "empty-data" }) => /* @__PURE__ */ t("div", {
|
|
6
|
+
className: e("py-8", c),
|
|
7
|
+
children: /* @__PURE__ */ t(r, {
|
|
8
|
+
illustration: l,
|
|
9
|
+
title: a,
|
|
10
|
+
description: i || o ? /* @__PURE__ */ n("span", {
|
|
11
|
+
className: "flex flex-col items-center gap-3",
|
|
12
|
+
children: [i && /* @__PURE__ */ t("span", {
|
|
13
|
+
className: "text-text-secondary opacity-70",
|
|
14
|
+
children: i
|
|
15
|
+
}), o && /* @__PURE__ */ t("span", { children: o })]
|
|
16
|
+
}) : void 0,
|
|
17
|
+
action: s,
|
|
18
|
+
alt: a
|
|
19
|
+
})
|
|
24
20
|
});
|
|
25
21
|
//#endregion
|
|
26
|
-
export {
|
|
22
|
+
export { i as EmptyState };
|
|
27
23
|
|
|
28
24
|
//# sourceMappingURL=EmptyState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/adaptercloud/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module adaptercloud/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
|
|
1
|
+
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/adaptercloud/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module adaptercloud/components\n *\n * Boff UI 2.0: renders an on-brand illustrated empty state. When an explicit\n * `icon` is supplied (legacy callers) it is kept as a calm glyph above the\n * copy; otherwise an illustration (default: empty-data) is used.\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 /** Host-served illustration name (e.g. \"empty-search\", \"empty-people\"). */\n illustration?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n title,\n description,\n action,\n className,\n illustration = 'empty-data',\n}) => {\n return (\n <div className={cn('py-8', className)}>\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={\n icon || description ? (\n <span className=\"flex flex-col items-center gap-3\">\n {icon && <span className=\"text-text-secondary opacity-70\">{icon}</span>}\n {description && <span>{description}</span>}\n </span>\n ) : undefined\n }\n action={action}\n alt={title}\n />\n </div>\n );\n};\n"],"mappings":";;;;AAuBA,IAAa,KAAmC,EAC9C,SACA,UACA,gBACA,WACA,cACA,kBAAe,mBAGb,kBAAC,OAAD;CAAK,WAAW,EAAG,QAAQ,EAAU;WACnC,kBAAC,GAAD;EACgB;EACP;EACP,aACE,KAAQ,IACN,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACG,KAAQ,kBAAC,QAAD;IAAM,WAAU;cAAkC;IAAY,CAAA,EACtE,KAAe,kBAAC,QAAD,EAAA,UAAO,GAAmB,CAAA,CACrC;OACL,KAAA;EAEE;EACR,KAAK;EACL,CAAA;CACE,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/adaptercloud/components/InvestmentCard.tsx
|
|
6
|
-
var
|
|
7
|
+
var c = {
|
|
7
8
|
low: {
|
|
8
9
|
label: "Low Risk",
|
|
9
10
|
icon: r,
|
|
10
|
-
color: "text-
|
|
11
|
+
color: "text-status-success-text"
|
|
11
12
|
},
|
|
12
13
|
medium: {
|
|
13
14
|
label: "Medium Risk",
|
|
14
15
|
icon: n,
|
|
15
|
-
color: "text-
|
|
16
|
+
color: "text-status-warning-text"
|
|
16
17
|
},
|
|
17
18
|
high: {
|
|
18
19
|
label: "High Risk",
|
|
19
20
|
icon: n,
|
|
20
|
-
color: "text-
|
|
21
|
+
color: "text-status-error-text"
|
|
21
22
|
}
|
|
22
|
-
},
|
|
23
|
-
let
|
|
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:
|
|
26
|
+
currency: d,
|
|
26
27
|
maximumFractionDigits: 0
|
|
27
28
|
}).format(e);
|
|
28
|
-
return /* @__PURE__ */ o(
|
|
29
|
+
return /* @__PURE__ */ o(s, {
|
|
29
30
|
role: "button",
|
|
30
31
|
tabIndex: 0,
|
|
31
|
-
|
|
32
|
+
"aria-label": `Investment in ${r}`,
|
|
33
|
+
onClick: () => h?.(n),
|
|
32
34
|
onKeyDown: (e) => {
|
|
33
|
-
(e.key === "Enter" || e.key === " ") && (e.preventDefault(),
|
|
35
|
+
(e.key === "Enter" || e.key === " ") && (e.preventDefault(), h?.(n));
|
|
34
36
|
},
|
|
35
|
-
className: e("
|
|
37
|
+
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
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:
|
|
44
|
+
}), /* @__PURE__ */ a(t, { status: m })]
|
|
43
45
|
}),
|
|
44
46
|
/* @__PURE__ */ o("div", {
|
|
45
47
|
className: "mt-4",
|
|
@@ -50,20 +52,20 @@ var s = {
|
|
|
50
52
|
className: "text-text-secondary",
|
|
51
53
|
children: "Raised"
|
|
52
54
|
}), /* @__PURE__ */ o("span", {
|
|
53
|
-
className: "font-medium text-text-primary",
|
|
54
|
-
children: [Math.round(
|
|
55
|
+
className: "font-medium text-text-primary tabular-nums",
|
|
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
62
|
className: "h-full rounded-full bg-action-primary-bg transition-all duration-300",
|
|
61
|
-
style: { width: `${
|
|
63
|
+
style: { width: `${_}%` }
|
|
62
64
|
})
|
|
63
65
|
}),
|
|
64
66
|
/* @__PURE__ */ o("div", {
|
|
65
|
-
className: "mt-1.5 flex items-center justify-between text-xs text-text-secondary",
|
|
66
|
-
children: [/* @__PURE__ */ a("span", { children:
|
|
67
|
+
className: "mt-1.5 flex items-center justify-between text-xs text-text-secondary tabular-nums",
|
|
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-
|
|
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:
|
|
79
|
+
className: "font-medium text-text-primary tabular-nums",
|
|
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",
|
|
87
|
-
children: [/* @__PURE__ */ a(
|
|
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 {
|
|
96
|
+
export { l as InvestmentCard };
|
|
95
97
|
|
|
96
98
|
//# sourceMappingURL=InvestmentCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvestmentCard.js","names":[],"sources":["../../../src/adaptercloud/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module adaptercloud/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-
|
|
1
|
+
{"version":3,"file":"InvestmentCard.js","names":[],"sources":["../../../src/adaptercloud/components/InvestmentCard.tsx"],"sourcesContent":["/**\n * Investment Card Component\n * @module adaptercloud/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 aria-label={`Investment in ${cartName}`}\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\">{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 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,cAAY,iBAAiB;EAC7B,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,CAA8D,KAAK,MAAM,EAAS,EAAC,IAAQ;SACvF;;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,43 @@
|
|
|
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/adaptercloud/components/MetricsCard.tsx
|
|
5
|
-
var
|
|
6
|
+
var s = {
|
|
6
7
|
up: {
|
|
7
8
|
icon: r,
|
|
8
|
-
color: "text-
|
|
9
|
+
color: "text-status-success-text"
|
|
9
10
|
},
|
|
10
11
|
down: {
|
|
11
12
|
icon: n,
|
|
12
|
-
color: "text-
|
|
13
|
+
color: "text-status-error-text"
|
|
13
14
|
},
|
|
14
15
|
neutral: {
|
|
15
16
|
icon: t,
|
|
16
17
|
color: "text-text-secondary"
|
|
17
18
|
}
|
|
18
|
-
},
|
|
19
|
-
let
|
|
20
|
-
return /* @__PURE__ */ a(
|
|
21
|
-
|
|
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
28
|
className: "text-text-secondary",
|
|
26
29
|
children: t
|
|
27
|
-
}),
|
|
28
|
-
className: e("flex items-center gap-1 text-xs font-medium",
|
|
29
|
-
children: [/* @__PURE__ */ i(
|
|
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-text-primary",
|
|
40
|
+
className: "text-2xl font-bold text-text-primary tabular-nums",
|
|
35
41
|
children: n
|
|
36
42
|
}), /* @__PURE__ */ i("p", {
|
|
37
43
|
className: "mt-1 text-sm text-text-secondary",
|
|
@@ -41,6 +47,6 @@ var o = {
|
|
|
41
47
|
});
|
|
42
48
|
};
|
|
43
49
|
//#endregion
|
|
44
|
-
export {
|
|
50
|
+
export { c as MetricsCard };
|
|
45
51
|
|
|
46
52
|
//# sourceMappingURL=MetricsCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/adaptercloud/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module adaptercloud/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-
|
|
1
|
+
{"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/adaptercloud/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module adaptercloud/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 className?: string;\n /** Renders the featured hero metric (glass treatment + 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=\"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,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;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,52 @@
|
|
|
1
1
|
import { cn as e } from "../utils/cn.js";
|
|
2
|
-
import {
|
|
2
|
+
import { Fragment as t, jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
import { AuroraBackground as i, GradientText as a, PagePurpose as o } from "@burdenoff/fe-libs/ui";
|
|
3
4
|
//#region src/adaptercloud/components/PageLayout.tsx
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
5
|
+
function s(e) {
|
|
6
|
+
if (typeof e != "string") return e;
|
|
7
|
+
let i = e.trim(), o = i.lastIndexOf(" ");
|
|
8
|
+
return o === -1 ? /* @__PURE__ */ n(a, {
|
|
9
|
+
as: "span",
|
|
10
|
+
children: i
|
|
11
|
+
}) : /* @__PURE__ */ r(t, { children: [i.slice(0, o + 1), /* @__PURE__ */ n(a, {
|
|
12
|
+
as: "span",
|
|
13
|
+
children: i.slice(o + 1)
|
|
14
|
+
})] });
|
|
15
|
+
}
|
|
16
|
+
var c = ({ title: t, description: a, actions: c, children: l, className: u, purpose: d, hero: f = !1 }) => /* @__PURE__ */ r("div", {
|
|
17
|
+
className: e("flex flex-col h-full", u),
|
|
18
|
+
children: [/* @__PURE__ */ r("div", {
|
|
19
|
+
className: e("relative overflow-hidden flex flex-col gap-3 px-4 py-4 sm:flex-row sm:items-center sm:justify-between sm:px-6", "border-b border-border-seam", f ? "bg-hero-mesh" : "bg-gloss-card"),
|
|
20
|
+
children: [
|
|
21
|
+
f && /* @__PURE__ */ n(i, { intensity: "subtle" }),
|
|
22
|
+
/* @__PURE__ */ r("div", {
|
|
23
|
+
className: "min-w-0",
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ n("h1", {
|
|
26
|
+
className: "text-2xl font-semibold text-text-primary tracking-tight",
|
|
27
|
+
children: s(t)
|
|
28
|
+
}),
|
|
29
|
+
a && /* @__PURE__ */ n("p", {
|
|
30
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
31
|
+
children: a
|
|
32
|
+
}),
|
|
33
|
+
d && /* @__PURE__ */ n(o, {
|
|
34
|
+
className: "mt-2 max-w-2xl",
|
|
35
|
+
children: d
|
|
36
|
+
})
|
|
37
|
+
]
|
|
38
|
+
}),
|
|
39
|
+
c && /* @__PURE__ */ n("div", {
|
|
40
|
+
className: "flex flex-wrap items-center gap-2 sm:gap-3 sm:justify-end",
|
|
41
|
+
children: c
|
|
42
|
+
})
|
|
43
|
+
]
|
|
44
|
+
}), /* @__PURE__ */ n("div", {
|
|
45
|
+
className: "flex-1 overflow-auto p-4 sm:p-6",
|
|
46
|
+
children: l
|
|
21
47
|
})]
|
|
22
48
|
});
|
|
23
49
|
//#endregion
|
|
24
|
-
export {
|
|
50
|
+
export { c as PageLayout };
|
|
25
51
|
|
|
26
52
|
//# sourceMappingURL=PageLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/adaptercloud/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module adaptercloud/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
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/adaptercloud/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module adaptercloud/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground, GradientText, PagePurpose } 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 * Plain-language \"story\" for the page — WHAT it is for and the use-case —\n * rendered as a calm {@link PagePurpose} line under the header so every page\n * is self-explanatory for a new user. Prefer this over `description` for the\n * primary page-purpose copy.\n */\n purpose?: ReactNode;\n /**\n * Enables the living-glass hero backdrop (AuroraBackground) behind the page\n * header. Use on at most ONE page per MFE (the primary landing page).\n */\n hero?: boolean;\n}\n\n/**\n * Renders the page title, gradient-emphasising the final word when the title is\n * a plain string (the \"one gradient hero title per page\" convention). Custom\n * ReactNode titles are rendered verbatim so callers keep full control.\n */\nfunction renderTitle(title: ReactNode): ReactNode {\n if (typeof title !== 'string') return title;\n const trimmed = title.trim();\n const lastSpace = trimmed.lastIndexOf(' ');\n if (lastSpace === -1) {\n return <GradientText as=\"span\">{trimmed}</GradientText>;\n }\n const head = trimmed.slice(0, lastSpace + 1);\n const tail = trimmed.slice(lastSpace + 1);\n return (\n <>\n {head}\n <GradientText as=\"span\">{tail}</GradientText>\n </>\n );\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n purpose,\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 flex-col gap-3 px-4 py-4 sm:flex-row sm:items-center sm:justify-between sm:px-6',\n 'border-b border-border-seam',\n hero ? 'bg-hero-mesh' : 'bg-gloss-card'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold text-text-primary tracking-tight\">\n {renderTitle(title)}\n </h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n {purpose && <PagePurpose className=\"mt-2 max-w-2xl\">{purpose}</PagePurpose>}\n </div>\n {actions && (\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 sm:justify-end\">{actions}</div>\n )}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-4 sm:p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAkCA,SAAS,EAAY,GAA6B;AAChD,KAAI,OAAO,KAAU,SAAU,QAAO;CACtC,IAAM,IAAU,EAAM,MAAM,EACtB,IAAY,EAAQ,YAAY,IAAI;AAM1C,QALI,MAAc,KACT,kBAAC,GAAD;EAAc,IAAG;YAAQ;EAAuB,CAAA,GAKvD,kBAAA,GAAA,EAAA,UAAA,CAHW,EAAQ,MAAM,GAAG,IAAY,EAAE,EAKxC,kBAAC,GAAD;EAAc,IAAG;YAJR,EAAQ,MAAM,IAAY,EAAE;EAIQ,CAAA,CAC5C,EAAA,CAAA;;AAIP,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,YACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EACE,WAAW,EACT,iHACA,+BACA,IAAO,iBAAiB,gBACzB;YALH;GAOG,KAAQ,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;GAChD,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAY,EAAM;MAChB,CAAA;KACJ,KAAe,kBAAC,KAAD;MAAG,WAAU;gBAAoC;MAAgB,CAAA;KAChF,KAAW,kBAAC,GAAD;MAAa,WAAU;gBAAkB;MAAsB,CAAA;KACvE;;GACL,KACC,kBAAC,OAAD;IAAK,WAAU;cAA6D;IAAc,CAAA;GAExF;KAGN,kBAAC,OAAD;EAAK,WAAU;EAAmC;EAAe,CAAA,CAC7D"}
|
|
@@ -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-
|
|
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-text-primary",
|
|
18
|
+
className: "text-xs font-medium text-text-primary tabular-nums",
|
|
19
19
|
children: u.toFixed(1)
|
|
20
20
|
}),
|
|
21
21
|
a !== void 0 && /* @__PURE__ */ r("span", {
|
|
22
|
-
className: "text-xs text-text-secondary",
|
|
22
|
+
className: "text-xs text-text-secondary tabular-nums",
|
|
23
23
|
children: [
|
|
24
24
|
"(",
|
|
25
25
|
a,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/adaptercloud/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module adaptercloud/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-
|
|
1
|
+
{"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/adaptercloud/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module adaptercloud/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 tabular-nums\">\n {clampedValue.toFixed(1)}\n </span>\n {count !== undefined && (\n <span className=\"text-xs text-text-secondary tabular-nums\">({count})</span>\n )}\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;cACb,EAAa,QAAQ,EAAE;IACnB,CAAA;GACN,MAAU,KAAA,KACT,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAA2D;KAAE;KAAM;KAAQ;;GAEzE"}
|
|
@@ -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/adaptercloud/components/StatusBadge.tsx
|
|
4
|
-
var
|
|
5
|
-
success: "bg-
|
|
6
|
-
warning: "bg-
|
|
7
|
-
destructive: "bg-status-error-bg
|
|
8
|
-
secondary: "bg-
|
|
9
|
-
info: "bg-blue-
|
|
10
|
-
outline: "border border-border-
|
|
11
|
-
},
|
|
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-accent-blue-subtle text-accent-blue",
|
|
10
|
+
outline: "border border-border-seam text-text-primary"
|
|
11
|
+
}, i = {
|
|
12
|
+
success: "bg-status-success-text",
|
|
13
|
+
warning: "bg-status-warning-text",
|
|
14
|
+
destructive: "bg-status-error-text",
|
|
15
|
+
secondary: "bg-text-secondary",
|
|
16
|
+
info: "bg-accent-blue",
|
|
17
|
+
outline: "bg-text-secondary"
|
|
18
|
+
}, a = {
|
|
12
19
|
open: "success",
|
|
13
20
|
closed: "destructive",
|
|
14
21
|
busy: "warning",
|
|
@@ -31,15 +38,28 @@ var n = {
|
|
|
31
38
|
failed: "destructive",
|
|
32
39
|
processing: "warning",
|
|
33
40
|
completed: "success"
|
|
34
|
-
}
|
|
35
|
-
|
|
41
|
+
}, o = new Set([
|
|
42
|
+
"open",
|
|
43
|
+
"active",
|
|
44
|
+
"out_for_delivery",
|
|
45
|
+
"preparing",
|
|
46
|
+
"processing",
|
|
47
|
+
"returning"
|
|
48
|
+
]);
|
|
49
|
+
function s(e) {
|
|
36
50
|
return e.replace(/_/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
|
|
37
51
|
}
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
52
|
+
var c = ({ status: c, className: l }) => {
|
|
53
|
+
let u = c.toLowerCase(), d = a[u] || "secondary", f = o.has(u);
|
|
54
|
+
return /* @__PURE__ */ n("span", {
|
|
55
|
+
className: e("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium", r[d], l),
|
|
56
|
+
children: [/* @__PURE__ */ t("span", {
|
|
57
|
+
"aria-hidden": "true",
|
|
58
|
+
className: e("h-1.5 w-1.5 rounded-full", i[d], f && "motion-safe:animate-vc-glow-pulse")
|
|
59
|
+
}), s(c)]
|
|
60
|
+
});
|
|
61
|
+
};
|
|
42
62
|
//#endregion
|
|
43
|
-
export {
|
|
63
|
+
export { c as StatusBadge };
|
|
44
64
|
|
|
45
65
|
//# sourceMappingURL=StatusBadge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/adaptercloud/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module adaptercloud/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-
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/adaptercloud/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module adaptercloud/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-accent-blue-subtle text-accent-blue',\n outline: 'border border-border-seam text-text-primary',\n};\n\nconst dotStyles: 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-secondary',\n info: 'bg-accent-blue',\n outline: 'bg-text-secondary',\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\n/** Statuses that represent a live/active state get a calm opacity pulse on the dot. */\nconst liveStatuses = new Set([\n 'open',\n 'active',\n 'out_for_delivery',\n 'preparing',\n 'processing',\n 'returning',\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 <span\n aria-hidden=\"true\"\n className={cn(\n 'h-1.5 w-1.5 rounded-full',\n dotStyles[variant],\n isLive && '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,EAEK,IAA0C;CAC9C,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,EAGK,IAAe,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,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,CAOE,kBAAC,QAAD;GACE,eAAY;GACZ,WAAW,EACT,4BACA,EAAU,IACV,KAAU,oCACX;GACD,CAAA,EACD,EAAkB,EAAO,CACrB"}
|