/* =========================================================
   SAMJIN C&I — Corporate site (light editorial)
   Consolidated & cleaned. Brand blue from logo: #158ECE.
   Single accent = brand blue. No cyan.
   ========================================================= */

/* ---------- Fonts ----------
   Pretendard (KO body)  : dynamic-subset CDN, linked from each page <head>.
                           Registers family 'Pretendard Variable' — see premium.css.
   Satoshi (EN body)     : fontshare CDN.
   제목 서체는 Pretendard 고딕(premium.css --font-display). 세리프 2종은 2026-08-13 제거.
   Font tokens live in premium.css (loads last and owns the cascade).
   ------------------------------------------------------------------ */

/* ---------- Design Tokens ---------- */
:root{
  --navy-950: #05090F;
  --navy-900: #0A1424;
  --navy-850: #0D1A2E;
  --navy-800: #101E36;
  --navy-700: #16294A;

  /* Brand blue (from logo) */
  --brand-700: #0C6293;
  --brand-600: #0F76AE;
  --brand-500: #158ECE;
  --brand-400: #3FA6DC;
  --brand-300: #7CC4E8;

  --white: #FFFFFF;
  --gray-50: #F5F8FB;
  --gray-100: #EEF2F7;
  --gray-150: #E4EAF2;
  --gray-200: #D7DFEA;
  --gray-300: #C0CADB;
  --gray-400: #94A3B8;
  --gray-500: #64748B;
  --gray-600: #475569;
  --gray-700: #334155;
  --ink: #0B1220;

  --bg: var(--white);
  --fg: var(--ink);
  --muted: var(--gray-600);          /* AA-safe on soft-grey surfaces */
  --line: var(--gray-150);
  --primary: var(--brand-500);

  /* --font-en / --font / --font-display are defined in premium.css (loads last). */

  /* 1240 고정이면 1600 이상에서 화면 절반이 비고, 헤더도 같은 컨테이너라 로고가
     화면 한가운데로 밀려난다(초광폭 대응 미디어쿼리가 저장소에 0건이었다).
     1440 이하는 종전 그대로(1240) — 회귀 없음. 1920 에서 1456, 2560 에서 상한 1560. */
  --container: clamp(1240px, 1240px + (100vw - 1440px) * .45, 1560px);
  --gutter: clamp(20px, 5vw, 48px);
  --r-card: 18px;                    /* cards */
  --r-med: 12px;                     /* media, tiles, medium blocks */
  --r-ctrl: 8px;                     /* buttons, chips, tabs */
  --card-pad: clamp(24px, 3vw, 32px);

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  /* motion vocabulary: entrances decelerate, interactive surfaces spring (subtle overshoot), exits accelerate */
  --ease-entrance: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-spring: cubic-bezier(0.34, 1.4, 0.64, 1);
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);

  --header-h: 76px;
}

/* ---------- Reset / Base ---------- */
*{ margin: 0; padding: 0; box-sizing: border-box; }
html{ scroll-behavior: smooth; scroll-padding-top: var(--header-h); -webkit-text-size-adjust: 100%; }
body{
  font-family: var(--font);
  color: var(--fg);
  background: var(--bg);
  line-height: 1.6;
  letter-spacing: -0.01em;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
  counter-reset: sec;
}
img{ max-width: 100%; display: block; }
a{ color: inherit; text-decoration: none; }
ul, ol{ list-style: none; }
button{ font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }
h1, h2, h3, h4{ font-weight: 700; line-height: 1.12; letter-spacing: -0.03em; }
/* ============================================================
   TYPOGRAPHY / LINE-BREAK SYSTEM (2026-07-17)
   Single source of truth for wrapping: word-break, overflow-wrap, text-wrap and
   white-space on copy are declared HERE and nowhere else. premium.css, sub.css
   and page-level <style> blocks must not re-declare them — add the new component
   to the lists below instead. Forced <br> in copy was removed in favour of these
   rules; the only <br> left in the site are structural, never mid-sentence.
   Every selector below was verified to match live markup on 2026-07-17.
   ============================================================ */
/* KO baseline (shared with ThingsOne): wrap only at word boundaries, but let
   ultra-long tokens (URLs, model names) break so they never overflow.
   One declaration is enough — both properties inherit, and that was verified
   against real pages: headings, table cells and form controls all compute
   keep-all/break-word from this alone. The long element list that used to be
   repeated here (and in premium.css, sub.css and page <style> blocks) changed
   nothing. */
body{ word-break: keep-all; overflow-wrap: break-word; }
/* Headings — balance so the last line never drops a lone orphan word.
   h1-h4 already cover most titles; only non-heading tags (span/strong) that act
   as titles need listing. */
h1, h2, h3, h4,
.hero__title, .section-title, .subhero__title,
.rx-title, .rx-row__name, .rx-tile__cap strong, .rx-media__body strong,
.rx-famcell strong, .rx-sup strong, .rx-support__head,
.pcard__name,
/* Short data values — address/phone/hours (.loc-dl dd) and the download table's
   product column — balance rather than pretty. Chrome's `pretty` refuses to
   reflow when that would shorten the previous line a lot, so it left
   "휴무)" stranded under "평일 09:00, 18:00 (주말·공휴일" at 390px and split
   "SmartThings Card / Tag" at 768px; `balance` fixes both. Safe here because
   these cells only ever hold short values, never prose. */
.loc-dl dd{
  text-wrap: balance;
}
/* Body copy — pretty ragging (avoids orphan words / ugly last lines).
   Table cells are included deliberately: the board and download tables are prose,
   and without this their last word strands alone on a line at phone widths. */
p, li, dd,
.hero__desc, .subhero__lead, .section-lead, .rx-lead,
.pcard__desc, .rx-tile__cap span, .rx-media__desc, .rx-row__desc,
.rx-famcell__desc, .rx-stat span, .rx-sup span,
.board td.b-title, .legal-tb td{
  text-wrap: pretty;
}
/* Never split a number from its unit, a date, or a short code.
   .tl__year belongs here and NOT in the balance list above — balancing a value
   that must stay on one line is a contradiction. */
.rx-stat strong, .b-date, time, .tl__year{
  white-space: nowrap;
}
/* .bv-tag 는 여기 넣으면 안 된다 — 제품명이 최대 60자라 360px 에서 뷰포트를 넘고,
   body{overflow-x:clip} 때문에 가로 스크롤도 안 돼 잘린 부분을 볼 방법이 아예 없다.
   대신 sub.css 에서 nowrap + ellipsis 로 한 줄에 가두고 넘치면 …으로 줄인다. */
/* .legal-tb th is NOT nowrap: the KO headers are short and stay on one line via
   keep-all, but the EN dict swaps in sentence-length headers ("Information retained
   under applicable law") that, pinned nowrap in the 34%-capped cell, overran a
   360px phone and were clipped by body{overflow-x:clip}. Letting them wrap is
   correct for both languages. */
/* Buttons / menus / pills / badges: one line on desktop … */
.btn, .nav__toplink, .rx-more, .pills a, .b-badge, .pcard__cat, .chips span{
  white-space: nowrap;
}
/* … but never let them overflow a narrow phone. Nothing later in the cascade may
   re-assert `white-space: nowrap` on these: a second `.btn { white-space: nowrap }`
   further down this file has equal specificity, so it silently beat this media
   query and pinned every button to nowrap on phones. */
@media (max-width: 420px) {
  .btn, .pills a, .chips span{ white-space: normal; }
}

