Skip to content

Itasimo/header#57

Open
itasimo wants to merge 9 commits intomainfrom
itasimo/header
Open

Itasimo/header#57
itasimo wants to merge 9 commits intomainfrom
itasimo/header

Conversation

@itasimo
Copy link
Copy Markdown

@itasimo itasimo commented Apr 2, 2026

Closes #9

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 2, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR implements a responsive header redesign, converting it from a server-rendered async component with fixed height tracking to a client-side component featuring distinct mobile and desktop UIs. A new Radix UI navigation menu component library is introduced, and dependent layout components are updated to remove header-height-aware styling.

Changes

Cohort / File(s) Summary
Package Dependencies
package.json
Updated dev script to use cross-env for PORT=3002 assignment; added radix-ui runtime and cross-env dev dependencies; upgraded pnpm from 10.32.1 to 10.33.0.
Header & Navigation Components
src/components/header.tsx, src/components/ui/navigation-menu.tsx, src/components/glass.tsx
Converted Header from async server component to client component with mount/hydration gate. Removed HEADER_HEIGHT constant. Added responsive mobile/desktop layouts with hamburger menu toggle, vertical navigation sections, and icon handlers. Introduced new navigation-menu.tsx module wrapping Radix UI primitives with styled component exports. Added bg-white/40 styling to Glass component.
Layout & Dependent Components
src/app/layout.tsx, src/components/home/hero.tsx
Removed HEADER_HEIGHT import and inline CSS variable styling from layout. Updated Hero component height from header-aware calculation (min-h-[calc(100vh-var(--header-height))]) to fixed viewport minimum (min-h-screen).
🚥 Pre-merge checks | ❌ 4

❌ Failed checks (1 warning, 3 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Itasimo/header' is vague and generic, using a branch name format rather than describing the actual changes made to the header component. Use a descriptive title that summarizes the main change, such as 'Redesign header with responsive mobile/desktop layouts and navigation menu' or 'Revert header refactor and implement new UI'.
Linked Issues check ❓ Inconclusive The linked issue #9 lacks description or requirements, making it impossible to validate whether the code changes meet the stated objectives. Review issue #9 for specific requirements and verify that all code changes align with those objectives, or provide the issue description for assessment.
Out of Scope Changes check ❓ Inconclusive Beyond header changes, this PR includes updates to package.json (dependencies, package manager), glass.tsx styling, and hero.tsx layout, which may be unrelated to the core header redesign. Clarify whether dependency updates, glass component styling, and hero section changes are part of the header issue scope, or separate them into distinct PRs.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
src/components/ui/navigation-menu.tsx (1)

59-66: Remove unnecessary empty string literal.

Line 61 contains an empty string {""} that serves no purpose and adds noise to the JSX.

🧹 Proposed fix
     >
       {children}
-      {""}
       <ChevronDownIcon
         className="relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180"
         aria-hidden="true"
       />
     </NavigationMenuPrimitive.Trigger>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/navigation-menu.tsx` around lines 59 - 66, Remove the
unnecessary empty string literal inside the NavigationMenuPrimitive.Trigger
render block — specifically delete the `{""}` between `children` and the
`ChevronDownIcon` in the `navigation-menu.tsx` component; ensure spacing is
handled via CSS or the existing `ml-1` on `ChevronDownIcon` rather than an
inline empty string so only `children` and the `ChevronDownIcon` remain inside
`NavigationMenuPrimitive.Trigger`.
src/components/header.tsx (1)

69-80: Placeholder handlers detected.

These handlers only log to the console. Consider adding a TODO comment or tracking issue to implement the actual functionality (user profile modal, language selector, theme toggle).

Would you like me to open an issue to track implementing these icon button handlers?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 69 - 80, Replace the placeholder
console.log statements in handleUserIconClick, handleGlobeIconClick, and
handleMoonIconClick with actionable TODOs and optional hookup points: add TODO
comments referencing a tracking issue/ID and call prop callbacks if provided
(e.g., onOpenProfile, onOpenLanguageSelector, onToggleTheme) with a safe
fallback to the existing console.log so behavior stays unchanged until
implemented; update the component props/interface to include these callbacks if
not present and ensure handlers call those prop functions (handleUserIconClick →
onOpenProfile, handleGlobeIconClick → onOpenLanguageSelector,
handleMoonIconClick → onToggleTheme) or log the TODO when callbacks are absent.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/glass.tsx`:
- Around line 7-10: The Glass component currently applies a default
semi-transparent background via the class "bg-white/40" which forces a
white-tinted background on all uses (see Glass component's JSX using cn(...,
props.className)); update Glass to remove the hardcoded "bg-white/40" default so
instances inherit their background or explicit overrides (e.g., Input and Select
use "bg-background-blur"); specifically, modify the Glass component's className
construction to only include border, blur and spacing defaults and let callers
supply any background class (or alternatively make the background conditional
based on a prop like "transparent?: boolean"), then ensure header usages (mobile
nav, desktop nav, and dropdown) either pass the appropriate background override
class (e.g., "bg-background-blur") or rely on the new default-less behavior.

