import type { ReactNode } from 'react' import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarInset, SidebarProvider, SidebarTrigger, } from '@mdxui/primitives/sidebar' import { Separator } from '@mdxui/primitives/separator' import type { AppConfig, NavGroup, UserIdentity } from '../types' import { AppProvider } from '../context/app-context' export interface AppShellProps { /** App configuration */ config: AppConfig /** Navigation groups for the sidebar */ navigation?: NavGroup[] /** Current user identity */ user?: UserIdentity /** Whether the app is loading */ isLoading?: boolean /** Content to render in the sidebar header (e.g., logo, team switcher) */ header?: ReactNode /** Content to render in the sidebar navigation area */ nav?: ReactNode /** Content to render in the sidebar footer (e.g., user menu) */ footer?: ReactNode /** Content to render in the page header (e.g., breadcrumbs) */ pageHeader?: ReactNode /** Main content area */ children: ReactNode /** Whether the sidebar should be collapsible */ collapsible?: 'offcanvas' | 'icon' | 'none' /** Sidebar variant */ variant?: 'sidebar' | 'floating' | 'inset' /** Default open state of the sidebar */ defaultOpen?: boolean /** Controlled open state */ open?: boolean /** Callback when open state changes */ onOpenChange?: (open: boolean) => void /** Additional className for the main content area */ mainClassName?: string } /** * AppShell provides the core layout structure for admin/app interfaces. * It wraps content in an AppProvider and renders a sidebar-based layout. * * @example * ```tsx * } * nav={} * footer={} * pageHeader={} * > * * * ``` */ export function AppShell({ config, navigation = [], user, isLoading, header, nav, footer, pageHeader, children, collapsible = 'icon', variant = 'inset', defaultOpen, open, onOpenChange, mainClassName, }: AppShellProps) { return ( {header && {header}} {nav && {nav}} {footer && {footer}} {pageHeader && (
{pageHeader}
)}
{children}
) }