@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.
- package/dist/housingvista/components/PropertyCard.d.ts +7 -0
- package/dist/housingvista/components/PropertyCard.d.ts.map +1 -1
- package/dist/housingvista/components/PropertyCard.js +83 -58
- package/dist/housingvista/components/PropertyCard.js.map +1 -1
- package/dist/housingvista/components/Sparkline.d.ts +15 -0
- package/dist/housingvista/components/Sparkline.d.ts.map +1 -0
- package/dist/housingvista/components/Sparkline.js +61 -0
- package/dist/housingvista/components/Sparkline.js.map +1 -0
- package/dist/housingvista/components/StatCard.d.ts +3 -0
- package/dist/housingvista/components/StatCard.d.ts.map +1 -1
- package/dist/housingvista/components/StatCard.js +33 -29
- package/dist/housingvista/components/StatCard.js.map +1 -1
- package/dist/housingvista/components/index.d.ts +2 -0
- package/dist/housingvista/components/index.d.ts.map +1 -1
- package/dist/housingvista/components/index.js +1 -0
- package/dist/housingvista/components/maps/PropertyMapView.d.ts +22 -0
- package/dist/housingvista/components/maps/PropertyMapView.d.ts.map +1 -0
- package/dist/housingvista/components/maps/PropertyMapView.js +175 -0
- package/dist/housingvista/components/maps/PropertyMapView.js.map +1 -0
- package/dist/housingvista/components/maps/index.d.ts +5 -0
- package/dist/housingvista/components/maps/index.d.ts.map +1 -0
- package/dist/housingvista/components/maps/index.js +2 -0
- package/dist/housingvista/components/maps/leaflet-setup.d.ts +27 -0
- package/dist/housingvista/components/maps/leaflet-setup.d.ts.map +1 -0
- package/dist/housingvista/components/maps/leaflet-setup.js +36 -0
- package/dist/housingvista/components/maps/leaflet-setup.js.map +1 -0
- package/dist/housingvista/hooks/index.d.ts +33 -2
- package/dist/housingvista/hooks/index.d.ts.map +1 -1
- package/dist/housingvista/hooks/index.js +177 -94
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/pages/HomePage.d.ts.map +1 -1
- package/dist/housingvista/pages/HomePage.js +7 -3
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/analytics/AnalyticsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/analytics/AnalyticsPage.js +146 -145
- package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.js +60 -7
- package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.d.ts.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.js +285 -191
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.js +792 -599
- package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.js +172 -75
- package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
- package/dist/housingvista/types/index.d.ts +44 -1
- package/dist/housingvista/types/index.d.ts.map +1 -1
- package/dist/housingvista/utils/pageContext.d.ts.map +1 -1
- package/dist/housingvista/utils/pageContext.js +20 -17
- package/dist/housingvista/utils/pageContext.js.map +1 -1
- package/dist/microfe-housingvista.css +2 -0
- package/dist/node_modules/@react-leaflet/core/lib/attribution.js +12 -0
- package/dist/node_modules/@react-leaflet/core/lib/attribution.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/component.js +39 -0
- package/dist/node_modules/@react-leaflet/core/lib/component.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/context.js +23 -0
- package/dist/node_modules/@react-leaflet/core/lib/context.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/div-overlay.js +15 -0
- package/dist/node_modules/@react-leaflet/core/lib/div-overlay.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/element.js +30 -0
- package/dist/node_modules/@react-leaflet/core/lib/element.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/events.js +14 -0
- package/dist/node_modules/@react-leaflet/core/lib/events.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/generic.js +18 -0
- package/dist/node_modules/@react-leaflet/core/lib/generic.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/grid-layer.js +9 -0
- package/dist/node_modules/@react-leaflet/core/lib/grid-layer.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/layer.js +23 -0
- package/dist/node_modules/@react-leaflet/core/lib/layer.js.map +1 -0
- package/dist/node_modules/@react-leaflet/core/lib/pane.js +12 -0
- package/dist/node_modules/@react-leaflet/core/lib/pane.js.map +1 -0
- package/dist/node_modules/leaflet/dist/leaflet-src.js +4585 -0
- package/dist/node_modules/leaflet/dist/leaflet-src.js.map +1 -0
- package/dist/node_modules/react-leaflet/lib/MapContainer.js +33 -0
- package/dist/node_modules/react-leaflet/lib/MapContainer.js.map +1 -0
- package/dist/node_modules/react-leaflet/lib/Marker.js +16 -0
- package/dist/node_modules/react-leaflet/lib/Marker.js.map +1 -0
- package/dist/node_modules/react-leaflet/lib/Popup.js +37 -0
- package/dist/node_modules/react-leaflet/lib/Popup.js.map +1 -0
- package/dist/node_modules/react-leaflet/lib/TileLayer.js +18 -0
- package/dist/node_modules/react-leaflet/lib/TileLayer.js.map +1 -0
- package/dist/node_modules/react-leaflet/lib/hooks.js +18 -0
- package/dist/node_modules/react-leaflet/lib/hooks.js.map +1 -0
- 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
|
|
26
|
-
import { jsx as
|
|
27
|
-
import { EmphasisPanel as
|
|
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
|
|
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
|
-
],
|
|
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
|
-
},
|
|
41
|
+
}, P = {
|
|
42
42
|
color: "var(--color-text-primary)",
|
|
43
43
|
fontWeight: 600
|
|
44
|
-
},
|
|
44
|
+
}, F = {
|
|
45
45
|
fontSize: 11,
|
|
46
46
|
fill: "var(--color-text-secondary)"
|
|
47
|
-
},
|
|
47
|
+
}, I = [
|
|
48
48
|
{
|
|
49
|
-
value:
|
|
50
|
-
label: "
|
|
49
|
+
value: "week",
|
|
50
|
+
label: "Week"
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
value:
|
|
54
|
-
label: "
|
|
53
|
+
value: "month",
|
|
54
|
+
label: "Month"
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
|
-
value:
|
|
58
|
-
label: "
|
|
57
|
+
value: "quarter",
|
|
58
|
+
label: "Quarter"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
value:
|
|
62
|
-
label: "
|
|
61
|
+
value: "year",
|
|
62
|
+
label: "Year"
|
|
63
63
|
}
|
|
64
64
|
];
|
|
65
|
-
function
|
|
65
|
+
function L() {
|
|
66
66
|
c("housingvista.analytics.viewed");
|
|
67
|
-
let { emitExport:
|
|
68
|
-
if (!
|
|
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
|
|
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
|
|
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),
|
|
89
|
-
},
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 (
|
|
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__ */
|
|
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__ */
|
|
144
|
+
children: [/* @__PURE__ */ D(o, { className: "h-64" }), /* @__PURE__ */ D(o, { className: "h-64" })]
|
|
145
145
|
})]
|
|
146
146
|
});
|
|
147
|
-
if (!(
|
|
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__ */
|
|
150
|
+
children: /* @__PURE__ */ D(te, {
|
|
151
151
|
illustration: "empty-generic",
|
|
152
|
-
icon: /* @__PURE__ */
|
|
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
|
|
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 =
|
|
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:
|
|
167
|
-
})), Z = K.reduce((e, t) => e + t.revenue, 0), Q = K.reduce((e, t) => e + t.expenses, 0), $ = Z - Q,
|
|
168
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
173
|
-
onClick:
|
|
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__ */
|
|
175
|
+
children: [/* @__PURE__ */ D(ie, { className: "h-4 w-4" }), "Export Report"]
|
|
176
176
|
}),
|
|
177
177
|
children: [
|
|
178
|
-
/* @__PURE__ */
|
|
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__ */
|
|
187
|
+
/* @__PURE__ */ O("div", {
|
|
188
188
|
className: "flex flex-wrap items-center gap-3",
|
|
189
|
-
children: [/* @__PURE__ */
|
|
189
|
+
children: [/* @__PURE__ */ D("span", {
|
|
190
190
|
className: "text-sm font-medium text-text-secondary",
|
|
191
191
|
children: "Period"
|
|
192
|
-
}), /* @__PURE__ */
|
|
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:
|
|
196
|
+
children: I.map((t) => /* @__PURE__ */ D("button", {
|
|
197
197
|
type: "button",
|
|
198
|
-
"aria-pressed":
|
|
199
|
-
onClick: () =>
|
|
200
|
-
|
|
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
|
-
|
|
206
|
+
W.length > 0 && /* @__PURE__ */ D(oe, {
|
|
206
207
|
className: "p-4",
|
|
207
|
-
children: /* @__PURE__ */
|
|
208
|
+
children: /* @__PURE__ */ D("div", {
|
|
208
209
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
209
|
-
children:
|
|
210
|
+
children: W.map((e) => {
|
|
210
211
|
let t = {
|
|
211
|
-
"Portfolio Value":
|
|
212
|
-
"Monthly Revenue":
|
|
213
|
-
"Occupancy Rate":
|
|
214
|
-
"Avg. Days to Rent":
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
228
|
+
/* @__PURE__ */ O("div", {
|
|
228
229
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
229
|
-
children: [J.length > 0 && /* @__PURE__ */
|
|
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__ */
|
|
234
|
+
actions: /* @__PURE__ */ O("div", {
|
|
234
235
|
className: "flex items-center gap-4 text-xs text-text-secondary",
|
|
235
|
-
children: [/* @__PURE__ */
|
|
236
|
+
children: [/* @__PURE__ */ O("span", {
|
|
236
237
|
className: "flex items-center gap-1.5",
|
|
237
|
-
children: [/* @__PURE__ */
|
|
238
|
+
children: [/* @__PURE__ */ D("span", {
|
|
238
239
|
className: "h-2.5 w-2.5 rounded-full",
|
|
239
|
-
style: { background:
|
|
240
|
+
style: { background: j }
|
|
240
241
|
}), "Revenue"]
|
|
241
|
-
}), /* @__PURE__ */
|
|
242
|
+
}), /* @__PURE__ */ O("span", {
|
|
242
243
|
className: "flex items-center gap-1.5",
|
|
243
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ D("span", {
|
|
244
245
|
className: "h-2.5 w-2.5 rounded-full",
|
|
245
|
-
style: { background:
|
|
246
|
+
style: { background: M }
|
|
246
247
|
}), "Expenses"]
|
|
247
248
|
})]
|
|
248
249
|
}),
|
|
249
|
-
children: /* @__PURE__ */
|
|
250
|
+
children: /* @__PURE__ */ D("div", {
|
|
250
251
|
className: "h-72 w-full",
|
|
251
|
-
children: /* @__PURE__ */
|
|
252
|
+
children: /* @__PURE__ */ D(f, {
|
|
252
253
|
width: "100%",
|
|
253
254
|
height: "100%",
|
|
254
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
270
|
+
children: [/* @__PURE__ */ D("stop", {
|
|
270
271
|
offset: "5%",
|
|
271
|
-
stopColor:
|
|
272
|
+
stopColor: j,
|
|
272
273
|
stopOpacity: .35
|
|
273
|
-
}), /* @__PURE__ */
|
|
274
|
+
}), /* @__PURE__ */ D("stop", {
|
|
274
275
|
offset: "95%",
|
|
275
|
-
stopColor:
|
|
276
|
+
stopColor: j,
|
|
276
277
|
stopOpacity: .02
|
|
277
278
|
})]
|
|
278
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
285
|
+
children: [/* @__PURE__ */ D("stop", {
|
|
285
286
|
offset: "5%",
|
|
286
|
-
stopColor:
|
|
287
|
+
stopColor: M,
|
|
287
288
|
stopOpacity: .3
|
|
288
|
-
}), /* @__PURE__ */
|
|
289
|
+
}), /* @__PURE__ */ D("stop", {
|
|
289
290
|
offset: "95%",
|
|
290
|
-
stopColor:
|
|
291
|
+
stopColor: M,
|
|
291
292
|
stopOpacity: .02
|
|
292
293
|
})]
|
|
293
294
|
})] }),
|
|
294
|
-
/* @__PURE__ */
|
|
295
|
+
/* @__PURE__ */ D(h, {
|
|
295
296
|
strokeDasharray: "3 3",
|
|
296
297
|
stroke: "var(--color-border-subtle)",
|
|
297
298
|
vertical: !1
|
|
298
299
|
}),
|
|
299
|
-
/* @__PURE__ */
|
|
300
|
+
/* @__PURE__ */ D(v, {
|
|
300
301
|
dataKey: "month",
|
|
301
|
-
tick:
|
|
302
|
+
tick: F,
|
|
302
303
|
tickLine: !1,
|
|
303
304
|
axisLine: !1
|
|
304
305
|
}),
|
|
305
|
-
/* @__PURE__ */
|
|
306
|
-
tick:
|
|
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__ */
|
|
313
|
-
contentStyle:
|
|
314
|
-
labelStyle:
|
|
313
|
+
/* @__PURE__ */ D(d, {
|
|
314
|
+
contentStyle: N,
|
|
315
|
+
labelStyle: P,
|
|
315
316
|
formatter: (e, n) => [t(e), n]
|
|
316
317
|
}),
|
|
317
|
-
/* @__PURE__ */
|
|
318
|
+
/* @__PURE__ */ D(_, {
|
|
318
319
|
type: "monotone",
|
|
319
320
|
dataKey: "revenue",
|
|
320
321
|
name: "Revenue",
|
|
321
|
-
stroke:
|
|
322
|
+
stroke: j,
|
|
322
323
|
strokeWidth: 2.5,
|
|
323
324
|
fill: "url(#revGrad)"
|
|
324
325
|
}),
|
|
325
|
-
/* @__PURE__ */
|
|
326
|
+
/* @__PURE__ */ D(_, {
|
|
326
327
|
type: "monotone",
|
|
327
328
|
dataKey: "expenses",
|
|
328
329
|
name: "Expenses",
|
|
329
|
-
stroke:
|
|
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__ */
|
|
338
|
+
}), X.length > 0 && /* @__PURE__ */ O(a, {
|
|
338
339
|
title: "Property-Type Distribution",
|
|
339
340
|
description: "Portfolio value split by type",
|
|
340
|
-
children: [/* @__PURE__ */
|
|
341
|
+
children: [/* @__PURE__ */ O("div", {
|
|
341
342
|
className: "relative h-56 w-full",
|
|
342
|
-
children: [/* @__PURE__ */
|
|
343
|
+
children: [/* @__PURE__ */ D(f, {
|
|
343
344
|
width: "100%",
|
|
344
345
|
height: "100%",
|
|
345
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
355
|
-
}), /* @__PURE__ */
|
|
356
|
-
contentStyle:
|
|
357
|
-
labelStyle:
|
|
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__ */
|
|
361
|
+
}), /* @__PURE__ */ O("div", {
|
|
361
362
|
className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center",
|
|
362
|
-
children: [/* @__PURE__ */
|
|
363
|
+
children: [/* @__PURE__ */ D("span", {
|
|
363
364
|
className: "text-xs text-text-secondary",
|
|
364
365
|
children: "Total value"
|
|
365
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
371
|
+
}), /* @__PURE__ */ D("ul", {
|
|
371
372
|
className: "mt-3 space-y-2",
|
|
372
|
-
children: X.map((e) => /* @__PURE__ */
|
|
373
|
+
children: X.map((e) => /* @__PURE__ */ O("li", {
|
|
373
374
|
className: "flex items-center justify-between text-sm",
|
|
374
|
-
children: [/* @__PURE__ */
|
|
375
|
+
children: [/* @__PURE__ */ O("span", {
|
|
375
376
|
className: "flex items-center gap-2",
|
|
376
|
-
children: [/* @__PURE__ */
|
|
377
|
+
children: [/* @__PURE__ */ D("span", {
|
|
377
378
|
className: "h-2.5 w-2.5 rounded-full",
|
|
378
379
|
style: { background: e.color }
|
|
379
|
-
}), /* @__PURE__ */
|
|
380
|
+
}), /* @__PURE__ */ D("span", {
|
|
380
381
|
className: "text-text-primary",
|
|
381
382
|
children: e.name
|
|
382
383
|
})]
|
|
383
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
392
|
+
/* @__PURE__ */ O("div", {
|
|
392
393
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
393
|
-
children: [q.length > 0 && /* @__PURE__ */
|
|
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__ */
|
|
398
|
+
children: /* @__PURE__ */ D("div", {
|
|
398
399
|
className: "h-56 w-full",
|
|
399
|
-
children: /* @__PURE__ */
|
|
400
|
+
children: /* @__PURE__ */ D(f, {
|
|
400
401
|
width: "100%",
|
|
401
402
|
height: "100%",
|
|
402
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
412
|
+
/* @__PURE__ */ D(h, {
|
|
412
413
|
strokeDasharray: "3 3",
|
|
413
414
|
stroke: "var(--color-border-subtle)",
|
|
414
415
|
vertical: !1
|
|
415
416
|
}),
|
|
416
|
-
/* @__PURE__ */
|
|
417
|
+
/* @__PURE__ */ D(v, {
|
|
417
418
|
dataKey: "month",
|
|
418
|
-
tick:
|
|
419
|
+
tick: F,
|
|
419
420
|
tickLine: !1,
|
|
420
421
|
axisLine: !1
|
|
421
422
|
}),
|
|
422
|
-
/* @__PURE__ */
|
|
423
|
-
tick:
|
|
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__ */
|
|
431
|
-
contentStyle:
|
|
432
|
-
labelStyle:
|
|
431
|
+
/* @__PURE__ */ D(d, {
|
|
432
|
+
contentStyle: N,
|
|
433
|
+
labelStyle: P,
|
|
433
434
|
formatter: (e) => [`${e}%`, "Occupancy"]
|
|
434
435
|
}),
|
|
435
|
-
/* @__PURE__ */
|
|
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__ */
|
|
452
|
+
}), K.length > 0 && /* @__PURE__ */ D(a, {
|
|
452
453
|
title: "Period Summary",
|
|
453
454
|
description: "Totals across the selected range",
|
|
454
|
-
children: /* @__PURE__ */
|
|
455
|
+
children: /* @__PURE__ */ O("div", {
|
|
455
456
|
className: "space-y-4",
|
|
456
|
-
children: [/* @__PURE__ */
|
|
457
|
+
children: [/* @__PURE__ */ O("div", {
|
|
457
458
|
className: "flex items-center justify-between rounded-lg bg-bg-sunken/50 p-3",
|
|
458
|
-
children: [/* @__PURE__ */
|
|
459
|
+
children: [/* @__PURE__ */ O("div", { children: [/* @__PURE__ */ D("p", {
|
|
459
460
|
className: "text-sm text-text-secondary",
|
|
460
461
|
children: "Total Revenue"
|
|
461
|
-
}), /* @__PURE__ */
|
|
462
|
+
}), /* @__PURE__ */ D("p", {
|
|
462
463
|
className: "text-lg font-bold text-text-primary",
|
|
463
464
|
children: t(Z)
|
|
464
|
-
})] }), /* @__PURE__ */
|
|
465
|
+
})] }), /* @__PURE__ */ O("div", {
|
|
465
466
|
className: "text-right",
|
|
466
|
-
children: [/* @__PURE__ */
|
|
467
|
+
children: [/* @__PURE__ */ D("p", {
|
|
467
468
|
className: "text-sm text-text-secondary",
|
|
468
469
|
children: "Total Expenses"
|
|
469
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
475
|
+
}), /* @__PURE__ */ O("div", {
|
|
475
476
|
className: "grid grid-cols-2 gap-3",
|
|
476
|
-
children: [/* @__PURE__ */
|
|
477
|
+
children: [/* @__PURE__ */ O("div", {
|
|
477
478
|
className: "rounded-lg bg-status-success-bg-subtle p-3 text-center",
|
|
478
|
-
children: [/* @__PURE__ */
|
|
479
|
+
children: [/* @__PURE__ */ D("p", {
|
|
479
480
|
className: "text-xl font-bold text-status-success-text",
|
|
480
481
|
children: t($)
|
|
481
|
-
}), /* @__PURE__ */
|
|
482
|
+
}), /* @__PURE__ */ D("p", {
|
|
482
483
|
className: "text-xs text-text-secondary",
|
|
483
484
|
children: "Net Income"
|
|
484
485
|
})]
|
|
485
|
-
}), /* @__PURE__ */
|
|
486
|
+
}), /* @__PURE__ */ O("div", {
|
|
486
487
|
className: "rounded-lg bg-status-info-bg-subtle p-3 text-center",
|
|
487
|
-
children: [/* @__PURE__ */
|
|
488
|
+
children: [/* @__PURE__ */ O("p", {
|
|
488
489
|
className: "text-xl font-bold text-status-info-text",
|
|
489
|
-
children: [
|
|
490
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
500
|
+
K.length > 0 && /* @__PURE__ */ O("div", {
|
|
500
501
|
id: "analytics-performance",
|
|
501
502
|
className: "scroll-mt-6",
|
|
502
|
-
children: [/* @__PURE__ */
|
|
503
|
+
children: [/* @__PURE__ */ D("h2", {
|
|
503
504
|
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
504
505
|
children: "Monthly Performance"
|
|
505
|
-
}), /* @__PURE__ */
|
|
506
|
-
columns:
|
|
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 {
|
|
517
|
+
export { L as AnalyticsPage };
|
|
517
518
|
|
|
518
519
|
//# sourceMappingURL=AnalyticsPage.js.map
|