@burdenoff/microfe-housingvista 2026.709.2 → 2026.709.3

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 (83) hide show
  1. package/dist/housingvista/HousingVistaRoutes.d.ts.map +1 -1
  2. package/dist/housingvista/HousingVistaRoutes.js +136 -37
  3. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  4. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
  5. package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
  6. package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
  7. package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
  8. package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
  9. package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
  12. package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
  13. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  14. package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
  15. package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
  16. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  17. package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
  18. package/dist/housingvista/pages/chat/ChatPage.js +115 -113
  19. package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
  20. package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
  21. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
  22. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  23. package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
  24. package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
  25. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  26. package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
  27. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
  28. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  29. package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
  30. package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
  31. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  32. package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
  33. package/dist/housingvista/pages/legal/LegalPage.js +95 -93
  34. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  35. package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
  36. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
  37. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  38. package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
  39. package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
  40. package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
  41. package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
  42. package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
  43. package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
  44. package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
  45. package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
  46. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  47. package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
  48. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
  49. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  50. package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
  51. package/dist/housingvista/pages/offers/OffersPage.js +94 -92
  52. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
  53. package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
  54. package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
  55. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  56. package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
  57. package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
  58. package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
  59. package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
  60. package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
  61. package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
  62. package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
  63. package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
  64. package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
  65. package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
  66. package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
  67. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  68. package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
  69. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
  70. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  71. package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
  72. package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
  73. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  74. package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
  75. package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
  76. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  77. package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
  78. package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
  79. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  80. package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
  81. package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
  82. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
  83. package/package.json +1 -1
@@ -1,94 +1,96 @@
1
1
  import { PageLayout as e } from "../../components/PageLayout.js";
2
+ import { useTrackPageView as t } from "../../hooks/useHousingVistaAnalytics.js";
2
3
  import "../../components/index.js";
3
- import { Database as t, Download as n, ExternalLink as r, Fingerprint as i, Key as a, Shield as o, Trash2 as s } from "lucide-react";
4
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
- import { useI18n as u } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
- import { EmphasisPanel as d } from "@burdenoff/fe-libs/ui";
4
+ import { Database as n, Download as r, ExternalLink as i, Fingerprint as a, Key as o, Shield as s, Trash2 as c } from "lucide-react";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
7
+ import { EmphasisPanel as f } from "@burdenoff/fe-libs/ui";
7
8
  //#region src/housingvista/pages/settings/SettingsPage.tsx
