/** * Shared full-screen state layout for fallback screens (access denied, not-found, error). * Uses content-safe, app tokens, and consistent spacing so all fallback screens look like the same app. */ "use client"; export interface FullScreenStateShellProps { /** Main heading (e.g. "Access denied", "Page not found"). */ title: React.ReactNode; /** Optional description or message below the title. */ description?: React.ReactNode; /** Optional extra content (e.g. server detail, secondary text). */ children?: React.ReactNode; /** Primary action (Button or Link). */ primaryAction: React.ReactNode; /** Wrapper role. Default "alert" for error/denied states. */ role?: "alert" | "status"; /** Optional extra class names for the wrapper. */ className?: string; } const OUTER_CLASS = "content-safe flex min-h-[var(--tg-viewport-stable-height,100vh)] flex-col items-center justify-center gap-4 bg-background text-foreground"; const INNER_CLASS = "mx-auto w-full max-w-[var(--max-width-app)] px-3 flex flex-col items-center gap-4"; /** * Full-screen centered shell with title, optional description, and primary action. * Use for access denied, not-found, and in-app error boundary screens. */ export function FullScreenStateShell({ title, description, children, primaryAction, role = "alert", className, }: FullScreenStateShellProps) { return (

{title}

{description != null && (

{description}

)} {children} {primaryAction}
); }