@burdenoff/microfe-housingvista 2026.730.1 → 2026.801.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/housingvista/HousingVistaRoutes.js +1 -1
  2. package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
  3. package/dist/housingvista/components/Breadcrumbs.js +1 -1
  4. package/dist/housingvista/components/Breadcrumbs.js.map +1 -1
  5. package/dist/housingvista/context/HousingVistaContext.js +1 -1
  6. package/dist/housingvista/context/HousingVistaContext.js.map +1 -1
  7. package/dist/housingvista/pages/HomePage.js +1 -1
  8. package/dist/housingvista/pages/HomePage.js.map +1 -1
  9. package/dist/housingvista/pages/amc/AMCManagementPage.js +1 -1
  10. package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
  11. package/dist/housingvista/pages/assets/AssetDetailPage.js +1 -1
  12. package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
  13. package/dist/housingvista/pages/assets/AssetManagementPage.js +1 -1
  14. package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
  15. package/dist/housingvista/pages/chat/ChatPage.js +1 -1
  16. package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
  17. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +1 -1
  18. package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
  19. package/dist/housingvista/pages/finance/HomeLoansPage.js +1 -1
  20. package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
  21. package/dist/housingvista/pages/investments/InvestmentDetailPage.js +1 -1
  22. package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
  23. package/dist/housingvista/pages/investments/InvestmentsPage.js +1 -1
  24. package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
  25. package/dist/housingvista/pages/legal/LegalPage.js +1 -1
  26. package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
  27. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +1 -1
  28. package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
  29. package/dist/housingvista/pages/marketplace/MarketplacePage.js +1 -1
  30. package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
  31. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +1 -1
  32. package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
  33. package/dist/housingvista/pages/offers/OffersPage.js +1 -1
  34. package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
  35. package/dist/housingvista/pages/properties/AddPropertyPage.js +1 -1
  36. package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
  37. package/dist/housingvista/pages/properties/PropertiesPage.js +1 -1
  38. package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
  39. package/dist/housingvista/pages/properties/PropertyDetailPage.js +1 -1
  40. package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
  41. package/dist/housingvista/pages/shortlist/ShortlistPage.js +1 -1
  42. package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
  43. package/dist/housingvista/pages/transactions/TransactionDetailPage.js +1 -1
  44. package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
  45. package/dist/housingvista/pages/transactions/TransactionsPage.js +1 -1
  46. package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
  47. package/dist/housingvista/pages/verification/VerificationDetailPage.js +1 -1
  48. package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
  49. package/dist/housingvista/pages/verification/VerificationPage.js +1 -1
  50. package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
  51. package/dist/housingvista/pages/viewings/ViewingsPage.js +1 -1
  52. package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
  53. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  import { HomePage as e } from "./pages/HomePage.js";
2
2
  import { Suspense as t, lazy as n } from "react";
3
- import { Navigate as r, Route as i, Routes as a } from "react-router-dom";
3
+ import { Navigate as r, Route as i, Routes as a } from "react-router";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
5
  import { FeatureGate as c } from "@burdenoff/fe-libs/shared/feature-flags";
