/* ==========================================================================
   METADEXTER — HEADER / GNB (전 페이지 공통 단일 소스)
   파일 위치: mockups/css/header.css
   로딩:  각 HTML <head>에서 <link rel="stylesheet" href="/css/header.css">
          (_layout.html · home.html · about.html · contact.html 4곳)
          ※ @import 쓰지 않음. 항상 맨 뒤 — styles.css 뒤(홈은 styles.css → home.css 뒤)에 둘 것.

   2026-10-15 피지컬 AI 개편 2단계 — 어두운 단일 헤더 (_design/physical-ai/hero-preview.html ·
   subpage-preview.html 4절, hero-impl-notes.md 8-1):
     · 모든 페이지에서 navy-950 불투명 + 하단 1px 선. 글자는 흰색.
     · 홈도 2026-10-30부터 같은 남색 헤더(투명 오버레이 변형 규칙 삭제 — 사진이 헤더 뒤로 올라오지 않는다).
       home.html 의 header_overlay 플래그·#hdrSentinel·js/header-scroll.js 는 남아 .site-header--overlay·.is-scrolled
       클래스를 붙이지만, 이 파일에 그 클래스 규칙이 없으므로 화면에는 영향이 없다(템플릿 정리는 별도 결정).
     · 메뉴 6개 영문(app.py GNB_ITEMS label_en). [문의하기] 버튼 제거(10-15) — 우측은 ≤960 햄버거만(.header-actions).
       모바일 패널 하단(.gnb-foot)에 Contact 강조 버튼.
       (그 자리에 있던 "XR × AI → Physical AI" 문구 .hdr-tag 는 2026-10-28 임원회의 요청으로 마크업·규칙 모두 삭제)
     · 로고(2026-10-21 mdt-logo 교체): assets/brand/mdt-logo.webp(618×88, 표시 44px → 폭 309px)
       / <400px는 워드마크 mdt-logo-wordmark.webp(421×60, 표시 30px → 폭 211px).

   이 파일이 소유하는 선택자(경계):
     .site-header .header-inner .logo .logo-img .gnb .gnb-foot .header-actions .hamburger
     .hdr-sentinel + GNB 활성 표시 + 모바일 메뉴(.gnb 패널 / .gnb-overlay / body 잠금)
     + 하위 메뉴(.gnb-item .gnb-toggle .gnb-caret .gnb-sub .gnb-l2 .gnb-l2-toggle .gnb-l3 — I절, 2026-10-28)
   소유하지 않는 것: .btn / .btn-primary / .container  → 전역(styles.css) 유지

   ⚠ 이 파일을 넣을 때 삭제한 기존 사본 (중복되면 캐스케이드가 꼬인다)
     · mockups/styles.css  구 헤더 8개 규칙·활성 표시 블록·@media 960 안의 .gnb/.hamburger
     · mockups/home.html   구 인라인 헤더 규칙
     · industry-*.html 3개는 보관 페이지라 범위 밖. 자체 헤더를 그대로 두며,
       header.css를 링크하지 않으므로 그 3페이지의 햄버거는 지금처럼 동작하지 않는다.

   토큰 의존성 (styles.css :root):
     --brand-700 --brand-600 --brand-400 --brand-100 --navy-950 --white
     --sp-2 --sp-3 --sp-4 --sp-5 --sp-6 --radius-sm
   ========================================================================== */

:root{
  /* 헤더 높이 토큰. 76px이 헤더 높이·패널 최대높이·오버레이 시작점 3곳에 쓰인다.
     로고 44px + 상하 16px. styles.css :target{scroll-margin-top:100px}도 이 값을 전제한다. */
  --header-h:76px;
  /* 어두운 헤더 토큰 (시안 1절) */
  --hdr-bg:rgba(11,18,32,.92);           /* 채워진 상태 = navy-950 92% (+blur) */
  --hdr-line:rgba(255,255,255,.12);      /* 하단 1px 경계선 */
  --hdr-fg:rgba(255,255,255,.86);        /* 비활성 메뉴 글자. navy-950 위 ≈13.9:1 */
  --hdr-fg-dim:rgba(255,255,255,.70);    /* "XR × AI →" 흐린 글자. navy-950 위 ≈9.6:1 */
  --hdr-row-line:rgba(255,255,255,.08);  /* 모바일 패널 행 구분선 */
}

/* ==========================================================================
   A. 데스크톱 기본 — 어두운 헤더
   ========================================================================== */
/* IntersectionObserver 기준점(= 스크롤 80px). home.html <body> 첫 줄에만 있다.
   문서 좌표 top:80px의 1×1px 상자가 화면 밖으로 나가면 헤더를 채운다(js/header-scroll.js). */
.hdr-sentinel{position:absolute; top:80px; left:0; width:1px; height:1px; pointer-events:none;}

