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 && (
)}
{children}
)
}