Skip to content

Feature/home header polish#24

Merged
nitinmohan18 merged 6 commits into
mainfrom
feature/home-header-polish
Jun 28, 2026
Merged

Feature/home header polish#24
nitinmohan18 merged 6 commits into
mainfrom
feature/home-header-polish

Conversation

@nitinmohan18

@nitinmohan18 nitinmohan18 commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator

Pull Request

Summary

Redesigned the Header and Footer to deliver a cleaner, more modern, and premium user experience while preserving the existing functionality and responsiveness.

Highlights

  • Redesigned the Header with improved navigation, spacing, and visual hierarchy.
  • Redesigned the Footer with a premium SaaS-inspired layout.
  • Added a dedicated Light Mode footer while preserving the existing Dark Mode design.
  • Improved typography, spacing, alignment, and overall UI consistency.
  • Maintained responsive behavior and existing functionality.

Related Issue

Closes #


Type of Change

  • Feature
  • Bug Fix
  • Documentation
  • Refactor
  • Performance Improvement
  • CI / Build
  • Other

What Changed?

Header

  • Redesigned navigation layout.
  • Improved spacing and alignment.
  • Enhanced button styling.
  • Improved responsive behavior.

Footer

  • Redesigned footer layout.
  • Added premium Light Mode styling.
  • Preserved existing Dark Mode appearance.
  • Improved visual hierarchy.
  • Enhanced spacing and typography.
  • Refined feature cards and bottom information bar.

Checklist

  • My code follows the project's coding standards.
  • I have tested my changes locally.
  • I have verified the changes in both Light Mode and Dark Mode.
  • I have tested responsive layouts.
  • I have reviewed my own code.
  • No existing functionality has been broken.
  • No unnecessary files or code were added.

Testing

  • Desktop
  • Mobile
  • Light Mode
  • Dark Mode
  • Responsive Layout
  • Hover States & Animations

Screenshots

Updated screenshots of the redesigned Header and Footer have been included.


Notes

This PR contains UI/UX improvements only. No business logic or application functionality has been modified.

@vercel

vercel Bot commented Jun 28, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyper-learning-tech Ready Ready Preview, Comment Jun 28, 2026 3:05pm

@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Global CSS gains a Tailwind dark custom variant and badge-shimmer animation. Navbar adds active-section scroll tracking with a click-scroll guard. Hero introduces an animated Counter component and restyles the chat mockup. Footer is rebuilt as a client component with interactive SocialDropdown menus. Universities swaps hard-coded classes for theme tokens.

Changes

Landing Page UI Overhaul

Layer / File(s) Summary
Global CSS: dark variant and badge shimmer
app/globals.css
Adds @custom-variant dark targeting .dark descendants and defines badge-shimmer keyframes plus .badge-shimmer / .dark .badge-shimmer classes.
Navbar: active-section tracking
components/navbar.tsx
Adds usePathname, activeSection state, and isClickScrolling ref; rewrites scroll handler to detect the visible section; enhances handleNavClick to smooth-scroll and retry on missing element; overhauls desktop and mobile nav rendering to use isActive.
Hero: animated Counter and mockup restyling
features/landing/hero.tsx
Rewrites Counter using framer-motion useInView/animate; updates badge, headline, and CTA styling; replaces static stats with the animated counter grid; restyles the chat mockup (ping-dot, bubble borders, questions card, input box).
Footer: interactive social dropdowns and layout rebuild
components/footer.tsx
Converts to a client component; adds SVG icon components and SocialDropdown with outside-click detection; rebuilds brand block, navigation columns, feature cards grid, and bottom bar with per-network dropdown menus.
Universities: theme-token restyling
features/landing/universities.tsx
Replaces white-based Tailwind classes with border-border, bg-background, bg-card, and bg-muted tokens across the pill, search bar, cards, and branch chips.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • imuniqueshiv/HyperLearningTech#8: Modifies components/footer.tsx footer navigation links, overlapping with the footer rebuild in this PR.
  • imuniqueshiv/HyperLearningTech#16: Directly modifies features/landing/universities.tsx card styling and "Coming Soon"/"Available" class logic, the same area this PR retokens.
  • imuniqueshiv/HyperLearningTech#21: Touches the same files (app/globals.css, components/navbar.tsx, features/landing/hero.tsx, features/landing/universities.tsx) with matching changes (dark variant, badge shimmer, activeSection tracking, animated counter).

Suggested reviewers

  • imuniqueshiv
  • RamuuXfree

Poem

🐇 Hop, hop, the navbar knows where you scroll,
The hero now counts with an animated soul,
The footer sprouts dropdowns for networks galore,
Dark shimmer on badges — what could there be more?
With theme tokens swapped and the mockup reborn,
This rabbit ships pixels from dusk until morn! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and clearly related to the main UI polish work, especially the home header redesign.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/home-header-polish

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🧹 Nitpick comments (1)
components/footer.tsx (1)

