@burdenoff/microfe-housingvista 2026.608.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 +83 -43
- 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/hooks/index.js +120 -110
- package/dist/housingvista/hooks/index.js.map +1 -1
- package/dist/housingvista/hooks/useServerPagination.js +23 -0
- package/dist/housingvista/hooks/useServerPagination.js.map +1 -0
- 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 +112 -103
- 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 +144 -135
- 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 +110 -101
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +55 -46
- 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":"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"}
|
|
@@ -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"}
|
|
@@ -3,68 +3,68 @@ import { useCallback as t, useMemo as n, useState as r } from "react";
|
|
|
3
3
|
import { ChevronDown as i, ChevronLeft as a, ChevronRight as o, ChevronUp as s, ChevronsUpDown as c } from "lucide-react";
|
|
4
4
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
5
|
//#region src/housingvista/components/DataTable.tsx
|
|
6
|
-
function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h = "No data available", className: g, pageSize: _ = 10, selectable: v = !1, selectedKeys: y, onSelectionChange: b }) {
|
|
7
|
-
let [
|
|
8
|
-
|
|
9
|
-
}, [
|
|
10
|
-
let n = e[
|
|
6
|
+
function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h = "No data available", className: g, pageSize: _ = 10, selectable: v = !1, selectedKeys: y, onSelectionChange: b, serverPagination: x }) {
|
|
7
|
+
let [S, C] = r(null), [w, T] = r(null), [E, D] = r(0), O = t((e) => {
|
|
8
|
+
S === e ? w === "asc" ? T("desc") : w === "desc" ? (C(null), T(null)) : T("asc") : (C(e), T("asc")), D(0);
|
|
9
|
+
}, [S, w]), k = n(() => !S || !w ? f : [...f].sort((e, t) => {
|
|
10
|
+
let n = e[S], r = t[S];
|
|
11
11
|
if (n == null && r == null) return 0;
|
|
12
12
|
if (n == null) return 1;
|
|
13
13
|
if (r == null) return -1;
|
|
14
14
|
let i = typeof n == "number" && typeof r == "number" ? n - r : String(n).localeCompare(String(r));
|
|
15
|
-
return
|
|
15
|
+
return w === "asc" ? i : -i;
|
|
16
16
|
}), [
|
|
17
17
|
f,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
]),
|
|
18
|
+
S,
|
|
19
|
+
w
|
|
20
|
+
]), A = x?.pageSize ?? _, j = Math.max(1, Math.ceil(k.length / A)), M = x ? k : k.slice(E * A, (E + 1) * A), N = v && y ? M.every((e) => y.has(String(e[p]))) : !1, P = () => {
|
|
21
21
|
if (!b || !y) return;
|
|
22
22
|
let e = new Set(y);
|
|
23
|
-
|
|
24
|
-
},
|
|
23
|
+
N ? M.forEach((t) => e.delete(String(t[p]))) : M.forEach((t) => e.add(String(t[p]))), b(e);
|
|
24
|
+
}, F = (e) => {
|
|
25
25
|
if (!b || !y) return;
|
|
26
26
|
let t = String(e[p]), n = new Set(y);
|
|
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
|
-
checked:
|
|
48
|
-
onChange:
|
|
49
|
-
className: "h-4 w-4 rounded border-border"
|
|
47
|
+
checked: N && M.length > 0,
|
|
48
|
+
onChange: P,
|
|
49
|
+
className: "h-4 w-4 rounded border-border-subtle"
|
|
50
50
|
})
|
|
51
51
|
}), d.map((t) => {
|
|
52
|
-
let n = t.sortable !== !1, r =
|
|
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-
|
|
55
|
-
onClick: n ? () =>
|
|
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
|
+
onClick: n ? () => O(t.key) : void 0,
|
|
56
56
|
children: /* @__PURE__ */ u("span", {
|
|
57
57
|
className: "inline-flex items-center gap-1",
|
|
58
|
-
children: [t.header, n && (r ? l(
|
|
58
|
+
children: [t.header, n && (r ? l(w === "asc" ? s : i, { className: "h-3 w-3" }) : /* @__PURE__ */ l(c, { className: "h-3 w-3 opacity-30" }))]
|
|
59
59
|
})
|
|
60
60
|
}, t.key);
|
|
61
61
|
})]
|
|
62
62
|
}) }), /* @__PURE__ */ l("tbody", {
|
|
63
|
-
className: "divide-y divide-border bg-
|
|
64
|
-
children:
|
|
63
|
+
className: "divide-y divide-border bg-bg-surface",
|
|
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",
|
|
@@ -72,52 +72,92 @@ function d({ columns: d, data: f, keyField: p, onRowClick: m, emptyMessage: h =
|
|
|
72
72
|
children: /* @__PURE__ */ l("input", {
|
|
73
73
|
type: "checkbox",
|
|
74
74
|
checked: r ?? !1,
|
|
75
|
-
onChange: () =>
|
|
76
|
-
className: "h-4 w-4 rounded border-border"
|
|
75
|
+
onChange: () => F(t),
|
|
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);
|
|
83
83
|
})
|
|
84
84
|
})]
|
|
85
85
|
})
|
|
86
|
-
}),
|
|
86
|
+
}), x ? /* @__PURE__ */ u("div", {
|
|
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
|
+
children: [/* @__PURE__ */ u("span", {
|
|
89
|
+
className: "text-text-secondary",
|
|
90
|
+
children: ["Page ", x.page]
|
|
91
|
+
}), /* @__PURE__ */ u("div", {
|
|
92
|
+
className: "flex flex-wrap items-center gap-2",
|
|
93
|
+
children: [
|
|
94
|
+
x.onPageSizeChange ? /* @__PURE__ */ l("select", {
|
|
95
|
+
value: x.pageSize,
|
|
96
|
+
onChange: (e) => x.onPageSizeChange?.(Number(e.target.value)),
|
|
97
|
+
disabled: x.loading,
|
|
98
|
+
className: "h-8 rounded-md border border-border-subtle bg-bg-surface px-2 text-sm text-text-primary disabled:opacity-50",
|
|
99
|
+
"aria-label": "Rows per page",
|
|
100
|
+
children: [
|
|
101
|
+
10,
|
|
102
|
+
25,
|
|
103
|
+
50,
|
|
104
|
+
100
|
|
105
|
+
].map((e) => /* @__PURE__ */ u("option", {
|
|
106
|
+
value: e,
|
|
107
|
+
children: [e, " / page"]
|
|
108
|
+
}, e))
|
|
109
|
+
}) : null,
|
|
110
|
+
/* @__PURE__ */ u("button", {
|
|
111
|
+
type: "button",
|
|
112
|
+
onClick: () => x.onPageChange(x.page - 1),
|
|
113
|
+
disabled: x.loading || x.page <= 1,
|
|
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
|
+
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Previous"]
|
|
116
|
+
}),
|
|
117
|
+
/* @__PURE__ */ u("button", {
|
|
118
|
+
type: "button",
|
|
119
|
+
onClick: () => x.onPageChange(x.page + 1),
|
|
120
|
+
disabled: x.loading || !(x.hasNextPage ?? k.length >= x.pageSize),
|
|
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
|
+
children: ["Next", /* @__PURE__ */ l(o, { className: "h-4 w-4" })]
|
|
123
|
+
})
|
|
124
|
+
]
|
|
125
|
+
})]
|
|
126
|
+
}) : k.length > _ ? /* @__PURE__ */ u("div", {
|
|
87
127
|
className: "flex items-center justify-between text-sm",
|
|
88
128
|
children: [/* @__PURE__ */ u("span", {
|
|
89
|
-
className: "text-
|
|
129
|
+
className: "text-text-secondary",
|
|
90
130
|
children: [
|
|
91
131
|
"Showing ",
|
|
92
|
-
|
|
132
|
+
E * _ + 1,
|
|
93
133
|
"-",
|
|
94
|
-
Math.min((
|
|
134
|
+
Math.min((E + 1) * _, k.length),
|
|
95
135
|
" of ",
|
|
96
|
-
|
|
136
|
+
k.length
|
|
97
137
|
]
|
|
98
138
|
}), /* @__PURE__ */ u("div", {
|
|
99
139
|
className: "flex items-center gap-1",
|
|
100
140
|
children: [
|
|
101
141
|
/* @__PURE__ */ l("button", {
|
|
102
|
-
onClick: () =>
|
|
103
|
-
disabled:
|
|
104
|
-
className: "rounded-md border border-border p-1.5 text-
|
|
142
|
+
onClick: () => D((e) => Math.max(0, e - 1)),
|
|
143
|
+
disabled: E === 0,
|
|
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",
|
|
105
145
|
children: /* @__PURE__ */ l(a, { className: "h-4 w-4" })
|
|
106
146
|
}),
|
|
107
|
-
Array.from({ length:
|
|
108
|
-
onClick: () =>
|
|
109
|
-
className: e("h-8 w-8 rounded-md text-xs font-medium transition-colors", n ===
|
|
147
|
+
Array.from({ length: j }).map((t, n) => /* @__PURE__ */ l("button", {
|
|
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-text-secondary hover:bg-bg-sunken"),
|
|
110
150
|
children: n + 1
|
|
111
151
|
}, n)),
|
|
112
152
|
/* @__PURE__ */ l("button", {
|
|
113
|
-
onClick: () =>
|
|
114
|
-
disabled:
|
|
115
|
-
className: "rounded-md border border-border p-1.5 text-
|
|
153
|
+
onClick: () => D((e) => Math.min(j - 1, e + 1)),
|
|
154
|
+
disabled: E >= j - 1,
|
|
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",
|
|
116
156
|
children: /* @__PURE__ */ l(o, { className: "h-4 w-4" })
|
|
117
157
|
})
|
|
118
158
|
]
|
|
119
159
|
})]
|
|
120
|
-
})]
|
|
160
|
+
}) : null]
|
|
121
161
|
});
|
|
122
162
|
}
|
|
123
163
|
//#endregion
|
|
@@ -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}\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}: 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 totalPages = Math.max(1, Math.ceil(sorted.length / pageSize));\n const paged = sorted.slice(page * pageSize, (page + 1) * pageSize);\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 {/* Pagination */}\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 )}\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":"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"}
|
|
@@ -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"}
|