diff --git a/src/components/PageShell.tsx b/src/components/PageShell.tsx
new file mode 100644
index 0000000..c20f325
--- /dev/null
+++ b/src/components/PageShell.tsx
@@ -0,0 +1,57 @@
+import { useState } from 'react'
+import { ChevronRight } from 'lucide-react'
+import { Sidebar } from './Sidebar'
+import type { User } from '../types'
+
+interface Props {
+ user: User
+ children: React.ReactNode
+ padding?: string
+}
+
+export function PageShell({ user, children, padding = '1.5rem 2rem' }: Props) {
+ const [menuOpen, setMenuOpen] = useState(false)
+
+ return (
+
+
+ {/* Collapsed sidebar strip */}
+
+
+
+
+ {/* Overlay sidebar + backdrop when open */}
+ {menuOpen && (
+ <>
+
setMenuOpen(false)}
+ style={{ position: 'fixed', inset: 0, zIndex: 19, background: 'rgba(0,0,0,0.35)' }}
+ />
+
+ setMenuOpen(false)} />
+
+ >
+ )}
+
+
+ {children}
+
+
+ )
+}
diff --git a/src/pages/AdminDepartments.tsx b/src/pages/AdminDepartments.tsx
index 65d8d43..c2b5ff1 100644
--- a/src/pages/AdminDepartments.tsx
+++ b/src/pages/AdminDepartments.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import type { User, Role } from '../types'
interface WfDept {
@@ -93,9 +93,7 @@ export function AdminDepartments({ user }: { user: User }) {
}
return (
-
-
-
+
Workforce Departments
@@ -173,8 +171,7 @@ export function AdminDepartments({ user }: { user: User }) {
))}
)}
-
-
+
)
}
diff --git a/src/pages/AdminMonitor.tsx b/src/pages/AdminMonitor.tsx
index 2d41543..57178b4 100644
--- a/src/pages/AdminMonitor.tsx
+++ b/src/pages/AdminMonitor.tsx
@@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react'
import { ArrowUpCircle, Activity, ScrollText, RefreshCw, TerminalSquare, HardDrive, ChevronDown, ChevronRight, Play } from 'lucide-react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import type { User } from '../types'
interface AppStatus {
@@ -238,8 +238,7 @@ export function AdminMonitor({ user }: { user: User }) {
]
return (
-
-
+
{/* Tab bar */}
@@ -718,6 +717,6 @@ export function AdminMonitor({ user }: { user: User }) {
)}
-
+
)
}
diff --git a/src/pages/AdminRoles.tsx b/src/pages/AdminRoles.tsx
index d143fa1..f543292 100644
--- a/src/pages/AdminRoles.tsx
+++ b/src/pages/AdminRoles.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import type { User, Role, Capability } from '../types'
export function AdminRoles({ user }: { user: User }) {
@@ -51,9 +51,7 @@ export function AdminRoles({ user }: { user: User }) {
}
return (
-
-
-
+
Roles
))}
-
-
+
)
}
diff --git a/src/pages/AdminSettings.tsx b/src/pages/AdminSettings.tsx
index 8c8929b..ce502ea 100644
--- a/src/pages/AdminSettings.tsx
+++ b/src/pages/AdminSettings.tsx
@@ -1,6 +1,6 @@
import { useState, useEffect, useRef } from 'react'
import { CheckCircle, XCircle, RefreshCw, ChevronDown, ChevronUp, Clock, Folder, FolderOpen, ChevronRight, KeyRound, Copy, Check } from 'lucide-react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import type { User } from '../types'
const MASKED = '••••••••'
@@ -62,9 +62,7 @@ export function AdminSettings({ user }: { user: User }) {
}, [])
return (
-
-
-
+
Settings
@@ -101,8 +99,7 @@ export function AdminSettings({ user }: { user: User }) {
{tab === 'rooms' && }
{tab === 'apps' && }
{tab === 'device' && }
-
-
+
)
}
diff --git a/src/pages/AdminUsers.tsx b/src/pages/AdminUsers.tsx
index fe4de1c..d5133c7 100644
--- a/src/pages/AdminUsers.tsx
+++ b/src/pages/AdminUsers.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import type { User, Role, Capability } from '../types'
interface ManagedUser {
@@ -93,9 +93,7 @@ export function AdminUsers({ user }: { user: User }) {
}
return (
-
-
-
+
Users
-
-
+
)
}
diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx
index 588f178..31cb449 100644
--- a/src/pages/Dashboard.tsx
+++ b/src/pages/Dashboard.tsx
@@ -1,6 +1,6 @@
import { useNavigate } from 'react-router-dom'
import { Download } from 'lucide-react'
-import { Sidebar } from '../components/Sidebar'
+import { PageShell } from '../components/PageShell'
import { AppIcon } from '../components/AppIcon'
import type { User, App } from '../types'
@@ -18,9 +18,7 @@ export function Dashboard({ user }: { user: User }) {
const hasAny = user.apps.length > 0
return (
-
-
-
+
Good {greeting()},{' '}
{user.name}
@@ -50,8 +48,7 @@ export function Dashboard({ user }: { user: User }) {
navigate(`/app/${slug}`)} />
))}
-
-
+
)
}