.site-header{
  position:sticky; top:0; z-index:100;
  background:var(--navy-950); color:var(--white);
  border-bottom:1px solid var(--hdr-line);
  transition:background-color .2s ease, border-color .2s ease;
}
/* (2026-10-30 삭제) 홈 전용 .site-header--overlay 변형(투명 + 음수 하단 마진, .is-scrolled·.menu-open 에서 채움)
   — 홈 헤더도 위 기본 규칙(남색 불투명)을 그대로 쓴다. */
.header-inner{
  display:flex; align-items:center; justify-content:space-between;
  height:var(--header-h);
  gap:var(--sp-5);
}
.logo{display:flex; align-items:center; flex:none;}
/* <picture>는 inline 요소라 flex 아이템이 되면 줄 높이 여백이 생긴다 → 상자 없이 자식(img)만 노출 */
.logo picture{display:contents;}
/* ⚠ .logo-img → .site-header .logo-img 로 스코프를 좁혀 둔다.
   이유: .logo-img 는 헤더 로고와 "고객사 로고 그리드"(.logo-cell > .logo-img,
   logo-grid.js가 생성)가 같은 클래스명을 공유한다(styles.css 로고 그리드 규칙
   .logo-img{max-width:100%; max-height:100%; width:auto; height:auto; …}).
   헤더 안으로만 한정(0,2,0)해 그리드 규칙은 손대지 않는다.
   로고 파일: mdt-logo 618×88 → 44px일 때 폭 309px (옛 header-logo-physicalai 242px보다 67px 넓다).
   (<400px에서는 <picture>가 워드마크 mdt-logo-wordmark 421×60으로 바꾼다 → 30px일 때 폭 211px, 아래 ≤399px 규칙) */
.site-header .logo-img{height:44px; width:auto; display:block;}
/* 2026-10-21 새 로고(44px → 폭 309)는 옛 로고(242)보다 67px 넓어 961~1003px에서 헤더 한 줄이 뷰포트를 넘쳤다.
   실측(Pretendard 로드 상태): 로고 309 + 갭 24 + GNB 481.4 + 갭 24 + "XR × AI → Physical AI" 141.6 = 980
   → 좌 패딩 24 포함 1004px. 1004~1023px는 넘치진 않지만 우측 패딩 안으로 파고들어 여유 0~19px.
   그래서 961~1023px 구간만 로고를 36px(폭 253)로 줄인다 — 자연폭 924 + 24 = 948 ≤ 961, 여유 13px.
   메뉴·문구·간격은 손대지 않는다. 1024px 이상은 44px 그대로, ≤960은 햄버거 레이아웃(E절)이라 해당 없음.
   (2026-10-28 문구 141.6px 삭제 후에는 44px로도 넘치지 않지만, 이 구간 로고 크기는 그대로 둔다.) */
@media (min-width:961px) and (max-width:1023px){
  .site-header .logo-img{height:36px;}
}
.gnb{display:flex; gap:var(--sp-6); font-weight:600; font-size:15px; color:var(--hdr-fg);}
.gnb a:hover{color:var(--brand-400);}
/* 데스크톱(≥961)에서는 햄버거만 담은 빈 상자라 숨긴다 — 남겨 두면 space-between이 GNB를
   오른쪽 끝에서 띄운다(2026-10-28 문구 삭제 후 약 215px). ≤960은 E절에서 다시 flex. */
.header-actions{display:none;}
.hamburger{display:none; background:none; border:none; cursor:pointer;}
/* 패널 하단(Contact 버튼) — 데스크톱에서는 숨김. 링크 한 벌 원칙은 유지한다:
   Contact는 GNB 항목이 아니라 패널 푸터이므로 aria-current 계산에 들어가지 않는다. */
.gnb-foot{display:none;}

/* ==========================================================================
   B. GNB 현재 페이지 표시 (데스크톱)
   ==========================================================================
   ⚠ 이 블록은 반드시 위 .gnb a:hover 뒤에 와야 한다. 두 선택자의 명시도가
   (0,2,1)로 동일해서, 순서가 바뀌면 활성 항목의 흰 글자가 hover 규칙에 먹힌다.

   선택자는 .gnb a[aria-current="page"] 하나로 고정한다 — 접근성 속성과 시각
   표시를 한 훅으로 묶어, 마크업에 aria-current가 빠지면 표시도 함께 사라지게
   해서 둘이 어긋나지 않도록 한다.

   [바 위치] 텍스트 바로 아래가 아니라 76px 헤더의 하단 레일에 붙인다.
   [레이아웃 불변] font-weight는 600 유지. 바는 흐름에서 빠지는 절대배치 ::after.
   [지오메트리] 앵커를 헤더 높이만큼 늘려 bottom:-1px이 항상 레일에 떨어지게 한다.
   [대비] 흰 86% on navy-950 ≈13.9:1, 활성 흰 100% 18.7:1, brand-400 바 on navy-950 7.10:1.
     홈 투명 상태에서는 히어로가 상단 스크림(home.css .hero-glow 영역이 아니라 사진/남색 배경)
     위라 같은 수준이 유지된다.
   [색맹] 활성(흰)과 비활성(흰 86%)은 색만으로 구별되지 않는다 — 2px 바가 유일한
     형태 신호이므로 제거하지 말 것. (모바일 세로 목록에서도 같은 이유로 좌측 바를 쓴다 — E절)
   -------------------------------------------------------------------------- */