6
6
  //#region src/housingvista/HousingVistaRoutes.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"HousingVistaRoutes.js","names":[],"sources":["../../src/housingvista/HousingVistaRoutes.tsx"],"sourcesContent":["/**\n * HousingVista Routes\n * All route definitions with lazy loading.\n * @module housingvista\n */\n\nimport { lazy, Suspense, type ReactNode } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\n\n// Eagerly load the home page\nimport { HomePage } from './pages/HomePage';\n\n// Loading fallback\nconst PageLoader = () => (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"text-sm text-text-secondary\">Loading...</div>\n </div>\n);\n\n/**\n * Route-level feature flag gate.\n * Every HousingVista page is behind a `housingvista.{route}` flag that defaults\n * to enabled, matching the platform default-allow convention.\n */\nfunction FeatureFlagRoute({ flag, children }: { flag: string; children: ReactNode }) {\n return (\n <FeatureGate flag={flag} defaultValue={true}>\n {children}\n </FeatureGate>\n );\n}\n\n// ── Properties ──────────────────────────────────────────────────────────────\nconst PropertiesPage = lazy(() =>\n import('./pages/properties/PropertiesPage').then((m) => ({ default: m.PropertiesPage }))\n);\nconst AddPropertyPage = lazy(() =>\n import('./pages/properties/AddPropertyPage').then((m) => ({ default: m.AddPropertyPage }))\n);\nconst PropertyDetailPage = lazy(() =>\n import('./pages/properties/PropertyDetailPage').then((m) => ({ default: m.PropertyDetailPage }))\n);\nconst ShortlistPage = lazy(() => import('./pages/shortlist/ShortlistPage').then((m) => ({ default: m.ShortlistPage })));\n\n// ── Transactions ────────────────────────────────────────────────────────────\nconst TransactionsPage = lazy(() =>\n import('./pages/transactions/TransactionsPage').then((m) => ({ default: m.TransactionsPage }))\n);\nconst TransactionDetailPage = lazy(() =>\n import('./pages/transactions/TransactionDetailPage').then((m) => ({ default: m.TransactionDetailPage }))\n);\n\n// ── Investments ─────────────────────────────────────────────────────────────\nconst InvestmentsPage = lazy(() =>\n import('./pages/investments/InvestmentsPage').then((m) => ({ default: m.InvestmentsPage }))\n);\nconst InvestmentDetailPage = lazy(() =>\n import('./pages/investments/InvestmentDetailPage').then((m) => ({ default: m.InvestmentDetailPage }))\n);\n\n// ── Offers ──────────────────────────────────────────────────────────────────\nconst OffersPage = lazy(() => import('./pages/offers/OffersPage').then((m) => ({ default: m.OffersPage })));\n\n// ── Viewings ────────────────────────────────────────────────────────────────\nconst ViewingsPage = lazy(() => import('./pages/viewings/ViewingsPage').then((m) => ({ default: m.ViewingsPage })));\n\n// ── Messages / Chat ───────────────────────────────────────────────────────────\nconst ChatPage = lazy(() => import('./pages/chat/ChatPage').then((m) => ({ default: m.ChatPage })));\n\n// ── Analytics ───────────────────────────────────────────────────────────────\nconst AnalyticsPage = lazy(() => import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage })));\n\n// ── Rental Management ───────────────────────────────────────────────────────\nconst RentalManagementPage = lazy(() =>\n import('./pages/rental/RentalManagementPage').then((m) => ({ default: m.RentalManagementPage }))\n);\n\n// ── Asset Management ────────────────────────────────────────────────────────\nconst AssetManagementPage = lazy(() =>\n import('./pages/assets/AssetManagementPage').then((m) => ({ default: m.AssetManagementPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\n\n// ── AMC Management ──────────────────────────────────────────────────────────\nconst AMCManagementPage = lazy(() =>\n import('./pages/amc/AMCManagementPage').then((m) => ({ default: m.AMCManagementPage }))\n);\n\n// ── Marketplace ─────────────────────────────────────────────────────────────\nconst MarketplacePage = lazy(() =>\n import('./pages/marketplace/MarketplacePage').then((m) => ({ default: m.MarketplacePage }))\n);\nconst ServiceDetailPage = lazy(() =>\n import('./pages/marketplace/ServiceDetailPage').then((m) => ({ default: m.ServiceDetailPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\nconst VerificationDetailPage = lazy(() =>\n import('./pages/verification/VerificationDetailPage').then((m) => ({ default: m.VerificationDetailPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\nconst LegalServiceDetailPage = lazy(() =>\n import('./pages/legal/LegalServiceDetailPage').then((m) => ({ default: m.LegalServiceDetailPage }))\n);\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\nconst HomeLoanDetailPage = lazy(() =>\n import('./pages/finance/HomeLoanDetailPage').then((m) => ({ default: m.HomeLoanDetailPage }))\n);\n\n// ── Market ──────────────────────────────────────────────────────────────────\nconst MarketAnalyticsPage = lazy(() =>\n import('./pages/market/MarketAnalyticsPage').then((m) => ({ default: m.MarketAnalyticsPage }))\n);\nconst AreaInsightsPage = lazy(() =>\n import('./pages/market/AreaInsightsPage').then((m) => ({ default: m.AreaInsightsPage }))\n);\n\n// ── Settings ────────────────────────────────────────────────────────────────\nconst SettingsPage = lazy(() => import('./pages/settings/SettingsPage').then((m) => ({ default: m.SettingsPage })));\nconst ProfilePage = lazy(() => import('./pages/settings/ProfilePage').then((m) => ({ default: m.ProfilePage })));\n\n// ============================================================================\n// Routes\n// ============================================================================\n\nexport function HousingVistaRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Dashboard */}\n <Route\n index\n element={\n <FeatureFlagRoute flag=\"housingvista.dashboard\">\n <HomePage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Properties */}\n <Route\n path=\"properties\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <PropertiesPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"properties/new\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <AddPropertyPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"properties/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <PropertyDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Shortlist */}\n <Route\n path=\"shortlist\"\n element={\n <FeatureFlagRoute flag=\"housingvista.shortlist\">\n <ShortlistPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Transactions */}\n <Route\n path=\"transactions\"\n element={\n <FeatureFlagRoute flag=\"housingvista.transactions\">\n <TransactionsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"transactions/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.transactions\">\n <TransactionDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Investments */}\n <Route\n path=\"investments\"\n element={\n <FeatureFlagRoute flag=\"housingvista.investments\">\n <InvestmentsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"investments/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.investments\">\n <InvestmentDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Offers */}\n <Route\n path=\"offers\"\n element={\n <FeatureFlagRoute flag=\"housingvista.offers\">\n <OffersPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Viewings */}\n <Route\n path=\"viewings\"\n element={\n <FeatureFlagRoute flag=\"housingvista.viewings\">\n <ViewingsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Messages / Chat */}\n <Route\n path=\"chat\"\n element={\n <FeatureFlagRoute flag=\"housingvista.chat\">\n <ChatPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"messages\"\n element={\n <FeatureFlagRoute flag=\"housingvista.chat\">\n <Navigate to=\"../chat\" replace />\n </FeatureFlagRoute>\n }\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics\"\n element={\n <FeatureFlagRoute flag=\"housingvista.analytics\">\n <AnalyticsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Rental Management */}\n <Route\n path=\"rental\"\n element={\n <FeatureFlagRoute flag=\"housingvista.rental\">\n <RentalManagementPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Asset Management */}\n <Route\n path=\"assets\"\n element={\n <FeatureFlagRoute flag=\"housingvista.assets\">\n <AssetManagementPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"assets/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.assets\">\n <AssetDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* AMC Management */}\n <Route\n path=\"amc\"\n element={\n <FeatureFlagRoute flag=\"housingvista.amc\">\n <AMCManagementPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Marketplace */}\n <Route\n path=\"marketplace\"\n element={\n <FeatureFlagRoute flag=\"housingvista.marketplace\">\n <MarketplacePage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"marketplace/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.marketplace\">\n <ServiceDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Verification */}\n <Route\n path=\"verification\"\n element={\n <FeatureFlagRoute flag=\"housingvista.verification\">\n <VerificationPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"verification/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.verification\">\n <VerificationDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Legal */}\n <Route\n path=\"legal\"\n element={\n <FeatureFlagRoute flag=\"housingvista.legal\">\n <LegalPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"legal/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.legal\">\n <LegalServiceDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Home Loans */}\n <Route\n path=\"home-loans\"\n element={\n <FeatureFlagRoute flag=\"housingvista.home_loans\">\n <HomeLoansPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"home-loans/:id/apply\"\n element={\n <FeatureFlagRoute flag=\"housingvista.home_loans\">\n <HomeLoanDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Market Analytics */}\n <Route\n path=\"market-analytics\"\n element={\n <FeatureFlagRoute flag=\"housingvista.market_analytics\">\n <MarketAnalyticsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"area-insights\"\n element={\n <FeatureFlagRoute flag=\"housingvista.market_analytics\">\n <AreaInsightsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Settings & Profile */}\n <Route\n path=\"settings\"\n element={\n <FeatureFlagRoute flag=\"housingvista.settings\">\n <SettingsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"profile\"\n element={\n <FeatureFlagRoute flag=\"housingvista.settings\">\n <ProfilePage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Catch-all: redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HousingVistaRoutes.js","names":[],"sources":["../../src/housingvista/HousingVistaRoutes.tsx"],"sourcesContent":["/**\n * HousingVista Routes\n * All route definitions with lazy loading.\n * @module housingvista\n */\n\nimport { lazy, Suspense, type ReactNode } from 'react';\nimport { Routes, Route, Navigate } from 'react-router';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\n\n// Eagerly load the home page\nimport { HomePage } from './pages/HomePage';\n\n// Loading fallback\nconst PageLoader = () => (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"text-sm text-text-secondary\">Loading...</div>\n </div>\n);\n\n/**\n * Route-level feature flag gate.\n * Every HousingVista page is behind a `housingvista.{route}` flag that defaults\n * to enabled, matching the platform default-allow convention.\n */\nfunction FeatureFlagRoute({ flag, children }: { flag: string; children: ReactNode }) {\n return (\n <FeatureGate flag={flag} defaultValue={true}>\n {children}\n </FeatureGate>\n );\n}\n\n// ── Properties ──────────────────────────────────────────────────────────────\nconst PropertiesPage = lazy(() =>\n import('./pages/properties/PropertiesPage').then((m) => ({ default: m.PropertiesPage }))\n);\nconst AddPropertyPage = lazy(() =>\n import('./pages/properties/AddPropertyPage').then((m) => ({ default: m.AddPropertyPage }))\n);\nconst PropertyDetailPage = lazy(() =>\n import('./pages/properties/PropertyDetailPage').then((m) => ({ default: m.PropertyDetailPage }))\n);\nconst ShortlistPage = lazy(() => import('./pages/shortlist/ShortlistPage').then((m) => ({ default: m.ShortlistPage })));\n\n// ── Transactions ────────────────────────────────────────────────────────────\nconst TransactionsPage = lazy(() =>\n import('./pages/transactions/TransactionsPage').then((m) => ({ default: m.TransactionsPage }))\n);\nconst TransactionDetailPage = lazy(() =>\n import('./pages/transactions/TransactionDetailPage').then((m) => ({ default: m.TransactionDetailPage }))\n);\n\n// ── Investments ─────────────────────────────────────────────────────────────\nconst InvestmentsPage = lazy(() =>\n import('./pages/investments/InvestmentsPage').then((m) => ({ default: m.InvestmentsPage }))\n);\nconst InvestmentDetailPage = lazy(() =>\n import('./pages/investments/InvestmentDetailPage').then((m) => ({ default: m.InvestmentDetailPage }))\n);\n\n// ── Offers ──────────────────────────────────────────────────────────────────\nconst OffersPage = lazy(() => import('./pages/offers/OffersPage').then((m) => ({ default: m.OffersPage })));\n\n// ── Viewings ────────────────────────────────────────────────────────────────\nconst ViewingsPage = lazy(() => import('./pages/viewings/ViewingsPage').then((m) => ({ default: m.ViewingsPage })));\n\n// ── Messages / Chat ───────────────────────────────────────────────────────────\nconst ChatPage = lazy(() => import('./pages/chat/ChatPage').then((m) => ({ default: m.ChatPage })));\n\n// ── Analytics ───────────────────────────────────────────────────────────────\nconst AnalyticsPage = lazy(() => import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage })));\n\n// ── Rental Management ───────────────────────────────────────────────────────\nconst RentalManagementPage = lazy(() =>\n import('./pages/rental/RentalManagementPage').then((m) => ({ default: m.RentalManagementPage }))\n);\n\n// ── Asset Management ────────────────────────────────────────────────────────\nconst AssetManagementPage = lazy(() =>\n import('./pages/assets/AssetManagementPage').then((m) => ({ default: m.AssetManagementPage }))\n);\nconst AssetDetailPage = lazy(() =>\n import('./pages/assets/AssetDetailPage').then((m) => ({ default: m.AssetDetailPage }))\n);\n\n// ── AMC Management ──────────────────────────────────────────────────────────\nconst AMCManagementPage = lazy(() =>\n import('./pages/amc/AMCManagementPage').then((m) => ({ default: m.AMCManagementPage }))\n);\n\n// ── Marketplace ─────────────────────────────────────────────────────────────\nconst MarketplacePage = lazy(() =>\n import('./pages/marketplace/MarketplacePage').then((m) => ({ default: m.MarketplacePage }))\n);\nconst ServiceDetailPage = lazy(() =>\n import('./pages/marketplace/ServiceDetailPage').then((m) => ({ default: m.ServiceDetailPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\nconst VerificationDetailPage = lazy(() =>\n import('./pages/verification/VerificationDetailPage').then((m) => ({ default: m.VerificationDetailPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\nconst LegalServiceDetailPage = lazy(() =>\n import('./pages/legal/LegalServiceDetailPage').then((m) => ({ default: m.LegalServiceDetailPage }))\n);\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\nconst HomeLoanDetailPage = lazy(() =>\n import('./pages/finance/HomeLoanDetailPage').then((m) => ({ default: m.HomeLoanDetailPage }))\n);\n\n// ── Market ──────────────────────────────────────────────────────────────────\nconst MarketAnalyticsPage = lazy(() =>\n import('./pages/market/MarketAnalyticsPage').then((m) => ({ default: m.MarketAnalyticsPage }))\n);\nconst AreaInsightsPage = lazy(() =>\n import('./pages/market/AreaInsightsPage').then((m) => ({ default: m.AreaInsightsPage }))\n);\n\n// ── Settings ────────────────────────────────────────────────────────────────\nconst SettingsPage = lazy(() => import('./pages/settings/SettingsPage').then((m) => ({ default: m.SettingsPage })));\nconst ProfilePage = lazy(() => import('./pages/settings/ProfilePage').then((m) => ({ default: m.ProfilePage })));\n\n// ============================================================================\n// Routes\n// ============================================================================\n\nexport function HousingVistaRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Dashboard */}\n <Route\n index\n element={\n <FeatureFlagRoute flag=\"housingvista.dashboard\">\n <HomePage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Properties */}\n <Route\n path=\"properties\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <PropertiesPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"properties/new\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <AddPropertyPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"properties/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.properties\">\n <PropertyDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Shortlist */}\n <Route\n path=\"shortlist\"\n element={\n <FeatureFlagRoute flag=\"housingvista.shortlist\">\n <ShortlistPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Transactions */}\n <Route\n path=\"transactions\"\n element={\n <FeatureFlagRoute flag=\"housingvista.transactions\">\n <TransactionsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"transactions/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.transactions\">\n <TransactionDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Investments */}\n <Route\n path=\"investments\"\n element={\n <FeatureFlagRoute flag=\"housingvista.investments\">\n <InvestmentsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"investments/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.investments\">\n <InvestmentDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Offers */}\n <Route\n path=\"offers\"\n element={\n <FeatureFlagRoute flag=\"housingvista.offers\">\n <OffersPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Viewings */}\n <Route\n path=\"viewings\"\n element={\n <FeatureFlagRoute flag=\"housingvista.viewings\">\n <ViewingsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Messages / Chat */}\n <Route\n path=\"chat\"\n element={\n <FeatureFlagRoute flag=\"housingvista.chat\">\n <ChatPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"messages\"\n element={\n <FeatureFlagRoute flag=\"housingvista.chat\">\n <Navigate to=\"../chat\" replace />\n </FeatureFlagRoute>\n }\n />\n\n {/* Analytics */}\n <Route\n path=\"analytics\"\n element={\n <FeatureFlagRoute flag=\"housingvista.analytics\">\n <AnalyticsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Rental Management */}\n <Route\n path=\"rental\"\n element={\n <FeatureFlagRoute flag=\"housingvista.rental\">\n <RentalManagementPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Asset Management */}\n <Route\n path=\"assets\"\n element={\n <FeatureFlagRoute flag=\"housingvista.assets\">\n <AssetManagementPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"assets/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.assets\">\n <AssetDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* AMC Management */}\n <Route\n path=\"amc\"\n element={\n <FeatureFlagRoute flag=\"housingvista.amc\">\n <AMCManagementPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Marketplace */}\n <Route\n path=\"marketplace\"\n element={\n <FeatureFlagRoute flag=\"housingvista.marketplace\">\n <MarketplacePage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"marketplace/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.marketplace\">\n <ServiceDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Verification */}\n <Route\n path=\"verification\"\n element={\n <FeatureFlagRoute flag=\"housingvista.verification\">\n <VerificationPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"verification/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.verification\">\n <VerificationDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Legal */}\n <Route\n path=\"legal\"\n element={\n <FeatureFlagRoute flag=\"housingvista.legal\">\n <LegalPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"legal/:id\"\n element={\n <FeatureFlagRoute flag=\"housingvista.legal\">\n <LegalServiceDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Home Loans */}\n <Route\n path=\"home-loans\"\n element={\n <FeatureFlagRoute flag=\"housingvista.home_loans\">\n <HomeLoansPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"home-loans/:id/apply\"\n element={\n <FeatureFlagRoute flag=\"housingvista.home_loans\">\n <HomeLoanDetailPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Market Analytics */}\n <Route\n path=\"market-analytics\"\n element={\n <FeatureFlagRoute flag=\"housingvista.market_analytics\">\n <MarketAnalyticsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"area-insights\"\n element={\n <FeatureFlagRoute flag=\"housingvista.market_analytics\">\n <AreaInsightsPage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Settings & Profile */}\n <Route\n path=\"settings\"\n element={\n <FeatureFlagRoute flag=\"housingvista.settings\">\n <SettingsPage />\n </FeatureFlagRoute>\n }\n />\n <Route\n path=\"profile\"\n element={\n <FeatureFlagRoute flag=\"housingvista.settings\">\n <ProfilePage />\n </FeatureFlagRoute>\n }\n />\n\n {/* Catch-all: redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { useHousingVista as e } from "../context/HousingVistaContext.js";