57-66: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add disclosure semantics to the dropdown toggle.

The button controls a popup menu but only exposes aria-label. Adding aria-expanded (and aria-haspopup) lets assistive tech announce the open/closed state.

♿ Proposed change
       <button
         onClick={(e) => {
           e.preventDefault();
           setIsOpen(!isOpen);
         }}
         aria-label={label}
+        aria-haspopup="menu"
+        aria-expanded={isOpen}
         className={btnClasses}
       >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/footer.tsx` around lines 57 - 66, The dropdown toggle in the
footer button only exposes an aria-label, so assistive tech cannot tell it
controls a menu or whether it is open. Update the button in the footer component
to include disclosure semantics by adding aria-haspopup and aria-expanded,
driven by the current isOpen state alongside the existing onClick toggle. Keep
the existing label and Icon usage, and ensure the button remains the control for
opening and closing the popup menu.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@components/footer.tsx`:
- Around line 11-29: The icon components in GithubIcon, LinkedinIcon,
TwitterIcon, InstagramIcon, and YoutubeIcon currently use an explicit any for
props, which triggers lint errors. Update each icon component’s props type to
React.SVGProps<SVGSVGElement> so the spread attributes are correctly typed and
no `@typescript-eslint/no-explicit-any` violations remain.
- Around line 31-90: The SocialDropdown component is using explicit any for its
props and link items, which triggers no-explicit-any and removes type safety.
Add a typed props interface for SocialDropdown and a specific link type, then
update the component signature and the links.map callback in SocialDropdown so
Icon, label, links, size, and hoverClass are all strongly typed. Keep the fix
localized to SocialDropdown and its link rendering so call sites inherit proper
checking.

In `@components/navbar.tsx`:
- Around line 103-115: The navbar hash-navigation logic is racing the route
change because it uses a fixed 100ms retry after pushing to “/”, which can miss
scrolling and drop the requested hash from the URL. Update the navigation in
navbar.tsx so the click handler pushes the full href directly, or move the
scroll logic into a route-change effect that waits for the target element after
navigation. Keep the scroll behavior and active section updates in the existing
navbar click/scroll flow, but remove the one-shot timeout-based retry.

In `@features/landing/universities.tsx`:
- Around line 147-149: The available university card is styled as clickable but
still uses a non-interactive motion container, so keyboard users can’t activate
it. Update the card rendering in universities.tsx so the available state uses a
semantic interactive element via the existing motion wrapper, such as a Link- or
button-backed component, and keep the non-available state non-interactive. Use
the card’s existing click/navigation logic and the university.status check to
locate the conditional rendering around the motion.div.
- Around line 123-125: The search icon container in the universities landing
component is styled like an interactive control even though it has no behavior
or keyboard support. Update the element in the universities UI around the Search
icon to either become a real button with an accessible aria-label and proper
interaction handling, or remove the cursor/hover/active affordances and keep it
decorative. Use the surrounding search icon wrapper and Search component as the
anchors when refactoring.

---

Nitpick comments:
In `@components/footer.tsx`:
- Around line 57-66: The dropdown toggle in the footer button only exposes an
aria-label, so assistive tech cannot tell it controls a menu or whether it is
open. Update the button in the footer component to include disclosure semantics
by adding aria-haspopup and aria-expanded, driven by the current isOpen state
alongside the existing onClick toggle. Keep the existing label and Icon usage,
and ensure the button remains the control for opening and closing the popup
menu.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 1bd36331-3456-48fa-a172-eae5a2372f55

📥 Commits

Reviewing files that changed from the base of the PR and between daeba23 and 5a3fd7a.

📒 Files selected for processing (5)
  • app/globals.css
  • components/footer.tsx
  • components/navbar.tsx
  • features/landing/hero.tsx
  • features/landing/universities.tsx

Comment thread components/footer.tsx Outdated
Comment thread components/footer.tsx Outdated
Comment thread components/navbar.tsx
Comment on lines 103 to 115
// If element not found, navigate to home and then scroll
router.push("/");
setTimeout(() => {
const el = document.getElementById(targetId);
if (el) {
isClickScrolling.current = true;
setActiveSection(href);
el.scrollIntoView({ behavior: "smooth", block: "start" });
setTimeout(() => {
isClickScrolling.current = false;
}, 800);
}
}, 100);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map the navbar file and nearby navigation logic
ast-grep outline components/navbar.tsx --view expanded || true

# Show the relevant section with line numbers
sed -n '1,220p' components/navbar.tsx | cat -n

# Find any route-change / hash-scroll handling elsewhere in the repo
rg -n "scrollIntoView|hash|router\.push\(|setTimeout\(\(\) => \{[^}]*getElementById|activeSection|isClickScrolling" . -g '!node_modules' -g '!dist' -g '!build'

Repository: imuniqueshiv/HyperLearningTech

