@burdenoff/microfe-housingvista 2026.624.1 → 2026.624.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/housingvista/HousingVistaRoutes.js +1 -1
- package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
- package/dist/housingvista/components/Breadcrumbs.js +4 -4
- package/dist/housingvista/components/Breadcrumbs.js.map +1 -1
- package/dist/housingvista/components/ChartCard.js +3 -3
- package/dist/housingvista/components/ChartCard.js.map +1 -1
- package/dist/housingvista/components/DataTable.js +19 -19
- package/dist/housingvista/components/DataTable.js.map +1 -1
- package/dist/housingvista/components/EmptyState.js +4 -4
- package/dist/housingvista/components/EmptyState.js.map +1 -1
- package/dist/housingvista/components/ErrorBoundary.js +2 -2
- package/dist/housingvista/components/ErrorBoundary.js.map +1 -1
- package/dist/housingvista/components/FilterBar.js +2 -2
- package/dist/housingvista/components/FilterBar.js.map +1 -1
- package/dist/housingvista/components/PageLayout.js +2 -2
- package/dist/housingvista/components/PageLayout.js.map +1 -1
- package/dist/housingvista/components/PropertyCard.js +13 -13
- package/dist/housingvista/components/PropertyCard.js.map +1 -1
- package/dist/housingvista/components/StatCard.js +7 -7
- package/dist/housingvista/components/StatCard.js.map +1 -1
- package/dist/housingvista/components/StatusBadge.js +3 -3
- package/dist/housingvista/components/StatusBadge.js.map +1 -1
- package/dist/housingvista/pages/HomePage.js +24 -24
- package/dist/housingvista/pages/HomePage.js.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.js +20 -20
- package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
- package/dist/housingvista/pages/analytics/AnalyticsPage.js +23 -23
- package/dist/housingvista/pages/analytics/AnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.js +18 -18
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.js +23 -23
- package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.js +43 -43
- package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js +56 -56
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.js +16 -16
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.js +15 -15
- package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.js +37 -37
- package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js +16 -16
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.js +14 -14
- package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
- package/dist/housingvista/pages/notifications/NotificationsPage.js +7 -7
- package/dist/housingvista/pages/notifications/NotificationsPage.js.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.js +60 -60
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertiesPage.js +19 -19
- package/dist/housingvista/pages/properties/PropertiesPage.js.map +1 -1
- package/dist/housingvista/pages/properties/PropertyDetailPage.js +103 -103
- package/dist/housingvista/pages/properties/PropertyDetailPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.js +34 -34
- package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.js +19 -19
- package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.js +29 -29
- package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js +94 -94
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +9 -9
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +6 -6
- package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
|
6
6
|
var c = () => /* @__PURE__ */ o("div", {
|
|
7
7
|
className: "flex items-center justify-center p-12",
|
|
8
8
|
children: /* @__PURE__ */ o("div", {
|
|
9
|
-
className: "text-sm text-
|
|
9
|
+
className: "text-sm text-text-secondary",
|
|
10
10
|
children: "Loading..."
|
|
11
11
|
})
|
|
12
12
|
}), l = n(() => import("./pages/properties/PropertiesPage.js").then((e) => ({ default: e.PropertiesPage }))), u = n(() => import("./pages/properties/AddPropertyPage.js").then((e) => ({ default: e.AddPropertyPage }))), d = n(() => import("./pages/properties/PropertyDetailPage.js").then((e) => ({ default: e.PropertyDetailPage }))), f = n(() => import("./pages/transactions/TransactionsPage.js").then((e) => ({ default: e.TransactionsPage }))), p = n(() => import("./pages/transactions/TransactionDetailPage.js").then((e) => ({ default: e.TransactionDetailPage }))), m = n(() => import("./pages/investments/InvestmentsPage.js").then((e) => ({ default: e.InvestmentsPage }))), h = n(() => import("./pages/investments/InvestmentDetailPage.js").then((e) => ({ default: e.InvestmentDetailPage }))), g = n(() => import("./pages/analytics/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), _ = n(() => import("./pages/rental/RentalManagementPage.js").then((e) => ({ default: e.RentalManagementPage }))), v = n(() => import("./pages/assets/AssetManagementPage.js").then((e) => ({ default: e.AssetManagementPage }))), y = n(() => import("./pages/amc/AMCManagementPage.js").then((e) => ({ default: e.AMCManagementPage }))), b = n(() => import("./pages/marketplace/MarketplacePage.js").then((e) => ({ default: e.MarketplacePage }))), x = n(() => import("./pages/chat/ChatPage.js").then((e) => ({ default: e.ChatPage }))), S = n(() => import("./pages/notifications/NotificationsPage.js").then((e) => ({ default: e.NotificationsPage }))), C = n(() => import("./pages/verification/VerificationPage.js").then((e) => ({ default: e.VerificationPage }))), w = n(() => import("./pages/legal/LegalPage.js").then((e) => ({ default: e.LegalPage }))), T = n(() => import("./pages/finance/HomeLoansPage.js").then((e) => ({ default: e.HomeLoansPage }))), E = n(() => import("./pages/market/MarketAnalyticsPage.js").then((e) => ({ default: e.MarketAnalyticsPage }))), D = n(() => import("./pages/market/AreaInsightsPage.js").then((e) => ({ default: e.AreaInsightsPage }))), O = n(() => import("./pages/settings/SettingsPage.js").then((e) => ({ default: e.SettingsPage }))), k = n(() => import("./pages/settings/ProfilePage.js").then((e) => ({ default: e.ProfilePage })));
|
|
@@ -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 } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\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-muted-foreground\">Loading...</div>\n </div>\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);\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// ── 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);\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);\n\n// ── Chat ────────────────────────────────────────────────────────────────────\nconst ChatPage = lazy(() => import('./pages/chat/ChatPage').then((m) => ({ default: m.ChatPage })));\n\n// ── Notifications ───────────────────────────────────────────────────────────\nconst NotificationsPage = lazy(() =>\n import('./pages/notifications/NotificationsPage').then((m) => ({ default: m.NotificationsPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\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 index element={<HomePage />} />\n\n {/* Properties */}\n <Route path=\"properties\" element={<PropertiesPage />} />\n <Route path=\"properties/new\" element={<AddPropertyPage />} />\n <Route path=\"properties/:id\" element={<PropertyDetailPage />} />\n\n {/* Transactions */}\n <Route path=\"transactions\" element={<TransactionsPage />} />\n <Route path=\"transactions/:id\" element={<TransactionDetailPage />} />\n\n {/* Investments */}\n <Route path=\"investments\" element={<InvestmentsPage />} />\n <Route path=\"investments/:id\" element={<InvestmentDetailPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Rental Management */}\n <Route path=\"rental\" element={<RentalManagementPage />} />\n\n {/* Asset Management */}\n <Route path=\"assets\" element={<AssetManagementPage />} />\n\n {/* AMC Management */}\n <Route path=\"amc\" element={<AMCManagementPage />} />\n\n {/* Marketplace */}\n <Route path=\"marketplace\" element={<MarketplacePage />} />\n\n {/* Chat */}\n <Route path=\"chat\" element={<ChatPage />} />\n\n {/* Notifications */}\n <Route path=\"notifications\" element={<NotificationsPage />} />\n\n {/* Verification */}\n <Route path=\"verification\" element={<VerificationPage />} />\n\n {/* Legal */}\n <Route path=\"legal\" element={<LegalPage />} />\n\n {/* Home Loans */}\n <Route path=\"home-loans\" element={<HomeLoansPage />} />\n\n {/* Market Analytics */}\n <Route path=\"market-analytics\" element={<MarketAnalyticsPage />} />\n <Route path=\"area-insights\" element={<AreaInsightsPage />} />\n\n {/* Settings & Profile */}\n <Route path=\"settings\" element={<SettingsPage />} />\n <Route path=\"profile\" element={<ProfilePage />} />\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 } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\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// ── 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);\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// ── 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);\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);\n\n// ── Chat ────────────────────────────────────────────────────────────────────\nconst ChatPage = lazy(() => import('./pages/chat/ChatPage').then((m) => ({ default: m.ChatPage })));\n\n// ── Notifications ───────────────────────────────────────────────────────────\nconst NotificationsPage = lazy(() =>\n import('./pages/notifications/NotificationsPage').then((m) => ({ default: m.NotificationsPage }))\n);\n\n// ── Verification ────────────────────────────────────────────────────────────\nconst VerificationPage = lazy(() =>\n import('./pages/verification/VerificationPage').then((m) => ({ default: m.VerificationPage }))\n);\n\n// ── Legal ───────────────────────────────────────────────────────────────────\nconst LegalPage = lazy(() => import('./pages/legal/LegalPage').then((m) => ({ default: m.LegalPage })));\n\n// ── Finance ─────────────────────────────────────────────────────────────────\nconst HomeLoansPage = lazy(() => import('./pages/finance/HomeLoansPage').then((m) => ({ default: m.HomeLoansPage })));\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 index element={<HomePage />} />\n\n {/* Properties */}\n <Route path=\"properties\" element={<PropertiesPage />} />\n <Route path=\"properties/new\" element={<AddPropertyPage />} />\n <Route path=\"properties/:id\" element={<PropertyDetailPage />} />\n\n {/* Transactions */}\n <Route path=\"transactions\" element={<TransactionsPage />} />\n <Route path=\"transactions/:id\" element={<TransactionDetailPage />} />\n\n {/* Investments */}\n <Route path=\"investments\" element={<InvestmentsPage />} />\n <Route path=\"investments/:id\" element={<InvestmentDetailPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Rental Management */}\n <Route path=\"rental\" element={<RentalManagementPage />} />\n\n {/* Asset Management */}\n <Route path=\"assets\" element={<AssetManagementPage />} />\n\n {/* AMC Management */}\n <Route path=\"amc\" element={<AMCManagementPage />} />\n\n {/* Marketplace */}\n <Route path=\"marketplace\" element={<MarketplacePage />} />\n\n {/* Chat */}\n <Route path=\"chat\" element={<ChatPage />} />\n\n {/* Notifications */}\n <Route path=\"notifications\" element={<NotificationsPage />} />\n\n {/* Verification */}\n <Route path=\"verification\" element={<VerificationPage />} />\n\n {/* Legal */}\n <Route path=\"legal\" element={<LegalPage />} />\n\n {/* Home Loans */}\n <Route path=\"home-loans\" element={<HomeLoansPage />} />\n\n {/* Market Analytics */}\n <Route path=\"market-analytics\" element={<MarketAnalyticsPage />} />\n <Route path=\"area-insights\" element={<AreaInsightsPage />} />\n\n {/* Settings & Profile */}\n <Route path=\"settings\" element={<SettingsPage />} />\n <Route path=\"profile\" element={<ProfilePage />} />\n\n {/* Catch-all: redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":";;;;;AAaA,IAAM,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,OAAD;EAAK,WAAU;YAA8B;EAAgB,CAAA;CACzD,CAAA,EAIF,IAAiB,QACrB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CACzF,EACK,IAAkB,QACtB,OAAO,yCAAsC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC3F,EACK,IAAqB,QACzB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CACjG,EAGK,IAAmB,QACvB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/F,EACK,IAAwB,QAC5B,OAAO,iDAA8C,MAAM,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,CACzG,EAGK,IAAkB,QACtB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC5F,EACK,IAAuB,QAC3B,OAAO,+CAA4C,MAAM,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,CACtG,EAGK,IAAgB,QAAW,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,EAGjH,IAAuB,QAC3B,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,sBAAsB,EAAE,CACjG,EAGK,IAAsB,QAC1B,OAAO,yCAAsC,MAAM,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAC/F,EAGK,IAAoB,QACxB,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACxF,EAGK,IAAkB,QACtB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC5F,EAGK,IAAW,QAAW,OAAO,4BAAyB,MAAM,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAG7F,IAAoB,QACxB,OAAO,8CAA2C,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAClG,EAGK,IAAmB,QACvB,OAAO,4CAAyC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/F,EAGK,IAAY,QAAW,OAAO,8BAA2B,MAAM,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAGjG,IAAgB,QAAW,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,EAG/G,IAAsB,QAC1B,OAAO,yCAAsC,MAAM,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAC/F,EACK,IAAmB,QACvB,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CACzF,EAGK,IAAe,QAAW,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EAC7G,IAAc,QAAW,OAAO,mCAAgC,MAAM,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAMhH,SAAgB,IAAqB;AACnC,QACE,kBAAC,GAAD;EAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;YAChC,kBAAC,GAAD,EAAA,UAAA;GAEE,kBAAC,GAAD;IAAO,OAAA;IAAM,SAAS,kBAAC,GAAD,EAAY,CAAA;IAAI,CAAA;GAGtC,kBAAC,GAAD;IAAO,MAAK;IAAa,SAAS,kBAAC,GAAD,EAAkB,CAAA;IAAI,CAAA;GACxD,kBAAC,GAAD;IAAO,MAAK;IAAiB,SAAS,kBAAC,GAAD,EAAmB,CAAA;IAAI,CAAA;GAC7D,kBAAC,GAAD;IAAO,MAAK;IAAiB,SAAS,kBAAC,GAAD,EAAsB,CAAA;IAAI,CAAA;GAGhE,kBAAC,GAAD;IAAO,MAAK;IAAe,SAAS,kBAAC,GAAD,EAAoB,CAAA;IAAI,CAAA;GAC5D,kBAAC,GAAD;IAAO,MAAK;IAAmB,SAAS,kBAAC,GAAD,EAAyB,CAAA;IAAI,CAAA;GAGrE,kBAAC,GAAD;IAAO,MAAK;IAAc,SAAS,kBAAC,GAAD,EAAmB,CAAA;IAAI,CAAA;GAC1D,kBAAC,GAAD;IAAO,MAAK;IAAkB,SAAS,kBAAC,GAAD,EAAwB,CAAA;IAAI,CAAA;GAGnE,kBAAC,GAAD;IAAO,MAAK;IAAY,SAAS,kBAAC,GAAD,EAAiB,CAAA;IAAI,CAAA;GAGtD,kBAAC,GAAD;IAAO,MAAK;IAAS,SAAS,kBAAC,GAAD,EAAwB,CAAA;IAAI,CAAA;GAG1D,kBAAC,GAAD;IAAO,MAAK;IAAS,SAAS,kBAAC,GAAD,EAAuB,CAAA;IAAI,CAAA;GAGzD,kBAAC,GAAD;IAAO,MAAK;IAAM,SAAS,kBAAC,GAAD,EAAqB,CAAA;IAAI,CAAA;GAGpD,kBAAC,GAAD;IAAO,MAAK;IAAc,SAAS,kBAAC,GAAD,EAAmB,CAAA;IAAI,CAAA;GAG1D,kBAAC,GAAD;IAAO,MAAK;IAAO,SAAS,kBAAC,GAAD,EAAY,CAAA;IAAI,CAAA;GAG5C,kBAAC,GAAD;IAAO,MAAK;IAAgB,SAAS,kBAAC,GAAD,EAAqB,CAAA;IAAI,CAAA;GAG9D,kBAAC,GAAD;IAAO,MAAK;IAAe,SAAS,kBAAC,GAAD,EAAoB,CAAA;IAAI,CAAA;GAG5D,kBAAC,GAAD;IAAO,MAAK;IAAQ,SAAS,kBAAC,GAAD,EAAa,CAAA;IAAI,CAAA;GAG9C,kBAAC,GAAD;IAAO,MAAK;IAAa,SAAS,kBAAC,GAAD,EAAiB,CAAA;IAAI,CAAA;GAGvD,kBAAC,GAAD;IAAO,MAAK;IAAmB,SAAS,kBAAC,GAAD,EAAuB,CAAA;IAAI,CAAA;GACnE,kBAAC,GAAD;IAAO,MAAK;IAAgB,SAAS,kBAAC,GAAD,EAAoB,CAAA;IAAI,CAAA;GAG7D,kBAAC,GAAD;IAAO,MAAK;IAAW,SAAS,kBAAC,GAAD,EAAgB,CAAA;IAAI,CAAA;GACpD,kBAAC,GAAD;IAAO,MAAK;IAAU,SAAS,kBAAC,GAAD,EAAe,CAAA;IAAI,CAAA;GAGlD,kBAAC,GAAD;IAAO,MAAK;IAAI,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAG,SAAA;KAAU,CAAA;IAAI,CAAA;GAChD,EAAA,CAAA;EACA,CAAA"}
|
|
@@ -8,18 +8,18 @@ var o = ({ items: o, className: s }) => /* @__PURE__ */ a("nav", {
|
|
|
8
8
|
className: e("flex items-center gap-1 text-sm", s),
|
|
9
9
|
children: [/* @__PURE__ */ i(r, {
|
|
10
10
|
to: "",
|
|
11
|
-
className: "flex items-center text-
|
|
11
|
+
className: "flex items-center text-text-secondary hover:text-text-primary",
|
|
12
12
|
children: /* @__PURE__ */ i(n, { className: "h-3.5 w-3.5" })
|
|
13
13
|
}), o.map((n, s) => {
|
|
14
14
|
let c = s === o.length - 1;
|
|
15
15
|
return /* @__PURE__ */ a("span", {
|
|
16
16
|
className: "flex items-center gap-1",
|
|
17
|
-
children: [/* @__PURE__ */ i(t, { className: "h-3.5 w-3.5 text-
|
|
18
|
-
className: e(c ? "font-medium text-
|
|
17
|
+
children: [/* @__PURE__ */ i(t, { className: "h-3.5 w-3.5 text-text-secondary/50" }), c || !n.href ? /* @__PURE__ */ i("span", {
|
|
18
|
+
className: e(c ? "font-medium text-text-primary" : "text-text-secondary"),
|
|
19
19
|
children: n.label
|
|
20
20
|
}) : /* @__PURE__ */ i(r, {
|
|
21
21
|
to: n.href,
|
|
22
|
-
className: "text-
|
|
22
|
+
className: "text-text-secondary hover:text-text-primary",
|
|
23
23
|
children: n.label
|
|
24
24
|
})]
|
|
25
25
|
}, n.label);
|
|
@@ -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';\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 return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link to=\"\" className=\"flex items-center text-
|
|
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';\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 return (\n <nav aria-label=\"Breadcrumb\" className={cn('flex items-center gap-1 text-sm', className)}>\n <Link to=\"\" className=\"flex items-center text-text-secondary hover:text-text-primary\">\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":";;;;;AAeA,IAAa,KAAqC,EAAE,UAAO,mBAEvD,kBAAC,OAAD;CAAK,cAAW;CAAa,WAAW,EAAG,mCAAmC,EAAU;WAAxF,CACE,kBAAC,GAAD;EAAM,IAAG;EAAG,WAAU;YACpB,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA;EAC3B,CAAA,EACN,EAAM,KAAK,GAAM,MAAU;EAC1B,IAAM,IAAS,MAAU,EAAM,SAAS;AACxC,SACE,kBAAC,QAAD;GAAuB,WAAU;aAAjC,CACE,kBAAC,GAAD,EAAc,WAAU,sCAAuC,CAAA,EAC9D,KAAU,CAAC,EAAK,OACf,kBAAC,QAAD;IAAM,WAAW,EAAG,IAAS,kCAAkC,sBAAsB;cAAG,EAAK;IAAa,CAAA,GAE1G,kBAAC,GAAD;IAAM,IAAI,EAAK;IAAM,WAAU;cAC5B,EAAK;IACD,CAAA,CAEJ;KATI,EAAK,MAST;GAET,CACE"}
|
|
@@ -2,14 +2,14 @@ import { cn as e } from "../utils/helpers.js";
|
|
|
2
2
|
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
3
|
//#region src/housingvista/components/ChartCard.tsx
|
|
4
4
|
var r = ({ title: r, description: i, actions: a, children: o, className: s }) => /* @__PURE__ */ n("div", {
|
|
5
|
-
className: e("rounded-lg border border-border bg-
|
|
5
|
+
className: e("rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm", s),
|
|
6
6
|
children: [/* @__PURE__ */ n("div", {
|
|
7
7
|
className: "mb-4 flex items-center justify-between",
|
|
8
8
|
children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("h3", {
|
|
9
|
-
className: "text-sm font-medium text-
|
|
9
|
+
className: "text-sm font-medium text-text-primary",
|
|
10
10
|
children: r
|
|
11
11
|
}), i && /* @__PURE__ */ t("p", {
|
|
12
|
-
className: "text-xs text-
|
|
12
|
+
className: "text-xs text-text-secondary mt-0.5",
|
|
13
13
|
children: i
|
|
14
14
|
})] }), a && /* @__PURE__ */ t("div", {
|
|
15
15
|
className: "flex items-center gap-2",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartCard.js","names":[],"sources":["../../../src/housingvista/components/ChartCard.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/helpers';\n\ninterface ChartCardProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const ChartCard: FC<ChartCardProps> = ({ title, description, actions, children, className }) => {\n return (\n <div className={cn('rounded-lg border border-border bg-
|
|
1
|
+
{"version":3,"file":"ChartCard.js","names":[],"sources":["../../../src/housingvista/components/ChartCard.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/helpers';\n\ninterface ChartCardProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const ChartCard: FC<ChartCardProps> = ({ title, description, actions, children, className }) => {\n return (\n <div className={cn('rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm', className)}>\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n {children}\n </div>\n );\n};\n"],"mappings":";;;AAWA,IAAa,KAAiC,EAAE,UAAO,gBAAa,YAAS,aAAU,mBAEnF,kBAAC,OAAD;CAAK,WAAW,EAAG,sEAAsE,EAAU;WAAnG,CACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyC;GAAW,CAAA,EACjE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAAsC;GAAgB,CAAA,CAC/E,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KACL,EACG"}
|
|
@@ -27,31 +27,31 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
27
27
|
n.has(t) ? n.delete(t) : n.add(t), b(n);
|
|
28
28
|
};
|
|
29
29
|
return f.length === 0 ? /* @__PURE__ */ l("div", {
|
|
30
|
-
className: "flex items-center justify-center rounded-lg border border-border bg-
|
|
30
|
+
className: "flex items-center justify-center rounded-lg border border-border-subtle bg-bg-surface p-12",
|
|
31
31
|
children: /* @__PURE__ */ l("p", {
|
|
32
|
-
className: "text-sm text-
|
|
32
|
+
className: "text-sm text-text-secondary",
|
|
33
33
|
children: h
|
|
34
34
|
})
|
|
35
35
|
}) : /* @__PURE__ */ u("div", {
|
|
36
36
|
className: e("space-y-3", g),
|
|
37
37
|
children: [/* @__PURE__ */ l("div", {
|
|
38
|
-
className: "overflow-x-auto rounded-lg border border-border",
|
|
38
|
+
className: "overflow-x-auto rounded-lg border border-border-subtle",
|
|
39
39
|
children: /* @__PURE__ */ u("table", {
|
|
40
40
|
className: "w-full",
|
|
41
41
|
children: [/* @__PURE__ */ l("thead", { children: /* @__PURE__ */ u("tr", {
|
|
42
|
-
className: "border-b border-border bg-
|
|
42
|
+
className: "border-b border-border-subtle bg-bg-sunken/50",
|
|
43
43
|
children: [v && /* @__PURE__ */ l("th", {
|
|
44
44
|
className: "w-10 px-3 py-3",
|
|
45
45
|
children: /* @__PURE__ */ l("input", {
|
|
46
46
|
type: "checkbox",
|
|
47
47
|
checked: N && M.length > 0,
|
|
48
48
|
onChange: P,
|
|
49
|
-
className: "h-4 w-4 rounded border-border"
|
|
49
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
50
50
|
})
|
|
51
51
|
}), d.map((t) => {
|
|
52
52
|
let n = t.sortable !== !1, r = S === t.key;
|
|
53
53
|
return /* @__PURE__ */ l("th", {
|
|
54
|
-
className: e("px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-
|
|
54
|
+
className: e("px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary", n && "cursor-pointer select-none hover:text-text-primary", t.className),
|
|
55
55
|
onClick: n ? () => O(t.key) : void 0,
|
|
56
56
|
children: /* @__PURE__ */ u("span", {
|
|
57
57
|
className: "inline-flex items-center gap-1",
|
|
@@ -60,11 +60,11 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
60
60
|
}, t.key);
|
|
61
61
|
})]
|
|
62
62
|
}) }), /* @__PURE__ */ l("tbody", {
|
|
63
|
-
className: "divide-y divide-border bg-
|
|
63
|
+
className: "divide-y divide-border bg-bg-surface",
|
|
64
64
|
children: M.map((t) => {
|
|
65
65
|
let n = String(t[p]), r = v && y?.has(n);
|
|
66
66
|
return /* @__PURE__ */ u("tr", {
|
|
67
|
-
className: e("transition-colors", m && "cursor-pointer hover:bg-
|
|
67
|
+
className: e("transition-colors", m && "cursor-pointer hover:bg-bg-sunken/50", r && "bg-action-primary-bg/5"),
|
|
68
68
|
onClick: () => m?.(t),
|
|
69
69
|
children: [v && /* @__PURE__ */ l("td", {
|
|
70
70
|
className: "w-10 px-3 py-3",
|
|
@@ -73,10 +73,10 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
73
73
|
type: "checkbox",
|
|
74
74
|
checked: r ?? !1,
|
|
75
75
|
onChange: () => F(t),
|
|
76
|
-
className: "h-4 w-4 rounded border-border"
|
|
76
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
77
77
|
})
|
|
78
78
|
}), d.map((n) => /* @__PURE__ */ l("td", {
|
|
79
|
-
className: e("px-4 py-3 text-sm text-
|
|
79
|
+
className: e("px-4 py-3 text-sm text-text-primary", n.className),
|
|
80
80
|
children: n.render ? n.render(t) : String(t[n.key] ?? "")
|
|
81
81
|
}, n.key))]
|
|
82
82
|
}, n);
|
|
@@ -84,9 +84,9 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
84
84
|
})]
|
|
85
85
|
})
|
|
86
86
|
}), x ? /* @__PURE__ */ u("div", {
|
|
87
|
-
className: "flex flex-col gap-3 rounded-lg border border-border bg-
|
|
87
|
+
className: "flex flex-col gap-3 rounded-lg border border-border-subtle bg-bg-surface p-3 text-sm sm:flex-row sm:items-center sm:justify-between",
|
|
88
88
|
children: [/* @__PURE__ */ u("span", {
|
|
89
|
-
className: "text-
|
|
89
|
+
className: "text-text-secondary",
|
|
90
90
|
children: ["Page ", x.page]
|
|
91
91
|
}), /* @__PURE__ */ u("div", {
|
|
92
92
|
className: "flex flex-wrap items-center gap-2",
|
|
@@ -95,7 +95,7 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
95
95
|
value: x.pageSize,
|
|
96
96
|
onChange: (e) => x.onPageSizeChange?.(Number(e.target.value)),
|
|
97
97
|
disabled: x.loading,
|
|
98
|
-
className: "h-8 rounded-md border border-border bg-
|
|
98
|
+
className: "h-8 rounded-md border border-border-subtle bg-bg-surface px-2 text-sm text-text-primary disabled:opacity-50",
|
|
99
99
|
"aria-label": "Rows per page",
|
|
100
100
|
children: [
|
|
101
101
|
10,
|
|
@@ -111,14 +111,14 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
111
111
|
type: "button",
|
|
112
112
|
onClick: () => x.onPageChange(x.page - 1),
|
|
113
113
|
disabled: x.loading || x.page <= 1,
|
|
114
|
-
className: "inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-
|
|
114
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40",
|
|
115
115
|
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Previous"]
|
|
116
116
|
}),
|
|
117
117
|
/* @__PURE__ */ u("button", {
|
|
118
118
|
type: "button",
|
|
119
119
|
onClick: () => x.onPageChange(x.page + 1),
|
|
120
120
|
disabled: x.loading || !(x.hasNextPage ?? k.length >= x.pageSize),
|
|
121
|
-
className: "inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-
|
|
121
|
+
className: "inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40",
|
|
122
122
|
children: ["Next", /* @__PURE__ */ l(o, { className: "h-4 w-4" })]
|
|
123
123
|
})
|
|
124
124
|
]
|
|
@@ -126,7 +126,7 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
126
126
|
}) : k.length > _ ? /* @__PURE__ */ u("div", {
|
|
127
127
|
className: "flex items-center justify-between text-sm",
|
|
128
128
|
children: [/* @__PURE__ */ u("span", {
|
|
129
|
-
className: "text-
|
|
129
|
+
className: "text-text-secondary",
|
|
130
130
|
children: [
|
|
131
131
|
"Showing ",
|
|
132
132
|
E * _ + 1,
|
|
@@ -141,18 +141,18 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
141
141
|
/* @__PURE__ */ l("button", {
|
|
142
142
|
onClick: () => D((e) => Math.max(0, e - 1)),
|
|
143
143
|
disabled: E === 0,
|
|
144
|
-
className: "rounded-md border border-border p-1.5 text-
|
|
144
|
+
className: "rounded-md border border-border-subtle p-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40",
|
|
145
145
|
children: /* @__PURE__ */ l(a, { className: "h-4 w-4" })
|
|
146
146
|
}),
|
|
147
147
|
Array.from({ length: j }).map((t, n) => /* @__PURE__ */ l("button", {
|
|
148
148
|
onClick: () => D(n),
|
|
149
|
-
className: e("h-8 w-8 rounded-md text-xs font-medium transition-colors", n === E ? "bg-foreground text-background" : "text-
|
|
149
|
+
className: e("h-8 w-8 rounded-md text-xs font-medium transition-colors", n === E ? "bg-foreground text-background" : "text-text-secondary hover:bg-bg-sunken"),
|
|
150
150
|
children: n + 1
|
|
151
151
|
}, n)),
|
|
152
152
|
/* @__PURE__ */ l("button", {
|
|
153
153
|
onClick: () => D((e) => Math.min(j - 1, e + 1)),
|
|
154
154
|
disabled: E >= j - 1,
|
|
155
|
-
className: "rounded-md border border-border p-1.5 text-
|
|
155
|
+
className: "rounded-md border border-border-subtle p-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40",
|
|
156
156
|
children: /* @__PURE__ */ l(o, { className: "h-4 w-4" })
|
|
157
157
|
})
|
|
158
158
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/housingvista/components/DataTable.tsx"],"sourcesContent":["import { useState, useMemo, useCallback, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\nexport interface Column<T> {\n key: string;\n header: string;\n render?: (item: T) => ReactNode;\n className?: string;\n sortable?: boolean;\n}\n\ntype SortDirection = 'asc' | 'desc' | null;\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyField: string;\n onRowClick?: (item: T) => void;\n emptyMessage?: string;\n className?: string;\n pageSize?: number;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n onSelectionChange?: (keys: Set<string>) => void;\n serverPagination?: {\n page: number;\n pageSize: number;\n hasNextPage?: boolean;\n loading?: boolean;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n };\n}\n\nexport function DataTable<T extends object>({\n columns,\n data,\n keyField,\n onRowClick,\n emptyMessage = 'No data available',\n className,\n pageSize = 10,\n selectable = false,\n selectedKeys,\n onSelectionChange,\n serverPagination,\n}: DataTableProps<T>) {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<SortDirection>(null);\n const [page, setPage] = useState(0);\n\n const handleSort = useCallback(\n (key: string) => {\n if (sortKey === key) {\n if (sortDir === 'asc') setSortDir('desc');\n else if (sortDir === 'desc') {\n setSortKey(null);\n setSortDir(null);\n } else setSortDir('asc');\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n setPage(0);\n },\n [sortKey, sortDir]\n );\n\n const sorted = useMemo(() => {\n if (!sortKey || !sortDir) return data;\n return [...data].sort((a, b) => {\n const av = (a as Record<string, unknown>)[sortKey];\n const bv = (b as Record<string, unknown>)[sortKey];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const cmp = typeof av === 'number' && typeof bv === 'number' ? av - bv : String(av).localeCompare(String(bv));\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }, [data, sortKey, sortDir]);\n\n const effectivePageSize = serverPagination?.pageSize ?? pageSize;\n const totalPages = Math.max(1, Math.ceil(sorted.length / effectivePageSize));\n const paged = serverPagination ? sorted : sorted.slice(page * effectivePageSize, (page + 1) * effectivePageSize);\n\n const allPageKeysSelected =\n selectable && selectedKeys\n ? paged.every((item) => selectedKeys.has(String((item as Record<string, unknown>)[keyField])))\n : false;\n\n const handleSelectAll = () => {\n if (!onSelectionChange || !selectedKeys) return;\n const keys = new Set(selectedKeys);\n if (allPageKeysSelected) {\n paged.forEach((item) => keys.delete(String((item as Record<string, unknown>)[keyField])));\n } else {\n paged.forEach((item) => keys.add(String((item as Record<string, unknown>)[keyField])));\n }\n onSelectionChange(keys);\n };\n\n const handleSelectRow = (item: T) => {\n if (!onSelectionChange || !selectedKeys) return;\n const key = String((item as Record<string, unknown>)[keyField]);\n const keys = new Set(selectedKeys);\n if (keys.has(key)) keys.delete(key);\n else keys.add(key);\n onSelectionChange(keys);\n };\n\n if (data.length === 0) {\n return (\n <div className=\"flex items-center justify-center rounded-lg border border-border bg-card p-12\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-x-auto rounded-lg border border-border\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border bg-muted/50\">\n {selectable && (\n <th className=\"w-10 px-3 py-3\">\n <input\n type=\"checkbox\"\n checked={allPageKeysSelected && paged.length > 0}\n onChange={handleSelectAll}\n className=\"h-4 w-4 rounded border-border\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable !== false;\n const isActive = sortKey === col.key;\n return (\n <th\n key={col.key}\n className={cn(\n 'px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-muted-foreground',\n isSortable && 'cursor-pointer select-none hover:text-foreground',\n col.className\n )}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {isSortable &&\n (isActive ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 opacity-30\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border bg-card\">\n {paged.map((item) => {\n const rowKey = String((item as Record<string, unknown>)[keyField]);\n const isSelected = selectable && selectedKeys?.has(rowKey);\n return (\n <tr\n key={rowKey}\n className={cn(\n 'transition-colors',\n onRowClick && 'cursor-pointer hover:bg-muted/50',\n isSelected && 'bg-primary/5'\n )}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td className=\"w-10 px-3 py-3\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected ?? false}\n onChange={() => handleSelectRow(item)}\n className=\"h-4 w-4 rounded border-border\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-4 py-3 text-sm text-foreground', col.className)}>\n {col.render ? col.render(item) : String((item as Record<string, unknown>)[col.key] ?? '')}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {serverPagination ? (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-card p-3 text-sm sm:flex-row sm:items-center sm:justify-between\">\n <span className=\"text-muted-foreground\">Page {serverPagination.page}</span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {serverPagination.onPageSizeChange ? (\n <select\n value={serverPagination.pageSize}\n onChange={(event) => serverPagination.onPageSizeChange?.(Number(event.target.value))}\n disabled={serverPagination.loading}\n className=\"h-8 rounded-md border border-border bg-card px-2 text-sm text-foreground disabled:opacity-50\"\n aria-label=\"Rows per page\"\n >\n {[10, 25, 50, 100].map((option) => (\n <option key={option} value={option}>\n {option} / page\n </option>\n ))}\n </select>\n ) : null}\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page - 1)}\n disabled={serverPagination.loading || serverPagination.page <= 1}\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Previous\n </button>\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page + 1)}\n disabled={\n serverPagination.loading ||\n !(serverPagination.hasNextPage ?? sorted.length >= serverPagination.pageSize)\n }\n className=\"inline-flex items-center gap-1 rounded-md border border-border px-3 py-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : sorted.length > pageSize ? (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-muted-foreground\">\n Showing {page * pageSize + 1}-{Math.min((page + 1) * pageSize, sorted.length)} of {sorted.length}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n disabled={page === 0}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setPage(i)}\n className={cn(\n 'h-8 w-8 rounded-md text-xs font-medium transition-colors',\n i === page ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted'\n )}\n >\n {i + 1}\n </button>\n ))}\n <button\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n className=\"rounded-md border border-border p-1.5 text-muted-foreground transition-colors hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTable.js","names":[],"sources":["../../../src/housingvista/components/DataTable.tsx"],"sourcesContent":["import { useState, useMemo, useCallback, type ReactNode } from 'react';\nimport { ChevronUp, ChevronDown, ChevronsUpDown, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\nexport interface Column<T> {\n key: string;\n header: string;\n render?: (item: T) => ReactNode;\n className?: string;\n sortable?: boolean;\n}\n\ntype SortDirection = 'asc' | 'desc' | null;\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyField: string;\n onRowClick?: (item: T) => void;\n emptyMessage?: string;\n className?: string;\n pageSize?: number;\n selectable?: boolean;\n selectedKeys?: Set<string>;\n onSelectionChange?: (keys: Set<string>) => void;\n serverPagination?: {\n page: number;\n pageSize: number;\n hasNextPage?: boolean;\n loading?: boolean;\n onPageChange: (page: number) => void;\n onPageSizeChange?: (pageSize: number) => void;\n };\n}\n\nexport function DataTable<T extends object>({\n columns,\n data,\n keyField,\n onRowClick,\n emptyMessage = 'No data available',\n className,\n pageSize = 10,\n selectable = false,\n selectedKeys,\n onSelectionChange,\n serverPagination,\n}: DataTableProps<T>) {\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDir, setSortDir] = useState<SortDirection>(null);\n const [page, setPage] = useState(0);\n\n const handleSort = useCallback(\n (key: string) => {\n if (sortKey === key) {\n if (sortDir === 'asc') setSortDir('desc');\n else if (sortDir === 'desc') {\n setSortKey(null);\n setSortDir(null);\n } else setSortDir('asc');\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n setPage(0);\n },\n [sortKey, sortDir]\n );\n\n const sorted = useMemo(() => {\n if (!sortKey || !sortDir) return data;\n return [...data].sort((a, b) => {\n const av = (a as Record<string, unknown>)[sortKey];\n const bv = (b as Record<string, unknown>)[sortKey];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n const cmp = typeof av === 'number' && typeof bv === 'number' ? av - bv : String(av).localeCompare(String(bv));\n return sortDir === 'asc' ? cmp : -cmp;\n });\n }, [data, sortKey, sortDir]);\n\n const effectivePageSize = serverPagination?.pageSize ?? pageSize;\n const totalPages = Math.max(1, Math.ceil(sorted.length / effectivePageSize));\n const paged = serverPagination ? sorted : sorted.slice(page * effectivePageSize, (page + 1) * effectivePageSize);\n\n const allPageKeysSelected =\n selectable && selectedKeys\n ? paged.every((item) => selectedKeys.has(String((item as Record<string, unknown>)[keyField])))\n : false;\n\n const handleSelectAll = () => {\n if (!onSelectionChange || !selectedKeys) return;\n const keys = new Set(selectedKeys);\n if (allPageKeysSelected) {\n paged.forEach((item) => keys.delete(String((item as Record<string, unknown>)[keyField])));\n } else {\n paged.forEach((item) => keys.add(String((item as Record<string, unknown>)[keyField])));\n }\n onSelectionChange(keys);\n };\n\n const handleSelectRow = (item: T) => {\n if (!onSelectionChange || !selectedKeys) return;\n const key = String((item as Record<string, unknown>)[keyField]);\n const keys = new Set(selectedKeys);\n if (keys.has(key)) keys.delete(key);\n else keys.add(key);\n onSelectionChange(keys);\n };\n\n if (data.length === 0) {\n return (\n <div className=\"flex items-center justify-center rounded-lg border border-border-subtle bg-bg-surface p-12\">\n <p className=\"text-sm text-text-secondary\">{emptyMessage}</p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-3', className)}>\n <div className=\"overflow-x-auto rounded-lg border border-border-subtle\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n {selectable && (\n <th className=\"w-10 px-3 py-3\">\n <input\n type=\"checkbox\"\n checked={allPageKeysSelected && paged.length > 0}\n onChange={handleSelectAll}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </th>\n )}\n {columns.map((col) => {\n const isSortable = col.sortable !== false;\n const isActive = sortKey === col.key;\n return (\n <th\n key={col.key}\n className={cn(\n 'px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary',\n isSortable && 'cursor-pointer select-none hover:text-text-primary',\n col.className\n )}\n onClick={isSortable ? () => handleSort(col.key) : undefined}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.header}\n {isSortable &&\n (isActive ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 opacity-30\" />\n ))}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border bg-bg-surface\">\n {paged.map((item) => {\n const rowKey = String((item as Record<string, unknown>)[keyField]);\n const isSelected = selectable && selectedKeys?.has(rowKey);\n return (\n <tr\n key={rowKey}\n className={cn(\n 'transition-colors',\n onRowClick && 'cursor-pointer hover:bg-bg-sunken/50',\n isSelected && 'bg-action-primary-bg/5'\n )}\n onClick={() => onRowClick?.(item)}\n >\n {selectable && (\n <td className=\"w-10 px-3 py-3\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n checked={isSelected ?? false}\n onChange={() => handleSelectRow(item)}\n className=\"h-4 w-4 rounded border-border-subtle\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-4 py-3 text-sm text-text-primary', col.className)}>\n {col.render ? col.render(item) : String((item as Record<string, unknown>)[col.key] ?? '')}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {serverPagination ? (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border-subtle bg-bg-surface p-3 text-sm sm:flex-row sm:items-center sm:justify-between\">\n <span className=\"text-text-secondary\">Page {serverPagination.page}</span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {serverPagination.onPageSizeChange ? (\n <select\n value={serverPagination.pageSize}\n onChange={(event) => serverPagination.onPageSizeChange?.(Number(event.target.value))}\n disabled={serverPagination.loading}\n className=\"h-8 rounded-md border border-border-subtle bg-bg-surface px-2 text-sm text-text-primary disabled:opacity-50\"\n aria-label=\"Rows per page\"\n >\n {[10, 25, 50, 100].map((option) => (\n <option key={option} value={option}>\n {option} / page\n </option>\n ))}\n </select>\n ) : null}\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page - 1)}\n disabled={serverPagination.loading || serverPagination.page <= 1}\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n Previous\n </button>\n <button\n type=\"button\"\n onClick={() => serverPagination.onPageChange(serverPagination.page + 1)}\n disabled={\n serverPagination.loading ||\n !(serverPagination.hasNextPage ?? sorted.length >= serverPagination.pageSize)\n }\n className=\"inline-flex items-center gap-1 rounded-md border border-border-subtle px-3 py-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n Next\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : sorted.length > pageSize ? (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">\n Showing {page * pageSize + 1}-{Math.min((page + 1) * pageSize, sorted.length)} of {sorted.length}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n disabled={page === 0}\n className=\"rounded-md border border-border-subtle p-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {Array.from({ length: totalPages }).map((_, i) => (\n <button\n key={i}\n onClick={() => setPage(i)}\n className={cn(\n 'h-8 w-8 rounded-md text-xs font-medium transition-colors',\n i === page ? 'bg-foreground text-background' : 'text-text-secondary hover:bg-bg-sunken'\n )}\n >\n {i + 1}\n </button>\n ))}\n <button\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n disabled={page >= totalPages - 1}\n className=\"rounded-md border border-border-subtle p-1.5 text-text-secondary transition-colors hover:text-text-primary disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;AAmCA,SAAgB,EAA4B,EAC1C,YACA,SACA,aACA,eACA,kBAAe,qBACf,cACA,cAAW,IACX,gBAAa,IACb,iBACA,sBACA,uBACoB;CACpB,IAAM,CAAC,GAAS,KAAc,EAAwB,KAAK,EACrD,CAAC,GAAS,KAAc,EAAwB,KAAK,EACrD,CAAC,GAAM,KAAW,EAAS,EAAE,EAE7B,IAAa,GAChB,MAAgB;AAWf,EAVI,MAAY,IACV,MAAY,QAAO,EAAW,OAAO,GAChC,MAAY,UACnB,EAAW,KAAK,EAChB,EAAW,KAAK,IACX,EAAW,MAAM,IAExB,EAAW,EAAI,EACf,EAAW,MAAM,GAEnB,EAAQ,EAAE;IAEZ,CAAC,GAAS,EAAQ,CACnB,EAEK,IAAS,QACT,CAAC,KAAW,CAAC,IAAgB,IAC1B,CAAC,GAAG,EAAK,CAAC,MAAM,GAAG,MAAM;EAC9B,IAAM,IAAM,EAA8B,IACpC,IAAM,EAA8B;AAC1C,MAAI,KAAM,QAAQ,KAAM,KAAM,QAAO;AACrC,MAAI,KAAM,KAAM,QAAO;AACvB,MAAI,KAAM,KAAM,QAAO;EACvB,IAAM,IAAM,OAAO,KAAO,YAAY,OAAO,KAAO,WAAW,IAAK,IAAK,OAAO,EAAG,CAAC,cAAc,OAAO,EAAG,CAAC;AAC7G,SAAO,MAAY,QAAQ,IAAM,CAAC;GAClC,EACD;EAAC;EAAM;EAAS;EAAQ,CAAC,EAEtB,IAAoB,GAAkB,YAAY,GAClD,IAAa,KAAK,IAAI,GAAG,KAAK,KAAK,EAAO,SAAS,EAAkB,CAAC,EACtE,IAAQ,IAAmB,IAAS,EAAO,MAAM,IAAO,IAAoB,IAAO,KAAK,EAAkB,EAE1G,IACJ,KAAc,IACV,EAAM,OAAO,MAAS,EAAa,IAAI,OAAQ,EAAiC,GAAU,CAAC,CAAC,GAC5F,IAEA,UAAwB;AAC5B,MAAI,CAAC,KAAqB,CAAC,EAAc;EACzC,IAAM,IAAO,IAAI,IAAI,EAAa;AAMlC,EALI,IACF,EAAM,SAAS,MAAS,EAAK,OAAO,OAAQ,EAAiC,GAAU,CAAC,CAAC,GAEzF,EAAM,SAAS,MAAS,EAAK,IAAI,OAAQ,EAAiC,GAAU,CAAC,CAAC,EAExF,EAAkB,EAAK;IAGnB,KAAmB,MAAY;AACnC,MAAI,CAAC,KAAqB,CAAC,EAAc;EACzC,IAAM,IAAM,OAAQ,EAAiC,GAAU,EACzD,IAAO,IAAI,IAAI,EAAa;AAGlC,EAFI,EAAK,IAAI,EAAI,GAAE,EAAK,OAAO,EAAI,GAC9B,EAAK,IAAI,EAAI,EAClB,EAAkB,EAAK;;AAWzB,QARI,EAAK,WAAW,IAEhB,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAiB,CAAA;EACzD,CAAA,GAKR,kBAAC,OAAD;EAAK,WAAW,EAAG,aAAa,EAAU;YAA1C,CACE,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;KAAI,WAAU;eAAd,CACG,KACC,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,SAAD;OACE,MAAK;OACL,SAAS,KAAuB,EAAM,SAAS;OAC/C,UAAU;OACV,WAAU;OACV,CAAA;MACC,CAAA,EAEN,EAAQ,KAAK,MAAQ;MACpB,IAAM,IAAa,EAAI,aAAa,IAC9B,IAAW,MAAY,EAAI;AACjC,aACE,kBAAC,MAAD;OAEE,WAAW,EACT,wFACA,KAAc,sDACd,EAAI,UACL;OACD,SAAS,UAAmB,EAAW,EAAI,IAAI,GAAG,KAAA;iBAElD,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACG,EAAI,QACJ,MACE,IAEG,EADF,MAAY,QACT,IAEA,GAFD,EAAW,WAAU,WAAY,CAEE,GAGrC,kBAAC,GAAD,EAAgB,WAAU,sBAAuB,CAAA,EAEhD;;OACJ,EArBE,EAAI,IAqBN;OAEP,CACC;QACC,CAAA,EACR,kBAAC,SAAD;KAAO,WAAU;eACd,EAAM,KAAK,MAAS;MACnB,IAAM,IAAS,OAAQ,EAAiC,GAAU,EAC5D,IAAa,KAAc,GAAc,IAAI,EAAO;AAC1D,aACE,kBAAC,MAAD;OAEE,WAAW,EACT,qBACA,KAAc,wCACd,KAAc,yBACf;OACD,eAAe,IAAa,EAAK;iBAPnC,CASG,KACC,kBAAC,MAAD;QAAI,WAAU;QAAiB,UAAU,MAAM,EAAE,iBAAiB;kBAChE,kBAAC,SAAD;SACE,MAAK;SACL,SAAS,KAAc;SACvB,gBAAgB,EAAgB,EAAK;SACrC,WAAU;SACV,CAAA;QACC,CAAA,EAEN,EAAQ,KAAK,MACZ,kBAAC,MAAD;QAAkB,WAAW,EAAG,uCAAuC,EAAI,UAAU;kBAClF,EAAI,SAAS,EAAI,OAAO,EAAK,GAAG,OAAQ,EAAiC,EAAI,QAAQ,GAAG;QACtF,EAFI,EAAI,IAER,CACL,CACC;SAvBE,EAuBF;OAEP;KACI,CAAA,CACF;;GACJ,CAAA,EAEL,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAAhB,CAAsC,SAAM,EAAiB,KAAY;OACzE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,EAAiB,mBAChB,kBAAC,UAAD;MACE,OAAO,EAAiB;MACxB,WAAW,MAAU,EAAiB,mBAAmB,OAAO,EAAM,OAAO,MAAM,CAAC;MACpF,UAAU,EAAiB;MAC3B,WAAU;MACV,cAAW;gBAEV;OAAC;OAAI;OAAI;OAAI;OAAI,CAAC,KAAK,MACtB,kBAAC,UAAD;OAAqB,OAAO;iBAA5B,CACG,GAAO,UACD;SAFI,EAEJ,CACT;MACK,CAAA,GACP;KACJ,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAiB,aAAa,EAAiB,OAAO,EAAE;MACvE,UAAU,EAAiB,WAAW,EAAiB,QAAQ;MAC/D,WAAU;gBAJZ,CAME,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAAA,WAE5B;;KACT,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAiB,aAAa,EAAiB,OAAO,EAAE;MACvE,UACE,EAAiB,WACjB,EAAE,EAAiB,eAAe,EAAO,UAAU,EAAiB;MAEtE,WAAU;gBAPZ,CAQC,QAEC,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,CAC7B;;KACL;MACF;OACJ,EAAO,SAAS,IAClB,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAAsC;KAC3B,IAAO,IAAW;KAAE;KAAE,KAAK,KAAK,IAAO,KAAK,GAAU,EAAO,OAAO;KAAC;KAAK,EAAO;KACrF;OACP,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,UAAD;MACE,eAAe,GAAS,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC;MACjD,UAAU,MAAS;MACnB,WAAU;gBAEV,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;MAC5B,CAAA;KACR,MAAM,KAAK,EAAE,QAAQ,GAAY,CAAC,CAAC,KAAK,GAAG,MAC1C,kBAAC,UAAD;MAEE,eAAe,EAAQ,EAAE;MACzB,WAAW,EACT,4DACA,MAAM,IAAO,kCAAkC,yCAChD;gBAEA,IAAI;MACE,EARF,EAQE,CACT;KACF,kBAAC,UAAD;MACE,eAAe,GAAS,MAAM,KAAK,IAAI,IAAa,GAAG,IAAI,EAAE,CAAC;MAC9D,UAAU,KAAQ,IAAa;MAC/B,WAAU;gBAEV,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;MAC7B,CAAA;KACL;MACF;OACJ,KACA"}
|
|
@@ -3,18 +3,18 @@ import { Inbox as t } from "lucide-react";
|
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
4
|
//#region src/housingvista/components/EmptyState.tsx
|
|
5
5
|
var i = ({ icon: i, title: a, description: o, action: s, className: c }) => /* @__PURE__ */ r("div", {
|
|
6
|
-
className: e("flex flex-col items-center justify-center rounded-lg border border-dashed border-border bg-
|
|
6
|
+
className: e("flex flex-col items-center justify-center rounded-lg border border-dashed border-border-subtle bg-bg-surface/50 p-12 text-center", c),
|
|
7
7
|
children: [
|
|
8
8
|
/* @__PURE__ */ n("div", {
|
|
9
|
-
className: "mb-4 text-
|
|
9
|
+
className: "mb-4 text-text-secondary",
|
|
10
10
|
children: i || /* @__PURE__ */ n(t, { className: "h-12 w-12" })
|
|
11
11
|
}),
|
|
12
12
|
/* @__PURE__ */ n("h3", {
|
|
13
|
-
className: "text-lg font-medium text-
|
|
13
|
+
className: "text-lg font-medium text-text-primary",
|
|
14
14
|
children: a
|
|
15
15
|
}),
|
|
16
16
|
o && /* @__PURE__ */ n("p", {
|
|
17
|
-
className: "mt-1 text-sm text-
|
|
17
|
+
className: "mt-1 text-sm text-text-secondary max-w-md",
|
|
18
18
|
children: o
|
|
19
19
|
}),
|
|
20
20
|
s && /* @__PURE__ */ n("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/housingvista/components/EmptyState.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { Inbox } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({ icon, title, description, action, className }) => {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center rounded-lg border border-dashed border-border bg-
|
|
1
|
+
{"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/housingvista/components/EmptyState.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { Inbox } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({ icon, title, description, action, className }) => {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center rounded-lg border border-dashed border-border-subtle bg-bg-surface/50 p-12 text-center',\n className\n )}\n >\n <div className=\"mb-4 text-text-secondary\">{icon || <Inbox className=\"h-12 w-12\" />}</div>\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-1 text-sm text-text-secondary max-w-md\">{description}</p>}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAYA,IAAa,KAAmC,EAAE,SAAM,UAAO,gBAAa,WAAQ,mBAEhF,kBAAC,OAAD;CACE,WAAW,EACT,oIACA,EACD;WAJH;EAME,kBAAC,OAAD;GAAK,WAAU;aAA4B,KAAQ,kBAAC,GAAD,EAAO,WAAU,aAAc,CAAA;GAAO,CAAA;EACzF,kBAAC,MAAD;GAAI,WAAU;aAAyC;GAAW,CAAA;EACjE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAA6C;GAAgB,CAAA;EACzF,KAAU,kBAAC,OAAD;GAAK,WAAU;aAAQ;GAAa,CAAA;EAC3C"}
|
|
@@ -30,11 +30,11 @@ var a = class extends e {
|
|
|
30
30
|
children: [
|
|
31
31
|
/* @__PURE__ */ r(t, { className: "mb-4 h-12 w-12 text-red-500" }),
|
|
32
32
|
/* @__PURE__ */ r("h3", {
|
|
33
|
-
className: "text-lg font-medium text-
|
|
33
|
+
className: "text-lg font-medium text-text-primary",
|
|
34
34
|
children: "Something went wrong"
|
|
35
35
|
}),
|
|
36
36
|
/* @__PURE__ */ r("p", {
|
|
37
|
-
className: "mt-1 max-w-md text-sm text-
|
|
37
|
+
className: "mt-1 max-w-md text-sm text-text-secondary",
|
|
38
38
|
children: this.state.error?.message ?? "An unexpected error occurred while rendering this section."
|
|
39
39
|
}),
|
|
40
40
|
/* @__PURE__ */ i("button", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","names":[],"sources":["../../../src/housingvista/components/ErrorBoundary.tsx"],"sourcesContent":["import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('[HousingVista ErrorBoundary]', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-12 text-center dark:border-red-800 dark:bg-red-900/10\">\n <AlertTriangle className=\"mb-4 h-12 w-12 text-red-500\" />\n <h3 className=\"text-lg font-medium text-
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","names":[],"sources":["../../../src/housingvista/components/ErrorBoundary.tsx"],"sourcesContent":["import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('[HousingVista ErrorBoundary]', error, errorInfo);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) return this.props.fallback;\n\n return (\n <div className=\"flex flex-col items-center justify-center rounded-lg border border-dashed border-red-300 bg-red-50 p-12 text-center dark:border-red-800 dark:bg-red-900/10\">\n <AlertTriangle className=\"mb-4 h-12 w-12 text-red-500\" />\n <h3 className=\"text-lg font-medium text-text-primary\">Something went wrong</h3>\n <p className=\"mt-1 max-w-md text-sm text-text-secondary\">\n {this.state.error?.message ?? 'An unexpected error occurred while rendering this section.'}\n </p>\n <button\n onClick={this.handleReset}\n className=\"mt-4 flex items-center gap-1.5 rounded-md bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90\"\n >\n <RefreshCw className=\"h-4 w-4\" /> Try Again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n"],"mappings":";;;;AAaA,IAAa,IAAb,cAAmC,EAAkD;CACnF,YAAY,GAA2B;AAErC,EADA,MAAM,EAAM,EACZ,KAAK,QAAQ;GAAE,UAAU;GAAO,OAAO;GAAM;;CAG/C,OAAO,yBAAyB,GAAkC;AAChE,SAAO;GAAE,UAAU;GAAM;GAAO;;CAGlC,kBAAkB,GAAc,GAAsB;AACpD,UAAQ,MAAM,gCAAgC,GAAO,EAAU;;CAGjE,oBAAoB;AAClB,OAAK,SAAS;GAAE,UAAU;GAAO,OAAO;GAAM,CAAC;;CAGjD,SAAS;AAqBP,SApBI,KAAK,MAAM,WACT,KAAK,MAAM,WAAiB,KAAK,MAAM,WAGzC,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD,EAAe,WAAU,+BAAgC,CAAA;IACzD,kBAAC,MAAD;KAAI,WAAU;eAAwC;KAAyB,CAAA;IAC/E,kBAAC,KAAD;KAAG,WAAU;eACV,KAAK,MAAM,OAAO,WAAW;KAC5B,CAAA;IACJ,kBAAC,UAAD;KACE,SAAS,KAAK;KACd,WAAU;eAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAAA,aAC1B;;IACL;OAIH,KAAK,MAAM"}
|
|
@@ -7,12 +7,12 @@ var i = ({ searchValue: i, onSearchChange: a, searchPlaceholder: o = "Search..."
|
|
|
7
7
|
children: [
|
|
8
8
|
/* @__PURE__ */ r("div", {
|
|
9
9
|
className: "relative flex-1 min-w-[200px]",
|
|
10
|
-
children: [/* @__PURE__ */ n(t, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-
|
|
10
|
+
children: [/* @__PURE__ */ n(t, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ n("input", {
|
|
11
11
|
type: "text",
|
|
12
12
|
value: i,
|
|
13
13
|
onChange: (e) => a(e.target.value),
|
|
14
14
|
placeholder: o,
|
|
15
|
-
className: "h-9 w-full rounded-md border border-border bg-
|
|
15
|
+
className: "h-9 w-full rounded-md border border-border-subtle bg-bg-surface pl-9 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-1"
|
|
16
16
|
})]
|
|
17
17
|
}),
|
|
18
18
|
s && /* @__PURE__ */ n("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterBar.js","names":[],"sources":["../../../src/housingvista/components/FilterBar.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\ninterface FilterBarProps {\n searchValue: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n filters?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}\n\nexport const FilterBar: FC<FilterBarProps> = ({\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Search...',\n filters,\n actions,\n className,\n}) => {\n return (\n <div className={cn('flex flex-wrap items-center gap-3', className)}>\n <div className=\"relative flex-1 min-w-[200px]\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-
|
|
1
|
+
{"version":3,"file":"FilterBar.js","names":[],"sources":["../../../src/housingvista/components/FilterBar.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { Search } from 'lucide-react';\nimport { cn } from '../utils/helpers';\n\ninterface FilterBarProps {\n searchValue: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder?: string;\n filters?: ReactNode;\n actions?: ReactNode;\n className?: string;\n}\n\nexport const FilterBar: FC<FilterBarProps> = ({\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Search...',\n filters,\n actions,\n className,\n}) => {\n return (\n <div className={cn('flex flex-wrap items-center gap-3', className)}>\n <div className=\"relative flex-1 min-w-[200px]\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n value={searchValue}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"h-9 w-full rounded-md border border-border-subtle bg-bg-surface pl-9 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-1\"\n />\n </div>\n {filters && <div className=\"flex items-center gap-2\">{filters}</div>}\n {actions && <div className=\"flex items-center gap-2 ml-auto\">{actions}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAaA,IAAa,KAAiC,EAC5C,gBACA,mBACA,uBAAoB,aACpB,YACA,YACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,qCAAqC,EAAU;WAAlE;EACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,SAAD;IACE,MAAK;IACL,OAAO;IACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;IAC/C,aAAa;IACb,WAAU;IACV,CAAA,CACE;;EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA;EACnE,KAAW,kBAAC,OAAD;GAAK,WAAU;aAAmC;GAAc,CAAA;EACxE"}
|
|
@@ -6,10 +6,10 @@ var r = ({ title: r, description: i, actions: a, children: o, className: s }) =>
|
|
|
6
6
|
children: [/* @__PURE__ */ n("div", {
|
|
7
7
|
className: "flex items-start justify-between gap-4",
|
|
8
8
|
children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("h1", {
|
|
9
|
-
className: "text-2xl font-semibold text-
|
|
9
|
+
className: "text-2xl font-semibold text-text-primary",
|
|
10
10
|
children: r
|
|
11
11
|
}), i && /* @__PURE__ */ t("p", {
|
|
12
|
-
className: "mt-1 text-sm text-
|
|
12
|
+
className: "mt-1 text-sm text-text-secondary",
|
|
13
13
|
children: i
|
|
14
14
|
})] }), a && /* @__PURE__ */ t("div", {
|
|
15
15
|
className: "flex items-center gap-2 shrink-0",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/housingvista/components/PageLayout.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/helpers';\n\ninterface PageLayoutProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({ title, description, actions, children, className }) => {\n return (\n <div className={cn('flex flex-col gap-6 p-6', className)}>\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold text-
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/housingvista/components/PageLayout.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/helpers';\n\ninterface PageLayoutProps {\n title: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({ title, description, actions, children, className }) => {\n return (\n <div className={cn('flex flex-col gap-6 p-6', className)}>\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-2 shrink-0\">{actions}</div>}\n </div>\n {children}\n </div>\n );\n};\n"],"mappings":";;;AAWA,IAAa,KAAmC,EAAE,UAAO,gBAAa,YAAS,aAAU,mBAErF,kBAAC,OAAD;CAAK,WAAW,EAAG,2BAA2B,EAAU;WAAxD,CACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAA4C;GAAW,CAAA,EACpE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAAoC;GAAgB,CAAA,CAC7E,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAAoC;GAAc,CAAA,CACzE;KACL,EACG"}
|
|
@@ -19,7 +19,7 @@ var f = {
|
|
|
19
19
|
}, p = ({ id: p, title: m, price: h, priceType: g, pricePeriod: _, location: v, bedrooms: y, bathrooms: b, area: x, imageUrl: S, status: C, type: w, onClick: T, className: E }) => {
|
|
20
20
|
let [D, O] = i(!1), k = g === "rent" ? `${t(h)}${_ ? `/${_}` : "/mo"}` : t(h), A = f[C.toLowerCase()] ?? "default";
|
|
21
21
|
return /* @__PURE__ */ d("div", {
|
|
22
|
-
className: e("group overflow-hidden rounded-lg border border-border bg-
|
|
22
|
+
className: e("group overflow-hidden rounded-lg border border-border-subtle bg-bg-surface shadow-sm transition-shadow hover:shadow-md", T && "cursor-pointer", E),
|
|
23
23
|
onClick: T,
|
|
24
24
|
children: [/* @__PURE__ */ d("div", {
|
|
25
25
|
className: "relative aspect-[16/10] overflow-hidden",
|
|
@@ -27,10 +27,10 @@ var f = {
|
|
|
27
27
|
S ? /* @__PURE__ */ u("img", {
|
|
28
28
|
src: S,
|
|
29
29
|
alt: m,
|
|
30
|
-
className: "h-full w-full object-cover transition-transform duration-300
|
|
30
|
+
className: "h-full w-full object-cover transition-transform duration-300"
|
|
31
31
|
}) : /* @__PURE__ */ u("div", {
|
|
32
32
|
className: "flex h-full w-full items-center justify-center bg-gradient-to-br from-muted to-muted/60",
|
|
33
|
-
children: /* @__PURE__ */ u(l, { className: "h-10 w-10 text-
|
|
33
|
+
children: /* @__PURE__ */ u(l, { className: "h-10 w-10 text-text-secondary/40" })
|
|
34
34
|
}),
|
|
35
35
|
/* @__PURE__ */ u("div", {
|
|
36
36
|
className: "absolute left-3 top-3",
|
|
@@ -44,14 +44,14 @@ var f = {
|
|
|
44
44
|
onClick: (e) => {
|
|
45
45
|
e.stopPropagation(), O((e) => !e);
|
|
46
46
|
},
|
|
47
|
-
className: e("absolute right-3 top-3 rounded-full bg-
|
|
47
|
+
className: e("absolute right-3 top-3 rounded-full bg-bg-surface/80 p-1.5 backdrop-blur-sm transition-colors hover:bg-bg-surface", D ? "text-red-500" : "text-text-secondary"),
|
|
48
48
|
"aria-label": D ? "Remove from favorites" : "Add to favorites",
|
|
49
49
|
children: /* @__PURE__ */ u(s, { className: e("h-4 w-4", D && "fill-current") })
|
|
50
50
|
}),
|
|
51
51
|
/* @__PURE__ */ u("div", {
|
|
52
52
|
className: "absolute bottom-3 left-3",
|
|
53
53
|
children: /* @__PURE__ */ u("span", {
|
|
54
|
-
className: "rounded-md bg-
|
|
54
|
+
className: "rounded-md bg-bg-surface/80 px-2 py-1 text-xs font-medium text-text-primary backdrop-blur-sm",
|
|
55
55
|
children: w
|
|
56
56
|
})
|
|
57
57
|
})
|
|
@@ -62,29 +62,29 @@ var f = {
|
|
|
62
62
|
/* @__PURE__ */ d("div", {
|
|
63
63
|
className: "flex items-baseline justify-between gap-2",
|
|
64
64
|
children: [/* @__PURE__ */ u("span", {
|
|
65
|
-
className: "text-lg font-bold text-
|
|
65
|
+
className: "text-lg font-bold text-text-primary",
|
|
66
66
|
children: k
|
|
67
67
|
}), g === "sale" && /* @__PURE__ */ u("span", {
|
|
68
|
-
className: "text-xs font-medium text-
|
|
68
|
+
className: "text-xs font-medium text-text-secondary",
|
|
69
69
|
children: "For Sale"
|
|
70
70
|
})]
|
|
71
71
|
}),
|
|
72
72
|
/* @__PURE__ */ u("h3", {
|
|
73
|
-
className: "mt-1 truncate text-sm font-medium text-
|
|
73
|
+
className: "mt-1 truncate text-sm font-medium text-text-primary",
|
|
74
74
|
children: m
|
|
75
75
|
}),
|
|
76
76
|
/* @__PURE__ */ d("div", {
|
|
77
|
-
className: "mt-1.5 flex items-center gap-1 text-
|
|
77
|
+
className: "mt-1.5 flex items-center gap-1 text-text-secondary",
|
|
78
78
|
children: [/* @__PURE__ */ u(c, { className: "h-3.5 w-3.5 shrink-0" }), /* @__PURE__ */ u("span", {
|
|
79
79
|
className: "truncate text-xs",
|
|
80
80
|
children: v
|
|
81
81
|
})]
|
|
82
82
|
}),
|
|
83
83
|
/* @__PURE__ */ d("div", {
|
|
84
|
-
className: "mt-3 flex items-center gap-3 border-t border-border pt-3",
|
|
84
|
+
className: "mt-3 flex items-center gap-3 border-t border-border-subtle pt-3",
|
|
85
85
|
children: [
|
|
86
86
|
y != null && /* @__PURE__ */ d("div", {
|
|
87
|
-
className: "flex items-center gap-1 text-xs text-
|
|
87
|
+
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
88
88
|
children: [/* @__PURE__ */ u(o, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ d("span", { children: [
|
|
89
89
|
y,
|
|
90
90
|
" ",
|
|
@@ -92,7 +92,7 @@ var f = {
|
|
|
92
92
|
] })]
|
|
93
93
|
}),
|
|
94
94
|
b != null && /* @__PURE__ */ d("div", {
|
|
95
|
-
className: "flex items-center gap-1 text-xs text-
|
|
95
|
+
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
96
96
|
children: [/* @__PURE__ */ u(a, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ d("span", { children: [
|
|
97
97
|
b,
|
|
98
98
|
" ",
|
|
@@ -100,7 +100,7 @@ var f = {
|
|
|
100
100
|
] })]
|
|
101
101
|
}),
|
|
102
102
|
/* @__PURE__ */ d("div", {
|
|
103
|
-
className: "flex items-center gap-1 text-xs text-
|
|
103
|
+
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
104
104
|
children: [/* @__PURE__ */ u(l, { className: "h-3.5 w-3.5" }), /* @__PURE__ */ d("span", { children: [n(x), " sq ft"] })]
|
|
105
105
|
})
|
|
106
106
|
]
|