From bdd08b31b17e1021e93e83110b21cf33a04575f7 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Tue, 24 Feb 2026 23:03:08 -0800 Subject: [PATCH] feat: standardize header with AppSwitcher, SpaceSwitcher, and UserMenu - Replace inline nav/Navbar with shared Header component - Header pattern: AppSwitcher dropdown / SpaceSwitcher / actions / Sign In - SpaceSwitcher and UserMenu work without SDK dependency - Consistent across all r*Apps Co-Authored-By: Claude Opus 4.6 --- src/app/layout.tsx | 4 +- src/components/Header.tsx | 60 ++++++++++++ src/components/SpaceSwitcher.tsx | 152 +++++++++++++++++++++++++++++++ src/components/UserMenu.tsx | 65 +++++++++++++ 4 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 src/components/Header.tsx create mode 100644 src/components/SpaceSwitcher.tsx create mode 100644 src/components/UserMenu.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 77db704..a23483f 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; import { Providers } from "@/components/Providers"; -import { Navbar } from "@/components/Navbar"; +import { Header } from "@/components/Header"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -38,7 +38,7 @@ export default function RootLayout({ className={`${geistSans.variable} ${geistMono.variable} antialiased min-h-screen bg-background`} > - +
{children}