+
WHY JOIN US?
-
+
Connect. Learn. Thrive.
-
+
{features.map((feature) => (
{
router.push(feature.link);
@@ -67,12 +70,12 @@ export function FeaturesSection() {
description={feature.description}
icon={feature.icon}
bgColor={feature.bgColor}
- iconClassName="h-[64px] w-[56px]"
+ iconClassName="h-12 w-12 sm:h-[56px] sm:w-[48px] md:h-[64px] md:w-[56px]"
/>
))}
-
+
diff --git a/packages/frontend/src/features/landing/components/section/floating-nav.tsx b/packages/frontend/src/features/landing/components/section/floating-nav.tsx
index 6078e5d..bcaf0e0 100644
--- a/packages/frontend/src/features/landing/components/section/floating-nav.tsx
+++ b/packages/frontend/src/features/landing/components/section/floating-nav.tsx
@@ -5,6 +5,7 @@ import { Button } from '@/shared/components/ui/button';
import { cn } from '@/shared/lib/utils';
import { SharedIcons } from '@/shared/components/icons';
import Link from 'next/link';
+import { Menu, X } from 'lucide-react';
interface NavItem {
label: string;
@@ -22,6 +23,7 @@ const navItems: NavItem[] = [
export function FloatingNav() {
const [isScrolled, setIsScrolled] = useState(false);
const [activeHash, setActiveHash] = useState('');
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
useEffect(() => {
// Update active hash on mount and hash change
@@ -61,58 +63,147 @@ export function FloatingNav() {
// Update URL and trigger hashchange after scrolling
window.history.pushState(null, '', href);
window.dispatchEvent(new HashChangeEvent('hashchange'));
+
+ // Close mobile menu if open
+ if (isMenuOpen) setIsMenuOpen(false);
}
};
return (
-
+
+ {/* Navigation Links (desktop) */}
+
+ {navItems.map((item) => (
+ {
+ e.preventDefault();
+ handleNavClick(item.href);
+ }}
+ className={cn(
+ 'px-2 text-base font-medium text-primary hover:border-b hover:border-primary',
+ item.href === activeHash ? 'border-b border-primary' : ''
+ )}
+ >
+ {item.label}
+
+ ))}
+
+
+ {/* Action Buttons (desktop) */}
+
+
+
+
+
+
+
+
+
+ {/* Hamburger (mobile) */}
+
+
+
+ {/* Mobile Menu Overlay */}
+ {isMenuOpen && (
+
+ {/* Backdrop */}
+
setIsMenuOpen(false)}
+ aria-hidden="true"
+ />
+
+ {/* Panel */}
+
+
+ {
+ e.preventDefault();
+ handleNavClick('#home');
+ }}
+ >
+
+
+ CommuNet
+
+
+
+
+
+
+ {navItems.map((item) => (
+ {
+ e.preventDefault();
+ handleNavClick(item.href);
+ }}
+ className={cn(
+ 'rounded-md px-2 py-3 text-base font-medium',
+ item.href === activeHash
+ ? 'bg-primary/10 text-primary'
+ : 'text-primary hover:bg-primary/5'
+ )}
+ >
+ {item.label}
+
+ ))}
+
+
+
+ setIsMenuOpen(false)}>
+
+
+ setIsMenuOpen(false)}>
+
+
+
+
+
+ )}
+ >
);
}
diff --git a/packages/frontend/src/features/landing/components/section/footer.tsx b/packages/frontend/src/features/landing/components/section/footer.tsx
index e8d981a..7251a7a 100644
--- a/packages/frontend/src/features/landing/components/section/footer.tsx
+++ b/packages/frontend/src/features/landing/components/section/footer.tsx
@@ -43,8 +43,8 @@ const FooterLink = ({ href, children }: FooterLinkProps) => {
export function FooterSection() {
return (
-