.gnb{ align-self:stretch; align-items:stretch; }
.gnb a{ position:relative; display:flex; align-items:center; white-space:nowrap; }

.gnb a[aria-current="page"]{
  color:var(--white);
  font-weight:600;           /* 상속값과 동일 — 폭 변동 방지용 명시적 고정 */
}
.gnb a[aria-current="page"]::after{
  content:'';
  position:absolute; left:0; right:0; bottom:-1px;   /* -1px: 헤더 1px 보더를 덮어 레일과 flush */
  height:2px; background:var(--brand-400);
}
/* hover는 비활성 항목과 같은 brand-400 — 활성 항목 위에서도 "눌릴 수 있다"는 피드백만 준다 */
.gnb a[aria-current="page"]:hover{ color:var(--brand-400); }

.gnb a:focus-visible{ outline:2px solid var(--brand-400); outline-offset:-4px; border-radius:2px; }

/* ==========================================================================
   C. 모바일 전용 요소의 데스크톱 기본값 (= 숨김)
   ==========================================================================
   이 규칙은 미디어쿼리 "밖"에 둔다. 그래야 JS가 .menu-open을 남겨 둔 채
   961px로 리사이즈돼도 CSS만으로 완전히 데스크톱 상태로 복귀한다.
   -------------------------------------------------------------------------- */
.gnb-overlay{ display:none; }
/* body 스크롤 잠금 클래스도 ≤960px 안에서만 효력을 갖는다 → G절 */

/* ==========================================================================
   D. 햄버거 버튼 — 44×44 터치 타깃 + ☰↔✕ CSS 모프
   ==========================================================================
   [왜 글리프(☰/✕)를 버렸나]
     · 텍스트 글리프는 실제 터치 타깃이 약 22×26px로 WCAG 2.5.8(24×24 최소) /
       모바일 관례(44×44)에 못 미친다.
     · ☰ 와 ✕ 는 폰트마다 굵기·베이스라인·폭이 달라 전환 시 아이콘이 튄다.
     · 텍스트 글리프는 스크린리더가 "삼선" 따위로 읽는다. 아래 구조는
       bars를 aria-hidden 처리하고 버튼에 aria-label을 주므로 읽힘이 깨끗하다.
   [구조] 요소 1개(.hamburger-bars)로 3줄: 자기 배경 = 가운데 줄,
          ::before/::after = 위/아래 줄. 열리면 가운데는 투명, 위/아래가 ✕로 회전.
   -------------------------------------------------------------------------- */
.hamburger{
  width:44px; height:44px; padding:0;
  place-items:center;                 /* display는 미디어쿼리에서 grid로 켠다 */
  border-radius:var(--radius-sm);
  color:var(--white);                 /* 3선이 currentColor를 따라간다 — 어두운 헤더라 흰색 */
  -webkit-tap-highlight-color:transparent;
}
.hamburger:focus-visible{
  outline:2px solid var(--brand-400); outline-offset:-4px;   /* .gnb a와 같은 관례 */
}
.hamburger-bars{
  position:relative; display:block;
  width:20px; height:2px; border-radius:1px;
  background:currentColor;
  transition:background-color .12s ease .1s;   /* 닫힐 때 회전이 끝난 뒤 가운데 줄이 돌아옴 */
}
.hamburger-bars::before,
.hamburger-bars::after{
  content:''; position:absolute; left:0;
  width:20px; height:2px; border-radius:1px;
  background:currentColor;
  transition:transform .22s cubic-bezier(.4,0,.2,1);
}
.hamburger-bars::before{ top:-6px; }
.hamburger-bars::after { top:6px;  }

/* 열린 상태의 훅은 클래스가 아니라 aria-expanded 다 — B절의 aria-current와 같은
   원칙(접근성 속성 = 스타일 훅). JS가 속성을 빠뜨리면 아이콘도 안 바뀌므로
   시각 상태와 보조기술 상태가 어긋날 수 없다. */
.hamburger[aria-expanded="true"] .hamburger-bars{
  background:transparent; transition-delay:0s;
}
.hamburger[aria-expanded="true"] .hamburger-bars::before{ transform:translateY(6px)  rotate(45deg);  }
.hamburger[aria-expanded="true"] .hamburger-bars::after { transform:translateY(-6px) rotate(-45deg); }