In `@src/components/header.tsx`:
- Around line 90-102: The IconButtonsMobile component currently uses Link
href="#" for action handlers which causes unwanted navigation; replace each
<Link href="#"> usage in IconButtonsMobile with a <button type="button">
preserving the onClick handlers (handleUserIconClick, handleGlobeIconClick,
handleMoonIconClick), the aria-labels ("User profile", "Language", "Theme"), and
the existing className and icon children so these are semantic, non-navigating
action buttons and avoid scroll-to-top/browser history effects.
- Around line 104-122: IconButtonsDesktop has invalid Tailwind class names and
uses Link anchors for actions; change each "color-text-primary" to
"text-text-primary" and replace the <Link href="#"> elements inside
NavigationMenuLink asChild with <button type="button"> elements that keep the
same onClick handlers (handleUserIconClick, handleGlobeIconClick,
handleMoonIconClick) and aria-labels, remove any href attributes, and ensure the
button receives the same className={`${removeHoverClass} p-0`} and contains the
FiUser/FiGlobe/FiMoon icons; also remove any now-unused href props passed from
parents (e.g., places that were only supplying href="#" to these icon links).

---

Nitpick comments:
In `@src/components/header.tsx`:
- Around line 69-80: Replace the placeholder console.log statements in
handleUserIconClick, handleGlobeIconClick, and handleMoonIconClick with
actionable TODOs and optional hookup points: add TODO comments referencing a
tracking issue/ID and call prop callbacks if provided (e.g., onOpenProfile,
onOpenLanguageSelector, onToggleTheme) with a safe fallback to the existing
console.log so behavior stays unchanged until implemented; update the component
props/interface to include these callbacks if not present and ensure handlers
call those prop functions (handleUserIconClick → onOpenProfile,
handleGlobeIconClick → onOpenLanguageSelector, handleMoonIconClick →
onToggleTheme) or log the TODO when callbacks are absent.

In `@src/components/ui/navigation-menu.tsx`:
- Around line 59-66: Remove the unnecessary empty string literal inside the
NavigationMenuPrimitive.Trigger render block — specifically delete the `{""}`
between `children` and the `ChevronDownIcon` in the `navigation-menu.tsx`
component; ensure spacing is handled via CSS or the existing `ml-1` on
`ChevronDownIcon` rather than an inline empty string so only `children` and the
`ChevronDownIcon` remain inside `NavigationMenuPrimitive.Trigger`.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1d5df7cc-30bc-407c-8367-c4c56b6c27ae

📥 Commits

Reviewing files that changed from the base of the PR and between ae1e184 and ef4ca0e.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • package.json
  • src/components/glass.tsx
  • src/components/header.tsx
  • src/components/ui/navigation-menu.tsx

coderabbitai bot added a commit that referenced this pull request Apr 3, 2026
Docstrings generation was requested by @itasimo.

* #57 (comment)

The following files were modified:

* `src/components/glass.tsx`
* `src/components/header.tsx`
* `src/components/ui/navigation-menu.tsx`
@PoliNetworkOrg PoliNetworkOrg deleted a comment from coderabbitai bot Apr 3, 2026
Comment on lines +252 to +264
const [mounted, setMounted] = React.useState(false)
const isMobile = useMediaQuery("(max-width: 768px)") // TODO: Adjust breakpoint

React.useEffect(() => {
setMounted(true)
}, [])

// Wait for hydration to prevent flash. Default to mobile layout under the assumption that most traffic is mobile.
if (!mounted) {
return <MobileLayout />
}

