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)}
+
+ );
+ })}
)}
>