/* ==========================================================================
   E. 모바일 (≤960px) — 전체폭 드롭다운 패널 (어두운 테마)
   ==========================================================================
   [형태 결정: 전체폭 드롭다운 · 우측 드로어 아님]
     1) 항목이 6개 + 하단 Contact 뿐이라 360px 폭에서도 6×52px + 푸터 ≈ 440px.
        360×640 기기의 헤더 아래 가용 높이 564px에 스크롤 없이 들어간다.
     2) 햄버거가 제자리에 남는다 — 연 버튼과 닫을 버튼이 같은 좌표.
     3) 전체폭은 각 행이 화면 폭 전체라 터치 타깃이 가장 넉넉하다.
     4) 구현: .site-header가 position:sticky(=포지션드) 이므로 패널을
        position:absolute; top:100% 로 붙이면 헤더를 따라다닌다. 홈의 --overlay
        변형도 sticky 그대로라 같은 계산이 맞는다(열리면 .menu-open이 헤더를 채운다).

   [마크업 공유] 패널은 별도 <ul>이 아니라 .gnb <nav> 자체를 세로로 재배치한 것이다.
     링크 목록이 한 벌뿐이므로 aria-current="page"가 URL당 정확히 1개라는
     기존 검증이 그대로 유지된다. (두 벌로 만들면 2개가 되어 깨진다.)
   -------------------------------------------------------------------------- */
