@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.
Files changed (27) hide show
  1. package/dist/generated/wspace-operations.js +67 -0
  2. package/dist/generated/wspace-operations.js.map +1 -0
  3. package/dist/housingvista/hooks/index.js +1 -0
  4. package/dist/housingvista/hooks/index.js.map +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +57 -0
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -0
  7. package/dist/housingvista/index.js +2 -0
  8. package/dist/housingvista/pages/HomePage.js +135 -132
  9. package/dist/housingvista/pages/HomePage.js.map +1 -1
  10. package/dist/housingvista/pages/analytics/AnalyticsPage.js +136 -134
  11. package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
  12. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  13. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  14. package/dist/housingvista/pages/properties/AddPropertyPage.js +279 -278
  15. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  16. package/dist/housingvista/pages/properties/PropertiesPage.js +93 -86
  17. package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
  18. package/dist/housingvista/pages/properties/PropertyDetailPage.js +514 -511
  19. package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
  20. package/dist/housingvista/services/assistantApi.js +222 -0
  21. package/dist/housingvista/services/assistantApi.js.map +1 -0
  22. package/dist/housingvista/services/createSandboxAssistantTransport.js +120 -0
  23. package/dist/housingvista/services/createSandboxAssistantTransport.js.map +1 -0
  24. package/dist/housingvista/utils/pageContext.js +77 -0
  25. package/dist/housingvista/utils/pageContext.js.map +1 -0
  26. package/dist/index.js +5 -3
  27. 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 { useDashboardStats as i, useProperties as a, useRecentActivities as o } from "../hooks/index.js";
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 s } from "react";
7
- import { ArrowRight as c, BarChart3 as l, Building as u, Clock as d, DollarSign as f, Eye as p, FileText as m, Home as h, Plus as g, TrendingUp as _, Zap as v } from "lucide-react";
8
- import { useNavigate as y } from "react-router-dom";
9
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
10
- import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
- import { AuroraBackground as C, Button as w, EmphasisPanel as T, GlassCard as E, GradientText as D, IllustratedEmptyState as O, NextSteps as k, PagePurpose as A } from "@burdenoff/fe-libs/ui";
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 j = {
14
- property_listed: h,
15
- transaction_update: m,
16
- payment_received: f,
17
- maintenance_request: u,
18
- viewing_scheduled: p,
19
- document_uploaded: m,
20
- offer_received: _,
21
- lease_signed: m
22
- }, M = {
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
- }, N = () => {
32
- let h = y(), { t: N } = S(), { data: P } = i(), { data: F } = o(), { data: I } = a(), L = (e, t) => {
33
- let n = N(e);
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
- }, R = [
38
+ }, z = [
36
39
  {
37
- title: L("housingvista.home.quickActions.addProperty.title", "Add Property"),
38
- description: L("housingvista.home.quickActions.addProperty.description", "List a new property"),
39
- icon: g,
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: L("housingvista.home.quickActions.viewAnalytics.title", "View Analytics"),
44
- description: L("housingvista.home.quickActions.viewAnalytics.description", "Check performance metrics"),
45
- icon: l,
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: L("housingvista.home.quickActions.manageTransactions.title", "Manage Transactions"),
50
- description: L("housingvista.home.quickActions.manageTransactions.description", "Handle ongoing deals"),
51
- icon: m,
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: L("housingvista.home.quickActions.browseProperties.title", "Browse Properties"),
56
- description: L("housingvista.home.quickActions.browseProperties.description", "Explore listings"),
57
- icon: u,
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
- ], z = s(() => I.slice(0, 6), [I]);
61
- return /* @__PURE__ */ x("div", {
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__ */ x("div", {
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__ */ b(C, { intensity: "subtle" }), /* @__PURE__ */ x("div", {
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__ */ x("div", { children: [/* @__PURE__ */ b("h1", {
71
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
69
72
  className: "text-3xl font-bold text-text-primary",
70
- children: /* @__PURE__ */ b(D, { children: L("housingvista.home.header.title", "Welcome back!") })
71
- }), /* @__PURE__ */ b("p", {
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: L("housingvista.home.header.description", "Here's what's happening with your real estate portfolio today.")
74
- })] }), /* @__PURE__ */ x(w, {
75
- onClick: () => h("properties/new"),
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__ */ b(g, { className: "h-4 w-4" }), L("housingvista.home.header.quickAdd", "Quick Add")]
80
+ children: [/* @__PURE__ */ x(_, { className: "h-4 w-4" }), R("housingvista.home.header.quickAdd", "Quick Add")]
78
81
  })]
79
82
  })]
80
83
  }),
81
- /* @__PURE__ */ b(A, {
84
+ /* @__PURE__ */ x(j, {
82
85
  className: "max-w-3xl",
83
- children: L("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.")
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__ */ b(k, {
88
+ /* @__PURE__ */ x(A, {
86
89
  storageKey: "housingvista-home",
87
90
  steps: [
88
91
  {
89
92
  id: "add-property",
90
- label: L("housingvista.home.nextSteps.addProperty", "List your first property"),
91
- description: L("housingvista.home.nextSteps.addPropertyDesc", "Create a market-ready listing in a few guided steps."),
92
- onClick: () => h("properties/new")
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: L("housingvista.home.nextSteps.browse", "Browse properties"),
97
- description: L("housingvista.home.nextSteps.browseDesc", "Explore listings and open one for full details."),
98
- onClick: () => h("properties")
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: L("housingvista.home.nextSteps.analytics", "Review your analytics"),
103
- description: L("housingvista.home.nextSteps.analyticsDesc", "Check portfolio performance and market insights."),
104
- onClick: () => h("analytics")
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__ */ x("div", {
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__ */ b(n, {
112
- label: L("housingvista.home.stats.totalProperties", "Total Properties"),
113
- value: P.totalProperties,
114
- icon: /* @__PURE__ */ b(u, { className: "h-5 w-5" }),
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__ */ b(n, {
118
- label: L("housingvista.home.stats.activeListings", "Active Listings"),
119
- value: P.activeTransactions,
120
- icon: /* @__PURE__ */ b(_, { className: "h-5 w-5" })
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__ */ b(n, {
123
- label: L("housingvista.home.stats.upcomingViewings", "Upcoming Viewings"),
124
- value: P.upcomingViewings,
125
- icon: /* @__PURE__ */ b(p, { className: "h-5 w-5" })
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__ */ b(n, {
128
- label: L("housingvista.home.stats.monthlyRevenue", "Monthly Revenue"),
129
- value: P.monthlyRevenue,
130
+ /* @__PURE__ */ x(n, {
131
+ label: R("housingvista.home.stats.monthlyRevenue", "Monthly Revenue"),
132
+ value: F.monthlyRevenue,
130
133
  prefix: "$",
131
- icon: /* @__PURE__ */ b(f, { className: "h-5 w-5" })
134
+ icon: /* @__PURE__ */ x(p, { className: "h-5 w-5" })
132
135
  })
133
136
  ]
134
137
  }),
135
- /* @__PURE__ */ x("div", {
138
+ /* @__PURE__ */ S("div", {
136
139
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
137
- children: [/* @__PURE__ */ b("div", {
140
+ children: [/* @__PURE__ */ x("div", {
138
141
  className: "lg:col-span-2",
139
- children: /* @__PURE__ */ x(T, {
142
+ children: /* @__PURE__ */ S(E, {
140
143
  className: "p-0",
141
- children: [/* @__PURE__ */ x("div", {
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__ */ b(d, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b("h2", {
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: L("housingvista.home.recentActivity.title", "Recent Activity")
148
+ children: R("housingvista.home.recentActivity.title", "Recent Activity")
146
149
  })]
147
- }), /* @__PURE__ */ b("div", {
150
+ }), /* @__PURE__ */ x("div", {
148
151
  className: "p-5",
149
- children: F.length === 0 ? /* @__PURE__ */ x("div", {
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__ */ b("div", {
155
+ /* @__PURE__ */ x("div", {
153
156
  className: "rounded-full bg-bg-sunken p-3",
154
- children: /* @__PURE__ */ b(d, { className: "h-6 w-6 text-text-secondary" })
157
+ children: /* @__PURE__ */ x(f, { className: "h-6 w-6 text-text-secondary" })
155
158
  }),
156
- /* @__PURE__ */ b("p", {
159
+ /* @__PURE__ */ x("p", {
157
160
  className: "text-sm font-medium text-text-primary",
158
161
  children: "No activity yet"
159
162
  }),
160
- /* @__PURE__ */ b("p", {
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__ */ x("ol", {
168
+ }) : /* @__PURE__ */ S("ol", {
166
169
  className: "relative space-y-5",
167
- children: [/* @__PURE__ */ b("span", {
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
- }), F.slice(0, 6).map((n) => {
171
- let r = j[n.type] ?? p;
172
- return /* @__PURE__ */ x("li", {
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__ */ b("span", {
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", M[n.type] ?? "text-text-secondary"),
176
- children: /* @__PURE__ */ b(r, { className: "h-4 w-4" })
177
- }), /* @__PURE__ */ x("div", {
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__ */ x("div", {
183
+ /* @__PURE__ */ S("div", {
181
184
  className: "flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5",
182
- children: [/* @__PURE__ */ b("p", {
185
+ children: [/* @__PURE__ */ x("p", {
183
186
  className: "text-sm font-medium text-text-primary",
184
187
  children: n.title
185
- }), /* @__PURE__ */ b("p", {
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__ */ b("p", {
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__ */ b("p", {
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__ */ b("div", {
208
+ }), /* @__PURE__ */ x("div", {
206
209
  className: "lg:col-span-1",
207
- children: /* @__PURE__ */ x(E, {
210
+ children: /* @__PURE__ */ S(D, {
208
211
  treatment: "plain",
209
212
  className: "h-full border-border-seam",
210
- children: [/* @__PURE__ */ x("div", {
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__ */ b(v, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b("h2", {
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: L("housingvista.home.quickActions.title", "Quick Actions")
217
+ children: R("housingvista.home.quickActions.title", "Quick Actions")
215
218
  })]
216
- }), /* @__PURE__ */ b("div", {
219
+ }), /* @__PURE__ */ x("div", {
217
220
  className: "space-y-2 p-4",
218
- children: R.map((t, n) => {
221
+ children: z.map((t, n) => {
219
222
  let r = t.icon;
220
- return /* @__PURE__ */ x("button", {
221
- onClick: () => h(t.path),
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__ */ b("div", {
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__ */ b(r, { className: "h-5 w-5" })
229
+ children: /* @__PURE__ */ x(r, { className: "h-5 w-5" })
227
230
  }),
228
- /* @__PURE__ */ x("div", {
231
+ /* @__PURE__ */ S("div", {
229
232
  className: "min-w-0 flex-1",
230
- children: [/* @__PURE__ */ b("div", {
233
+ children: [/* @__PURE__ */ x("div", {
231
234
  className: "text-sm font-medium text-text-primary",
232
235
  children: t.title
233
- }), /* @__PURE__ */ b("div", {
236
+ }), /* @__PURE__ */ x("div", {
234
237
  className: "text-xs text-text-secondary",
235
238
  children: t.description
236
239
  })]
237
240
  }),
238
- /* @__PURE__ */ b(c, { className: "h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100" })
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__ */ x(E, {
249
+ /* @__PURE__ */ S(D, {
247
250
  treatment: "plain",
248
251
  className: "border-border-seam",
249
- children: [/* @__PURE__ */ x("div", {
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__ */ b("h2", {
254
+ children: [/* @__PURE__ */ x("h2", {
252
255
  className: "text-base font-semibold text-text-primary",
253
- children: L("housingvista.home.recentProperties.title", "Recent Properties")
254
- }), /* @__PURE__ */ x("button", {
255
- onClick: () => h("properties"),
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: [L("housingvista.home.recentProperties.viewAll", "View All"), /* @__PURE__ */ b(c, { className: "h-4 w-4" })]
260
+ children: [R("housingvista.home.recentProperties.viewAll", "View All"), /* @__PURE__ */ x(l, { className: "h-4 w-4" })]
258
261
  })]
259
- }), z.length === 0 ? /* @__PURE__ */ b("div", {
262
+ }), B.length === 0 ? /* @__PURE__ */ x("div", {
260
263
  className: "p-4",
261
- children: /* @__PURE__ */ b(O, {
264
+ children: /* @__PURE__ */ x(k, {
262
265
  illustration: "empty-data",
263
- title: L("housingvista.home.recentProperties.empty.title", "No properties yet"),
264
- description: L("housingvista.home.recentProperties.empty.description", "List your first property to see it appear here."),
265
- action: /* @__PURE__ */ x(w, {
266
- onClick: () => h("properties/new"),
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__ */ b(g, { className: "h-4 w-4" }), L("housingvista.home.header.quickAdd", "Quick Add")]
271
+ children: [/* @__PURE__ */ x(_, { className: "h-4 w-4" }), R("housingvista.home.header.quickAdd", "Quick Add")]
269
272
  })
270
273
  })
271
- }) : /* @__PURE__ */ b("div", {
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: z.map((e) => /* @__PURE__ */ b(r, {
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: () => h(`properties/${e.id}`)
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 { N as HomePage };
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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"}