return isMobile ? <MobileLayout /> : <DesktopLayout />
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

renderizza entrambi e dai md:hidden a MobileLayout e max-md:hidden a DesktopLayout

Suggested change
const [mounted, setMounted] = React.useState(false)
const isMobile = useMediaQuery("(max-width: 768px)") // TODO: Adjust breakpoint
React.useEffect(() => {
setMounted(true)
}, [])
// Wait for hydration to prevent flash. Default to mobile layout under the assumption that most traffic is mobile.
if (!mounted) {
return <MobileLayout />
}
return isMobile ? <MobileLayout /> : <DesktopLayout />
return <>
<MobileLayout />
<DesktopLayout />
</>

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (3)
src/components/ui/navigation-menu.tsx (1)

59-65: Remove unnecessary empty string literal.

The {""} on line 61 serves no purpose and can be removed.

🧹 Proposed fix
     >
       {children}
-      {""}
       <FiChevronDown
         className="relative top-[1px] ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180"
         aria-hidden="true"
       />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/navigation-menu.tsx` around lines 59 - 65, The JSX contains
an unnecessary empty string literal between the children and the icon in the
NavigationMenuTrigger component; remove the `{""}` so that the block simply
renders `{children}` followed directly by the `<FiChevronDown ... />` element
(refer to the JSX around `children` and the `FiChevronDown` icon in
`navigation-menu.tsx`) and ensure spacing/whitespace is preserved as needed.
src/components/header.tsx (2)

70-80: Console.log statements should be removed or replaced with actual functionality.

These handlers appear to be debug placeholders. Consider removing them or implementing the actual functionality (e.g., opening modals, toggling theme).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 70 - 80, The three click handlers
(handleUserIconClick, handleGlobeIconClick, handleMoonIconClick) currently only
call console.log and should be replaced with real behavior: remove the
console.log calls and either invoke the appropriate prop callbacks or implement
the intended actions (e.g., have handleUserIconClick open the user/profile menu
or call onOpenProfile(), have handleGlobeIconClick open a locale selector or
call onOpenLocale(), and have handleMoonIconClick toggle theme via a theme
context or call toggleTheme()). Locate these functions in
src/components/header.tsx and wire them to the existing props, context methods,
or state-updating logic used elsewhere in the component so the icons perform
their real functions instead of logging.

39-67: All navigation links use placeholder href="#".

The navigation menu data contains only placeholder hrefs. Consider using actual routes or adding a TODO comment to track this work.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 39 - 67, The menu items in
src/components/header.tsx currently have placeholder href="#" values; update
each menu item's href property in the header component's menu arrays (the
objects with title "Resources", "Community", "About" and their nested menu
entries) to point to the actual routes/URLs you intend to use, or if routes are
not ready add a clear TODO comment on each item (e.g., TODO: replace '#' with
'/path') so the missing routes are tracked; ensure you update the href values
for entries like "Materials", "Guides", "Computer Recs", "FAQs", "Rankings",
"Tol Project", "Groups", "Projects", "Freshman", "Associations", "About us",
"Join us", and "Contact us" accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/app/layout.tsx`:
- Line 69: Define the missing CSS variable --header-height so references in
Header (component Header or header.tsx) and the NotFound page (not-found.tsx)
resolve: add a global declaration for --header-height (for example on the body
or :root in layout.tsx or globals.css) with an appropriate value (e.g., height
of the header like 64px or a responsive CSS value) so that class names
max-h-[var(--header-height)] in Header and
min-h-[calc(100dvh-var(--header-height))] in not-found.tsx work correctly;
ensure the variable name exactly matches --header-height and is loaded before
those components render.

In `@src/components/header.tsx`:
- Around line 202-205: The Tailwind class used on the icon's className is
incorrect: replace any occurrence of "color-text-primary" with the correct
Tailwind utility "text-text-primary" (e.g., on the FiChevronDown JSX element and
the other identical class occurrence in this Header component) so the styling
matches the project's pattern; update the className strings in the Header
component where "color-text-primary" appears to "text-text-primary".
- Line 185: The class in NavigationMenu (header.tsx) still uses
max-h-[var(--header-height)] but the --header-height variable was removed from
layout.tsx, so update the class to use a valid height: either swap
var(--header-height) for an existing site variable (e.g.,
var(--site-header-height) if available) or provide a sensible fallback/hardcoded
value (e.g., max-h-[64px] or max-h-[var(--site-header-height,64px)]), ensuring
the change is applied in header.tsx's className string and removing any stale
reliance on --header-height.