@media (max-width:960px){

  /* --- 헤더 줄 자체: 좁은 폭에서 절대 넘치지 않게 ---------------------------
     2026-10-21 새 로고 실측:
       · 400px: 패딩 16px(아래 ≤400 규칙) → 가용 368. 로고 44px(폭 309) + 햄버거 44 + 갭 12 = 365 ≤ 368 → 축소 없음(여유 3px).
       · 401~410px: 패딩 24px → 가용 353~362 → 로고가 max-width:100%로 297~306px(높이 42.3~43.6px)로 비율 유지 축소.
       · 360px(워드마크 30px, 폭 211): 211 + 44 + 12 = 267 ≤ 328 → 여유 61px. 320px도 288 가용이라 축소 없음.
     [문의하기] 버튼이 없어졌으므로 이전(394px 초과) 문제는 사라졌다.
     로고를 max-height+max-width로 두어 공간이 모자라면 비율 유지한 채 함께 줄어들게 한다. */
  .header-inner{ gap:var(--sp-3); }
  .logo{ min-width:0; flex:1 1 auto; }
  /* A절과 같은 이유로 .site-header 스코프 — 고객사 로고 그리드(.logo-cell
     > .logo-img)는 ≤960px에서 3열로 바뀔 뿐 크기 규칙은 그대로여야 한다. */
  .site-header .logo-img{
    height:auto; max-height:44px;   /* 공간이 충분하면 데스크톱과 같은 44px */
    width:auto;  max-width:100%;    /* 부족하면 비율 유지한 채 함께 줄어듦 */
  }
  .header-actions{ display:flex; align-items:center; flex:none; gap:10px; }

  .hamburger{ display:grid; }

  /* --- 패널 본체 (= .gnb 재배치) ----------------------------------------
     display:none 을 쓰지 않는 이유: none↔flex 는 트랜지션이 불가능하다.
     visibility:hidden 은 a11y 트리·탭 순서에서도 제거되므로 none과 동등하게
     안전하면서 페이드/슬라이드가 가능하다. */
  .gnb{
    position:absolute; top:100%; left:0; right:0;   /* top:100% = 헤더 패딩박스 76px */
    z-index:1;
    display:flex; flex-direction:column; align-items:stretch;
    gap:0;                                          /* 데스크톱 --sp-6 해제, 행 구분은 보더로 */
    align-self:auto;                                /* B절 stretch 해제 */
    background:var(--navy-950);                     /* 헤더가 92% 반투명(홈 채움 상태)이라도 패널은 불투명 */
    border-bottom:1px solid var(--hdr-line);
    box-shadow:0 18px 40px rgba(11,18,32,.5);
    padding:var(--sp-2) 0;

    /* 가로 랜드스케이프(예: 360×360)처럼 높이가 모자라면 패널만 스크롤 */
    max-height:calc(100vh - var(--header-h));
    overflow-y:auto;
    overscroll-behavior:contain;                    /* 패널 끝에서 배경으로 스크롤 전파 차단 */
    -webkit-overflow-scrolling:touch;

    visibility:hidden; opacity:0; transform:translateY(-8px);
    transition:opacity .22s ease, transform .22s ease, visibility 0s linear .22s;
  }
  @supports (height:100dvh){
    /* 모바일 주소창 접힘/펼침까지 반영 */
    .gnb{ max-height:calc(100dvh - var(--header-h)); }
  }
  .site-header.menu-open .gnb{
    visibility:visible; opacity:1; transform:none;
    transition:opacity .22s ease, transform .22s ease, visibility 0s linear 0s;
  }

  /* --- 행 ---------------------------------------------------------------
     16px/1.5 + 상하 14px = 52px → 44px 최소 터치 타깃을 넘긴다. */
  .gnb a{
    display:flex; align-items:center;
    padding:14px var(--sp-5);
    font-size:16px; line-height:1.5;
    white-space:nowrap;
  }
  .gnb a + a{ border-top:1px solid var(--hdr-row-line); }
  /* 하위 메뉴가 있는 대분류(.gnb-item, I절)는 <a>가 아니라 위 규칙이 닿지 않는다 — 앞뒤 행 구분선을 따로 */
  .gnb > .gnb-item,
  .gnb > .gnb-item + a{ border-top:1px solid var(--hdr-row-line); }

  /* --- 모바일 현재 페이지 표시 -------------------------------------------
     데스크톱의 "하단 2px 바"는 세로 목록에서 행 구분선과 구별되지 않아 의미가
     없다. 세로 목록의 등가물은 좌측 세로 바 + 배경 틴트.
     신호를 3중으로 겹친다: ① 위치(좌측 3px 바) ② 배경(brand-400 10% 틴트)
     ③ 색(brand-400 글자). 색만으로 구분하지 않는다.
     대비 실측: brand-400 on 틴트 합성색(≈#0A2036) ≈6.6:1 (AA 통과),
               흰 86% on navy-950 ≈13.9:1 (비활성 행).
     바는 border-left가 아니라 ::before 절대배치 — border는 행의 콘텐츠를
     3px 밀어 활성/비활성 행의 좌측 정렬이 어긋난다. */
  .gnb a[aria-current="page"]{ background:rgba(0,167,254,.10); color:var(--brand-400); }
  .gnb a[aria-current="page"]::after{ display:none; }   /* 데스크톱 하단 바 해제 */
  .gnb a[aria-current="page"]::before{
    content:'';
    position:absolute; left:0; top:0; bottom:0;
    width:3px; background:var(--brand-400);
  }

  /* --- 패널 하단: Contact 강조 버튼 ----------------------------------------
     .gnb 안의 <div>라 세로 패널의 마지막 블록이 된다. 버튼 색은 전역 .btn-primary(brand-600).
     gnb-mobile.js는 패널 안 <a> 클릭을 전부 닫기로 처리하므로 Contact 클릭도 패널이 닫힌다. */
  .gnb-foot{
    display:flex; flex-direction:column; gap:var(--sp-4);
    margin-top:var(--sp-2); padding:var(--sp-4) var(--sp-5) var(--sp-3);
    border-top:1px solid var(--hdr-row-line);
  }
  /* ⚠ transition을 반드시 좁힌다. 전역 .btn{transition:all}이 패널(.gnb)의 visibility
     hidden→visible 상속 변화까지 전이시키면서 Chrome에서 버튼이 열린 뒤에도 visibility:hidden에
     머무는 현상을 실측했다(헤드리스 Chrome, 2026-10-15). 색만 전이시키면 정상. */
  .gnb-foot .btn{ width:100%; padding:14px 20px; transition:background-color .15s ease; }

  /* --- 오버레이(딤) ------------------------------------------------------
     헤더 아래부터 화면 끝까지만 덮는다(top:var(--header-h)).
     헤더까지 덮으면 햄버거를 다시 누를 수 없게 된다.
     색은 순흑이 아니라 navy-950(#0B1220) 45% — 사이트 다크 서피스와 같은 계열. */
  .gnb-overlay{
    display:block;
    position:fixed; left:0; right:0; top:var(--header-h); bottom:0;
    z-index:10000;                       /* F절 참고 — .chat-fab-wrap(9999) 위 */
    background:rgba(11,18,32,.45);
    visibility:hidden; opacity:0;
    transition:opacity .22s ease, visibility 0s linear .22s;
  }
  .site-header.menu-open ~ .gnb-overlay{
    visibility:visible; opacity:1;
    transition:opacity .22s ease, visibility 0s linear 0s;
  }

  /* --- F. z-index 층 -----------------------------------------------------
     현재 지형 (styles.css / home.css):
       .site-header        100
       .vmodal(home 전용)  2000
       .chat-fab-wrap      9999      ← 화면 우하단 고정 "AI 상담 도우미"
       .side-widget        9999      ← 마크업이 주석 처리돼 있어 현재 비활성
       .cert-viewer        10050     ← about 증서 뷰어 (cv-locked, 별개 클래스)
       .dify-panel         2147483000
       .dify-drag-guard    2147483002
     메뉴가 열렸을 때 챗봇 버튼이 위에 떠 있으면 안 되므로 오버레이는 9999 위,
     헤더(+패널)는 다시 오버레이 위여야 한다. 헤더 z-index를 전역으로 올리지 않고
     "≤960px + 열림" 상태에서만 올려 부작용 범위를 최소화한다.
       overlay 10000  <  header.menu-open 10002  <  cert-viewer 10050
     패널은 헤더의 자식이라 헤더 스택 컨텍스트에 함께 올라간다(별도 값 불필요). */
  .site-header.menu-open{ z-index:10002; }

  /* --- G. 배경 스크롤 잠금 ------------------------------------------------
     미디어쿼리 "안"에 두는 것이 핵심이다. JS가 리사이즈 시 클래스를 못 지워도
     961px가 되는 순간 잠금이 저절로 풀린다(CSS 차원의 방어).
     iOS Safari 때문에 html에도 건다. 증서 뷰어의 .cv-locked 와는 별개 클래스다. */
  html.gnb-locked, body.gnb-locked{ overflow:hidden; }

  /* --- 아주 좁은 폭 보정 -------------------------------------------------- */
  @media (max-width:400px){
    /* container 좌우 여백 24px → 16px. 음수 margin(-8px)으로 당기면 .container의 width:auto가
       뷰포트보다 16px 넓어져 오른쪽이 8px 넘쳤다(가로 스크롤, 10/16 수정) → padding으로 줄인다. */
    .site-header .header-inner{ padding-inline:var(--sp-4); }
    /* 헤더 콘텐츠가 16px로 당겨졌으니 패널 행도 같은 좌측 기준선에 맞춘다 */
    .gnb a{ padding-left:var(--sp-4); padding-right:var(--sp-4); }
    .gnb-foot{ padding-left:var(--sp-4); padding-right:var(--sp-4); }
    /* 하위 메뉴 행의 같은 보정은 I절 끝에 있다(I절이 이 뒤에 오므로 여기 두면 덮인다) */
  }
  /* <400px: <picture>가 워드마크(mdt-logo-wordmark 421×60)로 바꾼다 — 표시 높이 30px(폭 211px). 경계는 _header.html의 media와 같다. */
  @media (max-width:399px){
    .site-header .logo-img{ max-height:30px; }
  }
}

