import { useEffect, useRef, useState } from "react"; import { Link, NavLink } from "react-router-dom"; const menuData = [ { key: "company", label: "Company", to: "/company", panelTitle: "PAL Networks", panelDesc: "회사 소개와 비전, 연혁, 파트너십 정보를 확인할 수 있습니다.", sections: [ { title: "회사 소개", items: [ { label: "회사소개", to: "/company/about", desc: "기업 철학과 핵심 가치" }, { label: "연혁", to: "/company/history", desc: "주요 실적과 성장 과정" }, ], }, { title: "신뢰 정보", items: [ { label: "고객 및 협력사", to: "/company/partners", desc: "주요 고객과 협력 네트워크" }, { label: "찾아오시는 길", to: "/company/location", desc: "위치 및 연락처 안내" }, ], }, ], featured: { eyebrow: "About Us", title: "신뢰를 기반으로\n항공·플랫폼 기술을 확장합니다.", // text: "기업 소개 영역은 가볍게 보이지 않도록, 핵심 메시지와 신뢰 요소를 함께 노출하는 구성이 좋습니다.", cta: { label: "회사소개 보기", to: "/company" }, }, }, { key: "uam", label: "UAM/UATM", to: "/uam", panelTitle: "UAM / UATM", panelDesc: "도심 항공 모빌리티와 통합 항공 교통 관리 기술을 소개합니다.", sections: [ { title: "기술 소개", items: [ { label: "UAM/UATM 소개", to: "/uam/intro", desc: "도심 항공 모빌리티 핵심 기술" }, { label: "도입사례", to: "/uam/case", desc: "주요 도입 및 운영 사례" }, ], }, ], featured: { eyebrow: "Advanced Air Mobility", title: "안전한 하늘길,\n기술로 완성합니다.", text: "PAL Networks의 UAM·UATM 기술은 도심 상공의 안전 운항과 통합 관제를 실현합니다.", cta: { label: "UAM/UATM 보기", to: "/uam" }, }, }, { key: "business", label: "Business", to: "/business", panelTitle: "Business Area", panelDesc: "구축부터 운영까지, PAL Networks의 종합 IT 서비스 역량을 소개합니다.", sections: [ { title: "구축 · 개발", items: [ { label: "System Integration", to: "/business/si", desc: "맞춤형 정보시스템 구축" }, { label: "R&D", to: "/business/rnd", desc: "연구 개발 및 기술 고도화" }, ], }, { title: "운영 · 지원", items: [{ label: "운영 · 유지보수", to: "/business/maintenance", desc: "안정적인 시스템 운영과 사후 관리" }], }, ], featured: { eyebrow: "Core Capability", title: "구축에서 운영까지,\n끝까지 책임지는 파트너.", text: "단순 납품이 아닌 장기 파트너십으로, 고객 시스템의 안정적 운영을 함께합니다.", cta: { label: "사업영역 보기", to: "/business" }, }, }, { key: "solution", label: "Solution", to: "/solution", panelTitle: "Solution & Service", panelDesc: "산업별 솔루션과 서비스 포트폴리오를 확인하실 수 있습니다.", sections: [ { title: "운영 솔루션", items: [ { label: "비행상황관리 시스템", to: "/solution/flight-control", desc: "실시간 비행 상황 통합 관제" }, { label: "IBE (Internet Booking Engine)", to: "/solution/ibe", desc: "항공 예약·발권 엔진" }, ], }, { title: "플랫폼 · 인프라", items: [ { label: "스마트 관광 예약 플랫폼", to: "/solution/smart-tour", desc: "관광 예약 통합 운영 플랫폼" }, { label: "KT G-cloud 인천총판", to: "/solution/kt-gcloud", desc: "공공 클라우드 인프라 공급" }, ], }, ], featured: { eyebrow: "Scalable Solutions", title: "검증된 솔루션으로\n비즈니스 가치를 만듭니다.", text: "운영 노하우가 축적된 자체 솔루션과 파트너십 기반 인프라를 함께 제공합니다.", cta: { label: "솔루션 보기", to: "/solution" }, }, }, { key: "contact", label: "Contact Us", to: "/contact", panelTitle: "Contact Us", panelDesc: "프로젝트 문의와 인재 채용 정보를 확인하실 수 있습니다.", sections: [ { title: "문의 및 채용", items: [ { label: "문의하기", to: "/contact/inquiry", desc: "프로젝트 및 협업 문의" }, { label: "채용정보", to: "/contact/recruit", desc: "함께할 동료를 찾습니다" }, ], }, ], featured: { eyebrow: "Get in Touch", title: "함께 만들어갈\n파트너를 기다립니다.", text: "프로젝트 협업이든 커리어든, 편하게 연락 주세요.", cta: { label: "문의 바로가기", to: "/contact/inquiry" }, }, }, ]; export default function PalRenewalHeader() { const [activeMenu, setActiveMenu] = useState(null); const [isHeaderHover, setIsHeaderHover] = useState(false); const [isScrolled, setIsScrolled] = useState(false); const [isDarkHero, setIsDarkHero] = useState(false); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [mobileOpenKey, setMobileOpenKey] = useState(null); const closeTimer = useRef(null); const navRefs = useRef({}); const mobileFirstFocusableRef = useRef(null); const activeData = menuData.find((item) => item.key === activeMenu); const showPanel = Boolean(activeData && !activeData.simple && isHeaderHover); useEffect(() => { const updateHeaderState = () => { const scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0; const darkHeroActive = document.body.classList.contains("is-dark-hero"); setIsDarkHero(darkHeroActive); setIsScrolled(!darkHeroActive && scrollTop > 80); }; updateHeaderState(); const observer = new MutationObserver(() => { updateHeaderState(); }); observer.observe(document.body, { attributes: true, attributeFilter: ["class"] }); window.addEventListener("scroll", updateHeaderState, { passive: true }); return () => { observer.disconnect(); window.removeEventListener("scroll", updateHeaderState); }; }, []); useEffect(() => { return () => { if (closeTimer.current) clearTimeout(closeTimer.current); }; }, []); useEffect(() => { if (isMobileMenuOpen) { document.body.style.overflow = "hidden"; const timer = setTimeout(() => { mobileFirstFocusableRef.current?.focus(); }, 50); return () => { clearTimeout(timer); document.body.style.overflow = ""; }; } document.body.style.overflow = ""; return () => { document.body.style.overflow = ""; }; }, [isMobileMenuOpen]); const clearCloseTimer = () => { if (closeTimer.current) clearTimeout(closeTimer.current); }; const openMenu = (key) => { clearCloseTimer(); setIsHeaderHover(true); setActiveMenu(key); }; const scheduleClose = () => { clearCloseTimer(); closeTimer.current = setTimeout(() => { setIsHeaderHover(false); setActiveMenu(null); }, 120); }; const closeDesktopMenu = () => { setIsHeaderHover(false); setActiveMenu(null); }; const closeMobileMenu = () => { setIsMobileMenuOpen(false); setMobileOpenKey(null); }; const closeAllMenus = () => { closeDesktopMenu(); closeMobileMenu(); }; const toggleMobileMenu = () => { setIsMobileMenuOpen((prev) => !prev); }; const handleMobileAccordion = (key) => { setMobileOpenKey((prev) => (prev === key ? null : key)); }; const handleNavKeyDown = (e, index, item) => { if (e.key === "ArrowRight") { const nextItem = menuData[index + 1] || menuData[0]; navRefs.current[nextItem.key]?.focus(); } if (e.key === "ArrowLeft") { const prevItem = menuData[index - 1] || menuData[menuData.length - 1]; navRefs.current[prevItem.key]?.focus(); } if (e.key === "ArrowDown" && !item.simple) { e.preventDefault(); openMenu(item.key); } if (e.key === "Escape") { scheduleClose(); } }; const isActiveHeader = isScrolled || showPanel || isMobileMenuOpen; const logoSrc = isActiveHeader || !isDarkHero ? "./images/pal_logo.png" : "./images/pal_logo_wh.png"; return ( <>

PAL Networks

|
{ clearCloseTimer(); setIsHeaderHover(true); }} onMouseLeave={scheduleClose} > {activeData && !activeData.simple && (
{activeData.panelTitle}

{activeData.featured.title}

{activeData.featured.text}

{activeData.featured.cta.label}
{activeData.panelTitle}

{activeData.panelDesc}

{activeData.sections.map((section) => (

{section.title}

    {section.items.map((item) => (
  • {item.label} {item.desc}
  • ))}
))}
)}
); }