2
2
  import { cn as t } from "../utils/helpers.js";
3
3
  import { ChevronRight as n, Home as r } from "lucide-react";
4
- import { Link as i } from "react-router-dom";
4
+ import { Link as i } from "react-router";
5
5
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
6
  //#region src/housingvista/components/Breadcrumbs.tsx
7
7
  var s = ({ items: s, className: c }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/housingvista/components/Breadcrumbs.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { ChevronRight, Home } from 'lucide-react';\nimport { Link } from 'react-router-dom';\nimport { cn } from '../utils/helpers';\nimport { useHousingVista } from '../context/HousingVistaContext';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({ items, className }) => {\n // The Home crumb must land on the HousingVista dashboard root regardless of\n // how deep the current route is nested, so link to the absolute mount path.\n const { basePath } = useHousingVista();\n const homeHref = basePath && basePath !== '/' ? basePath : '/';\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link\n to={homeHref}\n className=\"flex items-center text-text-secondary hover:text-text-primary\"\n aria-label=\"Dashboard\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </Link>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <span key={item.label} className=\"flex items-center gap-1\">\n <ChevronRight className=\"h-3.5 w-3.5 text-text-secondary/50\" />\n {isLast || !item.href ? (\n <span className={cn(isLast ? 'font-medium text-text-primary' : 'text-text-secondary')}>{item.label}</span>\n ) : (\n <Link to={item.href} className=\"text-text-secondary hover:text-text-primary\">\n {item.label}\n </Link>\n )}\n </span>\n );\n })}\n </nav>\n );\n};\n"],"mappings":";;;;;;AAgBA,IAAa,KAAqC,EAAE,UAAO,mBAAgB;CAGzE,IAAM,EAAE,gBAAa,GAAiB,EAChC,IAAW,KAAY,MAAa,MAAM,IAAW;AAC3D,QACE,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,mCAAmC,EAAU;YAAxF,CACE,kBAAC,GAAD;GACE,IAAI;GACJ,WAAU;GACV,cAAW;aAEX,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;GAC3B,CAAA,EACN,EAAM,KAAK,GAAM,MAAU;GAC1B,IAAM,IAAS,MAAU,EAAM,SAAS;AACxC,UACE,kBAAC,QAAD;IAAuB,WAAU;cAAjC,CACE,kBAAC,GAAD,EAAc,WAAU,sCAAuC,CAAA,EAC9D,KAAU,CAAC,EAAK,OACf,kBAAC,QAAD;KAAM,WAAW,EAAG,IAAS,kCAAkC,sBAAsB;eAAG,EAAK;KAAa,CAAA,GAE1G,kBAAC,GAAD;KAAM,IAAI,EAAK;KAAM,WAAU;eAC5B,EAAK;KACD,CAAA,CAEJ;MATI,EAAK,MAST;IAET,CACE"}
1
+ {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/housingvista/components/Breadcrumbs.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { ChevronRight, Home } from 'lucide-react';\nimport { Link } from 'react-router';\nimport { cn } from '../utils/helpers';\nimport { useHousingVista } from '../context/HousingVistaContext';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n}\n\ninterface BreadcrumbsProps {\n items: BreadcrumbItem[];\n className?: string;\n}\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({ items, className }) => {\n // The Home crumb must land on the HousingVista dashboard root regardless of\n // how deep the current route is nested, so link to the absolute mount path.\n const { basePath } = useHousingVista();\n const homeHref = basePath && basePath !== '/' ? basePath : '/';\n return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link\n to={homeHref}\n className=\"flex items-center text-text-secondary hover:text-text-primary\"\n aria-label=\"Dashboard\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </Link>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <span key={item.label} className=\"flex items-center gap-1\">\n <ChevronRight className=\"h-3.5 w-3.5 text-text-secondary/50\" />\n {isLast || !item.href ? (\n <span className={cn(isLast ? 'font-medium text-text-primary' : 'text-text-secondary')}>{item.label}</span>\n ) : (\n <Link to={item.href} className=\"text-text-secondary hover:text-text-primary\">\n {item.label}\n </Link>\n )}\n </span>\n );\n })}\n </nav>\n );\n};\n"],"mappings":";;;;;;AAgBA,IAAa,KAAqC,EAAE,UAAO,mBAAgB;CAGzE,IAAM,EAAE,gBAAa,GAAiB,EAChC,IAAW,KAAY,MAAa,MAAM,IAAW;AAC3D,QACE,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,mCAAmC,EAAU;YAAxF,CACE,kBAAC,GAAD;GACE,IAAI;GACJ,WAAU;GACV,cAAW;aAEX,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;GAC3B,CAAA,EACN,EAAM,KAAK,GAAM,MAAU;GAC1B,IAAM,IAAS,MAAU,EAAM,SAAS;AACxC,UACE,kBAAC,QAAD;IAAuB,WAAU;cAAjC,CACE,kBAAC,GAAD,EAAc,WAAU,sCAAuC,CAAA,EAC9D,KAAU,CAAC,EAAK,OACf,kBAAC,QAAD;KAAM,WAAW,EAAG,IAAS,kCAAkC,sBAAsB;eAAG,EAAK;KAAa,CAAA,GAE1G,kBAAC,GAAD;KAAM,IAAI,EAAK;KAAM,WAAU;eAC5B,EAAK;KACD,CAAA,CAEJ;MATI,EAAK,MAST;IAET,CACE"}
@@ -1,5 +1,5 @@
1
1
  import { createContext as e, useContext as t } from "react";
2
- import { MemoryRouter as n } from "react-router-dom";
2
+ import { MemoryRouter as n } from "react-router";
3
3
  import { jsx as r } from "react/jsx-runtime";
4
4
  //#region src/housingvista/context/HousingVistaContext.tsx
5
5
  var i = e(null);
@@ -1 +1 @@
1
- {"version":3,"file":"HousingVistaContext.js","names":[],"sources":["../../../src/housingvista/context/HousingVistaContext.tsx"],"sourcesContent":["/**\n * HousingVista Context Provider\n * @module housingvista\n */\n\nimport { createContext, useContext, type FC, type PropsWithChildren } from 'react';\nimport { MemoryRouter } from 'react-router-dom';\nimport type { HousingVistaRootProps } from '../types';\n\ninterface HousingVistaContextValue {\n basePath: string;\n navigate: (path: string) => void;\n currentUser: HousingVistaRootProps['currentUser'];\n workspaceId: string;\n apiGatewayUrl: string;\n authToken: string;\n}\n\nconst HousingVistaContext = createContext<HousingVistaContextValue | null>(null);\n\nexport function useHousingVista(): HousingVistaContextValue {\n const context = useContext(HousingVistaContext);\n if (!context) {\n throw new Error('useHousingVista must be used within a HousingVistaProvider');\n }\n return context;\n}\n\nexport const HousingVistaProvider: FC<PropsWithChildren<HousingVistaRootProps>> = ({\n children,\n basePath = '/',\n navigate = () => {},\n currentUser,\n workspaceId = '',\n apiGatewayUrl = '',\n authToken = '',\n}) => {\n const contextValue: HousingVistaContextValue = {\n basePath,\n navigate,\n currentUser,\n workspaceId,\n apiGatewayUrl,\n authToken,\n };\n\n const content = <HousingVistaContext.Provider value={contextValue}>{children}</HousingVistaContext.Provider>;\n\n // If basePath is provided, we're running inside the host shell (which has BrowserRouter)\n if (basePath && basePath !== '/') return content;\n\n // Standalone mode: wrap in MemoryRouter\n return <MemoryRouter>{content}</MemoryRouter>;\n};\n"],"mappings":";;;;AAkBA,IAAM,IAAsB,EAA+C,KAAK;AAEhF,SAAgB,IAA4C;CAC1D,IAAM,IAAU,EAAW,EAAoB;AAC/C,KAAI,CAAC,EACH,OAAU,MAAM,6DAA6D;AAE/E,QAAO;;AAGT,IAAa,KAAsE,EACjF,aACA,cAAW,KACX,oBAAiB,IACjB,gBACA,iBAAc,IACd,mBAAgB,IAChB,eAAY,SACR;CACJ,IAAM,IAAyC;EAC7C;EACA;EACA;EACA;EACA;EACA;EACD,EAEK,IAAU,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;EAAwC,CAAA;AAM5G,QAHI,KAAY,MAAa,MAAY,IAGlC,kBAAC,GAAD,EAAA,UAAe,GAAuB,CAAA"}
1
+ {"version":3,"file":"HousingVistaContext.js","names":[],"sources":["../../../src/housingvista/context/HousingVistaContext.tsx"],"sourcesContent":["/**\n * HousingVista Context Provider\n * @module housingvista\n */\n\nimport { createContext, useContext, type FC, type PropsWithChildren } from 'react';\nimport { MemoryRouter } from 'react-router';\nimport type { HousingVistaRootProps } from '../types';\n\ninterface HousingVistaContextValue {\n basePath: string;\n navigate: (path: string) => void;\n currentUser: HousingVistaRootProps['currentUser'];\n workspaceId: string;\n apiGatewayUrl: string;\n authToken: string;\n}\n\nconst HousingVistaContext = createContext<HousingVistaContextValue | null>(null);\n\nexport function useHousingVista(): HousingVistaContextValue {\n const context = useContext(HousingVistaContext);\n if (!context) {\n throw new Error('useHousingVista must be used within a HousingVistaProvider');\n }\n return context;\n}\n\nexport const HousingVistaProvider: FC<PropsWithChildren<HousingVistaRootProps>> = ({\n children,\n basePath = '/',\n navigate = () => {},\n currentUser,\n workspaceId = '',\n apiGatewayUrl = '',\n authToken = '',\n}) => {\n const contextValue: HousingVistaContextValue = {\n basePath,\n navigate,\n currentUser,\n workspaceId,\n apiGatewayUrl,\n authToken,\n };\n\n const content = <HousingVistaContext.Provider value={contextValue}>{children}</HousingVistaContext.Provider>;\n\n // If basePath is provided, we're running inside the host shell (which has BrowserRouter)\n if (basePath && basePath !== '/') return content;\n\n // Standalone mode: wrap in MemoryRouter\n return <MemoryRouter>{content}</MemoryRouter>;\n};\n"],"mappings":";;;;AAkBA,IAAM,IAAsB,EAA+C,KAAK;AAEhF,SAAgB,IAA4C;CAC1D,IAAM,IAAU,EAAW,EAAoB;AAC/C,KAAI,CAAC,EACH,OAAU,MAAM,6DAA6D;AAE/E,QAAO;;AAGT,IAAa,KAAsE,EACjF,aACA,cAAW,KACX,oBAAiB,IACjB,gBACA,iBAAc,IACd,mBAAgB,IAChB,eAAY,SACR;CACJ,IAAM,IAAyC;EAC7C;EACA;EACA;EACA;EACA;EACA;EACD,EAEK,IAAU,kBAAC,EAAoB,UAArB;EAA8B,OAAO;EAAe;EAAwC,CAAA;AAM5G,QAHI,KAAY,MAAa,MAAY,IAGlC,kBAAC,GAAD,EAAA,UAAe,GAAuB,CAAA"}
@@ -6,7 +6,7 @@ import { useDashboardStats as a, useProperties as o, useRecentActivities as s }
6
6
  import "../components/index.js";
7
7
  import { useMemo as c } from "react";
8
8
  import { ArrowRight as l, BarChart3 as u, Building as d, Clock as f, DollarSign as p, Eye as m, FileText as h, Home as g, Plus as _, TrendingUp as v, Zap as y } from "lucide-react";
9
- import { useNavigate as b } from "react-router-dom";
9
+ import { useNavigate as b } from "react-router";
10
10
  import { jsx as x, jsxs as S } from "react/jsx-runtime";
11
11
  import { useI18n as C } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
12
  import { AuroraBackground as w, Button as T, EmphasisPanel as E, GlassCard as D, GradientText as O, IllustratedEmptyState as k, NextSteps as A, PagePurpose as j } from "@burdenoff/fe-libs/ui";
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/housingvista/pages/HomePage.tsx"],"sourcesContent":["/**\n * HousingVista Dashboard / Home Page\n * Migrated from legacy housingvista-frontend dashboard.tsx\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GradientText,\n Button,\n GlassCard,\n EmphasisPanel,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Building,\n TrendingUp,\n Eye,\n DollarSign,\n Plus,\n BarChart3,\n FileText,\n Home,\n ArrowRight,\n Clock,\n Zap,\n} from 'lucide-react';\nimport { StatCard, PropertyCard } from '../components';\nimport { useDashboardStats, useRecentActivities, useProperties } from '../hooks';\nimport { useTrackPageView } from '../hooks/useHousingVistaAnalytics';\nimport { cn, getRelativeTime } from '../utils/helpers';\nimport type { RecentActivity } from '../types';\n\n// ---- Activity icon mapping ----\nconst activityIconMap: Record<RecentActivity['type'], typeof Eye> = {\n property_listed: Home,\n transaction_update: FileText,\n payment_received: DollarSign,\n maintenance_request: Building,\n viewing_scheduled: Eye,\n document_uploaded: FileText,\n offer_received: TrendingUp,\n lease_signed: FileText,\n};\n\nconst activityColorMap: Record<RecentActivity['type'], string> = {\n property_listed: 'text-accent-purple',\n transaction_update: 'text-status-info-text',\n payment_received: 'text-status-success-text',\n maintenance_request: 'text-status-warning-text',\n viewing_scheduled: 'text-status-info-text',\n document_uploaded: 'text-status-info-text',\n offer_received: 'text-status-success-text',\n lease_signed: 'text-accent-teal',\n};\n\nexport const HomePage = () => {\n const navigate = useNavigate();\n const { t } = useI18n();\n useTrackPageView('housingvista.dashboard.viewed');\n const { data: stats } = useDashboardStats();\n const { data: activities } = useRecentActivities();\n const { data: properties } = useProperties();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const quickActions = [\n {\n title: tr('housingvista.home.quickActions.addProperty.title', 'Add Property'),\n description: tr('housingvista.home.quickActions.addProperty.description', 'List a new property'),\n icon: Plus,\n path: 'properties/new',\n },\n {\n title: tr('housingvista.home.quickActions.viewAnalytics.title', 'View Analytics'),\n description: tr('housingvista.home.quickActions.viewAnalytics.description', 'Check performance metrics'),\n icon: BarChart3,\n path: 'analytics',\n },\n {\n title: tr('housingvista.home.quickActions.manageTransactions.title', 'Manage Transactions'),\n description: tr('housingvista.home.quickActions.manageTransactions.description', 'Handle ongoing deals'),\n icon: FileText,\n path: 'transactions',\n },\n {\n title: tr('housingvista.home.quickActions.browseProperties.title', 'Browse Properties'),\n description: tr('housingvista.home.quickActions.browseProperties.description', 'Explore listings'),\n icon: Building,\n path: 'properties',\n },\n ];\n\n const recentProperties = useMemo(() => properties.slice(0, 6), [properties]);\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Welcome Header — Boff UI 2.0 aurora hero (one per MFE) */}\n <div className=\"relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold text-text-primary\">\n <GradientText>{tr('housingvista.home.header.title', 'Welcome back!')}</GradientText>\n </h1>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'housingvista.home.header.description',\n \"Here's what's happening with your real estate portfolio today.\"\n )}\n </p>\n </div>\n <Button onClick={() => navigate('properties/new')} className=\"gap-2 self-start lg:self-auto\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n {tr(\n 'housingvista.home.purpose',\n 'Your real-estate command center. See your portfolio at a glance, jump to the things you do most, and pick up where you left off — from listing a property to tracking deals and analytics.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-home\"\n steps={[\n {\n id: 'add-property',\n label: tr('housingvista.home.nextSteps.addProperty', 'List your first property'),\n description: tr(\n 'housingvista.home.nextSteps.addPropertyDesc',\n 'Create a market-ready listing in a few guided steps.'\n ),\n onClick: () => navigate('properties/new'),\n },\n {\n id: 'browse',\n label: tr('housingvista.home.nextSteps.browse', 'Browse properties'),\n description: tr(\n 'housingvista.home.nextSteps.browseDesc',\n 'Explore listings and open one for full details.'\n ),\n onClick: () => navigate('properties'),\n },\n {\n id: 'analytics',\n label: tr('housingvista.home.nextSteps.analytics', 'Review your analytics'),\n description: tr(\n 'housingvista.home.nextSteps.analyticsDesc',\n 'Check portfolio performance and market insights.'\n ),\n onClick: () => navigate('analytics'),\n },\n ]}\n />\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label={tr('housingvista.home.stats.totalProperties', 'Total Properties')}\n value={stats.totalProperties}\n icon={<Building className=\"h-5 w-5\" />}\n trendData={stats.trends.totalProperties}\n featured\n />\n <StatCard\n label={tr('housingvista.home.stats.activeListings', 'Active Listings')}\n value={stats.activeTransactions}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trendData={stats.trends.activeTransactions}\n />\n <StatCard\n label={tr('housingvista.home.stats.upcomingViewings', 'Upcoming Viewings')}\n value={stats.upcomingViewings}\n icon={<Eye className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.monthlyRevenue', 'Monthly Revenue')}\n value={stats.monthlyRevenue}\n prefix=\"$\"\n icon={<DollarSign className=\"h-5 w-5\" />}\n trendData={stats.trends.monthlyRevenue}\n />\n </div>\n\n {/* Recent Activity + Quick Actions */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Activity — primary insight zone (one EmphasisPanel per page) */}\n <div className=\"lg:col-span-2\">\n <EmphasisPanel className=\"p-0\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentActivity.title', 'Recent Activity')}\n </h2>\n </div>\n <div className=\"p-5\">\n {activities.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <div className=\"rounded-full bg-bg-sunken p-3\">\n <Clock className=\"h-6 w-6 text-text-secondary\" />\n </div>\n <p className=\"text-sm font-medium text-text-primary\">No activity yet</p>\n <p className=\"max-w-xs text-xs text-text-secondary\">\n As you list properties, book viewings, and close deals, your latest updates appear here.\n </p>\n </div>\n ) : (\n <ol className=\"relative space-y-5\">\n {/* Connecting rail */}\n <span aria-hidden className=\"absolute bottom-2 left-[18px] top-2 w-px bg-border-seam\" />\n {activities.slice(0, 6).map((activity) => {\n const Icon = activityIconMap[activity.type] ?? Eye;\n const colorClass = activityColorMap[activity.type] ?? 'text-text-secondary';\n return (\n <li key={activity.id} className=\"relative flex items-start gap-4\">\n <span\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1',\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{activity.title}</p>\n <p className=\"shrink-0 text-xs text-text-secondary\">\n {getRelativeTime(activity.timestamp)}\n </p>\n </div>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.description}</p>\n {activity.actorName && (\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.actorName}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <div className=\"lg:col-span-1\">\n <GlassCard treatment=\"plain\" className=\"h-full border-border-seam\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Zap className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.quickActions.title', 'Quick Actions')}\n </h2>\n </div>\n <div className=\"space-y-2 p-4\">\n {quickActions.map((action, index) => {\n const Icon = action.icon;\n const accent = index % 2 === 0 ? 'text-accent-teal' : 'text-accent-blue';\n return (\n <button\n key={action.title}\n onClick={() => navigate(action.path)}\n className=\"group/action flex min-h-[44px] w-full items-center gap-3 rounded-lg border border-border-seam p-3 text-left transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className={cn('rounded-lg bg-bg-sunken p-2', accent)}>\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-text-primary\">{action.title}</div>\n <div className=\"text-xs text-text-secondary\">{action.description}</div>\n </div>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100\" />\n </button>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </div>\n\n {/* Recent Properties */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <div className=\"flex items-center justify-between border-b border-border-seam px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentProperties.title', 'Recent Properties')}\n </h2>\n <button\n onClick={() => navigate('properties')}\n className=\"inline-flex min-h-[44px] items-center gap-1 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded-md px-1\"\n >\n {tr('housingvista.home.recentProperties.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {recentProperties.length === 0 ? (\n <div className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('housingvista.home.recentProperties.empty.title', 'No properties yet')}\n description={tr(\n 'housingvista.home.recentProperties.empty.description',\n 'List your first property to see it appear here.'\n )}\n action={\n <Button onClick={() => navigate('properties/new')} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n }\n />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3\">\n {recentProperties.map((property) => (\n <PropertyCard\n key={property.id}\n id={property.id}\n title={property.title}\n price={property.price.amount}\n priceType={property.price.type === 'rent' ? 'rent' : 'sale'}\n pricePeriod={property.price.period}\n currency={property.price.currency}\n location={`${property.location.neighborhood}, ${property.location.city}`}\n bedrooms={property.specifications.bedrooms}\n bathrooms={property.specifications.bathrooms}\n area={property.specifications.totalArea}\n imageUrl={property.images[0]?.url}\n status={property.status.replace('_', ' ')}\n type={property.category}\n onClick={() => navigate(`properties/${property.id}`)}\n reraStatus={property.reraVerificationStatus}\n />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/housingvista/pages/HomePage.tsx"],"sourcesContent":["/**\n * HousingVista Dashboard / Home Page\n * Migrated from legacy housingvista-frontend dashboard.tsx\n * @module housingvista\n */\n\nimport { useMemo } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n AuroraBackground,\n GradientText,\n Button,\n GlassCard,\n EmphasisPanel,\n IllustratedEmptyState,\n PagePurpose,\n NextSteps,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Building,\n TrendingUp,\n Eye,\n DollarSign,\n Plus,\n BarChart3,\n FileText,\n Home,\n ArrowRight,\n Clock,\n Zap,\n} from 'lucide-react';\nimport { StatCard, PropertyCard } from '../components';\nimport { useDashboardStats, useRecentActivities, useProperties } from '../hooks';\nimport { useTrackPageView } from '../hooks/useHousingVistaAnalytics';\nimport { cn, getRelativeTime } from '../utils/helpers';\nimport type { RecentActivity } from '../types';\n\n// ---- Activity icon mapping ----\nconst activityIconMap: Record<RecentActivity['type'], typeof Eye> = {\n property_listed: Home,\n transaction_update: FileText,\n payment_received: DollarSign,\n maintenance_request: Building,\n viewing_scheduled: Eye,\n document_uploaded: FileText,\n offer_received: TrendingUp,\n lease_signed: FileText,\n};\n\nconst activityColorMap: Record<RecentActivity['type'], string> = {\n property_listed: 'text-accent-purple',\n transaction_update: 'text-status-info-text',\n payment_received: 'text-status-success-text',\n maintenance_request: 'text-status-warning-text',\n viewing_scheduled: 'text-status-info-text',\n document_uploaded: 'text-status-info-text',\n offer_received: 'text-status-success-text',\n lease_signed: 'text-accent-teal',\n};\n\nexport const HomePage = () => {\n const navigate = useNavigate();\n const { t } = useI18n();\n useTrackPageView('housingvista.dashboard.viewed');\n const { data: stats } = useDashboardStats();\n const { data: activities } = useRecentActivities();\n const { data: properties } = useProperties();\n\n const tr = (key: string, fallback: string) => {\n const translated = t(key);\n return translated === key ? fallback : translated;\n };\n\n const quickActions = [\n {\n title: tr('housingvista.home.quickActions.addProperty.title', 'Add Property'),\n description: tr('housingvista.home.quickActions.addProperty.description', 'List a new property'),\n icon: Plus,\n path: 'properties/new',\n },\n {\n title: tr('housingvista.home.quickActions.viewAnalytics.title', 'View Analytics'),\n description: tr('housingvista.home.quickActions.viewAnalytics.description', 'Check performance metrics'),\n icon: BarChart3,\n path: 'analytics',\n },\n {\n title: tr('housingvista.home.quickActions.manageTransactions.title', 'Manage Transactions'),\n description: tr('housingvista.home.quickActions.manageTransactions.description', 'Handle ongoing deals'),\n icon: FileText,\n path: 'transactions',\n },\n {\n title: tr('housingvista.home.quickActions.browseProperties.title', 'Browse Properties'),\n description: tr('housingvista.home.quickActions.browseProperties.description', 'Explore listings'),\n icon: Building,\n path: 'properties',\n },\n ];\n\n const recentProperties = useMemo(() => properties.slice(0, 6), [properties]);\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Welcome Header — Boff UI 2.0 aurora hero (one per MFE) */}\n <div className=\"relative overflow-hidden rounded-card border border-border-seam bg-gloss-card p-6 shadow-pop\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n <div>\n <h1 className=\"text-3xl font-bold text-text-primary\">\n <GradientText>{tr('housingvista.home.header.title', 'Welcome back!')}</GradientText>\n </h1>\n <p className=\"mt-1 text-text-secondary\">\n {tr(\n 'housingvista.home.header.description',\n \"Here's what's happening with your real estate portfolio today.\"\n )}\n </p>\n </div>\n <Button onClick={() => navigate('properties/new')} className=\"gap-2 self-start lg:self-auto\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n {tr(\n 'housingvista.home.purpose',\n 'Your real-estate command center. See your portfolio at a glance, jump to the things you do most, and pick up where you left off — from listing a property to tracking deals and analytics.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"housingvista-home\"\n steps={[\n {\n id: 'add-property',\n label: tr('housingvista.home.nextSteps.addProperty', 'List your first property'),\n description: tr(\n 'housingvista.home.nextSteps.addPropertyDesc',\n 'Create a market-ready listing in a few guided steps.'\n ),\n onClick: () => navigate('properties/new'),\n },\n {\n id: 'browse',\n label: tr('housingvista.home.nextSteps.browse', 'Browse properties'),\n description: tr(\n 'housingvista.home.nextSteps.browseDesc',\n 'Explore listings and open one for full details.'\n ),\n onClick: () => navigate('properties'),\n },\n {\n id: 'analytics',\n label: tr('housingvista.home.nextSteps.analytics', 'Review your analytics'),\n description: tr(\n 'housingvista.home.nextSteps.analyticsDesc',\n 'Check portfolio performance and market insights.'\n ),\n onClick: () => navigate('analytics'),\n },\n ]}\n />\n\n {/* Stats Grid */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard\n label={tr('housingvista.home.stats.totalProperties', 'Total Properties')}\n value={stats.totalProperties}\n icon={<Building className=\"h-5 w-5\" />}\n trendData={stats.trends.totalProperties}\n featured\n />\n <StatCard\n label={tr('housingvista.home.stats.activeListings', 'Active Listings')}\n value={stats.activeTransactions}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trendData={stats.trends.activeTransactions}\n />\n <StatCard\n label={tr('housingvista.home.stats.upcomingViewings', 'Upcoming Viewings')}\n value={stats.upcomingViewings}\n icon={<Eye className=\"h-5 w-5\" />}\n />\n <StatCard\n label={tr('housingvista.home.stats.monthlyRevenue', 'Monthly Revenue')}\n value={stats.monthlyRevenue}\n prefix=\"$\"\n icon={<DollarSign className=\"h-5 w-5\" />}\n trendData={stats.trends.monthlyRevenue}\n />\n </div>\n\n {/* Recent Activity + Quick Actions */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Activity — primary insight zone (one EmphasisPanel per page) */}\n <div className=\"lg:col-span-2\">\n <EmphasisPanel className=\"p-0\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentActivity.title', 'Recent Activity')}\n </h2>\n </div>\n <div className=\"p-5\">\n {activities.length === 0 ? (\n <div className=\"flex flex-col items-center gap-2 py-8 text-center\">\n <div className=\"rounded-full bg-bg-sunken p-3\">\n <Clock className=\"h-6 w-6 text-text-secondary\" />\n </div>\n <p className=\"text-sm font-medium text-text-primary\">No activity yet</p>\n <p className=\"max-w-xs text-xs text-text-secondary\">\n As you list properties, book viewings, and close deals, your latest updates appear here.\n </p>\n </div>\n ) : (\n <ol className=\"relative space-y-5\">\n {/* Connecting rail */}\n <span aria-hidden className=\"absolute bottom-2 left-[18px] top-2 w-px bg-border-seam\" />\n {activities.slice(0, 6).map((activity) => {\n const Icon = activityIconMap[activity.type] ?? Eye;\n const colorClass = activityColorMap[activity.type] ?? 'text-text-secondary';\n return (\n <li key={activity.id} className=\"relative flex items-start gap-4\">\n <span\n className={cn(\n 'relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border border-border-seam bg-bg-surface shadow-elevation-1',\n colorClass\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\">\n <p className=\"text-sm font-medium text-text-primary\">{activity.title}</p>\n <p className=\"shrink-0 text-xs text-text-secondary\">\n {getRelativeTime(activity.timestamp)}\n </p>\n </div>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.description}</p>\n {activity.actorName && (\n <p className=\"mt-0.5 text-xs text-text-secondary\">{activity.actorName}</p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <div className=\"lg:col-span-1\">\n <GlassCard treatment=\"plain\" className=\"h-full border-border-seam\">\n <div className=\"flex items-center gap-2 border-b border-border-seam px-5 py-4\">\n <Zap className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.quickActions.title', 'Quick Actions')}\n </h2>\n </div>\n <div className=\"space-y-2 p-4\">\n {quickActions.map((action, index) => {\n const Icon = action.icon;\n const accent = index % 2 === 0 ? 'text-accent-teal' : 'text-accent-blue';\n return (\n <button\n key={action.title}\n onClick={() => navigate(action.path)}\n className=\"group/action flex min-h-[44px] w-full items-center gap-3 rounded-lg border border-border-seam p-3 text-left transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className={cn('rounded-lg bg-bg-sunken p-2', accent)}>\n <Icon className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-medium text-text-primary\">{action.title}</div>\n <div className=\"text-xs text-text-secondary\">{action.description}</div>\n </div>\n <ArrowRight className=\"h-4 w-4 shrink-0 text-text-secondary opacity-0 transition-opacity group-hover/action:opacity-100\" />\n </button>\n );\n })}\n </div>\n </GlassCard>\n </div>\n </div>\n\n {/* Recent Properties */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam\">\n <div className=\"flex items-center justify-between border-b border-border-seam px-5 py-4\">\n <h2 className=\"text-base font-semibold text-text-primary\">\n {tr('housingvista.home.recentProperties.title', 'Recent Properties')}\n </h2>\n <button\n onClick={() => navigate('properties')}\n className=\"inline-flex min-h-[44px] items-center gap-1 text-sm font-medium text-text-secondary transition-colors hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] rounded-md px-1\"\n >\n {tr('housingvista.home.recentProperties.viewAll', 'View All')}\n <ArrowRight className=\"h-4 w-4\" />\n </button>\n </div>\n {recentProperties.length === 0 ? (\n <div className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title={tr('housingvista.home.recentProperties.empty.title', 'No properties yet')}\n description={tr(\n 'housingvista.home.recentProperties.empty.description',\n 'List your first property to see it appear here.'\n )}\n action={\n <Button onClick={() => navigate('properties/new')} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n {tr('housingvista.home.header.quickAdd', 'Quick Add')}\n </Button>\n }\n />\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 p-4 sm:grid-cols-2 lg:grid-cols-3\">\n {recentProperties.map((property) => (\n <PropertyCard\n key={property.id}\n id={property.id}\n title={property.title}\n price={property.price.amount}\n priceType={property.price.type === 'rent' ? 'rent' : 'sale'}\n pricePeriod={property.price.period}\n currency={property.price.currency}\n location={`${property.location.neighborhood}, ${property.location.city}`}\n bedrooms={property.specifications.bedrooms}\n bathrooms={property.specifications.bathrooms}\n area={property.specifications.totalArea}\n imageUrl={property.images[0]?.url}\n status={property.status.replace('_', ' ')}\n type={property.category}\n onClick={() => navigate(`properties/${property.id}`)}\n reraStatus={property.reraVerificationStatus}\n />\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -11,7 +11,7 @@ import "../../components/index.js";
11
11
  import { useServerPagination as re } from "../../hooks/useServerPagination.js";
12
12
  import { useEffect as ie, useMemo as u, useState as d } from "react";
13
13
  import { AlertTriangle as f, Calendar as ae, Clock as oe, DollarSign as se, Download as ce, MapPin as le, Plus as p, RotateCcw as m, Shield as h, Wrench as g } from "lucide-react";
14
- import { useNavigate as ue } from "react-router-dom";
14
+ import { useNavigate as ue } from "react-router";
15
15
  import { Fragment as de, jsx as _, jsxs as v } from "react/jsx-runtime";
16
16
  import { Button as y, EmphasisPanel as fe, NextSteps as pe, Pagination as me, ResponsiveDialog as he, ResponsiveDialogContent as ge, ResponsiveDialogDescription as _e, ResponsiveDialogFooter as ve, ResponsiveDialogHeader as ye, ResponsiveDialogTitle as be } from "@burdenoff/fe-libs/ui";
17
17
  //#region src/housingvista/pages/amc/AMCManagementPage.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"AMCManagementPage.js","names":[],"sources":["../../../../src/housingvista/pages/amc/AMCManagementPage.tsx"],"sourcesContent":["import { useState, useMemo, useEffect, type FormEvent } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Shield,\n DollarSign,\n Calendar,\n Plus,\n Download,\n Clock,\n AlertTriangle,\n Wrench,\n RotateCcw,\n MapPin,\n} from 'lucide-react';\nimport {\n Button,\n EmphasisPanel,\n NextSteps,\n Pagination,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\nimport { StatCard } from '../../components';\nimport { StatusBadge } from '../../components';\nimport { FilterBar } from '../../components';\nimport { EmptyState } from '../../components';\nimport { useAMCContracts, useCreateAmcContract, useMaintenanceRequests } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport { notify } from '../../lib/toast';\nimport type { AMCContract } from '../../types';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nconst inputClass =\n 'h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\n\ntype AmcStatus = 'active' | 'expiring_soon' | 'expired' | 'cancelled';\n\nfunction toIso(value: string): string {\n return value ? new Date(value).toISOString() : '';\n}\n\nfunction getStatusVariant(status: AMCContract['status']): 'success' | 'warning' | 'error' | 'muted' {\n switch (status) {\n case 'active':\n return 'success';\n case 'expiring_soon':\n return 'warning';\n case 'expired':\n return 'error';\n case 'cancelled':\n return 'muted';\n default:\n return 'muted';\n }\n}\n\nexport function AMCManagementPage() {\n useTrackPageView('housingvista.amc.viewed');\n const navigate = useNavigate();\n const pagination = useServerPagination(10);\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n\n // Debounce the raw search input into the value that feeds the server filter.\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(search), 300);\n return () => clearTimeout(timer);\n }, [search]);\n\n const { data: amcContracts } = useAMCContracts({\n filter: { search: debouncedSearch.trim() || undefined },\n pagination: pagination.pagination,\n });\n\n const { createAmcContract, loading: creating } = useCreateAmcContract();\n\n // Open maintenance requests across the portfolio — real count for the sidebar stat.\n const { data: maintenanceRequests } = useMaintenanceRequests({\n filter: { status: 'open' },\n pagination: { limit: 100, offset: 0 },\n });\n const openMaintenanceCount = maintenanceRequests.length;\n\n const handleSearchChange = (value: string) => {\n setSearch(value);\n pagination.setPage(1);\n };\n\n const handleExport = () => {\n if (amcContracts.length === 0) {\n notify.warning('Nothing to export', 'There are no contracts to export yet.');\n return;\n }\n const escape = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n const headers = ['Package', 'Property', 'Provider', 'Monthly Cost', 'Start', 'End', 'Status', 'Services'];\n const rows = amcContracts.map((c) =>\n [\n c.packageName,\n c.propertyTitle,\n c.providerName,\n String(c.monthlyCost),\n c.startDate,\n c.endDate,\n c.status,\n c.servicesIncluded.join('; '),\n ]\n .map((cell) => escape(String(cell)))\n .join(',')\n );\n const csv = [headers.map(escape).join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `housingvista-amc-contracts-${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n notify.success('Export ready', `${amcContracts.length} contracts exported to CSV.`);\n };\n\n const [createOpen, setCreateOpen] = useState(false);\n const [propertyTitle, setPropertyTitle] = useState('');\n const [packageName, setPackageName] = useState('');\n const [providerName, setProviderName] = useState('');\n const [monthlyCost, setMonthlyCost] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [status, setStatus] = useState<AmcStatus>('active');\n const [servicesIncluded, setServicesIncluded] = useState('');\n\n const resetForm = () => {\n setPropertyTitle('');\n setPackageName('');\n setProviderName('');\n setMonthlyCost('');\n setStartDate('');\n setEndDate('');\n setStatus('active');\n setServicesIncluded('');\n };\n\n const openCreate = () => {\n resetForm();\n setCreateOpen(true);\n };\n\n const handleCreate = async (e: FormEvent) => {\n e.preventDefault();\n const cost = Number(monthlyCost);\n if (!propertyTitle.trim() || !packageName.trim() || !providerName.trim()) {\n notify.warning('Missing details', 'Property, package and provider are required.');\n return;\n }\n if (!Number.isFinite(cost) || cost <= 0) {\n notify.warning('Enter a valid monthly cost');\n return;\n }\n const services = servicesIncluded\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n try {\n await createAmcContract({\n propertyTitle: propertyTitle.trim(),\n packageName: packageName.trim(),\n providerName: providerName.trim(),\n monthlyCost: cost,\n startDate: toIso(startDate),\n endDate: toIso(endDate),\n status,\n servicesIncluded: services.length > 0 ? services : undefined,\n });\n notify.success('Contract created', `${packageName.trim()} added for ${propertyTitle.trim()}.`);\n setCreateOpen(false);\n resetForm();\n } catch (err) {\n notify.error('Could not create contract', (err as Error).message);\n }\n };\n\n const stats = useMemo(() => {\n const activeContracts = amcContracts.filter((c) => c.status === 'active' || c.status === 'expiring_soon').length;\n const pendingRenewals = amcContracts.filter((c) => c.status === 'expiring_soon').length;\n const totalMonthlySpent = amcContracts\n .filter((c) => c.status === 'active' || c.status === 'expiring_soon')\n .reduce((sum, c) => sum + c.monthlyCost, 0);\n const upcomingServices = amcContracts.filter((c) => {\n if (!c.nextServiceDate) return false;\n const serviceDate = new Date(c.nextServiceDate);\n const now = new Date();\n const daysUntil = (serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24);\n return daysUntil >= 0 && daysUntil <= 30;\n }).length;\n return { activeContracts, pendingRenewals, totalMonthlySpent, upcomingServices };\n }, [amcContracts]);\n\n const scheduledServices = useMemo(\n () =>\n amcContracts\n .filter((c) => c.nextServiceDate && (c.status === 'active' || c.status === 'expiring_soon'))\n .sort((a, b) => new Date(a.nextServiceDate).getTime() - new Date(b.nextServiceDate).getTime()),\n [amcContracts]\n );\n\n // Accent styling per contract status for the card treatment.\n const statusAccent: Record<AMCContract['status'], string> = {\n active: 'border-l-4 border-l-status-success-border',\n expiring_soon: 'border-l-4 border-l-status-warning-border bg-status-warning-bg-subtle/30',\n expired: 'border-l-4 border-l-status-error-border',\n cancelled: 'border-l-4 border-l-border-strong',\n };\n\n return (\n <PageLayout\n title=\"AMC Management\"\n description=\"Manage Annual Maintenance Contracts and service packages\"\n purpose=\"Keep your properties maintained without surprises. Track every Annual Maintenance Contract, see what each covers and costs, get ahead of renewals, and know which services are due in the next 30 days so nothing slips.\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleExport}\n 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\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n </div>\n }\n >\n {/* Stats — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard label=\"Active Contracts\" value={stats.activeContracts} icon={<Shield className=\"h-4 w-4\" />} />\n <StatCard label=\"Pending Renewals\" value={stats.pendingRenewals} icon={<RotateCcw className=\"h-4 w-4\" />} />\n <StatCard\n label=\"Total Monthly Spent\"\n value={stats.totalMonthlySpent}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Upcoming Services\" value={stats.upcomingServices} icon={<Calendar className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n <NextSteps\n storageKey=\"housingvista-amc\"\n steps={[\n {\n id: 'pick-property',\n label: 'Add coverage for a property',\n description: 'Choose a property to set up a new maintenance contract.',\n onClick: () => navigate('../properties'),\n },\n {\n id: 'compare-providers',\n label: 'Compare your providers',\n description: 'Search by provider name to weigh coverage and monthly cost.',\n onClick: () => {\n const firstProvider = amcContracts[0]?.providerName;\n if (firstProvider) {\n setSearch(firstProvider);\n pagination.setPage(1);\n }\n },\n },\n {\n id: 'check-legal',\n label: 'Review contract paperwork',\n description: 'Open the legal hub to manage the underlying documents.',\n onClick: () => navigate('../legal'),\n },\n ]}\n />\n\n {/* Contract cards (left) + service schedule & open-maintenance sidebar (right) */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <div className=\"flex flex-col gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">All Contracts</h2>\n <FilterBar\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder=\"Search contracts, providers, properties...\"\n />\n </div>\n {amcContracts.length > 0 ? (\n <>\n <div className=\"space-y-3\">\n {amcContracts.map((contract) => (\n <div\n key={contract.id}\n className={cn(\n 'rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm',\n statusAccent[contract.status]\n )}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n Property\n </p>\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{contract.propertyTitle}</h3>\n <p className=\"text-xs text-text-secondary\">{contract.packageName}</p>\n </div>\n <StatusBadge\n label={contract.status.replace('_', ' ')}\n variant={getStatusVariant(contract.status)}\n dot\n />\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4 border-t border-border-subtle pt-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Provider</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{contract.providerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Coverage</p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-text-primary\">\n {contract.servicesIncluded.length > 0\n ? contract.servicesIncluded.slice(0, 2).join(', ')\n : '—'}\n {contract.servicesIncluded.length > 2 ? ` +${contract.servicesIncluded.length - 2}` : ''}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Cost</p>\n <p className=\"mt-0.5 text-sm font-semibold text-text-primary\">\n {formatCurrency(contract.monthlyCost)}\n <span className=\"text-xs font-normal text-text-secondary\">/mo</span>\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Renewal Date</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{formatDate(contract.endDate)}</p>\n </div>\n </div>\n </div>\n ))}\n </div>\n <Pagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n hasNextPage={amcContracts.length >= pagination.pageSize}\n hasPreviousPage={pagination.page > 1}\n onPageChange={pagination.setPage}\n onPageSizeChange={pagination.setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Shield className=\"h-12 w-12\" />}\n title=\"No contracts found\"\n description=\"Try adjusting your search criteria or create a new contract.\"\n action={\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n }\n />\n )}\n </div>\n\n {/* Sidebar */}\n <aside className=\"space-y-6 lg:col-span-1\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Upcoming Service Schedule</h3>\n {scheduledServices.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No services scheduled\"\n description=\"Upcoming service dates from your active contracts will appear here.\"\n className=\"border-0 bg-transparent p-4\"\n />\n ) : (\n <ol className=\"space-y-4\">\n {scheduledServices.map((contract) => {\n const serviceDate = new Date(contract.nextServiceDate);\n const now = new Date();\n const daysUntil = Math.ceil((serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n const isUrgent = daysUntil <= 7;\n const isPast = daysUntil < 0;\n return (\n <li key={contract.id} className=\"flex gap-3\">\n <div\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full',\n isPast\n ? 'bg-status-error-bg-subtle'\n : isUrgent\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-info-bg-subtle'\n )}\n >\n {isPast ? (\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n ) : isUrgent ? (\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n ) : (\n <Wrench className=\"h-4 w-4 text-status-info-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{formatDate(contract.nextServiceDate)}</p>\n <p className=\"truncate text-sm text-text-primary\">\n {contract.packageName} — {contract.propertyTitle}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{contract.providerName}</p>\n <p\n className={cn(\n 'text-xs font-medium',\n isPast\n ? 'text-status-error-text'\n : isUrgent\n ? 'text-status-warning-text'\n : 'text-text-secondary'\n )}\n >\n {isPast\n ? `${Math.abs(daysUntil)} days overdue`\n : daysUntil === 0\n ? 'Today'\n : `In ${daysUntil} days`}\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate('../rental')}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"rounded-lg bg-status-info-bg-subtle p-2.5\">\n <Wrench className=\"h-5 w-5 text-status-info-text\" />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Open maintenance requests</p>\n <p className=\"text-xl font-bold text-text-primary\">{openMaintenanceCount}</p>\n </div>\n </button>\n </aside>\n </div>\n\n {/* New Contract dialog */}\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <form onSubmit={handleCreate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New maintenance contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set up an Annual Maintenance Contract to track coverage, cost and renewal dates.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Property *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Maple Court\"\n value={propertyTitle}\n onChange={(e) => setPropertyTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Package *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Premium Care\"\n value={packageName}\n onChange={(e) => setPackageName(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Provider *</label>\n <input\n type=\"text\"\n required\n placeholder=\"Service company\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Monthly cost *</label>\n <input\n type=\"number\"\n required\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={monthlyCost}\n onChange={(e) => setMonthlyCost(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">End date</label>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select\n value={status}\n onChange={(e) => setStatus(e.target.value as AmcStatus)}\n className={inputClass}\n >\n <option value=\"active\">Active</option>\n <option value=\"expiring_soon\">Expiring soon</option>\n <option value=\"expired\">Expired</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Services included</label>\n <input\n type=\"text\"\n placeholder=\"Comma-separated, e.g. Plumbing, Electrical, HVAC\"\n value={servicesIncluded}\n onChange={(e) => setServicesIncluded(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreateOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={creating}>\n {creating ? 'Saving…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AMCManagementPage.js","names":[],"sources":["../../../../src/housingvista/pages/amc/AMCManagementPage.tsx"],"sourcesContent":["import { useState, useMemo, useEffect, type FormEvent } from 'react';\nimport { useNavigate } from 'react-router';\nimport {\n Shield,\n DollarSign,\n Calendar,\n Plus,\n Download,\n Clock,\n AlertTriangle,\n Wrench,\n RotateCcw,\n MapPin,\n} from 'lucide-react';\nimport {\n Button,\n EmphasisPanel,\n NextSteps,\n Pagination,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components';\nimport { StatCard } from '../../components';\nimport { StatusBadge } from '../../components';\nimport { FilterBar } from '../../components';\nimport { EmptyState } from '../../components';\nimport { useAMCContracts, useCreateAmcContract, useMaintenanceRequests } from '../../hooks';\nimport { useServerPagination } from '../../hooks/useServerPagination';\nimport { cn, formatCurrency, formatDate } from '../../utils/helpers';\nimport { notify } from '../../lib/toast';\nimport type { AMCContract } from '../../types';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nconst inputClass =\n 'h-10 w-full rounded-md border border-border-subtle bg-bg-surface px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\n\ntype AmcStatus = 'active' | 'expiring_soon' | 'expired' | 'cancelled';\n\nfunction toIso(value: string): string {\n return value ? new Date(value).toISOString() : '';\n}\n\nfunction getStatusVariant(status: AMCContract['status']): 'success' | 'warning' | 'error' | 'muted' {\n switch (status) {\n case 'active':\n return 'success';\n case 'expiring_soon':\n return 'warning';\n case 'expired':\n return 'error';\n case 'cancelled':\n return 'muted';\n default:\n return 'muted';\n }\n}\n\nexport function AMCManagementPage() {\n useTrackPageView('housingvista.amc.viewed');\n const navigate = useNavigate();\n const pagination = useServerPagination(10);\n const [search, setSearch] = useState('');\n const [debouncedSearch, setDebouncedSearch] = useState('');\n\n // Debounce the raw search input into the value that feeds the server filter.\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedSearch(search), 300);\n return () => clearTimeout(timer);\n }, [search]);\n\n const { data: amcContracts } = useAMCContracts({\n filter: { search: debouncedSearch.trim() || undefined },\n pagination: pagination.pagination,\n });\n\n const { createAmcContract, loading: creating } = useCreateAmcContract();\n\n // Open maintenance requests across the portfolio — real count for the sidebar stat.\n const { data: maintenanceRequests } = useMaintenanceRequests({\n filter: { status: 'open' },\n pagination: { limit: 100, offset: 0 },\n });\n const openMaintenanceCount = maintenanceRequests.length;\n\n const handleSearchChange = (value: string) => {\n setSearch(value);\n pagination.setPage(1);\n };\n\n const handleExport = () => {\n if (amcContracts.length === 0) {\n notify.warning('Nothing to export', 'There are no contracts to export yet.');\n return;\n }\n const escape = (value: string) => `\"${value.replace(/\"/g, '\"\"')}\"`;\n const headers = ['Package', 'Property', 'Provider', 'Monthly Cost', 'Start', 'End', 'Status', 'Services'];\n const rows = amcContracts.map((c) =>\n [\n c.packageName,\n c.propertyTitle,\n c.providerName,\n String(c.monthlyCost),\n c.startDate,\n c.endDate,\n c.status,\n c.servicesIncluded.join('; '),\n ]\n .map((cell) => escape(String(cell)))\n .join(',')\n );\n const csv = [headers.map(escape).join(','), ...rows].join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `housingvista-amc-contracts-${new Date().toISOString().slice(0, 10)}.csv`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n notify.success('Export ready', `${amcContracts.length} contracts exported to CSV.`);\n };\n\n const [createOpen, setCreateOpen] = useState(false);\n const [propertyTitle, setPropertyTitle] = useState('');\n const [packageName, setPackageName] = useState('');\n const [providerName, setProviderName] = useState('');\n const [monthlyCost, setMonthlyCost] = useState('');\n const [startDate, setStartDate] = useState('');\n const [endDate, setEndDate] = useState('');\n const [status, setStatus] = useState<AmcStatus>('active');\n const [servicesIncluded, setServicesIncluded] = useState('');\n\n const resetForm = () => {\n setPropertyTitle('');\n setPackageName('');\n setProviderName('');\n setMonthlyCost('');\n setStartDate('');\n setEndDate('');\n setStatus('active');\n setServicesIncluded('');\n };\n\n const openCreate = () => {\n resetForm();\n setCreateOpen(true);\n };\n\n const handleCreate = async (e: FormEvent) => {\n e.preventDefault();\n const cost = Number(monthlyCost);\n if (!propertyTitle.trim() || !packageName.trim() || !providerName.trim()) {\n notify.warning('Missing details', 'Property, package and provider are required.');\n return;\n }\n if (!Number.isFinite(cost) || cost <= 0) {\n notify.warning('Enter a valid monthly cost');\n return;\n }\n const services = servicesIncluded\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n try {\n await createAmcContract({\n propertyTitle: propertyTitle.trim(),\n packageName: packageName.trim(),\n providerName: providerName.trim(),\n monthlyCost: cost,\n startDate: toIso(startDate),\n endDate: toIso(endDate),\n status,\n servicesIncluded: services.length > 0 ? services : undefined,\n });\n notify.success('Contract created', `${packageName.trim()} added for ${propertyTitle.trim()}.`);\n setCreateOpen(false);\n resetForm();\n } catch (err) {\n notify.error('Could not create contract', (err as Error).message);\n }\n };\n\n const stats = useMemo(() => {\n const activeContracts = amcContracts.filter((c) => c.status === 'active' || c.status === 'expiring_soon').length;\n const pendingRenewals = amcContracts.filter((c) => c.status === 'expiring_soon').length;\n const totalMonthlySpent = amcContracts\n .filter((c) => c.status === 'active' || c.status === 'expiring_soon')\n .reduce((sum, c) => sum + c.monthlyCost, 0);\n const upcomingServices = amcContracts.filter((c) => {\n if (!c.nextServiceDate) return false;\n const serviceDate = new Date(c.nextServiceDate);\n const now = new Date();\n const daysUntil = (serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24);\n return daysUntil >= 0 && daysUntil <= 30;\n }).length;\n return { activeContracts, pendingRenewals, totalMonthlySpent, upcomingServices };\n }, [amcContracts]);\n\n const scheduledServices = useMemo(\n () =>\n amcContracts\n .filter((c) => c.nextServiceDate && (c.status === 'active' || c.status === 'expiring_soon'))\n .sort((a, b) => new Date(a.nextServiceDate).getTime() - new Date(b.nextServiceDate).getTime()),\n [amcContracts]\n );\n\n // Accent styling per contract status for the card treatment.\n const statusAccent: Record<AMCContract['status'], string> = {\n active: 'border-l-4 border-l-status-success-border',\n expiring_soon: 'border-l-4 border-l-status-warning-border bg-status-warning-bg-subtle/30',\n expired: 'border-l-4 border-l-status-error-border',\n cancelled: 'border-l-4 border-l-border-strong',\n };\n\n return (\n <PageLayout\n title=\"AMC Management\"\n description=\"Manage Annual Maintenance Contracts and service packages\"\n purpose=\"Keep your properties maintained without surprises. Track every Annual Maintenance Contract, see what each covers and costs, get ahead of renewals, and know which services are due in the next 30 days so nothing slips.\"\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n onClick={handleExport}\n 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\"\n >\n <Download className=\"h-4 w-4\" />\n Export\n </button>\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n </div>\n }\n >\n {/* Stats — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatCard label=\"Active Contracts\" value={stats.activeContracts} icon={<Shield className=\"h-4 w-4\" />} />\n <StatCard label=\"Pending Renewals\" value={stats.pendingRenewals} icon={<RotateCcw className=\"h-4 w-4\" />} />\n <StatCard\n label=\"Total Monthly Spent\"\n value={stats.totalMonthlySpent}\n prefix=\"$\"\n icon={<DollarSign className=\"h-4 w-4\" />}\n />\n <StatCard label=\"Upcoming Services\" value={stats.upcomingServices} icon={<Calendar className=\"h-4 w-4\" />} />\n </div>\n </EmphasisPanel>\n\n <NextSteps\n storageKey=\"housingvista-amc\"\n steps={[\n {\n id: 'pick-property',\n label: 'Add coverage for a property',\n description: 'Choose a property to set up a new maintenance contract.',\n onClick: () => navigate('../properties'),\n },\n {\n id: 'compare-providers',\n label: 'Compare your providers',\n description: 'Search by provider name to weigh coverage and monthly cost.',\n onClick: () => {\n const firstProvider = amcContracts[0]?.providerName;\n if (firstProvider) {\n setSearch(firstProvider);\n pagination.setPage(1);\n }\n },\n },\n {\n id: 'check-legal',\n label: 'Review contract paperwork',\n description: 'Open the legal hub to manage the underlying documents.',\n onClick: () => navigate('../legal'),\n },\n ]}\n />\n\n {/* Contract cards (left) + service schedule & open-maintenance sidebar (right) */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-4 lg:col-span-2\">\n <div className=\"flex flex-col gap-3\">\n <h2 className=\"text-lg font-semibold text-text-primary\">All Contracts</h2>\n <FilterBar\n searchValue={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder=\"Search contracts, providers, properties...\"\n />\n </div>\n {amcContracts.length > 0 ? (\n <>\n <div className=\"space-y-3\">\n {amcContracts.map((contract) => (\n <div\n key={contract.id}\n className={cn(\n 'rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm',\n statusAccent[contract.status]\n )}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n Property\n </p>\n <h3 className=\"truncate text-base font-semibold text-text-primary\">{contract.propertyTitle}</h3>\n <p className=\"text-xs text-text-secondary\">{contract.packageName}</p>\n </div>\n <StatusBadge\n label={contract.status.replace('_', ' ')}\n variant={getStatusVariant(contract.status)}\n dot\n />\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-4 border-t border-border-subtle pt-4 sm:grid-cols-4\">\n <div>\n <p className=\"text-xs text-text-secondary\">Provider</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{contract.providerName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Coverage</p>\n <p className=\"mt-0.5 truncate text-sm font-medium text-text-primary\">\n {contract.servicesIncluded.length > 0\n ? contract.servicesIncluded.slice(0, 2).join(', ')\n : '—'}\n {contract.servicesIncluded.length > 2 ? ` +${contract.servicesIncluded.length - 2}` : ''}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Monthly Cost</p>\n <p className=\"mt-0.5 text-sm font-semibold text-text-primary\">\n {formatCurrency(contract.monthlyCost)}\n <span className=\"text-xs font-normal text-text-secondary\">/mo</span>\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary\">Renewal Date</p>\n <p className=\"mt-0.5 text-sm font-medium text-text-primary\">{formatDate(contract.endDate)}</p>\n </div>\n </div>\n </div>\n ))}\n </div>\n <Pagination\n page={pagination.page}\n pageSize={pagination.pageSize}\n hasNextPage={amcContracts.length >= pagination.pageSize}\n hasPreviousPage={pagination.page > 1}\n onPageChange={pagination.setPage}\n onPageSizeChange={pagination.setPageSize}\n />\n </>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Shield className=\"h-12 w-12\" />}\n title=\"No contracts found\"\n description=\"Try adjusting your search criteria or create a new contract.\"\n action={\n <Button type=\"button\" onClick={openCreate} className=\"gap-2\">\n <Plus className=\"h-4 w-4\" />\n New Contract\n </Button>\n }\n />\n )}\n </div>\n\n {/* Sidebar */}\n <aside className=\"space-y-6 lg:col-span-1\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5 shadow-sm\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Upcoming Service Schedule</h3>\n {scheduledServices.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No services scheduled\"\n description=\"Upcoming service dates from your active contracts will appear here.\"\n className=\"border-0 bg-transparent p-4\"\n />\n ) : (\n <ol className=\"space-y-4\">\n {scheduledServices.map((contract) => {\n const serviceDate = new Date(contract.nextServiceDate);\n const now = new Date();\n const daysUntil = Math.ceil((serviceDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n const isUrgent = daysUntil <= 7;\n const isPast = daysUntil < 0;\n return (\n <li key={contract.id} className=\"flex gap-3\">\n <div\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-full',\n isPast\n ? 'bg-status-error-bg-subtle'\n : isUrgent\n ? 'bg-status-warning-bg-subtle'\n : 'bg-status-info-bg-subtle'\n )}\n >\n {isPast ? (\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n ) : isUrgent ? (\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n ) : (\n <Wrench className=\"h-4 w-4 text-status-info-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{formatDate(contract.nextServiceDate)}</p>\n <p className=\"truncate text-sm text-text-primary\">\n {contract.packageName} — {contract.propertyTitle}\n </p>\n <p className=\"truncate text-xs text-text-secondary\">{contract.providerName}</p>\n <p\n className={cn(\n 'text-xs font-medium',\n isPast\n ? 'text-status-error-text'\n : isUrgent\n ? 'text-status-warning-text'\n : 'text-text-secondary'\n )}\n >\n {isPast\n ? `${Math.abs(daysUntil)} days overdue`\n : daysUntil === 0\n ? 'Today'\n : `In ${daysUntil} days`}\n </p>\n </div>\n </li>\n );\n })}\n </ol>\n )}\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigate('../rental')}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"rounded-lg bg-status-info-bg-subtle p-2.5\">\n <Wrench className=\"h-5 w-5 text-status-info-text\" />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Open maintenance requests</p>\n <p className=\"text-xl font-bold text-text-primary\">{openMaintenanceCount}</p>\n </div>\n </button>\n </aside>\n </div>\n\n {/* New Contract dialog */}\n <ResponsiveDialog open={createOpen} onOpenChange={setCreateOpen}>\n <ResponsiveDialogContent className=\"sm:max-w-lg\">\n <form onSubmit={handleCreate}>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New maintenance contract</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set up an Annual Maintenance Contract to track coverage, cost and renewal dates.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3 py-2\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Property *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Maple Court\"\n value={propertyTitle}\n onChange={(e) => setPropertyTitle(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Package *</label>\n <input\n type=\"text\"\n required\n placeholder=\"e.g. Premium Care\"\n value={packageName}\n onChange={(e) => setPackageName(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Provider *</label>\n <input\n type=\"text\"\n required\n placeholder=\"Service company\"\n value={providerName}\n onChange={(e) => setProviderName(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Monthly cost *</label>\n <input\n type=\"number\"\n required\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={monthlyCost}\n onChange={(e) => setMonthlyCost(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Start date</label>\n <input\n type=\"date\"\n value={startDate}\n onChange={(e) => setStartDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">End date</label>\n <input\n type=\"date\"\n value={endDate}\n onChange={(e) => setEndDate(e.target.value)}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Status</label>\n <select\n value={status}\n onChange={(e) => setStatus(e.target.value as AmcStatus)}\n className={inputClass}\n >\n <option value=\"active\">Active</option>\n <option value=\"expiring_soon\">Expiring soon</option>\n <option value=\"expired\">Expired</option>\n <option value=\"cancelled\">Cancelled</option>\n </select>\n </div>\n </div>\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-text-primary\">Services included</label>\n <input\n type=\"text\"\n placeholder=\"Comma-separated, e.g. Plumbing, Electrical, HVAC\"\n value={servicesIncluded}\n onChange={(e) => setServicesIncluded(e.target.value)}\n className={inputClass}\n />\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreateOpen(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={creating}>\n {creating ? 'Saving…' : 'Create contract'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -16,7 +16,7 @@ import { XAxis as h } from "../../../node_modules/recharts/es6/cartesian/XAxis.j
16
16
  import { YAxis as g } from "../../../node_modules/recharts/es6/cartesian/YAxis.js";
17
17
  import { BarChart as _ } from "../../../node_modules/recharts/es6/chart/BarChart.js";
18
18
  import { ArrowDownRight as v, ArrowLeft as y, ArrowUpRight as b, BarChart3 as x, Building as S, Calendar as C, DollarSign as w, ImageOff as T, MapPin as E, Percent as D, Target as O, TrendingUp as k } from "lucide-react";
19
- import { useNavigate as A, useParams as j } from "react-router-dom";
19
+ import { useNavigate as A, useParams as j } from "react-router";
20
20
  import { jsx as M, jsxs as N } from "react/jsx-runtime";
21
21
  import { EmphasisPanel as P, GlassCard as F, NextSteps as I, PagePurpose as L } from "@burdenoff/fe-libs/ui";
22
22
  //#region src/housingvista/pages/assets/AssetDetailPage.tsx