/* ==========================================================================
   I. 하위 메뉴 — 드롭다운 (2026-10-28, Use Cases 3단 · Solutions 2단)
   ==========================================================================
   마크업(_header.html): .gnb-item > button.gnb-toggle + div.gnb-sub[hidden]
                           > ul.gnb-l2 > li > button.gnb-l2-toggle + ul.gnb-l3[hidden] > li > a   (Use Cases)
                           > ul.gnb-l2 > li > a.gnb-l2-link                                       (Solutions)
   데이터는 app.py GNB_SUBMENUS. 열림/닫힘은 /js/gnb-mobile.js 가 aria-expanded 와 패널의 hidden 을
   함께 바꾼다(둘이 어긋나지 않게 한 함수에서만).
   ⚠ hidden 속성은 UA 규칙(display:none)이라 아래에서 .gnb-sub/.gnb-l3 에 display 를 주면 덮인다 →
     .gnb [hidden] 을 !important 로 고정한다.
   [데스크톱] 대분류 아래로 패널(2단 목록), 2단을 누르면 3단이 패널 오른쪽으로 펼쳐지는 플라이아웃.
     패널은 헤더 상태(남색 / 홈 투명 / 스크롤 채움)와 상관없이 항상 불투명 navy-950 이라 글자 대비가 같다.
     위치: Use Cases(3번째)의 왼쪽 끝 ≈ 961px 화면에서 x≈470, 패널 200 + 플라이아웃 240 → 오른쪽 끝 ≈ 910 < 961.
   [모바일 ≤960] 같은 마크업을 햄버거 패널 안 아코디언으로(대분류 → 2단 → 3단 들여쓰기).
   -------------------------------------------------------------------------- */
.gnb [hidden]{ display:none !important; }

.gnb-item{ position:relative; display:flex; align-items:stretch; }
.gnb-toggle,
.gnb-l2-toggle{
  display:flex; align-items:center; gap:6px;
  margin:0; padding:0; border:0; background:none;
  font:inherit; color:inherit; text-align:left; white-space:nowrap;
  cursor:pointer; -webkit-tap-highlight-color:transparent;
}
.gnb-toggle{ position:relative; }   /* 활성 하단 바(::after)의 기준 — B절 링크와 같은 지오메트리 */
/* 데스크톱 대분류 꺾쇠는 흐름에서 뺀다 — 오른쪽 패딩 13px 안에 절대배치하고 같은 만큼 음수 마진으로 되돌려
   GNB 전체 폭을 링크만 있던 때와 똑같이 둔다(A절 961~1023px 여유 계산이 그대로 유효. 꺾쇠가 흐름에 들어가면
   GNB가 13px 넓어져 961px에서 헤더 한 줄이 뷰포트 끝 0.2px 앞까지 밀렸다 — 2026-10-28 실측).
   꺾쇠는 메뉴 사이 간격(32px) 안에 그려지고, 패딩 덕분에 꺾쇠까지 클릭 영역이다. */
