import React, { forwardRef, useState } from "react"; import { BaseComponentProps, User } from "../../types"; import { Button } from "../ui/Button"; export interface NavigationItem { id: string; label: string; href?: string; icon?: React.ReactNode; active?: boolean; onClick?: () => void; children?: NavigationItem[]; } export interface DashboardLayoutProps extends BaseComponentProps { user?: User | null; navigation?: NavigationItem[]; headerContent?: React.ReactNode; sidebarHeader?: React.ReactNode; showSidebar?: boolean; sidebarCollapsed?: boolean; onSidebarToggle?: () => void; onNavigationClick?: (item: NavigationItem) => void; onUserMenuClick?: () => void; logoContent?: React.ReactNode; } export const DashboardLayout = forwardRef( ( { children, className = "", user, navigation = [], headerContent, sidebarHeader, showSidebar = true, sidebarCollapsed = false, onSidebarToggle, onNavigationClick, onUserMenuClick, logoContent, ...props }, ref ) => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const handleNavigationClick = (item: NavigationItem) => { onNavigationClick?.(item); if (item.onClick) { item.onClick(); } // Close mobile menu after navigation setIsMobileMenuOpen(false); }; const renderNavigationItem = (item: NavigationItem, level = 0) => (
  • 0 ? "ml-4" : ""}`}> {item.children && item.children.length > 0 && !sidebarCollapsed && ( )}
  • ); return (
    {/* Sidebar */} {showSidebar && ( <> {/* Mobile sidebar overlay */} {isMobileMenuOpen && (
    setIsMobileMenuOpen(false)} /> )} {/* Sidebar */}
    {/* Sidebar Header */}
    {!sidebarCollapsed && (
    {logoContent || (

    Dashboard

    )}
    )} {sidebarHeader}
    {/* Navigation */} {/* User info (if not collapsed) */} {!sidebarCollapsed && user && (
    )}
    )} {/* Main content */}
    {/* Header */}
    {/* Mobile menu button */} {showSidebar && ( )} {/* Desktop sidebar toggle */} {showSidebar && onSidebarToggle && ( )}
    {/* Header content */}
    {headerContent}
    {/* Main content area */}
    {children}
    ); } ); DashboardLayout.displayName = "DashboardLayout";