---

Nitpick comments:
In `@src/components/header.tsx`:
- Around line 70-80: The three click handlers (handleUserIconClick,
handleGlobeIconClick, handleMoonIconClick) currently only call console.log and
should be replaced with real behavior: remove the console.log calls and either
invoke the appropriate prop callbacks or implement the intended actions (e.g.,
have handleUserIconClick open the user/profile menu or call onOpenProfile(),
have handleGlobeIconClick open a locale selector or call onOpenLocale(), and
have handleMoonIconClick toggle theme via a theme context or call
toggleTheme()). Locate these functions in src/components/header.tsx and wire
them to the existing props, context methods, or state-updating logic used
elsewhere in the component so the icons perform their real functions instead of
logging.
- Around line 39-67: The menu items in src/components/header.tsx currently have
placeholder href="#" values; update each menu item's href property in the header
component's menu arrays (the objects with title "Resources", "Community",
"About" and their nested menu entries) to point to the actual routes/URLs you
intend to use, or if routes are not ready add a clear TODO comment on each item
(e.g., TODO: replace '#' with '/path') so the missing routes are tracked; ensure
you update the href values for entries like "Materials", "Guides", "Computer
Recs", "FAQs", "Rankings", "Tol Project", "Groups", "Projects", "Freshman",
"Associations", "About us", "Join us", and "Contact us" accordingly.

In `@src/components/ui/navigation-menu.tsx`:
- Around line 59-65: The JSX contains an unnecessary empty string literal
between the children and the icon in the NavigationMenuTrigger component; remove
the `{""}` so that the block simply renders `{children}` followed directly by
the `<FiChevronDown ... />` element (refer to the JSX around `children` and the
`FiChevronDown` icon in `navigation-menu.tsx`) and ensure spacing/whitespace is
preserved as needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ed7ef850-8413-4a9a-952a-59527b85f4c5

📥 Commits

Reviewing files that changed from the base of the PR and between d7c731c and 4f89fc3.

📒 Files selected for processing (4)
  • src/app/layout.tsx
  • src/components/header.tsx
  • src/components/home/hero.tsx
  • src/components/ui/navigation-menu.tsx

} as React.CSSProperties
}
>
<body className="overflow-y-scroll">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all remaining usages of --header-height CSS variable
rg -n '\-\-header-height' --type-add 'web:*.{tsx,jsx,ts,js,css,scss}' --type web

Repository: PoliNetworkOrg/web

Length of output: 378


🏁 Script executed:

# Check layout.tsx around line 69 to see the body element
sed -n '60,75p' src/app/layout.tsx

Repository: PoliNetworkOrg/web

Length of output: 665


🏁 Script executed:

# Check if --header-height is defined in CSS/globals files
rg '\-\-header-height\s*:' --type-add 'web:*.{tsx,jsx,ts,js,css,scss}' --type web

Repository: PoliNetworkOrg/web

Length of output: 44


🏁 Script executed:

# Check not-found.tsx to verify the exact line with the usage
sed -n '1,15p' src/app/not-found.tsx

Repository: PoliNetworkOrg/web

Length of output: 862


🏁 Script executed:

# Search in all CSS/SCSS files for --header-height definition
fd -e css -e scss | xargs rg '\-\-header-height' -n

Repository: PoliNetworkOrg/web

Length of output: 46


🏁 Script executed:

# Also check for any style tags or CSS-in-JS that might define it
rg 'style\s*=' src/ -A 2 | head -50

Repository: PoliNetworkOrg/web

Length of output: 44


🏁 Script executed:

# Look for globals.css or similar root style files
fd -e css -e scss | grep -i global

Repository: PoliNetworkOrg/web

Length of output: 84


🏁 Script executed:

# Read globals.css to check if --header-height is defined
cat -n src/styles/globals.css

Repository: PoliNetworkOrg/web

Length of output: 555


🏁 Script executed:

# Check the imported CSS files for --header-height definition
for file in src/styles/{typography,figma,sidebar,charts}.css; do
  echo "=== $file ==="
  cat "$file" | grep -n '\-\-header-height' || echo "Not found"
done

Repository: PoliNetworkOrg/web

