feat: Linear-style sidebar with explicit toggle

Rewrite sidebar from scratch: 256px expanded, 56px collapsed via
click toggle + [ keyboard shortcut. Two-phase CSS transitions (labels
fade then width contracts). Contextual ContentHeader replaces
UtilityBar (no logo, just actions). Remove framer-motion sidebar
primitive, hover-to-expand, and sidebar-context.
This commit is contained in:
Usman Baig
2026-03-18 16:33:35 +01:00
parent db5cd4cbcb
commit 2474d6558f
5 changed files with 283 additions and 375 deletions

View File

@@ -1,7 +1,8 @@
'use client'
import PulseSidebar from './Sidebar'
import UtilityBar from './UtilityBar'
import { useState, useCallback } from 'react'
import Sidebar from './Sidebar'
import ContentHeader from './ContentHeader'
export default function DashboardShell({
siteId,
@@ -10,12 +11,21 @@ export default function DashboardShell({
siteId: string
children: React.ReactNode
}) {
const [mobileOpen, setMobileOpen] = useState(false)
const closeMobile = useCallback(() => setMobileOpen(false), [])
const openMobile = useCallback(() => setMobileOpen(true), [])
return (
<div className="flex flex-col h-screen overflow-hidden">
<UtilityBar />
<div className="flex flex-1 overflow-hidden">
<PulseSidebar siteId={siteId} />
<main className="flex-1 min-w-0 overflow-y-auto">
<div className="flex h-screen overflow-hidden">
<Sidebar
siteId={siteId}
mobileOpen={mobileOpen}
onMobileClose={closeMobile}
onMobileOpen={openMobile}
/>
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
<ContentHeader onMobileMenuOpen={openMobile} />
<main className="flex-1 overflow-y-auto">
{children}
</main>
</div>