@burdenoff/microfe-housingvista 2026.626.2 → 2026.703.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/housingvista/HousingVistaRoot.js +60 -59
- package/dist/housingvista/HousingVistaRoot.js.map +1 -1
- package/dist/housingvista/HousingVistaRoutes.js +25 -21
- package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
- package/dist/housingvista/components/DataTable.js +1 -1
- package/dist/housingvista/components/DataTable.js.map +1 -1
- package/dist/housingvista/components/EmptyState.js.map +1 -1
- package/dist/housingvista/components/ErrorBoundary.js +3 -3
- package/dist/housingvista/components/ErrorBoundary.js.map +1 -1
- package/dist/housingvista/components/LoadingSkeleton.js +76 -1
- package/dist/housingvista/components/LoadingSkeleton.js.map +1 -0
- package/dist/housingvista/components/PageLayout.js.map +1 -1
- package/dist/housingvista/components/PropertyCard.js +49 -50
- package/dist/housingvista/components/PropertyCard.js.map +1 -1
- package/dist/housingvista/components/StatCard.js +3 -3
- package/dist/housingvista/components/StatCard.js.map +1 -1
- package/dist/housingvista/components/StatusBadge.js +8 -8
- package/dist/housingvista/components/StatusBadge.js.map +1 -1
- package/dist/housingvista/components/index.js +0 -2
- package/dist/housingvista/hooks/index.js +670 -198
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/lib/toast.js +36 -0
- package/dist/housingvista/lib/toast.js.map +1 -0
- package/dist/housingvista/pages/HomePage.js +8 -8
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.js +254 -78
- package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
- package/dist/housingvista/pages/analytics/AnalyticsPage.js +192 -161
- package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.js +4 -4
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.js +17 -209
- package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.js +11 -11
- package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js +243 -205
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.js +348 -114
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.js +8 -8
- package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.js +81 -84
- package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js +83 -85
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.js +6 -6
- package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
- package/dist/housingvista/pages/notifications/NotificationsPage.js +19 -133
- package/dist/housingvista/pages/notifications/NotificationsPage.js.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.js +279 -243
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.js +216 -165
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.js +619 -424
- package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.js +493 -130
- package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.js +102 -102
- package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.js +99 -139
- package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.js +63 -0
- package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -0
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js +140 -185
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +269 -110
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +195 -116
- package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
- package/dist/node_modules/sonner/dist/index.js +163 -0
- package/dist/node_modules/sonner/dist/index.js.map +1 -0
- package/package.json +3 -3
- package/dist/housingvista/components/Modal.js +0 -3
- package/dist/housingvista/components/Toast.js +0 -3
|
@@ -26,9 +26,9 @@ var a = class extends e {
|
|
|
26
26
|
};
|
|
27
27
|
render() {
|
|
28
28
|
return this.state.hasError ? this.props.fallback ? this.props.fallback : /* @__PURE__ */ i("div", {
|
|
29
|
-
className: "flex flex-col items-center justify-center rounded-lg border border-dashed border-
|
|
29
|
+
className: "flex flex-col items-center justify-center rounded-lg border border-dashed border-status-error-border bg-status-error-bg-subtle p-12 text-center",
|
|
30
30
|
children: [
|
|
31
|
-
/* @__PURE__ */ r(t, { className: "mb-4 h-12 w-12 text-
|
|
31
|
+
/* @__PURE__ */ r(t, { className: "mb-4 h-12 w-12 text-status-error" }),
|
|
32
32
|
/* @__PURE__ */ r("h3", {
|
|
33
33
|
className: "text-lg font-medium text-text-primary",
|
|
34
34
|
children: "Something went wrong"
|
|
@@ -39,7 +39,7 @@ var a = class extends e {
|
|
|
39
39
|
}),
|
|
40
40
|
/* @__PURE__ */ i("button", {
|
|
41
41
|
onClick: this.handleReset,
|
|
42
|
-
className: "mt-4 flex items-center gap-1.5 rounded-md bg-
|
|
42
|
+
className: "mt-4 flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg-hover",
|
|
43
43
|
children: [/* @__PURE__ */ r(n, { className: "h-4 w-4" }), " Try Again"]
|
|
44
44
|
})
|
|
45
45
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","names":[],"sources":["../../../src/housingvista/components/ErrorBoundary.tsx"],"sourcesContent":["import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('[HousingVista ErrorBoundary]', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed border-
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","names":[],"sources":["../../../src/housingvista/components/ErrorBoundary.tsx"],"sourcesContent":["import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('[HousingVista ErrorBoundary]', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed border-status-error-border bg-status-error-bg-subtle p-12 text-center\">\n <AlertTriangle className=\"mb-4 h-12 w-12 text-status-error\" />\n <h3 className=\"text-lg font-medium text-text-primary\">Something went wrong</h3>\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">\n {this.state.error?.message ?? 'An unexpected error occurred while rendering this section.'}\n </p>\n <button\n onClick={this.handleReset}\n className=\"mt-4 flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n <RefreshCw className=\"h-4 w-4\" /> Try Again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"mappings":";;;;AAaA,IAAa,IAAb,cAAmC,EAAkD;CACnF,YAAY,GAA2B;AAErC,EADA,MAAM,EAAM,EACZ,KAAK,QAAQ;GAAE,UAAU;GAAO,OAAO;GAAM;;CAG/C,OAAO,yBAAyB,GAAkC;AAChE,SAAO;GAAE,UAAU;GAAM;GAAO;;CAGlC,kBAAkB,GAAc,GAAsB;AACpD,UAAQ,MAAM,gCAAgC,GAAO,EAAU;;CAGjE,oBAAoB;AAClB,OAAK,SAAS;GAAE,UAAU;GAAO,OAAO;GAAM,CAAC;;CAGjD,SAAS;AAqBP,SApBI,KAAK,MAAM,WACT,KAAK,MAAM,WAAiB,KAAK,MAAM,WAGzC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAe,WAAU,oCAAqC,CAAA;IAC9D,kBAAC,MAAD;KAAI,WAAU;eAAwC;KAAyB,CAAA;IAC/E,kBAAC,KAAD;KAAG,WAAU;eACV,KAAK,MAAM,OAAO,WAAW;KAC5B,CAAA;IACJ,kBAAC,UAAD;KACE,SAAS,KAAK;KACd,WAAU;eAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,aAC1B;;IACL;OAIH,KAAK,MAAM"}
|
|
@@ -1 +1,76 @@
|
|
|
1
|
-
import "
|
|
1
|
+
import { cn as e } from "../utils/helpers.js";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/housingvista/components/LoadingSkeleton.tsx
|
|
4
|
+
var r = ({ className: n }) => /* @__PURE__ */ t("div", { className: e("motion-safe:animate-vc-shimmer rounded-md bg-bg-sunken", n) }), i = ({ variant: i = "card", count: a = 3, className: o }) => i === "table" ? /* @__PURE__ */ t("div", {
|
|
5
|
+
className: e("space-y-3", o),
|
|
6
|
+
children: /* @__PURE__ */ n("div", {
|
|
7
|
+
className: "overflow-hidden rounded-lg border border-border-subtle",
|
|
8
|
+
children: [/* @__PURE__ */ t("div", {
|
|
9
|
+
className: "border-b border-border-subtle bg-bg-sunken/50 px-4 py-3",
|
|
10
|
+
children: /* @__PURE__ */ t("div", {
|
|
11
|
+
className: "flex gap-4",
|
|
12
|
+
children: Array.from({ length: 5 }).map((e, n) => /* @__PURE__ */ t(r, { className: "h-4 w-20" }, n))
|
|
13
|
+
})
|
|
14
|
+
}), Array.from({ length: a }).map((e, n) => /* @__PURE__ */ t("div", {
|
|
15
|
+
className: "flex gap-4 border-b border-border-subtle px-4 py-3 last:border-b-0",
|
|
16
|
+
children: Array.from({ length: 5 }).map((e, n) => /* @__PURE__ */ t(r, { className: "h-4 w-20" }, n))
|
|
17
|
+
}, n))]
|
|
18
|
+
})
|
|
19
|
+
}) : i === "list" ? /* @__PURE__ */ t("div", {
|
|
20
|
+
className: e("space-y-2", o),
|
|
21
|
+
children: Array.from({ length: a }).map((e, i) => /* @__PURE__ */ n("div", {
|
|
22
|
+
className: "flex items-center gap-3 rounded-lg border border-border-subtle p-4",
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ t(r, { className: "h-10 w-10 rounded-full" }),
|
|
25
|
+
/* @__PURE__ */ n("div", {
|
|
26
|
+
className: "flex-1 space-y-2",
|
|
27
|
+
children: [/* @__PURE__ */ t(r, { className: "h-4 w-1/3" }), /* @__PURE__ */ t(r, { className: "h-3 w-2/3" })]
|
|
28
|
+
}),
|
|
29
|
+
/* @__PURE__ */ t(r, { className: "h-6 w-16 rounded-full" })
|
|
30
|
+
]
|
|
31
|
+
}, i))
|
|
32
|
+
}) : i === "detail" ? /* @__PURE__ */ n("div", {
|
|
33
|
+
className: e("space-y-6", o),
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ n("div", {
|
|
36
|
+
className: "space-y-2",
|
|
37
|
+
children: [/* @__PURE__ */ t(r, { className: "h-8 w-1/3" }), /* @__PURE__ */ t(r, { className: "h-4 w-1/2" })]
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ t("div", {
|
|
40
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
41
|
+
children: Array.from({ length: 3 }).map((e, i) => /* @__PURE__ */ n("div", {
|
|
42
|
+
className: "rounded-lg border border-border-subtle p-4",
|
|
43
|
+
children: [/* @__PURE__ */ t(r, { className: "h-3 w-20" }), /* @__PURE__ */ t(r, { className: "mt-2 h-7 w-16" })]
|
|
44
|
+
}, i))
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ n("div", {
|
|
47
|
+
className: "rounded-lg border border-border-subtle p-6",
|
|
48
|
+
children: [/* @__PURE__ */ t(r, { className: "h-5 w-1/4" }), /* @__PURE__ */ n("div", {
|
|
49
|
+
className: "mt-4 space-y-3",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ t(r, { className: "h-4 w-full" }),
|
|
52
|
+
/* @__PURE__ */ t(r, { className: "h-4 w-5/6" }),
|
|
53
|
+
/* @__PURE__ */ t(r, { className: "h-4 w-4/6" })
|
|
54
|
+
]
|
|
55
|
+
})]
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
}) : /* @__PURE__ */ t("div", {
|
|
59
|
+
className: e("grid gap-4 sm:grid-cols-2 lg:grid-cols-3", o),
|
|
60
|
+
children: Array.from({ length: a }).map((e, i) => /* @__PURE__ */ n("div", {
|
|
61
|
+
className: "rounded-lg border border-border-subtle p-4",
|
|
62
|
+
children: [
|
|
63
|
+
/* @__PURE__ */ t(r, { className: "h-4 w-2/3" }),
|
|
64
|
+
/* @__PURE__ */ t(r, { className: "mt-2 h-3 w-1/2" }),
|
|
65
|
+
/* @__PURE__ */ t(r, { className: "mt-4 h-8 w-24" }),
|
|
66
|
+
/* @__PURE__ */ n("div", {
|
|
67
|
+
className: "mt-3 flex justify-between",
|
|
68
|
+
children: [/* @__PURE__ */ t(r, { className: "h-5 w-16 rounded-full" }), /* @__PURE__ */ t(r, { className: "h-7 w-14 rounded-md" })]
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
}, i))
|
|
72
|
+
});
|
|
73
|
+
//#endregion
|
|
74
|
+
export { i as LoadingSkeleton };
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=LoadingSkeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoadingSkeleton.js","names":[],"sources":["../../../src/housingvista/components/LoadingSkeleton.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { cn } from '../utils/helpers';\n\ninterface SkeletonProps {\n className?: string;\n}\n\nconst Skeleton: FC<SkeletonProps> = ({ className }) => (\n <div className={cn('motion-safe:animate-vc-shimmer rounded-md bg-bg-sunken', className)} />\n);\n\ninterface LoadingSkeletonProps {\n variant?: 'card' | 'table' | 'list' | 'detail';\n count?: number;\n className?: string;\n}\n\nexport const LoadingSkeleton: FC<LoadingSkeletonProps> = ({ variant = 'card', count = 3, className }) => {\n if (variant === 'table') {\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-hidden rounded-lg border border-border-subtle\">\n <div className=\"border-b border-border-subtle bg-bg-sunken/50 px-4 py-3\">\n <div className=\"flex gap-4\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} className=\"h-4 w-20\" />\n ))}\n </div>\n </div>\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"flex gap-4 border-b border-border-subtle px-4 py-3 last:border-b-0\">\n {Array.from({ length: 5 }).map((_, j) => (\n <Skeleton key={j} className=\"h-4 w-20\" />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (variant === 'list') {\n return (\n <div className={cn('space-y-2', className)}>\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-lg border border-border-subtle p-4\">\n <Skeleton className=\"h-10 w-10 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-1/3\" />\n <Skeleton className=\"h-3 w-2/3\" />\n </div>\n <Skeleton className=\"h-6 w-16 rounded-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (variant === 'detail') {\n return (\n <div className={cn('space-y-6', className)}>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-8 w-1/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n <div className=\"grid gap-4 sm:grid-cols-3\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"rounded-lg border border-border-subtle p-4\">\n <Skeleton className=\"h-3 w-20\" />\n <Skeleton className=\"mt-2 h-7 w-16\" />\n </div>\n ))}\n </div>\n <div className=\"rounded-lg border border-border-subtle p-6\">\n <Skeleton className=\"h-5 w-1/4\" />\n <div className=\"mt-4 space-y-3\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-5/6\" />\n <Skeleton className=\"h-4 w-4/6\" />\n </div>\n </div>\n </div>\n );\n }\n\n // Default: card grid\n return (\n <div className={cn('grid gap-4 sm:grid-cols-2 lg:grid-cols-3', className)}>\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"rounded-lg border border-border-subtle p-4\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"mt-2 h-3 w-1/2\" />\n <Skeleton className=\"mt-4 h-8 w-24\" />\n <div className=\"mt-3 flex justify-between\">\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"h-7 w-14 rounded-md\" />\n </div>\n </div>\n ))}\n </div>\n );\n};\n"],"mappings":";;;AAOA,IAAM,KAA+B,EAAE,mBACrC,kBAAC,OAAD,EAAK,WAAW,EAAG,0DAA0D,EAAU,EAAI,CAAA,EAShF,KAA6C,EAAE,aAAU,QAAQ,WAAQ,GAAG,mBACnF,MAAY,UAEZ,kBAAC,OAAD;CAAK,WAAW,EAAG,aAAa,EAAU;WACxC,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,GAAD,EAAkB,WAAU,YAAa,EAA1B,EAA0B,CACzC;IACE,CAAA;GACF,CAAA,EACL,MAAM,KAAK,EAAE,QAAQ,GAAO,CAAC,CAAC,KAAK,GAAG,MACrC,kBAAC,OAAD;GAAa,WAAU;aACpB,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,GAAD,EAAkB,WAAU,YAAa,EAA1B,EAA0B,CACzC;GACE,EAJI,EAIJ,CACN,CACE;;CACF,CAAA,GAIN,MAAY,SAEZ,kBAAC,OAAD;CAAK,WAAW,EAAG,aAAa,EAAU;WACvC,MAAM,KAAK,EAAE,QAAQ,GAAO,CAAC,CAAC,KAAK,GAAG,MACrC,kBAAC,OAAD;EAAa,WAAU;YAAvB;GACE,kBAAC,GAAD,EAAU,WAAU,0BAA2B,CAAA;GAC/C,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,EAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;;GACN,kBAAC,GAAD,EAAU,WAAU,yBAA0B,CAAA;GAC1C;IAPI,EAOJ,CACN;CACE,CAAA,GAIN,MAAY,WAEZ,kBAAC,OAAD;CAAK,WAAW,EAAG,aAAa,EAAU;WAA1C;EACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,EAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;;EACN,kBAAC,OAAD;GAAK,WAAU;aACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,GAAD,EAAU,WAAU,YAAa,CAAA,EACjC,kBAAC,GAAD,EAAU,WAAU,iBAAkB,CAAA,CAClC;MAHI,EAGJ,CACN;GACE,CAAA;EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA,EAClC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAU,WAAU,cAAe,CAAA;KACnC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;KAClC,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;KAC9B;MACF;;EACF;KAMR,kBAAC,OAAD;CAAK,WAAW,EAAG,4CAA4C,EAAU;WACtE,MAAM,KAAK,EAAE,QAAQ,GAAO,CAAC,CAAC,KAAK,GAAG,MACrC,kBAAC,OAAD;EAAa,WAAU;YAAvB;GACE,kBAAC,GAAD,EAAU,WAAU,aAAc,CAAA;GAClC,kBAAC,GAAD,EAAU,WAAU,kBAAmB,CAAA;GACvC,kBAAC,GAAD,EAAU,WAAU,iBAAkB,CAAA;GACtC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAU,WAAU,yBAA0B,CAAA,EAC9C,kBAAC,GAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;;GACF;IARI,EAQJ,CACN;CACE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/housingvista/components/PageLayout.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { GradientText, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/helpers';\n\ninterface PageLayoutProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /**\n * Boff UI 2.0 — a calm one/two-line \"story\" explaining WHAT this page is for\n * and the use-case, so a new user understands it at a glance. Rendered with\n * the {@link PagePurpose} primitive directly under the title.\n */\n purpose?: ReactNode;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/housingvista/components/PageLayout.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { GradientText, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/helpers';\n\ninterface PageLayoutProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /**\n * Boff UI 2.0 — a calm one/two-line \"story\" explaining WHAT this page is for\n * and the use-case, so a new user understands it at a glance. Rendered with\n * the {@link PagePurpose} primitive directly under the title.\n */\n purpose?: ReactNode;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({ title, description, actions, children, className, purpose }) => {\n return (\n <div className={cn('flex flex-col gap-6 p-6', className)}>\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">\n <GradientText>{title}</GradientText>\n </h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-2 shrink-0\">{actions}</div>}\n </div>\n {purpose && <PagePurpose className=\"max-w-3xl\">{purpose}</PagePurpose>}\n </div>\n {children}\n </div>\n );\n};\n"],"mappings":";;;;AAkBA,IAAa,KAAmC,EAAE,UAAO,gBAAa,YAAS,aAAU,cAAW,iBAEhG,kBAAC,OAAD;CAAK,WAAW,EAAG,2BAA2B,EAAU;WAAxD,CACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAe,GAAqB,CAAA;IACjC,CAAA,EACJ,KAAe,kBAAC,KAAD;IAAG,WAAU;cAAoC;IAAgB,CAAA,CAC7E,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAoC;IAAc,CAAA,CACzE;MACL,KAAW,kBAAC,GAAD;GAAa,WAAU;aAAa;GAAsB,CAAA,CAClE;KACL,EACG"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { cn as e, formatCurrency as t, formatNumber as n } from "../utils/helpers.js";
|
|
2
2
|
import { StatusBadge as r } from "./StatusBadge.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
3
|
+
import { Bath as i, Bed as a, Heart as o, MapPin as s, Square as c } from "lucide-react";
|
|
4
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
5
|
//#region src/housingvista/components/PropertyCard.tsx
|
|
7
|
-
var
|
|
6
|
+
var d = {
|
|
8
7
|
available: "success",
|
|
9
8
|
active: "success",
|
|
10
9
|
listed: "success",
|
|
@@ -16,92 +15,92 @@ var f = {
|
|
|
16
15
|
off_market: "muted",
|
|
17
16
|
"off market": "muted",
|
|
18
17
|
draft: "muted"
|
|
19
|
-
},
|
|
20
|
-
let
|
|
21
|
-
return /* @__PURE__ */
|
|
22
|
-
className: e("group overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-elevation-2",
|
|
23
|
-
onClick:
|
|
24
|
-
children: [/* @__PURE__ */
|
|
18
|
+
}, f = ({ title: f, price: p, priceType: m, pricePeriod: h, location: g, bedrooms: _, bathrooms: v, area: y, imageUrl: b, status: x, type: S, onClick: C, className: w, isShortlisted: T, onToggleShortlist: E }) => {
|
|
19
|
+
let D = m === "rent" ? `${t(p)}${h ? `/${h}` : "/mo"}` : t(p), O = d[x.toLowerCase()] ?? "default";
|
|
20
|
+
return /* @__PURE__ */ u("div", {
|
|
21
|
+
className: e("group overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-elevation-2", C && "cursor-pointer", w),
|
|
22
|
+
onClick: C,
|
|
23
|
+
children: [/* @__PURE__ */ u("div", {
|
|
25
24
|
className: "relative aspect-[16/10] overflow-hidden",
|
|
26
25
|
children: [
|
|
27
|
-
|
|
28
|
-
src:
|
|
29
|
-
alt:
|
|
26
|
+
b ? /* @__PURE__ */ l("img", {
|
|
27
|
+
src: b,
|
|
28
|
+
alt: f,
|
|
30
29
|
className: "h-full w-full object-cover"
|
|
31
|
-
}) : /* @__PURE__ */
|
|
32
|
-
className: "flex h-full w-full items-center justify-center bg-gradient-to-br from-
|
|
33
|
-
children: /* @__PURE__ */
|
|
30
|
+
}) : /* @__PURE__ */ l("div", {
|
|
31
|
+
className: "flex h-full w-full items-center justify-center bg-gradient-to-br from-bg-sunken to-bg-sunken/60",
|
|
32
|
+
children: /* @__PURE__ */ l(c, { className: "h-10 w-10 text-text-secondary/40" })
|
|
34
33
|
}),
|
|
35
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ l("div", {
|
|
36
35
|
className: "absolute left-3 top-3",
|
|
37
|
-
children: /* @__PURE__ */
|
|
38
|
-
label:
|
|
39
|
-
variant:
|
|
36
|
+
children: /* @__PURE__ */ l(r, {
|
|
37
|
+
label: x,
|
|
38
|
+
variant: O,
|
|
40
39
|
dot: !0
|
|
41
40
|
})
|
|
42
41
|
}),
|
|
43
|
-
/* @__PURE__ */
|
|
42
|
+
E && /* @__PURE__ */ l("button", {
|
|
44
43
|
onClick: (e) => {
|
|
45
|
-
e.stopPropagation(),
|
|
44
|
+
e.stopPropagation(), E();
|
|
46
45
|
},
|
|
47
|
-
className: e("absolute right-3 top-3 rounded-full bg-bg-surface/80 p-1.5 backdrop-blur-sm transition-colors hover:bg-bg-surface",
|
|
48
|
-
"aria-label":
|
|
49
|
-
children: /* @__PURE__ */
|
|
46
|
+
className: e("absolute right-3 top-3 rounded-full bg-bg-surface/80 p-1.5 backdrop-blur-sm transition-colors hover:bg-bg-surface", T ? "text-status-error-text" : "text-text-secondary"),
|
|
47
|
+
"aria-label": T ? "Remove from shortlist" : "Save to shortlist",
|
|
48
|
+
children: /* @__PURE__ */ l(o, { className: e("h-4 w-4", T && "fill-current") })
|
|
50
49
|
}),
|
|
51
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ l("div", {
|
|
52
51
|
className: "absolute bottom-3 left-3",
|
|
53
|
-
children: /* @__PURE__ */
|
|
52
|
+
children: /* @__PURE__ */ l("span", {
|
|
54
53
|
className: "rounded-md bg-bg-surface/80 px-2 py-1 text-xs font-medium text-text-primary backdrop-blur-sm",
|
|
55
|
-
children:
|
|
54
|
+
children: S
|
|
56
55
|
})
|
|
57
56
|
})
|
|
58
57
|
]
|
|
59
|
-
}), /* @__PURE__ */
|
|
58
|
+
}), /* @__PURE__ */ u("div", {
|
|
60
59
|
className: "p-4",
|
|
61
60
|
children: [
|
|
62
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ u("div", {
|
|
63
62
|
className: "flex items-baseline justify-between gap-2",
|
|
64
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ l("span", {
|
|
65
64
|
className: "text-lg font-bold text-text-primary",
|
|
66
|
-
children:
|
|
67
|
-
}),
|
|
65
|
+
children: D
|
|
66
|
+
}), m === "sale" && /* @__PURE__ */ l("span", {
|
|
68
67
|
className: "text-xs font-medium text-text-secondary",
|
|
69
68
|
children: "For Sale"
|
|
70
69
|
})]
|
|
71
70
|
}),
|
|
72
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ l("h3", {
|
|
73
72
|
className: "mt-1 truncate text-sm font-medium text-text-primary",
|
|
74
|
-
children:
|
|
73
|
+
children: f
|
|
75
74
|
}),
|
|
76
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ u("div", {
|
|
77
76
|
className: "mt-1.5 flex items-center gap-1 text-text-secondary",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
77
|
+
children: [/* @__PURE__ */ l(s, { className: "h-3.5 w-3.5 shrink-0" }), /* @__PURE__ */ l("span", {
|
|
79
78
|
className: "truncate text-xs",
|
|
80
|
-
children:
|
|
79
|
+
children: g
|
|
81
80
|
})]
|
|
82
81
|
}),
|
|
83
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ u("div", {
|
|
84
83
|
className: "mt-3 flex items-center gap-3 border-t border-border-subtle pt-3",
|
|
85
84
|
children: [
|
|
86
|
-
|
|
85
|
+
_ != null && /* @__PURE__ */ u("div", {
|
|
87
86
|
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
89
|
-
|
|
87
|
+
children: [/* @__PURE__ */ l(a, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ u("span", { children: [
|
|
88
|
+
_,
|
|
90
89
|
" ",
|
|
91
|
-
|
|
90
|
+
_ === 1 ? "Bed" : "Beds"
|
|
92
91
|
] })]
|
|
93
92
|
}),
|
|
94
|
-
|
|
93
|
+
v != null && /* @__PURE__ */ u("div", {
|
|
95
94
|
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
96
|
-
children: [/* @__PURE__ */
|
|
97
|
-
|
|
95
|
+
children: [/* @__PURE__ */ l(i, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ u("span", { children: [
|
|
96
|
+
v,
|
|
98
97
|
" ",
|
|
99
|
-
|
|
98
|
+
v === 1 ? "Bath" : "Baths"
|
|
100
99
|
] })]
|
|
101
100
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ u("div", {
|
|
103
102
|
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
103
|
+
children: [/* @__PURE__ */ l(c, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ u("span", { children: [n(y), " sq ft"] })]
|
|
105
104
|
})
|
|
106
105
|
]
|
|
107
106
|
})
|
|
@@ -110,6 +109,6 @@ var f = {
|
|
|
110
109
|
});
|
|
111
110
|
};
|
|
112
111
|
//#endregion
|
|
113
|
-
export {
|
|
112
|
+
export { f as PropertyCard };
|
|
114
113
|
|
|
115
114
|
//# sourceMappingURL=PropertyCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertyCard.js","names":[],"sources":["../../../src/housingvista/components/PropertyCard.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"PropertyCard.js","names":[],"sources":["../../../src/housingvista/components/PropertyCard.tsx"],"sourcesContent":["import { type FC } from 'react';\nimport { MapPin, Bed, Bath, Square, Heart } from 'lucide-react';\nimport { cn, formatCurrency, formatNumber } from '../utils/helpers';\nimport { StatusBadge } from './StatusBadge';\n\ninterface PropertyCardProps {\n id: string;\n title: string;\n price: number;\n priceType: 'sale' | 'rent';\n pricePeriod?: string;\n location: string;\n bedrooms?: number;\n bathrooms?: number;\n area: number;\n imageUrl?: string;\n status: string;\n type: string;\n onClick?: () => void;\n className?: string;\n /** When provided the heart becomes a controlled shortlist toggle. */\n isShortlisted?: boolean;\n onToggleShortlist?: () => void;\n}\n\nconst statusVariantMap: Record<string, 'success' | 'warning' | 'error' | 'info' | 'default' | 'muted'> = {\n available: 'success',\n active: 'success',\n listed: 'success',\n pending: 'warning',\n 'under contract': 'warning',\n 'under offer': 'warning',\n sold: 'error',\n rented: 'error',\n off_market: 'muted',\n 'off market': 'muted',\n draft: 'muted',\n};\n\nexport const PropertyCard: FC<PropertyCardProps> = ({\n title,\n price,\n priceType,\n pricePeriod,\n location,\n bedrooms,\n bathrooms,\n area,\n imageUrl,\n status,\n type,\n onClick,\n className,\n isShortlisted,\n onToggleShortlist,\n}) => {\n const priceDisplay =\n priceType === 'rent' ? `${formatCurrency(price)}${pricePeriod ? `/${pricePeriod}` : '/mo'}` : formatCurrency(price);\n\n const badgeVariant = statusVariantMap[status.toLowerCase()] ?? 'default';\n\n return (\n <div\n className={cn(\n 'group overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1 transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-elevation-2',\n onClick && 'cursor-pointer',\n className\n )}\n onClick={onClick}\n >\n {/* Image Section */}\n <div className=\"relative aspect-[16/10] overflow-hidden\">\n {imageUrl ? (\n <img src={imageUrl} alt={title} className=\"h-full w-full object-cover\" />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center bg-gradient-to-br from-bg-sunken to-bg-sunken/60\">\n <Square className=\"h-10 w-10 text-text-secondary/40\" />\n </div>\n )}\n\n {/* Overlays */}\n <div className=\"absolute left-3 top-3\">\n <StatusBadge label={status} variant={badgeVariant} dot />\n </div>\n {onToggleShortlist && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggleShortlist();\n }}\n className={cn(\n 'absolute right-3 top-3 rounded-full bg-bg-surface/80 p-1.5 backdrop-blur-sm transition-colors hover:bg-bg-surface',\n isShortlisted ? 'text-status-error-text' : 'text-text-secondary'\n )}\n aria-label={isShortlisted ? 'Remove from shortlist' : 'Save to shortlist'}\n >\n <Heart className={cn('h-4 w-4', isShortlisted && 'fill-current')} />\n </button>\n )}\n <div className=\"absolute bottom-3 left-3\">\n <span className=\"rounded-md bg-bg-surface/80 px-2 py-1 text-xs font-medium text-text-primary backdrop-blur-sm\">\n {type}\n </span>\n </div>\n </div>\n\n {/* Content Section */}\n <div className=\"p-4\">\n {/* Price */}\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-lg font-bold text-text-primary\">{priceDisplay}</span>\n {priceType === 'sale' && <span className=\"text-xs font-medium text-text-secondary\">For Sale</span>}\n </div>\n\n {/* Title */}\n <h3 className=\"mt-1 truncate text-sm font-medium text-text-primary\">{title}</h3>\n\n {/* Location */}\n <div className=\"mt-1.5 flex items-center gap-1 text-text-secondary\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate text-xs\">{location}</span>\n </div>\n\n {/* Specs Row */}\n <div className=\"mt-3 flex items-center gap-3 border-t border-border-subtle pt-3\">\n {bedrooms != null && (\n <div className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Bed className=\"h-3.5 w-3.5\" />\n <span>\n {bedrooms} {bedrooms === 1 ? 'Bed' : 'Beds'}\n </span>\n </div>\n )}\n {bathrooms != null && (\n <div className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Bath className=\"h-3.5 w-3.5\" />\n <span>\n {bathrooms} {bathrooms === 1 ? 'Bath' : 'Baths'}\n </span>\n </div>\n )}\n <div className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Square className=\"h-3.5 w-3.5\" />\n <span>{formatNumber(area)} sq ft</span>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;AAyBA,IAAM,IAAmG;CACvG,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,kBAAkB;CAClB,eAAe;CACf,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,cAAc;CACd,OAAO;CACR,EAEY,KAAuC,EAClD,UACA,UACA,cACA,gBACA,aACA,aACA,cACA,SACA,aACA,WACA,SACA,YACA,cACA,kBACA,2BACI;CACJ,IAAM,IACJ,MAAc,SAAS,GAAG,EAAe,EAAM,GAAG,IAAc,IAAI,MAAgB,UAAU,EAAe,EAAM,EAE/G,IAAe,EAAiB,EAAO,aAAa,KAAK;AAE/D,QACE,kBAAC,OAAD;EACE,WAAW,EACT,0LACA,KAAW,kBACX,EACD;EACQ;YANX,CASE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACG,IACC,kBAAC,OAAD;KAAK,KAAK;KAAU,KAAK;KAAO,WAAU;KAA+B,CAAA,GAEzE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD,EAAQ,WAAU,oCAAqC,CAAA;KACnD,CAAA;IAIR,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAa,OAAO;MAAQ,SAAS;MAAc,KAAA;MAAM,CAAA;KACrD,CAAA;IACL,KACC,kBAAC,UAAD;KACE,UAAU,MAAM;AAEd,MADA,EAAE,iBAAiB,EACnB,GAAmB;;KAErB,WAAW,EACT,qHACA,IAAgB,2BAA2B,sBAC5C;KACD,cAAY,IAAgB,0BAA0B;eAEtD,kBAAC,GAAD,EAAO,WAAW,EAAG,WAAW,KAAiB,eAAe,EAAI,CAAA;KAC7D,CAAA;IAEX,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,QAAD;MAAM,WAAU;gBACb;MACI,CAAA;KACH,CAAA;IACF;MAGN,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD;MAAM,WAAU;gBAAuC;MAAoB,CAAA,EAC1E,MAAc,UAAU,kBAAC,QAAD;MAAM,WAAU;gBAA0C;MAAe,CAAA,CAC9F;;IAGN,kBAAC,MAAD;KAAI,WAAU;eAAuD;KAAW,CAAA;IAGhF,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wBAAyB,CAAA,EAC3C,kBAAC,QAAD;MAAM,WAAU;gBAAoB;MAAgB,CAAA,CAChD;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KAAY,QACX,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAK,WAAU,eAAgB,CAAA,EAC/B,kBAAC,QAAD,EAAA,UAAA;QACG;QAAS;QAAE,MAAa,IAAI,QAAQ;QAChC,EAAA,CAAA,CACH;;MAEP,KAAa,QACZ,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA,EAChC,kBAAC,QAAD,EAAA,UAAA;QACG;QAAU;QAAE,MAAc,IAAI,SAAS;QACnC,EAAA,CAAA,CACH;;MAER,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA,EAClC,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAa,EAAK,EAAC,SAAa,EAAA,CAAA,CACnC;;MACF;;IACF;KACF"}
|
|
@@ -30,11 +30,11 @@ var l = ({ label: l, value: u, previousValue: d, unit: f, prefix: p, icon: m, tr
|
|
|
30
30
|
y !== 0 && /* @__PURE__ */ s("div", {
|
|
31
31
|
className: "mt-2 flex items-center gap-1 text-xs",
|
|
32
32
|
children: [
|
|
33
|
-
b === "up" && /* @__PURE__ */ o(a, { className: "h-3 w-3 text-
|
|
34
|
-
b === "down" && /* @__PURE__ */ o(i, { className: "h-3 w-3 text-
|
|
33
|
+
b === "up" && /* @__PURE__ */ o(a, { className: "h-3 w-3 text-status-success-text" }),
|
|
34
|
+
b === "down" && /* @__PURE__ */ o(i, { className: "h-3 w-3 text-status-error-text" }),
|
|
35
35
|
b === "stable" && /* @__PURE__ */ o(r, { className: "h-3 w-3 text-text-secondary" }),
|
|
36
36
|
/* @__PURE__ */ s("span", {
|
|
37
|
-
className: e("font-medium tabular-nums", b === "up" && "text-
|
|
37
|
+
className: e("font-medium tabular-nums", b === "up" && "text-status-success-text", b === "down" && "text-status-error-text", b === "stable" && "text-text-secondary"),
|
|
38
38
|
children: [
|
|
39
39
|
y > 0 ? "+" : "",
|
|
40
40
|
y,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatCard.js","names":[],"sources":["../../../src/housingvista/components/StatCard.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/helpers';\nimport { formatNumber, formatCurrency } from '../utils/helpers';\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n previousValue?: number;\n unit?: string;\n prefix?: string;\n icon?: ReactNode;\n trend?: 'up' | 'down' | 'stable';\n change?: number;\n className?: string;\n /** Render the featured hero metric with a glass treatment + accent glow. */\n featured?: boolean;\n}\n\nexport const StatCard: FC<StatCardProps> = ({\n label,\n value,\n previousValue,\n unit,\n prefix,\n icon,\n trend,\n change,\n className,\n featured = false,\n}) => {\n const numericValue = typeof value === 'number' ? value : 0;\n const computedChange =\n change ?? (previousValue ? Math.round(((numericValue - previousValue) / previousValue) * 100) : 0);\n const computedTrend = trend ?? (computedChange > 0 ? 'up' : computedChange < 0 ? 'down' : 'stable');\n\n const displayValue =\n typeof value === 'string'\n ? value\n : prefix === '$'\n ? formatCurrency(value)\n : `${formatNumber(value)}${unit ? ` ${unit}` : ''}`;\n\n return (\n <GlassCard\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n className={cn('border-border-seam p-4', className)}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-secondary\">{label}</span>\n {icon && <span className=\"text-text-secondary\">{icon}</span>}\n </div>\n <div className=\"mt-2 flex items-baseline gap-2\">\n <span className=\"text-2xl font-bold tabular-nums text-text-primary\">{displayValue}</span>\n </div>\n {computedChange !== 0 && (\n <div className=\"mt-2 flex items-center gap-1 text-xs\">\n {computedTrend === 'up' && <TrendingUp className=\"h-3 w-3 text-
|
|
1
|
+
{"version":3,"file":"StatCard.js","names":[],"sources":["../../../src/housingvista/components/StatCard.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/helpers';\nimport { formatNumber, formatCurrency } from '../utils/helpers';\n\ninterface StatCardProps {\n label: string;\n value: number | string;\n previousValue?: number;\n unit?: string;\n prefix?: string;\n icon?: ReactNode;\n trend?: 'up' | 'down' | 'stable';\n change?: number;\n className?: string;\n /** Render the featured hero metric with a glass treatment + accent glow. */\n featured?: boolean;\n}\n\nexport const StatCard: FC<StatCardProps> = ({\n label,\n value,\n previousValue,\n unit,\n prefix,\n icon,\n trend,\n change,\n className,\n featured = false,\n}) => {\n const numericValue = typeof value === 'number' ? value : 0;\n const computedChange =\n change ?? (previousValue ? Math.round(((numericValue - previousValue) / previousValue) * 100) : 0);\n const computedTrend = trend ?? (computedChange > 0 ? 'up' : computedChange < 0 ? 'down' : 'stable');\n\n const displayValue =\n typeof value === 'string'\n ? value\n : prefix === '$'\n ? formatCurrency(value)\n : `${formatNumber(value)}${unit ? ` ${unit}` : ''}`;\n\n return (\n <GlassCard\n treatment={featured ? 'glass' : 'metric'}\n glow={featured}\n className={cn('border-border-seam p-4', className)}\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-secondary\">{label}</span>\n {icon && <span className=\"text-text-secondary\">{icon}</span>}\n </div>\n <div className=\"mt-2 flex items-baseline gap-2\">\n <span className=\"text-2xl font-bold tabular-nums text-text-primary\">{displayValue}</span>\n </div>\n {computedChange !== 0 && (\n <div className=\"mt-2 flex items-center gap-1 text-xs\">\n {computedTrend === 'up' && <TrendingUp className=\"h-3 w-3 text-status-success-text\" />}\n {computedTrend === 'down' && <TrendingDown className=\"h-3 w-3 text-status-error-text\" />}\n {computedTrend === 'stable' && <Minus className=\"h-3 w-3 text-text-secondary\" />}\n <span\n className={cn(\n 'font-medium tabular-nums',\n computedTrend === 'up' && 'text-status-success-text',\n computedTrend === 'down' && 'text-status-error-text',\n computedTrend === 'stable' && 'text-text-secondary'\n )}\n >\n {computedChange > 0 ? '+' : ''}\n {computedChange}%\n </span>\n <span className=\"text-text-secondary\">vs last period</span>\n </div>\n )}\n </GlassCard>\n );\n};\n"],"mappings":";;;;;AAoBA,IAAa,KAA+B,EAC1C,UACA,UACA,kBACA,SACA,WACA,SACA,UACA,WACA,cACA,cAAW,SACP;CAEJ,IAAM,IACJ,MAAW,IAAgB,KAAK,QAFb,OAAO,KAAU,WAAW,IAAQ,KAEA,KAAiB,IAAiB,IAAI,GAAG,IAC5F,IAAgB,MAAU,IAAiB,IAAI,OAAO,IAAiB,IAAI,SAAS,WAEpF,IACJ,OAAO,KAAU,WACb,IACA,MAAW,MACT,EAAe,EAAM,GACrB,GAAG,EAAa,EAAM,GAAG,IAAO,IAAI,MAAS;AAErD,QACE,kBAAC,GAAD;EACE,WAAW,IAAW,UAAU;EAChC,MAAM;EACN,WAAW,EAAG,0BAA0B,EAAU;YAHpD;GAKE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,QAAD;KAAM,WAAU;eAA2C;KAAa,CAAA,EACvE,KAAQ,kBAAC,QAAD;KAAM,WAAU;eAAuB;KAAY,CAAA,CACxD;;GACN,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,QAAD;KAAM,WAAU;eAAqD;KAAoB,CAAA;IACrF,CAAA;GACL,MAAmB,KAClB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,MAAkB,QAAQ,kBAAC,GAAD,EAAY,WAAU,oCAAqC,CAAA;KACrF,MAAkB,UAAU,kBAAC,GAAD,EAAc,WAAU,kCAAmC,CAAA;KACvF,MAAkB,YAAY,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA;KAChF,kBAAC,QAAD;MACE,WAAW,EACT,4BACA,MAAkB,QAAQ,4BAC1B,MAAkB,UAAU,0BAC5B,MAAkB,YAAY,sBAC/B;gBANH;OAQG,IAAiB,IAAI,MAAM;OAC3B;OAAe;OACX;;KACP,kBAAC,QAAD;MAAM,WAAU;gBAAsB;MAAqB,CAAA;KACvD;;GAEE"}
|
|
@@ -2,17 +2,17 @@ import { cn as e } from "../utils/helpers.js";
|
|
|
2
2
|
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
3
|
//#region src/housingvista/components/StatusBadge.tsx
|
|
4
4
|
var r = {
|
|
5
|
-
success: "bg-
|
|
6
|
-
warning: "bg-
|
|
7
|
-
error: "bg-
|
|
8
|
-
info: "bg-
|
|
5
|
+
success: "bg-status-success-bg-subtle text-status-success-text",
|
|
6
|
+
warning: "bg-status-warning-bg-subtle text-status-warning-text",
|
|
7
|
+
error: "bg-status-error-bg-subtle text-status-error-text",
|
|
8
|
+
info: "bg-status-info-bg-subtle text-status-info-text",
|
|
9
9
|
default: "bg-action-primary-bg/10 text-primary",
|
|
10
10
|
muted: "bg-bg-sunken text-text-secondary"
|
|
11
11
|
}, i = {
|
|
12
|
-
success: "bg-
|
|
13
|
-
warning: "bg-
|
|
14
|
-
error: "bg-
|
|
15
|
-
info: "bg-
|
|
12
|
+
success: "bg-status-success",
|
|
13
|
+
warning: "bg-status-warning",
|
|
14
|
+
error: "bg-status-error",
|
|
15
|
+
info: "bg-status-info",
|
|
16
16
|
default: "bg-action-primary-bg",
|
|
17
17
|
muted: "bg-muted-foreground"
|
|
18
18
|
}, a = ({ label: a, variant: o = "default", dot: s = !1, className: c }) => /* @__PURE__ */ n("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/housingvista/components/StatusBadge.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { cn } from '../utils/helpers';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'default' | 'muted';\n\ninterface StatusBadgeProps {\n label: string;\n variant?: BadgeVariant;\n dot?: boolean;\n className?: string;\n}\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/housingvista/components/StatusBadge.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { cn } from '../utils/helpers';\n\ntype BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'default' | 'muted';\n\ninterface StatusBadgeProps {\n label: string;\n variant?: BadgeVariant;\n dot?: boolean;\n className?: string;\n}\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 error: 'bg-status-error-bg-subtle text-status-error-text',\n info: 'bg-status-info-bg-subtle text-status-info-text',\n default: 'bg-action-primary-bg/10 text-primary',\n muted: 'bg-bg-sunken text-text-secondary',\n};\n\nconst dotStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success',\n warning: 'bg-status-warning',\n error: 'bg-status-error',\n info: 'bg-status-info',\n default: 'bg-action-primary-bg',\n muted: 'bg-muted-foreground',\n};\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ label, variant = 'default', dot = false, className }) => {\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 {dot && (\n <span\n className={cn(\n 'h-1.5 w-1.5 rounded-full',\n dotStyles[variant],\n variant === 'success' && 'motion-safe:animate-vc-glow-pulse'\n )}\n />\n )}\n {label}\n </span>\n );\n};\n"],"mappings":";;;AAYA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACR,EAEK,IAA0C;CAC9C,SAAS;CACT,SAAS;CACT,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACR,EAEY,KAAqC,EAAE,UAAO,aAAU,WAAW,SAAM,IAAO,mBAEzF,kBAAC,QAAD;CACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;WALH,CAOG,KACC,kBAAC,QAAD,EACE,WAAW,EACT,4BACA,EAAU,IACV,MAAY,aAAa,oCAC1B,EACD,CAAA,EAEH,EACI"}
|
|
@@ -5,9 +5,7 @@ import "./StatusBadge.js";
|
|
|
5
5
|
import "./EmptyState.js";
|
|
6
6
|
import "./ChartCard.js";
|
|
7
7
|
import "./FilterBar.js";
|
|
8
|
-
import "./Toast.js";
|
|
9
8
|
import "./ErrorBoundary.js";
|
|
10
9
|
import "./Breadcrumbs.js";
|
|
11
10
|
import "./LoadingSkeleton.js";
|
|
12
|
-
import "./Modal.js";
|
|
13
11
|
import "./PropertyCard.js";
|