@burdenoff/microfe-housingvista 2026.703.13 → 2026.709.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generated/wspace-operations.js +67 -0
- package/dist/generated/wspace-operations.js.map +1 -0
- package/dist/housingvista/hooks/index.js +1 -0
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js +57 -0
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -0
- package/dist/housingvista/index.js +2 -0
- package/dist/housingvista/pages/HomePage.js +135 -132
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/analytics/AnalyticsPage.js +136 -134
- package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.js +279 -278
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.js +93 -86
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.js +514 -511
- package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
- package/dist/housingvista/services/assistantApi.js +222 -0
- package/dist/housingvista/services/assistantApi.js.map +1 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.js +120 -0
- package/dist/housingvista/services/createSandboxAssistantTransport.js.map +1 -0
- package/dist/housingvista/utils/pageContext.js +77 -0
- package/dist/housingvista/utils/pageContext.js.map +1 -0
- package/dist/index.js +5 -3
- package/package.json +6 -2
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
import { cn as e, getRelativeTime as t } from "../utils/helpers.js";
|
|
2
2
|
import { StatCard as n } from "../components/StatCard.js";
|
|
3
3
|
import { PropertyCard as r } from "../components/PropertyCard.js";
|
|
4
|
-
import {
|
|
4
|
+
import { useTrackPageView as i } from "../hooks/useHousingVistaAnalytics.js";
|
|
5
|
+
import { useDashboardStats as a, useProperties as o, useRecentActivities as s } from "../hooks/index.js";
|
|
5
6
|
import "../components/index.js";
|
|
6
|
-
import { useMemo as
|
|
7
|
-
import { ArrowRight as
|
|
8
|
-
import { useNavigate as
|
|
9
|
-
import { jsx as
|
|
10
|
-
import { useI18n as
|
|
11
|
-
import { AuroraBackground as
|
|
7
|
+
import { useMemo as c } from "react";
|
|
8
|
+
import { ArrowRight as l, BarChart3 as u, Building as d, Clock as f, DollarSign as p, Eye as m, FileText as h, Home as g, Plus as _, TrendingUp as v, Zap as y } from "lucide-react";
|
|
9
|
+
import { useNavigate as b } from "react-router-dom";
|
|
10
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
11
|
+
import { useI18n as C } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
|
+
import { AuroraBackground as w, Button as T, EmphasisPanel as E, GlassCard as D, GradientText as O, IllustratedEmptyState as k, NextSteps as A, PagePurpose as j } from "@burdenoff/fe-libs/ui";
|
|
12
13
|
//#region src/housingvista/pages/HomePage.tsx
|
|
13
|
-
var
|
|
14
|
-
property_listed:
|
|
15
|
-
transaction_update:
|
|
16
|
-
payment_received:
|
|
17
|
-
maintenance_request:
|
|
18
|
-
viewing_scheduled:
|
|
19
|
-
document_uploaded:
|
|
20
|
-
offer_received:
|
|
21
|
-
lease_signed:
|
|
22
|
-
},
|
|
14
|
+
var M = {
|
|
15
|
+
property_listed: g,
|
|
16
|
+
transaction_update: h,
|
|
17
|
+
payment_received: p,
|
|
18
|
+
maintenance_request: d,
|
|
19
|
+
viewing_scheduled: m,
|
|
20
|
+
document_uploaded: h,
|
|
21
|
+
offer_received: v,
|
|
22
|
+
lease_signed: h
|
|
23
|
+
}, N = {
|
|
23
24
|
property_listed: "text-accent-purple",
|
|
24
25
|
transaction_update: "text-status-info-text",
|
|
25
26
|
payment_received: "text-status-success-text",
|
|
@@ -28,170 +29,172 @@ var j = {
|
|
|
28
29
|
document_uploaded: "text-status-info-text",
|
|
29
30
|
offer_received: "text-status-success-text",
|
|
30
31
|
lease_signed: "text-accent-teal"
|
|
31
|
-
},
|
|
32
|
-
let
|
|
33
|
-
|
|
32
|
+
}, P = () => {
|
|
33
|
+
let g = b(), { t: P } = C();
|
|
34
|
+
i("housingvista.dashboard.viewed");
|
|
35
|
+
let { data: F } = a(), { data: I } = s(), { data: L } = o(), R = (e, t) => {
|
|
36
|
+
let n = P(e);
|
|
34
37
|
return n === e ? t : n;
|
|
35
|
-
},
|
|
38
|
+
}, z = [
|
|
36
39
|
{
|
|
37
|
-
title:
|
|
38
|
-
description:
|
|
39
|
-
icon:
|
|
40
|
+
title: R("housingvista.home.quickActions.addProperty.title", "Add Property"),
|
|
41
|
+
description: R("housingvista.home.quickActions.addProperty.description", "List a new property"),
|
|
42
|
+
icon: _,
|
|
40
43
|
path: "properties/new"
|
|
41
44
|
},
|
|
42
45
|
{
|
|
43
|
-
title:
|
|
44
|
-
description:
|
|
45
|
-
icon:
|
|
46
|
+
title: R("housingvista.home.quickActions.viewAnalytics.title", "View Analytics"),
|
|
47
|
+
description: R("housingvista.home.quickActions.viewAnalytics.description", "Check performance metrics"),
|
|
48
|
+
icon: u,
|
|
46
49
|
path: "analytics"
|
|
47
50
|
},
|
|
48
51
|
{
|
|
49
|
-
title:
|
|
50
|
-
description:
|
|
51
|
-
icon:
|
|
52
|
+
title: R("housingvista.home.quickActions.manageTransactions.title", "Manage Transactions"),
|
|
53
|
+
description: R("housingvista.home.quickActions.manageTransactions.description", "Handle ongoing deals"),
|
|
54
|
+
icon: h,
|
|
52
55
|
path: "transactions"
|
|
53
56
|
},
|
|
54
57
|
{
|
|
55
|
-
title:
|
|
56
|
-
description:
|
|
57
|
-
icon:
|
|
58
|
+
title: R("housingvista.home.quickActions.browseProperties.title", "Browse Properties"),
|
|
59
|
+
description: R("housingvista.home.quickActions.browseProperties.description", "Explore listings"),
|
|
60
|
+
icon: d,
|
|
58
61
|
path: "properties"
|
|
59
62
|
}
|
|
60
|
-
],
|
|
61
|
-
return /* @__PURE__ */
|
|
63
|
+
], B = c(() => L.slice(0, 6), [L]);
|
|
64
|
+
return /* @__PURE__ */ S("div", {
|
|
62
65
|
className: "space-y-6 p-6",
|
|
63
66
|
children: [
|
|
64
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ S("div", {
|
|
65
68
|
className: "relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop",
|
|
66
|
-
children: [/* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ x(w, { intensity: "subtle" }), /* @__PURE__ */ S("div", {
|
|
67
70
|
className: "relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
71
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
|
|
69
72
|
className: "text-3xl font-bold text-text-primary",
|
|
70
|
-
children: /* @__PURE__ */
|
|
71
|
-
}), /* @__PURE__ */
|
|
73
|
+
children: /* @__PURE__ */ x(O, { children: R("housingvista.home.header.title", "Welcome back!") })
|
|
74
|
+
}), /* @__PURE__ */ x("p", {
|
|
72
75
|
className: "mt-1 text-text-secondary",
|
|
73
|
-
children:
|
|
74
|
-
})] }), /* @__PURE__ */
|
|
75
|
-
onClick: () =>
|
|
76
|
+
children: R("housingvista.home.header.description", "Here's what's happening with your real estate portfolio today.")
|
|
77
|
+
})] }), /* @__PURE__ */ S(T, {
|
|
78
|
+
onClick: () => g("properties/new"),
|
|
76
79
|
className: "gap-2 self-start lg:self-auto",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ x(_, { className: "h-4 w-4" }), R("housingvista.home.header.quickAdd", "Quick Add")]
|
|
78
81
|
})]
|
|
79
82
|
})]
|
|
80
83
|
}),
|
|
81
|
-
/* @__PURE__ */
|
|
84
|
+
/* @__PURE__ */ x(j, {
|
|
82
85
|
className: "max-w-3xl",
|
|
83
|
-
children:
|
|
86
|
+
children: R("housingvista.home.purpose", "Your real-estate command center. See your portfolio at a glance, jump to the things you do most, and pick up where you left off — from listing a property to tracking deals and analytics.")
|
|
84
87
|
}),
|
|
85
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ x(A, {
|
|
86
89
|
storageKey: "housingvista-home",
|
|
87
90
|
steps: [
|
|
88
91
|
{
|
|
89
92
|
id: "add-property",
|
|
90
|
-
label:
|
|
91
|
-
description:
|
|
92
|
-
onClick: () =>
|
|
93
|
+
label: R("housingvista.home.nextSteps.addProperty", "List your first property"),
|
|
94
|
+
description: R("housingvista.home.nextSteps.addPropertyDesc", "Create a market-ready listing in a few guided steps."),
|
|
95
|
+
onClick: () => g("properties/new")
|
|
93
96
|
},
|
|
94
97
|
{
|
|
95
98
|
id: "browse",
|
|
96
|
-
label:
|
|
97
|
-
description:
|
|
98
|
-
onClick: () =>
|
|
99
|
+
label: R("housingvista.home.nextSteps.browse", "Browse properties"),
|
|
100
|
+
description: R("housingvista.home.nextSteps.browseDesc", "Explore listings and open one for full details."),
|
|
101
|
+
onClick: () => g("properties")
|
|
99
102
|
},
|
|
100
103
|
{
|
|
101
104
|
id: "analytics",
|
|
102
|
-
label:
|
|
103
|
-
description:
|
|
104
|
-
onClick: () =>
|
|
105
|
+
label: R("housingvista.home.nextSteps.analytics", "Review your analytics"),
|
|
106
|
+
description: R("housingvista.home.nextSteps.analyticsDesc", "Check portfolio performance and market insights."),
|
|
107
|
+
onClick: () => g("analytics")
|
|
105
108
|
}
|
|
106
109
|
]
|
|
107
110
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ S("div", {
|
|
109
112
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
110
113
|
children: [
|
|
111
|
-
/* @__PURE__ */
|
|
112
|
-
label:
|
|
113
|
-
value:
|
|
114
|
-
icon: /* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ x(n, {
|
|
115
|
+
label: R("housingvista.home.stats.totalProperties", "Total Properties"),
|
|
116
|
+
value: F.totalProperties,
|
|
117
|
+
icon: /* @__PURE__ */ x(d, { className: "h-5 w-5" }),
|
|
115
118
|
featured: !0
|
|
116
119
|
}),
|
|
117
|
-
/* @__PURE__ */
|
|
118
|
-
label:
|
|
119
|
-
value:
|
|
120
|
-
icon: /* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ x(n, {
|
|
121
|
+
label: R("housingvista.home.stats.activeListings", "Active Listings"),
|
|
122
|
+
value: F.activeTransactions,
|
|
123
|
+
icon: /* @__PURE__ */ x(v, { className: "h-5 w-5" })
|
|
121
124
|
}),
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
label:
|
|
124
|
-
value:
|
|
125
|
-
icon: /* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ x(n, {
|
|
126
|
+
label: R("housingvista.home.stats.upcomingViewings", "Upcoming Viewings"),
|
|
127
|
+
value: F.upcomingViewings,
|
|
128
|
+
icon: /* @__PURE__ */ x(m, { className: "h-5 w-5" })
|
|
126
129
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
label:
|
|
129
|
-
value:
|
|
130
|
+
/* @__PURE__ */ x(n, {
|
|
131
|
+
label: R("housingvista.home.stats.monthlyRevenue", "Monthly Revenue"),
|
|
132
|
+
value: F.monthlyRevenue,
|
|
130
133
|
prefix: "$",
|
|
131
|
-
icon: /* @__PURE__ */
|
|
134
|
+
icon: /* @__PURE__ */ x(p, { className: "h-5 w-5" })
|
|
132
135
|
})
|
|
133
136
|
]
|
|
134
137
|
}),
|
|
135
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ S("div", {
|
|
136
139
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
137
|
-
children: [/* @__PURE__ */
|
|
140
|
+
children: [/* @__PURE__ */ x("div", {
|
|
138
141
|
className: "lg:col-span-2",
|
|
139
|
-
children: /* @__PURE__ */
|
|
142
|
+
children: /* @__PURE__ */ S(E, {
|
|
140
143
|
className: "p-0",
|
|
141
|
-
children: [/* @__PURE__ */
|
|
144
|
+
children: [/* @__PURE__ */ S("div", {
|
|
142
145
|
className: "flex items-center gap-2 border-b border-border-seam px-5 py-4",
|
|
143
|
-
children: [/* @__PURE__ */
|
|
146
|
+
children: [/* @__PURE__ */ x(f, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x("h2", {
|
|
144
147
|
className: "text-base font-semibold text-text-primary",
|
|
145
|
-
children:
|
|
148
|
+
children: R("housingvista.home.recentActivity.title", "Recent Activity")
|
|
146
149
|
})]
|
|
147
|
-
}), /* @__PURE__ */
|
|
150
|
+
}), /* @__PURE__ */ x("div", {
|
|
148
151
|
className: "p-5",
|
|
149
|
-
children:
|
|
152
|
+
children: I.length === 0 ? /* @__PURE__ */ S("div", {
|
|
150
153
|
className: "flex flex-col items-center gap-2 py-8 text-center",
|
|
151
154
|
children: [
|
|
152
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ x("div", {
|
|
153
156
|
className: "rounded-full bg-bg-sunken p-3",
|
|
154
|
-
children: /* @__PURE__ */
|
|
157
|
+
children: /* @__PURE__ */ x(f, { className: "h-6 w-6 text-text-secondary" })
|
|
155
158
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ x("p", {
|
|
157
160
|
className: "text-sm font-medium text-text-primary",
|
|
158
161
|
children: "No activity yet"
|
|
159
162
|
}),
|
|
160
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ x("p", {
|
|
161
164
|
className: "max-w-xs text-xs text-text-secondary",
|
|
162
165
|
children: "As you list properties, book viewings, and close deals, your latest updates appear here."
|
|
163
166
|
})
|
|
164
167
|
]
|
|
165
|
-
}) : /* @__PURE__ */
|
|
168
|
+
}) : /* @__PURE__ */ S("ol", {
|
|
166
169
|
className: "relative space-y-5",
|
|
167
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ x("span", {
|
|
168
171
|
"aria-hidden": !0,
|
|
169
172
|
className: "absolute bottom-2 left-[18px] top-2 w-px bg-border-seam"
|
|
170
|
-
}),
|
|
171
|
-
let r =
|
|
172
|
-
return /* @__PURE__ */
|
|
173
|
+
}), I.slice(0, 6).map((n) => {
|
|
174
|
+
let r = M[n.type] ?? m;
|
|
175
|
+
return /* @__PURE__ */ S("li", {
|
|
173
176
|
className: "relative flex items-start gap-4",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
175
|
-
className: e("relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1",
|
|
176
|
-
children: /* @__PURE__ */
|
|
177
|
-
}), /* @__PURE__ */
|
|
177
|
+
children: [/* @__PURE__ */ x("span", {
|
|
178
|
+
className: e("relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1", N[n.type] ?? "text-text-secondary"),
|
|
179
|
+
children: /* @__PURE__ */ x(r, { className: "h-4 w-4" })
|
|
180
|
+
}), /* @__PURE__ */ S("div", {
|
|
178
181
|
className: "min-w-0 flex-1 pt-0.5",
|
|
179
182
|
children: [
|
|
180
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ S("div", {
|
|
181
184
|
className: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5",
|
|
182
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ x("p", {
|
|
183
186
|
className: "text-sm font-medium text-text-primary",
|
|
184
187
|
children: n.title
|
|
185
|
-
}), /* @__PURE__ */
|
|
188
|
+
}), /* @__PURE__ */ x("p", {
|
|
186
189
|
className: "shrink-0 text-xs text-text-secondary",
|
|
187
190
|
children: t(n.timestamp)
|
|
188
191
|
})]
|
|
189
192
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
193
|
+
/* @__PURE__ */ x("p", {
|
|
191
194
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
192
195
|
children: n.description
|
|
193
196
|
}),
|
|
194
|
-
n.actorName && /* @__PURE__ */
|
|
197
|
+
n.actorName && /* @__PURE__ */ x("p", {
|
|
195
198
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
196
199
|
children: n.actorName
|
|
197
200
|
})
|
|
@@ -202,40 +205,40 @@ var j = {
|
|
|
202
205
|
})
|
|
203
206
|
})]
|
|
204
207
|
})
|
|
205
|
-
}), /* @__PURE__ */
|
|
208
|
+
}), /* @__PURE__ */ x("div", {
|
|
206
209
|
className: "lg:col-span-1",
|
|
207
|
-
children: /* @__PURE__ */
|
|
210
|
+
children: /* @__PURE__ */ S(D, {
|
|
208
211
|
treatment: "plain",
|
|
209
212
|
className: "h-full border-border-seam",
|
|
210
|
-
children: [/* @__PURE__ */
|
|
213
|
+
children: [/* @__PURE__ */ S("div", {
|
|
211
214
|
className: "flex items-center gap-2 border-b border-border-seam px-5 py-4",
|
|
212
|
-
children: [/* @__PURE__ */
|
|
215
|
+
children: [/* @__PURE__ */ x(y, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x("h2", {
|
|
213
216
|
className: "text-base font-semibold text-text-primary",
|
|
214
|
-
children:
|
|
217
|
+
children: R("housingvista.home.quickActions.title", "Quick Actions")
|
|
215
218
|
})]
|
|
216
|
-
}), /* @__PURE__ */
|
|
219
|
+
}), /* @__PURE__ */ x("div", {
|
|
217
220
|
className: "space-y-2 p-4",
|
|
218
|
-
children:
|
|
221
|
+
children: z.map((t, n) => {
|
|
219
222
|
let r = t.icon;
|
|
220
|
-
return /* @__PURE__ */
|
|
221
|
-
onClick: () =>
|
|
223
|
+
return /* @__PURE__ */ S("button", {
|
|
224
|
+
onClick: () => g(t.path),
|
|
222
225
|
className: "group/action flex min-h-[44px] w-full items-center gap-3 rounded-lg border border-border-seam p-3 text-left transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
|
|
223
226
|
children: [
|
|
224
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ x("div", {
|
|
225
228
|
className: e("rounded-lg bg-bg-sunken p-2", n % 2 == 0 ? "text-accent-teal" : "text-accent-blue"),
|
|
226
|
-
children: /* @__PURE__ */
|
|
229
|
+
children: /* @__PURE__ */ x(r, { className: "h-5 w-5" })
|
|
227
230
|
}),
|
|
228
|
-
/* @__PURE__ */
|
|
231
|
+
/* @__PURE__ */ S("div", {
|
|
229
232
|
className: "min-w-0 flex-1",
|
|
230
|
-
children: [/* @__PURE__ */
|
|
233
|
+
children: [/* @__PURE__ */ x("div", {
|
|
231
234
|
className: "text-sm font-medium text-text-primary",
|
|
232
235
|
children: t.title
|
|
233
|
-
}), /* @__PURE__ */
|
|
236
|
+
}), /* @__PURE__ */ x("div", {
|
|
234
237
|
className: "text-xs text-text-secondary",
|
|
235
238
|
children: t.description
|
|
236
239
|
})]
|
|
237
240
|
}),
|
|
238
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ x(l, { className: "h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100" })
|
|
239
242
|
]
|
|
240
243
|
}, t.title);
|
|
241
244
|
})
|
|
@@ -243,34 +246,34 @@ var j = {
|
|
|
243
246
|
})
|
|
244
247
|
})]
|
|
245
248
|
}),
|
|
246
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ S(D, {
|
|
247
250
|
treatment: "plain",
|
|
248
251
|
className: "border-border-seam",
|
|
249
|
-
children: [/* @__PURE__ */
|
|
252
|
+
children: [/* @__PURE__ */ S("div", {
|
|
250
253
|
className: "flex items-center justify-between border-b border-border-seam px-5 py-4",
|
|
251
|
-
children: [/* @__PURE__ */
|
|
254
|
+
children: [/* @__PURE__ */ x("h2", {
|
|
252
255
|
className: "text-base font-semibold text-text-primary",
|
|
253
|
-
children:
|
|
254
|
-
}), /* @__PURE__ */
|
|
255
|
-
onClick: () =>
|
|
256
|
+
children: R("housingvista.home.recentProperties.title", "Recent Properties")
|
|
257
|
+
}), /* @__PURE__ */ S("button", {
|
|
258
|
+
onClick: () => g("properties"),
|
|
256
259
|
className: "inline-flex min-h-[44px] items-center gap-1 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded-md px-1",
|
|
257
|
-
children: [
|
|
260
|
+
children: [R("housingvista.home.recentProperties.viewAll", "View All"), /* @__PURE__ */ x(l, { className: "h-4 w-4" })]
|
|
258
261
|
})]
|
|
259
|
-
}),
|
|
262
|
+
}), B.length === 0 ? /* @__PURE__ */ x("div", {
|
|
260
263
|
className: "p-4",
|
|
261
|
-
children: /* @__PURE__ */
|
|
264
|
+
children: /* @__PURE__ */ x(k, {
|
|
262
265
|
illustration: "empty-data",
|
|
263
|
-
title:
|
|
264
|
-
description:
|
|
265
|
-
action: /* @__PURE__ */
|
|
266
|
-
onClick: () =>
|
|
266
|
+
title: R("housingvista.home.recentProperties.empty.title", "No properties yet"),
|
|
267
|
+
description: R("housingvista.home.recentProperties.empty.description", "List your first property to see it appear here."),
|
|
268
|
+
action: /* @__PURE__ */ S(T, {
|
|
269
|
+
onClick: () => g("properties/new"),
|
|
267
270
|
className: "gap-2",
|
|
268
|
-
children: [/* @__PURE__ */
|
|
271
|
+
children: [/* @__PURE__ */ x(_, { className: "h-4 w-4" }), R("housingvista.home.header.quickAdd", "Quick Add")]
|
|
269
272
|
})
|
|
270
273
|
})
|
|
271
|
-
}) : /* @__PURE__ */
|
|
274
|
+
}) : /* @__PURE__ */ x("div", {
|
|
272
275
|
className: "grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
273
|
-
children:
|
|
276
|
+
children: B.map((e) => /* @__PURE__ */ x(r, {
|
|
274
277
|
id: e.id,
|
|
275
278
|
title: e.title,
|
|
276
279
|
price: e.price.amount,
|
|
@@ -284,7 +287,7 @@ var j = {
|
|
|
284
287
|
imageUrl: e.images[0]?.url,
|
|
285
288
|
status: e.status.replace("_", " "),
|
|
286
289
|
type: e.category,
|
|
287
|
-
onClick: () =>
|
|
290
|
+
onClick: () => g(`properties/${e.id}`)
|
|
288
291
|
}, e.id))
|
|
289
292
|
})]
|
|
290
293
|
})
|
|
@@ -292,6 +295,6 @@ var j = {
|
|
|
292
295
|
});
|
|
293
296
|
};
|
|
294
297
|
//#endregion
|
|
295
|
-
export {
|
|
298
|
+
export { P as HomePage };
|
|
296
299
|
|
|
297
300
|
//# sourceMappingURL=HomePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/housingvista/pages/HomePage.tsx"],"sourcesContent":["/**\n * HousingVista Dashboard / Home Page\n * Migrated from legacy housingvista-frontend dashboard.tsx\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GradientText,\n Button,\n GlassCard,\n EmphasisPanel,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Building,\n TrendingUp,\n Eye,\n DollarSign,\n Plus,\n BarChart3,\n FileText,\n Home,\n ArrowRight,\n Clock,\n Zap,\n} from 'lucide-react';\nimport { StatCard, PropertyCard } from '../components';\nimport { useDashboardStats, useRecentActivities, useProperties } from '../hooks';\nimport { cn, getRelativeTime } from '../utils/helpers';\nimport type { RecentActivity } from '../types';\n\n// ---- Activity icon mapping ----\nconst activityIconMap: Record<RecentActivity['type'], typeof Eye> = {\n property_listed: Home,\n transaction_update: FileText,\n payment_received: DollarSign,\n maintenance_request: Building,\n viewing_scheduled: Eye,\n document_uploaded: FileText,\n offer_received: TrendingUp,\n lease_signed: FileText,\n};\n\nconst activityColorMap: Record<RecentActivity['type'], string> = {\n property_listed: 'text-accent-purple',\n transaction_update: 'text-status-info-text',\n payment_received: 'text-status-success-text',\n maintenance_request: 'text-status-warning-text',\n viewing_scheduled: 'text-status-info-text',\n document_uploaded: 'text-status-info-text',\n offer_received: 'text-status-success-text',\n lease_signed: 'text-accent-teal',\n};\n\nexport const HomePage = () => {\n const navigate = useNavigate();\n const { t } = useI18n();\n const { data: stats } = useDashboardStats();\n const { data: activities } = useRecentActivities();\n const { data: properties } = useProperties();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const quickActions = [\n {\n title: tr('housingvista.home.quickActions.addProperty.title', 'Add Property'),\n description: tr('housingvista.home.quickActions.addProperty.description', 'List a new property'),\n icon: Plus,\n path: 'properties/new',\n },\n {\n title: tr('housingvista.home.quickActions.viewAnalytics.title', 'View Analytics'),\n description: tr('housingvista.home.quickActions.viewAnalytics.description', 'Check performance metrics'),\n icon: BarChart3,\n path: 'analytics',\n },\n {\n title: tr('housingvista.home.quickActions.manageTransactions.title', 'Manage Transactions'),\n description: tr('housingvista.home.quickActions.manageTransactions.description', 'Handle ongoing deals'),\n icon: FileText,\n path: 'transactions',\n },\n {\n title: tr('housingvista.home.quickActions.browseProperties.title', 'Browse Properties'),\n description: tr('housingvista.home.quickActions.browseProperties.description', 'Explore listings'),\n icon: Building,\n path: 'properties',\n },\n ];\n\n const recentProperties = useMemo(() => properties.slice(0, 6), [properties]);\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Welcome Header — Boff UI 2.0 aurora hero (one per MFE) */}\n <div className=\"relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold text-text-primary\">\n <GradientText>{tr('housingvista.home.header.title', 'Welcome back!')}</GradientText>\n </h1>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'housingvista.home.header.description',\n \"Here's what's happening with your real estate portfolio today.\"\n )}\n </p>\n </div>\n <Button onClick={() => navigate('properties/new')} className=\"gap-2 self-start lg:self-auto\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n {tr(\n 'housingvista.home.purpose',\n 'Your real-estate command center. See your portfolio at a glance, jump to the things you do most, and pick up where you left off — from listing a property to tracking deals and analytics.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-home\"\n steps={[\n {\n id: 'add-property',\n label: tr('housingvista.home.nextSteps.addProperty', 'List your first property'),\n description: tr(\n 'housingvista.home.nextSteps.addPropertyDesc',\n 'Create a market-ready listing in a few guided steps.'\n ),\n onClick: () => navigate('properties/new'),\n },\n {\n id: 'browse',\n label: tr('housingvista.home.nextSteps.browse', 'Browse properties'),\n description: tr(\n 'housingvista.home.nextSteps.browseDesc',\n 'Explore listings and open one for full details.'\n ),\n onClick: () => navigate('properties'),\n },\n {\n id: 'analytics',\n label: tr('housingvista.home.nextSteps.analytics', 'Review your analytics'),\n description: tr(\n 'housingvista.home.nextSteps.analyticsDesc',\n 'Check portfolio performance and market insights.'\n ),\n onClick: () => navigate('analytics'),\n },\n ]}\n />\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label={tr('housingvista.home.stats.totalProperties', 'Total Properties')}\n value={stats.totalProperties}\n icon={<Building className=\"h-5 w-5\" />}\n featured\n />\n <StatCard\n label={tr('housingvista.home.stats.activeListings', 'Active Listings')}\n value={stats.activeTransactions}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.upcomingViewings', 'Upcoming Viewings')}\n value={stats.upcomingViewings}\n icon={<Eye className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.monthlyRevenue', 'Monthly Revenue')}\n value={stats.monthlyRevenue}\n prefix=\"$\"\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n </div>\n\n {/* Recent Activity + Quick Actions */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Activity — primary insight zone (one EmphasisPanel per page) */}\n <div className=\"lg:col-span-2\">\n <EmphasisPanel className=\"p-0\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentActivity.title', 'Recent Activity')}\n </h2>\n </div>\n <div className=\"p-5\">\n {activities.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <div className=\"rounded-full bg-bg-sunken p-3\">\n <Clock className=\"h-6 w-6 text-text-secondary\" />\n </div>\n <p className=\"text-sm font-medium text-text-primary\">No activity yet</p>\n <p className=\"max-w-xs text-xs text-text-secondary\">\n As you list properties, book viewings, and close deals, your latest updates appear here.\n </p>\n </div>\n ) : (\n <ol className=\"relative space-y-5\">\n {/* Connecting rail */}\n <span aria-hidden className=\"absolute bottom-2 left-[18px] top-2 w-px bg-border-seam\" />\n {activities.slice(0, 6).map((activity) => {\n const Icon = activityIconMap[activity.type] ?? Eye;\n const colorClass = activityColorMap[activity.type] ?? 'text-text-secondary';\n return (\n <li key={activity.id} className=\"relative flex items-start gap-4\">\n <span\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1',\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{activity.title}</p>\n <p className=\"shrink-0 text-xs text-text-secondary\">\n {getRelativeTime(activity.timestamp)}\n </p>\n </div>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.description}</p>\n {activity.actorName && (\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.actorName}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <div className=\"lg:col-span-1\">\n <GlassCard treatment=\"plain\" className=\"h-full border-border-seam\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Zap className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.quickActions.title', 'Quick Actions')}\n </h2>\n </div>\n <div className=\"space-y-2 p-4\">\n {quickActions.map((action, index) => {\n const Icon = action.icon;\n const accent = index % 2 === 0 ? 'text-accent-teal' : 'text-accent-blue';\n return (\n <button\n key={action.title}\n onClick={() => navigate(action.path)}\n className=\"group/action flex min-h-[44px] w-full items-center gap-3 rounded-lg border border-border-seam p-3 text-left transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className={cn('rounded-lg bg-bg-sunken p-2', accent)}>\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-text-primary\">{action.title}</div>\n <div className=\"text-xs text-text-secondary\">{action.description}</div>\n </div>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100\" />\n </button>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </div>\n\n {/* Recent Properties */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <div className=\"flex items-center justify-between border-b border-border-seam px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentProperties.title', 'Recent Properties')}\n </h2>\n <button\n onClick={() => navigate('properties')}\n className=\"inline-flex min-h-[44px] items-center gap-1 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded-md px-1\"\n >\n {tr('housingvista.home.recentProperties.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {recentProperties.length === 0 ? (\n <div className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('housingvista.home.recentProperties.empty.title', 'No properties yet')}\n description={tr(\n 'housingvista.home.recentProperties.empty.description',\n 'List your first property to see it appear here.'\n )}\n action={\n <Button onClick={() => navigate('properties/new')} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n }\n />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3\">\n {recentProperties.map((property) => (\n <PropertyCard\n key={property.id}\n id={property.id}\n title={property.title}\n price={property.price.amount}\n priceType={property.price.type === 'rent' ? 'rent' : 'sale'}\n pricePeriod={property.price.period}\n currency={property.price.currency}\n location={`${property.location.neighborhood}, ${property.location.city}`}\n bedrooms={property.specifications.bedrooms}\n bathrooms={property.specifications.bathrooms}\n area={property.specifications.totalArea}\n imageUrl={property.images[0]?.url}\n status={property.status.replace('_', ' ')}\n type={property.category}\n onClick={() => navigate(`properties/${property.id}`)}\n />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/housingvista/pages/HomePage.tsx"],"sourcesContent":["/**\n * HousingVista Dashboard / Home Page\n * Migrated from legacy housingvista-frontend dashboard.tsx\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GradientText,\n Button,\n GlassCard,\n EmphasisPanel,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Building,\n TrendingUp,\n Eye,\n DollarSign,\n Plus,\n BarChart3,\n FileText,\n Home,\n ArrowRight,\n Clock,\n Zap,\n} from 'lucide-react';\nimport { StatCard, PropertyCard } from '../components';\nimport { useDashboardStats, useRecentActivities, useProperties } from '../hooks';\nimport { useTrackPageView } from '../hooks/useHousingVistaAnalytics';\nimport { cn, getRelativeTime } from '../utils/helpers';\nimport type { RecentActivity } from '../types';\n\n// ---- Activity icon mapping ----\nconst activityIconMap: Record<RecentActivity['type'], typeof Eye> = {\n property_listed: Home,\n transaction_update: FileText,\n payment_received: DollarSign,\n maintenance_request: Building,\n viewing_scheduled: Eye,\n document_uploaded: FileText,\n offer_received: TrendingUp,\n lease_signed: FileText,\n};\n\nconst activityColorMap: Record<RecentActivity['type'], string> = {\n property_listed: 'text-accent-purple',\n transaction_update: 'text-status-info-text',\n payment_received: 'text-status-success-text',\n maintenance_request: 'text-status-warning-text',\n viewing_scheduled: 'text-status-info-text',\n document_uploaded: 'text-status-info-text',\n offer_received: 'text-status-success-text',\n lease_signed: 'text-accent-teal',\n};\n\nexport const HomePage = () => {\n const navigate = useNavigate();\n const { t } = useI18n();\n useTrackPageView('housingvista.dashboard.viewed');\n const { data: stats } = useDashboardStats();\n const { data: activities } = useRecentActivities();\n const { data: properties } = useProperties();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const quickActions = [\n {\n title: tr('housingvista.home.quickActions.addProperty.title', 'Add Property'),\n description: tr('housingvista.home.quickActions.addProperty.description', 'List a new property'),\n icon: Plus,\n path: 'properties/new',\n },\n {\n title: tr('housingvista.home.quickActions.viewAnalytics.title', 'View Analytics'),\n description: tr('housingvista.home.quickActions.viewAnalytics.description', 'Check performance metrics'),\n icon: BarChart3,\n path: 'analytics',\n },\n {\n title: tr('housingvista.home.quickActions.manageTransactions.title', 'Manage Transactions'),\n description: tr('housingvista.home.quickActions.manageTransactions.description', 'Handle ongoing deals'),\n icon: FileText,\n path: 'transactions',\n },\n {\n title: tr('housingvista.home.quickActions.browseProperties.title', 'Browse Properties'),\n description: tr('housingvista.home.quickActions.browseProperties.description', 'Explore listings'),\n icon: Building,\n path: 'properties',\n },\n ];\n\n const recentProperties = useMemo(() => properties.slice(0, 6), [properties]);\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Welcome Header — Boff UI 2.0 aurora hero (one per MFE) */}\n <div className=\"relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold text-text-primary\">\n <GradientText>{tr('housingvista.home.header.title', 'Welcome back!')}</GradientText>\n </h1>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'housingvista.home.header.description',\n \"Here's what's happening with your real estate portfolio today.\"\n )}\n </p>\n </div>\n <Button onClick={() => navigate('properties/new')} className=\"gap-2 self-start lg:self-auto\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n {tr(\n 'housingvista.home.purpose',\n 'Your real-estate command center. See your portfolio at a glance, jump to the things you do most, and pick up where you left off — from listing a property to tracking deals and analytics.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-home\"\n steps={[\n {\n id: 'add-property',\n label: tr('housingvista.home.nextSteps.addProperty', 'List your first property'),\n description: tr(\n 'housingvista.home.nextSteps.addPropertyDesc',\n 'Create a market-ready listing in a few guided steps.'\n ),\n onClick: () => navigate('properties/new'),\n },\n {\n id: 'browse',\n label: tr('housingvista.home.nextSteps.browse', 'Browse properties'),\n description: tr(\n 'housingvista.home.nextSteps.browseDesc',\n 'Explore listings and open one for full details.'\n ),\n onClick: () => navigate('properties'),\n },\n {\n id: 'analytics',\n label: tr('housingvista.home.nextSteps.analytics', 'Review your analytics'),\n description: tr(\n 'housingvista.home.nextSteps.analyticsDesc',\n 'Check portfolio performance and market insights.'\n ),\n onClick: () => navigate('analytics'),\n },\n ]}\n />\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label={tr('housingvista.home.stats.totalProperties', 'Total Properties')}\n value={stats.totalProperties}\n icon={<Building className=\"h-5 w-5\" />}\n featured\n />\n <StatCard\n label={tr('housingvista.home.stats.activeListings', 'Active Listings')}\n value={stats.activeTransactions}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.upcomingViewings', 'Upcoming Viewings')}\n value={stats.upcomingViewings}\n icon={<Eye className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.monthlyRevenue', 'Monthly Revenue')}\n value={stats.monthlyRevenue}\n prefix=\"$\"\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n </div>\n\n {/* Recent Activity + Quick Actions */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Activity — primary insight zone (one EmphasisPanel per page) */}\n <div className=\"lg:col-span-2\">\n <EmphasisPanel className=\"p-0\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentActivity.title', 'Recent Activity')}\n </h2>\n </div>\n <div className=\"p-5\">\n {activities.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <div className=\"rounded-full bg-bg-sunken p-3\">\n <Clock className=\"h-6 w-6 text-text-secondary\" />\n </div>\n <p className=\"text-sm font-medium text-text-primary\">No activity yet</p>\n <p className=\"max-w-xs text-xs text-text-secondary\">\n As you list properties, book viewings, and close deals, your latest updates appear here.\n </p>\n </div>\n ) : (\n <ol className=\"relative space-y-5\">\n {/* Connecting rail */}\n <span aria-hidden className=\"absolute bottom-2 left-[18px] top-2 w-px bg-border-seam\" />\n {activities.slice(0, 6).map((activity) => {\n const Icon = activityIconMap[activity.type] ?? Eye;\n const colorClass = activityColorMap[activity.type] ?? 'text-text-secondary';\n return (\n <li key={activity.id} className=\"relative flex items-start gap-4\">\n <span\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1',\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{activity.title}</p>\n <p className=\"shrink-0 text-xs text-text-secondary\">\n {getRelativeTime(activity.timestamp)}\n </p>\n </div>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.description}</p>\n {activity.actorName && (\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.actorName}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <div className=\"lg:col-span-1\">\n <GlassCard treatment=\"plain\" className=\"h-full border-border-seam\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Zap className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.quickActions.title', 'Quick Actions')}\n </h2>\n </div>\n <div className=\"space-y-2 p-4\">\n {quickActions.map((action, index) => {\n const Icon = action.icon;\n const accent = index % 2 === 0 ? 'text-accent-teal' : 'text-accent-blue';\n return (\n <button\n key={action.title}\n onClick={() => navigate(action.path)}\n className=\"group/action flex min-h-[44px] w-full items-center gap-3 rounded-lg border border-border-seam p-3 text-left transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className={cn('rounded-lg bg-bg-sunken p-2', accent)}>\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-text-primary\">{action.title}</div>\n <div className=\"text-xs text-text-secondary\">{action.description}</div>\n </div>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100\" />\n </button>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </div>\n\n {/* Recent Properties */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <div className=\"flex items-center justify-between border-b border-border-seam px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentProperties.title', 'Recent Properties')}\n </h2>\n <button\n onClick={() => navigate('properties')}\n className=\"inline-flex min-h-[44px] items-center gap-1 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded-md px-1\"\n >\n {tr('housingvista.home.recentProperties.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {recentProperties.length === 0 ? (\n <div className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('housingvista.home.recentProperties.empty.title', 'No properties yet')}\n description={tr(\n 'housingvista.home.recentProperties.empty.description',\n 'List your first property to see it appear here.'\n )}\n action={\n <Button onClick={() => navigate('properties/new')} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n }\n />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3\">\n {recentProperties.map((property) => (\n <PropertyCard\n key={property.id}\n id={property.id}\n title={property.title}\n price={property.price.amount}\n priceType={property.price.type === 'rent' ? 'rent' : 'sale'}\n pricePeriod={property.price.period}\n currency={property.price.currency}\n location={`${property.location.neighborhood}, ${property.location.city}`}\n bedrooms={property.specifications.bedrooms}\n bathrooms={property.specifications.bathrooms}\n area={property.specifications.totalArea}\n imageUrl={property.images[0]?.url}\n status={property.status.replace('_', ' ')}\n type={property.category}\n onClick={() => navigate(`properties/${property.id}`)}\n />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
|