Compare commits

..

3 Commits

  1. 46
      index.html
  2. BIN
      public/images/og-thumbnail.png
  3. 12
      src/components/Footer.jsx
  4. 69
      src/components/main/MainUam.jsx
  5. 19
      src/css/main.css
  6. 104
      src/pages/company/LocationPage.jsx

46
index.html

@ -3,19 +3,34 @@
<head>
<meta charset="UTF-8" />
<!-- 기본 SEO 설명: 검색 결과 제목 아래 요약문으로 사용될 수 있음 -->
<meta name="description" content="팔네트웍스는 소프트웨어 개발 및 공급, UTM 및 UTM 항공 솔루션 구축을 수행하는 IT 전문 기업입니다." />
<meta
name="description"
content="팔네트웍스는 소프트웨어 개발 및 공급, UTM 및 UTM 항공 솔루션 구축을 수행하는 IT 전문 기업입니다."
/>
<!-- 검색 키워드: 최신 SEO 영향은 크지 않지만 브랜드/서비스 키워드 정리용으로 사용 가능 -->
<meta name="keywords" content="팔네트웍스, PAL Networks, UTM, UTM, 소프트웨어개발, 응용소프트웨어, IT, 관제솔루션, 항공솔루션, 솔루션구축, SI, 네트워크, 항공산업, 공역관리" />
<meta
name="keywords"
content="팔네트웍스, PAL Networks, UTM, UTM, 소프트웨어개발, 응용소프트웨어, IT, 관제솔루션, 항공솔루션, 솔루션구축, SI, 네트워크, 항공산업, 공역관리"
/>
<!-- 오픈그래프 제목: 카카오톡, 슬랙, 페이스북 등 링크 공유 시 제목으로 노출 -->
<meta property="og:title" content="팔네트웍스" />
<!-- 오픈그래프 설명: 카카오톡, 슬랙, 페이스북 등 링크 공유 시 설명문으로 노출 -->
<meta property="og:description" content="항공산업의 기술혁신을 선도하는 소프트웨어·IT 솔루션 파트너" />
<meta
property="og:description"
content="항공산업의 기술혁신을 선도하는 소프트웨어·IT 솔루션 파트너"
/>
<!-- 오픈그래프 이미지: 카카오톡, 슬랙, 페이스북, 디스코드 등 링크 공유 시 썸네일 이미지로 사용 -->
<!-- 권장 이미지 사이즈: 1200x630px / JPG 또는 PNG / 1MB 이하 권장 -->
<!-- 로고만 있는 작은 이미지보다 브랜드 메시지가 포함된 대표 썸네일 이미지 권장 -->
<meta property="og:image" content="https://도메인주소/img/og-image.jpg" />
<meta
property="og:image"
content="https://palnet.co.kr/images/og-thumbnail.png"
/>
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:image:type" content="image/png" />
<!-- 오픈그래프 타입: 기업/브랜드 홈페이지 메인은 보통 website 사용 -->
<meta property="og:type" content="website" />
@ -34,16 +49,28 @@
<meta name="twitter:title" content="팔네트웍스" />
<!-- 트위터/X 설명 -->
<meta name="twitter:description" content="항공산업의 기술혁신을 선도하는 소프트웨어·IT 솔루션 파트너" />
<meta
name="twitter:description"
content="항공산업의 기술혁신을 선도하는 소프트웨어·IT 솔루션 파트너"
/>
<!-- 트위터/X 공유 이미지 -->
<!-- 권장 사이즈: 1200x628px 정도 / og:image와 동일 이미지 사용해도 무방 -->
<meta name="twitter:image" content="https://도메인주소/img/og-image.jpg" />
<link rel="icon" type="image/png" href="favicon/favicon-96x96.png" sizes="96x96" />
<link
rel="icon"
type="image/png"
href="favicon/favicon-96x96.png"
sizes="96x96"
/>
<link rel="icon" type="image/svg+xml" href="favicon/favicon.svg" />
<link rel="shortcut icon" href="favicon/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="favicon/apple-touch-icon.png" />
<link
rel="apple-touch-icon"
sizes="180x180"
href="favicon/apple-touch-icon.png"
/>
<meta name="apple-mobile-web-app-title" content="PAL Networks" />
<link rel="manifest" href="favicon/site.webmanifest" />
@ -52,7 +79,10 @@
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Outfit:wght@100..900&display=swap" rel="stylesheet" />
<link
href="https://fonts.googleapis.com/css2?family=Jost:ital,wght@0,100..900;1,100..900&family=Outfit:wght@100..900&display=swap"
rel="stylesheet"
/>
<title>PAL Networks</title>
</head>