Length of output: 225


--header-height CSS variable is undefined but used in multiple places, breaking layout.

The CSS variable --header-height is referenced in two files but never defined anywhere in the codebase:

  • src/components/header.tsx:185: max-h-[var(--header-height)]
  • src/app/not-found.tsx:9: min-h-[calc(100dvh-var(--header-height))]

This undefined variable will cause layout failures in both the header component and the 404 page. Either define the variable (e.g., in layout.tsx body inline styles or globals.css) or remove its usage from these files.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/app/layout.tsx` at line 69, Define the missing CSS variable
--header-height so references in Header (component Header or header.tsx) and the
NotFound page (not-found.tsx) resolve: add a global declaration for
--header-height (for example on the body or :root in layout.tsx or globals.css)
with an appropriate value (e.g., height of the header like 64px or a responsive
CSS value) so that class names max-h-[var(--header-height)] in Header and
min-h-[calc(100dvh-var(--header-height))] in not-found.tsx work correctly;
ensure the variable name exactly matches --header-height and is loaded before
those components render.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (1)
src/components/header/IconButtons.tsx (1)

5-37: Reduce duplicated icon-button markup across mobile and desktop.

Line 5 through Line 37 repeats the same button definitions twice. Consider extracting a shared config array (icon, label, handler) and mapping it in both layouts to avoid drift.

♻️ Suggested direction
+const iconActions = [
+  { key: "user", label: "User profile", Icon: FiUser, onClick: handleUserIconClick },
+  { key: "globe", label: "Language", Icon: FiGlobe, onClick: handleGlobeIconClick },
+  { key: "moon", label: "Theme", Icon: FiMoon, onClick: handleMoonIconClick },
+]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header/IconButtons.tsx` around lines 5 - 37, Refactor the
duplicated button markup in IconButtonsMobile and IconButtonsDesktop by creating
a shared array of icon-button configs (e.g., items = [{ key: 'user', Icon:
FiUser, label: 'User profile', onClick: handleUserIconClick }, ...]) and map
over it in both components; in IconButtonsMobile render plain <button> elements
using each config, and in IconButtonsDesktop wrap each mapped button with
NavigationMenuLink (preserving the removeHoverClass prop for the wrapper) so the
handlers (handleUserIconClick, handleGlobeIconClick, handleMoonIconClick),
labels, and icons are driven by the single source of truth to eliminate
duplication.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/header/DesktopLayout.tsx`:
- Around line 52-74: The <ul> in DesktopLayout's submenu maps item.menu but
renders <Glass> / <NavigationMenuLink> directly, breaking semantics; wrap each
mapped submenu entry in an <li> and move the key to the <li> (e.g., use
subItem.title or href for uniqueness), then render <Glass> containing the
<NavigationMenuLink> (or vice versa) inside that <li>; ensure you keep the
existing classNames and the Icon usage (subItem.icon) and that Link remains the
clickable element so accessibility and semantics are preserved.

In `@src/components/header/handlers.ts`:
- Around line 1-11: The three handlers (handleUserIconClick,
handleGlobeIconClick, handleMoonIconClick) currently only log to console;
replace these no-ops with real flows: call the auth modal opener (e.g., invoke
openAuthModal or dispatch an "openAuth" event) inside handleUserIconClick,
trigger the locale switcher (e.g., call switchLocale or openLocalePicker) inside
handleGlobeIconClick, and toggle theme state (e.g., call toggleTheme or
updateThemePreference) inside handleMoonIconClick; if those functions/hooks
aren’t available yet, instead wire the handlers to disable or hide the
corresponding controls by dispatching a UI-disable action or returning a boolean
to the parent so the controls are not interactive until implemented.

In `@src/components/header/MobileLayout.tsx`:
- Line 20: The menu toggle button in MobileLayout.tsx currently removes focus
styling via the "focus:outline-none" utility; change this to provide an
accessible visible focus indicator (e.g., use a focus-visible ring/border
utility instead) so keyboard users can see focus. Update the className on the
toggle element (the one containing "ml-auto focus:outline-none") to remove
"focus:outline-none" and add a focus-visible style such as "focus-visible:ring-2
focus-visible:ring-indigo-500" (or your design system's equivalent) so the
button shows a clear focus ring when keyboard-focused.
- Around line 39-44: In MobileLayout.tsx replace the raw <a> used for menu items
(using subItem.href and subItem.title) with Next.js Link: import Link from
'next/link' and render <Link href={subItem.href}
className="...">{subItem.title}</Link> to enable client-side navigation and
prefetching; preserve the existing className and accessibility behavior and, if
subItem.href can be external, keep a fallback to render a plain <a> with
target="_blank" rel="noopener noreferrer" for external URLs.

---

Nitpick comments:
In `@src/components/header/IconButtons.tsx`:
- Around line 5-37: Refactor the duplicated button markup in IconButtonsMobile
and IconButtonsDesktop by creating a shared array of icon-button configs (e.g.,
items = [{ key: 'user', Icon: FiUser, label: 'User profile', onClick:
handleUserIconClick }, ...]) and map over it in both components; in
IconButtonsMobile render plain <button> elements using each config, and in
IconButtonsDesktop wrap each mapped button with NavigationMenuLink (preserving
the removeHoverClass prop for the wrapper) so the handlers (handleUserIconClick,
handleGlobeIconClick, handleMoonIconClick), labels, and icons are driven by the
single source of truth to eliminate duplication.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9cda9907-32ec-4e4c-9039-2fdead7fd976

📥 Commits

Reviewing files that changed from the base of the PR and between 4f89fc3 and 4342c64.

📒 Files selected for processing (11)
  • src/components/header.tsx
  • src/components/header/DesktopLayout.tsx
  • src/components/header/IconButtons.tsx
  • src/components/header/Logo.tsx
  • src/components/header/MobileLayout.tsx
  • src/components/header/constants.ts
  • src/components/header/handlers.ts
  • src/components/header/index.tsx
  • src/components/header/types.ts
  • src/components/ui/navigation-menu.tsx
  • src/lib/utils.ts
💤 Files with no reviewable changes (1)
  • src/components/header.tsx
✅ Files skipped from review due to trivial changes (4)
  • src/components/header/Logo.tsx
  • src/lib/utils.ts
  • src/components/header/constants.ts
  • src/components/header/types.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/components/ui/navigation-menu.tsx

Comment on lines +1 to +11
export function handleUserIconClick() {
console.log("User icon clicked")
}

export function handleGlobeIconClick() {
console.log("Globe icon clicked")
}

export function handleMoonIconClick() {
console.log("Moon icon clicked")
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Icon actions are currently no-op in production behavior.

Line 1 through Line 11 only log to console; user/profile/language/theme controls won’t execute real actions. Please wire these handlers to actual flows (open auth modal, locale switcher, theme toggle) or disable/hide the controls until implemented.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header/handlers.ts` around lines 1 - 11, The three handlers
(handleUserIconClick, handleGlobeIconClick, handleMoonIconClick) currently only
log to console; replace these no-ops with real flows: call the auth modal opener
(e.g., invoke openAuthModal or dispatch an "openAuth" event) inside
handleUserIconClick, trigger the locale switcher (e.g., call switchLocale or
openLocalePicker) inside handleGlobeIconClick, and toggle theme state (e.g.,
call toggleTheme or updateThemePreference) inside handleMoonIconClick; if those
functions/hooks aren’t available yet, instead wire the handlers to disable or
hide the corresponding controls by dispatching a UI-disable action or returning
a boolean to the parent so the controls are not interactive until implemented.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (4)
src/components/header.tsx (4)

