diff --git a/components/layout/project-shell.tsx b/components/layout/project-shell.tsx index 272617f..7c6855e 100644 --- a/components/layout/project-shell.tsx +++ b/components/layout/project-shell.tsx @@ -1,6 +1,5 @@ "use client"; -import Link from "next/link"; import { usePathname } from "next/navigation"; import { ReactNode } from "react"; import { VIBNSidebar } from "./vibn-sidebar"; @@ -61,61 +60,20 @@ export function ProjectShell({
- {/* Left sidebar */} + {/* Left sidebar — includes project tabs */}
- +
- {/* Main column — full width */} -
- - {/* Tab bar — sits at the top, no header above it */} -
- {TABS.map(t => ( - { if (activeTab !== t.id) (e.currentTarget as HTMLElement).style.color = "#6b6560"; }} - onMouseLeave={e => { if (activeTab !== t.id) (e.currentTarget as HTMLElement).style.color = "#a09a90"; }} - > - {t.label} - - ))} -
- - {/* Page content — full width, each page manages its own layout */} -
- {children} -
+ {/* Page content — extends to the very top */} +
+ {children}
diff --git a/components/layout/vibn-sidebar.tsx b/components/layout/vibn-sidebar.tsx index 9372f9e..1f20ff7 100644 --- a/components/layout/vibn-sidebar.tsx +++ b/components/layout/vibn-sidebar.tsx @@ -5,8 +5,16 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; import { signOut, useSession } from "next-auth/react"; +interface TabItem { + id: string; + label: string; + path: string; +} + interface VIBNSidebarProps { workspace: string; + tabs?: TabItem[]; + activeTab?: string; } interface ProjectData { @@ -23,7 +31,7 @@ const COLLAPSED_KEY = "vibn_sidebar_collapsed"; const COLLAPSED_W = 52; const EXPANDED_W = 216; -export function VIBNSidebar({ workspace }: VIBNSidebarProps) { +export function VIBNSidebar({ workspace, tabs, activeTab }: VIBNSidebarProps) { const pathname = usePathname(); const { data: session } = useSession(); @@ -179,34 +187,85 @@ export function VIBNSidebar({ workspace }: VIBNSidebarProps) {
{activeProjectId && project ? ( - /* ── PROJECT VIEW: name + status only ── */ + /* ── PROJECT VIEW: name + status + section tabs ── */ <> {!collapsed && ( -
-
- {project.productName || project.name || "Project"} + <> +
+
+ {project.productName || project.name || "Project"} +
+
+ + + {project.status === "live" ? "Live" : project.status === "building" ? "Building" : "Defining"} + +
-
- - - {project.status === "live" ? "Live" : project.status === "building" ? "Building" : "Defining"} - -
-
+ + {tabs && tabs.length > 0 && ( +
+ {tabs.map(t => { + const isActive = activeTab === t.id; + return ( + { if (!isActive) (e.currentTarget as HTMLElement).style.background = "#f6f4f0"; }} + onMouseLeave={e => { if (!isActive) (e.currentTarget as HTMLElement).style.background = "transparent"; }} + > + {t.label} + + ); + })} +
+ )} + )} {collapsed && ( -
+
+ {tabs && tabs.map(t => { + const isActive = activeTab === t.id; + return ( + { if (!isActive) (e.currentTarget as HTMLElement).style.background = "#f6f4f0"; }} + onMouseLeave={e => { if (!isActive) (e.currentTarget as HTMLElement).style.background = "transparent"; }} + > + {t.label.slice(0, 2)} + + ); + })}
)}