{"version":3,"file":"TopNav.mjs","sources":["../../../../src/lib/ui/layout/TopNav.tsx"],"sourcesContent":["/**\n * @file Top Navigation Component\n * @description Global top navigation UI\n */\n\nimport React, {\n  type ReactNode,\n  useState,\n  useRef,\n  useEffect,\n  useCallback,\n  memo,\n  useMemo,\n  type KeyboardEvent as ReactKeyboardEvent,\n  type CSSProperties,\n} from 'react';\n\n/**\n * Custom hook for keyboard navigation in dropdown menus\n * Handles ArrowUp, ArrowDown, Home, End, and Escape keys\n */\nfunction useDropdownKeyboardNavigation(\n  menuRef: React.RefObject<HTMLDivElement | null>,\n  isOpen: boolean,\n  onClose: () => void\n): (event: ReactKeyboardEvent) => void {\n  return useCallback(\n    (event: ReactKeyboardEvent) => {\n      if (!isOpen || !menuRef.current) return;\n\n      const menuItems = menuRef.current.querySelectorAll<HTMLElement>(\n        'button[role=\"menuitem\"]:not([disabled])'\n      );\n      if (menuItems.length === 0) return;\n\n      const currentIndex = Array.from(menuItems).findIndex(\n        (item) => item === document.activeElement\n      );\n\n      switch (event.key) {\n        case 'Escape':\n          event.preventDefault();\n          onClose();\n          break;\n        case 'ArrowDown':\n          event.preventDefault();\n          if (currentIndex < 0) {\n            menuItems[0]?.focus();\n          } else if (currentIndex < menuItems.length - 1) {\n            menuItems[currentIndex + 1]?.focus();\n          } else {\n            menuItems[0]?.focus(); // Wrap to start\n          }\n          break;\n        case 'ArrowUp':\n          event.preventDefault();\n          if (currentIndex <= 0) {\n            menuItems[menuItems.length - 1]?.focus(); // Wrap to end\n          } else {\n            menuItems[currentIndex - 1]?.focus();\n          }\n          break;\n        case 'Home':\n          event.preventDefault();\n          menuItems[0]?.focus();\n          break;\n        case 'End':\n          event.preventDefault();\n          menuItems[menuItems.length - 1]?.focus();\n          break;\n      }\n    },\n    [isOpen, menuRef, onClose]\n  );\n}\n\n/**\n * Navigation item\n */\nexport interface NavItem {\n  id: string;\n  label: string;\n  href?: string;\n  onClick?: () => void;\n  icon?: ReactNode;\n  items?: NavItem[];\n  disabled?: boolean;\n}\n\n/**\n * User menu item\n */\nexport interface UserMenuItem {\n  id: string;\n  label: string;\n  icon?: ReactNode;\n  onClick?: () => void;\n  divider?: boolean;\n}\n\n/**\n * Top nav props\n */\nexport interface TopNavProps {\n  /** Logo or brand element */\n  logo?: ReactNode;\n\n  /** Navigation items */\n  items?: NavItem[];\n\n  /** Currently active item ID */\n  activeId?: string;\n\n  /** Right-side actions */\n  actions?: ReactNode;\n\n  /** User info for menu */\n  user?: {\n    name: string;\n    email?: string;\n    avatar?: string;\n  };\n\n  /** User menu items */\n  userMenuItems?: UserMenuItem[];\n\n  /** Search component */\n  search?: ReactNode;\n\n  /** Fixed position at top */\n  fixed?: boolean;\n\n  /** Background color */\n  backgroundColor?: string;\n\n  /** Height */\n  height?: number;\n}\n\n// ============================================================================\n// STATIC STYLES - Extracted outside component to prevent re-creation\n// ============================================================================\n\nconst leftSectionStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '2rem',\n};\n\nconst logoContainerStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n};\n\nconst navStyle: CSSProperties = {\n  display: 'flex',\n  gap: '0.25rem',\n};\n\nconst rightSectionStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '1rem',\n};\n\nconst userMenuContainerStyle: CSSProperties = {\n  position: 'relative',\n};\n\nconst userButtonStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '0.5rem',\n  padding: '0.25rem',\n  border: 'none',\n  backgroundColor: 'transparent',\n  cursor: 'pointer',\n  borderRadius: '0.375rem',\n};\n\nconst avatarImageStyle: CSSProperties = {\n  width: '2rem',\n  height: '2rem',\n  borderRadius: '50%',\n  objectFit: 'cover',\n};\n\nconst avatarPlaceholderStyle: CSSProperties = {\n  width: '2rem',\n  height: '2rem',\n  borderRadius: '50%',\n  backgroundColor: '#3b82f6',\n  color: '#ffffff',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  fontSize: '0.875rem',\n  fontWeight: '500',\n};\n\nconst dropdownMenuStyle: CSSProperties = {\n  position: 'absolute',\n  top: '100%',\n  right: 0,\n  marginTop: '0.5rem',\n  width: '14rem',\n  backgroundColor: '#ffffff',\n  border: '1px solid #e5e7eb',\n  borderRadius: '0.5rem',\n  boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',\n  zIndex: 1001,\n  overflow: 'hidden',\n};\n\nconst userInfoHeaderStyle: CSSProperties = {\n  padding: '0.75rem 1rem',\n  borderBottom: '1px solid #e5e7eb',\n};\n\nconst userNameStyle: CSSProperties = {\n  fontWeight: '500',\n};\n\nconst userEmailStyle: CSSProperties = {\n  fontSize: '0.75rem',\n  color: '#6b7280',\n};\n\nconst menuItemsContainerStyle: CSSProperties = {\n  padding: '0.25rem 0',\n};\n\nconst dividerStyle: CSSProperties = {\n  height: '1px',\n  backgroundColor: '#e5e7eb',\n  margin: '0.25rem 0',\n};\n\nconst menuItemButtonStyle: CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '0.5rem',\n  width: '100%',\n  padding: '0.5rem 1rem',\n  border: 'none',\n  backgroundColor: 'transparent',\n  cursor: 'pointer',\n  textAlign: 'left',\n  fontSize: '0.875rem',\n};\n\nconst chevronBaseStyle: CSSProperties = {\n  color: '#6b7280',\n  transition: 'transform 0.2s',\n};\n\n// ============================================================================\n// TOP NAV COMPONENT\n// ============================================================================\n\n/**\n * Top navigation component - memoized for performance\n */\nexport const TopNav = memo(\n  ({\n    logo,\n    items = [],\n    activeId,\n    actions,\n    user,\n    userMenuItems = [],\n    search,\n    fixed = true,\n    backgroundColor = '#ffffff',\n    height = 64,\n  }: TopNavProps): React.ReactElement => {\n    const [userMenuOpen, setUserMenuOpen] = useState(false);\n    const userMenuRef = useRef<HTMLDivElement>(null);\n\n    // Close menu on click outside\n    useEffect(() => {\n      function handleClickOutside(event: MouseEvent): void {\n        if (userMenuRef.current !== null && !userMenuRef.current.contains(event.target as Node)) {\n          setUserMenuOpen(false);\n        }\n      }\n\n      document.addEventListener('mousedown', handleClickOutside);\n      return () => document.removeEventListener('mousedown', handleClickOutside);\n    }, []);\n\n    // Close menu callback for user menu\n    const closeUserMenu = useCallback(() => setUserMenuOpen(false), []);\n\n    // Toggle user menu callback\n    const toggleUserMenu = useCallback(() => setUserMenuOpen((prev) => !prev), []);\n\n    // Keyboard navigation for user menu (ArrowUp, ArrowDown, Home, End, Escape)\n    const handleUserMenuKeyDown = useDropdownKeyboardNavigation(\n      userMenuRef,\n      userMenuOpen,\n      closeUserMenu\n    );\n\n    // Memoize header style since it depends on props\n    const headerStyle = useMemo<CSSProperties>(\n      () => ({\n        position: fixed ? 'fixed' : 'relative',\n        top: 0,\n        left: 0,\n        right: 0,\n        height,\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '0 1.5rem',\n        backgroundColor,\n        borderBottom: '1px solid #e5e7eb',\n        zIndex: 1000,\n      }),\n      [fixed, height, backgroundColor]\n    );\n\n    // Memoize search container style\n    const searchContainerStyle = useMemo<CSSProperties>(\n      () => ({\n        flex: 1,\n        maxWidth: '32rem',\n        margin: '0 2rem',\n      }),\n      []\n    );\n\n    // Memoize spacer style\n    const spacerStyle = useMemo<CSSProperties>(() => ({ height }), [height]);\n\n    // Memoize chevron style based on menu state\n    const chevronStyle = useMemo<CSSProperties>(\n      () => ({\n        ...chevronBaseStyle,\n        transform: userMenuOpen ? 'rotate(180deg)' : 'rotate(0deg)',\n      }),\n      [userMenuOpen]\n    );\n\n    // Create stable menu item click handlers using data attributes\n    const handleMenuItemClick = useCallback(\n      (event: React.MouseEvent<HTMLButtonElement>) => {\n        const { menuItemId } = event.currentTarget.dataset;\n        if (menuItemId !== undefined && menuItemId !== '') {\n          const menuItem = userMenuItems.find((item) => item.id === menuItemId);\n          menuItem?.onClick?.();\n          setUserMenuOpen(false);\n        }\n      },\n      [userMenuItems]\n    );\n\n    return (\n      <>\n        {/* Spacer when fixed */}\n        {fixed && <div style={spacerStyle} />}\n\n        <header style={headerStyle}>\n          {/* Left section: Logo + Nav */}\n          <div style={leftSectionStyle}>\n            {logo !== undefined && <div style={logoContainerStyle}>{logo}</div>}\n\n            {items.length > 0 && (\n              <nav style={navStyle}>\n                {items.map((item) => (\n                  <NavButton key={item.id} item={item} isActive={activeId === item.id} />\n                ))}\n              </nav>\n            )}\n          </div>\n\n          {/* Center section: Search */}\n          {search !== undefined && <div style={searchContainerStyle}>{search}</div>}\n\n          {/* Right section: Actions + User */}\n          <div style={rightSectionStyle}>\n            {actions}\n\n            {user !== undefined && (\n              <div\n                ref={userMenuRef}\n                style={userMenuContainerStyle}\n                onKeyDown={handleUserMenuKeyDown}\n              >\n                <button\n                  onClick={toggleUserMenu}\n                  aria-haspopup=\"menu\"\n                  aria-expanded={userMenuOpen}\n                  aria-label={`User menu for ${user.name}`}\n                  style={userButtonStyle}\n                >\n                  {user.avatar !== undefined && user.avatar !== '' ? (\n                    <img src={user.avatar} alt={user.name} style={avatarImageStyle} />\n                  ) : (\n                    <div style={avatarPlaceholderStyle} aria-hidden=\"true\">\n                      {user.name.charAt(0).toUpperCase()}\n                    </div>\n                  )}\n                  <svg\n                    width=\"16\"\n                    height=\"16\"\n                    viewBox=\"0 0 20 20\"\n                    fill=\"currentColor\"\n                    aria-hidden=\"true\"\n                    style={chevronStyle}\n                  >\n                    <path\n                      fillRule=\"evenodd\"\n                      d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n                      clipRule=\"evenodd\"\n                    />\n                  </svg>\n                </button>\n\n                {/* User dropdown menu */}\n                {userMenuOpen && (\n                  <div role=\"menu\" aria-label=\"User menu\" style={dropdownMenuStyle}>\n                    {/* User info header */}\n                    <div style={userInfoHeaderStyle}>\n                      <div style={userNameStyle}>{user.name}</div>\n                      {user.email !== undefined && user.email !== '' && (\n                        <div style={userEmailStyle}>{user.email}</div>\n                      )}\n                    </div>\n\n                    {/* Menu items */}\n                    <div style={menuItemsContainerStyle}>\n                      {userMenuItems.map((menuItem) =>\n                        menuItem.divider === true ? (\n                          <div key={menuItem.id} role=\"separator\" style={dividerStyle} />\n                        ) : (\n                          <button\n                            key={menuItem.id}\n                            role=\"menuitem\"\n                            data-menu-item-id={menuItem.id}\n                            onClick={handleMenuItemClick}\n                            style={menuItemButtonStyle}\n                          >\n                            {menuItem.icon}\n                            {menuItem.label}\n                          </button>\n                        )\n                      )}\n                    </div>\n                  </div>\n                )}\n              </div>\n            )}\n          </div>\n        </header>\n      </>\n    );\n  }\n);\n\nTopNav.displayName = 'TopNav';\n\n// ============================================================================\n// NAV BUTTON STATIC STYLES\n// ============================================================================\n\nconst navButtonContainerStyle: CSSProperties = {\n  position: 'relative',\n};\n\nconst navDropdownMenuStyle: CSSProperties = {\n  position: 'absolute',\n  top: '100%',\n  left: 0,\n  marginTop: '0.25rem',\n  minWidth: '12rem',\n  backgroundColor: '#ffffff',\n  border: '1px solid #e5e7eb',\n  borderRadius: '0.5rem',\n  boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',\n  zIndex: 1001,\n  overflow: 'hidden',\n};\n\nconst navDropdownItemBaseStyle: CSSProperties = {\n  display: 'block',\n  width: '100%',\n  padding: '0.5rem 1rem',\n  border: 'none',\n  backgroundColor: 'transparent',\n  textAlign: 'left',\n  fontSize: '0.875rem',\n};\n\n// ============================================================================\n// NAV BUTTON COMPONENT\n// ============================================================================\n\n/**\n * Props for NavButton component\n */\ninterface NavButtonProps {\n  item: NavItem;\n  isActive: boolean;\n}\n\n/**\n * Navigation button component - memoized for performance\n */\nconst NavButton = memo(({ item, isActive }: NavButtonProps): React.ReactElement => {\n  const [dropdownOpen, setDropdownOpen] = useState(false);\n  const dropdownRef = useRef<HTMLDivElement>(null);\n  const hasDropdown = item.items !== undefined && item.items.length > 0;\n\n  const handleClick = useCallback((): void => {\n    if (hasDropdown) {\n      setDropdownOpen((prev) => !prev);\n    } else {\n      item.onClick?.();\n    }\n  }, [hasDropdown, item]);\n\n  // Close dropdown callback\n  const closeDropdown = useCallback(() => setDropdownOpen(false), []);\n\n  // Keyboard navigation for dropdown (ArrowUp, ArrowDown, Home, End, Escape)\n  const handleKeyDown = useDropdownKeyboardNavigation(dropdownRef, dropdownOpen, closeDropdown);\n\n  // Close dropdown on click outside\n  useEffect(() => {\n    function handleClickOutside(event: MouseEvent): void {\n      if (dropdownRef.current !== null && !dropdownRef.current.contains(event.target as Node)) {\n        setDropdownOpen(false);\n      }\n    }\n\n    if (dropdownOpen) {\n      document.addEventListener('mousedown', handleClickOutside);\n      return () => document.removeEventListener('mousedown', handleClickOutside);\n    }\n    return undefined;\n  }, [dropdownOpen]);\n\n  // Memoize button style based on state\n  const buttonStyle = useMemo<CSSProperties>(\n    () => ({\n      display: 'flex',\n      alignItems: 'center',\n      gap: '0.25rem',\n      padding: '0.5rem 0.75rem',\n      border: 'none',\n      backgroundColor: isActive ? '#f3f4f6' : 'transparent',\n      color: isActive ? '#111827' : '#6b7280',\n      cursor: (item.disabled ?? false) ? 'not-allowed' : 'pointer',\n      opacity: (item.disabled ?? false) ? 0.5 : 1,\n      borderRadius: '0.375rem',\n      fontSize: '0.875rem',\n      fontWeight: isActive ? '500' : '400',\n    }),\n    [isActive, item.disabled]\n  );\n\n  // Create stable dropdown item click handler using data attributes\n  const handleDropdownItemClick = useCallback(\n    (event: React.MouseEvent<HTMLButtonElement>) => {\n      const { childId } = event.currentTarget.dataset;\n      if (childId !== undefined && childId !== '' && item.items !== undefined) {\n        const child = item.items.find((c) => c.id === childId);\n        child?.onClick?.();\n        setDropdownOpen(false);\n      }\n    },\n    [item.items]\n  );\n\n  // Memoize dropdown item style generator\n  const getDropdownItemStyle = useCallback(\n    (disabled?: boolean): CSSProperties => ({\n      ...navDropdownItemBaseStyle,\n      cursor: disabled === true ? 'not-allowed' : 'pointer',\n    }),\n    []\n  );\n\n  return (\n    <div ref={dropdownRef} style={navButtonContainerStyle} onKeyDown={handleKeyDown}>\n      <button\n        onClick={handleClick}\n        disabled={item.disabled === true}\n        aria-expanded={hasDropdown ? dropdownOpen : undefined}\n        aria-haspopup={hasDropdown ? 'menu' : undefined}\n        style={buttonStyle}\n      >\n        {item.icon}\n        {item.label}\n        {hasDropdown && (\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n            <path\n              fillRule=\"evenodd\"\n              d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"\n              clipRule=\"evenodd\"\n            />\n          </svg>\n        )}\n      </button>\n\n      {/* Dropdown menu */}\n      {hasDropdown && dropdownOpen && item.items !== undefined && (\n        <div role=\"menu\" aria-label={`${item.label} submenu`} style={navDropdownMenuStyle}>\n          {item.items.map((child) => (\n            <button\n              key={child.id}\n              role=\"menuitem\"\n              data-child-id={child.id}\n              onClick={handleDropdownItemClick}\n              disabled={child.disabled === true}\n              style={getDropdownItemStyle(child.disabled)}\n            >\n              {child.label}\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n});\n\nNavButton.displayName = 'NavButton';\n"],"names":["useDropdownKeyboardNavigation","menuRef","isOpen","onClose","useCallback","event","menuItems","currentIndex","item","leftSectionStyle","logoContainerStyle","navStyle","rightSectionStyle","userMenuContainerStyle","userButtonStyle","avatarImageStyle","avatarPlaceholderStyle","dropdownMenuStyle","userInfoHeaderStyle","userNameStyle","userEmailStyle","menuItemsContainerStyle","dividerStyle","menuItemButtonStyle","chevronBaseStyle","TopNav","memo","logo","items","activeId","actions","user","userMenuItems","search","fixed","backgroundColor","height","userMenuOpen","setUserMenuOpen","useState","userMenuRef","useRef","useEffect","handleClickOutside","closeUserMenu","toggleUserMenu","prev","handleUserMenuKeyDown","headerStyle","useMemo","searchContainerStyle","spacerStyle","chevronStyle","handleMenuItemClick","menuItemId","jsxs","Fragment","jsx","NavButton","menuItem","navButtonContainerStyle","navDropdownMenuStyle","navDropdownItemBaseStyle","isActive","dropdownOpen","setDropdownOpen","dropdownRef","hasDropdown","handleClick","closeDropdown","handleKeyDown","buttonStyle","handleDropdownItemClick","childId","c","getDropdownItemStyle","disabled","child"],"mappings":"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"}