@burdenoff/microfe-housingvista 2026.827.1 → 2026.830.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/pages/HomePage.js +140 -142
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.d.ts.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.js +325 -327
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +153 -155
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/shared/hooks/index.d.ts +2 -0
- package/dist/shared/hooks/index.d.ts.map +1 -0
- package/dist/shared/hooks/index.js +1 -0
- package/dist/shared/hooks/useTr.d.ts +17 -0
- package/dist/shared/hooks/useTr.d.ts.map +1 -0
- package/dist/shared/hooks/useTr.js +14 -0
- package/dist/shared/hooks/useTr.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,25 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
|
+
import "../../shared/hooks/index.js";
|
|
3
|
+
import { cn as t, getRelativeTime as n } from "../utils/helpers.js";
|
|
4
|
+
import { StatCard as r } from "../components/StatCard.js";
|
|
5
|
+
import { PropertyCard as i } from "../components/PropertyCard.js";
|
|
6
|
+
import { useTrackPageView as a } from "../hooks/useHousingVistaAnalytics.js";
|
|
7
|
+
import { useDashboardStats as o, useProperties as s, useRecentActivities as c } from "../hooks/index.js";
|
|
6
8
|
import "../components/index.js";
|
|
7
|
-
import { useMemo as
|
|
8
|
-
import { ArrowRight as
|
|
9
|
-
import { useNavigate as
|
|
10
|
-
import { jsx as
|
|
11
|
-
import { useI18n as C } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
9
|
+
import { useMemo as l } from "react";
|
|
10
|
+
import { ArrowRight as u, BarChart3 as d, Building as f, Clock as p, DollarSign as m, Eye as h, FileText as g, Home as _, Plus as v, TrendingUp as y, Zap as b } from "lucide-react";
|
|
11
|
+
import { useNavigate as x } from "react-router";
|
|
12
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
12
13
|
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";
|
|
13
14
|
//#region src/housingvista/pages/HomePage.tsx
|
|
14
15
|
var M = {
|
|
15
|
-
property_listed:
|
|
16
|
-
transaction_update:
|
|
17
|
-
payment_received:
|
|
18
|
-
maintenance_request:
|
|
19
|
-
viewing_scheduled:
|
|
20
|
-
document_uploaded:
|
|
21
|
-
offer_received:
|
|
22
|
-
lease_signed:
|
|
16
|
+
property_listed: _,
|
|
17
|
+
transaction_update: g,
|
|
18
|
+
payment_received: m,
|
|
19
|
+
maintenance_request: f,
|
|
20
|
+
viewing_scheduled: h,
|
|
21
|
+
document_uploaded: g,
|
|
22
|
+
offer_received: y,
|
|
23
|
+
lease_signed: g
|
|
23
24
|
}, N = {
|
|
24
25
|
property_listed: "text-accent-purple",
|
|
25
26
|
transaction_update: "text-status-info-text",
|
|
@@ -30,253 +31,250 @@ var M = {
|
|
|
30
31
|
offer_received: "text-status-success-text",
|
|
31
32
|
lease_signed: "text-accent-teal"
|
|
32
33
|
}, P = () => {
|
|
33
|
-
let
|
|
34
|
-
|
|
35
|
-
let { data: F } =
|
|
36
|
-
let n = P(e);
|
|
37
|
-
return n === e ? t : n;
|
|
38
|
-
}, z = [
|
|
34
|
+
let _ = x(), P = e();
|
|
35
|
+
a("housingvista.dashboard.viewed");
|
|
36
|
+
let { data: F } = o(), { data: I } = c(), { data: L } = s(), R = [
|
|
39
37
|
{
|
|
40
|
-
title:
|
|
41
|
-
description:
|
|
42
|
-
icon:
|
|
38
|
+
title: P("housingvista.home.quickActions.addProperty.title", "Add Property"),
|
|
39
|
+
description: P("housingvista.home.quickActions.addProperty.description", "List a new property"),
|
|
40
|
+
icon: v,
|
|
43
41
|
path: "properties/new"
|
|
44
42
|
},
|
|
45
43
|
{
|
|
46
|
-
title:
|
|
47
|
-
description:
|
|
48
|
-
icon:
|
|
44
|
+
title: P("housingvista.home.quickActions.viewAnalytics.title", "View Analytics"),
|
|
45
|
+
description: P("housingvista.home.quickActions.viewAnalytics.description", "Check performance metrics"),
|
|
46
|
+
icon: d,
|
|
49
47
|
path: "analytics"
|
|
50
48
|
},
|
|
51
49
|
{
|
|
52
|
-
title:
|
|
53
|
-
description:
|
|
54
|
-
icon:
|
|
50
|
+
title: P("housingvista.home.quickActions.manageTransactions.title", "Manage Transactions"),
|
|
51
|
+
description: P("housingvista.home.quickActions.manageTransactions.description", "Handle ongoing deals"),
|
|
52
|
+
icon: g,
|
|
55
53
|
path: "transactions"
|
|
56
54
|
},
|
|
57
55
|
{
|
|
58
|
-
title:
|
|
59
|
-
description:
|
|
60
|
-
icon:
|
|
56
|
+
title: P("housingvista.home.quickActions.browseProperties.title", "Browse Properties"),
|
|
57
|
+
description: P("housingvista.home.quickActions.browseProperties.description", "Explore listings"),
|
|
58
|
+
icon: f,
|
|
61
59
|
path: "properties"
|
|
62
60
|
}
|
|
63
|
-
],
|
|
64
|
-
return /* @__PURE__ */
|
|
61
|
+
], z = l(() => L.slice(0, 6), [L]);
|
|
62
|
+
return /* @__PURE__ */ C("div", {
|
|
65
63
|
className: "space-y-6 p-6",
|
|
66
64
|
children: [
|
|
67
|
-
/* @__PURE__ */
|
|
65
|
+
/* @__PURE__ */ C("div", {
|
|
68
66
|
className: "relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop",
|
|
69
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ S(w, { intensity: "subtle" }), /* @__PURE__ */ C("div", {
|
|
70
68
|
className: "relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between",
|
|
71
|
-
children: [/* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("h1", {
|
|
72
70
|
className: "text-3xl font-bold text-text-primary",
|
|
73
|
-
children: /* @__PURE__ */
|
|
74
|
-
}), /* @__PURE__ */
|
|
71
|
+
children: /* @__PURE__ */ S(O, { children: P("housingvista.home.header.title", "Welcome back!") })
|
|
72
|
+
}), /* @__PURE__ */ S("p", {
|
|
75
73
|
className: "mt-1 text-text-secondary",
|
|
76
|
-
children:
|
|
77
|
-
})] }), /* @__PURE__ */
|
|
78
|
-
onClick: () =>
|
|
74
|
+
children: P("housingvista.home.header.description", "Here's what's happening with your real estate portfolio today.")
|
|
75
|
+
})] }), /* @__PURE__ */ C(T, {
|
|
76
|
+
onClick: () => _("properties/new"),
|
|
79
77
|
className: "gap-2 self-start lg:self-auto",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ S(v, { className: "h-4 w-4" }), P("housingvista.home.header.quickAdd", "Quick Add")]
|
|
81
79
|
})]
|
|
82
80
|
})]
|
|
83
81
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ S(j, {
|
|
85
83
|
className: "max-w-3xl",
|
|
86
|
-
children:
|
|
84
|
+
children: P("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.")
|
|
87
85
|
}),
|
|
88
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ S(A, {
|
|
89
87
|
storageKey: "housingvista-home",
|
|
90
88
|
steps: [
|
|
91
89
|
{
|
|
92
90
|
id: "add-property",
|
|
93
|
-
label:
|
|
94
|
-
description:
|
|
95
|
-
onClick: () =>
|
|
91
|
+
label: P("housingvista.home.nextSteps.addProperty", "List your first property"),
|
|
92
|
+
description: P("housingvista.home.nextSteps.addPropertyDesc", "Create a market-ready listing in a few guided steps."),
|
|
93
|
+
onClick: () => _("properties/new")
|
|
96
94
|
},
|
|
97
95
|
{
|
|
98
96
|
id: "browse",
|
|
99
|
-
label:
|
|
100
|
-
description:
|
|
101
|
-
onClick: () =>
|
|
97
|
+
label: P("housingvista.home.nextSteps.browse", "Browse properties"),
|
|
98
|
+
description: P("housingvista.home.nextSteps.browseDesc", "Explore listings and open one for full details."),
|
|
99
|
+
onClick: () => _("properties")
|
|
102
100
|
},
|
|
103
101
|
{
|
|
104
102
|
id: "analytics",
|
|
105
|
-
label:
|
|
106
|
-
description:
|
|
107
|
-
onClick: () =>
|
|
103
|
+
label: P("housingvista.home.nextSteps.analytics", "Review your analytics"),
|
|
104
|
+
description: P("housingvista.home.nextSteps.analyticsDesc", "Check portfolio performance and market insights."),
|
|
105
|
+
onClick: () => _("analytics")
|
|
108
106
|
}
|
|
109
107
|
]
|
|
110
108
|
}),
|
|
111
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ C("div", {
|
|
112
110
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
113
111
|
children: [
|
|
114
|
-
/* @__PURE__ */
|
|
115
|
-
label:
|
|
112
|
+
/* @__PURE__ */ S(r, {
|
|
113
|
+
label: P("housingvista.home.stats.totalProperties", "Total Properties"),
|
|
116
114
|
value: F.totalProperties,
|
|
117
|
-
icon: /* @__PURE__ */
|
|
115
|
+
icon: /* @__PURE__ */ S(f, { className: "h-5 w-5" }),
|
|
118
116
|
trendData: F.trends.totalProperties,
|
|
119
117
|
featured: !0
|
|
120
118
|
}),
|
|
121
|
-
/* @__PURE__ */
|
|
122
|
-
label:
|
|
119
|
+
/* @__PURE__ */ S(r, {
|
|
120
|
+
label: P("housingvista.home.stats.activeListings", "Active Listings"),
|
|
123
121
|
value: F.activeTransactions,
|
|
124
|
-
icon: /* @__PURE__ */
|
|
122
|
+
icon: /* @__PURE__ */ S(y, { className: "h-5 w-5" }),
|
|
125
123
|
trendData: F.trends.activeTransactions
|
|
126
124
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
128
|
-
label:
|
|
125
|
+
/* @__PURE__ */ S(r, {
|
|
126
|
+
label: P("housingvista.home.stats.upcomingViewings", "Upcoming Viewings"),
|
|
129
127
|
value: F.upcomingViewings,
|
|
130
|
-
icon: /* @__PURE__ */
|
|
128
|
+
icon: /* @__PURE__ */ S(h, { className: "h-5 w-5" })
|
|
131
129
|
}),
|
|
132
|
-
/* @__PURE__ */
|
|
133
|
-
label:
|
|
130
|
+
/* @__PURE__ */ S(r, {
|
|
131
|
+
label: P("housingvista.home.stats.monthlyRevenue", "Monthly Revenue"),
|
|
134
132
|
value: F.monthlyRevenue,
|
|
135
133
|
prefix: "$",
|
|
136
|
-
icon: /* @__PURE__ */
|
|
134
|
+
icon: /* @__PURE__ */ S(m, { className: "h-5 w-5" }),
|
|
137
135
|
trendData: F.trends.monthlyRevenue
|
|
138
136
|
})
|
|
139
137
|
]
|
|
140
138
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ C("div", {
|
|
142
140
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
143
|
-
children: [/* @__PURE__ */
|
|
141
|
+
children: [/* @__PURE__ */ S("div", {
|
|
144
142
|
className: "lg:col-span-2",
|
|
145
|
-
children: /* @__PURE__ */
|
|
143
|
+
children: /* @__PURE__ */ C(E, {
|
|
146
144
|
className: "p-0",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
145
|
+
children: [/* @__PURE__ */ C("div", {
|
|
148
146
|
className: "flex items-center gap-2 border-b border-border-seam px-5 py-4",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ S(p, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S("h2", {
|
|
150
148
|
className: "text-base font-semibold text-text-primary",
|
|
151
|
-
children:
|
|
149
|
+
children: P("housingvista.home.recentActivity.title", "Recent Activity")
|
|
152
150
|
})]
|
|
153
|
-
}), /* @__PURE__ */
|
|
151
|
+
}), /* @__PURE__ */ S("div", {
|
|
154
152
|
className: "p-5",
|
|
155
|
-
children: I.length === 0 ? /* @__PURE__ */
|
|
153
|
+
children: I.length === 0 ? /* @__PURE__ */ C("div", {
|
|
156
154
|
className: "flex flex-col items-center gap-2 py-8 text-center",
|
|
157
155
|
children: [
|
|
158
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ S("div", {
|
|
159
157
|
className: "rounded-full bg-bg-sunken p-3",
|
|
160
|
-
children: /* @__PURE__ */
|
|
158
|
+
children: /* @__PURE__ */ S(p, { className: "h-6 w-6 text-text-secondary" })
|
|
161
159
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ S("p", {
|
|
163
161
|
className: "text-sm font-medium text-text-primary",
|
|
164
|
-
children: "No activity yet"
|
|
162
|
+
children: P("housingvista.home.recentActivity.empty.title", "No activity yet")
|
|
165
163
|
}),
|
|
166
|
-
/* @__PURE__ */
|
|
164
|
+
/* @__PURE__ */ S("p", {
|
|
167
165
|
className: "max-w-xs text-xs text-text-secondary",
|
|
168
|
-
children: "As you list properties, book viewings, and close deals, your latest updates appear here."
|
|
166
|
+
children: P("housingvista.home.recentActivity.empty.description", "As you list properties, book viewings, and close deals, your latest updates appear here.")
|
|
169
167
|
})
|
|
170
168
|
]
|
|
171
|
-
}) : /* @__PURE__ */
|
|
169
|
+
}) : /* @__PURE__ */ C("ol", {
|
|
172
170
|
className: "relative space-y-5",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
171
|
+
children: [/* @__PURE__ */ S("span", {
|
|
174
172
|
"aria-hidden": !0,
|
|
175
173
|
className: "absolute bottom-2 left-[18px] top-2 w-px bg-border-seam"
|
|
176
|
-
}), I.slice(0, 6).map((
|
|
177
|
-
let r = M[
|
|
178
|
-
return /* @__PURE__ */
|
|
174
|
+
}), I.slice(0, 6).map((e) => {
|
|
175
|
+
let r = M[e.type] ?? h;
|
|
176
|
+
return /* @__PURE__ */ C("li", {
|
|
179
177
|
className: "relative flex items-start gap-4",
|
|
180
|
-
children: [/* @__PURE__ */
|
|
181
|
-
className:
|
|
182
|
-
children: /* @__PURE__ */
|
|
183
|
-
}), /* @__PURE__ */
|
|
178
|
+
children: [/* @__PURE__ */ S("span", {
|
|
179
|
+
className: t("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[e.type] ?? "text-text-secondary"),
|
|
180
|
+
children: /* @__PURE__ */ S(r, { className: "h-4 w-4" })
|
|
181
|
+
}), /* @__PURE__ */ C("div", {
|
|
184
182
|
className: "min-w-0 flex-1 pt-0.5",
|
|
185
183
|
children: [
|
|
186
|
-
/* @__PURE__ */
|
|
184
|
+
/* @__PURE__ */ C("div", {
|
|
187
185
|
className: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5",
|
|
188
|
-
children: [/* @__PURE__ */
|
|
186
|
+
children: [/* @__PURE__ */ S("p", {
|
|
189
187
|
className: "text-sm font-medium text-text-primary",
|
|
190
|
-
children:
|
|
191
|
-
}), /* @__PURE__ */
|
|
188
|
+
children: e.title
|
|
189
|
+
}), /* @__PURE__ */ S("p", {
|
|
192
190
|
className: "shrink-0 text-xs text-text-secondary",
|
|
193
|
-
children:
|
|
191
|
+
children: n(e.timestamp)
|
|
194
192
|
})]
|
|
195
193
|
}),
|
|
196
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ S("p", {
|
|
197
195
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
198
|
-
children:
|
|
196
|
+
children: e.description
|
|
199
197
|
}),
|
|
200
|
-
|
|
198
|
+
e.actorName && /* @__PURE__ */ S("p", {
|
|
201
199
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
202
|
-
children:
|
|
200
|
+
children: e.actorName
|
|
203
201
|
})
|
|
204
202
|
]
|
|
205
203
|
})]
|
|
206
|
-
},
|
|
204
|
+
}, e.id);
|
|
207
205
|
})]
|
|
208
206
|
})
|
|
209
207
|
})]
|
|
210
208
|
})
|
|
211
|
-
}), /* @__PURE__ */
|
|
209
|
+
}), /* @__PURE__ */ S("div", {
|
|
212
210
|
className: "lg:col-span-1",
|
|
213
|
-
children: /* @__PURE__ */
|
|
211
|
+
children: /* @__PURE__ */ C(D, {
|
|
214
212
|
treatment: "plain",
|
|
215
213
|
className: "h-full border-border-seam",
|
|
216
|
-
children: [/* @__PURE__ */
|
|
214
|
+
children: [/* @__PURE__ */ C("div", {
|
|
217
215
|
className: "flex items-center gap-2 border-b border-border-seam px-5 py-4",
|
|
218
|
-
children: [/* @__PURE__ */
|
|
216
|
+
children: [/* @__PURE__ */ S(b, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S("h2", {
|
|
219
217
|
className: "text-base font-semibold text-text-primary",
|
|
220
|
-
children:
|
|
218
|
+
children: P("housingvista.home.quickActions.title", "Quick Actions")
|
|
221
219
|
})]
|
|
222
|
-
}), /* @__PURE__ */
|
|
220
|
+
}), /* @__PURE__ */ S("div", {
|
|
223
221
|
className: "space-y-2 p-4",
|
|
224
|
-
children:
|
|
225
|
-
let r =
|
|
226
|
-
return /* @__PURE__ */
|
|
227
|
-
onClick: () =>
|
|
222
|
+
children: R.map((e, n) => {
|
|
223
|
+
let r = e.icon;
|
|
224
|
+
return /* @__PURE__ */ C("button", {
|
|
225
|
+
onClick: () => _(e.path),
|
|
228
226
|
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)]",
|
|
229
227
|
children: [
|
|
230
|
-
/* @__PURE__ */ x("div", {
|
|
231
|
-
className: e("rounded-lg bg-bg-sunken p-2", n % 2 == 0 ? "text-accent-teal" : "text-accent-blue"),
|
|
232
|
-
children: /* @__PURE__ */ x(r, { className: "h-5 w-5" })
|
|
233
|
-
}),
|
|
234
228
|
/* @__PURE__ */ S("div", {
|
|
229
|
+
className: t("rounded-lg bg-bg-sunken p-2", n % 2 == 0 ? "text-accent-teal" : "text-accent-blue"),
|
|
230
|
+
children: /* @__PURE__ */ S(r, { className: "h-5 w-5" })
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ C("div", {
|
|
235
233
|
className: "min-w-0 flex-1",
|
|
236
|
-
children: [/* @__PURE__ */
|
|
234
|
+
children: [/* @__PURE__ */ S("div", {
|
|
237
235
|
className: "text-sm font-medium text-text-primary",
|
|
238
|
-
children:
|
|
239
|
-
}), /* @__PURE__ */
|
|
236
|
+
children: e.title
|
|
237
|
+
}), /* @__PURE__ */ S("div", {
|
|
240
238
|
className: "text-xs text-text-secondary",
|
|
241
|
-
children:
|
|
239
|
+
children: e.description
|
|
242
240
|
})]
|
|
243
241
|
}),
|
|
244
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ S(u, { className: "h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100" })
|
|
245
243
|
]
|
|
246
|
-
},
|
|
244
|
+
}, e.title);
|
|
247
245
|
})
|
|
248
246
|
})]
|
|
249
247
|
})
|
|
250
248
|
})]
|
|
251
249
|
}),
|
|
252
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ C(D, {
|
|
253
251
|
treatment: "plain",
|
|
254
252
|
className: "border-border-seam",
|
|
255
|
-
children: [/* @__PURE__ */
|
|
253
|
+
children: [/* @__PURE__ */ C("div", {
|
|
256
254
|
className: "flex items-center justify-between border-b border-border-seam px-5 py-4",
|
|
257
|
-
children: [/* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ S("h2", {
|
|
258
256
|
className: "text-base font-semibold text-text-primary",
|
|
259
|
-
children:
|
|
260
|
-
}), /* @__PURE__ */
|
|
261
|
-
onClick: () =>
|
|
257
|
+
children: P("housingvista.home.recentProperties.title", "Recent Properties")
|
|
258
|
+
}), /* @__PURE__ */ C("button", {
|
|
259
|
+
onClick: () => _("properties"),
|
|
262
260
|
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",
|
|
263
|
-
children: [
|
|
261
|
+
children: [P("housingvista.home.recentProperties.viewAll", "View All"), /* @__PURE__ */ S(u, { className: "h-4 w-4" })]
|
|
264
262
|
})]
|
|
265
|
-
}),
|
|
263
|
+
}), z.length === 0 ? /* @__PURE__ */ S("div", {
|
|
266
264
|
className: "p-4",
|
|
267
|
-
children: /* @__PURE__ */
|
|
265
|
+
children: /* @__PURE__ */ S(k, {
|
|
268
266
|
illustration: "empty-data",
|
|
269
|
-
title:
|
|
270
|
-
description:
|
|
271
|
-
action: /* @__PURE__ */
|
|
272
|
-
onClick: () =>
|
|
267
|
+
title: P("housingvista.home.recentProperties.empty.title", "No properties yet"),
|
|
268
|
+
description: P("housingvista.home.recentProperties.empty.description", "List your first property to see it appear here."),
|
|
269
|
+
action: /* @__PURE__ */ C(T, {
|
|
270
|
+
onClick: () => _("properties/new"),
|
|
273
271
|
className: "gap-2",
|
|
274
|
-
children: [/* @__PURE__ */
|
|
272
|
+
children: [/* @__PURE__ */ S(v, { className: "h-4 w-4" }), P("housingvista.home.header.quickAdd", "Quick Add")]
|
|
275
273
|
})
|
|
276
274
|
})
|
|
277
|
-
}) : /* @__PURE__ */
|
|
275
|
+
}) : /* @__PURE__ */ S("div", {
|
|
278
276
|
className: "grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
279
|
-
children:
|
|
277
|
+
children: z.map((e) => /* @__PURE__ */ S(i, {
|
|
280
278
|
id: e.id,
|
|
281
279
|
title: e.title,
|
|
282
280
|
price: e.price.amount,
|
|
@@ -290,7 +288,7 @@ var M = {
|
|
|
290
288
|
imageUrl: e.images[0]?.url,
|
|
291
289
|
status: e.status.replace("_", " "),
|
|
292
290
|
type: e.category,
|
|
293
|
-
onClick: () =>
|
|
291
|
+
onClick: () => _(`properties/${e.id}`),
|
|
294
292
|
reraStatus: e.reraVerificationStatus
|
|
295
293
|
}, e.id))
|
|
296
294
|
})]
|
|
@@ -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';\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 trendData={stats.trends.totalProperties}\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 trendData={stats.trends.activeTransactions}\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 trendData={stats.trends.monthlyRevenue}\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 reraStatus={property.reraVerificationStatus}\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';\nimport { useTr } from '../../shared/hooks';\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 tr = useTr();\n useTrackPageView('housingvista.dashboard.viewed');\n const { data: stats } = useDashboardStats();\n const { data: activities } = useRecentActivities();\n const { data: properties } = useProperties();\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 trendData={stats.trends.totalProperties}\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 trendData={stats.trends.activeTransactions}\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 trendData={stats.trends.monthlyRevenue}\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\">\n {tr('housingvista.home.recentActivity.empty.title', 'No activity yet')}\n </p>\n <p className=\"max-w-xs text-xs text-text-secondary\">\n {tr(\n 'housingvista.home.recentActivity.empty.description',\n 'As you list properties, book viewings, and close deals, your latest updates appear here.'\n )}\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 reraStatus={property.reraVerificationStatus}\n />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PropertiesPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/properties/PropertiesPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA2CH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"PropertiesPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/properties/PropertiesPage.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AA2CH,eAAO,MAAM,cAAc,mCAu9B1B,CAAC"}
|