@burdenoff/microfe-housingvista 2026.716.1 → 2026.720.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.
Files changed (87) hide show
  1. package/dist/housingvista/components/PropertyCard.d.ts +7 -0
  2. package/dist/housingvista/components/PropertyCard.d.ts.map +1 -1
  3. package/dist/housingvista/components/PropertyCard.js +83 -58
  4. package/dist/housingvista/components/PropertyCard.js.map +1 -1
  5. package/dist/housingvista/components/Sparkline.d.ts +15 -0
  6. package/dist/housingvista/components/Sparkline.d.ts.map +1 -0
  7. package/dist/housingvista/components/Sparkline.js +61 -0
  8. package/dist/housingvista/components/Sparkline.js.map +1 -0
  9. package/dist/housingvista/components/StatCard.d.ts +3 -0
  10. package/dist/housingvista/components/StatCard.d.ts.map +1 -1
  11. package/dist/housingvista/components/StatCard.js +33 -29
  12. package/dist/housingvista/components/StatCard.js.map +1 -1
  13. package/dist/housingvista/components/index.d.ts +2 -0
  14. package/dist/housingvista/components/index.d.ts.map +1 -1
  15. package/dist/housingvista/components/index.js +1 -0
  16. package/dist/housingvista/components/maps/PropertyMapView.d.ts +22 -0
  17. package/dist/housingvista/components/maps/PropertyMapView.d.ts.map +1 -0
  18. package/dist/housingvista/components/maps/PropertyMapView.js +175 -0
  19. package/dist/housingvista/components/maps/PropertyMapView.js.map +1 -0
  20. package/dist/housingvista/components/maps/index.d.ts +5 -0
  21. package/dist/housingvista/components/maps/index.d.ts.map +1 -0
  22. package/dist/housingvista/components/maps/index.js +2 -0
  23. package/dist/housingvista/components/maps/leaflet-setup.d.ts +27 -0
  24. package/dist/housingvista/components/maps/leaflet-setup.d.ts.map +1 -0
  25. package/dist/housingvista/components/maps/leaflet-setup.js +36 -0
  26. package/dist/housingvista/components/maps/leaflet-setup.js.map +1 -0
  27. package/dist/housingvista/hooks/index.d.ts +33 -2
  28. package/dist/housingvista/hooks/index.d.ts.map +1 -1
  29. package/dist/housingvista/hooks/index.js +177 -94
  30. package/dist/housingvista/hooks/index.js.map +1 -1
  31. package/dist/housingvista/pages/HomePage.d.ts.map +1 -1
  32. package/dist/housingvista/pages/HomePage.js +7 -3
  33. package/dist/housingvista/pages/HomePage.js.map +1 -1
  34. package/dist/housingvista/pages/analytics/AnalyticsPage.d.ts.map +1 -1
  35. package/dist/housingvista/pages/analytics/AnalyticsPage.js +146 -145
  36. package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
  37. package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
  38. package/dist/housingvista/pages/market/AreaInsightsPage.js +60 -7
  39. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  40. package/dist/housingvista/pages/properties/PropertiesPage.d.ts.map +1 -1
  41. package/dist/housingvista/pages/properties/PropertiesPage.js +285 -191
  42. package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
  43. package/dist/housingvista/pages/properties/PropertyDetailPage.d.ts.map +1 -1
  44. package/dist/housingvista/pages/properties/PropertyDetailPage.js +792 -599
  45. package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
  46. package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
  47. package/dist/housingvista/pages/shortlist/ShortlistPage.js +172 -75
  48. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  49. package/dist/housingvista/types/index.d.ts +44 -1
  50. package/dist/housingvista/types/index.d.ts.map +1 -1
  51. package/dist/housingvista/utils/pageContext.d.ts.map +1 -1
  52. package/dist/housingvista/utils/pageContext.js +20 -17
  53. package/dist/housingvista/utils/pageContext.js.map +1 -1
  54. package/dist/microfe-housingvista.css +2 -0
  55. package/dist/node_modules/@react-leaflet/core/lib/attribution.js +12 -0
  56. package/dist/node_modules/@react-leaflet/core/lib/attribution.js.map +1 -0
  57. package/dist/node_modules/@react-leaflet/core/lib/component.js +39 -0
  58. package/dist/node_modules/@react-leaflet/core/lib/component.js.map +1 -0
  59. package/dist/node_modules/@react-leaflet/core/lib/context.js +23 -0
  60. package/dist/node_modules/@react-leaflet/core/lib/context.js.map +1 -0
  61. package/dist/node_modules/@react-leaflet/core/lib/div-overlay.js +15 -0
  62. package/dist/node_modules/@react-leaflet/core/lib/div-overlay.js.map +1 -0
  63. package/dist/node_modules/@react-leaflet/core/lib/element.js +30 -0
  64. package/dist/node_modules/@react-leaflet/core/lib/element.js.map +1 -0
  65. package/dist/node_modules/@react-leaflet/core/lib/events.js +14 -0
  66. package/dist/node_modules/@react-leaflet/core/lib/events.js.map +1 -0
  67. package/dist/node_modules/@react-leaflet/core/lib/generic.js +18 -0
  68. package/dist/node_modules/@react-leaflet/core/lib/generic.js.map +1 -0
  69. package/dist/node_modules/@react-leaflet/core/lib/grid-layer.js +9 -0
  70. package/dist/node_modules/@react-leaflet/core/lib/grid-layer.js.map +1 -0
  71. package/dist/node_modules/@react-leaflet/core/lib/layer.js +23 -0
  72. package/dist/node_modules/@react-leaflet/core/lib/layer.js.map +1 -0
  73. package/dist/node_modules/@react-leaflet/core/lib/pane.js +12 -0
  74. package/dist/node_modules/@react-leaflet/core/lib/pane.js.map +1 -0
  75. package/dist/node_modules/leaflet/dist/leaflet-src.js +4585 -0
  76. package/dist/node_modules/leaflet/dist/leaflet-src.js.map +1 -0
  77. package/dist/node_modules/react-leaflet/lib/MapContainer.js +33 -0
  78. package/dist/node_modules/react-leaflet/lib/MapContainer.js.map +1 -0
  79. package/dist/node_modules/react-leaflet/lib/Marker.js +16 -0
  80. package/dist/node_modules/react-leaflet/lib/Marker.js.map +1 -0
  81. package/dist/node_modules/react-leaflet/lib/Popup.js +37 -0
  82. package/dist/node_modules/react-leaflet/lib/Popup.js.map +1 -0
  83. package/dist/node_modules/react-leaflet/lib/TileLayer.js +18 -0
  84. package/dist/node_modules/react-leaflet/lib/TileLayer.js.map +1 -0
  85. package/dist/node_modules/react-leaflet/lib/hooks.js +18 -0
  86. package/dist/node_modules/react-leaflet/lib/hooks.js.map +1 -0
  87. package/package.json +5 -1