Length of output: 12936


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the landing page and section mounting around the known scroll targets
sed -n '1,180p' features/landing/hero.tsx | cat -n

# Locate the root page composition to see when Home/Universities exist
fd -a 'page.tsx' . | sed 's#^\./##'
rg -n 'Home|Universities|features/landing/hero|university-hero' app components features -g '!node_modules' -g '!dist' -g '!build'

Repository: imuniqueshiv/HyperLearningTech

Length of output: 11031


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,120p' app/(public)/page.tsx | cat -n
sed -n '1,120p' features/landing/universities.tsx | cat -n

Repository: imuniqueshiv/HyperLearningTech

Length of output: 221


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '1,120p' 'app/(public)/page.tsx' | cat -n
sed -n '1,180p' features/landing/universities.tsx | cat -n

Repository: imuniqueshiv/HyperLearningTech

Length of output: 10995


Avoid the fixed-delay hash retry. Navigating to / and checking once after 100ms races the route change, so the scroll can be skipped on slower transitions, and the requested hash is dropped from the URL. Push href directly or move the scroll into a route-change effect instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/navbar.tsx` around lines 103 - 115, The navbar hash-navigation
logic is racing the route change because it uses a fixed 100ms retry after
pushing to “/”, which can miss scrolling and drop the requested hash from the
URL. Update the navigation in navbar.tsx so the click handler pushes the full
href directly, or move the scroll logic into a route-change effect that waits
for the target element after navigation. Keep the scroll behavior and active
section updates in the existing navbar click/scroll flow, but remove the
one-shot timeout-based retry.

Comment on lines +123 to +125
<div className="group/lens relative mr-1 flex h-11 w-11 shrink-0 items-center justify-center rounded-full border border-border/50 bg-muted/50 text-muted-foreground transition-all duration-500 hover:scale-[1.03] hover:border-border hover:bg-muted hover:text-foreground hover:shadow-sm cursor-pointer active:scale-95 overflow-hidden">
<div className="absolute inset-0 rounded-full shadow-[inset_0_1px_1px_rgba(0,0,0,0.05)] dark:shadow-[inset_0_1px_1px_rgba(255,255,255,0.4)] pointer-events-none" />
<Search className="relative z-10 h-[18px] w-[18px] transition-transform duration-300 group-hover/lens:scale-[1.05]" />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove the fake button affordance from the search icon.

Lines 123-125 style this div like a clickable control (cursor-pointer, hover, active state), but it has no action or keyboard support. That makes the search UI misleading. Either convert it to a real button with an aria-label, or drop the interactive styling and keep it purely decorative.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@features/landing/universities.tsx` around lines 123 - 125, The search icon
container in the universities landing component is styled like an interactive
control even though it has no behavior or keyboard support. Update the element
in the universities UI around the Search icon to either become a real button
with an accessible aria-label and proper interaction handling, or remove the
cursor/hover/active affordances and keep it decorative. Use the surrounding
search icon wrapper and Search component as the anchors when refactoring.

Comment on lines +147 to 149
className={`group relative flex flex-col overflow-hidden rounded-3xl border border-border/50 dark:border-white/10 bg-card dark:bg-gradient-to-b dark:from-white/5 dark:to-transparent p-5 shadow-lg dark:shadow-2xl backdrop-blur-xl transition-all duration-500 hover:-translate-y-[5.5px] hover:border-blue-400/30 hover:shadow-[0_0_15px_rgba(59,130,246,0.15)] dark:hover:border-blue-400/30 dark:hover:shadow-[0_0_15px_rgba(59,130,246,0.2)] ${
university.status === "Available" ? "cursor-pointer" : ""
}`}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use a semantic interactive element for available cards.

Lines 147-149 add a clickable affordance, but the card still navigates via onClick on a motion.div, so keyboard users cannot open an available university. Render available cards as a Link/button-backed motion component instead of styling a non-interactive container as clickable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@features/landing/universities.tsx` around lines 147 - 149, The available
university card is styled as clickable but still uses a non-interactive motion
container, so keyboard users can’t activate it. Update the card rendering in
universities.tsx so the available state uses a semantic interactive element via
the existing motion wrapper, such as a Link- or button-backed component, and
keep the non-available state non-interactive. Use the card’s existing
click/navigation logic and the university.status check to locate the conditional
rendering around the motion.div.

@nitinmohan18 nitinmohan18 merged commit f7b165f into main Jun 28, 2026
4 of 5 checks passed
@github-actions

Copy link
Copy Markdown

🎉 Congratulations @nitinmohan18!

Thank you for contributing to HyperLearningTech.

Your pull request has been successfully merged into main.

📦 Merge Summary

🚀 Keep Contributing

  • Follow the CONTRIBUTING.md guidelines.
  • Keep each Pull Request focused on a single feature or fix.
  • Run formatting, linting, type checking, and a production build before opening a PR.

Thank you for helping make HyperLearningTech better.

Happy Coding! 🚀

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.

2 participants