.gnb > .gnb-item > .gnb-toggle{ padding-right:13px; margin-right:-13px; }
.gnb > .gnb-item > .gnb-toggle > .gnb-caret{ position:absolute; right:0; top:50%; margin-top:-5px; }
.gnb > .gnb-item > .gnb-toggle[aria-current="page"]::after{ right:13px; }   /* 활성 바는 글자 폭만(다른 메뉴와 같게) */
/* 꺾쇠: 테두리 두 변을 돌려 그린다(글리프 아님 — 폰트별 편차 없음). 대분류·모바일 2단은 아래(∨), 열리면 위(∧). */
.gnb-caret{
  flex:none; width:7px; height:7px;
  border-right:1.5px solid currentColor; border-bottom:1.5px solid currentColor;
  transform:translateY(-2px) rotate(45deg);
  opacity:.8;
}
.gnb-toggle[aria-expanded="true"] .gnb-caret{ transform:translateY(2px) rotate(-135deg); }

.gnb-toggle:hover,
.gnb-toggle[aria-expanded="true"]{ color:var(--brand-400); }
/* 활성(/cases, /cases/<id>) — B절 링크와 같은 훅·같은 표시(흰 글자 + 하단 레일 2px 바) */
.gnb-toggle[aria-current="page"]{ color:var(--white); }
.gnb-toggle[aria-current="page"]::after{
  content:''; position:absolute; left:0; right:0; bottom:-1px;
  height:2px; background:var(--brand-400);
}
.gnb-toggle[aria-current="page"]:hover,
.gnb-toggle[aria-current="page"][aria-expanded="true"]{ color:var(--brand-400); }
.gnb-toggle:focus-visible,
.gnb-l2-toggle:focus-visible{ outline:2px solid var(--brand-400); outline-offset:-4px; border-radius:2px; }

.gnb-l2, .gnb-l3{ list-style:none; margin:0; padding:0; }

/* 패널(2단) — 헤더 하단 1px 선 바로 아래에 붙인다 */
.gnb-sub{
  position:absolute; top:calc(100% + 1px); left:-20px; z-index:2;
  background:var(--navy-950);
  border:1px solid var(--hdr-line); border-top:0;
  border-radius:0 0 var(--radius-sm) var(--radius-sm);
  box-shadow:0 18px 40px rgba(11,18,32,.5);
  padding:8px 0;
  font-size:15px; font-weight:600;
}
.gnb-l2{ position:relative; min-width:200px; }   /* 3단 플라이아웃의 기준(패널 오른쪽 위에 맞춤) */
.gnb-l2-toggle{
  width:100%; justify-content:space-between;
  padding:11px 20px;
  color:var(--hdr-fg);
}
.gnb-l2-toggle .gnb-caret{ transform:rotate(-45deg); }   /* 데스크톱 2단: 오른쪽(›) — 옆으로 펼쳐짐 */
.gnb-l2-toggle:hover,
.gnb-l2-toggle[aria-expanded="true"]{ color:var(--brand-400); background:rgba(0,167,254,.10); }
/* 2단이 곧 최종 링크인 메뉴(Solutions) — 위 2단 버튼과 같은 행, 꺾쇠 없음.
   .gnb a(0,1,1)의 flex·모바일 행 패딩보다 우선하도록 .gnb 스코프(0,2,0). */
.gnb .gnb-l2-link{
  display:block; padding:11px 20px;
  color:var(--hdr-fg); white-space:nowrap;
}
.gnb .gnb-l2-link:hover{ color:var(--brand-400); background:rgba(0,167,254,.10); }

/* 3단 — 패널 오른쪽으로 펼쳐지는 플라이아웃(패널 위·아래 끝에 맞춘 같은 높이 이상) */
.gnb-l3{
  position:absolute; left:100%; top:-8px;
  min-width:240px; min-height:calc(100% + 16px);
  background:var(--navy-950);
  border:1px solid var(--hdr-line); border-top:0;
  border-radius:0 0 var(--radius-sm) 0;
  box-shadow:0 18px 40px rgba(11,18,32,.5);
  padding:8px 0;
}
.gnb .gnb-l3 a{
  display:block; padding:11px 20px;
  font-weight:500; color:var(--hdr-fg); white-space:nowrap;
}
.gnb .gnb-l3 a:hover{ color:var(--brand-400); background:rgba(0,167,254,.10); }
/* 드롭다운 안 현재 페이지 항목(2단 링크·3단 링크, aria-current="page") — hover 와 같은 톤(brand-400 글자 + 연한 배경).
   B절·E절의 대분류 활성 표시(흰 글자 + 하단 바 / 모바일 좌측 바)는 하위 항목에서는 끈다. 명시도 (0,3,1)로 둘 다 이긴다.
   글자 굵기는 각 단의 값(2단 600 · 3단 500) 그대로. */
