import { useEffect, useRef } from "react"; import gsap from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; import SubHero from "../../components/SubHero"; import useFadeIn from "../../hooks/useFadeIn"; gsap.registerPlugin(ScrollTrigger); const COMPANY_NAV = [ { label: "회사소개", to: "/company/about" }, { label: "연혁", to: "/company/history" }, { label: "고객 및 협력사", to: "/company/partners" }, { label: "찾아오시는 길", to: "/company/location" }, ]; const CX = 380; const CY = 230; const ORBIT_R = 165; const CLIENTS = [ { id: "airport", logo: "01", angle: -90 }, { id: "kac", logo: "09", angle: -45 }, { id: "mod", logo: "15", angle: 0 }, { id: "incheon", logo: "16", angle: 45 }, { id: "jeju", logo: "20", angle: 90 }, { id: "kiast", logo: "21", angle: 135 }, { id: "kari", logo: "23", angle: 180 }, { id: "molit", logo: "24", angle: -135 }, ]; const PARTNER_LOGOS = [ "02", "03", "04", "05", "06", "07", "08", "10", "11", "12", "13", "14", "18", "19", "22", ]; function toRad(deg) { return (deg * Math.PI) / 180; } function nodePos(angle) { return { x: CX + ORBIT_R * Math.cos(toRad(angle)), y: CY + ORBIT_R * Math.sin(toRad(angle)), }; } function ClientHub({ basePath }) { const svgRef = useRef(null); useEffect(() => { const ctx = gsap.context(() => { gsap.fromTo( ".hub-edge", { strokeDashoffset: 200, opacity: 0 }, { strokeDashoffset: 0, opacity: 1, duration: 1.1, stagger: 0.07, ease: "power2.out", scrollTrigger: { trigger: svgRef.current, start: "top 75%" }, }, ); gsap.fromTo( ".hub-center", { scale: 0.6, opacity: 0, transformOrigin: `${CX}px ${CY}px` }, { scale: 1, opacity: 1, duration: 0.7, ease: "back.out(1.6)", scrollTrigger: { trigger: svgRef.current, start: "top 80%" }, }, ); gsap.fromTo( ".hub-node", { scale: 0, opacity: 0 }, { scale: 1, opacity: 1, duration: 0.55, stagger: 0.06, ease: "back.out(1.4)", scrollTrigger: { trigger: svgRef.current, start: "top 75%" }, delay: 0.35, }, ); }, svgRef); return () => ctx.revert(); }, []); return ( {CLIENTS.map((c) => { const pos = nodePos(c.angle); return ( ); })} 주요 고객사 8 clients {CLIENTS.map((c) => { const pos = nodePos(c.angle); const imgSrc = `${basePath}images/partner/banner${c.logo}.png`; return ( ); })} ); } function LogoItem({ num, basePath }) { const src = `${basePath}images/partner/banner${num}.png`; return (
); } export default function PartnersPage() { const ref = useFadeIn(); const editorialRef = useRef(null); const basePath = import.meta.env.BASE_URL; useEffect(() => { const ctx = gsap.context(() => { gsap.fromTo( ".partner-logo-card", { opacity: 0, y: 36, scale: 0.96, clipPath: "inset(0 100% 0 0 round 0px)", }, { opacity: 1, y: 0, scale: 1, clipPath: "inset(0 0% 0 0 round 0px)", duration: 0.85, stagger: { each: 0.04, from: "start" }, ease: "power3.out", scrollTrigger: { trigger: ".partner-logo-grid", start: "top 78%" }, }, ); }, editorialRef); return () => ctx.revert(); }, []); return (
함께하는
고객과 파트너 } desc="공공·항공·국방 분야 주요 기관과의 신뢰를 바탕으로 성장해왔습니다." navItems={COMPANY_NAV} />
{/* 주요 고객사 */}

함께 만들어온
신뢰의 네트워크

공공·항공·국방 분야 핵심 기관과 오랜 협력 관계를 이어오고 있습니다

{/* 기술 협력사 */}
Partners

기술 협력사

15 협력사
{PARTNER_LOGOS.map((num) => ( ))}
); }