shwo active page

This commit is contained in:
libertyoms
2025-05-18 09:39:57 +02:00
parent e2347ecc87
commit ec3f4a51dc
3 changed files with 282 additions and 174 deletions

View File

@ -157,20 +157,44 @@ const Footer = () => {
</p> </p>
<form className="flex flex-col sm:flex-row gap-2"> <form className="flex flex-col sm:flex-row gap-2">
{/* Input needs dark background styles */} {/* Input needs dark background styles */}
<input <div className="relative">
type="email" <input
placeholder="Enter your email" type="email"
aria-label="Email for newsletter" placeholder="Enter your email"
// Use dark variable for input bg/border, bright for text aria-label="Email for newsletter"
className="flex-grow px-4 py-2 rounded-lg bg-[var(--dark-input)] border border-[var(--dark-border)] text-[var(--dark-foreground)] placeholder:text-[var(--dark-muted-foreground)] focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]" // Ring offset needs dark bg className="
/> w-full
{/* Keep button styling primary */} pr-24
<button
type="submit" px-4 py-2
className="bg-primary text-primary-foreground px-4 py-2 rounded-lg font-semibold hover:bg-opacity-90 transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]" // Ring offset needs dark bg rounded-lg
> bg-[var(--dark-input)]
Subscribe border border-[var(--dark-border)]
</button> text-[var(--dark-foreground)]
placeholder:text-[var(--dark-muted-foreground)]
focus:outline-none focus:ring-2 focus:ring-ring
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
"
/>
<button
type="submit"
className="
absolute top-0 right-0
h-full
px-4
rounded-r-lg
bg-primary
text-primary-foreground
font-semibold
hover:bg-opacity-90
transition-colors
focus:outline-none focus:ring-2 focus:ring-ring
focus:ring-offset-2 focus:ring-offset-[var(--oms-black)]
"
>
Subscribe
</button>
</div>
</form> </form>
{/* Badges - Use a subtle dark bg */} {/* Badges - Use a subtle dark bg */}
<div className="mt-6 space-x-2 sm:space-x-4"> <div className="mt-6 space-x-2 sm:space-x-4">

View File

@ -1,22 +1,13 @@
// components/Header.tsx (Server Component) // components/Header.tsx (Server Component)
import React from "react"; import React from "react";
import { auth } from "@/auth"; // Only need auth (for session) from here now
import HeaderClient from "./HeaderClient"; import HeaderClient from "./HeaderClient";
import { handleSignInAction, handleSignOutAction } from "@/actions/auth-action";
const Header = async () => { const Header = async () => {
// Fetch session data on the server // Fetch session data on the server
const session = await auth();
// Pass the session data and YOUR Server Actions as props // Pass the session data and YOUR Server Actions as props
return ( return <HeaderClient />;
<HeaderClient
session={session}
handleSignIn={handleSignInAction} // Pass YOUR sign-in Server Action
handleSignOut={handleSignOutAction} // Pass YOUR sign-out Server Action
/>
);
}; };
export default Header; export default Header;

View File

@ -4,6 +4,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import Link from "next/link"; import Link from "next/link";
import Image from "next/image"; import Image from "next/image";
import { usePathname } from "next/navigation"; // Import usePathname
import { import {
FiChevronDown, FiChevronDown,
FiClipboard, FiClipboard,
@ -54,6 +55,20 @@ const HeaderClient = () => {
const handleJoinUsMouseEnter = () => setJoinUsDropdownOpen(true); const handleJoinUsMouseEnter = () => setJoinUsDropdownOpen(true);
const handleJoinUsMouseLeave = () => setJoinUsDropdownOpen(false); const handleJoinUsMouseLeave = () => setJoinUsDropdownOpen(false);
const pathname = usePathname(); // Get current path
// Helper function to check if a path is active (exact match for simple links, startsWith for base paths)
const isActive = (href: string, exact = false) => {
if (exact) {
return pathname === href;
}
// Handle root path specifically
if (href === "/") {
return pathname === "/";
}
return pathname.startsWith(href);
};
const megaMenuTriggerClasses = ` const megaMenuTriggerClasses = `
relative inline-flex items-center text-sm font-medium text-primary-foreground relative inline-flex items-center text-sm font-medium text-primary-foreground
hover:opacity-90 transition-opacity duration-150 ease-in-out pb-1 hover:opacity-90 transition-opacity duration-150 ease-in-out pb-1
@ -94,25 +109,41 @@ const HeaderClient = () => {
<nav className="hidden md:flex items-center space-x-6 lg:space-x-8"> <nav className="hidden md:flex items-center space-x-6 lg:space-x-8">
<Link <Link
href="/" href="/"
className="text-sm font-medium text-foreground/80 hover:text-primary transition" className={`text-sm font-medium transition ${
isActive("/")
? "text-primary"
: "text-foreground/80 hover:text-primary"
}`} // Apply active class
> >
Home Home
</Link> </Link>
<Link <Link
href="/tech-talk" href="/tech-talk"
className="text-sm font-medium text-foreground/80 hover:text-primary transition" className={`text-sm font-medium transition ${
isActive("/tech-talk")
? "text-primary"
: "text-foreground/80 hover:text-primary"
}`} // Apply active class
> >
Tech Talk Tech Talk
</Link> </Link>
<Link <Link
href="/about" href="/about"
className="text-sm font-medium text-foreground/80 hover:text-primary transition" className={`text-sm font-medium transition ${
isActive("/about")
? "text-primary"
: "text-foreground/80 hover:text-primary"
}`} // Apply active class
> >
About Us About Us
</Link> </Link>
<Link <Link
href="/contact" href="/contact"
className="text-sm font-medium text-foreground/80 hover:text-primary transition" className={`text-sm font-medium transition ${
isActive("/contact")
? "text-primary"
: "text-foreground/80 hover:text-primary"
}`} // Apply active class
> >
Contact Us Contact Us
</Link> </Link>
@ -153,168 +184,230 @@ const HeaderClient = () => {
<div className="bg-primary relative"> <div className="bg-primary relative">
<div className="container mx-auto px-4 sm:px-6 lg:px-8"> <div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="hidden md:flex justify-between items-center h-12"> <div className="hidden md:flex justify-between items-center h-12">
<nav className="flex items-center space-x-8 lg:space-x-10"> {/* Wrap nav and link in a flex container */}
{/* Services */} <div className="flex items-center space-x-8 lg:space-x-10">
<div <nav className="flex items-center space-x-8 lg:space-x-10">
className="group" {/* Services */}
onMouseEnter={handleServicesMouseEnter}
onMouseLeave={handleServicesMouseLeave}
>
<button className={megaMenuTriggerClasses}>
Services
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
</button>
<div <div
className={` className={`group ${isActive("/services") ? "active" : ""}`} // Add active class to group
absolute left-0 top-full w-full shadow-lg z-40 onMouseEnter={handleServicesMouseEnter}
bg-card border-x border-b border-border rounded-b-lg onMouseLeave={handleServicesMouseLeave}
opacity-0 invisible translate-y-[-10px]
${
servicesDropdownOpen
? "opacity-100 visible translate-y-0"
: ""
}
transition-all duration-300 ease-out transform
`}
> >
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5"> <button
<div className="grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-6"> className={`${megaMenuTriggerClasses} ${
<Link isActive("/services") ? "after:w-full" : ""
href="/services/resource-augmentation" }`}
className={megaMenuItemClasses} >
> {" "}
<FiUsers className={megaMenuIconClasses} /> {/* Apply underline based on active state */}
<div className={megaMenuTextWrapperClasses}> Services
<p className={megaMenuTitleClasses}> <FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
Resource Augmentation </button>
</p> <div
</div> className={`
</Link> absolute left-0 top-full w-full shadow-lg z-40
<Link bg-card border-x border-b border-border rounded-b-lg
href="/services/project-management" opacity-0 invisible translate-y-[-10px]
className={megaMenuItemClasses} ${
> servicesDropdownOpen
<FiBriefcase className={megaMenuIconClasses} /> ? "opacity-100 visible translate-y-0"
<div className={megaMenuTextWrapperClasses}> : ""
<p className={megaMenuTitleClasses}> }
Project Management transition-all duration-300 ease-out transform
</p> `}
</div> >
</Link> <div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
<Link <div className="grid grid-cols-1 md:grid-cols-3 gap-x-8 gap-y-6">
href="/services/product-development" <Link
className={megaMenuItemClasses} href="/services/resource-augmentation"
> className={`${megaMenuItemClasses} ${
<FiCpu className={megaMenuIconClasses} /> isActive("/services/resource-augmentation")
<div className={megaMenuTextWrapperClasses}> ? "text-primary"
<p className={megaMenuTitleClasses}> : ""
Product Development }`} // Apply active class
</p> >
</div> <FiUsers className={megaMenuIconClasses} />
</Link> <div className={megaMenuTextWrapperClasses}>
</div> <p className={megaMenuTitleClasses}>
<div className="mt-6 pt-4 border-t border-border flex justify-end"> Resource Augmentation
<Link </p>
href="/services" </div>
className="flex items-center text-sm font-medium text-primary hover:underline" </Link>
> <Link
Explore All Services href="/services/project-management"
<FiArrowRight className="w-4 h-4 ml-1" /> className={`${megaMenuItemClasses} ${
</Link> isActive("/services/project-management")
? "text-primary"
: ""
}`} // Apply active class
>
<FiBriefcase className={megaMenuIconClasses} />
<div className={megaMenuTextWrapperClasses}>
<p className={megaMenuTitleClasses}>
Project Management
</p>
</div>
</Link>
<Link
href="/services/product-development"
className={`${megaMenuItemClasses} ${
isActive("/services/product-development")
? "text-primary"
: ""
}`} // Apply active class
>
<FiCpu className={megaMenuIconClasses} />
<div className={megaMenuTextWrapperClasses}>
<p className={megaMenuTitleClasses}>
Product Development
</p>
</div>
</Link>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> {/* Products */}
{/* Products */}
<div
className="group"
onMouseEnter={handleProductsMouseEnter}
onMouseLeave={handleProductsMouseLeave}
>
<button className={megaMenuTriggerClasses}>
Products
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
</button>
<div <div
className={` className={`group ${isActive("/obse") ? "active" : ""}`} // Add active class to group
absolute left-0 top-full w-full shadow-lg z-1000 onMouseEnter={handleProductsMouseEnter}
bg-card border-x border-b border-border rounded-b-lg onMouseLeave={handleProductsMouseLeave}
opacity-0 invisible translate-y-[-10px]
${
productsDropdownOpen
? "opacity-100 visible translate-y-0"
: ""
}
transition-all duration-300 ease-out transform
`}
> >
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5"> <button
<div className="max-w-md"> className={`${megaMenuTriggerClasses} ${
<Link href="/obse" className={megaMenuItemClasses}> isActive("/obse") ? "after:w-full" : ""
<FiBox className={megaMenuIconClasses} /> }`}
<div className={megaMenuTextWrapperClasses}> >
<p className={megaMenuTitleClasses}>OBSE Platform</p> {" "}
</div> {/* Apply underline based on active state */}
</Link> Products
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
</button>
<div
className={`
absolute left-0 top-full w-full shadow-lg z-1000
bg-card border-x border-b border-border rounded-b-lg
opacity-0 invisible translate-y-[-10px]
${
productsDropdownOpen
? "opacity-100 visible translate-y-0"
: ""
}
transition-all duration-300 ease-out transform
`}
>
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
<div className="max-w-md">
<Link
href="/obse"
className={`${megaMenuItemClasses} ${
isActive("/obse") ? "text-primary" : ""
}`}
>
{" "}
{/* Apply active class */}
<FiBox className={megaMenuIconClasses} />
<div className={megaMenuTextWrapperClasses}>
<p className={megaMenuTitleClasses}>
OBSE Platform
</p>
</div>
</Link>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> {/* Join Our Team */}
{/* Join Our Team */}
<div
className="group"
onMouseEnter={handleJoinUsMouseEnter}
onMouseLeave={handleJoinUsMouseLeave}
>
<button className={megaMenuTriggerClasses}>
Join Our Team
<FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
</button>
<div <div
className={` className={`group ${
absolute left-0 top-full w-full shadow-lg z-1000 isActive("/join-us") ||
bg-card border-x border-b border-border rounded-b-lg isActive("/vacancies") ||
opacity-0 invisible translate-y-[-10px] isActive("/portal")
${ ? "active"
joinUsDropdownOpen : ""
? "opacity-100 visible translate-y-0" }`} // Add active class to group (check all related paths)
: "" onMouseEnter={handleJoinUsMouseEnter}
} onMouseLeave={handleJoinUsMouseLeave}
transition-all duration-300 ease-out transform
`}
> >
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5"> <button
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl"> className={`${megaMenuTriggerClasses} ${
<Link href="/vacancies" className={megaMenuItemClasses}> isActive("/join-us") ||
<FiFileText className={megaMenuIconClasses} /> isActive("/vacancies") ||
<div className={megaMenuTextWrapperClasses}> isActive("/portal")
<p className={megaMenuTitleClasses}> ? "after:w-full"
Current Vacancies : ""
</p> }`}
</div> >
</Link> {" "}
<Link href="/portal" className={megaMenuItemClasses}> {/* Apply underline based on active state */}
<FiUserCheck className={megaMenuIconClasses} /> Join Our Team
<div className={megaMenuTextWrapperClasses}> <FiChevronDown className="w-4 h-4 ml-1.5 opacity-70 transition-transform duration-200" />
<p className={megaMenuTitleClasses}> </button>
Recruitment Portal <div
</p> className={`
</div> absolute left-0 top-full w-full shadow-lg z-1000
</Link> bg-card border-x border-b border-border rounded-b-lg
opacity-0 invisible translate-y-[-10px]
${
joinUsDropdownOpen
? "opacity-100 visible translate-y-0"
: ""
}
transition-all duration-300 ease-out transform
`}
>
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-5">
<div className="grid grid-cols-1 md:grid-cols-2 gap-x-8 gap-y-6 max-w-xl">
<Link
href="/vacancies"
className={`${megaMenuItemClasses} ${
isActive("/vacancies") ? "text-primary" : ""
}`}
>
{" "}
{/* Apply active class */}
<FiFileText className={megaMenuIconClasses} />
<div className={megaMenuTextWrapperClasses}>
<p className={megaMenuTitleClasses}>
Current Vacancies
</p>
</div>
</Link>
<Link
href="/portal"
className={`${megaMenuItemClasses} ${
isActive("/portal") ? "text-primary" : ""
}`}
>
{" "}
{/* Apply active class */}
<FiUserCheck className={megaMenuIconClasses} />
<div className={megaMenuTextWrapperClasses}>
<p className={megaMenuTitleClasses}>
Recruitment Portal
</p>
</div>
</Link>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </nav>
</nav>
{/* ← Heres the Explore Our Offerings link, back in its original spot */} {/* ← Heres the Explore Our Offerings link, back in its original spot */}
<Link <Link
href="/services" href="/services" // Assuming this link goes to the main services page
className="flex items-center text-sm font-medium text-primary-foreground hover:opacity-80 transition-opacity group" className={`flex items-center text-sm font-medium hover:opacity-80 transition-opacity group ${
> isActive("/services")
Explore Our Offerings ? "text-primary"
<FiArrowRight className="w-4 h-4 ml-1.5 transition-transform duration-200 group-hover:translate-x-1" /> : "text-primary-foreground"
</Link> }`} // Apply active class
>
Explore Our Offerings
<FiArrowRight className="w-4 h-4 ml-1.5 transition-transform duration-200 group-hover:translate-x-1" />
</Link>
</div>{" "}
{/* Close the new flex container */}
</div> </div>
</div> </div>
</div> </div>