/* Sentence-based Korean line breaks (2026-07-21): <br class="lb"> marks editorial
   break points — after a sentence(다.) or a long "…까지," clause — so display copy
   never wraps mid-phrase. Desktop honors them; phones drop them and wrap naturally
   (a fixed break inside a 360px column would shatter the lines). */
@media (max-width: 760px){ br.lb{ display: none; } }

/* No border-radius here: setting it on the focused ELEMENT squared 999px pills / 18px cards on focus.
   The outline already follows each element's own radius via outline-offset. */
:focus-visible{ outline: 2px solid var(--brand-500); outline-offset: 3px; }

/* 텍스트 선택도 브랜드 톤 — 기본 파랑 하이라이트는 웜 팔레트를 깬다 (2026-07-21) */
::selection{ background: rgba(201,146,46,.30); }
/* 모바일 탭 시 회색 플래시 제거 — 자체 :active 피드백이 대신한다 */
html{ -webkit-tap-highlight-color: transparent; }
/* 스킵링크·to-top 이 main 으로 프로그램적 포커스를 옮길 때 페이지 전체 외곽선은 그리지 않는다 */
main#content:focus, main#content:focus-visible{ outline: none; }

.container{ width: 100%; max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); }

.skip-link{ position: fixed; top: -60px; left: 12px; z-index: 200; background: var(--navy-900); color: #fff; padding: 10px 16px; border-radius: 8px; transition: top .2s; }
.skip-link:focus{ top: 12px; }

html[lang="en"]{ --font: var(--font-en); }

/* ---------- Buttons ---------- */
/* No `white-space` here on purpose — it belongs to the typography system above.
   A second `.btn { white-space: nowrap }` at this spot has the same specificity
   as the <=420px relaxation but sits later in the file, so it won the cascade
   and pinned buttons to nowrap on every phone. */
.btn{
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  font-weight: 600; font-size: 0.95rem; letter-spacing: -0.01em;
  padding: 14px 26px; border-radius: var(--r-ctrl);
  transition: transform .3s var(--ease), background .3s, color .3s, box-shadow .3s, border-color .3s;
}
.btn--lg{ padding: 17px 34px; font-size: 1.02rem; border-radius: 10px; }
.btn--primary{ background: var(--primary); color: #fff; box-shadow: 0 8px 24px -10px rgba(21,142,206,.55); }
.btn--primary:hover{ background: var(--brand-600); transform: translateY(-2px); box-shadow: 0 14px 32px -10px rgba(21,142,206,.6); }
.btn--ghost{ background: #fff; border: 1px solid var(--gray-300); color: var(--ink); }
.btn--ghost:hover{ background: var(--navy-900); border-color: var(--navy-900); color: #fff; transform: translateY(-2px); }
/* 네이버 스토어 전용. 색은 네이버 브랜드 그린 #03C75A.
   호버는 메인 히어로 CTA(.home .hero__cta .btn--ghost)와 같은 어법 —
   '색을 눌러 어둡게 + 글로우 키우기'(.btn--primary)가 아니라
   '아웃라인이 채워지며 -2px 뜨기'다.
   ★ 쉬는 상태 글자를 #03C75A 로 두면 흰 배경 대비가 2.5:1 밖에 안 나온다.
     같은 계열의 짙은 그린(#0B7A3D, 5.4:1)으로 내려 AA 를 지킨다. */
.btn--naver{ background: #fff; border: 1px solid #03C75A; color: #0B7A3D;
             box-shadow: 0 8px 24px -12px rgba(3,199,90,.45); }
.btn--naver:hover{ background: #03C75A; border-color: #03C75A; color: #fff;
                   transform: translateY(-2px); box-shadow: 0 14px 32px -10px rgba(3,199,90,.5); }








/* ---------- Header ---------- */
.site-header{
  position: fixed; inset: 0 0 auto 0; z-index: 100; height: var(--header-h);
  display: flex; align-items: center; color: var(--ink);
  transition: background .4s var(--ease), box-shadow .4s, border-color .4s, height .35s var(--ease);
  border-bottom: 1px solid transparent;
}
.header__inner{ display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 24px; }
.site-header.is-scrolled{
  height: 62px;
  background: rgba(255,255,255,.88);
  -webkit-backdrop-filter: saturate(180%) blur(16px); backdrop-filter: saturate(180%) blur(16px);
  border-bottom-color: var(--line);
  box-shadow: 0 4px 30px -20px rgba(11,18,32,.4);
}
/* header floats over the dark hero stage at the top → light nav until scrolled */
.site-header:not(.is-scrolled) .nav__toplink{ color: rgba(255,255,255,.88); }
.site-header:not(.is-scrolled) .nav__toplink:hover,
.site-header:not(.is-scrolled) .nav__list li:hover > .nav__toplink{ color: #fff; }
.site-header:not(.is-scrolled) .hdr-drop__btn{ color: rgba(255,255,255,.92); border-color: rgba(255,255,255,.28); background: rgba(255,255,255,.06); }
.site-header:not(.is-scrolled) .nav-toggle{ color: #fff; }
.brand{ display: inline-flex; align-items: center; }
/* max-width:none is load-bearing: the global `img { max-width: 100% }` combined
   with an explicit height means that whenever the header grid squeezes .brand,
   the logo's WIDTH gets clamped while its height stays fixed — the mark renders
   horizontally crushed (measured 43px wide, aspect 1.34 vs the true 4.96, in EN
   at 901px). An image must never lose its aspect ratio to a layout squeeze. */
.brand__logo{ height: 38px; width: auto; max-width: none; transition: height .35s var(--ease); }
.site-header.is-scrolled .brand__logo{ height: 32px; }

.nav{ justify-self: center; }
.nav__list{ display: flex; gap: clamp(26px, 3.4vw, 54px); }
.nav__list > li{ position: relative; }
.nav__list a{ font-size: 0.94rem; font-weight: 500; color: var(--ink); }
.nav__toplink{ display: inline-flex; align-items: center; gap: 5px; padding: 6px 0; position: relative; transition: color .25s; }
.nav__toplink::after{ content: ""; position: absolute; left: 0; bottom: 0; width: 0; height: 2px; background: var(--primary); transition: width .3s var(--ease); }
.nav__toplink:hover{ color: var(--primary); }
.nav__list li:hover > .nav__toplink::after,
.nav__toplink.is-current::after{ width: 100%; }
.nav__toplink.is-current{ color: var(--primary); }
.nav__caret{ width: 7px; height: 7px; border-right: 1.6px solid currentColor; border-bottom: 1.6px solid currentColor; transform: rotate(45deg) translate(-1px, -1px); opacity: .45; transition: transform .25s; }
.nav__list li:hover .nav__caret{ transform: rotate(225deg) translate(-1px, -1px); opacity: .7; }

/* Mega dropdown panels */
/* 순백 배경(#fff)은 taste-skill 이 "AI 티"로 금지한 항목이고, 웜 팔레트와도 겉돈다
   (2026-07-28 사장님 "배경색이 너무 하얗다, 좀 더 고급졌으면"). 따뜻한 크림 그라디언트 +
   상단 골드 라인(브랜드 시그니처) + 깊은 그림자로 바꾼다. 시안 A/B/C 비교 후 C 채택. */
.nav__panel{
  position: absolute; top: 100%; left: 50%; transform: translateX(-50%) translateY(8px);
  min-width: 210px; border-radius: 14px; padding: 12px;
  /* 상단 골드 라인은 배경 레이어로 그린다 — overflow:hidden 을 쓰면 hover 브리지(::before)가 잘린다. */
  background:
    linear-gradient(90deg, #A8741A, #EBC08C 45%, rgba(235,192,140,0)) top left / 100% 2px no-repeat,
    linear-gradient(180deg, #FFFDFA 0%, #F6EFE3 100%);
  border: 1px solid rgba(168,116,26,.20);
  box-shadow: 0 30px 64px -26px rgba(48,34,16,.42), inset 0 1px 0 rgba(255,255,255,.9);
  opacity: 0; visibility: hidden; transition: opacity .2s var(--ease), transform .2s var(--ease); z-index: 60;
}

.nav__panel::before{ content: ""; position: absolute; top: -14px; left: 0; right: 0; height: 14px; } /* hover bridge */
.nav__list li:hover > .nav__panel,
.nav__list li:focus-within > .nav__panel{ opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0); }
.nav__panel a{ position: relative; display: block; padding: 9px 12px 9px 14px; border-radius: 8px;
  font-size: .9rem; font-weight: 500; color: var(--gray-600);
  transition: background .18s var(--ease), color .18s var(--ease), transform .18s var(--ease); }
/* 좌측 골드 인디케이터 — 폭만 늘려 레이아웃을 밀지 않는다. */
.nav__panel a::before{ content: ""; position: absolute; left: 4px; top: 50%; width: 0; height: 14px;
  border-radius: 2px; background: #A8741A; transform: translateY(-50%);
  transition: width .18s var(--ease); }
.nav__panel a:hover{ background: rgba(201,146,46,.08); color: #6B4A0E; transform: translateX(2px); }
.nav__panel a:hover::before{ width: 3px; }
.nav__panel a:active{ transform: translateX(2px) scale(.985); }
@media (hover: none){ .nav__panel a:hover{ background: none; color: var(--gray-600); transform: none; }
  .nav__panel a:hover::before{ width: 0; } }
/* 4열 고정이면 열이 3개인 메뉴에서 오른쪽 한 칸이 비어 패널이 헛돈다(2026-07-28 사장님 '드롭다운 고도화').
   실제 열 수만큼만 차지하도록 auto-fit + max-content 로 바꾼다. */
/* ★ 넓은 패널을 자기 <li> 에 붙이면(left:0) 메뉴 항목이 내비 가운데쯤 있어서 패널이
   화면 오른쪽으로 넘친다 — body{overflow-x:clip} 때문에 스크롤로도 볼 수 없어
   마지막 열(제품: AIoT/IP Camera/AI Home/Tracker)이 통째로 잘렸다.
   1024~1490px(노트북·태블릿 가로) 전 구간 실측: 최대 240px 절단.
   해결: 해당 li 만 position:static 으로 두어 패널이 .nav 를 기준으로 가운데 정렬되게 한다.
   (:has() 대신 마크업 클래스를 쓴다 — 구형 브라우저에서도 동작해야 한다.) */
.nav{ position: relative; }
.nav__list > li.nav__item--mega{ position: static; }
/* 열 흐름(column)을 쓰면 '전체 제품 라인업 →'(grid-column:1/-1)이 전폭 행이 되지 못하고
   맨 왼쪽 단독 열로 서며, 아래 ≤1180 의 2열 규칙도 암시적 열 때문에 무력화된다 → 행 흐름. */
.nav__panel--wide{ left: 50%; transform: translateX(-50%) translateY(8px); width: max-content; max-width: min(880px, calc(100vw - 24px));
  display: grid; grid-auto-flow: row; grid-template-columns: repeat(auto-fit, minmax(150px, max-content));
  gap: 6px 26px; padding: 22px 24px; }
/* The 640px floor pushed the mega-menu off-screen on ≤1180px desktops (it is anchored to its
   menu item, which sits mid-nav). Let it shrink to fit instead of being clipped. */
@media (max-width: 1180px) {
  .nav__panel--wide{ min-width: 0; width: max-content; max-width: calc(100vw - 24px); grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.nav__list li:hover > .nav__panel--wide,
.nav__list li:focus-within > .nav__panel--wide{ transform: translateX(-50%) translateY(0); }
/* 컬럼 제목이 gray-400 이라 링크와 구분이 안 됐다 → 골드 라벨 + 헤어라인으로 위계를 준다. */
.nav__col > span{ display: block; font-family: var(--font-en); font-size: .68rem; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: #8A5E12;
  padding: 0 12px 8px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }
.nav__panel--wide .nav__all{ grid-column: 1 / -1; margin-top: 8px; padding-top: 12px; border-top: 1px solid var(--line); }
.nav__panel--wide .nav__all a{ color: var(--primary); font-weight: 600; }

.header__actions{ display: flex; align-items: center; gap: 10px; justify-self: end; }

/* Header dropdowns: family site + single language selector */
.hdr-drop{ position: relative; }
.hdr-drop__btn{ display: inline-flex; align-items: center; gap: 7px; padding: 8px 15px; border: 1px solid var(--gray-300); border-radius: 999px; font-size: 0.85rem; font-weight: 600; color: var(--ink); transition: border-color .2s, background .2s; }
.hdr-drop__btn:hover{ border-color: var(--gray-400); background: var(--gray-50); }
.lang-globe{ font-size: .92rem; line-height: 1; }
.hdr-caret{ width: 6px; height: 6px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; transform: rotate(45deg) translate(-1px, -1px); opacity: .5; transition: transform .25s; margin-left: 1px; }
.hdr-drop:hover .hdr-caret, .hdr-drop:focus-within .hdr-caret{ transform: rotate(225deg) translate(-1px, -1px); opacity: .7; }
.hdr-drop__menu{ position: absolute; top: 100%; right: 0; margin-top: 10px; min-width: 190px; background: #fff; border: 1px solid var(--line); border-radius: 12px; box-shadow: 0 30px 60px -30px rgba(11,18,32,.3); padding: 8px; opacity: 0; visibility: hidden; transform: translateY(6px); transition: opacity .2s var(--ease), transform .2s var(--ease); z-index: 60; }
.hdr-drop__menu::before{ content: ""; position: absolute; top: -12px; left: 0; right: 0; height: 12px; }
.hdr-drop:hover .hdr-drop__menu, .hdr-drop:focus-within .hdr-drop__menu{ opacity: 1; visibility: visible; transform: translateY(0); }
.hdr-drop__menu a, .hdr-drop__menu button{ display: block; width: 100%; text-align: left; padding: 9px 14px; border-radius: 8px; font-size: 0.88rem; font-weight: 500; color: var(--gray-600); transition: background .2s, color .2s; }
.hdr-drop__menu a:hover, .hdr-drop__menu button:hover{ background: var(--gray-50); color: var(--primary); }
.hdr-drop__menu button.is-active{ color: var(--primary); font-weight: 700; }
.lang-select .hdr-drop__menu{ min-width: 132px; }
.mobile-nav__lang{ display: flex; gap: 8px; margin-top: 20px; }
.mobile-nav__lang button{ flex: 1; padding: 12px; border: 1px solid var(--line); border-radius: 8px; font-weight: 600; color: var(--muted); }
.mobile-nav__lang button.is-active{ background: var(--navy-900); color: #fff; border-color: var(--navy-900); }

.nav-toggle{ display: none; width: 40px; height: 40px; flex-direction: column; gap: 5px; align-items: center; justify-content: center; color: var(--ink); }
.nav-toggle span{ display: block; width: 22px; height: 2px; background: currentColor; border-radius: 2px; transition: transform .3s var(--ease), opacity .3s; }
.nav-toggle[aria-expanded="true"] span:nth-child(1){ transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2){ opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3){ transform: translateY(-7px) rotate(-45deg); }

.mobile-nav{
  position: fixed; inset: var(--header-h) 0 auto 0; z-index: 99;
  background: rgba(255,255,255,.98); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px);
  border-bottom: 1px solid var(--line); padding: 16px var(--gutter) 28px;
  transform: translateY(-12px); opacity: 0; transition: transform .3s var(--ease), opacity .3s;
  max-block-size: calc(100svh - var(--header-h)); overflow-y: auto;
}
.mobile-nav:not([hidden]){ display: block; }
.mobile-nav.is-open{ transform: translateY(0); opacity: 1; }
.mobile-nav nav{ display: flex; flex-direction: column; }
.mobile-nav > nav > a{ padding: 15px 4px; font-size: 1.05rem; font-weight: 500; border-bottom: 1px solid var(--line); }
.mobile-nav a.btn{ border: none; margin-top: 18px; justify-content: center; }

/* ---------- Hero: RAKING LIGHT stage (dark cinematic still-life) ---------- */
.hero{
  position: relative; min-height: 100vh; min-height: 100svh; display: flex; flex-direction: column;
  background: #05080e; color: #fff; overflow: hidden; isolation: isolate;
}
.hero__bg, .hero__grid{ display: none; }
@keyframes heroUp { from { opacity: 0; transform: translateY(24px); } to { opacity: 1; transform: none; } }
@keyframes heroFade { from { opacity: 0; transform: scale(.96); } to { opacity: 1; transform: none; } }
@keyframes floaty { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }

/* ===== RAKING LIGHT — steer one light, ten shadows obey ===== */
.stage{
  position: relative; flex: 1; min-height: 0; overflow: hidden;
  perspective: 1500px; perspective-origin: 62% 44%;
  --lx: .42; --ly: .24; --beam-x: 42%; --beam-y: 24%; --scene-dim: 0;
  transform: scale(calc(1 - .02 * var(--scene-dim))); transition: transform .2s linear;
}
/* obsidian photographer's cove */
.stage__cove{ position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background:
    radial-gradient(100% 68% at 50% -8%, #14243b 0%, transparent 56%),
    linear-gradient(180deg, #0a1322 0%, #0a1120 54%, #05080e 100%); }
.stage__cove::after{ content: ""; position: absolute; inset: 0;
  background: radial-gradient(135% 120% at 50% 44%, transparent 42%, rgba(0,0,0,.6) 100%); }
/* steerable floor light-pool follows the beam */
.stage__pool{ position: absolute; left: 0; top: 0; width: 70vw; height: 46vw; z-index: 1; pointer-events: none;
  transform: translate3d(calc(var(--beam-x) - 35vw), calc(var(--beam-y) + 6vh), 0);
  mix-blend-mode: screen; will-change: transform;
  background: radial-gradient(closest-side, rgba(122,182,236,.22), rgba(86,146,206,.07) 44%, transparent 72%); }
.stage__pool::after{ content: ""; position: absolute; inset: 0; animation: poolBreath 6s ease-in-out infinite alternate;
  background: radial-gradient(closest-side, rgba(122,182,236,.12), transparent 60%); }
@keyframes poolBreath { to { transform: scale(1.05); opacity: .8; } }
.stage__dust{ position: absolute; inset: 0; z-index: 2; pointer-events: none; opacity: .55; }
.stage__metric{ position: absolute; left: 50%; bottom: 13%; transform: translateX(-50%); z-index: 1; pointer-events: none;
  font-family: var(--font-en); font-weight: 800; font-size: clamp(58px, 12vw, 188px); letter-spacing: -.03em;
  color: transparent; -webkit-text-stroke: 1px rgba(140,180,225,.06); opacity: .9; }

.depth{ position: absolute; inset: 0; z-index: 3; transform-style: preserve-3d; }
.tier{ position: absolute; inset: 0; transform-style: preserve-3d; }




/* one product = cast shadow + cutout + AO + specular + chip, anchored bottom-center at (--px,--py) */
.prod{ position: absolute; left: calc(var(--px) * 100%); top: calc(var(--py) * 100%); width: var(--w);
  transform: translate(-50%, -100%); margin: 0;
  --lit: .84; --sk: 0deg; --sy: 1; --so: .34; --gx: 50%; }



@keyframes hubBreath { to { transform: scale(1.015); } }
/* cast shadow — silhouette of the SAME png, STATIC blur, only the transform animates */


/* AO contact ellipse grounds each product regardless of the raking shadow */

/* specular sheen crossing the light-facing surface */

/* name + category chip surfaces only when lit past ambient */




/* reading column — upper-left, permanently lit, protected */
.stage__copy{ position: absolute; inset: 0 auto auto 0; width: 100%; z-index: 6; pointer-events: none;
  padding-top: calc(var(--header-h) + clamp(30px, 8vh, 96px)); }
.stage__copy > *{ pointer-events: auto; }
.hero__eyebrow{ display: inline-flex; align-items: center; gap: 12px; font-family: var(--font-en);
  font-size: .72rem; font-weight: 600; letter-spacing: .2em; text-transform: uppercase; color: var(--brand-300);
  margin-bottom: 22px; opacity: 0; animation: heroUp .9s var(--ease-out) .12s forwards; }
.hero__eyebrow::before{ content: ""; width: 30px; height: 1px; background: var(--brand-400); opacity: .75; }
.hero__eyebrow::after{ display: none; }
.hero__title{ font-family: var(--font-display); font-weight: 700; line-height: .98; letter-spacing: -.03em;
  font-size: clamp(2.6rem, 6.6vw, 5.8rem); max-width: 15ch; margin-bottom: 26px; }
html[lang="ko"] .hero__title{ font-family: var(--font-display); letter-spacing: -.03em; }
.hero__title .line{ display: block; opacity: 0; transform: translateY(20px); animation: heroUp 1s var(--ease-out) forwards;
  background: linear-gradient(100deg, #d8e2ee 44%, #ffffff 50%, #d8e2ee 56%); background-size: 280% 100%;
  background-position: calc(60% - var(--beam-x) * 1.2) 0; -webkit-background-clip: text; background-clip: text; color: transparent; }
.hero__title .line:nth-child(1){ animation-delay: .24s; }
.hero__title .line.grad{ animation-delay: .36s;
  background: linear-gradient(100deg, #2f9fd8 42%, #8fd0f0 50%, #158ECE 58%); background-size: 280% 100%;
  background-position: calc(60% - var(--beam-x) * 1.2) 0; -webkit-background-clip: text; background-clip: text; color: transparent; }
.hero__desc{ font-size: clamp(1rem, 1.4vw, 1.18rem); line-height: 1.6; color: rgba(255,255,255,.64); max-width: 40ch;
  opacity: 0; animation: heroUp .9s var(--ease-out) .5s forwards; }

@media (prefers-reduced-motion: reduce) {
  .stage__pool::after{ animation: none; }
  .hero__eyebrow, .hero__title .line, .hero__desc{ animation: none; opacity: 1; transform: none; }
  .stage__dust{ display: none; }
}

/* ---------- Section base ---------- */
.section{ padding-block: clamp(84px, 12vw, 158px); position: relative; }
.section--soft{ background: var(--gray-50); }
.section-head{ max-width: 760px; margin-bottom: clamp(44px, 6vw, 68px); }
.section-head--center{ margin-inline: auto; text-align: center; }
.section-head--center .eyebrow{ justify-content: center; }
/* text-align:center only centres the lines INSIDE .section-lead's box; the box
   itself is narrowed by max-inline-size:62ch and, without this, stayed pinned to
   the left of the 760px head — measured 49px off the title's centre at 1280px.
   Same prescription as .family .section-lead. */
.section-head--center .section-lead{ margin-inline: auto; }


.eyebrow{ font-family: var(--font-en); font-size: 0.82rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--primary); margin-bottom: 16px; display: inline-flex; align-items: center; gap: 12px; }
.eyebrow::before{ content: ""; inline-size: 24px; block-size: 1px; background: currentColor; opacity: 0.35; }

/* 3vw 는 880px 에서야 하한을 넘어 561~880 전 구간(태블릿)에서 26.4px 로 얼어붙었다.
   컨테이너는 640→751px 로 넓어지는데 제목만 그대로라 눌려 보였다 → 기울기를 올리고
   상한도 초광폭용으로 확장(≤560 은 mobile.css 가 !important 로 덮으므로 폰 영향 없음). */
.section-title{ font-size: clamp(1.65rem, 1.05rem + 1.9vw, 2.9rem); letter-spacing: -0.042em; margin-bottom: 20px; }
.section-title .accent{ color: var(--primary); }
.section-lead{ font-size: clamp(1rem, 1.4vw, 1.25rem); color: var(--muted); line-height: 1.7; max-inline-size: 62ch; }

/* Section title = a distinct mask-wipe (not the body fade-rise): pure clip-path + fade, no translate,
   so headings read as authored motion rather than one more batch fade-up.
   ⚠️ The inset MUST keep negative top/bottom headroom: with the tight display line-height,
   Hangul ascenders paint slightly above the content box, and inset(0 …) permanently
   sheared the tops off (reported 2026-07-21 "글자 윗부분이 잘림"). */
.section-title.reveal{ opacity: 0; transform: none; clip-path: inset(-0.35em 0 72% 0);
  transition: opacity .55s var(--ease-entrance), clip-path .75s var(--ease-entrance); }
.section-title.reveal.is-visible{ opacity: 1; clip-path: inset(-0.35em 0 -0.25em 0); }

/* ---------- Vision ---------- */

/* ---------- Featured products ---------- */

/* ---------- AI solution (light) ---------- */

/* ---------- Company: stat band + partnership strip ---------- */
.stat{ background: #fff; padding: clamp(26px, 3vw, 38px) 20px; text-align: center; }

/* ---------- Newsroom / PR Center ---------- */



/* ---------- Support ---------- */

/* ---------- Footer ---------- */
.site-footer{ background: var(--navy-950); color: rgba(255,255,255,.72); padding-top: clamp(56px, 7vw, 84px); }
.footer__cta{ display: flex; align-items: center; justify-content: space-between; gap: 24px; flex-wrap: wrap; padding-block: clamp(40px, 6vw, 64px); border-bottom: 1px solid rgba(255,255,255,.08); }
.footer__cta-eyebrow{ font-family: var(--font-en); font-size: .8rem; letter-spacing: .1em; text-transform: uppercase; color: var(--brand-300); margin-bottom: 10px; }
.footer__cta-title{ font-size: clamp(1.4rem, 3vw, 2.05rem); color: #fff; letter-spacing: -.03em; }
/* Family 열은 2026-07-21 전폭 가로 로고 스트립(.footer__family)으로 분리 — 그리드는 3열 */
/* padding 단축형(48px 0 40px)을 쓰면 같은 요소의 .container 가 준 padding-inline:var(--gutter) 를
   좌우 0 으로 덮어써, 뷰포트가 --container 보다 좁은 모바일에서 푸터 링크가 화면 끝에 붙는다
   (2026-07-28 실측: 390 에서 이 블록만 x=0, 형제 블록은 x=20). 세로 여백만 지정해 거터를 살린다. */
.footer__grid{ display: grid; grid-template-columns: 2fr 1fr 1.2fr; gap: 40px; padding-block: 48px 40px; }
/* 사이트맵 열을 걷어낸 뒤의 첫 단: 브랜드(좌) + 패밀리 링크(우) 한 줄. */
.footer__top{ display: flex; align-items: center; justify-content: space-between;
  gap: 20px clamp(24px, 4vw, 56px); flex-wrap: wrap; padding-block: clamp(28px, 3.6vw, 44px) clamp(24px, 3vw, 34px); }
/* ★ align-items 를 반드시 flex-start 로. 기본값(stretch)이면 세로 플렉스에서 로고
   <img> 가 칸 너비까지 늘어난다 — 103x31 로고가 263x30 으로 찌그러졌다(실측). */
.footer__top .footer__brand{ display: flex; flex-direction: column; align-items: flex-start; gap: 10px; }
.footer__logo{ width: 103px; height: auto; flex: none; }
.footer__logo{ height: 30px; width: auto; margin-bottom: 16px; }
/* 태그라인은 한 줄로 (2026-08-13 사장님 지시).
   예전 32ch 상한은 "삼성 SmartThings…" 시절 길이에 맞춘 값이라, Samsung 으로 바뀌며
   글자가 늘자 전 해상도에서 두 줄로 갈렸다(실측 1440~360 전부 2줄). 상한을 풀고 nowrap.
   ※ 폰(≤480)에서는 nowrap 을 풀어야 한다 — 한 줄 강제하면 360px 화면을 넘고
     body{overflow-x:clip} 때문에 잘린 글자를 볼 방법이 없다. */
.footer__brand p{ font-size: 0.94rem; color: rgba(255,255,255,.55); max-width: none; white-space: nowrap; }
/* 폰에서도 한 줄로(2026-08-13 재요청). 예전에는 480px 이하에서 nowrap 을 풀어 두 줄이 됐다.
   그냥 nowrap 만 유지하면 좁은 화면에서 글자가 화면 밖으로 나가고 body{overflow-x:clip}
   때문에 잘린 부분을 볼 방법이 없다 — 그래서 폭에 맞춰 글자 크기를 함께 줄인다.
   vw 로 따라가되 상한을 본래 크기(.94rem)로 묶어 큰 화면에서는 지금과 똑같이 보인다. */
@media (max-width: 480px){
  .footer__brand p{ font-size: clamp(11.5px, 4.05vw, 0.94rem); }
}
.footer__col h3{ font-family: var(--font-en); font-size: 0.78rem; letter-spacing: .1em; text-transform: uppercase; color: rgba(255,255,255,.55); margin-bottom: 18px; font-weight: 700; }
.footer__col a, .footer__col p{ display: block; font-size: 0.94rem; color: rgba(255,255,255,.72); padding: 5px 0; transition: color .25s; }
.footer__col a:hover{ color: var(--brand-300); }
/* 콘텐츠 면책 고지 (v013 No.7) — 회사정보와 약관줄 사이. 읽히되 주장하지 않는 톤으로
   본문보다 한 단계 작고 흐리게. 어두운 푸터라 .55 대비면 충분히 읽힌다. */
.footer__disc{ padding-block: 16px; border-top: 1px solid rgba(255,255,255,.08); }
.footer__disc p{ margin: 0; font-size: .76rem; line-height: 1.7; color: rgba(255,255,255,.5); max-width: 100ch; }

.footer__corp{ padding-block: 24px; border-top: 1px solid rgba(255,255,255,.08); }
.footer__corp dl{ display: flex; flex-wrap: wrap; gap: 10px 28px; margin: 0; }
.footer__corp dl > div{ display: flex; gap: 8px; font-size: .82rem; }
.footer__corp dt{ color: rgba(255,255,255,.5); }
.footer__corp dd{ color: rgba(255,255,255,.75); margin: 0; }
.footer__corp dd a{ color: rgba(255,255,255,.75); }
.footer__bottom{ display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding-block: 26px; border-top: 1px solid rgba(255,255,255,.08); font-size: 0.84rem; color: rgba(255,255,255,.55); }
.footer__legal{ display: flex; gap: 20px; flex-wrap: wrap; }
.footer__legal a{ color: rgba(255,255,255,.6); font-size: .84rem; }
.footer__legal a:first-child{ font-weight: 600; color: rgba(255,255,255,.85); }
.site-footer :focus-visible{ outline-color: #fff; }

/* ---------- Reveal (staggered via inline delay in JS) ---------- */
/* Crisper than before: .55s (so the 90ms/step cascade is legible) and no blur — blur triple-encoded
   the same "arrival", read as a loading soft-focus, and janked on mid-tier GPUs animating many at once. */
.reveal{ opacity: 0; transform: translateY(20px);
  transition: opacity .5s var(--ease-entrance), transform .55s var(--ease-entrance); }
.reveal.is-visible{ opacity: 1; transform: none; }

/* ---------- Full-page section snap (each section = one screen) ---------- */
@media (min-width: 769px) and (prefers-reduced-motion: no-preference) {


  /* flex-centering already provides breathing room — trim the base 158px padding so tall
     sections fit one screen and the mandatory snap never clips their bottoms. */
  main > section.section{ padding-block: clamp(72px, 9vw, 128px); }

}

/* ---------- Products: category summary line ---------- */

/* ---------- Family sites (dark section, logo cards) ---------- */
.family{ background: linear-gradient(165deg, var(--navy-900), var(--navy-950)); color: #fff; overflow: hidden; }
.family .container{ position: relative; z-index: 1; }
.family .section-title{ color: #fff; }
.family .section-title .accent{ color: var(--brand-300); }
.family .section-lead{ color: rgba(255,255,255,.7); margin-inline: auto; }
.family .eyebrow{ color: var(--brand-300); }

/* =========================================================
   SECTION ELEVATION — award-tier cohesion with the dark hero
   Tonal rhythm: hero(D) · vision(L bridge) · company(D) · ai(D) · family(D)
   ========================================================= */

/* ---- VISION: the light bridge out of the dark hero ---- */
@keyframes visSheen { from { background-position: 120% 0; } to { background-position: 0 0; } }

/* ---- shared dark-section token flips (company + ai) ---- */
.section--dark, .section.ai{ background: var(--navy-950); color: #fff; position: relative; overflow: hidden; }

/* ---- COMPANY: dark monumental "trust ledger" ---- */
.company.section--dark{ background: var(--navy-950); }
.company.section--dark::before{ content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(120% 80% at 50% -12%, rgba(21,142,206,.12), transparent 58%); }
.company .container{ position: relative; z-index: 1; }
.stat{ position: relative; background: none; padding: clamp(16px, 2.2vw, 30px) 18px; text-align: center; }
.stat + .stat::before{ content: ""; position: absolute; left: 0; top: 24%; bottom: 24%; width: 1px;
  background: linear-gradient(180deg, transparent, rgba(255,255,255,.12) 28% 72%, transparent); }
.stat:nth-child(3n+1)::before{ display: none; }
.stat::after{ content: ""; position: absolute; inset: 8% 6%; border-radius: 16px; z-index: -1; opacity: 0;
  background: radial-gradient(circle at 50% 40%, rgba(21,142,206,.16), transparent 68%); transition: opacity .45s var(--ease); }
.stat:hover::after{ opacity: 1; }
.stat:hover strong{ filter: drop-shadow(0 0 34px rgba(63,166,220,.45)); }
/* stagger the ledger cascade */
@keyframes statUp { from { opacity: 0; transform: translateY(20px); filter: blur(6px); } to { opacity: 1; transform: none; filter: none; } }
/* company partner strip → glass ledger footer */

/* ---- AI: obsidian technical stage ---- */
.section.ai{ background: #05080e; }
/* 01/02/03 badge removed — the icons already carry each capability's identity (frontend-design: numbers only for real sequences) */

/* =========================================================
   SECTION ELEVATION #2 — products · newsroom · support · family
   ========================================================= */

/* ---- PRODUCTS: asymmetric bento, dark hub hero card echoes the raking-light stage ---- */


/* ---- NEWSROOM: asymmetric editorial press desk ---- */

/* ---- SUPPORT: raking sweep bar + arrow + dark A/S anchor tile ---- */

/* ---- FAMILY: dark-glass cards, white logo plate, blue rim sweep ---- */

/* ---------- Responsive ---------- */
/* ============ FULL-RANGE RESPONSIVE — folded Fold (280) → desktop ============ */

/* Tablet / small laptop */
@media (max-width: 1024px) {
  /* The English menu is far wider than the Korean one (Products & Solutions =
     151px vs 제품 및 솔루션 = 96px), and .nav__toplink is nowrap, so between the
     hamburger breakpoint (900px) and ~1065px the EN nav cannot fit and the grid
     takes the space out of the logo instead. Korean fits at its normal spacing
     here, so only the EN band is tightened — measured at 901/940/1024: logo
     stays 4.96 aspect, no header overflow, nav never reaches the actions. */
  html[lang="en"] .nav__list{ gap: 12px; }
}

/* Nav → hamburger; two-up utility grids */
@media (max-width: 900px) {
  .nav{ display: none; }
  .header__actions .hdr-drop{ display: none; }
  .nav-toggle{ display: flex; }
  .header__inner{ grid-template-columns: auto 1fr; }
  .header__actions{ justify-self: end; }
  
  .footer__grid{ grid-template-columns: 1fr 1fr; gap: 34px; }
}

/* Phone: hero flattens to copy + a static product wall; section grids stack */
@media (max-width: 768px) {
  :root{ --header-h: 64px; }
  .section{ padding-block: clamp(64px, 14vw, 100px); }

  /* hero: flatten the interactive stage → copy on top, product wall below */
  .hero{ display: flex; flex-direction: column; min-height: 100svh; }
  .stage{ perspective: none; overflow: hidden; display: flex; flex-direction: column; }
  .stage__pool, .stage__dust, .stage__metric{ display: none; }
  .stage__copy{ position: static; order: -1; padding: calc(var(--header-h) + 26px) var(--gutter) 4px; }
  .depth{ position: static; transform: none !important; display: flex; flex-wrap: wrap;
    align-items: flex-end; justify-content: center; gap: 24px 12px; padding: 10px 12px 32px; margin-top: auto; }
  .tier{ position: static; display: contents; transform: none !important; filter: none; }
  /* tap-to-light: each product is tappable; the key light travels to it, shadows swing */
  .prod{ position: relative; transform: none !important; width: auto; margin: 0; cursor: pointer; -webkit-tap-highlight-color: transparent; }
  
  
  
  
  
  
  
  .hero__title{ font-size: clamp(2rem, 10vw, 3.2rem); max-width: 18ch; }
  .hero__desc{ font-size: 1rem; max-width: none; }

  /* section grids collapse */
  

  /* company monumental numbers shrink to fit */
  .stat{ padding: 6px 6px; }
  .stat + .stat::before{ display: none; }
}

/* Small phone */
@media (max-width: 560px) {
  .footer__grid{ grid-template-columns: 1fr; }
  
}

/* Folded Fold / very narrow (≤380 → 280) */
@media (max-width: 380px) {
  :root{ --gutter: 16px; }
  .hero__title{ font-size: clamp(1.75rem, 11vw, 2.4rem); }
  .section-title{ font-size: clamp(1.45rem, 8vw, 2rem); }
  
  
}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
  html{ scroll-behavior: auto !important; }
  *{ animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
  .reveal{ opacity: 1; transform: none; }
}

/* ============ v40 — condensed one-page home (main=digest, subs=detail) ============ */







/* company condensed */

/* capabilities editorial index */

/* product category links */

/* solutions dual gateway */

@media (max-width: 900px) {
}
@media (max-width: 560px) {
  
}

/* ================================================================
   v42 — ONE TAKE · 조명은 꺼지지 않는다
   히어로의 키 라이트(좌상)가 페이지 전체의 유일한 광원.
   박스 대신 헤어라인·거대 숫자·블리드. ACT 01~06.
   ================================================================ */
:root{
  --stage: #05080E;
  --hair-dark: rgba(124, 196, 232, .14);
  --hair-light: var(--gray-150);
  --shadow-key-dark: drop-shadow(clamp(18px,3vw,44px) clamp(22px,3.6vw,54px) 38px rgba(0,0,0,.55));
  --shadow-key-light: drop-shadow(clamp(14px,2.6vw,38px) clamp(18px,3vw,46px) 46px rgba(11,18,32,.2));
  --d2: clamp(1.9rem, 4.2vw, 3.4rem);
  --ghost-num: clamp(4.5rem, 12vw, 11rem);
  --monument: clamp(3.4rem, 9vw, 10.5rem);
}

body{ overflow-x: clip; }
@supports not (overflow-x: clip) { body{ overflow-x: hidden; } }

/* ---------- ACT 마커 (유일하게 허용되는 공통 헤더 문법) ---------- */






/* ---------- 프로시니엄 그림자 (라이트 액트 진입 장치) ---------- */




/* ---------- 다크 액트: 무대 연속 ---------- */
.company.section--dark{ background: linear-gradient(180deg, #0B1728, var(--stage) 26%); }
.family.section--dark{ background: var(--stage); }

/* ================= ACT 01 · COMPANY — 신뢰의 기념비 ================= */






















/* ================= ACT 02 · CAPABILITIES — 작업실에 불이 켜진다 ================= */














/* ================= ACT 03 · PRODUCTS — 스포트라이트 ================= */





.prog{ list-style: none; margin: 0; padding: 0; }
.prog li{ border-top: 1px solid var(--hair-dark); }
.prog li:last-child{ border-bottom: 1px solid var(--hair-dark); }


















/* ================= ACT 04 · SOLUTIONS — 두 갈래 빔 ================= */

.duo{ display: grid; grid-template-columns: 1fr 1px 1fr; width: 100%; min-height: 100vh; }
@supports (min-height: 100svh) { .duo{ min-height: 100svh; } }


















/* ================= ACT 05 · PRESSROOM + SERVICE COUNTER ================= */

























.counter{ margin-top: clamp(40px, 7vh, 76px); border-top: 2px solid var(--ink); }














/* ================= ACT 06 · FAMILY — 커튼콜 ================= */
.family{ position: relative; overflow: hidden; }





















.dest{ list-style: none; margin: clamp(36px, 6vh, 70px) 0 0; padding: 0; }
.dest li{ position: relative; border-top: 1px solid var(--hair-dark); }
.dest li:last-child{ border-bottom: 1px solid var(--hair-dark); }
.dest li::after{
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 1px;
  background: linear-gradient(90deg, var(--brand-500), var(--brand-300), transparent);
  transform: scaleX(0); transform-origin: left;
  transition: transform .5s var(--ease);
}
.dest li:hover::after{ transform: scaleX(1); }
.dest a{
  display: grid; grid-template-columns: clamp(120px, 14vw, 190px) minmax(0, 1fr) auto;
  align-items: center; gap: clamp(16px, 3vw, 40px);
  padding-block: clamp(20px, 3.2vw, 36px);
  text-decoration: none;
}









/* ================= ONE TAKE — responsive ================= */
@media (max-width: 1024px) {
  
  
}
@media (max-width: 900px) {
  
  
  
}
@media (max-width: 768px) {
  :root{ --monument: clamp(2.9rem, 15.5vw, 4.6rem); --ghost-num: clamp(2.6rem, 14vw, 4rem); }
  
  
  
  
  
  
  
  
  .duo{ grid-template-columns: 1fr; min-height: 0 !important; }
  
  
  
  
  
  
  
  
  
  
  
  
  .dest a{ display: block; padding-block: 22px; }
  
  
  
}
@media (max-width: 380px) {
  
  
  
  
  
  
  
}

/* ---------- reduced motion: 최종 상태 고정 ---------- */
@media (prefers-reduced-motion: reduce) {
  .dest li::after{ transition: none !important; }
  
  
  
}

/* ---------- ONE TAKE fixes: header clearance + mobile bleed reset ---------- */


@media (max-width: 768px) {
  
}

/* ================= v43 A-COMPANY (stage cast) ================= */

  /* ================================================================
     VARIANT A — STAGE DENSITY
     히어로(RAKING LIGHT)의 무대 문법 — 어둠·컷아웃·캐스트 그림자·
     발밑 라이트 풀 — 이 스크롤 이후에도 계속된다.
     ACT 01: 기념비 뒤에 부유하는 제품 캐스트 (far→near 깊이)
     ACT 03: 스포트라이트 무대 강화 — 행별 미니 컷아웃, 코브+원근 그리드,
             빔, 더스트 파티클, 스테이지 링
     ================================================================ */

  /* ---------- ACT 01 · COMPANY — 기념비가 서 있는 무대 ---------- */
  
  
  
  
  

  /* 부유 캐스트 — 뒤 티어일수록 blur+dim, 각자 발밑 라이트 풀 */
  
  
  
  
  
  
  
  
  

  /* 캐스트 위에 얹히는 폴리오 판독성 보강 */
  

  /* 기념비 숫자 — 무대 위 발광체로 한 단계 격상 */
  

  /* 우측 co-index — hover 시 백라이트 (무대 조명이 행을 비춘다) */
  
  
  
  
  
  
/* ================= v43 B-PRODUCTS (glass cards) ================= */

  #products.section--dark{
    background:
      radial-gradient(1000px 640px at 84% -8%, rgba(var(--gx-violet), .11), transparent 60%),
      radial-gradient(1100px 720px at 6% 34%, rgba(var(--gx-blue), .10), transparent 62%),
      radial-gradient(1200px 780px at 74% 112%, rgba(15, 118, 174, .15), transparent 66%),
      #05080E;
  }
  
  
  
  
  

  /* ---------- glass primitives ---------- */
  
  
  
  
  
  
  
  
  

  /* ---------- ACT 03 · PRODUCTS — glass card grid + glowing stage ---------- */
  
  
  
  
  
  
  
  
  
  
  

  
  
  
  
  

  
  
  
  
  

  /* stage: duotone glow pool + plinth ring + glow-rim cutout */
  
  
  
  
  

  /* ---------- rough responsive fallback (style comp is desktop-first) ---------- */
  @media (max-width: 980px) {
    
    
    
    
    
  }
  @media (prefers-reduced-motion: reduce) {
    
  }
  
/* ================= v43 — PHOTO STAGE (scenes behind the acts) ================= */
.scene{
  position: absolute; inset: 0; pointer-events: none; z-index: 0;
  background-size: cover; background-position: center;
}
.scene::after{ content: ""; position: absolute; inset: 0; }




.company > .container, .family > .container{ position: relative; z-index: 1; }

/* duo photo halves */







/* capa photo plate */
.capa{ overflow: hidden; }


.capa > .container{ position: relative; z-index: 1; }


@media (max-width: 1280px) {  }
@media (max-width: 1024px) {  }
@media (max-width: 768px) {
  
  
}
@media (prefers-reduced-motion: reduce) {
  
}

/* ---------- v43 patch: products dark bg (lost combined-selector rules) ---------- */






/* ================================================================
   v44 — CORPORATE LIGHT · 메인1(히어로)만 무대, 이하 정통 기업사이트
   서브페이지와 동일한 밝은 문서 언어 + 사진/제품 밀도
   ================================================================ */
.m-light{ background: #fff; }
.m-light .section-title{ color: var(--ink); }

/* ---------- COMPANY ---------- */















/* ---------- CAPA (icard 재사용 + 링크화) ----------
   (2026-07-21) 구 v44 홈 #capa 용 .icard__go absolute 규칙 삭제 — 유일 사용처인
   faq.php 에서 설명문 위에 겹쳐 렌더되는 버그의 원인이었다. faq 인라인 스타일이 정본. */



/* ---------- PRODUCTS ---------- */











/* ---------- SOLUTIONS (photo cards) ---------- */













/* ---------- FAMILY ---------- */










/* ---------- responsive ---------- */
@media (max-width: 1024px) {
  
}
@media (max-width: 900px) {
  
  
  
  
}
@media (max-width: 560px) {
  
  
  
  
}
@media (prefers-reduced-motion: reduce) {
  
}

/* ================================================================
   v45 — PREMIUM FINISH · 리포트 탈피: 선명한 사진, 깊이감 카드, 고급 아이콘
   ================================================================ */

/* ---------- SOLUTIONS: 사진 선명(오버레이 제거) + 텍스트 분리 ---------- */














/* ---------- CAPA: 고급 아이콘 타일 + 깊이감 카드 (index 한정) ---------- */
#capa .icard{
  border: 0; border-radius: 20px;
  box-shadow: 0 4px 14px -8px rgba(11, 18, 32, .1), 0 20px 48px -28px rgba(11, 18, 32, .18);
  padding: clamp(28px, 3.4vw, 38px);
}
#capa .icard:hover{ box-shadow: 0 8px 20px -8px rgba(11, 18, 32, .12), 0 32px 64px -28px rgba(21, 142, 206, .28); transform: translateY(-6px); }
#capa .icard__ico{
  width: 58px; height: 58px; border-radius: 17px;
  background: linear-gradient(135deg, var(--brand-500), var(--brand-700));
  color: #fff;
  box-shadow: 0 10px 22px -10px rgba(15, 118, 174, .6);
}
#capa .icard h3{ font-size: 1.18rem; }
#capa .icard p{ color: var(--gray-500); }
/* (#capa .icard__go 규칙 삭제 2026-07-21 — 홈 rx 리디자인 이후 무참조 데드코드) */


/* ---------- PRODUCTS: 플레이트 고급화 ---------- */





/* ---------- FAMILY: 보더 → 섀도우 ---------- */




/* ---------- COMPANY: 사진·지표 마감 ---------- */



/* ---------- 섹션 배경 리듬(리포트 탈피): soft 섹션 톤 업 ---------- */
.section--soft.m-light{ background: linear-gradient(180deg, var(--gray-50), #EDF2F8); }

@media (max-width: 560px) {
  
}

/* ================================================================
   v48 — MOTION POLISH (Emil Kowalski standards, animations.dev)
   press feedback on all pressables, strong easing, reduced-motion,
   hover gated to fine pointers. Only transform/opacity animated.
   ================================================================ */
:root{
  --ease-out-strong: cubic-bezier(0.23, 1, 0.32, 1);   /* Emil: strong ease-out for UI */
  --ease-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1);
}

/* Press feedback — nothing in the real world reacts to a press with no acknowledgement.
   scale 0.97-0.98, ~130ms ease-out. Applies on touch too (tap feedback is desirable). */
a.btn, button, .icard, .pills a, .dl-btn, .dest a,
.hdr-drop__menu button, .lnb a, .pager a{
  -webkit-tap-highlight-color: transparent;
}
a.btn:active, .btn:active,
.pills a:active, .dl-btn:active, .dest a:active,
.lnb a:active, .pager a:active, .hdr-drop__menu button:active,
.to-top:active, .rx-famcell:active, .icard--nav:active{
  transform: scale(0.98);
  transition: transform 130ms var(--ease-out-strong);
}
.btn:active, button.hdr-drop__btn:active{ transform: scale(0.97); }

/* Hover-lift motion gated to devices that truly hover (touch fires false hover on tap) */
@media (hover: none) {
  .icard:hover, .pills a:hover, .plogo:hover, .bv-nav__item:hover,
  .bv-attach__file:hover, .pcard:hover, .rx-famcell:hover, .qc:hover,
  .step:hover, .addr-card:hover, .icard--nav:hover{ transform: none; }
}

/* JS 미실행(차단·실패) 시 콘텐츠 백지 방지 — head 부트스트랩이 html.js 를 못 붙이면 reveal 해제 */
html:not(.js) .reveal, html:not(.js) .section-title.reveal{
  opacity: 1 !important; transform: none !important; clip-path: none !important;
}

/* 스크린리더 전용 텍스트 (표 caption·새 창 안내 등) */
.sr-only{
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* Reduced motion — keep opacity/color that aids comprehension, drop positional movement */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after{
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
  }
  .reveal{ transition: opacity 0.2s ease !important; transform: none !important; }
  a.btn:active{ transform: none; }
  
}

/* ── 푸터 주소 클릭 복사 (2026-07-29 사장님 요청) ───────────────────────────
   주소를 <button> 으로 감싼다. <dd> 안의 텍스트처럼 보이되 클릭하면 복사된다.
   기본 버튼 스타일을 전부 지우고 주변 <dd> 와 같은 서체·색을 물려받게 한다. */
.copy-addr{
  display:inline-flex; align-items:center; gap:6px;
  margin:0; padding:2px 6px 2px 0; border:0; background:none;
  font:inherit; color:inherit; text-align:left; cursor:pointer;
  border-radius:6px; position:relative;
  transition:color .18s var(--ease), background-color .18s var(--ease);
}
.copy-addr:hover{ color:#fff; background:rgba(255,255,255,.07); }
.copy-addr:focus-visible{ outline:2px solid var(--brand-300); outline-offset:2px; }
/* 아이콘은 항상 은은하게 보인다 — hover 에서만 나타나면 "복사할 수 있다"는 사실 자체를
   아무도 모른다(마우스를 굳이 주소 위에 올릴 이유가 없다). 터치기기에는 hover 가 없다. */
.copy-addr__i{
  width:14px; height:14px; flex:none; opacity:.38;
  transition:opacity .18s var(--ease), color .18s var(--ease);
}
.copy-addr:hover .copy-addr__i,
.copy-addr:focus-visible .copy-addr__i{ opacity:.9; }
/* "복사됨" 배지 — 복사 성공 시 .is-copied 가 붙는 동안만 보인다 */
.copy-addr__ok{
  position:absolute; left:100%; margin-left:8px; white-space:nowrap;
  font-size:.76rem; font-weight:700; letter-spacing:.02em;
  color:var(--brand-300); opacity:0; transform:translateX(-4px); pointer-events:none;
  transition:opacity .2s var(--ease), transform .2s var(--ease);
}
.copy-addr.is-copied .copy-addr__ok{ opacity:1; transform:none; }
.copy-addr.is-copied .copy-addr__i{ opacity:1; color:var(--brand-300); }
@media (max-width:600px){
  /* 좁은 화면에서 배지가 화면 밖으로 나가지 않게 아래로 내린다 */
  .copy-addr__ok{ left:auto; right:0; top:100%; margin:2px 0 0; }
}
