diff --git a/services/frontend/src/components/shell/ambient-app.tsx b/services/frontend/src/components/shell/ambient-app.tsx deleted file mode 100644 index 0704e1ef..00000000 --- a/services/frontend/src/components/shell/ambient-app.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { MiniPlayer } from "@/components/media/mini-player"; -import { MobileNav } from "./mobile-nav"; -import { NavRail } from "./nav-rail"; -import { TopBar } from "./topbar"; - -/** - * App chrome: slim nav rail + sticky top bar + scrollable content region. - * Sits above the fixed AmbientCanvas. Providers (Ambient + WS) are mounted in - * the route layout so every page shares one live link and signal context. - * - * < md the side rail collapses (hidden) and a bottom tab bar (MobileNav) - * takes over navigation; the content region gains bottom padding so the last - * panel never hides behind the dock. A persistent MiniPlayer floats at the - * bottom-right whenever a media track is loaded outside /media. - */ -export function AppFrame({ children }: { children: React.ReactNode }) { - return ( -
- -
- -
- {children} -
-
- - -
- ); -} diff --git a/services/frontend/src/components/shell/constellation-frame.tsx b/services/frontend/src/components/shell/constellation-frame.tsx index 767d934b..bc5f4205 100644 --- a/services/frontend/src/components/shell/constellation-frame.tsx +++ b/services/frontend/src/components/shell/constellation-frame.tsx @@ -4,10 +4,11 @@ * ConstellationFrame — replaces the classic AppFrame chrome. * The stage canvas sits fixed behind everything; page content is an * overlay layer (absolute, no top bar / nav rail / scroll shell). - * MiniPlayer + Chatbot + CommandPalette keep mounting at the layout level. + * Chatbot + CommandPalette keep mounting at the layout level. */ import { usePathname } from "next/navigation"; import { type ReactNode, useMemo } from "react"; +import { MiniPlayer } from "@/components/media/mini-player"; import { ConstellationStage } from "@/components/shell/constellation-stage"; import { FloatingChrome } from "@/components/shell/floating-chrome"; import { resolveScene, type SceneSeed } from "@/components/shell/route-scenes"; @@ -38,6 +39,7 @@ export function ConstellationFrame({ }} /> + {/* Overlay content region — scenes place floating panels inside. */}
{children}
diff --git a/services/frontend/src/components/shell/index.ts b/services/frontend/src/components/shell/index.ts index e10b06b4..727ed4b9 100644 --- a/services/frontend/src/components/shell/index.ts +++ b/services/frontend/src/components/shell/index.ts @@ -1,3 +1,2 @@ -export { AppFrame } from "./ambient-app"; export { ConstellationFrame } from "./constellation-frame"; export { ConnectionStatus } from "./status-dot"; diff --git a/services/frontend/src/components/shell/mobile-nav.tsx b/services/frontend/src/components/shell/mobile-nav.tsx deleted file mode 100644 index 04ba5b4e..00000000 --- a/services/frontend/src/components/shell/mobile-nav.tsx +++ /dev/null @@ -1,43 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import { isActivePath, mobileNavItems } from "@/lib/navigation"; -import { cn } from "@/lib/utils"; - -/** - * Mobile bottom tab bar. Shown only < md (the side NavRail is hidden there). - * Mirrors the desktop nav items but as a thumb-friendly dock with labels and a - * top active indicator. Safe-area aware for notched devices. - */ -export function MobileNav() { - const path = usePathname() ?? "/"; - - return ( - - ); -} diff --git a/services/frontend/src/components/shell/nav-rail.tsx b/services/frontend/src/components/shell/nav-rail.tsx deleted file mode 100644 index 59cf9bc8..00000000 --- a/services/frontend/src/components/shell/nav-rail.tsx +++ /dev/null @@ -1,61 +0,0 @@ -"use client"; - -import { usePathname } from "next/navigation"; -import { isActivePath, navItems } from "@/lib/navigation"; -import { cn } from "@/lib/utils"; - -function NavItem({ - href, - label, - active, - Icon, -}: { - href: string; - label: string; - active: boolean; - Icon: React.ComponentType>; -}) { - return ( - - {active && ( - - )} - - {/* hover tooltip — labels are hidden in the rail, so surface on hover */} - - {label} - - - ); -} - -export function NavRail() { - const pathname = usePathname(); - const path = pathname ?? "/"; - - return ( - - ); -} diff --git a/services/frontend/src/components/shell/topbar.tsx b/services/frontend/src/components/shell/topbar.tsx deleted file mode 100644 index f2688cc5..00000000 --- a/services/frontend/src/components/shell/topbar.tsx +++ /dev/null @@ -1,76 +0,0 @@ -"use client"; - -import { Moon, Sun } from "lucide-react"; -import { usePathname } from "next/navigation"; -import { useTheme } from "next-themes"; -import { useEffect, useState } from "react"; -import { useAmbient } from "@/components/ambient/ambient-context"; -import { navItems } from "@/lib/navigation"; -import { cn } from "@/lib/utils"; -import { ConnectionStatus } from "./status-dot"; - -function useActiveLabel() { - const pathname = usePathname(); - const item = [...navItems] - .sort((a, b) => b.matchPrefix.length - a.matchPrefix.length) - .find((i) => pathname.startsWith(i.matchPrefix)); - return item?.label ?? "Console"; -} - -export function TopBar() { - const label = useActiveLabel(); - const { state } = useAmbient(); - const { theme, setTheme } = useTheme(); - const [mounted, setMounted] = useState(false); - useEffect(() => setMounted(true), []); - - const signalTone = - state.tone === "vermilion" - ? "text-vermilion" - : state.tone === "amber" - ? "text-amber" - : "text-signal"; - - return ( -
-
- GMW -

- {label} -

-
- -
-
-
- ); -}