104-120: ⚠️ Potential issue | 🟡 Minor

Replace the action anchors here, and fix the invalid text class.

This block has the same Link href="#" problem, and color-text-primary is not a valid Tailwind utility, so the icons will miss their intended color styling.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 104 - 120, The IconButtonsDesktop
component uses placeholder anchors and a non-existent Tailwind class: replace
the Link href="#" anchors used in NavigationMenuLink children with button
elements (or Link components with role/button behavior) that call the handlers
directly (e.g., handleUserIconClick, handleGlobeIconClick, handleMoonIconClick)
to avoid empty-hash navigation, and change the className on the icons from
"color-text-primary" to a valid Tailwind color utility (e.g., "text-primary" or
"text-gray-700" depending on your design token) so the icons render with the
intended color.

196-205: ⚠️ Potential issue | 🟡 Minor

Fix the invalid Tailwind class on the desktop menu icons.

color-text-primary is not a valid utility on either the trigger chevron or the submenu item icons, so those icons will not inherit the intended theme color.

Also applies to: 213-223

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 196 - 205, The chevron and submenu
icons use an invalid Tailwind utility "color-text-primary"; update the icon
classNames to use the correct utility "text-text-primary" so they inherit the
theme color: change the FiChevronDown className and any submenu item icon
className(s) in this component (the NavigationMenuTrigger block and the submenu
icon elements around the later block) from "color-text-primary" to
"text-text-primary".