.gnb .gnb-sub a[aria-current="page"]{ color:var(--brand-400); background:rgba(0,167,254,.10); }
.gnb .gnb-sub a[aria-current="page"]::after,
.gnb .gnb-sub a[aria-current="page"]::before{ display:none; }

@media (max-width:960px){
  /* 패널 안 세로 아코디언 — 행 높이는 링크 행(E절, 52px)과 같은 규칙: 16px/1.5 + 상하 14px */
  .gnb-item{ display:block; }
  .gnb > .gnb-item > .gnb-toggle{
    width:100%; justify-content:space-between;
    margin-right:0;
    padding:14px var(--sp-5);
    font-size:16px; line-height:1.5;
  }
  .gnb > .gnb-item > .gnb-toggle > .gnb-caret{ position:static; margin-top:0; }   /* 세로 행에서는 오른쪽 끝 흐름 배치 */
  .gnb-toggle[aria-current="page"]{ background:rgba(0,167,254,.10); color:var(--brand-400); }
  .gnb-toggle[aria-current="page"]::after{ display:none; }
  .gnb-toggle[aria-current="page"]::before{
    content:''; position:absolute; left:0; top:0; bottom:0;
    width:3px; background:var(--brand-400);
  }

  .gnb-sub{
    position:static;
    border:0; border-radius:0; box-shadow:none;
    background:rgba(255,255,255,.03);
    padding:0 0 6px;
  }
  .gnb-l2{ min-width:0; }
  /* 2단·3단 행: 12px/11px 상하 + 15px/1.5 ≈ 46.5 / 44.5px → 44px 터치 타깃 이상 */
  .gnb-l2-toggle{
    padding:12px var(--sp-5) 12px calc(var(--sp-5) + 16px);
    font-size:15px; line-height:1.5;
  }
  .gnb .gnb-l2-link{
    padding:12px var(--sp-5) 12px calc(var(--sp-5) + 16px);   /* 2단 버튼과 같은 16px 들여쓰기·행 높이 */
    font-size:15px; line-height:1.5;
    white-space:normal;
  }
  .gnb-l2-toggle .gnb-caret{ transform:translateY(-2px) rotate(45deg); }              /* 아래(∨) */
  .gnb-l2-toggle[aria-expanded="true"] .gnb-caret{ transform:translateY(2px) rotate(-135deg); }  /* 위(∧) */
  .gnb-l2-toggle[aria-expanded="true"]{ background:none; }
  .gnb-l3{
    position:static;
    min-width:0; min-height:0;
    border:0; border-radius:0; box-shadow:none; background:none;
    padding:0 0 4px;
  }
  .gnb .gnb-l3 a{
    padding:11px var(--sp-5) 11px calc(var(--sp-5) + 32px);
    font-size:15px; line-height:1.5;
    white-space:normal;
  }
  /* ≤400 — E절 끝 보정과 같은 16px 기준선, 단계마다 16px씩 들여쓰기 */
  @media (max-width:400px){
    .gnb > .gnb-item > .gnb-toggle{ padding-left:var(--sp-4); padding-right:var(--sp-4); }
    .gnb-l2-toggle,
    .gnb .gnb-l2-link{ padding-left:calc(var(--sp-4) + 16px); padding-right:var(--sp-4); }
    .gnb .gnb-l3 a{ padding-left:calc(var(--sp-4) + 32px); padding-right:var(--sp-4); }
  }
}

/* ==========================================================================
   H. 모션 민감 사용자 — styles.css 관례(@media reduce에서 transition:none)를 따름
   ==========================================================================
   visibility의 지연(0s linear .22s)까지 함께 제거되므로, reduce 환경에서는
   패널이 딜레이 없이 즉시 나타나고 즉시 사라진다 — 잔상이 남지 않는다.
   헤더 배경 전환(투명→채움)도 끈다.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce){
  .site-header,
  .gnb,
  .site-header.menu-open .gnb,
  .gnb-overlay,
  .site-header.menu-open ~ .gnb-overlay,
  .gnb-foot .btn,
  .hamburger-bars,
  .hamburger-bars::before,
  .hamburger-bars::after{
    transition:none;
  }
  .gnb{ transform:none; }   /* 슬라이드 시작 위치 제거 — 페이드도 없으니 튀지 않게 */
}
