diff --git a/app/dashboard/finance/budget/page.tsx b/app/dashboard/finance/budget/page.tsx
new file mode 100644
index 0000000..21b7833
--- /dev/null
+++ b/app/dashboard/finance/budget/page.tsx
@@ -0,0 +1,18 @@
+"use client"
+
+import BudgetPortal from "@/components/dashboard/finance/budget";
+
+
+
+
+export default function BudgetPage() {
+ return (
+
+
+
{/* Bars */}
diff --git a/utils/progressBarRow.tsx b/components/charts/progressBarRow.tsx
similarity index 92%
rename from utils/progressBarRow.tsx
rename to components/charts/progressBarRow.tsx
index d01bc05..edb12ee 100644
--- a/utils/progressBarRow.tsx
+++ b/components/charts/progressBarRow.tsx
@@ -1,5 +1,5 @@
-import { ProgressBarProps } from "@/constants/types";
+import { ProgressBarProps } from "@/types/types";
export function ProgressBarRow({ label, value, maxValue }: ProgressBarProps) {
const percentage = (value / maxValue) * 100;
diff --git a/utils/statusProgressRow.tsx b/components/charts/statusProgressRow.tsx
similarity index 92%
rename from utils/statusProgressRow.tsx
rename to components/charts/statusProgressRow.tsx
index 79f92bb..4652521 100644
--- a/utils/statusProgressRow.tsx
+++ b/components/charts/statusProgressRow.tsx
@@ -1,5 +1,5 @@
-import { StatusProgressProps } from "@/constants/types";
+import { StatusProgressProps } from "@/types/types";
export function StatusProgressRow({ label, value, total, barColor = "bg-[#17cbb5]" }: StatusProgressProps) {
const percentage = (value / total) * 100;
diff --git a/utils/button.tsx b/components/common/button.tsx
similarity index 79%
rename from utils/button.tsx
rename to components/common/button.tsx
index dd22ded..2b4f548 100644
--- a/utils/button.tsx
+++ b/components/common/button.tsx
@@ -1,4 +1,4 @@
-import { ButtonProps } from "@/constants/types";
+import { ButtonProps } from "@/types/types";
export default function Button({
diff --git a/utils/cardHeader.tsx b/components/common/cardHeader.tsx
similarity index 100%
rename from utils/cardHeader.tsx
rename to components/common/cardHeader.tsx
diff --git a/utils/cardWrapper.tsx b/components/common/cardWrapper.tsx
similarity index 100%
rename from utils/cardWrapper.tsx
rename to components/common/cardWrapper.tsx
diff --git a/utils/dashStatCard.tsx b/components/common/dashStatCard.tsx
similarity index 97%
rename from utils/dashStatCard.tsx
rename to components/common/dashStatCard.tsx
index 7c42d35..9c48f61 100644
--- a/utils/dashStatCard.tsx
+++ b/components/common/dashStatCard.tsx
@@ -1,4 +1,4 @@
-import { StatCardProps } from "@/constants/types";
+import { StatCardProps } from "@/types/types";
import { colorMap } from "@/constants/constant";
export default function StatCard({
diff --git a/utils/dataTable.tsx b/components/common/dataTable.tsx
similarity index 100%
rename from utils/dataTable.tsx
rename to components/common/dataTable.tsx
diff --git a/utils/formInput.tsx b/components/common/formInput.tsx
similarity index 90%
rename from utils/formInput.tsx
rename to components/common/formInput.tsx
index 1e52d19..11b6d15 100644
--- a/utils/formInput.tsx
+++ b/components/common/formInput.tsx
@@ -1,5 +1,5 @@
-import { FormProps } from "@/constants/types";
+import { FormProps } from "@/types/types";
export default function FormInput({
label,
value,
diff --git a/utils/infoBanner.tsx b/components/common/infoBanner.tsx
similarity index 90%
rename from utils/infoBanner.tsx
rename to components/common/infoBanner.tsx
index 64e4fa7..8450854 100644
--- a/utils/infoBanner.tsx
+++ b/components/common/infoBanner.tsx
@@ -1,6 +1,6 @@
-import {InfoBannerProps} from "@/constants/types";
+import {InfoBannerProps} from "@/types/types";
export default function InfoBanner({
boldText,
diff --git a/utils/roundedFilters.tsx b/components/common/roundedFilters.tsx
similarity index 96%
rename from utils/roundedFilters.tsx
rename to components/common/roundedFilters.tsx
index 1e7d1d2..5d67f4a 100644
--- a/utils/roundedFilters.tsx
+++ b/components/common/roundedFilters.tsx
@@ -1,4 +1,4 @@
-import { FilterTabsProps } from "@/constants/types";
+import { FilterTabsProps } from "@/types/types";
export default function FilterTabs({
options = [],
diff --git a/utils/tabs.tsx b/components/common/tabs.tsx
similarity index 92%
rename from utils/tabs.tsx
rename to components/common/tabs.tsx
index 112bdd1..4a3ab4c 100644
--- a/utils/tabs.tsx
+++ b/components/common/tabs.tsx
@@ -1,4 +1,4 @@
-import { NavigationTabsProps } from "@/constants/types";
+import { NavigationTabsProps } from "@/types/types";
diff --git a/components/dashboard/finance/budget.tsx b/components/dashboard/finance/budget.tsx
new file mode 100644
index 0000000..6a64f51
--- /dev/null
+++ b/components/dashboard/finance/budget.tsx
@@ -0,0 +1,201 @@
+import {
+ Database,
+ FileText,
+ Activity,
+ AlertTriangle,
+ Plus
+} from "lucide-react";
+
+import InfoBanner from "@/components/common/infoBanner";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import { Card } from '@/components/common/cardWrapper';
+import { CardHeader } from '@/components/common/cardHeader';
+import { approvalQueueData, categoryData } from "@/constants/constant";
+
+
+
+export default function BudgetPortal() {
+ return (
+
+ {/* --- HEADER SECTION WITH BUTTONS --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ FINANCE
+ •
+ O&M BUDGET
+
+
+
+ O&M budget management
+
+
+
+ Multi-dimensional budgets by site, department and asset — planned vs actual, variance, approvals and overrun alerts.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Annual budget */}
+
+
+ {/* Spent YTD */}
+
+
+ {/* Remaining */}
+
+
+ {/* Overrun lines */}
+
+
+
+ {/* --- BUDGET DETAILS & APPROVAL QUEUE SECTION --- */}
+
+ {/* Planned vs Actual Table (Left 2 Columns) */}
+
+
+
+
+
+
+
+ | Category |
+ Type |
+ Planned |
+ Actual |
+ Variance |
+ Utilization |
+
+
+
+ {categoryData.map((row, idx) => (
+
+ |
+ {row.category}
+ |
+
+
+ {row.type}
+
+ |
+
+ {row.planned}
+ |
+
+ {row.actual}
+ |
+
+ {row.variance}
+ |
+
+
+
+ {row.utilization}%
+
+ |
+
+ ))}
+
+
+
+
+
+ {/* Approval Queue Panel (Right 1 Column) */}
+
+
+
+
+ {approvalQueueData.map((item) => (
+
+
+
+ {item.title}
+
+
+ {item.id} · {item.meta}
+
+
+
+ {item.status === "pending" ? (
+
+ ) : (
+
+
+ COMPLETED
+
+ )}
+
+ ))}
+
+
+
+
+ {/* Info Banner */}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/finance/costInvoice.tsx b/components/dashboard/finance/costInvoice.tsx
new file mode 100644
index 0000000..b1024e9
--- /dev/null
+++ b/components/dashboard/finance/costInvoice.tsx
@@ -0,0 +1,298 @@
+import {
+ FileText,
+ Database,
+ AlertTriangle,
+ Activity,
+ Sparkles,
+ Plus
+} from "lucide-react";
+
+import InfoBanner from "@/components/common/infoBanner";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import Table from "@/components/common/dataTable";
+
+const StatusBadge = ({
+ text,
+ color,
+}: {
+ text: string;
+ color: string;
+}) => (
+
+
+ {text}
+
+);
+
+const ActionButton = ({ text }: { text: string }) => (
+
+);
+
+const headers = [
+ "Invoice",
+ "Client",
+ "Period",
+ "Amount",
+ "Raised",
+ "Due",
+ "Status",
+ "",
+];
+
+const rows = [
+ [
+
INV-9040,
+
Apple One Corp,
+ "Jun 2026",
+
₹12.4 L,
+
Jun 5, 2026,
+
Jul 5, 2026,
+
,
+
—,
+ ],
+
+ [
+
INV-9041,
+
Novotel F&B,
+ "Jun 2026",
+
₹8.6 L,
+
Jun 9, 2026,
+
Jul 9, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9042,
+
SRM Estates,
+ "Jun 2026",
+
₹4.3 L,
+
Jun 13, 2026,
+
Jul 13, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9043,
+
Local Mart,
+ "Jun 2026",
+
₹21.0 L,
+
Jun 17, 2026,
+
Jul 17, 2026,
+
,
+
—,
+ ],
+
+ [
+
INV-9044,
+
Regus Spaces,
+ "Jun 2026",
+
₹6.8 L,
+
Jun 21, 2026,
+
Jul 21, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9105,
+
Apple One Corp,
+ "Jun 2026",
+
₹12.4 L,
+
Jun 5, 2026,
+
Jul 5, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9106,
+
Novotel F&B,
+ "Jun 2026",
+
₹8.6 L,
+
Jun 9, 2026,
+
Jul 9, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9107,
+
SRM Estates,
+ "Jun 2026",
+
₹4.3 L,
+
Jun 13, 2026,
+
Jul 13, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9108,
+
Local Mart,
+ "Jun 2026",
+
₹21.0 L,
+
Jun 17, 2026,
+
Jul 17, 2026,
+
,
+
—,
+ ],
+ [
+
INV-9107,
+
SRM Estates,
+ "Jun 2026",
+
₹4.3 L,
+
Jun 13, 2026,
+
Jul 13, 2026,
+
,
+
,
+ ],
+
+ [
+
INV-9108,
+
Local Mart,
+ "Jun 2026",
+
₹21.0 L,
+
Jun 17, 2026,
+
Jul 17, 2026,
+
,
+
—,
+ ],
+];
+export default function CostInvoicePortal() {
+ return (
+
+ {/* --- HEADER SECTION WITH BUTTONS --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ FINANCE
+ •
+ COSTING & INVOICING
+
+
+
+ Client costing & auto-invoicing
+
+
+
+ Client-wise costing setup, automatic project approval and invoice generation — fully native, no external dependency.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Billed */}
+
+
+ {/* Outstanding */}
+
+
+ {/* Overdue */}
+
+
+ {/* Collection rate */}
+
+
+
+
+
+
+ {/* Info Banner */}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/insight/reports.tsx b/components/dashboard/insight/reports.tsx
new file mode 100644
index 0000000..062ab80
--- /dev/null
+++ b/components/dashboard/insight/reports.tsx
@@ -0,0 +1,182 @@
+import { useState } from 'react';
+import { Plus, Download } from 'lucide-react';
+import Button from "@/components/common/button";
+import NavigationTabs from '@/components/common/tabs';
+import { reportFilters, reporttabs, Reqeusttabs, statusFilters } from '@/constants/constant';
+import FilterTabs from '@/components/common/roundedFilters';
+import Table from '@/components/common/dataTable';
+
+
+const StatusBadge = ({
+ text,
+ color,
+}: {
+ text: string;
+ color: string;
+}) => (
+
+
+ {text}
+
+);
+
+const headers = [
+ "Code",
+ "Equipment",
+ "Group",
+ "Block · Floor",
+ "Service Provider",
+ "Manufacturer",
+ "Model",
+];
+
+const rows = [
+ [
+ APP-1100,
+ Cooling Tower,
+ "Electrical",
+ "Block 1 · 2",
+ "Blue Star",
+ "Kirloskar",
+ M-550,
+ ],
+
+ [
+ APP-1103,
+ Air Handling Unit,
+ "Plumbing",
+ "Tower A · 1",
+ "Blue Star",
+ "Voltas",
+ M-550,
+ ],
+
+ [
+ APP-1106,
+ VRV Outdoor,
+ "Electrical",
+ "Tower A · G",
+ "Voltas",
+ "Daikin",
+ M-320,
+ ],
+
+ [
+ APP-1109,
+ VRV Outdoor,
+ "HVAC",
+ "Tower A · 1",
+ "Voltas",
+ "Blue Star",
+ M-320,
+ ],
+
+ [
+ APP-1112,
+ Air Handling Unit,
+ "HVAC",
+ "Tower A · G",
+ "In-house",
+ "Voltas",
+ M-550,
+ ],
+
+ [
+ APP-1115,
+ Air Handling Unit,
+ "Electrical",
+ "Tower A · 2",
+ "Voltas",
+ "Daikin",
+ M-XR9,
+ ],
+
+ [
+ APP-1118,
+ Chiller,
+ "Electrical",
+ "Block 1 · 1",
+ "In-house",
+ "Blue Star",
+ M-XR9,
+ ],
+
+ [
+ APP-1121,
+ Cooling Tower,
+ "Plumbing",
+ "Tower A · 1",
+ "Blue Star",
+ "Daikin",
+ M-550,
+ ],
+];
+
+export default function ReportPortal() {
+ const [activeTab, setActiveTab] = useState('Equipment');
+ const [activeFilter, setActiveFilter] = useState('Site All');
+
+ const handleDownload = () => {
+ // Add your export/download logic here
+ console.log("Downloading report...");
+ };
+
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ INSIGHT
+ •
+ REPORTS
+
+
+ Reports & MMR
+
+
+ A read-only layer over every module — filter, visualise, and export. Never on the write path.
+
+
+
+
+ {/* --- NAVIGATION TABS & TOP ACTION BUTTONS --- */}
+
+ {/* Navigation Tabs */}
+
+
+
+ {/* --- STATUS PILL FILTERS & DOWNLOAD BUTTON --- */}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/energy.tsx b/components/dashboard/operations/energy.tsx
similarity index 98%
rename from components/dashboard/energy.tsx
rename to components/dashboard/operations/energy.tsx
index c38f502..09d02a0 100644
--- a/components/dashboard/energy.tsx
+++ b/components/dashboard/operations/energy.tsx
@@ -6,8 +6,8 @@ import {
LayoutGrid,
Plus
} from "lucide-react";
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
diff --git a/components/dashboard/equipment.tsx b/components/dashboard/operations/equipment.tsx
similarity index 74%
rename from components/dashboard/equipment.tsx
rename to components/dashboard/operations/equipment.tsx
index 8ed2d71..31ce795 100644
--- a/components/dashboard/equipment.tsx
+++ b/components/dashboard/operations/equipment.tsx
@@ -12,12 +12,13 @@ import {
LayoutGrid,
} from "lucide-react";
-import Table from "@/utils/dataTable";
-import InfoBanner from "@/utils/infoBanner";
-import Button from "@/utils/button";
-import NavigationTabs from "@/utils/tabs";
+import Table from "@/components/common/dataTable";
+import InfoBanner from "@/components/common/infoBanner";
+import Button from "@/components/common/button";
+import NavigationTabs from "@/components/common/tabs";
import { equipmentTabs } from "@/constants/constant";
import { useState } from "react";
+import StatCard from "@/components/common/dashStatCard";
const headers = [
"Code",
@@ -189,64 +190,51 @@ export default function EquipmentPortal() {
className="mb-6"
/>
- {/* --- STAT CARDS (4 CARDS MATCHING SCREENSHOT) --- */}
- {/* Total equipment */}
-
+ {/* Total equipment */}
+
- {/* Critical assets */}
-
+ {/* Critical assets */}
+
- {/* PPM attention */}
-
+ {/* PPM attention */}
+
- {/* On plan */}
-
-
+ {/* On plan */}
+
+
{/* --- ROW 2: SEARCH, FILTERS & ACTION BUTTONS --- */}
diff --git a/components/dashboard/helpDesk.tsx b/components/dashboard/operations/helpDesk.tsx
similarity index 98%
rename from components/dashboard/helpDesk.tsx
rename to components/dashboard/operations/helpDesk.tsx
index e5dc16d..9a2fb7d 100644
--- a/components/dashboard/helpDesk.tsx
+++ b/components/dashboard/operations/helpDesk.tsx
@@ -11,10 +11,10 @@ import {
Pencil,
Plus,
} from 'lucide-react';
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import Table from "@/utils/dataTable";
-import NavigationTabs from '@/utils/tabs';
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import Table from "@/components/common/dataTable";
+import NavigationTabs from '@/components/common/tabs';
import { helpdeskTtabs } from '@/constants/constant';
const StatusBadge = ({
diff --git a/components/dashboard/inventory.tsx b/components/dashboard/operations/inventory.tsx
similarity index 98%
rename from components/dashboard/inventory.tsx
rename to components/dashboard/operations/inventory.tsx
index bb72548..f8c22a1 100644
--- a/components/dashboard/inventory.tsx
+++ b/components/dashboard/operations/inventory.tsx
@@ -6,9 +6,9 @@ import {
LayoutGrid,
Plus
} from "lucide-react";
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import InfoBanner from "@/utils/infoBanner";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import InfoBanner from "@/components/common/infoBanner";
diff --git a/components/dashboard/request.tsx b/components/dashboard/operations/request.tsx
similarity index 96%
rename from components/dashboard/request.tsx
rename to components/dashboard/operations/request.tsx
index 24230fb..4d13498 100644
--- a/components/dashboard/request.tsx
+++ b/components/dashboard/operations/request.tsx
@@ -1,11 +1,11 @@
import { useState } from 'react';
import { Plus } from 'lucide-react';
-import Button from "@/utils/button";
-import LocationTable from '@/utils/dataTable';
-import NavigationTabs from '@/utils/tabs';
+import Button from "@/components/common/button";
+import LocationTable from '@/components/common/dataTable';
+import NavigationTabs from '@/components/common/tabs';
import { Reqeusttabs,statusFilters } from '@/constants/constant';
-import FilterTabs from '@/utils/roundedFilters';
-import Table from '@/utils/dataTable';
+import FilterTabs from '@/components/common/roundedFilters';
+import Table from '@/components/common/dataTable';
const StatusBadge = ({
diff --git a/components/dashboard/vendorService.tsx b/components/dashboard/operations/vendorService.tsx
similarity index 98%
rename from components/dashboard/vendorService.tsx
rename to components/dashboard/operations/vendorService.tsx
index 3fe9087..a5ee5f3 100644
--- a/components/dashboard/vendorService.tsx
+++ b/components/dashboard/operations/vendorService.tsx
@@ -7,9 +7,9 @@ import {
BarChart2,
Plus
} from "lucide-react";
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import InfoBanner from "@/utils/infoBanner";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import InfoBanner from "@/components/common/infoBanner";
export default function VendorServicePortal() {
const vendorData = [
diff --git a/components/dashboard/workpermit.tsx b/components/dashboard/operations/workpermit.tsx
similarity index 98%
rename from components/dashboard/workpermit.tsx
rename to components/dashboard/operations/workpermit.tsx
index f402ea8..2a2bde7 100644
--- a/components/dashboard/workpermit.tsx
+++ b/components/dashboard/operations/workpermit.tsx
@@ -1,13 +1,13 @@
import { useState } from 'react';
import { Plus, ShieldCheck, Clock, Check, AlertTriangle, QrCode, FileText, Eye } from 'lucide-react';
-import Button from "@/utils/button";
+import Button from "@/components/common/button";
import { workPermitFilters } from '@/constants/constant';
-import FilterTabs from '@/utils/roundedFilters';
-import StatCard from '@/utils/dashStatCard';
-import InfoBanner from '@/utils/infoBanner';
+import FilterTabs from '@/components/common/roundedFilters';
+import StatCard from '@/components/common/dashStatCard';
+import InfoBanner from '@/components/common/infoBanner';
export default function WorkPermitPortal() {
- const [activeTab, setActiveTab] = useState
('TFM Requests');
+
const [activeFilter, setActiveFilter] = useState('All');
// Permit Data matching the UI
diff --git a/components/dashboard/activityFeed.tsx b/components/dashboard/overview/activityFeed.tsx
similarity index 94%
rename from components/dashboard/activityFeed.tsx
rename to components/dashboard/overview/activityFeed.tsx
index acf44e4..9beaa1c 100644
--- a/components/dashboard/activityFeed.tsx
+++ b/components/dashboard/overview/activityFeed.tsx
@@ -1,4 +1,4 @@
-import { ActivityFeedProps } from "@/constants/types"
+import { ActivityFeedProps } from "@/types/types"
diff --git a/components/dashboard/buildingOwner.tsx b/components/dashboard/overview/buildingOwner.tsx
similarity index 91%
rename from components/dashboard/buildingOwner.tsx
rename to components/dashboard/overview/buildingOwner.tsx
index 084accc..6225078 100644
--- a/components/dashboard/buildingOwner.tsx
+++ b/components/dashboard/overview/buildingOwner.tsx
@@ -1,14 +1,14 @@
import { Building2, ShieldCheck, Database, Leaf, FileSpreadsheet } from "lucide-react";
-import StatCard from "@/utils/dashStatCard";
+import StatCard from "@/components/common/dashStatCard";
import { energyData } from "@/constants/constant";
-import BarChart from "@/utils/barchart";
-import InfoBanner from "@/utils/infoBanner";
-import Button from "@/utils/button";
-import { ProgressBarRow } from "@/utils/progressBarRow";
+import BarChart from "@/components/charts/barchart";
+import InfoBanner from "@/components/common/infoBanner";
+import Button from "@/components/common/button";
+import { ProgressBarRow } from "@/components/charts/progressBarRow";
// Import your custom Card components
-import { Card } from "@/utils/cardWrapper";
-import { CardHeader } from "@/utils/cardHeader";
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
export default function BuildingOwnerPortal() {
return (
diff --git a/components/dashboard/dashboard.tsx b/components/dashboard/overview/dashboard.tsx
similarity index 95%
rename from components/dashboard/dashboard.tsx
rename to components/dashboard/overview/dashboard.tsx
index 8adb143..3fd303a 100644
--- a/components/dashboard/dashboard.tsx
+++ b/components/dashboard/overview/dashboard.tsx
@@ -1,13 +1,13 @@
import { Check } from 'lucide-react';
-import BarChart from "@/utils/barchart";
-import StatCard from "@/utils/dashStatCard";
-import ActivityFeed from "@/components/dashboard/activityFeed";
+import BarChart from "@/components/charts/barchart";
+import StatCard from "@/components/common/dashStatCard";
+import ActivityFeed from "@/components/dashboard/overview/activityFeed";
import {activities, chartData} from "@/constants/constant"
-import { Card } from '@/utils/cardWrapper';
-import {CardHeader} from '@/utils/cardHeader';
-import {ProgressBarRow }from '@/utils/progressBarRow';
-import {StatusProgressRow} from '@/utils/statusProgressRow';
+import { Card } from '@/components/common/cardWrapper';
+import {CardHeader} from '@/components/common/cardHeader';
+import {ProgressBarRow }from '@/components/charts/progressBarRow';
+import {StatusProgressRow} from '@/components/charts/statusProgressRow';
export default function Dashboard() {
diff --git a/components/dashboard/engagement.tsx b/components/dashboard/overview/engagement.tsx
similarity index 96%
rename from components/dashboard/engagement.tsx
rename to components/dashboard/overview/engagement.tsx
index cf41d98..1169cd5 100644
--- a/components/dashboard/engagement.tsx
+++ b/components/dashboard/overview/engagement.tsx
@@ -8,13 +8,13 @@ import {
} from "lucide-react";
import { SATISFACTION_DRIVERS, TICKETS_DATA } from "@/constants/constant";
-import StatCard from "../../utils/dashStatCard";
-import Button from "@/utils/button";
-import InfoBanner from "@/utils/infoBanner";
+import StatCard from "../../common/dashStatCard";
+import Button from "@/components/common/button";
+import InfoBanner from "@/components/common/infoBanner";
// Import your custom Card components
-import { Card } from "@/utils/cardWrapper";
-import { CardHeader } from "@/utils/cardHeader";
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
export default function EngagementPage() {
return (
diff --git a/components/dashboard/propertyManager.tsx b/components/dashboard/overview/propertyManager.tsx
similarity index 94%
rename from components/dashboard/propertyManager.tsx
rename to components/dashboard/overview/propertyManager.tsx
index 152da84..180d648 100644
--- a/components/dashboard/propertyManager.tsx
+++ b/components/dashboard/overview/propertyManager.tsx
@@ -1,7 +1,7 @@
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import InfoBanner from "@/utils/infoBanner";
-import { ProgressBarRow } from "@/utils/progressBarRow";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import InfoBanner from "@/components/common/infoBanner";
+import { ProgressBarRow } from "@/components/charts/progressBarRow";
import {
FileText,
Wrench,
@@ -12,8 +12,8 @@ import {
} from "lucide-react";
// Import your custom Card components
-import { Card } from "@/utils/cardWrapper";
-import { CardHeader } from "@/utils/cardHeader";
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
export default function PropertyManagerPortal() {
diff --git a/components/dashboard/serviceEngineer.tsx b/components/dashboard/overview/serviceEngineer.tsx
similarity index 97%
rename from components/dashboard/serviceEngineer.tsx
rename to components/dashboard/overview/serviceEngineer.tsx
index 9e92a85..ad7bf4d 100644
--- a/components/dashboard/serviceEngineer.tsx
+++ b/components/dashboard/overview/serviceEngineer.tsx
@@ -1,6 +1,6 @@
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import InfoBanner from "@/utils/infoBanner";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import InfoBanner from "@/components/common/infoBanner";
import {
FileText,
Wrench,
@@ -11,8 +11,8 @@ import {
} from "lucide-react";
// Import your custom Card components
-import { Card } from "@/utils/cardWrapper";
-import { CardHeader } from "@/utils/cardHeader";
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
export default function ServiceEngineerPortal() {
return (
diff --git a/components/dashboard/workplace/meetingRoom.tsx b/components/dashboard/workplace/meetingRoom.tsx
new file mode 100644
index 0000000..68679a3
--- /dev/null
+++ b/components/dashboard/workplace/meetingRoom.tsx
@@ -0,0 +1,179 @@
+import { useState } from 'react';
+import {
+ Calendar,
+ Clock,
+ Activity,
+ Check,
+ Plus,
+ Pencil,
+ Trash2
+} from "lucide-react";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import { roomData, scheduleData } from '@/constants/constant';
+import { Card } from '@/components/common/cardWrapper';
+import { CardHeader } from '@/components/common/cardHeader';
+
+// Your Card Comp
+
+export default function MeetingRoomPortal() {
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ WORKPLACE
+ •
+ MEETING ROOMS
+
+
+ Meeting room booking
+
+
+ Real-time availability, calendar-synced reservations, room services and utilization analytics.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+
+
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Available now */}
+
+
+ {/* In use now */}
+
+
+ {/* Utilization */}
+
+
+ {/* Bookings today */}
+
+
+
+ {/* --- MAIN CONTENT UI (ADDED BELOW STAT CARDS) --- */}
+
+ {/* Room List (Left 2 Columns) */}
+
+ {roomData.map((room) => (
+
+
+ {/* Header info inside room card */}
+
+
+
{room.name}
+
{room.location}
+
+
+
+ {room.status}
+
+
+
+ {/* Feature Tags */}
+
+ {room.tags.map((tag, idx) => (
+
+ {tag}
+
+ ))}
+
+
+
+ {/* Bottom Info & Action Buttons */}
+
+
{room.subtitle}
+
+
+
+
+
+
+
+ ))}
+
+
+ {/* Today's Schedule Timeline (Right 1 Column) */}
+
+
+
+
+ {scheduleData.map((item, idx) => (
+
+ {/* Timeline dot */}
+
+
+ {/* Event Details */}
+
+ {item.room} • {item.title}
+
+
+ {item.time} • {item.status}
+
+
+ ))}
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/visitorManagement.tsx b/components/dashboard/workplace/visitorManagement.tsx
similarity index 97%
rename from components/dashboard/visitorManagement.tsx
rename to components/dashboard/workplace/visitorManagement.tsx
index 93f97c8..0f474cb 100644
--- a/components/dashboard/visitorManagement.tsx
+++ b/components/dashboard/workplace/visitorManagement.tsx
@@ -7,12 +7,12 @@ import {
BarChart2,
Plus
} from "lucide-react";
-import Button from "@/utils/button";
-import StatCard from "@/utils/dashStatCard";
-import InfoBanner from "@/utils/infoBanner";
-import FilterTabs from '@/utils/roundedFilters';
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import InfoBanner from "@/components/common/infoBanner";
+import FilterTabs from '@/components/common/roundedFilters';
import { visitorFilters } from '@/constants/constant';
-import Table from '@/utils/dataTable';
+import Table from '@/components/common/dataTable';
export default function VistiorManagementPortal() {
const headers = [
diff --git a/components/dashboard/workplace/workspace.tsx b/components/dashboard/workplace/workspace.tsx
new file mode 100644
index 0000000..e4fdf39
--- /dev/null
+++ b/components/dashboard/workplace/workspace.tsx
@@ -0,0 +1,218 @@
+import {
+ Activity,
+ Monitor,
+ Clock,
+ ShieldCheck,
+ Pencil,
+ Trash2,
+ Sparkles,
+ Plus
+} from "lucide-react";
+
+import InfoBanner from "@/components/common/infoBanner";
+import Button from "@/components/common/button";
+import NavigationTabs from "@/components/common/tabs";
+
+import { useState } from "react";
+import { workspaceTabs, zoneUtilizationData } from "@/constants/constant";
+import StatCard from "@/components/common/dashStatCard";
+import { Card } from '@/components/common/cardWrapper';
+import { CardHeader } from '@/components/common/cardHeader';
+
+export default function WorkSpacePortal() {
+ const [activeTab, setActiveTab] = useState("Desk Booking");
+
+ // Grid state matching the UI: 4 rows x 12 columns (48 seats)
+ // Types: 'occupied' (red/purple outline), 'free' (teal), 'reserved' (amber)
+ const deskGrid = Array.from({ length: 48 }).map((_, index) => {
+ if (index === 42) return "reserved"; // 1 Reserved desk
+ if (index >= 36) return "free"; // Free desks on the bottom row
+ return "occupied"; // Occupied desks
+ });
+
+ return (
+
+ {/* --- HEADER SECTION WITH BUTTONS --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ WORKPLACE
+ •
+ WORKSPACE
+
+
+
+ Workspace management
+
+
+
+ Desk booking, live floor plans and shift timetable — unified, all reading the Block → Floor → Zone master.
+
+
+
+ {/* --- ACTION BUTTONS --- */}
+
+
+
+
+
+
+
+
+
+ {/* Navigation Tabs */}
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Total desks */}
+
+
+ {/* Available */}
+
+
+ {/* Occupied */}
+
+
+ {/* Utilization */}
+
+
+
+ {/* --- OCCUPANCY & ZONE UTILIZATION SECTION --- */}
+
+ {/* Live Occupancy Grid (Left 2 Columns) */}
+
+
+
+ {/* Desk Layout Grid */}
+
+ {deskGrid.map((type, i) => (
+
+ ))}
+
+
+ {/* Map Legend */}
+
+
+
+ Free
+
+
+
+ Reserved
+
+
+
+ Occupied
+
+
+
+
+ {/* Zone Utilization Bars (Right 1 Column) */}
+
+
+
+
+ {zoneUtilizationData.map((zone, idx) => {
+ const percentage = Math.round((zone.current / zone.max) * 100);
+ return (
+
+
+ {zone.name}
+
+
+ {/* Progress Bar Container */}
+
+
+ {/* Value & Actions */}
+
+
{zone.current}/{zone.max}
+
+
+
+
+ );
+ })}
+
+
+
+
+ {/* Info Banner */}
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/utils/navbar.tsx b/components/layouts/navbar.tsx
similarity index 100%
rename from utils/navbar.tsx
rename to components/layouts/navbar.tsx
diff --git a/utils/sideBarItem.tsx b/components/layouts/sideBarItem.tsx
similarity index 63%
rename from utils/sideBarItem.tsx
rename to components/layouts/sideBarItem.tsx
index f142b20..96c09ab 100644
--- a/utils/sideBarItem.tsx
+++ b/components/layouts/sideBarItem.tsx
@@ -3,8 +3,8 @@
import Link from "next/link";
import { useState } from "react";
import { ChevronDown } from "lucide-react";
-import {Props} from "@/constants/types";
-import Button from "@/utils/button";
+import {Props} from "@/types/types";
+import Button from "@/components/common/button";
export default function SidebarItem({ item }: Props) {
const [open, setOpen] = useState(item.title === "Overview");
@@ -13,16 +13,17 @@ export default function SidebarItem({ item }: Props) {