@@ -22,75 +22,75 @@ import { LineChart as b } from "../../../node_modules/recharts/es6/chart/LineCha
22
22
  import { PieChart as x } from "../../../node_modules/recharts/es6/chart/PieChart.js";
23
23
  import { AreaChart as S } from "../../../node_modules/recharts/es6/chart/AreaChart.js";
24
24
  import { useState as C } from "react";
25
- import { Activity as w, BarChart3 as T, Building as ne, Clock as re, DollarSign as ie, Download as ae, TrendingUp as oe } from "lucide-react";
26
- import { jsx as E, jsxs as D } from "react/jsx-runtime";
27
- import { EmphasisPanel as se, NextSteps as O } from "@burdenoff/fe-libs/ui";
25
+ import { Activity as w, BarChart3 as T, Building as E, Clock as ne, DollarSign as re, Download as ie, TrendingUp as ae } from "lucide-react";
26
+ import { jsx as D, jsxs as O } from "react/jsx-runtime";
27
+ import { EmphasisPanel as oe, NextSteps as k } from "@burdenoff/fe-libs/ui";
28
28
  //#region src/housingvista/pages/analytics/AnalyticsPage.tsx
29
- var k = [
29
+ var A = [
30
30
  "var(--color-chart-1)",
31
31
  "var(--color-chart-2)",
32
32
  "var(--color-chart-3)",
33
33
  "var(--color-chart-4)",
34
34
  "var(--color-chart-5)"
35
- ], A = "var(--color-chart-2)", j = "var(--color-chart-1)", M = {
35
+ ], j = "var(--color-chart-2)", M = "var(--color-chart-1)", N = {
36
36
  background: "var(--color-bg-surface)",
37
37
  border: "1px solid var(--color-border-subtle)",
38
38
  borderRadius: 10,
39
39
  fontSize: 12,
40
40
  boxShadow: "0 8px 24px rgb(0 0 0 / 0.12)"
41
- }, N = {
41
+ }, P = {
42
42
  color: "var(--color-text-primary)",
43
43
  fontWeight: 600
44
- }, P = {
44
+ }, F = {
45
45
  fontSize: 11,
46
46
  fill: "var(--color-text-secondary)"
47
- }, F = [
47
+ }, I = [
48
48
  {
49
- value: 3,
50
- label: "3M"
49
+ value: "week",
50
+ label: "Week"
51
51
  },
52
52
  {
53
- value: 6,
54
- label: "6M"
53
+ value: "month",
54
+ label: "Month"
55
55
  },
56
56
  {
57
- value: 12,
58
- label: "12M"
57
+ value: "quarter",
58
+ label: "Quarter"
59
59
  },
60
60
  {
61
- value: 0,
62
- label: "All"
61
+ value: "year",
62
+ label: "Year"
63
63
  }
64
64
  ];
65
- function I() {
65
+ function L() {
66
66
  c("housingvista.analytics.viewed");
67
- let { emitExport: I } = s(), { data: L, loading: R } = l(), [z, B] = C(12), V = () => {
68
- if (!L) return;
67
+ let { emitExport: L } = s(), [R, z] = C("month"), { data: B, loading: V } = l(R), H = () => {
68
+ if (!B) return;
69
69
  let e = (e) => {
70
70
  let t = String(e);
71
71
  return /[",\n]/.test(t) ? `"${t.replace(/"/g, "\"\"")}"` : t;
72
72
  }, t = [];
73
73
  t.push("KPI,Value,Unit,Change %");
74
- for (let n of L.kpis) t.push([
74
+ for (let n of B.kpis) t.push([
75
75
  n.label,
76
76
  n.value,
77
77
  n.unit,
78
78
  n.changePercent
79
79
  ].map(e).join(","));
80
80
  t.push(""), t.push("Month,Revenue,Expenses,Net Income");
81
- for (let n of L.revenueByMonth) t.push([
81
+ for (let n of B.revenueByMonth) t.push([
82
82
  n.month,
83
83
  n.revenue,
84
84
  n.expenses,
85
85
  n.revenue - n.expenses
86
86
  ].map(e).join(","));
87
87
  let n = new Blob([t.join("\n")], { type: "text/csv;charset=utf-8;" }), r = URL.createObjectURL(n), i = document.createElement("a");
88
- i.href = r, i.download = `housingvista-analytics-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(i), i.click(), document.body.removeChild(i), URL.revokeObjectURL(r), I("analytics"), u.success("Report exported", "Your analytics data was downloaded as a CSV file.");
89
- }, H = [
88
+ i.href = r, i.download = `housingvista-analytics-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`, document.body.appendChild(i), i.click(), document.body.removeChild(i), URL.revokeObjectURL(r), L("analytics"), u.success("Report exported", "Your analytics data was downloaded as a CSV file.");
89
+ }, U = [
90
90
  {
91
91
  key: "month",
92
92
  header: "Month",
93
- render: (e) => /* @__PURE__ */ E("span", {
93
+ render: (e) => /* @__PURE__ */ D("span", {
94
94
  className: "font-medium text-text-primary",
95
95
  children: e.month
96
96
  })
@@ -98,7 +98,7 @@ function I() {
98
98
  {
99
99
  key: "revenue",
100
100
  header: "Revenue",
101
- render: (e) => /* @__PURE__ */ E("span", {
101
+ render: (e) => /* @__PURE__ */ D("span", {
102
102
  className: "font-medium text-status-success-text",
103
103
  children: t(e.revenue)
104
104
  })
@@ -106,7 +106,7 @@ function I() {
106
106
  {
107
107
  key: "expenses",
108
108
  header: "Expenses",
109
- render: (e) => /* @__PURE__ */ E("span", {
109
+ render: (e) => /* @__PURE__ */ D("span", {
110
110
  className: "font-medium text-status-error-text",
111
111
  children: t(e.expenses)
112
112
  })
@@ -117,7 +117,7 @@ function I() {
117
117
  sortable: !1,
118
118
  render: (n) => {
119
119
  let r = n.revenue - n.expenses;
120
- return /* @__PURE__ */ E("span", {
120
+ return /* @__PURE__ */ D("span", {
121
121
  className: e("font-medium", r >= 0 ? "text-status-success-text" : "text-status-error-text"),
122
122
  children: t(r)
123
123
  });
@@ -129,53 +129,53 @@ function I() {
129
129
  sortable: !1,
130
130
  render: (t) => {
131
131
  let n = t.revenue > 0 ? (t.revenue - t.expenses) / t.revenue * 100 : 0;
132
- return /* @__PURE__ */ D("span", {
132
+ return /* @__PURE__ */ O("span", {
133
133
  className: e("font-medium", n >= 0 ? "text-status-success-text" : "text-status-error-text"),
134
134
  children: [n.toFixed(1), "%"]
135
135
  });
136
136
  }
137
137
  }
138
138
  ];
139
- if (R) return /* @__PURE__ */ D(r, {
139
+ if (V) return /* @__PURE__ */ O(r, {
140
140
  title: "Analytics",
141
141
  description: "Track your property portfolio performance and market insights",
142
- children: [/* @__PURE__ */ E(o, { className: "h-28" }), /* @__PURE__ */ D("div", {
142
+ children: [/* @__PURE__ */ D(o, { className: "h-28" }), /* @__PURE__ */ O("div", {
143
143
  className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
144
- children: [/* @__PURE__ */ E(o, { className: "h-64" }), /* @__PURE__ */ E(o, { className: "h-64" })]
144
+ children: [/* @__PURE__ */ D(o, { className: "h-64" }), /* @__PURE__ */ D(o, { className: "h-64" })]
145
145
  })]
146
146
  });
147
- if (!(L && (L.kpis.length > 0 || L.revenueByMonth.length > 0 || L.propertyTypeDistribution.length > 0))) return /* @__PURE__ */ E(r, {
147
+ if (!(B && (B.kpis.length > 0 || B.revenueByMonth.length > 0 || B.propertyTypeDistribution.length > 0))) return /* @__PURE__ */ D(r, {
148
148
  title: "Analytics",
149
149
  description: "Track your property portfolio performance and market insights",
150
- children: /* @__PURE__ */ E(te, {
150
+ children: /* @__PURE__ */ D(te, {
151
151
  illustration: "empty-generic",
152
- icon: /* @__PURE__ */ E(T, { className: "h-12 w-12" }),
152
+ icon: /* @__PURE__ */ D(T, { className: "h-12 w-12" }),
153
153
  title: "No analytics yet",
154
154
  description: "Once you have properties, transactions, and rentals recorded, revenue, occupancy, and portfolio insights will appear here."
155
155
  })
156
156
  });
157
- let U = L.kpis, W = L.propertyTypeDistribution, G = (e) => z > 0 ? e.slice(-z) : e, K = G(L.revenueByMonth), q = G(L.occupancyRate), J = K.map((e) => ({
157
+ let W = B.kpis, G = B.propertyTypeDistribution, K = B.revenueByMonth, q = B.occupancyRate, J = K.map((e) => ({
158
158
  month: e.month,
159
159
  revenue: e.revenue,
160
160
  expenses: e.expenses,
161
161
  net: e.revenue - e.expenses
162
- })), Y = W.reduce((e, t) => e + t.value, 0), X = W.map((e, t) => ({
162
+ })), Y = G.reduce((e, t) => e + t.value, 0), X = G.map((e, t) => ({
163
163
  name: e.type.charAt(0).toUpperCase() + e.type.slice(1),
164
164
  value: e.value,
165
165
  count: e.count,
166
- color: k[t % k.length]
167
- })), Z = K.reduce((e, t) => e + t.revenue, 0), Q = K.reduce((e, t) => e + t.expenses, 0), $ = Z - Q, ce = Z > 0 ? $ / Z * 100 : 0;
168
- return /* @__PURE__ */ D(r, {
166
+ color: A[t % A.length]
167
+ })), Z = K.reduce((e, t) => e + t.revenue, 0), Q = K.reduce((e, t) => e + t.expenses, 0), $ = Z - Q, se = Z > 0 ? $ / Z * 100 : 0;
168
+ return /* @__PURE__ */ O(r, {
169
169
  title: "Analytics",
170
170
  description: "Track your property portfolio performance and market insights",
171
171
  purpose: "Understand how your portfolio is actually performing — revenue versus expenses, occupancy, property-type mix, and profitability — so you can spot trends, compare periods, and decide where to buy, sell, or raise rents.",
172
- actions: /* @__PURE__ */ D("button", {
173
- onClick: V,
172
+ actions: /* @__PURE__ */ O("button", {
173
+ onClick: H,
174
174
  className: "inline-flex items-center gap-2 rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]",
175
- children: [/* @__PURE__ */ E(ae, { className: "h-4 w-4" }), "Export Report"]
175
+ children: [/* @__PURE__ */ D(ie, { className: "h-4 w-4" }), "Export Report"]
176
176
  }),
177
177
  children: [
178
- /* @__PURE__ */ E(O, {
178
+ /* @__PURE__ */ D(k, {
179
179
  storageKey: "housingvista-analytics",
180
180
  steps: [{
181
181
  id: "performance",
@@ -184,74 +184,75 @@ function I() {
184
184
  href: "#analytics-performance"
185
185
  }]
186
186
  }),
187
- /* @__PURE__ */ D("div", {
187
+ /* @__PURE__ */ O("div", {
188
188
  className: "flex flex-wrap items-center gap-3",
189
- children: [/* @__PURE__ */ E("span", {
189
+ children: [/* @__PURE__ */ D("span", {
190
190
  className: "text-sm font-medium text-text-secondary",
191
191
  children: "Period"
192
- }), /* @__PURE__ */ E("div", {
192
+ }), /* @__PURE__ */ D("div", {
193
193
  role: "group",
194
194
  "aria-label": "Select analytics period",
195
195
  className: "inline-flex rounded-lg border border-border-subtle bg-bg-sunken/60 p-1",
196
- children: F.map((t) => /* @__PURE__ */ E("button", {
196
+ children: I.map((t) => /* @__PURE__ */ D("button", {
197
197
  type: "button",
198
- "aria-pressed": z === t.value,
199
- onClick: () => B(t.value),
200
- className: e("rounded-md px-3 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", z === t.value ? "bg-action-primary-bg text-action-primary-text shadow-sm" : "text-text-secondary hover:text-text-primary"),
198
+ "aria-pressed": R === t.value,
199
+ onClick: () => z(t.value),
200
+ disabled: V,
201
+ className: e("rounded-md px-3 py-1.5 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]", R === t.value ? "bg-action-primary-bg text-action-primary-text shadow-sm" : "text-text-secondary hover:text-text-primary"),
201
202
  children: t.label
202
203
  }, t.value))
203
204
  })]
204
205
  }),
205
- U.length > 0 && /* @__PURE__ */ E(se, {
206
+ W.length > 0 && /* @__PURE__ */ D(oe, {
206
207
  className: "p-4",
207
- children: /* @__PURE__ */ E("div", {
208
+ children: /* @__PURE__ */ D("div", {
208
209
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
209
- children: U.map((e) => {
210
+ children: W.map((e) => {
210
211
  let t = {
211
- "Portfolio Value": ie,
212
- "Monthly Revenue": oe,
213
- "Occupancy Rate": ne,
214
- "Avg. Days to Rent": re
212
+ "Portfolio Value": re,
213
+ "Monthly Revenue": ae,
214
+ "Occupancy Rate": E,
215
+ "Avg. Days to Rent": ne
215
216
  }[e.label] || w;
216
- return /* @__PURE__ */ E(i, {
217
+ return /* @__PURE__ */ D(i, {
217
218
  label: e.label,
218
219
  value: e.unit === "USD" ? e.value : `${n(e.value)}${e.unit === "%" ? "%" : ` ${e.unit}`}`,
219
220
  prefix: e.unit === "USD" ? "$" : void 0,
220
- icon: /* @__PURE__ */ E(t, { className: "h-4 w-4" }),
221
+ icon: /* @__PURE__ */ D(t, { className: "h-4 w-4" }),
221
222
  trend: e.trend === "up" ? "up" : e.trend === "down" ? "down" : "stable",
222
223
  change: e.changePercent
223
224
  }, e.id);
224
225
  })
225
226
  })
226
227
  }),
227
- /* @__PURE__ */ D("div", {
228
+ /* @__PURE__ */ O("div", {
228
229
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
229
- children: [J.length > 0 && /* @__PURE__ */ E(a, {
230
+ children: [J.length > 0 && /* @__PURE__ */ D(a, {
230
231
  title: "Revenue vs Expenses",
231
232
  description: "Real income against costs across the selected period",
232
233
  className: "lg:col-span-2",
233
- actions: /* @__PURE__ */ D("div", {
234
+ actions: /* @__PURE__ */ O("div", {
234
235
  className: "flex items-center gap-4 text-xs text-text-secondary",
235
- children: [/* @__PURE__ */ D("span", {
236
+ children: [/* @__PURE__ */ O("span", {
236
237
  className: "flex items-center gap-1.5",
237
- children: [/* @__PURE__ */ E("span", {
238
+ children: [/* @__PURE__ */ D("span", {
238
239
  className: "h-2.5 w-2.5 rounded-full",
239
- style: { background: A }
240
+ style: { background: j }
240
241
  }), "Revenue"]
241
- }), /* @__PURE__ */ D("span", {
242
+ }), /* @__PURE__ */ O("span", {
242
243
  className: "flex items-center gap-1.5",
243
- children: [/* @__PURE__ */ E("span", {
244
+ children: [/* @__PURE__ */ D("span", {
244
245
  className: "h-2.5 w-2.5 rounded-full",
245
- style: { background: j }
246
+ style: { background: M }
246
247
  }), "Expenses"]
247
248
  })]
248
249
  }),
249
- children: /* @__PURE__ */ E("div", {
250
+ children: /* @__PURE__ */ D("div", {
250
251
  className: "h-72 w-full",
251
- children: /* @__PURE__ */ E(f, {
252
+ children: /* @__PURE__ */ D(f, {
252
253
  width: "100%",
253
254
  height: "100%",
254
- children: /* @__PURE__ */ D(S, {
255
+ children: /* @__PURE__ */ O(S, {
255
256
  data: J,
256
257
  margin: {
257
258
  top: 8,
@@ -260,73 +261,73 @@ function I() {
260
261
  bottom: 0
261
262
  },
262
263
  children: [
263
- /* @__PURE__ */ D("defs", { children: [/* @__PURE__ */ D("linearGradient", {
264
+ /* @__PURE__ */ O("defs", { children: [/* @__PURE__ */ O("linearGradient", {
264
265
  id: "revGrad",
265
266
  x1: "0",
266
267
  y1: "0",
267
268
  x2: "0",
268
269
  y2: "1",
269
- children: [/* @__PURE__ */ E("stop", {
270
+ children: [/* @__PURE__ */ D("stop", {
270
271
  offset: "5%",
271
- stopColor: A,
272
+ stopColor: j,
272
273
  stopOpacity: .35
273
- }), /* @__PURE__ */ E("stop", {
274
+ }), /* @__PURE__ */ D("stop", {
274
275
  offset: "95%",
275
- stopColor: A,
276
+ stopColor: j,
276
277
  stopOpacity: .02
277
278
  })]
278
- }), /* @__PURE__ */ D("linearGradient", {
279
+ }), /* @__PURE__ */ O("linearGradient", {
279
280
  id: "expGrad",
280
281
  x1: "0",
281
282
  y1: "0",
282
283
  x2: "0",
283
284
  y2: "1",
284
- children: [/* @__PURE__ */ E("stop", {
285
+ children: [/* @__PURE__ */ D("stop", {
285
286
  offset: "5%",
286
- stopColor: j,
287
+ stopColor: M,
287
288
  stopOpacity: .3
288
- }), /* @__PURE__ */ E("stop", {
289
+ }), /* @__PURE__ */ D("stop", {
289
290
  offset: "95%",
290
- stopColor: j,
291
+ stopColor: M,
291
292
  stopOpacity: .02
292
293
  })]
293
294
  })] }),
294
- /* @__PURE__ */ E(h, {
295
+ /* @__PURE__ */ D(h, {
295
296
  strokeDasharray: "3 3",
296
297
  stroke: "var(--color-border-subtle)",
297
298
  vertical: !1
298
299
  }),
299
- /* @__PURE__ */ E(v, {
300
+ /* @__PURE__ */ D(v, {
300
301
  dataKey: "month",
301
- tick: P,
302
+ tick: F,
302
303
  tickLine: !1,
303
304
  axisLine: !1
304
305
  }),
305
- /* @__PURE__ */ E(y, {
306
- tick: P,
306
+ /* @__PURE__ */ D(y, {
307
+ tick: F,
307
308
  tickLine: !1,
308
309
  axisLine: !1,
309
310
  width: 52,
310
311
  tickFormatter: (e) => t(e)
311
312
  }),
312
- /* @__PURE__ */ E(d, {
313
- contentStyle: M,
314
- labelStyle: N,
313
+ /* @__PURE__ */ D(d, {
314
+ contentStyle: N,
315
+ labelStyle: P,
315
316
  formatter: (e, n) => [t(e), n]
316
317
  }),
317
- /* @__PURE__ */ E(_, {
318
+ /* @__PURE__ */ D(_, {
318
319
  type: "monotone",
319
320
  dataKey: "revenue",
320
321
  name: "Revenue",
321
- stroke: A,
322
+ stroke: j,
322
323
  strokeWidth: 2.5,
323
324
  fill: "url(#revGrad)"
324
325
  }),
325
- /* @__PURE__ */ E(_, {
326
+ /* @__PURE__ */ D(_, {
326
327
  type: "monotone",
327
328
  dataKey: "expenses",
328
329
  name: "Expenses",
329
- stroke: j,
330
+ stroke: M,
330
331
  strokeWidth: 2.5,
331
332
  fill: "url(#expGrad)"
332
333
  })
@@ -334,15 +335,15 @@ function I() {
334
335
  })
335
336
  })
336
337
  })
337
- }), X.length > 0 && /* @__PURE__ */ D(a, {
338
+ }), X.length > 0 && /* @__PURE__ */ O(a, {
338
339
  title: "Property-Type Distribution",
339
340
  description: "Portfolio value split by type",
340
- children: [/* @__PURE__ */ D("div", {
341
+ children: [/* @__PURE__ */ O("div", {
341
342
  className: "relative h-56 w-full",
342
- children: [/* @__PURE__ */ E(f, {
343
+ children: [/* @__PURE__ */ D(f, {
343
344
  width: "100%",
344
345
  height: "100%",
345
- children: /* @__PURE__ */ D(x, { children: [/* @__PURE__ */ E(m, {
346
+ children: /* @__PURE__ */ O(x, { children: [/* @__PURE__ */ D(m, {
346
347
  data: X,
347
348
  dataKey: "value",
348
349
  nameKey: "name",
@@ -351,36 +352,36 @@ function I() {
351
352
  paddingAngle: 2,
352
353
  stroke: "var(--color-bg-surface)",
353
354
  strokeWidth: 2,
354
- children: X.map((e) => /* @__PURE__ */ E(p, { fill: e.color }, e.name))
355
- }), /* @__PURE__ */ E(d, {
356
- contentStyle: M,
357
- labelStyle: N,
355
+ children: X.map((e) => /* @__PURE__ */ D(p, { fill: e.color }, e.name))
356
+ }), /* @__PURE__ */ D(d, {
357
+ contentStyle: N,
358
+ labelStyle: P,
358
359
  formatter: (e, n, r) => [`${t(e)} · ${r?.payload?.count ?? 0} properties`, r?.payload?.name]
359
360
  })] })
360
- }), /* @__PURE__ */ D("div", {
361
+ }), /* @__PURE__ */ O("div", {
361
362
  className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center",
362
- children: [/* @__PURE__ */ E("span", {
363
+ children: [/* @__PURE__ */ D("span", {
363
364
  className: "text-xs text-text-secondary",
364
365
  children: "Total value"
365
- }), /* @__PURE__ */ E("span", {
366
+ }), /* @__PURE__ */ D("span", {
366
367
  className: "text-lg font-bold text-text-primary",
367
368
  children: t(Y)
368
369
  })]
369
370
  })]
370
- }), /* @__PURE__ */ E("ul", {
371
+ }), /* @__PURE__ */ D("ul", {
371
372
  className: "mt-3 space-y-2",
372
- children: X.map((e) => /* @__PURE__ */ D("li", {
373
+ children: X.map((e) => /* @__PURE__ */ O("li", {
373
374
  className: "flex items-center justify-between text-sm",
374
- children: [/* @__PURE__ */ D("span", {
375
+ children: [/* @__PURE__ */ O("span", {
375
376
  className: "flex items-center gap-2",
376
- children: [/* @__PURE__ */ E("span", {
377
+ children: [/* @__PURE__ */ D("span", {
377
378
  className: "h-2.5 w-2.5 rounded-full",
378
379
  style: { background: e.color }
379
- }), /* @__PURE__ */ E("span", {
380
+ }), /* @__PURE__ */ D("span", {
380
381
  className: "text-text-primary",
381
382
  children: e.name
382
383
  })]
383
- }), /* @__PURE__ */ D("span", {
384
+ }), /* @__PURE__ */ O("span", {
384
385
  className: "text-text-secondary",
385
386
  children: [Y > 0 ? Math.round(e.value / Y * 100) : 0, "%"]
386
387
  })]
@@ -388,18 +389,18 @@ function I() {
388
389
  })]
389
390
  })]
390
391
  }),
391
- /* @__PURE__ */ D("div", {
392
+ /* @__PURE__ */ O("div", {
392
393
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
393
- children: [q.length > 0 && /* @__PURE__ */ E(a, {
394
+ children: [q.length > 0 && /* @__PURE__ */ D(a, {
394
395
  title: "Occupancy Trend",
395
396
  description: "Share of units occupied over the selected period",
396
397
  className: "lg:col-span-2",
397
- children: /* @__PURE__ */ E("div", {
398
+ children: /* @__PURE__ */ D("div", {
398
399
  className: "h-56 w-full",
399
- children: /* @__PURE__ */ E(f, {
400
+ children: /* @__PURE__ */ D(f, {
400
401
  width: "100%",
401
402
  height: "100%",
402
- children: /* @__PURE__ */ D(b, {
403
+ children: /* @__PURE__ */ O(b, {
403
404
  data: q,
404
405
  margin: {
405
406
  top: 8,
@@ -408,31 +409,31 @@ function I() {
408
409
  bottom: 0
409
410
  },
410
411
  children: [
411
- /* @__PURE__ */ E(h, {
412
+ /* @__PURE__ */ D(h, {
412
413
  strokeDasharray: "3 3",
413
414
  stroke: "var(--color-border-subtle)",
414
415
  vertical: !1
415
416
  }),
416
- /* @__PURE__ */ E(v, {
417
+ /* @__PURE__ */ D(v, {
417
418
  dataKey: "month",
418
- tick: P,
419
+ tick: F,
419
420
  tickLine: !1,
420
421
  axisLine: !1
421
422
  }),
422
- /* @__PURE__ */ E(y, {
423
- tick: P,
423
+ /* @__PURE__ */ D(y, {
424
+ tick: F,
424
425
  tickLine: !1,
425
426
  axisLine: !1,
426
427
  width: 40,
427
428
  domain: [0, 100],
428
429
  tickFormatter: (e) => `${e}%`
429
430
  }),
430
- /* @__PURE__ */ E(d, {
431
- contentStyle: M,
432
- labelStyle: N,
431
+ /* @__PURE__ */ D(d, {
432
+ contentStyle: N,
433
+ labelStyle: P,
433
434
  formatter: (e) => [`${e}%`, "Occupancy"]
434
435
  }),
435
- /* @__PURE__ */ E(g, {
436
+ /* @__PURE__ */ D(g, {
436
437
  type: "monotone",
437
438
  dataKey: "rate",
438
439
  stroke: "var(--color-chart-2)",
@@ -448,46 +449,46 @@ function I() {
448
449
  })
449
450
  })
450
451
  })
451
- }), K.length > 0 && /* @__PURE__ */ E(a, {
452
+ }), K.length > 0 && /* @__PURE__ */ D(a, {
452
453
  title: "Period Summary",
453
454
  description: "Totals across the selected range",
454
- children: /* @__PURE__ */ D("div", {
455
+ children: /* @__PURE__ */ O("div", {
455
456
  className: "space-y-4",
456
- children: [/* @__PURE__ */ D("div", {
457
+ children: [/* @__PURE__ */ O("div", {
457
458
  className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
458
- children: [/* @__PURE__ */ D("div", { children: [/* @__PURE__ */ E("p", {
459
+ children: [/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("p", {
459
460
  className: "text-sm text-text-secondary",
460
461
  children: "Total Revenue"
461
- }), /* @__PURE__ */ E("p", {
462
+ }), /* @__PURE__ */ D("p", {
462
463
  className: "text-lg font-bold text-text-primary",
463
464
  children: t(Z)
464
- })] }), /* @__PURE__ */ D("div", {
465
+ })] }), /* @__PURE__ */ O("div", {
465
466
  className: "text-right",
466
- children: [/* @__PURE__ */ E("p", {
467
+ children: [/* @__PURE__ */ D("p", {
467
468
  className: "text-sm text-text-secondary",
468
469
  children: "Total Expenses"
469
- }), /* @__PURE__ */ E("p", {
470
+ }), /* @__PURE__ */ D("p", {
470
471
  className: "text-lg font-bold text-text-primary",
471
472
  children: t(Q)
472
473
  })]
473
474
  })]
474
- }), /* @__PURE__ */ D("div", {
475
+ }), /* @__PURE__ */ O("div", {
475
476
  className: "grid grid-cols-2 gap-3",
476
- children: [/* @__PURE__ */ D("div", {
477
+ children: [/* @__PURE__ */ O("div", {
477
478
  className: "rounded-lg bg-status-success-bg-subtle p-3 text-center",
478
- children: [/* @__PURE__ */ E("p", {
479
+ children: [/* @__PURE__ */ D("p", {
479
480
  className: "text-xl font-bold text-status-success-text",
480
481
  children: t($)
481
- }), /* @__PURE__ */ E("p", {
482
+ }), /* @__PURE__ */ D("p", {
482
483
  className: "text-xs text-text-secondary",
483
484
  children: "Net Income"
484
485
  })]
485
- }), /* @__PURE__ */ D("div", {
486
+ }), /* @__PURE__ */ O("div", {
486
487
  className: "rounded-lg bg-status-info-bg-subtle p-3 text-center",
487
- children: [/* @__PURE__ */ D("p", {
488
+ children: [/* @__PURE__ */ O("p", {
488
489
  className: "text-xl font-bold text-status-info-text",
489
- children: [ce.toFixed(1), "%"]
490
- }), /* @__PURE__ */ E("p", {
490
+ children: [se.toFixed(1), "%"]
491
+ }), /* @__PURE__ */ D("p", {
491
492
  className: "text-xs text-text-secondary",
492
493
  children: "Profit Margin"
493
494
  })]
@@ -496,14 +497,14 @@ function I() {
496
497
  })
497
498
  })]
498
499
  }),
499
- K.length > 0 && /* @__PURE__ */ D("div", {
500
+ K.length > 0 && /* @__PURE__ */ O("div", {
500
501
  id: "analytics-performance",
501
502
  className: "scroll-mt-6",
502
- children: [/* @__PURE__ */ E("h2", {
503
+ children: [/* @__PURE__ */ D("h2", {
503
504
  className: "mb-4 text-lg font-semibold text-text-primary",
504
505
  children: "Monthly Performance"
505
- }), /* @__PURE__ */ E(ee, {
506
- columns: H,
506
+ }), /* @__PURE__ */ D(ee, {
507
+ columns: U,
507
508
  data: K,
508
509
  keyField: "month",
509
510
  pageSize: 12
@@ -513,6 +514,6 @@ function I() {
513
514
  });
514
515
  }
515
516
  //#endregion
516
- export { I as AnalyticsPage };
517
+ export { L as AnalyticsPage };
517
518
 
518
519
  //# sourceMappingURL=AnalyticsPage.js.map