BIN
public/images/og-thumbnail.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

12
src/components/Footer.jsx

@ -93,12 +93,13 @@ const INFO_TEXT = {
ko: {
ceo: "대표. 최현식",
bizNo: "사업자등록번호. 393-81-00110",
address: "인천광역시 서구 로봇랜드로 155-11 로봇랜드 14층 1401~2호",
address: "인천광역시 서구 로봇랜드로 155-11 로봇랜드 14층 1401~2호",
},
en: {
ceo: "CEO. Choi Hyun-sik",
bizNo: "Biz. Reg. No. 393-81-00110",
address: "14F, 1401-2, 155-11 Robot Land-ro, Seo-gu, Incheon, Republic of Korea",
address:
"14F, 1401-2, 155-11 Robot Land-ro, Seo-gu, Incheon, Republic of Korea",
},
};
@ -155,14 +156,17 @@ function Footer() {
</span>
<span className="sep">|</span>
<span className="info-item">
<span className="strong">E-mail.</span> <a href="mailto:help@palnet.co.kr">help@palnet.co.kr</a>
<span className="strong">E-mail.</span>{" "}
<a href="mailto:help@palnet.co.kr">help@palnet.co.kr</a>
</span>
</p>
</div>
</div>
<div className="footer-bot">
<p className="footer-copy">Copyright © () PALNETWORKS. All rights reserved.</p>
<p className="footer-copy">
Copyright © () PALNETWORKS. All rights reserved.
</p>
<ul className="footer-policy">
<li>
<a href="#none">Privacy Policy</a>

69
src/components/main/MainUam.jsx

@ -58,7 +58,6 @@ function MainUam() {
const dotRef = useRef(null);
const uamImageRef = useRef(null);
const canvasRef = useRef(null);
const isMobile = window.innerWidth <= 768;
useEffect(() => {
//
@ -97,7 +96,14 @@ function MainUam() {
const steps = 200;
const ampScale = mobile ? 0.35 : 0.5 + scrollP * 0.7;
const pts = Array.from({ length: steps + 1 }, (_, s) => [(s / steps) * W, canvas.height * w.yRatio + Math.sin((s / steps) * Math.PI * w.freq + ts * w.speed + w.phase) * w.amp * canvas.height * ampScale]);
const pts = Array.from({ length: steps + 1 }, (_, s) => [
(s / steps) * W,
canvas.height * w.yRatio +
Math.sin((s / steps) * Math.PI * w.freq + ts * w.speed + w.phase) *
w.amp *
canvas.height *
ampScale,
]);
const alphaCenter = scrollP * (mobile ? 0.12 : 0.18);
const grad = c.createLinearGradient(0, 0, W, 0);
@ -128,7 +134,14 @@ function MainUam() {
const ampScale = mobile ? 0.35 : 0.5 + scrollP * 0.7;
const x = d.t * W;
const y = canvas.height * d.wave.yRatio + Math.sin(d.t * Math.PI * d.wave.freq + ts * d.wave.speed + d.wave.phase) * d.wave.amp * canvas.height * ampScale;
const y =
canvas.height * d.wave.yRatio +
Math.sin(
d.t * Math.PI * d.wave.freq + ts * d.wave.speed + d.wave.phase,
) *
d.wave.amp *
canvas.height *
ampScale;
const edgeFade = Math.sin(d.t * Math.PI);
const alpha = edgeFade * scrollP * 0.45;
if (alpha < 0.01) return;
@ -167,12 +180,35 @@ function MainUam() {
window.addEventListener("resize", resize);
raf = requestAnimationFrame(draw);
const getCoverScale = () => {
const section = sectionRef.current;
const dot = dotRef.current;
if (!section || !dot) return 1;
const sectionWidth = section.clientWidth;
const sectionHeight = section.clientHeight;
// translate(-50%, -50%) left top
const centerX = dot.offsetLeft;
const centerY = dot.offsetTop;
const farthestX = Math.max(centerX, sectionWidth - centerX);
const farthestY = Math.max(centerY, sectionHeight - centerY);
const requiredRadius = Math.hypot(farthestX, farthestY);
// 8%
return (requiredRadius / (dot.offsetWidth / 2)) * 1.08;
};
// GSAP
const ctx = gsap.context(() => {
gsap.set(rightRef.current, { xPercent: 100 });
gsap.set(lineRef.current, { scaleX: 0, transformOrigin: "left center" });
gsap.set(dotRef.current, {
x: isMobile ? -160 : -320,
xPercent: -50,
yPercent: -50,
x: window.innerWidth <= 768 ? -160 : -320,
opacity: 0,
scale: 1,
});
@ -187,6 +223,7 @@ function MainUam() {
scrub: 1,
pin: true,
anticipatePin: 1,
invalidateOnRefresh: true,
},
});
@ -197,7 +234,11 @@ function MainUam() {
ease: "none",
});
tl.to(dotRef.current, { x: 0, opacity: 1, duration: 0.7, ease: "none" }, "<0.1");
tl.to(
dotRef.current,
{ x: 0, opacity: 1, duration: 0.7, ease: "none" },
"<0.1",
);
tl.to(leftRef.current, { xPercent: -100, duration: 1, ease: "none" });
tl.to(rightRef.current, { xPercent: 0, duration: 1, ease: "none" }, "<");
@ -209,12 +250,22 @@ function MainUam() {
tl.to(dotRef.current, {
x: 0,
y: 0,
scale: isMobile ? 42 : 52,
scale: () => getCoverScale(),
duration: 1.2,
ease: "power2.inOut",
});
tl.to([".airspace-uam-content", uamImageRef.current], { opacity: 1, y: 0, duration: 0.8, ease: "power2.out" }, "-=0.35");
tl.to(
".airspace-uam-content",
{ opacity: 1, y: 0, duration: 0.8, ease: "power2.out" },
">",
);
tl.to(
uamImageRef.current,
{ opacity: 1, duration: 0.8, ease: "power2.out" },
"<",
);
}, sectionRef);
return () => {
@ -252,11 +303,11 @@ function MainUam() {
))}
</div>
<div className="airspace-moving-dot" ref={dotRef}>
<div className="airspace-moving-dot" ref={dotRef}></div>
<div className="airspace-dot-image" ref={uamImageRef}>
<img src={uamImg} alt="UAM Aircraft" />
</div>
</div>
<div className="airspace-uam-content">
<p>{t.networkLabel}</p>

19
src/css/main.css

@ -248,27 +248,28 @@ body{overflow-x:hidden;}
.airspace-moving-dot,
.airspace-uam-content {position: relative; z-index: 1; }
.airspace-transition-section{position:relative;min-height:100vh;overflow:hidden;background:radial-gradient(circle at 12% 8%,rgba(26,31,94,.04),transparent 30%),radial-gradient(circle at 88% 10%,rgba(26,31,94,.035),transparent 32%),linear-gradient(180deg,#ffffff 0%,#f7f9ff 48%,#ffffff 100%);}
.airspace-transition-section{--uam-center-x:68%;--uam-center-y:49%;position:relative;min-height:100vh;overflow:hidden;background:radial-gradient(circle at 12% 8%,rgba(26,31,94,.04),transparent 30%),radial-gradient(circle at 88% 10%,rgba(26,31,94,.035),transparent 32%),linear-gradient(180deg,#ffffff 0%,#f7f9ff 48%,#ffffff 100%);}
.airspace-transition-section::before{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(255,255,255,.72) 0%,rgba(255,255,255,.24) 20%,rgba(255,255,255,.08) 50%,rgba(255,255,255,.24) 80%,rgba(255,255,255,.72) 100%);pointer-events:none;}
.airspace-panel{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;padding:0 8vw;}
.airspace-panel--utm{background:transparent;}
.airspace-panel--UTM{background:radial-gradient(circle at 72% 34%,rgba(112,180,255,.12),transparent 34%),radial-gradient(circle at 42% 78%,rgba(26,31,94,.08),transparent 28%);}
.airspace-panel--uam{background:radial-gradient(circle at 72% 34%,rgba(112,180,255,.12),transparent 34%),radial-gradient(circle at 42% 78%,rgba(26,31,94,.08),transparent 28%);}
.airspace-panel p{margin:0 0 18px;font-size:12px;font-weight:800;letter-spacing:.26em;color:#1a1f5e;}
.airspace-panel h2{margin:0;max-width:760px;font-size:clamp(48px,6vw,96px);font-weight:800;line-height:.96;letter-spacing:-.08em;color:#0e1120;}
.airspace-lines{position:absolute;inset:0;z-index:5;pointer-events:none;}
.airspace-moving-dot{position:absolute;left:68%;top:49%;z-index:6;width:54px;height:54px;border-radius:50%;background:#1a1f5e;border:1px solid rgba(26,31,94,.14);box-shadow:0 0 0 12px rgba(26,31,94,.06),0 20px 50px rgba(26,31,94,.18);transform-origin:center center;}
.airspace-moving-dot::before{content:"";position:absolute;inset:20px;border-radius:50%;background:#ffffff;opacity:.9;}
.airspace-moving-dot{position:absolute;left:var(--uam-center-x);top:var(--uam-center-y);z-index:6;width:54px;height:54px;min-width:54px;min-height:54px;aspect-ratio:1/1;border-radius:50%;background:#1a1f5e;border:1px solid rgba(26,31,94,.14);box-shadow:0 0 0 12px rgba(26,31,94,.06),0 20px 50px rgba(26,31,94,.18);transform:translate(-50%,-50%);transform-origin:center center;}
.airspace-moving-dot::before{content:"";position:absolute;left:50%;top:50%;width:14px;height:14px;aspect-ratio:1/1;border-radius:50%;background:#ffffff;opacity:.9;transform:translate(-50%,-50%);}
.airspace-uam-content{position:absolute;left:8vw;top:50%;transform:translateY(-50%);z-index:20;max-width:760px;color:#ffffff;pointer-events:none;}
.airspace-uam-content p{margin:0 0 18px;font-size:12px;font-weight:800;letter-spacing:.28em;color:rgba(255,255,255,.72);}
.airspace-uam-content h2{margin:0 0 24px;font-size:clamp(54px,7vw,104px);font-weight:800;line-height:.92;letter-spacing:-.07em;color:#ffffff;}
.airspace-uam-content span{display:block;max-width:560px;font-size:18px;line-height:1.8;font-weight:500;color:rgba(255,255,255,.72);}
.airspace-dot-image{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;opacity:0;z-index:2;pointer-events:none;}
.airspace-dot-image img{width:32%;height:32%;object-fit:contain;filter:drop-shadow(0 8px 32px rgba(26,31,94,.28));animation:float-UTM 5s ease-in-out infinite;will-change:transform;}
.airspace-dot-image{position:absolute;left:var(--uam-center-x);top:var(--uam-center-y);z-index:7;width:clamp(560px,36vw,700px);opacity:0;pointer-events:none;transform:translate(-50%,-50%);}
.airspace-dot-image img{display:block;width:100%;height:auto;object-fit:contain;filter:drop-shadow(0 8px 32px rgba(26,31,94,.28));animation:uamAircraftFloat 3.2s ease-in-out infinite;transform-origin:center center;will-change:transform;}
.airspace-mobile-br{display:none;}
@media (max-width:768px){
.airspace-transition-section{--uam-center-x:88%;--uam-center-y:43%;}.airspace-dot-image{width:min(88vw,480px);}
.airspace-moving-dot{left:88%;top:43%;transform:translate(-50%,-50%);}
.airspace-dot-UTM{width:110px;}
.airspace-uam-content{left:0;right:0;top:auto;bottom:7%;transform:none;padding:0 6vw;max-width:100%;}
@ -279,6 +280,7 @@ body{overflow-x:hidden;}
}
@media (min-width:769px) and (max-width:1024px){
.airspace-transition-section{--uam-center-x:82%;--uam-center-y:50%;}.airspace-dot-image{width:min(58vw,620px);}
.airspace-moving-dot{left:82%;top:50%;transform:translate(-50%,-50%);}
.airspace-dot-UTM{width:280px;}
.airspace-uam-content{left:4%;right:auto;top:auto;bottom:10%;transform:none;padding:0 4vw;max-width:60%;}
@ -289,8 +291,7 @@ body{overflow-x:hidden;}
}
@keyframes UTMShine{0%,48%{transform:translateX(-120%);opacity:0;}58%{opacity:.75;}76%,100%{transform:translateX(120%);opacity:0;}}
@keyframes float-UTM{0%{transform:translateY(0px);}48%{transform:translateY(-1px);}100%{transform:translateY(0px);}}
@keyframes uamAircraftFloat{0%,100%{transform:translateY(10px) rotate(.3deg);}50%{transform:translateY(-28px) rotate(-.3deg);}}
/* ─── SOLUTION ─── */
.main-solution-section { position: relative; height: auto; min-height: 100dvh; overflow: visible; padding: 120px 8vw 160px; background: linear-gradient(180deg,#ffffff 0%,#f7f9ff 52%,#ffffff 100%); }

104
src/pages/company/LocationPage.jsx

@ -24,7 +24,7 @@ const COMPANY_NAV_EN = [
const INFO_KO = [
{
label: "주소",
value: "인천광역시 서구 로봇랜드로 155-11\n로봇랜드 14층 1401~2호",
value: "인천광역시 서구 로봇랜드로 155-11\n로봇랜드 14층 1401~2호",
},
{ label: "전화", value: "032-727-5909", href: "tel:032-727-5909" },
{ label: "팩스", value: "032-727-5908" },
@ -65,7 +65,8 @@ const INFO_MAGOK_KO = [
const INFO_MAGOK_EN = [
{
label: "Address",
value: "Seoul Magok District Centennia Building\n219 Gonghangdae-ro, Gangseo-gu, Seoul",
value:
"Seoul Magok District Centennia Building\n219 Gonghangdae-ro, Gangseo-gu, Seoul",
},
{ label: "Phone", value: "032-727-5909", href: "tel:032-727-5909" },
{
@ -247,12 +248,15 @@ const TRANSPORT_MAGOK_EN = [
},
];
const MAP_INCHEON = "https://www.google.com/maps/embed?pb=!1m16!1m12!1m3!1d3164.5077769134846!2d126.60837056230932!3d37.51952592193411!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!2m1!1z7J247LKcIOuhnOu0h-uenOuTnA!5e0!3m2!1sko!2skr!4v1779870074094!5m2!1sko!2skr";
const MAP_MAGOK = "https://www.google.com/maps/embed?pb=!1m16!1m12!1m3!1d3162.80690228454!2d126.82939801231092!3d37.559612971923826!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!2m1!1z7IS87YWM64uI7JWE!5e0!3m2!1sko!2skr!4v1779871233362!5m2!1sko!2skr";
const MAP_INCHEON =
"https://www.google.com/maps/embed?pb=!1m16!1m12!1m3!1d3164.5077769134846!2d126.60837056230932!3d37.51952592193411!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!2m1!1z7J247LKcIOuhnOu0h-uenOuTnA!5e0!3m2!1sko!2skr!4v1779870074094!5m2!1sko!2skr";
const MAP_MAGOK =
"https://www.google.com/maps/embed?pb=!1m16!1m12!1m3!1d3162.80690228454!2d126.82939801231092!3d37.559612971923826!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!2m1!1z7IS87YWM64uI7JWE!5e0!3m2!1sko!2skr!4v1779871233362!5m2!1sko!2skr";
const PAGE_TEXT = {
ko: {
heroSub: "고객 여러분의 방문을 위해 팔네트웍스의 위치 정보를 안내해드립니다.",
heroSub:
"고객 여러분의 방문을 위해 팔네트웍스의 위치 정보를 안내해드립니다.",
tabIncheon: "인천 본사",
tabMagok: "마곡 지점",
companyInfoLabel: "회사 정보",
@ -278,7 +282,9 @@ const PAGE_TEXT = {
<>
Weekdays 09:00 18:00
<br />
<span className="location-hours-text">Closed on weekends & holidays</span>
<span className="location-hours-text">
Closed on weekends & holidays
</span>
</>
),
inquiryBtn: "Inquiry",
@ -292,8 +298,10 @@ export default function LocationPage() {
const COMPANY_NAV = lang === "en" ? COMPANY_NAV_EN : COMPANY_NAV_KO;
const INFO = lang === "en" ? INFO_EN : INFO_KO;
const INFO_MAGOK = lang === "en" ? INFO_MAGOK_EN : INFO_MAGOK_KO;
const TRANSPORT_INCHEON = lang === "en" ? TRANSPORT_INCHEON_EN : TRANSPORT_INCHEON_KO;
const TRANSPORT_MAGOK = lang === "en" ? TRANSPORT_MAGOK_EN : TRANSPORT_MAGOK_KO;
const TRANSPORT_INCHEON =
lang === "en" ? TRANSPORT_INCHEON_EN : TRANSPORT_INCHEON_KO;
const TRANSPORT_MAGOK =
lang === "en" ? TRANSPORT_MAGOK_EN : TRANSPORT_MAGOK_KO;
const t = PAGE_TEXT[lang];
const ref = useFadeIn();
@ -318,7 +326,13 @@ export default function LocationPage() {
<div className="sub-content">
<div className="inner-wrap">
<motion.div className="ht-header" initial={{ opacity: 0, y: 32 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true, margin: "-80px" }} transition={{ duration: 0.6, ease: [0.4, 0, 0.2, 1] }}>
<motion.div
className="ht-header"
initial={{ opacity: 0, y: 32 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true, margin: "-80px" }}
transition={{ duration: 0.6, ease: [0.4, 0, 0.2, 1] }}
>
<p className="ht-header-title">
Find Us,
<br />
@ -330,10 +344,16 @@ export default function LocationPage() {
</motion.div>
<div className="location-tabs">
<button className={`location-tab ${isIncheon ? "active" : ""}`} onClick={() => setTab("incheon")}>
<button
className={`location-tab ${isIncheon ? "active" : ""}`}
onClick={() => setTab("incheon")}
>
{t.tabIncheon}
</button>
<button className={`location-tab ${!isIncheon ? "active" : ""}`} onClick={() => setTab("magok")}>
<button
className={`location-tab ${!isIncheon ? "active" : ""}`}
onClick={() => setTab("magok")}
>
{t.tabMagok}
</button>
</div>
@ -341,9 +361,21 @@ export default function LocationPage() {
<section className="sub-section">
<div className="location-wrap">
{/* 지도 */}
<motion.div className="location-map-wrap" key={tab + "-map"} initial={{ opacity: 0, y: 24 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, ease: [0.4, 0, 0.2, 1] }}>
<motion.div
className="location-map-wrap"
key={tab + "-map"}
initial={{ opacity: 0, y: 24 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, ease: [0.4, 0, 0.2, 1] }}
>
<div className="location-map">
<iframe src={currentMap} allowFullScreen loading="lazy" referrerPolicy="no-referrer-when-downgrade" title={t.mapTitle} />
<iframe
src={currentMap}
allowFullScreen
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
title={t.mapTitle}
/>
</div>
</motion.div>
@ -359,7 +391,9 @@ export default function LocationPage() {
delay: 0.15,
}}
>
<p className="location-info-section-title">{t.companyInfoLabel}</p>
<p className="location-info-section-title">
{t.companyInfoLabel}
</p>
<motion.div
key={tab + "-info"}
className="location-info-card"
@ -375,13 +409,18 @@ export default function LocationPage() {
<ul className="location-info-list">
{currentInfo.map((item) => (
<li key={item.label} className="location-info-item">
<span className="location-info-label">{item.label}</span>
<span className="location-info-label">
{item.label}
</span>
{item.href ? (
<a className="location-info-value" href={item.href}>
{item.value}
</a>
) : (
<p className="location-info-value" style={{ margin: 0, whiteSpace: "pre-line" }}>
<p
className="location-info-value"
style={{ margin: 0, whiteSpace: "pre-line" }}
>
{item.value}
</p>
)}
@ -392,16 +431,31 @@ export default function LocationPage() {
<p className="location-hours-eyebrow">{t.hoursLabel}</p>
<p className="location-hours-label">{t.hoursText}</p>
</div>
<Link to={withLang("/contact/inquiry")} className="location-inquiry-btn" onMouseEnter={(e) => (e.currentTarget.style.opacity = ".85")} onMouseLeave={(e) => (e.currentTarget.style.opacity = "1")}>
<Link
to={withLang("/contact/inquiry")}
className="location-inquiry-btn"
onMouseEnter={(e) =>
(e.currentTarget.style.opacity = ".85")
}
onMouseLeave={(e) => (e.currentTarget.style.opacity = "1")}
>
{t.inquiryBtn}
</Link>
</motion.div>
</motion.div>
{/* 교통편 */}
<motion.div className="location-transport-wrap" key={tab + "-transport"} initial={{ opacity: 0, y: 24 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.4, ease: [0.4, 0, 0.2, 1] }}>
<motion.div
className="location-transport-wrap"
key={tab + "-transport"}
initial={{ opacity: 0, y: 24 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, ease: [0.4, 0, 0.2, 1] }}
>
<div className="location-transport">
<h3 className="location-transport-title">{t.transportTitle}</h3>
<h3 className="location-transport-title">
{t.transportTitle}
</h3>
<div className="location-transport-list">
{currentTransport.map((item, i) => (
<motion.div
@ -420,13 +474,19 @@ export default function LocationPage() {
<div className="location-transport-icon">
<img src={item.icon} alt={item.badge} />
</div>
<span className="location-transport-badge">{item.badge}</span>
<span className="location-transport-badge">
{item.badge}
</span>
</div>
<div className="location-transport-routes">
{item.items.map((route, j) => (
<div key={j} className="location-transport-route">
<p className="location-transport-route-title">{route.title}</p>
<p className="location-transport-route-desc">{route.desc}</p>
<p className="location-transport-route-title">
{route.title}
</p>
<p className="location-transport-route-desc">
{route.desc}
</p>
</div>
))}
</div>

Loading…
Cancel
Save