@birhaus/navigation
Version:
BIRHAUS v3.0 Radical Minimalist Navigation Components - FourThreeOneNav with glass morphism implementing 4-3-1 cognitive rule
1 lines • 53.6 kB
Source Map (JSON)
{"version":3,"sources":["../src/components/DesktopNavigation.tsx","../src/components/MobileNavigation.tsx","../src/components/LogoSection.tsx","../src/components/MobileMenuButton.tsx","../src/components/SearchAndCommandPalette.tsx","../src/components/ContextualActions.tsx","../src/components/FourThreeOneNav.tsx"],"names":["cn","classes","DesktopBadge","children","variant","className","jsx","v","Submenu","items","onClose","subitem","jsxs","NavItem","item","activeSubmenu","onItemClick","onSubmenuToggle","ChevronDown","OverflowMenu","overflowLabel","DesktopNavigation","visibleNavItems","overflowNavItems","overflowBehavior","bp","hasOverflow","MobileButton","disabled","loading","onClick","MobileBadge","MobileNavigation","navigationItems","contextualActions","primaryAction","onCloseMobileMenu","action","LogoSection","logo","logoHref","onLogoClick","MobileMenuButton","isOpen","onToggle","collapsible","menuLabel","closeMenuLabel","X","Menu","SearchAndCommandPalette","showSearch","onSearchClick","searchLabel","searchPlaceholder","showCommandPalette","onCommandPaletteToggle","commandPaletteLabel","commandPaletteShortcut","floating","Fragment","Search","Command","ActionButton","size","baseClasses","getVariantClass","getSizeClass","s","ContextualActions","magnetic","ActionsSection","floatingSearchBar","magneticButtons","FourThreeOneNav","mobileBreakpoint","themeName","stickyHeader","glassNavigation","isMobileMenuOpen","setIsMobileMenuOpen","useState","setActiveSubmenu","useBirhausThemeV3","useEffect","visibleContextualActions","breakpoint","getNavVariantClass","handleNavItemClick","handleKeyDown","useCallback","e","useFourThreeOneNav","activeItem","setActiveItem","itemId","prev"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client'\n\nimport { ChevronDown } from 'lucide-react'\nimport { NavigationItem } from './FourThreeOneNav'\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n// BIRHAUS: Self-contained Badge component\nfunction DesktopBadge({\n children,\n variant = 'default',\n className = ''\n}: {\n children: React.ReactNode\n variant?: 'default' | 'secondary' | 'destructive'\n className?: string\n}) {\n const baseClasses = \"inline-flex items-center rounded-full px-2 py-1 text-xs font-medium\"\n \n const getVariantClass = (v: typeof variant): string => {\n switch (v) {\n case 'default': return \"bg-blue-100 text-blue-800\"\n case 'secondary': return \"bg-gray-100 text-gray-800\"\n case 'destructive': return \"bg-red-100 text-red-800\"\n default: return \"bg-blue-100 text-blue-800\"\n }\n }\n\n return (\n <span className={cn(baseClasses, getVariantClass(variant), className)}>\n {children}\n </span>\n )\n}\n\n// Helper component for submenu rendering\nfunction Submenu({ \n items, \n onClose \n}: {\n items: NavigationItem[]\n onClose: () => void\n}) {\n return (\n <div className=\"absolute top-full left-0 mt-1 w-64 bg-white border border-gray-200 rounded-md shadow-lg z-50\">\n <div className=\"py-1\">\n {items.map((subitem) => (\n <button\n key={subitem.id}\n onClick={() => {\n subitem.onClick?.()\n onClose()\n }}\n disabled={subitem.disabled}\n className={cn(\n \"w-full text-left px-4 py-2 text-sm transition-colors\",\n \"hover:bg-gray-50 focus:outline-none focus:bg-gray-50\",\n subitem.active && \"text-blue-700 bg-blue-50\",\n subitem.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <div className=\"flex items-center space-x-2\">\n {subitem.icon && <span className=\"flex-shrink-0\">{subitem.icon}</span>}\n <span>{subitem.label}</span>\n {subitem.badge && (\n <DesktopBadge variant=\"secondary\" className=\"ml-auto\">\n {subitem.badge}\n </DesktopBadge>\n )}\n </div>\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n// Helper component for navigation item rendering\nfunction NavItem({ \n item, \n activeSubmenu, \n onItemClick, \n onSubmenuToggle \n}: {\n item: NavigationItem\n activeSubmenu: string | null\n onItemClick: (item: NavigationItem) => void\n onSubmenuToggle: (itemId: string | null) => void\n}) {\n return (\n <div className=\"relative\">\n <button\n onClick={() => onItemClick(item)}\n disabled={item.disabled}\n className={cn(\n \"flex items-center space-x-1 px-3 py-2 rounded-md text-sm font-medium transition-colors\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\",\n item.active \n ? \"text-blue-700 bg-blue-50\"\n : \"text-gray-700 hover:text-gray-900 hover:bg-gray-50\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n aria-current={item.active ? 'page' : undefined}\n aria-expanded={item.submenu ? activeSubmenu === item.id : undefined}\n >\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span>{item.label}</span>\n {item.badge && (\n <DesktopBadge variant=\"default\" className=\"ml-1\">\n {item.badge}\n </DesktopBadge>\n )}\n {item.submenu && (\n <ChevronDown className=\"ml-1 h-4 w-4 flex-shrink-0\" />\n )}\n </button>\n \n {/* Submenu */}\n {item.submenu && activeSubmenu === item.id && (\n <Submenu \n items={item.submenu} \n onClose={() => onSubmenuToggle(null)}\n />\n )}\n </div>\n )\n}\n\n// Overflow menu component\nfunction OverflowMenu({\n items,\n activeSubmenu,\n onItemClick,\n onSubmenuToggle,\n overflowLabel\n}: {\n items: NavigationItem[]\n activeSubmenu: string | null\n onItemClick: (item: NavigationItem) => void\n onSubmenuToggle: (itemId: string | null) => void\n overflowLabel: string\n}) {\n if (items.length === 0) return null\n\n return (\n <div className=\"relative\">\n <button\n onClick={() => onSubmenuToggle(activeSubmenu === 'overflow' ? null : 'overflow')}\n className=\"flex items-center space-x-1 px-3 py-2 rounded-md text-sm font-medium text-gray-700 hover:text-gray-900 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\"\n >\n <span>{overflowLabel}</span>\n <ChevronDown className=\"ml-1 h-4 w-4\" />\n </button>\n \n {activeSubmenu === 'overflow' && (\n <div className=\"absolute top-full right-0 mt-1 w-64 bg-white border border-gray-200 rounded-md shadow-lg z-50\">\n <div className=\"py-1\">\n {items.map((item) => (\n <button\n key={item.id}\n onClick={() => {\n onItemClick(item)\n onSubmenuToggle(null)\n }}\n disabled={item.disabled}\n className={cn(\n \"w-full text-left px-4 py-2 text-sm transition-colors\",\n \"hover:bg-gray-50 focus:outline-none focus:bg-gray-50\",\n item.active && \"text-blue-700 bg-blue-50\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n >\n <div className=\"flex items-center space-x-2\">\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span>{item.label}</span>\n {item.badge && (\n <DesktopBadge variant=\"secondary\" className=\"ml-auto\">\n {item.badge}\n </DesktopBadge>\n )}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\n\ninterface DesktopNavigationProps {\n visibleNavItems: NavigationItem[]\n overflowNavItems: NavigationItem[]\n activeSubmenu: string | null\n onItemClick: (item: NavigationItem) => void\n onSubmenuToggle: (itemId: string | null) => void\n overflowBehavior: 'hide' | 'collapse' | 'scroll'\n overflowLabel: string\n bp: string\n}\n\nexport function DesktopNavigation({\n visibleNavItems,\n overflowNavItems,\n activeSubmenu,\n onItemClick,\n onSubmenuToggle,\n overflowBehavior,\n overflowLabel,\n bp\n}: DesktopNavigationProps) {\n const hasOverflow = overflowNavItems.length > 0\n\n return (\n <div className={cn('hidden', `${bp}:flex`, 'items-center space-x-8')}>\n {visibleNavItems.map((item) => (\n <NavItem\n key={item.id}\n item={item}\n activeSubmenu={activeSubmenu}\n onItemClick={onItemClick}\n onSubmenuToggle={onSubmenuToggle}\n />\n ))}\n \n {/* BIRHAUS: Overflow menu for items > 4 */}\n {hasOverflow && overflowBehavior === 'collapse' && (\n <OverflowMenu\n items={overflowNavItems}\n activeSubmenu={activeSubmenu}\n onItemClick={onItemClick}\n onSubmenuToggle={onSubmenuToggle}\n overflowLabel={overflowLabel}\n />\n )}\n </div>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { NavigationItem, ContextualAction, PrimaryAction } from './FourThreeOneNav'\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n// BIRHAUS: Self-contained Button component for mobile\nfunction MobileButton({\n children,\n variant = 'default',\n disabled = false,\n loading = false,\n onClick,\n className = ''\n}: {\n children: ReactNode\n variant?: 'default' | 'secondary' | 'destructive' | 'primary'\n disabled?: boolean\n loading?: boolean\n onClick?: () => void\n className?: string\n}) {\n const baseClasses = \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n \n const getVariantClass = (v: typeof variant): string => {\n switch (v) {\n case 'default': return \"bg-white border border-gray-300 text-gray-900 hover:bg-gray-50 focus-visible:ring-blue-500\"\n case 'secondary': return \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-500\"\n case 'destructive': return \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-500\"\n case 'primary': return \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-500\"\n default: return \"bg-white border border-gray-300 text-gray-900 hover:bg-gray-50 focus-visible:ring-blue-500\"\n }\n }\n\n return (\n <button\n onClick={onClick}\n disabled={disabled || loading}\n className={cn(baseClasses, getVariantClass(variant), \"h-10 px-4 py-2 text-sm rounded-md\", className)}\n >\n {loading ? (\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-current mr-2\"></div>\n ) : null}\n {children}\n </button>\n )\n}\n\n// BIRHAUS: Self-contained Badge component for mobile\nfunction MobileBadge({\n children,\n variant = 'default',\n className = ''\n}: {\n children: ReactNode\n variant?: 'default' | 'secondary' | 'destructive'\n className?: string\n}) {\n const baseClasses = \"inline-flex items-center rounded-full px-2 py-1 text-xs font-medium\"\n \n const getVariantClass = (v: typeof variant): string => {\n switch (v) {\n case 'default': return \"bg-blue-100 text-blue-800\"\n case 'secondary': return \"bg-gray-100 text-gray-800\"\n case 'destructive': return \"bg-red-100 text-red-800\"\n default: return \"bg-blue-100 text-blue-800\"\n }\n }\n\n return (\n <span className={cn(baseClasses, getVariantClass(variant), className)}>\n {children}\n </span>\n )\n}\n\ninterface MobileNavigationProps {\n navigationItems: NavigationItem[]\n contextualActions: ContextualAction[]\n primaryAction?: PrimaryAction\n onItemClick: (item: NavigationItem) => void\n onCloseMobileMenu: () => void\n bp: string\n}\n\nexport function MobileNavigation({\n navigationItems,\n contextualActions,\n primaryAction,\n onItemClick,\n onCloseMobileMenu,\n bp\n}: MobileNavigationProps) {\n return (\n <div className={cn(`${bp}:hidden`, 'border-t border-gray-200 pt-4 pb-4')}>\n <div className=\"space-y-1\">\n {navigationItems.map((item) => (\n <button\n key={item.id}\n onClick={() => onItemClick(item)}\n disabled={item.disabled}\n className={cn(\n \"w-full text-left flex items-center space-x-3 px-3 py-2 rounded-md text-base font-medium transition-colors\",\n \"focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500\",\n item.active \n ? \"text-blue-700 bg-blue-50\"\n : \"text-gray-700 hover:text-gray-900 hover:bg-gray-50\",\n item.disabled && \"opacity-50 cursor-not-allowed\"\n )}\n aria-current={item.active ? 'page' : undefined}\n >\n {item.icon && <span className=\"flex-shrink-0\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {item.badge && (\n <MobileBadge variant=\"default\">\n {item.badge}\n </MobileBadge>\n )}\n </button>\n ))}\n </div>\n \n {/* Mobile Actions */}\n {(contextualActions.length > 0 || primaryAction) && (\n <div className=\"mt-4 pt-4 border-t border-gray-200 space-y-2\">\n {contextualActions.map((action) => (\n <MobileButton\n key={action.id}\n onClick={() => {\n action.onClick()\n onCloseMobileMenu()\n }}\n variant={action.variant === 'destructive' ? 'destructive' : 'secondary'}\n disabled={action.disabled}\n loading={action.loading}\n className=\"w-full justify-center\"\n >\n {action.icon && <span className=\"mr-2\">{action.icon}</span>}\n {action.label}\n </MobileButton>\n ))}\n \n {primaryAction && (\n <MobileButton\n onClick={() => {\n primaryAction.onClick()\n onCloseMobileMenu()\n }}\n variant=\"primary\"\n disabled={primaryAction.disabled}\n loading={primaryAction.loading}\n className=\"w-full justify-center\"\n >\n {primaryAction.icon && <span className=\"mr-2\">{primaryAction.icon}</span>}\n {primaryAction.label}\n </MobileButton>\n )}\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\n\ninterface LogoSectionProps {\n logo?: ReactNode\n logoHref?: string\n onLogoClick?: () => void\n}\n\nexport function LogoSection({ logo, logoHref, onLogoClick }: LogoSectionProps) {\n if (!logo) return null\n\n return (\n <div className=\"flex-shrink-0\">\n <div className=\"flex items-center\">\n {logoHref ? (\n <a href={logoHref} className=\"flex items-center\">\n {logo}\n </a>\n ) : (\n <button \n onClick={onLogoClick}\n className=\"flex items-center focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded\"\n >\n {logo}\n </button>\n )}\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { Menu, X } from 'lucide-react'\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface MobileMenuButtonProps {\n isOpen: boolean\n onToggle: () => void\n collapsible: boolean\n menuLabel: string\n closeMenuLabel: string\n bp: string\n}\n\nexport function MobileMenuButton({\n isOpen,\n onToggle,\n collapsible,\n menuLabel,\n closeMenuLabel,\n bp\n}: MobileMenuButtonProps) {\n if (!collapsible) return null\n\n return (\n <button\n onClick={onToggle}\n className={cn(\n `${bp}:hidden`,\n 'p-2 text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded'\n )}\n aria-expanded={isOpen}\n aria-label={isOpen ? closeMenuLabel : menuLabel}\n >\n {isOpen ? (\n <X className=\"h-6 w-6\" />\n ) : (\n <Menu className=\"h-6 w-6\" />\n )}\n </button>\n )\n}\n","'use client'\n\nimport { Search, Command } from 'lucide-react'\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\ninterface SearchAndCommandPaletteProps {\n showSearch: boolean\n onSearchClick?: () => void\n searchLabel: string\n searchPlaceholder: string\n showCommandPalette: boolean\n onCommandPaletteToggle?: () => void\n commandPaletteLabel: string\n commandPaletteShortcut: string\n bp: string\n // v3.0 props\n floating?: boolean\n}\n\nexport function SearchAndCommandPalette({\n showSearch,\n onSearchClick,\n searchLabel,\n searchPlaceholder,\n showCommandPalette,\n onCommandPaletteToggle,\n commandPaletteLabel,\n commandPaletteShortcut,\n bp,\n floating = false\n}: SearchAndCommandPaletteProps) {\n return (\n <>\n {/* Search */}\n {showSearch && (\n <button\n onClick={onSearchClick}\n className=\"p-2 text-gray-400 hover:text-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded\"\n aria-label={searchLabel}\n title={searchPlaceholder}\n >\n <Search className=\"h-5 w-5\" />\n </button>\n )}\n \n {/* Command Palette */}\n {showCommandPalette && (\n <button\n onClick={onCommandPaletteToggle}\n className={cn(\n 'hidden', `${bp}:flex`,\n 'items-center space-x-2 px-3 py-1 text-sm text-gray-600 bg-gray-50 hover:bg-gray-100 rounded-md transition-colors',\n 'focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'\n )}\n aria-label={commandPaletteLabel}\n >\n <Command className=\"h-4 w-4\" />\n <span className=\"text-xs\">{commandPaletteShortcut}</span>\n </button>\n )}\n </>\n )\n}\n","'use client'\n\nimport { ReactNode } from 'react'\nimport { ContextualAction, PrimaryAction } from './FourThreeOneNav'\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\n// BIRHAUS: Self-contained Button component for actions\nfunction ActionButton({\n children,\n variant = 'default',\n size = 'default',\n disabled = false,\n loading = false,\n onClick,\n className = ''\n}: {\n children: ReactNode\n variant?: 'default' | 'secondary' | 'destructive' | 'ghost' | 'primary'\n size?: 'sm' | 'default' | 'lg'\n disabled?: boolean\n loading?: boolean\n onClick?: () => void\n className?: string\n}) {\n const baseClasses = \"inline-flex items-center justify-center font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\"\n \n const getVariantClass = (v: typeof variant): string => {\n switch (v) {\n case 'default': return \"bg-white border border-gray-300 text-gray-900 hover:bg-gray-50 focus-visible:ring-blue-500\"\n case 'secondary': return \"bg-gray-100 text-gray-900 hover:bg-gray-200 focus-visible:ring-gray-500\"\n case 'destructive': return \"bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-500\"\n case 'ghost': return \"text-gray-600 hover:text-gray-900 hover:bg-gray-100 focus-visible:ring-gray-500\"\n case 'primary': return \"bg-blue-600 text-white hover:bg-blue-700 focus-visible:ring-blue-500\"\n default: return \"bg-white border border-gray-300 text-gray-900 hover:bg-gray-50 focus-visible:ring-blue-500\"\n }\n }\n\n const getSizeClass = (s: typeof size): string => {\n switch (s) {\n case 'sm': return \"h-8 px-3 text-sm rounded-md\"\n case 'default': return \"h-10 px-4 py-2 text-sm rounded-md\"\n case 'lg': return \"h-12 px-6 text-base rounded-lg\"\n default: return \"h-10 px-4 py-2 text-sm rounded-md\"\n }\n }\n\n return (\n <button\n onClick={onClick}\n disabled={disabled || loading}\n className={cn(baseClasses, getVariantClass(variant), getSizeClass(size), className)}\n >\n {loading ? (\n <div className=\"animate-spin rounded-full h-4 w-4 border-b-2 border-current mr-2\"></div>\n ) : null}\n {children}\n </button>\n )\n}\n\ninterface ContextualActionsProps {\n contextualActions: ContextualAction[]\n primaryAction?: PrimaryAction\n bp: string\n // v3.0 props\n magnetic?: boolean\n}\n\nexport function ContextualActions({\n contextualActions,\n primaryAction,\n bp,\n magnetic = false\n}: ContextualActionsProps) {\n return (\n <>\n {/* BIRHAUS: Contextual Actions (max 3) */}\n <div className={cn('hidden', `${bp}:flex`, 'items-center space-x-2')}>\n {contextualActions.map((action) => (\n <ActionButton\n key={action.id}\n onClick={action.onClick}\n variant={action.variant === 'destructive' ? 'destructive' : 'ghost'}\n disabled={action.disabled}\n loading={action.loading}\n size=\"sm\"\n >\n {action.icon && <span className=\"mr-1\">{action.icon}</span>}\n {action.label}\n </ActionButton>\n ))}\n </div>\n \n {/* BIRHAUS: Primary Action */}\n {primaryAction && (\n <ActionButton\n onClick={primaryAction.onClick}\n variant=\"primary\"\n disabled={primaryAction.disabled}\n loading={primaryAction.loading}\n className={cn('hidden', `${bp}:inline-flex`)}\n >\n {primaryAction.icon && <span className=\"mr-2\">{primaryAction.icon}</span>}\n {primaryAction.label}\n </ActionButton>\n )}\n </>\n )\n}\n","'use client'\n\nimport { useState, ReactNode, useEffect, useCallback } from 'react'\nimport { DesktopNavigation } from './DesktopNavigation'\nimport { MobileNavigation } from './MobileNavigation'\nimport { LogoSection } from './LogoSection'\nimport { MobileMenuButton } from './MobileMenuButton'\nimport { SearchAndCommandPalette } from './SearchAndCommandPalette'\nimport { ContextualActions } from './ContextualActions'\nimport { \n BirhausNavigationPropsV3, \n BirhausBasePropsV3 \n} from '@birhaus/types/v3'\nimport { useBirhausThemeV3 } from '@birhaus/themes'\n\n/**\n * BIRHAUS FourThreeOneNav Component\n * \n * Implements BIRHAUS principle #1: \"Form serves flow\" with 4-3-1 cognitive rule:\n * - Maximum 4 primary navigation items (Miller's Law: 7±2, optimized for 4)\n * - Maximum 3 contextual actions per view\n * - 1 primary action (clearly highlighted)\n * \n * Features:\n * - Spanish-first internationalization\n * - Mobile-first responsive design\n * - Progressive disclosure for overflow items\n * - WCAG AA+ accessibility compliance\n * - Command palette integration (⌘K)\n */\n\n// BIRHAUS: Utility function (replaces @/lib/utils cn)\nfunction cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n\nexport interface NavigationItem {\n id: string\n label: string\n labelEn?: string // Optional English translation\n icon?: ReactNode\n href?: string\n onClick?: () => void\n active?: boolean\n disabled?: boolean\n badge?: string | number // Notification count/label\n submenu?: NavigationItem[]\n}\n\nexport interface ContextualAction {\n id: string\n label: string\n labelEn?: string\n icon?: ReactNode\n onClick: () => void\n variant?: 'default' | 'secondary' | 'destructive'\n disabled?: boolean\n loading?: boolean\n}\n\nexport interface PrimaryAction {\n label: string\n labelEn?: string\n icon?: ReactNode\n onClick: () => void\n disabled?: boolean\n loading?: boolean\n}\n\nexport interface FourThreeOneNavProps extends Omit<BirhausBasePropsV3, 'variant'> {\n // BIRHAUS: Maximum 4 navigation items\n navigationItems: NavigationItem[]\n \n // BIRHAUS: Maximum 3 contextual actions \n contextualActions?: ContextualAction[]\n \n // BIRHAUS: 1 primary action\n primaryAction?: PrimaryAction\n \n // Logo/Brand\n logo?: ReactNode\n logoHref?: string\n onLogoClick?: () => void\n \n // Search integration\n searchPlaceholder?: string\n onSearchClick?: () => void\n showSearch?: boolean\n \n // Command palette\n showCommandPalette?: boolean\n onCommandPaletteToggle?: () => void\n commandPaletteShortcut?: string\n \n // Mobile behavior\n mobileBreakpoint?: 'sm' | 'md' | 'lg'\n collapsible?: boolean\n \n // Spanish-first labels\n menuLabel?: string\n closeMenuLabel?: string\n searchLabel?: string\n commandPaletteLabel?: string\n \n // Styling\n className?: string\n variant?: 'default' | 'minimal' | 'elevated' | 'glass' | 'frosted' | 'floating'\n \n // Overflow behavior (when > 4 nav items)\n overflowBehavior?: 'hide' | 'collapse' | 'scroll'\n overflowLabel?: string\n \n // v3.0 Radical Minimalist Design Props\n themeName?: 'financial' | 'healthcare' | 'education'\n stickyHeader?: boolean\n glassNavigation?: boolean\n floatingSearchBar?: boolean\n magneticButtons?: boolean\n}\n\n\n\n\n\n\n\n// Helper component for actions section\nfunction ActionsSection({\n showSearch,\n onSearchClick,\n searchLabel,\n searchPlaceholder,\n showCommandPalette,\n onCommandPaletteToggle,\n commandPaletteLabel,\n commandPaletteShortcut,\n contextualActions,\n primaryAction,\n bp,\n floatingSearchBar = false,\n magneticButtons = false\n}: {\n showSearch: boolean\n onSearchClick?: () => void\n searchLabel: string\n searchPlaceholder: string\n showCommandPalette: boolean\n onCommandPaletteToggle?: () => void\n commandPaletteLabel: string\n commandPaletteShortcut: string\n contextualActions: ContextualAction[]\n primaryAction?: PrimaryAction\n bp: string\n floatingSearchBar?: boolean\n magneticButtons?: boolean\n}) {\n return (\n <div className=\"flex items-center space-x-3\">\n <SearchAndCommandPalette\n showSearch={showSearch}\n onSearchClick={onSearchClick}\n searchLabel={searchLabel}\n searchPlaceholder={searchPlaceholder}\n showCommandPalette={showCommandPalette}\n onCommandPaletteToggle={onCommandPaletteToggle}\n commandPaletteLabel={commandPaletteLabel}\n commandPaletteShortcut={commandPaletteShortcut}\n bp={bp}\n floating={floatingSearchBar}\n />\n\n <ContextualActions\n contextualActions={contextualActions}\n primaryAction={primaryAction}\n bp={bp}\n magnetic={magneticButtons}\n />\n </div>\n )\n}\n\n// eslint-disable-next-line max-lines-per-function -- Main navigation component requires comprehensive layout logic\nexport function FourThreeOneNav({\n navigationItems,\n contextualActions = [],\n primaryAction,\n logo,\n logoHref,\n onLogoClick,\n searchPlaceholder = 'Buscar...', // Used for aria-label and placeholder text\n onSearchClick,\n showSearch = true,\n showCommandPalette = true,\n onCommandPaletteToggle,\n commandPaletteShortcut = '⌘K',\n mobileBreakpoint = 'md',\n collapsible = true,\n menuLabel = 'Menú',\n closeMenuLabel = 'Cerrar menú',\n searchLabel = 'Buscar',\n commandPaletteLabel = 'Abrir paleta de comandos',\n className = '',\n variant = 'default',\n overflowBehavior = 'collapse',\n overflowLabel = 'Más opciones',\n themeName = 'financial',\n stickyHeader = false,\n glassNavigation = false,\n floatingSearchBar = false,\n magneticButtons = false\n}: FourThreeOneNavProps) {\n \n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false)\n const [activeSubmenu, setActiveSubmenu] = useState<string | null>(null)\n \n // BIRHAUS v3.0: Theme integration\n const theme = useBirhausThemeV3(themeName)\n \n // BIRHAUS: Enforce 4-3-1 rule with warnings\n useEffect(() => {\n if (navigationItems.length > 4) {\n console.warn(\n `BIRHAUS 4-3-1 Rule Violation: Navigation has ${navigationItems.length} items (max 4). ` +\n `Consider using overflowBehavior to handle excess items.`\n )\n }\n \n if (contextualActions.length > 3) {\n console.warn(\n `BIRHAUS 4-3-1 Rule Violation: ${contextualActions.length} contextual actions (max 3). ` +\n `Reduce cognitive load by consolidating actions.`\n )\n }\n }, [navigationItems.length, contextualActions.length])\n \n // BIRHAUS: Handle overflow navigation items\n const visibleNavItems = navigationItems.slice(0, 4)\n const overflowNavItems = navigationItems.slice(4)\n \n // BIRHAUS: Limit contextual actions to 3\n const visibleContextualActions = contextualActions.slice(0, 3)\n \n // Fix object injection by using explicit property access\n const getBreakpointClass = (breakpoint: typeof mobileBreakpoint): string => {\n switch (breakpoint) {\n case 'sm': return 'sm'\n case 'md': return 'md'\n case 'lg': return 'lg'\n default: return 'md'\n }\n }\n const bp = getBreakpointClass(mobileBreakpoint)\n \n // BIRHAUS v3.0: Enhanced variant classes with glass morphism\n const getNavVariantClass = (v: typeof variant): string => {\n switch (v) {\n case 'default': \n return 'bg-white border-b border-gray-200'\n case 'minimal': \n return 'bg-transparent'\n case 'elevated': \n return 'bg-white shadow-sm border-b border-gray-200'\n case 'glass':\n return glassNavigation \n ? `backdrop-blur-md bg-white/80 border-b border-white/30 shadow-lg saturate-150`\n : 'bg-white border-b border-gray-200'\n case 'frosted':\n return glassNavigation \n ? `backdrop-blur-xl bg-white/60 border-b border-white/20 shadow-xl saturate-200`\n : 'bg-white border-b border-gray-200'\n case 'floating':\n return glassNavigation \n ? `backdrop-blur-lg bg-white/70 border border-white/40 shadow-2xl rounded-3xl mx-4 mt-4 saturate-180`\n : 'bg-white border border-gray-200 shadow-lg rounded-3xl mx-4 mt-4'\n default: \n return 'bg-white border-b border-gray-200'\n }\n }\n \n const handleNavItemClick = (item: NavigationItem) => {\n if (item.disabled) return\n \n if (item.submenu && item.submenu.length > 0) {\n setActiveSubmenu(activeSubmenu === item.id ? null : item.id)\n } else {\n item.onClick?.()\n setIsMobileMenuOpen(false)\n }\n }\n \n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n // Command palette shortcut\n if ((e.metaKey || e.ctrlKey) && e.key === 'k' && showCommandPalette) {\n e.preventDefault()\n onCommandPaletteToggle?.()\n }\n }, [showCommandPalette, onCommandPaletteToggle])\n\n useEffect(() => {\n // SSR-safe event listener\n if (typeof window !== 'undefined') {\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }\n }, [handleKeyDown])\n \n return (\n <nav \n className={cn(\n 'relative w-full transition-all duration-300',\n stickyHeader ? 'sticky top-0 z-50' : '',\n