8
- var f = "/auth/security", p = "/export";
9
- function m({ icon: e, label: t, description: n, onClick: i, tone: a = "default" }) {
9
+ var p = "/auth/security", m = "/export";
10
+ function h({ icon: e, label: t, description: n, onClick: r, tone: a = "default" }) {
10
11
  let o = a === "danger";
11
- return /* @__PURE__ */ l("button", {
12
- onClick: i,
12
+ return /* @__PURE__ */ u("button", {
13
+ onClick: r,
13
14
  className: o ? "flex w-full items-center gap-3 rounded-md border border-status-error-border bg-status-error-bg-subtle p-3 text-left transition-colors hover:bg-status-error-bg-subtle/70" : "flex w-full items-center gap-3 rounded-md border border-border-subtle p-3 text-left transition-colors hover:bg-bg-sunken",
14
15
  children: [
15
- /* @__PURE__ */ c("span", {
16
+ /* @__PURE__ */ l("span", {
16
17
  className: o ? "text-status-error-text" : "text-text-secondary",
17
18
  children: e
18
19
  }),
19
- /* @__PURE__ */ l("div", {
20
+ /* @__PURE__ */ u("div", {
20
21
  className: "min-w-0 flex-1",
21
- children: [/* @__PURE__ */ c("p", {
22
+ children: [/* @__PURE__ */ l("p", {
22
23
  className: o ? "text-sm font-medium text-status-error-text" : "text-sm font-medium text-text-primary",
23
24
  children: t
24
- }), /* @__PURE__ */ c("p", {
25
+ }), /* @__PURE__ */ l("p", {
25
26
  className: "text-xs text-text-secondary",
26
27
  children: n
27
28
  })]
28
29
  }),
29
- /* @__PURE__ */ c(r, { className: "h-3.5 w-3.5 shrink-0 text-text-secondary" })
30
+ /* @__PURE__ */ l(i, { className: "h-3.5 w-3.5 shrink-0 text-text-secondary" })
30
31
  ]
31
32
  });
32
33
  }
33
- function h() {
34
- let { t: r } = u(), h = (e, t) => {
35
- let n = r(e);
34
+ function g() {
35
+ t("housingvista.settings.viewed");
36
+ let { t: i } = d(), g = (e, t) => {
37
+ let n = i(e);
36
38
  return n === e ? t : n;
37
- }, g = () => window.location.assign(f);
38
- return /* @__PURE__ */ l(e, {
39
- title: h("housingvista.settings.title", "Settings"),
40
- description: h("housingvista.settings.description", "Manage your account security and data"),
41
- purpose: h("housingvista.settings.purpose", "Tighten your account security and control your data. Your account, password, two-factor authentication, and data export are managed by the platform — the actions below take you there. Appearance and theme are managed from the top bar."),
42
- children: [/* @__PURE__ */ l(d, {
39
+ }, _ = () => window.location.assign(p);
40
+ return /* @__PURE__ */ u(e, {
41
+ title: g("housingvista.settings.title", "Settings"),
42
+ description: g("housingvista.settings.description", "Manage your account security and data"),
43
+ purpose: g("housingvista.settings.purpose", "Tighten your account security and control your data. Your account, password, two-factor authentication, and data export are managed by the platform — the actions below take you there. Appearance and theme are managed from the top bar."),
44
+ children: [/* @__PURE__ */ u(f, {
43
45
  className: "p-5",
44
46
  children: [
45
- /* @__PURE__ */ l("h2", {
47
+ /* @__PURE__ */ u("h2", {
46
48
  className: "flex items-center gap-2 text-base font-semibold text-text-primary",
47
- children: [/* @__PURE__ */ c(o, { className: "h-4 w-4 text-text-secondary" }), h("housingvista.settings.sections.security", "Security")]
49
+ children: [/* @__PURE__ */ l(s, { className: "h-4 w-4 text-text-secondary" }), g("housingvista.settings.sections.security", "Security")]
48
50
  }),
49
- /* @__PURE__ */ c("p", {
51
+ /* @__PURE__ */ l("p", {
50
52
  className: "mb-3 mt-1 text-xs text-text-secondary",
51
- children: h("housingvista.settings.security.note", "Managed by your account security settings.")
53
+ children: g("housingvista.settings.security.note", "Managed by your account security settings.")
52
54
  }),
53
- /* @__PURE__ */ l("div", {
55
+ /* @__PURE__ */ u("div", {
54
56
  className: "space-y-3",
55
- children: [/* @__PURE__ */ c(m, {
56
- icon: /* @__PURE__ */ c(a, { className: "h-4 w-4" }),
57
- label: h("housingvista.settings.security.changePassword.label", "Change Password"),
58
- description: h("housingvista.settings.security.changePassword.description", "Update your account password"),
59
- onClick: g
60
- }), /* @__PURE__ */ c(m, {
61
- icon: /* @__PURE__ */ c(i, { className: "h-4 w-4" }),
62
- label: h("housingvista.settings.security.twoFactor.label", "Two-Factor Authentication"),
63
- description: h("housingvista.settings.security.twoFactor.description", "Add an extra layer of security to your account"),
64
- onClick: g
57
+ children: [/* @__PURE__ */ l(h, {
58
+ icon: /* @__PURE__ */ l(o, { className: "h-4 w-4" }),
59
+ label: g("housingvista.settings.security.changePassword.label", "Change Password"),
60
+ description: g("housingvista.settings.security.changePassword.description", "Update your account password"),
61
+ onClick: _
62
+ }), /* @__PURE__ */ l(h, {
63
+ icon: /* @__PURE__ */ l(a, { className: "h-4 w-4" }),
64
+ label: g("housingvista.settings.security.twoFactor.label", "Two-Factor Authentication"),
65
+ description: g("housingvista.settings.security.twoFactor.description", "Add an extra layer of security to your account"),
66
+ onClick: _
65
67
  })]
66
68
  })
67
69
  ]
68
- }), /* @__PURE__ */ l("div", {
70
+ }), /* @__PURE__ */ u("div", {
69
71
  className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
70
- children: [/* @__PURE__ */ l("h2", {
72
+ children: [/* @__PURE__ */ u("h2", {
71
73
  className: "mb-4 flex items-center gap-2 text-base font-semibold text-text-primary",
72
- children: [/* @__PURE__ */ c(t, { className: "h-4 w-4 text-text-secondary" }), h("housingvista.settings.sections.dataPrivacy", "Data & Privacy")]
73
- }), /* @__PURE__ */ l("div", {
74
+ children: [/* @__PURE__ */ l(n, { className: "h-4 w-4 text-text-secondary" }), g("housingvista.settings.sections.dataPrivacy", "Data & Privacy")]
75
+ }), /* @__PURE__ */ u("div", {
74
76
  className: "space-y-3",
75
- children: [/* @__PURE__ */ c(m, {
76
- icon: /* @__PURE__ */ c(n, { className: "h-4 w-4" }),
77
- label: h("housingvista.settings.dataPrivacy.exportData.label", "Export Data"),
78
- description: h("housingvista.settings.dataPrivacy.exportData.description", "Download a copy of your data"),
79
- onClick: () => window.location.assign(p)
80
- }), /* @__PURE__ */ c(m, {
77
+ children: [/* @__PURE__ */ l(h, {
78
+ icon: /* @__PURE__ */ l(r, { className: "h-4 w-4" }),
79
+ label: g("housingvista.settings.dataPrivacy.exportData.label", "Export Data"),
80
+ description: g("housingvista.settings.dataPrivacy.exportData.description", "Download a copy of your data"),
81
+ onClick: () => window.location.assign(m)
82
+ }), /* @__PURE__ */ l(h, {
81
83
  tone: "danger",
82
- icon: /* @__PURE__ */ c(s, { className: "h-4 w-4" }),
83
- label: h("housingvista.settings.dataPrivacy.deleteAccount.label", "Delete Account"),
84
- description: h("housingvista.settings.dataPrivacy.deleteAccount.description", "Permanently delete your account and all data"),
85
- onClick: g
84
+ icon: /* @__PURE__ */ l(c, { className: "h-4 w-4" }),
85
+ label: g("housingvista.settings.dataPrivacy.deleteAccount.label", "Delete Account"),
86
+ description: g("housingvista.settings.dataPrivacy.deleteAccount.description", "Permanently delete your account and all data"),
87
+ onClick: _
86
88
  })]
87
89
  })]
88
90
  })]
89
91
  });
90
92
  }
91
93
  //#endregion
92
- export { h as SettingsPage };
94
+ export { g as SettingsPage };
93
95
 
94
96
  //# sourceMappingURL=SettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../../src/housingvista/pages/settings/SettingsPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Shield, Key, Fingerprint, Database, Download, Trash2, ExternalLink } from 'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\n\n/**\n * Cross-MFE shell routes. This MFE owns none of these flows — account security,\n * two-factor auth, account deletion, and data export are provided by the platform\n * app shell at absolute paths outside this MFE's router. We link out rather than\n * fake a mutation this MFE cannot perform.\n */\nconst SHELL_SECURITY_ROUTE = '/auth/security';\nconst SHELL_EXPORT_ROUTE = '/export';\n\ninterface LinkRowProps {\n icon: React.ReactNode;\n label: string;\n description: string;\n onClick: () => void;\n tone?: 'default' | 'danger';\n}\n\nfunction LinkRow({ icon, label, description, onClick, tone = 'default' }: LinkRowProps) {\n const danger = tone === 'danger';\n return (\n <button\n onClick={onClick}\n className={\n danger\n ? 'flex w-full items-center gap-3 rounded-md border border-status-error-border bg-status-error-bg-subtle p-3 text-left transition-colors hover:bg-status-error-bg-subtle/70'\n : 'flex w-full items-center gap-3 rounded-md border border-border-subtle p-3 text-left transition-colors hover:bg-bg-sunken'\n }\n >\n <span className={danger ? 'text-status-error-text' : 'text-text-secondary'}>{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <p className={danger ? 'text-sm font-medium text-status-error-text' : 'text-sm font-medium text-text-primary'}>\n {label}\n </p>\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </div>\n <ExternalLink className=\"h-3.5 w-3.5 shrink-0 text-text-secondary\" />\n </button>\n );\n}\n\nexport function SettingsPage() {\n const { t } = useI18n();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const goToSecurity = () => window.location.assign(SHELL_SECURITY_ROUTE);\n const goToExport = () => window.location.assign(SHELL_EXPORT_ROUTE);\n\n return (\n <PageLayout\n title={tr('housingvista.settings.title', 'Settings')}\n description={tr('housingvista.settings.description', 'Manage your account security and data')}\n purpose={tr(\n 'housingvista.settings.purpose',\n 'Tighten your account security and control your data. Your account, password, two-factor authentication, and data export are managed by the platform — the actions below take you there. Appearance and theme are managed from the top bar.'\n )}\n >\n {/* Security — primary control zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-5\">\n <h2 className=\"flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n {tr('housingvista.settings.sections.security', 'Security')}\n </h2>\n <p className=\"mb-3 mt-1 text-xs text-text-secondary\">\n {tr('housingvista.settings.security.note', 'Managed by your account security settings.')}\n </p>\n <div className=\"space-y-3\">\n <LinkRow\n icon={<Key className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.security.changePassword.label', 'Change Password')}\n description={tr(\n 'housingvista.settings.security.changePassword.description',\n 'Update your account password'\n )}\n onClick={goToSecurity}\n />\n <LinkRow\n icon={<Fingerprint className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.security.twoFactor.label', 'Two-Factor Authentication')}\n description={tr(\n 'housingvista.settings.security.twoFactor.description',\n 'Add an extra layer of security to your account'\n )}\n onClick={goToSecurity}\n />\n </div>\n </EmphasisPanel>\n\n {/* Data & Privacy */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n {tr('housingvista.settings.sections.dataPrivacy', 'Data & Privacy')}\n </h2>\n <div className=\"space-y-3\">\n <LinkRow\n icon={<Download className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.dataPrivacy.exportData.label', 'Export Data')}\n description={tr('housingvista.settings.dataPrivacy.exportData.description', 'Download a copy of your data')}\n onClick={goToExport}\n />\n <LinkRow\n tone=\"danger\"\n icon={<Trash2 className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.dataPrivacy.deleteAccount.label', 'Delete Account')}\n description={tr(\n 'housingvista.settings.dataPrivacy.deleteAccount.description',\n 'Permanently delete your account and all data'\n )}\n onClick={goToSecurity}\n />\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAAuB,kBACvB,IAAqB;AAU3B,SAAS,EAAQ,EAAE,SAAM,UAAO,gBAAa,YAAS,UAAO,aAA2B;CACtF,IAAM,IAAS,MAAS;AACxB,QACE,kBAAC,UAAD;EACW;EACT,WACE,IACI,6KACA;YALR;GAQE,kBAAC,QAAD;IAAM,WAAW,IAAS,2BAA2B;cAAwB;IAAY,CAAA;GACzF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAW,IAAS,+CAA+C;eACnE;KACC,CAAA,EACJ,kBAAC,KAAD;KAAG,WAAU;eAA+B;KAAgB,CAAA,CACxD;;GACN,kBAAC,GAAD,EAAc,WAAU,4CAA6C,CAAA;GAC9D;;;AAIb,SAAgB,IAAe;CAC7B,IAAM,EAAE,SAAM,GAAS,EAEjB,KAAM,GAAa,MAAqB;EAC5C,IAAM,IAAa,EAAE,EAAI;AACzB,SAAO,MAAe,IAAM,IAAW;IAGnC,UAAqB,OAAO,SAAS,OAAO,EAAqB;AAGvE,QACE,kBAAC,GAAD;EACE,OAAO,EAAG,+BAA+B,WAAW;EACpD,aAAa,EAAG,qCAAqC,wCAAwC;EAC7F,SAAS,EACP,iCACA,6OACD;YANH,CASE,kBAAC,GAAD;GAAe,WAAU;aAAzB;IACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EACjD,EAAG,2CAA2C,WAAW,CACvD;;IACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAG,uCAAuC,6CAA6C;KACtF,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;MACjC,OAAO,EAAG,uDAAuD,kBAAkB;MACnF,aAAa,EACX,6DACA,+BACD;MACD,SAAS;MACT,CAAA,EACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;MACzC,OAAO,EAAG,kDAAkD,4BAA4B;MACxF,aAAa,EACX,wDACA,iDACD;MACD,SAAS;MACT,CAAA,CACE;;IACQ;MAGhB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACnD,EAAG,8CAA8C,iBAAiB,CAChE;OACL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KACtC,OAAO,EAAG,sDAAsD,cAAc;KAC9E,aAAa,EAAG,4DAA4D,+BAA+B;KAC3G,eArDe,OAAO,SAAS,OAAO,EAAmB;KAsDzD,CAAA,EACF,kBAAC,GAAD;KACE,MAAK;KACL,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,OAAO,EAAG,yDAAyD,iBAAiB;KACpF,aAAa,EACX,+DACA,+CACD;KACD,SAAS;KACT,CAAA,CACE;MACF;KACK"}
1
+ {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../../src/housingvista/pages/settings/SettingsPage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Shield, Key, Fingerprint, Database, Download, Trash2, ExternalLink } from 'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\n/**\n * Cross-MFE shell routes. This MFE owns none of these flows — account security,\n * two-factor auth, account deletion, and data export are provided by the platform\n * app shell at absolute paths outside this MFE's router. We link out rather than\n * fake a mutation this MFE cannot perform.\n */\nconst SHELL_SECURITY_ROUTE = '/auth/security';\nconst SHELL_EXPORT_ROUTE = '/export';\n\ninterface LinkRowProps {\n icon: React.ReactNode;\n label: string;\n description: string;\n onClick: () => void;\n tone?: 'default' | 'danger';\n}\n\nfunction LinkRow({ icon, label, description, onClick, tone = 'default' }: LinkRowProps) {\n const danger = tone === 'danger';\n return (\n <button\n onClick={onClick}\n className={\n danger\n ? 'flex w-full items-center gap-3 rounded-md border border-status-error-border bg-status-error-bg-subtle p-3 text-left transition-colors hover:bg-status-error-bg-subtle/70'\n : 'flex w-full items-center gap-3 rounded-md border border-border-subtle p-3 text-left transition-colors hover:bg-bg-sunken'\n }\n >\n <span className={danger ? 'text-status-error-text' : 'text-text-secondary'}>{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <p className={danger ? 'text-sm font-medium text-status-error-text' : 'text-sm font-medium text-text-primary'}>\n {label}\n </p>\n <p className=\"text-xs text-text-secondary\">{description}</p>\n </div>\n <ExternalLink className=\"h-3.5 w-3.5 shrink-0 text-text-secondary\" />\n </button>\n );\n}\n\nexport function SettingsPage() {\n useTrackPageView('housingvista.settings.viewed');\n const { t } = useI18n();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const goToSecurity = () => window.location.assign(SHELL_SECURITY_ROUTE);\n const goToExport = () => window.location.assign(SHELL_EXPORT_ROUTE);\n\n return (\n <PageLayout\n title={tr('housingvista.settings.title', 'Settings')}\n description={tr('housingvista.settings.description', 'Manage your account security and data')}\n purpose={tr(\n 'housingvista.settings.purpose',\n 'Tighten your account security and control your data. Your account, password, two-factor authentication, and data export are managed by the platform — the actions below take you there. Appearance and theme are managed from the top bar.'\n )}\n >\n {/* Security — primary control zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-5\">\n <h2 className=\"flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n {tr('housingvista.settings.sections.security', 'Security')}\n </h2>\n <p className=\"mb-3 mt-1 text-xs text-text-secondary\">\n {tr('housingvista.settings.security.note', 'Managed by your account security settings.')}\n </p>\n <div className=\"space-y-3\">\n <LinkRow\n icon={<Key className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.security.changePassword.label', 'Change Password')}\n description={tr(\n 'housingvista.settings.security.changePassword.description',\n 'Update your account password'\n )}\n onClick={goToSecurity}\n />\n <LinkRow\n icon={<Fingerprint className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.security.twoFactor.label', 'Two-Factor Authentication')}\n description={tr(\n 'housingvista.settings.security.twoFactor.description',\n 'Add an extra layer of security to your account'\n )}\n onClick={goToSecurity}\n />\n </div>\n </EmphasisPanel>\n\n {/* Data & Privacy */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <Database className=\"h-4 w-4 text-text-secondary\" />\n {tr('housingvista.settings.sections.dataPrivacy', 'Data & Privacy')}\n </h2>\n <div className=\"space-y-3\">\n <LinkRow\n icon={<Download className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.dataPrivacy.exportData.label', 'Export Data')}\n description={tr('housingvista.settings.dataPrivacy.exportData.description', 'Download a copy of your data')}\n onClick={goToExport}\n />\n <LinkRow\n tone=\"danger\"\n icon={<Trash2 className=\"h-4 w-4\" />}\n label={tr('housingvista.settings.dataPrivacy.deleteAccount.label', 'Delete Account')}\n description={tr(\n 'housingvista.settings.dataPrivacy.deleteAccount.description',\n 'Permanently delete your account and all data'\n )}\n onClick={goToSecurity}\n />\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAYA,IAAM,IAAuB,kBACvB,IAAqB;AAU3B,SAAS,EAAQ,EAAE,SAAM,UAAO,gBAAa,YAAS,UAAO,aAA2B;CACtF,IAAM,IAAS,MAAS;AACxB,QACE,kBAAC,UAAD;EACW;EACT,WACE,IACI,6KACA;YALR;GAQE,kBAAC,QAAD;IAAM,WAAW,IAAS,2BAA2B;cAAwB;IAAY,CAAA;GACzF,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAW,IAAS,+CAA+C;eACnE;KACC,CAAA,EACJ,kBAAC,KAAD;KAAG,WAAU;eAA+B;KAAgB,CAAA,CACxD;;GACN,kBAAC,GAAD,EAAc,WAAU,4CAA6C,CAAA;GAC9D;;;AAIb,SAAgB,IAAe;AAC7B,GAAiB,+BAA+B;CAChD,IAAM,EAAE,SAAM,GAAS,EAEjB,KAAM,GAAa,MAAqB;EAC5C,IAAM,IAAa,EAAE,EAAI;AACzB,SAAO,MAAe,IAAM,IAAW;IAGnC,UAAqB,OAAO,SAAS,OAAO,EAAqB;AAGvE,QACE,kBAAC,GAAD;EACE,OAAO,EAAG,+BAA+B,WAAW;EACpD,aAAa,EAAG,qCAAqC,wCAAwC;EAC7F,SAAS,EACP,iCACA,6OACD;YANH,CASE,kBAAC,GAAD;GAAe,WAAU;aAAzB;IACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,EACjD,EAAG,2CAA2C,WAAW,CACvD;;IACL,kBAAC,KAAD;KAAG,WAAU;eACV,EAAG,uCAAuC,6CAA6C;KACtF,CAAA;IACJ,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;MACjC,OAAO,EAAG,uDAAuD,kBAAkB;MACnF,aAAa,EACX,6DACA,+BACD;MACD,SAAS;MACT,CAAA,EACF,kBAAC,GAAD;MACE,MAAM,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;MACzC,OAAO,EAAG,kDAAkD,4BAA4B;MACxF,aAAa,EACX,wDACA,iDACD;MACD,SAAS;MACT,CAAA,CACE;;IACQ;MAGhB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CACE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,EACnD,EAAG,8CAA8C,iBAAiB,CAChE;OACL,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KACtC,OAAO,EAAG,sDAAsD,cAAc;KAC9E,aAAa,EAAG,4DAA4D,+BAA+B;KAC3G,eArDe,OAAO,SAAS,OAAO,EAAmB;KAsDzD,CAAA,EACF,kBAAC,GAAD;KACE,MAAK;KACL,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;KACpC,OAAO,EAAG,yDAAyD,iBAAiB;KACpF,aAAa,EACX,+DACA,+CACD;KACD,SAAS;KACT,CAAA,CACE;MACF;KACK"}
@@ -1 +1 @@
1
- {"version":3,"file":"ShortlistPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/shortlist/ShortlistPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,eAAO,MAAM,aAAa,mCAgGzB,CAAC"}
1
+ {"version":3,"file":"ShortlistPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/shortlist/ShortlistPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH,eAAO,MAAM,aAAa,mCAiGzB,CAAC"}
@@ -2,49 +2,51 @@ import { PageLayout as e } from "../../components/PageLayout.js";
2
2
  import { EmptyState as t } from "../../components/EmptyState.js";
3
3
  import { LoadingSkeleton as n } from "../../components/LoadingSkeleton.js";
4
4
  import { PropertyCard as r } from "../../components/PropertyCard.js";
5
- import { useRemoveShortlist as i, useShortlists as a } from "../../hooks/index.js";
6
- import { notify as o } from "../../lib/toast.js";
5
+ import { useTrackPageView as i } from "../../hooks/useHousingVistaAnalytics.js";
6
+ import { useRemoveShortlist as a, useShortlists as o } from "../../hooks/index.js";
7
+ import { notify as s } from "../../lib/toast.js";
7
8
  import "../../components/index.js";
8
- import { useServerPagination as s } from "../../hooks/useServerPagination.js";
9
- import { useMemo as c } from "react";
10
- import { Heart as l, Search as u } from "lucide-react";
11
- import { useNavigate as d } from "react-router-dom";
12
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
13
- import { Button as h, Pagination as g } from "@burdenoff/fe-libs/ui";
9
+ import { useServerPagination as c } from "../../hooks/useServerPagination.js";
10
+ import { useMemo as l } from "react";
11
+ import { Heart as u, Search as d } from "lucide-react";
12
+ import { useNavigate as f } from "react-router-dom";
13
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
14
+ import { Button as g, Pagination as _ } from "@burdenoff/fe-libs/ui";
14
15
  //#region src/housingvista/pages/shortlist/ShortlistPage.tsx
15
- var _ = 9, v = () => {
16
- let v = d(), { page: y, pageSize: b, pagination: x, setPage: S, setPageSize: C } = s(_), { data: w, loading: T } = a({
17
- limit: x.limit,
18
- offset: x.offset
19
- }), { removeShortlist: E } = i(), D = c(() => w.map((e) => e.property), [w]), O = w.length >= b, k = async (e) => {
16
+ var v = 9, y = () => {
17
+ i("housingvista.shortlist.viewed");
18
+ let y = f(), { page: b, pageSize: x, pagination: S, setPage: C, setPageSize: w } = c(v), { data: T, loading: E } = o({
19
+ limit: S.limit,
20
+ offset: S.offset
21
+ }), { removeShortlist: D } = a(), O = l(() => T.map((e) => e.property), [T]), k = T.length >= x, A = async (e) => {
20
22
  try {
21
- await E(e), o.success("Removed from shortlist");
23
+ await D(e), s.success("Removed from shortlist");
22
24
  } catch (e) {
23
- o.error("Could not update shortlist", e.message);
25
+ s.error("Could not update shortlist", e.message);
24
26
  }
25
- }, A = D.length === 1 ? "1 saved" : `${D.length} saved`;
26
- return /* @__PURE__ */ p(e, {
27
+ }, j = O.length === 1 ? "1 saved" : `${O.length} saved`;
28
+ return /* @__PURE__ */ m(e, {
27
29
  title: "Shortlist",
28
30
  description: "Properties you've saved to compare and revisit",
29
31
  purpose: "Everything you've hearted in one place. Compare your saved properties side by side, jump back into any listing to schedule a viewing or make an offer, and remove the ones you've ruled out.",
30
- actions: /* @__PURE__ */ m("div", {
32
+ actions: /* @__PURE__ */ h("div", {
31
33
  className: "flex items-center gap-3",
32
- children: [!T && D.length > 0 && /* @__PURE__ */ p("span", {
34
+ children: [!E && O.length > 0 && /* @__PURE__ */ m("span", {
33
35
  className: "hidden rounded-full bg-status-success-bg-subtle px-3 py-1 text-sm font-semibold text-status-success-text sm:inline",
34
- children: A
35
- }), /* @__PURE__ */ m(h, {
36
+ children: j
37
+ }), /* @__PURE__ */ h(g, {
36
38
  variant: "outline",
37
- onClick: () => v("../properties"),
39
+ onClick: () => y("../properties"),
38
40
  className: "gap-2",
39
- children: [/* @__PURE__ */ p(u, { className: "h-4 w-4" }), "Browse Properties"]
41
+ children: [/* @__PURE__ */ m(d, { className: "h-4 w-4" }), "Browse Properties"]
40
42
  })]
41
43
  }),
42
- children: T ? /* @__PURE__ */ p(n, {
44
+ children: E ? /* @__PURE__ */ m(n, {
43
45
  variant: "card",
44
46
  count: 6
45
- }) : D.length > 0 ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
47
+ }) : O.length > 0 ? /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
46
48
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3",
47
- children: D.map((e) => /* @__PURE__ */ p(r, {
49
+ children: O.map((e) => /* @__PURE__ */ m(r, {
48
50
  id: e.id,
49
51
  title: e.title,
50
52
  price: e.price.amount,
@@ -58,25 +60,25 @@ var _ = 9, v = () => {
58
60
  imageUrl: e.images[0]?.url,
59
61
  status: e.status.replace("_", " "),
60
62
  type: e.category,
61
- onClick: () => v(`../properties/${e.id}`),
63
+ onClick: () => y(`../properties/${e.id}`),
62
64
  isShortlisted: !0,
63
- onToggleShortlist: () => k(e.id)
65
+ onToggleShortlist: () => A(e.id)
64
66
  }, e.id))
65
- }), /* @__PURE__ */ p(g, {
66
- page: y,
67
- pageSize: b,
68
- hasNextPage: O,
69
- hasPreviousPage: y > 1,
70
- loading: T,
71
- onPageChange: S,
72
- onPageSizeChange: C
73
- })] }) : /* @__PURE__ */ p(t, {
67
+ }), /* @__PURE__ */ m(_, {
68
+ page: b,
69
+ pageSize: x,
70
+ hasNextPage: k,
71
+ hasPreviousPage: b > 1,
72
+ loading: E,
73
+ onPageChange: C,
74
+ onPageSizeChange: w
75
+ })] }) : /* @__PURE__ */ m(t, {
74
76
  illustration: "empty-generic",
75
- icon: /* @__PURE__ */ p(l, { className: "h-12 w-12" }),
77
+ icon: /* @__PURE__ */ m(u, { className: "h-12 w-12" }),
76
78
  title: "No saved properties yet",
77
79
  description: "Tap the heart on any property to save it here for easy comparison later.",
78
- action: /* @__PURE__ */ p("button", {
79
- onClick: () => v("../properties"),
80
+ action: /* @__PURE__ */ m("button", {
81
+ onClick: () => y("../properties"),
80
82
  className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover",
81
83
  children: "Browse Properties"
82
84
  })
@@ -84,6 +86,6 @@ var _ = 9, v = () => {
84
86
  });
85
87
  };
86
88
  //#endregion
87
- export { v as ShortlistPage };
89
+ export { y as ShortlistPage };
88
90
 
89
91
  //# sourceMappingURL=ShortlistPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ShortlistPage.js","names":[],"sources":["../../../../src/housingvista/pages/shortlist/ShortlistPage.tsx"],"sourcesContent":["/**\n * HousingVista Shortlist Page\n * The properties the user has saved (housingvistaShortlists), with one-tap\n * un-save and a jump into each property's detail. No mock data.\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Heart, Search } from 'lucide-react';\nimport { Pagination, Button } from '@burdenoff/fe-libs/ui';\nimport { PageLayout, PropertyCard, EmptyState, LoadingSkeleton } from '../../components';\nimport { useShortlists, useRemoveShortlist } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { notify } from '../../lib/toast';\n\nconst PAGE_SIZE = 9;\n\nexport const ShortlistPage = () => {\n const navigate = useNavigate();\n const { page, pageSize, pagination, setPage, setPageSize } = useServerPagination(PAGE_SIZE);\n const { data: shortlists, loading } = useShortlists({ limit: pagination.limit, offset: pagination.offset });\n const { removeShortlist } = useRemoveShortlist();\n\n const properties = useMemo(() => shortlists.map((s) => s.property), [shortlists]);\n const hasNextPage = shortlists.length >= pageSize;\n\n const handleRemove = async (propertyId: string) => {\n try {\n await removeShortlist(propertyId);\n notify.success('Removed from shortlist');\n } catch (err) {\n notify.error('Could not update shortlist', (err as Error).message);\n }\n };\n\n const savedLabel = properties.length === 1 ? '1 saved' : `${properties.length} saved`;\n\n return (\n <PageLayout\n title=\"Shortlist\"\n description=\"Properties you've saved to compare and revisit\"\n purpose=\"Everything you've hearted in one place. Compare your saved properties side by side, jump back into any listing to schedule a viewing or make an offer, and remove the ones you've ruled out.\"\n actions={\n <div className=\"flex items-center gap-3\">\n {!loading && properties.length > 0 && (\n <span className=\"hidden rounded-full bg-status-success-bg-subtle px-3 py-1 text-sm font-semibold text-status-success-text sm:inline\">\n {savedLabel}\n </span>\n )}\n <Button variant=\"outline\" onClick={() => navigate('../properties')} className=\"gap-2\">\n <Search className=\"h-4 w-4\" />\n Browse Properties\n </Button>\n </div>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"card\" count={6} />\n ) : properties.length > 0 ? (\n <>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {properties.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].filter(Boolean).join(', ')}\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 isShortlisted\n onToggleShortlist={() => handleRemove(property.id)}\n />\n ))}\n </div>\n\n {/* Pagination (server-side): working prev/next + page-size */}\n <Pagination\n page={page}\n pageSize={pageSize}\n hasNextPage={hasNextPage}\n hasPreviousPage={page > 1}\n loading={loading}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n icon={<Heart className=\"h-12 w-12\" />}\n title=\"No saved properties yet\"\n description=\"Tap the heart on any property to save it here for easy comparison later.\"\n action={\n <button\n onClick={() => navigate('../properties')}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n Browse Properties\n </button>\n }\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAgBA,IAAM,IAAY,GAEL,UAAsB;CACjC,IAAM,IAAW,GAAa,EACxB,EAAE,SAAM,aAAU,eAAY,YAAS,mBAAgB,EAAoB,EAAU,EACrF,EAAE,MAAM,GAAY,eAAY,EAAc;EAAE,OAAO,EAAW;EAAO,QAAQ,EAAW;EAAQ,CAAC,EACrG,EAAE,uBAAoB,GAAoB,EAE1C,IAAa,QAAc,EAAW,KAAK,MAAM,EAAE,SAAS,EAAE,CAAC,EAAW,CAAC,EAC3E,IAAc,EAAW,UAAU,GAEnC,IAAe,OAAO,MAAuB;AACjD,MAAI;AAEF,GADA,MAAM,EAAgB,EAAW,EACjC,EAAO,QAAQ,yBAAyB;WACjC,GAAK;AACZ,KAAO,MAAM,8BAA+B,EAAc,QAAQ;;IAIhE,IAAa,EAAW,WAAW,IAAI,YAAY,GAAG,EAAW,OAAO;AAE9E,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,CAAC,KAAW,EAAW,SAAS,KAC/B,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA,EAET,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,EAAS,gBAAgB;IAAE,WAAU;cAA9E,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,oBAEvB;MACL;;YAGP,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA,GAC1C,EAAW,SAAS,IACtB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAW,KAAK,MACf,kBAAC,GAAD;IAEE,IAAI,EAAS;IACb,OAAO,EAAS;IAChB,OAAO,EAAS,MAAM;IACtB,WAAW,EAAS,MAAM,SAAS,SAAS,SAAS;IACrD,aAAa,EAAS,MAAM;IAC5B,UAAU,EAAS,MAAM;IACzB,UAAU,CAAC,EAAS,SAAS,cAAc,EAAS,SAAS,KAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;IAC7F,UAAU,EAAS,eAAe;IAClC,WAAW,EAAS,eAAe;IACnC,MAAM,EAAS,eAAe;IAC9B,UAAU,EAAS,OAAO,IAAI;IAC9B,QAAQ,EAAS,OAAO,QAAQ,KAAK,IAAI;IACzC,MAAM,EAAS;IACf,eAAe,EAAS,iBAAiB,EAAS,KAAK;IACvD,eAAA;IACA,yBAAyB,EAAa,EAAS,GAAG;IAClD,EAjBK,EAAS,GAiBd,CACF;GACE,CAAA,EAGN,kBAAC,GAAD;GACQ;GACI;GACG;GACb,iBAAiB,IAAO;GACf;GACT,cAAc;GACd,kBAAkB;GAClB,CAAA,CACD,EAAA,CAAA,GAEH,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;GACrC,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IACE,eAAe,EAAS,gBAAgB;IACxC,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA;EAEO,CAAA"}
1
+ {"version":3,"file":"ShortlistPage.js","names":[],"sources":["../../../../src/housingvista/pages/shortlist/ShortlistPage.tsx"],"sourcesContent":["/**\n * HousingVista Shortlist Page\n * The properties the user has saved (housingvistaShortlists), with one-tap\n * un-save and a jump into each property's detail. No mock data.\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Heart, Search } from 'lucide-react';\nimport { Pagination, Button } from '@burdenoff/fe-libs/ui';\nimport { PageLayout, PropertyCard, EmptyState, LoadingSkeleton } from '../../components';\nimport { useShortlists, useRemoveShortlist } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { notify } from '../../lib/toast';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nconst PAGE_SIZE = 9;\n\nexport const ShortlistPage = () => {\n useTrackPageView('housingvista.shortlist.viewed');\n const navigate = useNavigate();\n const { page, pageSize, pagination, setPage, setPageSize } = useServerPagination(PAGE_SIZE);\n const { data: shortlists, loading } = useShortlists({ limit: pagination.limit, offset: pagination.offset });\n const { removeShortlist } = useRemoveShortlist();\n\n const properties = useMemo(() => shortlists.map((s) => s.property), [shortlists]);\n const hasNextPage = shortlists.length >= pageSize;\n\n const handleRemove = async (propertyId: string) => {\n try {\n await removeShortlist(propertyId);\n notify.success('Removed from shortlist');\n } catch (err) {\n notify.error('Could not update shortlist', (err as Error).message);\n }\n };\n\n const savedLabel = properties.length === 1 ? '1 saved' : `${properties.length} saved`;\n\n return (\n <PageLayout\n title=\"Shortlist\"\n description=\"Properties you've saved to compare and revisit\"\n purpose=\"Everything you've hearted in one place. Compare your saved properties side by side, jump back into any listing to schedule a viewing or make an offer, and remove the ones you've ruled out.\"\n actions={\n <div className=\"flex items-center gap-3\">\n {!loading && properties.length > 0 && (\n <span className=\"hidden rounded-full bg-status-success-bg-subtle px-3 py-1 text-sm font-semibold text-status-success-text sm:inline\">\n {savedLabel}\n </span>\n )}\n <Button variant=\"outline\" onClick={() => navigate('../properties')} className=\"gap-2\">\n <Search className=\"h-4 w-4\" />\n Browse Properties\n </Button>\n </div>\n }\n >\n {loading ? (\n <LoadingSkeleton variant=\"card\" count={6} />\n ) : properties.length > 0 ? (\n <>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {properties.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].filter(Boolean).join(', ')}\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 isShortlisted\n onToggleShortlist={() => handleRemove(property.id)}\n />\n ))}\n </div>\n\n {/* Pagination (server-side): working prev/next + page-size */}\n <Pagination\n page={page}\n pageSize={pageSize}\n hasNextPage={hasNextPage}\n hasPreviousPage={page > 1}\n loading={loading}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n icon={<Heart className=\"h-12 w-12\" />}\n title=\"No saved properties yet\"\n description=\"Tap the heart on any property to save it here for easy comparison later.\"\n action={\n <button\n onClick={() => navigate('../properties')}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n Browse Properties\n </button>\n }\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAiBA,IAAM,IAAY,GAEL,UAAsB;AACjC,GAAiB,gCAAgC;CACjD,IAAM,IAAW,GAAa,EACxB,EAAE,SAAM,aAAU,eAAY,YAAS,mBAAgB,EAAoB,EAAU,EACrF,EAAE,MAAM,GAAY,eAAY,EAAc;EAAE,OAAO,EAAW;EAAO,QAAQ,EAAW;EAAQ,CAAC,EACrG,EAAE,uBAAoB,GAAoB,EAE1C,IAAa,QAAc,EAAW,KAAK,MAAM,EAAE,SAAS,EAAE,CAAC,EAAW,CAAC,EAC3E,IAAc,EAAW,UAAU,GAEnC,IAAe,OAAO,MAAuB;AACjD,MAAI;AAEF,GADA,MAAM,EAAgB,EAAW,EACjC,EAAO,QAAQ,yBAAyB;WACjC,GAAK;AACZ,KAAO,MAAM,8BAA+B,EAAc,QAAQ;;IAIhE,IAAa,EAAW,WAAW,IAAI,YAAY,GAAG,EAAW,OAAO;AAE9E,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SAAQ;EACR,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,CAAC,KAAW,EAAW,SAAS,KAC/B,kBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA,EAET,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,EAAS,gBAAgB;IAAE,WAAU;cAA9E,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,oBAEvB;MACL;;YAGP,IACC,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;GAAK,CAAA,GAC1C,EAAW,SAAS,IACtB,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAW,KAAK,MACf,kBAAC,GAAD;IAEE,IAAI,EAAS;IACb,OAAO,EAAS;IAChB,OAAO,EAAS,MAAM;IACtB,WAAW,EAAS,MAAM,SAAS,SAAS,SAAS;IACrD,aAAa,EAAS,MAAM;IAC5B,UAAU,EAAS,MAAM;IACzB,UAAU,CAAC,EAAS,SAAS,cAAc,EAAS,SAAS,KAAK,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK;IAC7F,UAAU,EAAS,eAAe;IAClC,WAAW,EAAS,eAAe;IACnC,MAAM,EAAS,eAAe;IAC9B,UAAU,EAAS,OAAO,IAAI;IAC9B,QAAQ,EAAS,OAAO,QAAQ,KAAK,IAAI;IACzC,MAAM,EAAS;IACf,eAAe,EAAS,iBAAiB,EAAS,KAAK;IACvD,eAAA;IACA,yBAAyB,EAAa,EAAS,GAAG;IAClD,EAjBK,EAAS,GAiBd,CACF;GACE,CAAA,EAGN,kBAAC,GAAD;GACQ;GACI;GACG;GACb,iBAAiB,IAAO;GACf;GACT,cAAc;GACd,kBAAkB;GAClB,CAAA,CACD,EAAA,CAAA,GAEH,kBAAC,GAAD;GACE,cAAa;GACb,MAAM,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;GACrC,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,UAAD;IACE,eAAe,EAAS,gBAAgB;IACxC,WAAU;cACX;IAEQ,CAAA;GAEX,CAAA;EAEO,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/transactions/TransactionDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2EH,eAAO,MAAM,qBAAqB,mCAofjC,CAAC"}
1
+ {"version":3,"file":"TransactionDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/transactions/TransactionDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4EH,eAAO,MAAM,qBAAqB,mCAsfjC,CAAC"}