90-100: ⚠️ Potential issue | 🟡 Minor

Use buttons for non-navigation icon actions.

These handlers do not navigate. Keeping them on Link href="#" will still mutate the hash and can scroll the page to the top.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 90 - 100, The icon elements in
IconButtonsMobile use Link with href="#" but they are action buttons
(handleUserIconClick, handleGlobeIconClick, handleMoonIconClick) and should not
perform navigation; replace each Link href="#" with a semantic <button
type="button"> element (preserve aria-label, className and onClick handlers) so
clicking doesn't mutate the URL or scroll, and remove or update any unused Link
import if necessary.

183-185: ⚠️ Potential issue | 🟡 Minor

Remove the stale --header-height reference.

This class still depends on var(--header-height), but that variable was removed with the old header-height plumbing. On this branch it resolves to an undefined custom property again.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/header.tsx` around lines 183 - 185, The NavigationMenu's
className contains the stale max-h-[var(--header-height)] reference which now
resolves to undefined; remove that fragment from the className on the
NavigationMenu component and replace it with a concrete height (e.g., a Tailwind
utility like max-h-16 / max-h-20) or reference the new header height
constant/CSS variable used across the codebase (instead of --header-height) so
the component no longer depends on the removed custom property.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/header.tsx`:
- Around line 83-87: The Logo component does not accept or forward props/ref,
which breaks NavigationMenuLink's asChild behavior; update Logo to forward refs
and spread incoming props onto the underlying Link (i.e., convert Logo to a
React.forwardRef that accepts (props, ref) and applies ref={ref} and {...props}
to the Link element) or remove the wrapper and inline the Link where
NavigationMenuLink uses asChild so that NavigationMenuLink can clone and style
the element correctly; target the Logo function and the NavigationMenuLink usage
to implement the fix.

---

Duplicate comments:
In `@src/components/header.tsx`:
- Around line 104-120: The IconButtonsDesktop component uses placeholder anchors
and a non-existent Tailwind class: replace the Link href="#" anchors used in
NavigationMenuLink children with button elements (or Link components with
role/button behavior) that call the handlers directly (e.g.,
handleUserIconClick, handleGlobeIconClick, handleMoonIconClick) to avoid
empty-hash navigation, and change the className on the icons from
"color-text-primary" to a valid Tailwind color utility (e.g., "text-primary" or
"text-gray-700" depending on your design token) so the icons render with the
intended color.
- Around line 196-205: The chevron and submenu icons use an invalid Tailwind
utility "color-text-primary"; update the icon classNames to use the correct
utility "text-text-primary" so they inherit the theme color: change the
FiChevronDown className and any submenu item icon className(s) in this component
(the NavigationMenuTrigger block and the submenu icon elements around the later
block) from "color-text-primary" to "text-text-primary".
- Around line 90-100: The icon elements in IconButtonsMobile use Link with
href="#" but they are action buttons (handleUserIconClick, handleGlobeIconClick,
handleMoonIconClick) and should not perform navigation; replace each Link
href="#" with a semantic <button type="button"> element (preserve aria-label,
className and onClick handlers) so clicking doesn't mutate the URL or scroll,
and remove or update any unused Link import if necessary.
- Around line 183-185: The NavigationMenu's className contains the stale
max-h-[var(--header-height)] reference which now resolves to undefined; remove
that fragment from the className on the NavigationMenu component and replace it
with a concrete height (e.g., a Tailwind utility like max-h-16 / max-h-20) or
reference the new header height constant/CSS variable used across the codebase
(instead of --header-height) so the component no longer depends on the removed
custom property.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 36013437-6940-44ad-bc7d-7d380bed21f9

📥 Commits

Reviewing files that changed from the base of the PR and between 4342c64 and ab5de01.

📒 Files selected for processing (2)
  • src/components/header.tsx
  • src/components/ui/navigation-menu.tsx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Header component

2 participants