/* ===== Duedance, Pentagram 순수 갤러리 (실측 스펙) ===== */
:root{
  /* 라틴은 Helvetica Neue, 한글은 Pretendard. Helvetica Neue 에 한글 글리프가 없어
     한글만 자연히 Pretendard 로 떨어진다. Apple SD Gothic Neo 를 빼야 그게 이긴다
     (있으면 시스템 한글이 Pretendard 를 가로챈다), 조중현 2026-07-28. */
  /* 한 서체로 두 문자를 쓴다 (조중현 2026-07-29: "영문 국문 자간이 달라서 덜그럭거린다. 프리텐다드 쓰자").
     Pretendard 는 라틴 세트까지 갖춘 서체라, 섞어 쓸 때 생기던 자간·웨이트 불일치가 사라진다.
     Helvetica Neue 를 스택에서 뺐다, 있으면 라틴을 가로채 다시 두 서체가 된다. */
  --font:"Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,sans-serif;
  --ink:#1a1a1a;
  --muted:#767676;
  --paper:#ffffff;
  --black:#0a0a0a;
  --line:#eaeaea;
  --ph:#d8d6d2;       /* 라이트 섹션 이미지 자리 (뉴트럴 그레이) */
  --ph-dark:#2b2b2b;  /* 다크 섹션 이미지 자리 */
  --dark-muted:#8c8c8c; /* 다크 배경 보조 텍스트 단일 토큰(Pentagram 실측 푸터값) */
  --edge:max(24px,6.7vw);
  /* 거터를 Collins 비율로 (조중현 2026-08-09, 노트북 1710 에서 97% 가 꽉 차 보임).
     콘텐츠가 어떤 폭에서든 화면의 86.6%(Collins 실측 1440 에서 1248)가 되도록
     --edge 를 6.7vw 비례로 둔다. 고정 캡(7/27 방식)은 1710 에서 73% 로 휑해져 폐기.
     캡 1728 과 '그 안을 비율로 채우는' 구조는 그대로다. ≤1023 은 아래 쿼리가 16/12 로 덮는다.
     1710 에서 콘텐츠 1481px(한 칸 112px), 1440 에서 1247px(한 칸 93px, 4칸 스팬 408px).
     이전 값 --edge:24px (Pentagram 실측, 조중현 2026-07-28 "Pentagram 은 폭을 좁히지 않는다"). */
  --cap:1728px;
  --gap:12px;
  /* 넓은 칼럼 간격. studio 페이지의 다단 영역(인트로 2단·프로그램 카드·팀·디렉터)이
     이 하나를 함께 쓴다 (조중현 2026-08-05 "디렉터 세션의 간격을 studio 페이지에
     전부 적용" → 64, 이어서 "컬럼간격 40px로 전면 제조정" → 40).
     디렉터 사진 트랙도 이 토큰으로 계산하므로 팀 썸네일과 크기가 갈라질 수 없다. */
  --gap-wide:40px;
  --rowgap:168px;   /* 섹션 간격. 112 → 1.5배 (조중현 2026-07-28) */
  /* 타입 6종. 이 표에 없는 크기를 새로 쓰지 않는다 (DESIGN-SYSTEM.md §2) */
  --t1:52px;  --lh1:1.05;
  --t2:32px;  --lh2:1.2;
  --t3:19px;  --lh3:1.3;
  --t4:16px;  --lh4:1.5;
  --t5:13px;  --lh5:1.25;
  --t6:12px;  --lh6:1.2;
  --disp:var(--t1);   /* 구 이름 유지, 참조가 많다 */
  --sub:var(--t2);
  /* 글줄길이 4종. 역할마다 다르게 끊는다, 하나로 자르면 페이지가 한 덩어리로 읽힌다 (§3) */
  --m-disp:24ch;
  --m-head:30ch;
  --m-lead:48ch;
  --m-body:74ch;
  /* 라운드 2단계 + 컨트롤 높이 1종 (§4·§5). 히어로 스코프에만 있던 것을 전역으로.
     programs 본문의 segtoggle 등 히어로 밖 컴포넌트도 같은 토큰을 쓴다. */
  --hr-lg:14px;
  --hr-md:9px;
  --hr-sm:4px;
  --hc:46px;
}
/* Pentagram 실측 브레이크포인트: 800px(거터 12→16) / 1024px(16→24), 캡 1728px */
/* 태블릿 티어는 기본값 40px 을 그대로 쓴다, 같은 값을 다시 적지 않는다 */
@media(max-width:1023px){:root{--edge:16px}}
/* 모바일 칼럼 간격은 양옆 마진과 같게 (조중현 2026-08-05 "모바일은 양옆 마진과 맞춰").
   숫자를 다시 적지 않고 --edge 를 그대로 참조한다, 거터가 바뀌면 같이 따라온다. */
@media(max-width:799px){:root{--edge:12px;--t1:34px;--t2:24px;--rowgap:108px;--hc:40px;--gap-wide:var(--edge)}}
*{margin:0;padding:0;box-sizing:border-box}
html{-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
body{font-family:var(--font);background:var(--paper);color:var(--ink);font-size:var(--t4);line-height:var(--lh4)}
/* 국문: 단어 중간에서 줄바꿈하지 않는다(연/결 쪼개짐 방지). 아주 긴 토큰만 폴백 분리. */
body{word-break:keep-all;overflow-wrap:break-word}
/* 본문 단락 미아(외톨이 줄) 방지 */
p,.lead-para,.c-desc,.dir-bio{text-wrap:pretty}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
em{font-style:italic}
/* ---- 언어 전환 (영문 기본 / 국문 선택) ----
   병기하면 카드·헤딩 컴포넌트가 두 줄로 깨지므로, 한 번에 한 언어만 노출한다.
   .en / .ko 는 같은 자리에서 서로를 대체하며, 선택된 쪽이 주 텍스트 스타일을 그대로 상속한다. */
.en,.ko{display:inline;color:inherit;font-size:inherit;font-weight:inherit;line-height:inherit;letter-spacing:inherit}
html[data-lang="en"] .ko{display:none}
html[data-lang="ko"] .en{display:none}
/* 한글은 자간을 좁히지 않는다 */
/* ===== 웨이트·줄높이 (조중현 2026-07-29) =====
   한 서체(Pretendard)로 두 문자를 쓰므로 문자별 보정을 두지 않는다, 자간·웨이트가 하나다.
   Pretendard 400·450 은 한글에서 얇게 읽힌다, 기본을 500 으로 올렸다
   (조중현 2026-07-29 "한글 폰트 웨이트 올려"). §2 는 여전히 두 종: 500·600.
   400 리터럴은 남기지 않는다, 제목도 --w-base 를 쓴다.
   줄높이는 한글 기준으로 잡는다, 한글이 기본 노출이고, 라틴만 조금 좁게 되돌린다. */
:root{--w-base:500;--w-strong:600;
  /* 본문 줄높이는 한글 기준이 기본이다, 라틴만 조금 좁게 되돌린다 */
  --lh-body:1.7;--lh-lead:1.45}
html[data-lang="en"]{--lh-body:1.55;--lh-lead:1.35}
body{font-weight:var(--w-base)}
/* 본문 줄높이: 한글이 기본 노출이라 지면 전체를 한글 기준으로 잡는다 */


/* 헤더 우측 도구: 검색 + 언어 */
.hdr-tools{display:flex;align-items:center;gap:20px;margin-left:28px}
/* 컨트롤 높이 1종 --hc (§5), 버튼 박스만 --hc 로 올리고 아이콘 svg 는 20px 그대로 중앙 정렬.
   20×20 박스는 히트 타깃으로도 작았다. */
.searchtoggle{background:none;border:0;padding:0;width:20px;height:20px;color:var(--ink);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center}
.searchtoggle:hover{color:var(--muted)}
.langtoggle{display:flex;align-items:center;gap:4px;font-size:var(--t4);line-height:1.25}
.langtoggle button{background:none;border:0;padding:0;font:inherit;color:var(--muted);cursor:pointer}
.langtoggle button.on{color:var(--ink)}
.langtoggle button:hover{color:var(--ink)}
.langsep{color:var(--line)}

/* 검색 패널 (Pentagram 실측: 전체 폭 오버레이, 입력 32px, 하단 보더 1px #ccc, 좌측 거터) */
.searchpanel{position:fixed;inset:0;z-index:40;background:var(--paper);
  padding-top:60px;overflow-y:auto}
.searchbar{display:flex;align-items:center;gap:16px;
  width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:40px 0 0}
#searchinput{flex:1;font:inherit;font-size:var(--t2);line-height:1.2;color:var(--ink);
  background:none;border:0;border-bottom:1px solid #ccc;padding:8px 0;outline:none}
#searchinput::placeholder{color:var(--muted)}
#searchinput::-webkit-search-cancel-button,#searchinput::-webkit-search-decoration{-webkit-appearance:none;display:none}
#searchinput:focus{border-bottom-color:var(--ink)}
.searchclose{background:none;border:0;font-size:var(--t2);line-height:1;color:var(--muted);cursor:pointer;padding:0 4px}
.searchclose:hover{color:var(--ink)}
.searchresults{width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:32px 0 96px}
.searchhit{display:grid;grid-template-columns:120px 1fr;gap:4px var(--gap);align-items:baseline;
  padding:16px 0;border-top:1px solid var(--line);color:inherit}
.searchhit:hover .searchhit-title{color:var(--muted)}
.searchhit .pill{justify-self:start}
.searchhit-title{font-size:var(--t3);font-weight:var(--w-strong);line-height:25px}
.searchhit-desc{grid-column:2;font-size:var(--t4);color:var(--muted);line-height:1.25}
.search-none{font-size:var(--t4);color:var(--muted);padding:16px 0}
@media(max-width:799px){
  .hdr-tools{margin-left:auto;margin-right:12px;gap:14px}
  .searchhit{grid-template-columns:1fr}
  .searchhit-desc{grid-column:1}
  #searchinput{font-size:var(--t2)}
}

/* 포커스 링 (Pentagram 실측: outline 2px solid, 다크 컨텍스트는 흰색) */
:focus-visible{outline:2px solid var(--ink);outline-offset:2px}
footer a:focus-visible,.banner :focus-visible{outline-color:#fff}
.bslide:focus-visible{outline-offset:-3px}
/* 이미지 hover 페이드 (Pentagram 실측: 이미지에만 300ms, nav·텍스트는 0s) */
.card .thumb,.wgrid a img,.post .shot{transition:opacity .3s cubic-bezier(.4,0,.2,1)}
@media(prefers-reduced-motion:reduce){*{transition-duration:0s!important}}
/* CMS 이미지 슬롯 통일: div 자리표시자를 img로 (aspect-ratio+회색 배경 유지) */
.card .thumb,.tmember .thumb,.post .shot,.fullbleed .shot{object-fit:cover;width:100%}
.wrap{width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto}
.wrap.rowgap-top{padding-top:var(--rowgap)}

/* ---- Header : 60px, static, 투명 ---- */
header{height:60px;display:flex;align-items:center;justify-content:space-between;
  width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;
  padding:0;position:relative;z-index:20}
/* 워드마크는 글자가 아니라 심볼이다 (조중현 2026-08-06). 헤더는 정지된 정본 심볼이고,
   춤추는 쪽은 studio 상단 자리 하나로 보냈다 (조중현 "그냥 스틸svg가 나은거 같아").
   머리에서 계속 움직이면 페이지마다 눈이 그리로 끌린다, 로고는 가만히 있는 게 맞다.
   글자 'Duedance' 는 .sr-only 로 남겨 둔다. 읽는 기계(스크린리더·크롤러)에게 이 링크가
   무엇인지 말하는 유일한 문자열이고, 전 페이지 머리에 브랜드명이 있다는 사실 자체가
   생성형 검색에서 엔티티를 잇는 신호다. 보이는 자리에서만 뺀 것이다. */
.wordmark{font-size:var(--t3);font-weight:var(--w-strong);letter-spacing:-.01em;line-height:25px;
  display:inline-flex;align-items:center}
/* 색은 currentColor 를 따른다, 그래서 흰 헤더(feed)에서도 저절로 흰 심볼이 된다.
   viewBox 안에 여백이 있어 실제 그림은 상자의 4분의 3쯤이다, 그만큼 상자를 크게 잡는다. */
/* 정본 심볼의 패스를 그대로 심는다. favicon.svg 를 <img> 로 걸면 그 파일에 검정(#040000)이
   박혀 있어 흰 글자를 쓰는 feed 헤더에서 혼자 검정으로 남고, CSS 마스크로 우회하면
   file:// 로 열었을 때 마스크가 로드되지 않아 심볼이 통째로 사라진다. 인라인이면
   fill:currentColor 한 줄로 색이 따라오고 어떤 방식으로 열어도 보인다.
   높이 40px 은 앞서 춤 심볼이 서 있던 크기와 같다, 파일 비율(198.33×231.59)로 폭을 맞춘다. */
.wordmark-logo{width:34px;height:40px;display:block;flex:0 0 auto}
@media(max-width:799px){.wordmark-logo{width:29px;height:34px}}
/* 춤 심볼은 studio 상단에만 있다. viewBox 안 여백 때문에 그림이 상자의 4분의 3쯤이라,
   예전 정본 이미지(120px)와 같아 보이려면 상자를 그만큼 크게 잡는다. */
/* 누르면 부르르 떤다 (site.js), 그래서 커서가 손이다. .enter 는 군중 기믹으로 새로 오는
   사람의 첫 프레임이고, 클래스가 떨어지면서 스르륵 나타난다. */
.symbol-dance{aspect-ratio:1;display:block;flex:0 0 auto;position:relative;cursor:pointer;transition:opacity .5s}
.symbol-dance.enter{opacity:0}
.symbol-dance svg{display:block}
/* 춤 심볼의 말풍선 (조중현 2026-08-11 "머리 위로 말풍선이 뜨고 문워크.. 리브랜딩..
   같이 말이 나오면 재밌을거 같아"). site.js 가 마디마다 단어를 갈아 끼우고 머리 좌표를
   left/top %로 넣어 준다, 그래서 문워크로 미끄러지면 말풍선도 머리를 따라간다.
   채운 상자에 흰 글자다. 서서 숨 쉬는 1.5초에는 사라진다(.on 이 빠진다),
   그 정지가 로고로 읽히는 순간이라 말을 시키지 않는다. */
/* 자리는 site.js 가 transform 하나로 옮긴다 (left/top 을 매 프레임 갱신하면 초당 60번
   문서 리플로를 강제한다 — 조중현 2026-08-11 "좀 느려지는거 같은데" 의 원인 하나).
   머리 위 26px 여백도 그 transform 문자열 안에 있다. */
.dance-bubble{position:absolute;left:0;top:0;
  background:var(--ink);color:var(--paper);font-size:var(--t5);line-height:var(--lh5);
  padding:7px 11px;border-radius:var(--hr-md);white-space:nowrap;
  opacity:0;transition:opacity .18s;pointer-events:none}
.dance-bubble.on{opacity:1}
.dance-bubble::after{content:"";position:absolute;left:50%;top:100%;margin-left:-5px;
  border:5px solid transparent;border-top:6px solid var(--ink);border-bottom:0}
header nav ul{display:flex;gap:28px;list-style:none}
header nav a{font-size:var(--t4);font-weight:var(--w-base)}
header nav a:hover{color:var(--muted)}
header nav a[aria-current="page"]{color:var(--muted)}
/* 햄버거: 데스크톱에선 숨김 (Pentagram도 <800px에서만 노출) */
/* 컨트롤 높이 1종 --hc (§5), 같은 헤더의 .searchtoggle 과 같은 규격.
   햄버거 라인(24×18)은 패딩으로 중앙에 두고, 아이콘 우단이 캡 선에 오도록 패딩만큼 내민다. */
.navtoggle{display:none;background:none;border:0;width:60px;height:60px;padding:21px 18px;
  margin-right:calc(var(--edge)*-1);
  flex-direction:column;justify-content:space-between;cursor:pointer}
.navtoggle span{display:block;height:1px;width:100%;background:var(--ink);transition:transform .3s cubic-bezier(.4,0,.2,1)}

/* ---- Hero 배너 캐러셀 (Pentagram 실측: 7:3 풀블리드, 모바일 3:4, 100vh 아님) ---- */
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* 배너는 풀블리드가 아니라 캡(1728px) 폭. 그 이상 뷰포트에선 중앙 정렬 (실측: 2560px에서 left=416) */
.banner{position:relative;width:100%}
/* ===== 히어로 카드 덱 (조중현 2026-07-28) =====
   평평한 필름 트랙을 걷어내고 카드 덱으로 바꿨다. 가운데 카드가 서고 좌우 이웃이
   뒤에서 비켜 보인다. 스크롤 컨테이너가 아니라 변형 무대다, 손으로 밀 수 있어야 하고,
   위치는 스크립트가 transform 으로 정한다(스크롤 위치 역산 폐기).
   카드 크기는 여기서 한 벌로 정한다. 무대 높이는 카드 높이 + 이웃이 내려앉을 자리 + 그림자. */
/* 세로 스택 치수. --ch(펼친 카드 높이)는 스크립트가 실측해 넣는다.
   미디어 비율에서 나오는 값이라 CSS 로는 px 로 못 적는데, 접힘/펼침을 transition 하려면
   양끝이 모두 px 여야 한다 (조중현 2026-07-28). */
/* 필름 스트립 (조중현 2026-08-04 "롤링 디자인이 별로야, 다른 방식" → 필름 스트립 선택).
   가로 아코디언(단색 세로 캡슐 + 세운 라벨)을 버렸다, 캡슐은 커버도 버튼도 아닌
   애매한 물건이었다. 이제 이웃도 자기 커버 그대로의 카드다. 모두 같은 크기로 나란히
   서고, 무대 양 끝에서 --sw 폭만큼만 조각으로 내다보인다(peek). 잘림은 무대의
   overflow:hidden 이 맡는다, 조각이라도 실제 작업 이미지라 '옆에 다음이 있다' 로 읽힌다.
   --sw: 이웃이 내다보이는 폭. 캡슐 시절의 이름을 그대로 쓴다, 카드 폭 식
   calc(100% - 2*(--sgap + --sw)) 이 JS(cardW)와 CSS 에 같은 꼴로 있기 때문이다. */
/* --car = 카드의 가로/세로. 커버 정본이 3:2(2025x1350)이므로 히어로도 3:2 다
   (조중현 2026-08-12 "썸네일 비율과 통일"). 데스크톱이 2.05 이던 동안 히어로만 커버
   위아래를 크게 잘라 써서, 같은 그림이 work 그리드와 다르게 보였다. */
/* 리볼버 무대 값 (2026-08-05, 2026-08-12 다섯 겹). 이웃 카드는 자기 띠의 바깥 끝을
   경첩 삼아 안쪽으로 접혀 들어간다. --ang 은 첫 겹, --ang2 는 그 바깥 겹의 각이다
   (클수록 깊이 눕는다). --persp 는 보는 거리(작을수록 원근이 세다).
   --cw(카드 폭) --ch(카드 높이) --band(한쪽 띠 폭)은 site.js 의 measure() 가 적는다. */
/* 데스크톱 무대 높이 = (무대폭 − --hbase) ÷ --hdiv. 다섯 겹이 되면서 카드 폭을 높이에서
   역산하게 됐는데(높이 × --car), 그러면 높이를 정할 기준이 사라진다. 그래서 예전 식
   (펼친 카드 폭 ÷ 2.05)을 상수로 남겨 무대 높이가 지금 있던 자리에 그대로 서게 한다
   (조중현 2026-08-12 "높이 유지"). 324 는 예전 좌우 띠 2 × (12 + 150) 이다. */
.banner{--sw:150px;--sgap:12px;--car:1.5;--ang:44;--ang2:64;--persp:1100px;
  --hbase:324px;--hdiv:2.05;--cw:600px;--band:150px}
/* 히어로가 배너 단독 전폭이 됐다 (조중현 2026-08-04 "히어로 영역은 배너롤링만").
   2026-08-05 에 카드 자체를 1.5배 높여봤다가 되돌렸다 (조중현 "섹션 크기를 조정하라는게
   아니었고"). 히어로에 숨 쉴 자리가 필요한 것이었고, 그건 .heroframe 의 위아래 여백이다. */
/* isolation:isolate, 카드 z-index(최대 30)를 이 무대 안에 가둔다.
   가두지 않으면 검색 패널(z-index 15) 위로 카드가 올라와 검색 결과를 못 누른다
   (조중현 2026-07-28: clicktest '검색 결과 클릭 → 이동' 이 이걸 잡았다).
   세로로 굴러가므로 끌기는 걸지 않는다, 페이지 세로 스크롤과 싸운다. 띠를 누르거나
   인디케이터·화살표 키로 옮긴다. */
/* overflow:hidden, 필름 스트립의 핵심이다. 이웃 카드는 무대 밖까지 이어지고,
   무대 경계가 조각(peek)을 잘라낸다. 그림자는 2026-07-30 에 없앴으므로 잘릴 것도 없다. */
.deck{position:relative;width:100%;overflow:hidden;isolation:isolate}
/* 원근은 카드의 부모가 준다, 여기 걸어야 카드가 실제로 뒤로 접힌다.
   preserve-3d 를 함께 준다 (2026-08-06). 이걸 빼면 카드끼리는 z-index 순서로만 겹치는데,
   접힌 카드는 경첩(무대 경계)에서 z=0 이고 안쪽으로 갈수록 뒤로 물러나는 비스듬한 면이라
   '앞이냐 뒤냐' 가 한 장 안에서도 갈린다. 순서를 손으로 정하면 굴러가는 도중 어느 쪽으로
   정해도 틀리고, 도중에 바꾸면 화면이 튄다. preserve-3d 면 브라우저가 픽셀마다 실제
   깊이로 정렬하므로, 접혀서 물러난 부분은 저절로 평평한 카드 뒤로 들어간다. */
.dring{position:absolute;inset:0;perspective:var(--persp,1100px);transform-style:preserve-3d}
/* 카드 높이는 내용이 정한다. 4:5 로 못박았더니 가로 미디어 아래로 흰 여백이 크게 남았다
   (조중현 2026-07-28). 미디어 4:3 + 이름 캡슐 한 줄 = 거의 정사각 카드. */
/* 카드는 무대 가운데를 기준으로 서고, 접힌 캡슐들이 좌우에 쌓인다.
   폭·위치가 한 이징으로 함께 움직여야 '접힌다'로 읽힌다 (조중현 2026-07-28). */
/* 카드 면(흰 컨테이너)은 없앴다, 썸네일이 곧 카드다 (조중현 2026-07-28).
   그림자도 없앴다 (조중현 2026-07-30 "히어로 영역에서 그림자 지워봐").
   면이 직각이 된 뒤에는 떠 있는 그림자가 액자와 어긋나 보였다. 종이 위에 놓인 인쇄면처럼 둔다.
   2026-08-12 에 다섯 겹이 된 뒤 두 번 다시 대봤고 둘 다 걷어냈다. 접힌 면을 겹마다
   어둡게 덮는 그늘(조중현 "딤드처리가 아니라"), 그리고 7월에 지웠던 그 드롭섀도우를
   그대로 되살린 것(조중현 "완전 별로다 그냥 제거해"). 카드가 3D 로 누워도 결론은 같다,
   히어로는 그림자 없이 종이 위 인쇄면으로 둔다. 깊이는 원근 하나로만 낸다. */
/* 폭도 스크립트가 준다 (2026-08-12). 다섯 겹이 되기 전에는 폭이 먼저였고
   (무대 − 좌우 띠) 높이가 거기서 나왔는데, 이제 높이가 먼저고 폭이 3:2 로 따라온다.
   좌우에 남는 자리를 두 겹이 나눠 쓰므로 띠 폭을 CSS 에서 미리 적을 수 없다. */
.dcard{position:absolute;left:50%;top:50%;translate:-50% -50%;
  width:var(--cw,600px);height:var(--ch,360px);
  display:flex;flex-direction:column;
  border-radius:var(--hr-lg);color:var(--ink);overflow:hidden;
  will-change:transform;backface-visibility:hidden}
/* transform 에 transition 을 걸지 않는다 (2026-08-05). 자리와 각도가 서로 다른 속도로
   가야 하는데 transition 은 둘을 한 곡선에 묶는다. 그러면 중앙을 지나는 큰 카드가
   누운 채 무대를 가로지르며 위아래가 잘려 보인다. site.js 의 roll() 이 프레임마다 그린다. */
/* 이웃 카드: 크기·미디어 모두 가운데와 같다, 상태(is-off)는 역할만 바꾼다.
   진입점(⊕)은 가운데만 가진다. 44px 조각 시절 커버 대신 채우던 대표색(--solid)은
   폐기, 150px 조각은 작업이 실제로 보인다. */
.dcard.is-off .dcard-go{display:none}
.dcard-open{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;color:inherit}
/* 미디어가 카드를 그대로 채운다, 안쪽에 별도 창을 두지 않는다 */
.dcard-media{position:relative;display:block;flex:1 1 auto;min-height:0;overflow:hidden;
  background:var(--ph)}
.bshot{width:100%;height:100%;object-fit:cover;display:block;background:var(--ph);
  transition:opacity .42s cubic-bezier(.22,.61,.36,1)}
/* 제목 오버레이·스크림은 폐기 (2026-08-04 필름 스트립과 함께), 커버 위에 글자를
   얹지 않는다, 카드가 커버 그대로 보이는 게 정본이다. */
/* 원형 진입점, 레퍼런스의 아이콘 캡슐과 같은 어휘 */
/* 오른쪽 위로 올렸다, 아래에 두면 긴 제목이 ⊕ 를 파고든다 (조중현 2026-07-28).
   아래 띠는 제목이 온전히 쓰고, 진입점은 이미지 위 모서리에 선다. */
.dcard-go{position:absolute;right:14px;top:14px;width:var(--hc);height:var(--hc);border-radius:var(--hr-sm);
  background:var(--ink);display:grid;place-items:center;
  transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .34s cubic-bezier(.4,0,.2,1)}
/* 제목 (2026-08-06). ⊕ 왼쪽에 같은 높이·같은 모서리의 알약으로 붙는다, 태그 칩과 같은 어휘다.
   평소에는 ⊕ 뒤에 숨어 있다가 손이 히어로 위로 오면 왼쪽으로 밀려 나온다. 커버가 주인공이라
   가만히 있을 때는 글자를 얹지 않는다 (2026-07-28 제목 오버레이 폐기와 같은 이유).
   숨을 때 오른쪽으로 8px 만 물리는 게 아니라 ⊕ 폭만큼 물려 두면, 나오는 동작이 '버튼 뒤에서
   빠져나온다' 로 읽힌다. transform 만 쓰고 폭은 건드리지 않는다, 폭을 애니메이션하면
   글자가 매 프레임 다시 줄바꿈을 계산한다. */
.dcard-name{position:absolute;right:calc(14px + var(--hc) + 6px);top:14px;
  height:var(--hc);display:inline-flex;align-items:center;padding:0 16px;
  border-radius:var(--hr-sm);background:var(--ink);color:var(--paper);
  font-size:var(--t4);line-height:1.2;white-space:nowrap;
  opacity:0;transform:translateX(calc(var(--hc) + 6px));pointer-events:none;
  transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .42s cubic-bezier(.22,.61,.36,1)}
/* 가운데 카드만이다. 접힌 이웃은 ⊕ 도 없고, 누워 있어 글자가 읽히지도 않는다. */
@media(hover:hover) and (pointer:fine){
  .deck:hover .dcard.is-on .dcard-name{opacity:1;transform:none}
}
/* 손을 올려두는 동작이 없는 기기에서는 늘 보여준다 (조중현 2026-08-06 "모바일에서는 항상").
   좁은 화면을 함께 묶은 건 데스크톱 창을 줄여 볼 때도 같게 보이는 편이 낫기 때문이다. */
@media(hover:none),(max-width:799px){
  .dcard.is-on .dcard-name{opacity:1;transform:none}
}
/* 좁은 화면에서는 카드도 좁다. 긴 이름이 커버를 가로지르지 않게 남는 폭 안에서 자른다.
   ⊕ 자리(--hc)와 좌우 여백 14 씩, 둘 사이 6 을 뺀 만큼이 제목이 쓸 수 있는 폭이다. */
@media(max-width:799px){
  /* ⊕ 가 11px 로 올라붙으므로(위 .dcard-go 규칙) 제목도 같은 기준을 쓴다, 안 그러면 3px 어긋난다 */
  .dcard-name{display:block;padding:0 12px;font-size:var(--t5);line-height:var(--hc);
    top:11px;right:calc(11px + var(--hc) + 6px);
    max-width:calc(100% - 28px - var(--hc));overflow:hidden;text-overflow:ellipsis}
}
@media(prefers-reduced-motion:reduce){.dcard-name{transition:opacity .3s linear}}
.dcard-go::before,.dcard-go::after{content:"";position:absolute;background:var(--paper)}
.dcard-go::before{width:15px;height:1.5px}
.dcard-go::after{width:1.5px;height:15px}
.dcard.is-on .dcard-open:hover .dcard-go{transform:rotate(90deg)}
/* 이웃 조각은 눌러서 가운데로 '가져오는' 것이다, 프로젝트로 가는 게 아니다.
   누르는 자리는 카드가 아니라 무대 좌우에 얹은 투명한 띠다(site.js 가 만든다).
   3D 로 누운 면은 마우스 판정을 받지 못하기 때문이다. 폭은 접힌 면이 비치는 폭과 같다.
   겹마다 자리를 따로 둔다 (2026-08-12). 안쪽 겹을 누르면 한 칸, 바깥 겹을 누르면
   두 칸 간다, 누른 카드가 가운데로 온다는 약속이 겹이 늘어도 그대로여야 한다.
   자리와 폭은 site.js 가 px 로 적는다, 겹 수와 띠 폭이 화면 폭마다 달라진다. */
.dhit{position:absolute;top:0;bottom:0;
  z-index:40;background:none;border:0;padding:0;cursor:pointer;-webkit-appearance:none}
.dcard.is-off{cursor:pointer}
.dcard.is-off .dcard-open{pointer-events:none}
@media(prefers-reduced-motion:reduce){.dcard,.dcard-go,.dcard-media .bshot{transition:none!important}}
/* 설명 줄(덱 아래). 이름은 카드 안에 있으니 여기선 감춘다, 같은 말을 두 번 하지 않는다. */
.bcap{display:block;font-size:var(--t4);font-weight:var(--w-base);line-height:20px}
.bname{display:none}
.bdesc{display:block}
/* 제목 줄(.btitles)·진행 획(.bdots)은 2026-08-04 은퇴, 덱 아래는 태그 줄 하나다.
   진행 획이 맡던 위치·지속시간 표시는 태그 줄(활성 칩)과 자동 롤링 자체가 대신한다. */
/* 모바일: 카드를 키우고 이웃 조각은 살짝만 비치게, 좁은 폭에서 조각이 크면 다 흐릿해진다 */
/* 모바일: 비치는 폭이 34px 뿐이라 접힌 면이 거의 안 보인다. 보는 거리를 당겨
   좁은 폭 안에서도 원근이 읽히게 한다. */
@media(max-width:799px){.banner{--sw:28px;--sgap:6px;--persp:520px}
  .dcard{border-radius:20px}
  .dcard-go{right:11px;top:11px}
}

/* ---- 테마 섹션 (헤드라인 + 좁은 본문 + 캐러셀) ---- */
section{padding-top:24px}
/* 아래 여백은 다음 섹션 .page-head 의 pt 48 과 합쳐 --rowgap 이 된다 (§8 요소 기준 간격) */
.theme{padding:var(--rowgap) 0 calc(var(--rowgap) - 48px)}
.theme .disp,.thematic .disp{font-size:var(--disp);font-weight:var(--w-base);line-height:1.05;letter-spacing:-.02em;max-width:min(100%,var(--m-disp));text-wrap:pretty}
.theme .lede,.thematic .lede{max-width:min(100%,var(--m-lead));margin-top:26px;color:var(--muted);font-size:var(--t4);line-height:var(--lh-lead)}

/* ---- 배경 컨테이너 섹션 (Pentagram .block--dark.thematic 실측) ----
   풀블리드 아님. 블록 폭 = min(뷰포트, 1728) 중앙 정렬 (2000px→left 136, 2560px→left 416).
   안쪽 컨테이너 = 블록 폭 − 좌우 거터(24px, 1536px 이상은 32px).
   bg #222, padding 48px 0 64px. 내부 카드 이미지는 #000 + radius 8px (rounded-8). */
.thematic{background:#222;color:#fff;padding:48px 0 64px;margin-top:24px;
  width:min(100%,var(--cap));margin-inline:auto;--thpad:24px}
@media(min-width:1536px){.thematic{--thpad:32px}}
@media(max-width:1023px){.thematic{--thpad:var(--edge)}}
.thematic > .wrap{width:100%;max-width:none;padding-inline:var(--thpad)}
.thematic .lede{color:var(--dark-muted)}
.thematic .c-title{color:#fff}
.thematic .c-desc{color:var(--dark-muted)}
.thematic .card .thumb{background:#000;border-radius:0}  /* 카드는 직각 (조중현: 라운드 금지) */
/* Pentagram 다크 섹션 실측: 카드는 절대 줄바꿈하지 않는다.
   1440→286px, 900→174px 로 비율대로 줄고, 375px 에선 158px 로 고정된 채 가로로 밀린다(peek). */
/* 서비스 카드 캐러셀 (네이버 쇼핑 레퍼런스, 조중현 2026-07-22):
   - 카드는 항상 온전히 보인다(잘림·peek 없음). 한 화면에 정수 개(--cols)만.
   - 우측 상단 ‹ › 화살표로 넘긴다. '더보기'는 마지막 온전한 카드로 자연스럽게 이어진다.
   - "다 보이는 건 필요 없어" = 한 번에 다 안 보이고 화살표로 넘김. */
.rail-carousel{margin-top:56px}
.rail-head{display:flex;justify-content:flex-end;align-items:center;margin-bottom:20px}
.rail-nav{display:flex;gap:8px}
.rail-nav button{width:40px;height:40px;border-radius:var(--hr-sm);border:1px solid #3a3a3a; /* 아이콘 버튼은 --hr-sm 정사각 (§4) */
  background:transparent;color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;
  font-size:var(--t3);line-height:1;transition:background .2s,border-color .2s,opacity .2s}
.rail-nav button:hover:not(:disabled){background:rgba(255,255,255,.12);border-color:#5a5a5a}
.rail-nav button:disabled{opacity:.28;cursor:default}

/* 카드는 크게, 마지막 보이는 카드가 절반쯤 걸쳐 "옆에 더 있다"를 알린다(peek).
   오른쪽은 왼쪽 거터를 강제 복제하지 않고 블록 가장자리까지 흘러나간다(margin-right 로 bleed).
   ›를 누르면 옆으로 밀리며 See more 가 온전히 드러난다. See more 는 끝에서 우측 거터를 갖는다(scroll-padding-right). */
.rail.rail-5{--peek:4.5;display:flex;flex-wrap:nowrap;gap:var(--gap);overflow-x:auto;
  scroll-snap-type:x proximity;scrollbar-width:none;-ms-overflow-style:none;scroll-behavior:smooth;margin-top:0;
  margin-right:calc(-1 * var(--thpad));padding-right:var(--thpad);scroll-padding-right:var(--thpad)}
.rail.rail-5::-webkit-scrollbar{display:none}
.rail.rail-5 > .card{flex:0 0 calc(100% / var(--peek) - var(--gap));scroll-snap-align:start}
@media(max-width:1023px){.rail.rail-5{--peek:2.5}}
@media(max-width:799px){.rail.rail-5{--peek:1.35}}
/* '더보기' 카드, 다른 서비스 카드와 완전히 같은 스타일(같은 검정 썸네일, 테두리 없음).
   차이는 썸네일 안 화살표 하나뿐. "마지막 카드만 스타일 다르다"를 없앤다. */
.card-more .more-face{display:flex;align-items:center;justify-content:center}
.card-more .more-arrow{font-size:var(--t1);line-height:1;color:#fff;
  transition:transform .3s cubic-bezier(.4,0,.2,1)}
.card-more a:hover .more-arrow{transform:translateX(8px)}
@media(max-width:799px){.card-more .more-arrow{font-size:var(--t2)}}

/* 서비스 5축 (studio), 홈 카드가 각 항목으로 착지.
   2026-08-05 (조중현 "같은 디자인으로 통일"): 번호 칼럼 + 항상 펼친 본문을 버리고
   상황 목록과 같은 행(.prog/.progline/.progpanel)을 쓴다. 치수를 여기서 다시 적지
   않는다, 한 벌을 나눠 써야 두 탭의 행 높이가 저절로 같다. 이 목록은 <ol> 이라
   목록 표식만 지운다. 세로 여백은 .proglist 가 준다. */
.services{list-style:none;margin:0}
#services{scroll-margin-top:88px}

/* ---- 캐러셀 ---- */
/* rail: 3개 고정 서비스 쇼케이스, 태블릿에서도 3열 유지 (2열 강제 시 3번째 카드가 고아가 됨) */
.rail{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap);margin-top:56px}
.card .thumb{aspect-ratio:3/4;background:var(--ph)}
/* 서비스 카드도 다른 카드와 같은 a>img+figcaption 문법 (Pentagram .thematic 카드 실측) */
.rail .card a{display:block;color:inherit}
.rail .card a:hover .c-title{color:var(--muted)}
.rail .card a:hover .thumb{opacity:.85}

/* ---- 앵커 (조용한 텍스트) ----
   위 간격은 --rowgap 하나가 정한다 (§8). 앞선 풀블리드 샷의 mb 12 는 이 마진과 겹치므로(collapse)
   빼지 않고 --rowgap 자체를 쓴다. 아래 패딩 0, 푸터 간격은 .footwrap 의 mt --rowgap 이 만든다. */
.anchor{text-align:left;margin-top:var(--rowgap);font-size:var(--t4);color:var(--muted)}
.anchor a{color:var(--muted);display:inline-block;padding:10px 0;text-decoration:underline;text-underline-offset:2px}
.anchor a:hover{color:var(--ink)}

/* ---- Footer (Pentagram 실측: 배경 #000, 키라인 #333, 라벨 좌 / 내용 우 2단 행, 대형 워드마크) ---- */
.footwrap{background:#000;margin-top:var(--rowgap)}
footer{color:var(--dark-muted);width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:0 0 24px}
/* 행: 좌 라벨 / 우 내용. 콘텐츠 1392px 기준 (1392-12)/2=690, 우측 열은 726px에서 시작 */
.footrow{display:grid;grid-template-columns:1fr 1fr;gap:32px var(--gap);
  border-top:1px solid #333;padding-top:24px;padding-bottom:48px}
.footlabel{font-size:var(--t4);font-weight:var(--w-strong);color:#fff;line-height:1.25}
.footbody{font-size:var(--t4);line-height:1.25}
/* Recent News, 정사각 썸네일 + 12px gap, 제목은 썸네일 아래가 아니라 옆이다
   (조중현 2026-08-11). 예전에는 세 자식이 자동 배치돼 매체·날짜만 오른쪽으로 가고
   제목이 다음 줄로 떨어졌다. 이제 셋 다 오른쪽 칸에 세운다.
   썸네일은 언론사 이미지라 우리가 못 다듬는다, 비율만 두고 확 줄였다
   (조중현 2026-08-12, 222 → 96). */
.foot-newslist{list-style:none}
.foot-newslist li{padding:24px 0;border-top:1px solid #333}
.foot-newslist li:first-child{border-top:0;padding-top:0}
.foot-newslist a{display:grid;grid-template-columns:96px minmax(0,1fr);
  grid-template-rows:auto auto 1fr;gap:6px var(--gap);align-items:start;color:inherit}
.foot-newslist a:hover .foot-title{color:var(--dark-muted)}
.foot-newslist a:hover .foot-thumb{opacity:.85}
.foot-thumb{grid-column:1;grid-row:1/4;width:96px;aspect-ratio:1/1;object-fit:cover;
  background:var(--ph-dark);transition:opacity .3s cubic-bezier(.4,0,.2,1)}
.foot-newslist .c-meta{grid-column:2;grid-row:1;margin-top:0}
.foot-title{grid-column:2;grid-row:2;display:block;margin-top:2px;color:#fff;
  font-size:var(--t4);line-height:1.35}
/* 본문 조금. 원문의 공유 요약이고, 네 줄에서 끊는다 */
.foot-desc{grid-column:2;grid-row:3;color:var(--dark-muted);font-size:var(--t5);line-height:1.5;
  display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
@media(max-width:799px){
  .foot-newslist a{grid-template-columns:64px minmax(0,1fr)}
  .foot-thumb{width:64px}
  .foot-desc{-webkit-line-clamp:2}
}
/* 뉴스 전체 보기는 밑줄 링크 → pill 버튼 (조중현 2026-08-12 "푸터에 뉴스 전체보기는
   버튼 디자인해"). 본문 CTA pill(a.pill)과 같은 규격(--hc·0 18px·라운드 4px)이고
   색만 어두운 지면 것, footer .pill 과 같은 rgba 흰 채움에 글자는 흰색이다.
   마크업 클래스는 더하지 않는다, build.py 푸터 함수의 정규식이
   <a class="foot-more" href="..."> 문자열 그대로를 잡는다. */
.foot-more{display:inline-flex;align-items:center;margin-top:16px;min-height:var(--hc);
  padding:0 18px;border-radius:var(--hr-sm);background:rgba(255,255,255,.12);
  color:#fff;font-size:var(--t4)}
.foot-more:hover{background:rgba(255,255,255,.2)}
footer .pill{background:rgba(255,255,255,.12);color:rgba(255,255,255,.56)}
footer .date{color:var(--dark-muted)}
footer .src{color:var(--dark-muted)}
/* New Business: 도시명 열 + 이메일 열 (실측 234px 오프셋) */
.foot-offices{display:grid;grid-template-columns:222px 1fr;gap:4px var(--gap)}
.foot-city{color:#fff}
.foot-offices a{color:#fff;text-decoration:underline;text-underline-offset:2px}
.foot-offices a:hover{color:var(--dark-muted)}
/* Open Positions */
.foot-role a{color:#fff}
.foot-role a:hover{color:var(--dark-muted)}
.foot-loc{color:var(--dark-muted);margin-left:12px}
/* New Business: 이메일 한 줄 + 리드 마그넷 진입점 3개는 버튼(.foot-more pill 문법) 나열
   (조중현 2026-08-12 "서울 삭제, 언더바 말고 버튼으로") */
.foot-mail{color:#fff;text-decoration:underline;text-underline-offset:2px}
.foot-mail:hover{color:var(--dark-muted)}
.foot-magnets{margin-top:16px;display:flex;flex-wrap:wrap;gap:12px}
.foot-magnets a{display:inline-flex;align-items:center;min-height:var(--hc);padding:0 18px;
  border-radius:var(--hr-sm);background:rgba(255,255,255,.12);color:#fff;font-size:var(--t4);text-decoration:none}
.foot-magnets a:hover{background:rgba(255,255,255,.2)}
.foot-about{color:#fff;max-width:var(--m-lead);line-height:var(--lh-body)} /* 여러 줄 한글 본문, --lh-body (§3) */
/* 푸터 사인오프: 글자 워드마크 대신 심볼 + DUEDANCE (조중현 2026-08-12). 폭은
   footrow 한 칸의 절반, footbody(오른쪽 열) 시작선에 맞춘다. 이름은 심볼과 같은
   폭의 svg 텍스트, viewBox 는 잉크 실측(522.19×72.77@100px, 좌측 사이드베어링 6.6
   제외)이라 글리프가 늘어나지 않고 양 끝이 심볼과 맞아떨어진다. */
.foot-symbol,.foot-symbol-name{display:block;width:calc((100% - var(--gap))/4);height:auto;
  margin-left:calc(50% + var(--gap)/2);color:#fff;fill:currentColor}
.foot-symbol{margin-top:72px}
.foot-symbol-name{margin-top:20px}
/* 800: w-strong(600)보다 두 단계 위 (조중현 2026-08-12 "DUEDANCE 텍스트는 더 볼드하게").
   굵기를 바꾸면 잉크 폭이 변한다, viewBox 실측(534.1×72.66@100px/800)과 세트다. */
.foot-symbol-name text{font-family:var(--font);font-weight:800;font-size:100px}
/* 하단 바 */
.foot-bottom{margin-top:24px;display:flex;justify-content:space-between;align-items:center;
  color:var(--dark-muted);font-size:var(--t4);flex-wrap:wrap;gap:12px}
.foot-social{display:flex;gap:24px;list-style:none}
.foot-social a{color:var(--dark-muted);text-decoration:none}
.foot-social a:hover{color:#fff}
.foot-legal{color:var(--dark-muted)}
@media(max-width:799px){
  .footrow{grid-template-columns:1fr;gap:16px;padding-bottom:32px}
  .foot-offices{grid-template-columns:1fr;gap:2px}
  .foot-symbol{margin-top:48px;margin-left:0}
  .foot-symbol-name{margin-left:0}
}

/* GNB 아래 여는 여백 (조중현 2026-08-05 "0.6 스크롤 정도로 벌리고 거기에 듀당스
   로고 svg 넣어줘 정중앙에"). studio 전용이다.
   높이는 화면의 0.6, 심볼은 그 한가운데. .wrap 밖이라 화면 정중앙에 선다.
   모바일에서 0.6 은 한 화면이 통째로 비므로 티어마다 낮춘다("데스크탑 기준"). */
/* 군중 기믹 (조중현 2026-08-11 "1분에 하나씩 춤추는 인간을 추가해 기믹이야. 여기에 오래
   머무르면 꽉 차게 최대 20개", "맨 처음 아이는 기준이 되고 나머지는 주변으로 퍼지게").
   처음 한 명은 grid 중앙에 그대로 서 있고, 새로 오는 사람은 absolute 로 그 주변에
   내려앉는다(자리는 site.js 가 해바라기 나선으로 찍는다). 흐름 밖이라 칸 높이도
   머리글 자리도 흔들리지 않는다. */
.topmark{height:60vh;display:grid;place-items:center;position:relative}
/* contain 으로 클론의 페인트 무효화를 제 상자 안에 가둔다. 스무 명이 흩어져 있으면
   갱신 영역이 topmark 전체로 번지는데, 가둬 두면 각자 158px 상자만 다시 그린다.
   말풍선이 상자 밖으로 나가는 원본에는 못 건다, contain:paint 가 말풍선을 자른다. */
.topmark .symbol-dance.crowd{position:absolute;transform:translate(-50%,-50%);contain:layout paint}
/* 기준이 되는 처음 한 명(말풍선 주인)은 군중보다 위층이다. 나중에 온 아이가 DOM 뒤에
   붙어 기준과 말풍선을 밟고 지나가는 걸 막는다. */
.topmark .symbol-dance[data-bubble]{z-index:1}
.topmark-logo{width:158px;height:auto;display:block}
@media(max-width:1023px){.topmark{height:44vh}.topmark-logo{width:126px}}
@media(max-width:799px){.topmark{height:36vh}.topmark-logo{width:95px}}

/* ===== 내부 페이지 (갤러리 최소) ===== */
/* 페이지 시작점은 히어로와 같은 값이어야 한다 (조중현 2026-07-28).
   히어로는 헤더 아래 48px 에서 시작하는데 나머지 페이지는 96px 이라, 페이지를 옮길 때마다
   첫 글자가 다른 높이에서 나타났다. 한 값으로 묶는다. */
.page-head{padding-top:48px;padding-bottom:8px}
.page-head.flush{padding-bottom:0}
.page-head h1{font-size:var(--disp);font-weight:var(--w-base);letter-spacing:-.02em;line-height:1.05;max-width:min(100%,var(--m-disp));text-wrap:pretty}
.page-head h2{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2;max-width:min(100%,var(--m-head));text-wrap:pretty}
/* 소절 머리 (2026-08-04 studio '듀당스에서 일하기' 우산 아래 팀·대표 디렉터).
   큰 섹션(h2) 아래 한 단계 눌린 --t3. 새 크기가 아니라 표(§2)의 다음 단이다. */
.page-head h3{font-size:var(--t3);font-weight:var(--w-base);letter-spacing:-.01em;line-height:var(--lh3);color:var(--muted)}

/* 2단 인트로 (About/Studio, 타이틀 왼쪽 52px, 본문 오른쪽) */
/* 아래 패딩 0, 다음 섹션(.theme)의 pt 가 --rowgap 을 온전히 만든다 (§8) */
/* 섹션 간격을 --rowgap 하나로 통일한다 (조중현 2026-08-11 "전반적으로 통일해").
   실측 기준은 '앞 섹션의 마지막 콘텐츠 아랫변 → 이 섹션 머리글 윗변' 이고 168(모바일 108)이다.
   머리글이 .page-head 안에 있는 자리는 그 48 을 빼고, 여기처럼 머리글이 블록 안에 바로
   있는 자리는 --rowgap 을 그대로 낸다. */
.intro-2col{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap) var(--gap-wide);
  padding:var(--rowgap) 0 0;align-items:start}
/* h2 도 같이 받는다. '스튜디오 소개'(h1) 자리에 '팀'(h2)이 올라왔고
   (조중현 2026-08-05), 자리가 같으면 취급도 같아야 한다. */
.intro-2col :is(h1,h2){font-size:var(--disp);font-weight:var(--w-base);letter-spacing:-.02em;line-height:1.05;text-wrap:pretty}
.intro-2col .body{max-width:min(100%,var(--m-body))}
.intro-2col .body p{font-size:var(--t4);line-height:var(--lh-body);color:var(--ink);margin-bottom:16px}
.intro-2col .body p.muted{color:var(--muted)}
/* 보조 CTA = 회색 pill 토큰 그 자체 (SPEC line 45), 고유 여백/hover만 a.pill modifier로.
   화살표를 동반하므로 .anchor a.pill 과 같은 inline-flex, inline-block 이면 svg 가 둘째 줄로 떨어진다 (§0-3)
   pill 이 컨트롤(이동 버튼)로 쓰이면 높이는 1종, --hc (§5). 26/44 로 갈라져 있던 것을 묶는다.
   높이가 --hc 라 별도 히트영역 핵(::after 44px)도 필요 없다. */
/* 버튼도 같은 자리에 선다 (studio 의 '거쳐간 사람들' 은 페이지를 옮기지 않고 겹장을 연다,
   2026-08-11). 링크가 아닌 일은 button 이어야 키보드·보조기술이 제 이름으로 읽는다. */
a.pill,button.pill{display:inline-flex;align-items:center;gap:8px;margin-top:22px;
  min-height:var(--hc);padding:0 18px;font-size:var(--t4)}
button.pill{border:0;font-family:inherit;font-weight:inherit;cursor:pointer;color:var(--ink)}
a.pill:hover,button.pill:hover{background:rgba(0,0,0,.12)}
/* 나란히 선 pill 둘 사이 (studio 팀 본문의 채용·의뢰 진입점, 2026-08-09) */
a.pill+a.pill,a.pill+button.pill,button.pill+a.pill{margin-left:12px}

/* 팀 4열 그리드 (흑백 인물) */
/* 아래 여백은 다음 섹션 .page-head 의 pt 48 과 합쳐 --rowgap 이 된다 (§8) */
/* 위 여백 8 → 72 (조중현 2026-08-11 "거쳐간 사람들 버튼 라인과 사람들 썸네일 간격을 더 줘").
   pill 줄과 인물 그리드가 붙어 있어 버튼이 썸네일의 머리글처럼 읽혔다.
   아래는 다음 머리글의 48 과 합쳐 --rowgap 이 된다. 32 를 빼는 것은 머리글 활자의
   윗 여백 몫이다, 실측으로 맞춘 값이다(1440·1024·390 모두 168/108). */
.teamgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:52px var(--gap-wide);
  padding:72px 0 calc(var(--rowgap) - 32px)}
@media(max-width:799px){.teamgrid{padding-top:48px}}
.tmember .thumb{aspect-ratio:4/5;background:var(--ph);filter:grayscale(1)}

/* Work 카운트 캡션 */
.workcount{font-size:var(--t4);color:var(--muted);padding:6px 0 0}

/* Work 비대칭 그리드 (12칼럼 span, Pentagram식 작은것+큰것)
   work.html 과 index.html 이 이 한 벌을 함께 쓴다, 그래서 두 페이지의 간격은 갈라질 수 없다.
   카드 사이 간격은 --wgap 하나가 정한다 (조중현 2026-08-08 "간격을 지금보다 30% 더 늘려서
   통일해"). --rowgap 을 직접 쓰면 섹션 간격까지 함께 커진다, 그건 그대로 두어야 한다.
   가로는 12칼럼 거터(--gap)를 그대로 쓴다. 이 값은 칼럼 폭을 정하는 격자 치수라
   여기서만 늘리면 카드 폭이 다른 섹션의 트랙과 어긋난다. */
/* 2026-08-09 (조중현 "각 콘텐츠 행의 간격을 50% 줄여"): 1.3 → 0.65. */
.wgrid{--wgap:calc(var(--rowgap)*.65);
  display:grid;grid-template-columns:repeat(12,1fr);gap:var(--wgap) var(--gap)}
.wgrid figure{grid-column:span 4;margin:0}
.wgrid figure.wide{grid-column:span 8}
/* .full(풀폭 한 장) 은 2026-08-08 폐기 (조중현 "1단 그리드는 없어").
   홀로 남은 카드도 작은 썸네일 그대로다, 클래스가 붙지 않으므로 위의 span 4 를 받는다. */
.wgrid a{display:block;color:inherit}
.wgrid a:hover .c-title{color:var(--muted)}
.wgrid a:hover img{opacity:.85}
.wgrid img{width:100%;height:auto;display:block;background:var(--ph)}
/* Pentagram 실측: Work 카드 이미지는 span4·span8 모두 3:2 (456×304 / 924×616) */
.wgrid figure img{aspect-ratio:3/2;object-fit:cover}
.wgrid figcaption{margin-top:12px}
.wgrid figcaption .c-title{margin-top:0}
@media(max-width:1023px) and (min-width:800px){
  .wgrid figure{grid-column:span 6}
  .wgrid figure.wide{grid-column:span 6}
}
@media(max-width:799px){
  .wgrid{grid-template-columns:1fr;gap:var(--wgap) var(--gap)}
  .wgrid figure,.wgrid figure.wide{grid-column:1/-1}
}
/* ===== Work 리스트뷰 (조중현 2026-08-11) =====
   그리드와 같은 figure 한 벌을 다시 배치한 것이다. 카드가 이미 들고 있는 것(제목·설명·커버)에
   메타 3칸과 더 보기만 얹었다, 없는 데이터는 만들지 않았다.
   figcaption 은 display:contents 로 지워서 제목·설명이 행 격자의 직접 자식이 된다,
   래퍼를 새로 두면 그리드 카드 쪽 마크업까지 갈라진다.
   행 격자 12칼럼: 1행 제목(1/7) + 메타(7/13), 2~4행 커버(1/9)와 오른쪽 설명·여백·버튼(9/13).
   가운데 행이 1fr 이라 커버가 만든 남는 높이를 먹고, 그래서 버튼이 이미지 아랫변에 선다. */
.wgrid.is-list{display:flex;flex-direction:column;gap:72px}
.wgrid.is-list figure,.wgrid.is-list figure.wide{grid-column:auto}
.wgrid.is-list a{display:grid;grid-template-columns:repeat(12,1fr);
  grid-template-rows:auto auto auto auto 1fr;column-gap:var(--gap);row-gap:24px}
.wgrid.is-list a:hover img,.wgrid.is-list a:hover video{opacity:.85}
.wgrid.is-list figcaption{display:contents}
/* 태그는 본문과 더 보기 사이에 선다 (조중현 2026-08-11 "리스트 뷰에도 태그들이 나열").
   카드와 같은 pill 문법 그대로다, 성격(svc/out/seg)도 그대로 따라온다. */
.wgrid.is-list .c-tags{grid-column:9/13;grid-row:3;align-self:start;
  display:flex;flex-wrap:wrap;gap:6px;margin-top:0}
/* 제목·설명은 리스트에서만 국·영문을 함께 세운다 (조중현 "국·영문 2줄").
   고른 언어가 위, 나머지가 아래다. 언어 전환을 없애는 게 아니라 순서로 지킨다. */
.wgrid.is-list .c-title,.wgrid.is-list .c-desc{display:flex;flex-direction:column}
.wgrid.is-list .c-title .ko,.wgrid.is-list .c-title .en,
.wgrid.is-list .c-desc .ko,.wgrid.is-list .c-desc .en{display:block}
/* 디바이더는 한 높이에 선다 (조중현 2026-08-11 "제목 위에 선, 고객 위에 선, 업종 소재지
   위에 선의 높이가 동일해야해"). 행 전체를 두르는 선 대신 제목·메타칸이 각자 위에 선을
   이고, 같은 격자 행이라 그 선들이 한 y 에서 만난다. 위 여백도 같은 값이어야 어긋나지 않는다. */
.wgrid.is-list .c-title,.wgrid.is-list .l-cell{border-top:1px solid var(--ink);padding-top:14px}
.wgrid.is-list .c-title{grid-column:1/7;grid-row:1;font-size:var(--t2);line-height:var(--lh2);gap:4px}
.wgrid.is-list .c-title .ko{order:1}
.wgrid.is-list .c-title .en{order:2;font-size:var(--t3);line-height:var(--lh3);color:var(--muted)}
html[data-lang="en"] .wgrid.is-list .c-title .en{order:1;font-size:var(--t2);line-height:var(--lh2);color:inherit}
html[data-lang="en"] .wgrid.is-list .c-title .ko{order:2;font-size:var(--t3);line-height:var(--lh3);color:var(--muted)}
.wgrid.is-list .c-desc{grid-column:9/13;grid-row:2;gap:6px;margin-top:0}
.wgrid.is-list .c-desc .ko{order:1}
.wgrid.is-list .c-desc .en{order:2;color:var(--muted)}
html[data-lang="en"] .wgrid.is-list .c-desc .en{order:1;color:inherit}
html[data-lang="en"] .wgrid.is-list .c-desc .ko{order:2;color:var(--muted)}
/* 리드도 2줄 (조중현 2026-08-12). 그리드뷰는 `.wgrid .c-desc` 가 이미 2줄로 자르는데,
   리스트뷰는 위 `display:flex` 가 그 규칙을 이겨 자르지 않고 있었다. 여기서는 국·영이
   나란히 서므로 컨테이너가 아니라 각 언어 단락을 자른다. */
.wgrid.is-list .c-desc .ko,.wgrid.is-list .c-desc .en{display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
/* 커버는 3:2, 그리드뷰와 같은 비율이다 (조중현 2026-08-12 "리스트뷰 비율을 그리드뷰
   비율과 통일해"). 2026-08-11 에 16:9 로 뒀던 것을 되돌린다. 두 뷰가 비율이 다르면
   한 커버 파일로 둘 다 만족시킬 수 없고, 한쪽에서 반드시 15.7% 가 잘렸다.
   커버가 영상인 프로젝트가 여섯이다(qplace·flexmatch·taling2026·kmong·socraai·trillion-labs).
   img 에만 자리를 주면 그 여섯은 격자에 자동 배치돼 한 칼럼짜리로 쪼그라든다. */
.wgrid.is-list figure img,.wgrid.is-list figure video{grid-column:1/9;grid-row:2/6;
  width:100%;height:auto;align-self:start;aspect-ratio:3/2;object-fit:cover}
/* 메타 3칸: CLIENT · INDUSTRY · BASED IN. 값이 없는 칸은 비운다, 지어내지 않는다.
   칸마다 짧은 선이 위에 선다 (레퍼런스). 라벨 문법은 .case-facts-head 와 같다. */
.l-meta{grid-column:7/13;grid-row:1;display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap)}
.l-cell{min-height:1px}
.l-key{display:block;font-size:var(--t5);letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);margin-bottom:6px}
.l-val{display:block;font-size:var(--t4);line-height:1.45}
/* 더 보기: 본문 미리보기 바로 아래다 (조중현 2026-08-11). 오른쪽 칼럼 폭을 꽉 채운
   회색 면, 컨트롤 높이 --hc (§5) */
.l-more{grid-column:9/13;grid-row:4;align-self:start;display:flex;align-items:center;justify-content:center;gap:8px;
  min-height:var(--hc);background:rgba(0,0,0,.07);border-radius:var(--hr-sm);
  font-size:var(--t4);color:var(--ink);transition:background .15s}
.wgrid.is-list a:hover .l-more{background:rgba(0,0,0,.12)}
.wgrid.is-list a:hover .l-more .ico-arrow{transform:translateX(4px)}
.l-more .ico-arrow{transition:transform .15s}
.wgrid figure .l-meta,.wgrid figure .l-more{display:none}
.wgrid.is-list figure .l-meta{display:grid}
.wgrid.is-list figure .l-more{display:flex}
@media(max-width:1023px) and (min-width:800px){
  .wgrid.is-list .c-title{grid-column:1/6}
  .l-meta{grid-column:6/13}
  .wgrid.is-list figure img,.wgrid.is-list figure video{grid-column:1/8}
  .wgrid.is-list .c-desc,.wgrid.is-list .c-tags,.l-more{grid-column:8/13}
}
/* 좁은 화면은 한 칸으로 쌓는다: 제목 → 메타 → 커버 → 설명 → 버튼 */
@media(max-width:799px){
  .wgrid.is-list{gap:56px}
  .wgrid.is-list a{grid-template-columns:1fr;grid-template-rows:none;row-gap:16px}
  .wgrid.is-list .c-title,.l-meta,.wgrid.is-list figure img,.wgrid.is-list figure video,
  .wgrid.is-list .c-desc,.wgrid.is-list .c-tags,.l-more{grid-column:1;grid-row:auto}
  /* DOM 은 커버가 먼저다(그리드 카드의 순서). 쌓일 때는 제목부터 읽혀야 하므로 order 로 세운다. */
  .wgrid.is-list .c-title{order:1}
  .l-meta{order:2}
  .wgrid.is-list figure img,.wgrid.is-list figure video{order:3;height:auto}
  .wgrid.is-list .c-desc{order:4}
  .wgrid.is-list .c-tags{order:5}
  .l-more{order:6}
  .l-meta{grid-template-columns:1fr 1fr}
  .l-more{margin-top:8px}
}

/* 리스트뷰는 스크롤이 이어 붙이므로 더보기 버튼을 감춘다. 자리(.loadmore-wrap)는 남는다,
   그게 판정 기준점이다. 스크립트가 살아 있을 때만 has-auto 가 붙는다. */
.wgrid.is-list.has-auto ~ .loadmore-wrap{margin-top:0}
.wgrid.is-list.has-auto ~ .loadmore-wrap .loadmore{display:none}

/* 뷰 전환 (이미지 / 목록). 필터 칩과 같은 문법이다, 같은 줄에서 한 종류의 컨트롤로 읽혀야 한다.
   자리는 콘텐츠가 시작하는 왼쪽 위, 즉 그리드 첫 칸의 왼끝이다 (조중현 2026-08-11).
   개수 캡션과 자리를 맞바꿨다, 손이 가는 것이 먼저 서고 읽는 것이 뒤로 간다. */
.workfoot{display:flex;align-items:center;justify-content:space-between;gap:var(--gap)}
.workfoot .workcount{padding-top:0;text-align:right}
.wviews{display:flex;gap:4px;flex:none}
.wview{display:flex;align-items:center;justify-content:center;width:34px;height:34px;
  background:none;border:0;border-radius:var(--hr-sm);color:var(--muted);cursor:pointer}
.wview:hover{background:rgba(0,0,0,.1);color:var(--ink)}
.wview.on{background:var(--ink);color:var(--paper)}
.wview svg{display:block}

.sep{color:var(--line)}

/* 카드 메타, Pentagram식 라벨 pill + 날짜 + 제목 + 설명 */
.c-meta{display:flex;align-items:center;gap:10px;margin-top:15px}
.pill{background:rgba(0,0,0,.07);color:rgba(0,0,0,.56);border-radius:4px;padding:4px 8px;font-size:var(--t5);font-weight:var(--w-base);line-height:1.25}
/* ── 태그 성격 (조중현 2026-08-10 "라운드스퀘어와 완전 라운드로 테그 성격에 따라 분류").
   성격의 정본은 tags.json 이고 build.py 가 pill-svc/out/seg 를 붙인다. 세 갈래다.
     svc 핵심 서비스 — 파는 단위. 먹 채움, 제일 세게 읽힌다.
     out 산출물     — 그 일에서 나온 것. 기본 회색 면 그대로다.
     seg 대상·업종   — 만든 것이 아니라 맥락이다. 유일하게 모양이 다르다(완전 라운드),
                      면 없이 선만 두어 앞의 둘보다 한 발 물러선다.
   모양이 갈리는 선은 '우리가 만든 것인가' 하나다. 앞의 둘은 같은 네모를 쓴다. */
.pill-svc{background:var(--ink);color:var(--paper)}
.pill-out{background:rgba(0,0,0,.07);color:rgba(0,0,0,.56)}
.pill-seg{background:none;color:rgba(0,0,0,.56);
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.22);border-radius:999px}
/* 필터 줄에서는 면이 '지금 고른 것' 을 말한다, 성격은 모양으로만 낸다.
   여기서 pill 처럼 면을 칠하면 켜진 칩과 구별되지 않는다. */
.newsfilter .chip-seg{border-radius:999px}
.date{font-size:var(--t5);color:var(--muted);line-height:1.25;font-variant-numeric:tabular-nums}
/* 출처(매체명). 분류가 아니라서 pill 이 아니다, 날짜와 같은 급의 맨글자
   (조중현 2026-08-12 "매체 이름이 테그처럼 디자인 되어있는게 이상한데"). */
.src{font-size:var(--t5);color:var(--muted);line-height:1.25}
.c-title{font-size:var(--t3);font-weight:var(--w-strong);margin-top:12px;letter-spacing:-.01em;line-height:25px}
/* 19px/500 카드 제목 lh 토큰 = 25px(워드마크와 동일) */
.c-desc{font-size:var(--t4);color:var(--muted);margin-top:4px;line-height:var(--lh-lead)}

/* ===== News 피드 (2열 메이슨리 + 라디오 필터) ===== */
.feedhead{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap);padding:48px 0 calc(var(--rowgap) - 24px);align-items:start}
.feedhead h1{font-size:var(--disp);font-weight:var(--w-base);letter-spacing:-.02em;line-height:1.05;max-width:min(100%,var(--m-disp))} /* --t1 타이틀은 --m-disp 24ch (§3), .page-head h1 과 같다 */
.newsfilter{display:flex;flex-wrap:wrap;gap:8px;padding-top:6px}
/* work·저널·매거진·피드가 모두 .feedhead 를 쓴다, 필터는 제목 오른쪽 한 자리다.
   (work 만 .page-head 안에 필터를 두던 예외를 없앴다. 조중현 2026-07-29
   "work 페이지도 매거진이나 저널처럼 태그 시스템 맞춰야지") */
.feedhead .newsfilter{grid-column:2}
@media(max-width:799px){.feedhead .newsfilter{grid-column:1}}

/* 홈 카테고리 칩(.cat)과 동일한 디자인.
   컨트롤 높이는 1종, --hc (§5). 폭마다 36/44/40 세 높이로 갈라져 있던 것을 하나로 묶는다. */
.newsfilter span{font-size:var(--t4);line-height:1.25;cursor:pointer;padding:0 18px;border-radius:4px;
  display:inline-flex;align-items:center;min-height:var(--hc);
  background:rgba(0,0,0,.05);color:var(--ink);transition:background .2s cubic-bezier(.4,0,.2,1),color .2s}
.newsfilter span:hover{background:rgba(0,0,0,.1)}
.newsfilter span.on{background:var(--ink);color:var(--paper)}

/* Magazine 그리드, 4열 (조중현 2026-07-29 "매거진은 한 열에 4개로 다시 구성해").
   카드마다 이미지 비율이 다르고(site.js 3주기), 한 행 안에서는 상단 정렬한다.
   가지런한 저널과 달리 '제각각처럼 보이는' 것이 이 그리드의 시스템이다.
   (2열 메이슨리는 한 화면에 담기는 글이 너무 적어 탐색이 어려웠다.) */
.feed{display:grid;gap:56px var(--gap);align-items:start}
.feed:not(.artgrid){grid-template-columns:repeat(4,1fr)}
@media(max-width:1279px){.feed:not(.artgrid){grid-template-columns:repeat(3,1fr)}}
@media(max-width:1023px){.feed:not(.artgrid){grid-template-columns:repeat(2,1fr)}}
@media(max-width:799px){.feed:not(.artgrid){grid-template-columns:repeat(2,1fr);gap:40px var(--gap)}}
.post{margin:0;min-width:0}
.post a{display:block;color:inherit}
.post a:hover .c-title{color:var(--muted)}
.post a:hover .shot{opacity:.85}
/* 썸네일 비율은 손으로 지정하지 않는다, 보이는 위치가 정한다 (조중현 2026-07-27).
   site.js layoutFeedRatios() 가 3주기(4:3 → 1:1 → 4:5)로 돌리며, 필터·로드모어 뒤 재계산한다.
   5열 그리드에서 주기 3 이면 행마다 배열이 밀려 세로 줄무늬가 생기지 않는다.
   아래 값은 JS 가 없을 때의 기본값이다. */
.post .shot{background:var(--ph);display:block;aspect-ratio:4/3}
.post .cap{margin-top:15px}
.post .cap .c-meta{margin-top:0}
.post .cap .c-title{margin-top:11px}
/* 매거진 카드 = 이미지 → 제목 → 날짜 → 태그. 좁은 칼럼이라 설명문은 싣지 않는다.
   설명(.c-desc, 관점 한 줄)은 목록에서 감추고 ?post= 상세의 리드·meta 가 쓴다 (§10). */
.feed:not(.artgrid) .post .cap .c-title{margin-top:0;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.feed:not(.artgrid) .post .cap .c-desc{display:none}
.feed:not(.artgrid) .post .cap .date{display:block;margin-top:8px}
.feedempty{font-size:var(--t4);line-height:var(--lh-body);color:var(--muted);margin:0}

/* ── 매거진 히어로: 2단(1:1), 왼쪽 대표 글 크게 + 오른쪽 인기 5 (조중현 2026-08-09,
   같은 날 "단은 1:1 비율", "인기콘텐츠는 정보를 더", "하나의 컨테이너로 감싸") ──
   컨테이너는 검정 면(#000, 라운드 없음, 24px), 푸터와 같은 다크 문법이다
   (조중현 2026-08-09 "컨테이너는 검정색으로", 처음엔 rgba .04 회색이었다).
   왼쪽은 카드(.post) 토큰을 그대로 받되 캡이 썸네일 위로 오고 제목만 t2 로 올린다.
   오른쪽 목록 행 구분은 dir-career 문법의 다크 값(#333 밑선, 마지막 행 없음),
   행 정보는 카드 캡과 같은 c-meta(분류 pill + 날짜), 머리글은 왼쪽 제목과 같은 t2. */
/* 컨테이너 면은 2026-08-09 제거 (조중현 "컨테이너 제거하고 gnb부터 히어로 까지 검정
   배경 깔아"). 검정은 이제 .magtop 밴드가 칠하고, 히어로는 그 위에 바로 앉는다.
   다크 텍스트 값(#fff·#8c8c8c·#333·흰 채움)은 그대로 산다. */
/* 두 단 사이는 --gap-wide 다 (조중현 2026-08-11 "1단과 2단이 너무 붙어있는 디자인 같아").
   12칼럼 거터(12px)는 카드가 늘어설 때의 치수지, 성격이 다른 두 덩이를 가르는 값이 아니다.
   studio 의 다단이 쓰는 것과 같은 토큰을 쓴다. 세로(행) 간격은 그대로 --gap. */
.maghero{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gap) var(--gap-wide);
  align-items:start;color:#fff}
.maghero-sec{padding-bottom:var(--rowgap)}
/* ── 매거진 상단 검정 밴드: gnb~히어로 (조중현 2026-08-09), footwrap 문법의 상단판.
   헤더·필터의 다크 값은 feed-page 문법을 그대로 옮겨 온다 (§ body.feed-page). ── */
.magtop{background:#000;color:#fff}
.magtop header,.magtop .wordmark,.magtop nav a,.magtop .searchtoggle{color:#fff}
.magtop nav a:hover,.magtop nav a[aria-current="page"]{color:var(--dark-muted)}
.magtop .langtoggle button{color:var(--dark-muted)}
.magtop .langtoggle button.on{color:#fff}
.magtop .langsep{color:#333}
.magtop .navtoggle span{background:#fff}
.magtop .feedmark{background:#fff;color:#0a0a0a}
.magtop .newsfilter span{background:rgba(255,255,255,.1);color:var(--dark-muted)}
.magtop .newsfilter span:hover{background:rgba(255,255,255,.18);color:#fff}
.magtop .newsfilter span.on{background:#fff;color:#0a0a0a}
.magtop .searchpanel{color:var(--ink)}
@media(max-width:799px){.magtop header nav{background:#000}}
/* 그리드 필터: 검정 밴드가 끝난 흰 지면 첫 요소, 그리드 바로 위 (조중현 2026-08-09
   "상단 필터가 작동 안하는것처럼 보인다" → 컨트롤을 제어 대상 옆으로). */
/* 히어로 바로 아래 칩 줄은 가운데 정렬이다 (조중현 2026-08-11 "히어로 영역 바로 아래
   있는 테그들"). 지면 폭을 가로지르는 한 줄이라 왼쪽에 몰아두면 오른쪽이 빈다.
   work·저널의 칩은 제목 옆 한 자리에 서므로 그대로 왼쪽이다. */
.magfilter{padding-bottom:32px}
.magfilter .newsfilter{justify-content:center}
/* 왼쪽 단은 썸네일 하나다. 높이는 오른쪽 인기 콘텐츠가 정한다 (조중현 2026-08-11
   "썸네일 높이값을 인기콘텐츠 높이값과 맞추자"), 그래서 비율을 풀고 단 높이를 채운다.
   비율(aspect-ratio)을 남겨 두면 그 값이 높이를 먼저 정해 두 단이 다시 갈린다. */
.maghero .maghero-main{grid-column:span 6;align-self:stretch;display:flex}
.maghero-main > a{display:flex;width:100%}
/* 제목·태그·날짜는 모두 이미지 위 오버레이다 (조중현 2026-08-09 "테그와 날짜는 이미지에
   오버레이" → 2026-08-11 "제목을 딤드처리해서 오버레이"). 딤은 아래에서 올라오는
   그라디언트 하나가 만든다, 면을 통째로 덮으면 사진이 죽는다. */
/* 이미지는 절대배치로 면을 채운다. 흐름 안에 두면 그림 자체가 높이를 정해 버려서
   (자리표시자 1x1 gif 는 폭만큼 정사각이 된다) 두 단이 다시 갈린다.
   높이의 주인은 오른쪽 인기 콘텐츠 하나다. */
/* 바닥값은 작은 카드와 같은 4:3 이다 (조중현 2026-08-11 "적어도 작은 썸네일 비율에
   맞을 수 있게"). 목록이 짧아도 이 아래로는 눌리지 않고, 목록이 길면 그만큼 늘어난다.
   높이를 px 로 박지 않는 이유는 폭이 티어마다 달라서다, 자리지기 하나로 비율을 지킨다. */
.maghero-shotwrap{position:relative;display:block;width:100%}
.maghero-shotwrap::before{content:"";display:block;padding-top:75%}
.maghero-shotwrap .shot{position:absolute;inset:0;width:100%;height:100%;
  aspect-ratio:auto;object-fit:cover;display:block}
.maghero-shotwrap::after{content:"";position:absolute;left:0;right:0;bottom:0;height:55%;
  background:linear-gradient(to top,rgba(0,0,0,.78),rgba(0,0,0,.45) 40%,rgba(0,0,0,0));
  pointer-events:none}
.maghero-cap{position:absolute;left:24px;right:24px;bottom:24px;z-index:1;color:#fff}
.maghero-cap .maghero-meta{margin-top:12px}
.maghero-shotwrap .date{color:#fff}
/* New 뱃지는 이미지 왼쪽 위 (조중현 "첫 썸네일은 new 영역") */
.maghero-shotwrap .pill.new{position:absolute;top:16px;left:16px;z-index:1}
/* 대표글 제목 t2 → 24px (조중현 2026-08-12 "썸네일 오버레이된 제목 여전히 큰거 같아
   살짝 줄여"). 24 는 인기 목록이 쓰던 t4×1.5, 이 컴포넌트 안에 이미 있던 크기다.
   모바일 t2 도 24 라 전 구간이 한 크기로 선다. */
.maghero-main .c-title{font-size:calc(var(--t4)*1.5);line-height:1.3;color:#fff}
/* 검정 면 위 보조 텍스트·강조는 푸터와 같은 다크 문법(#8c8c8c·#333·흰 채움) */
.maghero .date{color:var(--dark-muted)}
.maghero a:hover .c-title{color:var(--dark-muted)}
.maghero-meta .pill.cat{background:#fff;color:#000}
/* 행 균등배분(20260809z)은 같은 날 취소 (조중현 "균등배분은 취소 롤백"). 행 높이는
   내용대로 돌아가고, 남는 하단은 뉴스레터 진입점이 받는다. 오른쪽 단의 stretch 는
   그 버튼을 컨테이너 바닥에 앉히기 위해 남긴다(margin-top auto). */
.maghero-side{grid-column:span 6;align-self:stretch;display:flex;flex-direction:column}
/* 라벨은 푸터 Recent News(.footlabel)와 같은 역할, 같은 규격 t4 강조다 (조중현
   2026-08-12 "인기 콘텐츠 텍스트 크기는 줄이자". 원래 t2 로 제목급이었다).
   위계: 라벨 t4 < 목록 제목 24px(모바일 t3) < 대표글 제목 t2. */
.maghero-label{font-size:var(--t4);font-weight:var(--w-strong);color:#fff;line-height:var(--lh4);margin:0 0 12px}
/* 인기 콘텐츠 목록 (조중현 2026-08-11, 레퍼런스 스샷). 평소엔 선으로만 갈린 줄이고,
   손이 오면 줄 하나가 통째로 채워지며 화살표가 나온다. 검정 면 위라 채움은 흰색이다,
   레퍼런스(밝은 지면)의 검정 채움을 그대로 뒤집은 것이다.
   채움은 글자보다 12px 씩 넓게 번진다. 그래서 줄 전체가 눌리는 판으로 읽힌다,
   글자 자리는 평소와 같아 호버 전후로 줄이 흔들리지 않는다. */
.maghero-list{list-style:none;margin:0;padding:0}
.maghero-list li{border-bottom:1px solid #333}
.maghero-list li:last-child{border-bottom:0}
.maghero-list a{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;gap:14px;
  align-items:center;padding:16px 12px;margin:0 -12px;border-radius:var(--hr-lg);color:inherit;
  transition:background .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1)}
.maghero-list a:hover{background:#fff;color:#0a0a0a}
.maghero-list a:hover .maghero-rank,.maghero-list a:hover .date{color:rgba(0,0,0,.56)}
.maghero-list a:hover .pill.cat{background:#0a0a0a;color:#fff}
.maghero-arrow{display:flex;opacity:0;transform:translateX(-6px);
  transition:opacity .2s,transform .2s}
.maghero-list a:hover .maghero-arrow{opacity:1;transform:none}
/* 뉴스레터 받기 (조중현 2026-08-09 "비어있는 하단영역에 뉴스레터 받기 버튼 신설").
   pill 기하에 sitmore 유리 채움, 컨테이너 바닥 왼쪽에 붙는다. */
/* 바닥에 붙는다 (조중현 2026-08-11 "뉴스레터 받기는 섹션 하단으로, 썸네일 하단 값과 비슷하게").
   a.pill 의 margin-top:22px 이 자리가 더 좁아 auto 를 덮고 있었다, 그래서 목록 바로 밑에
   서고 아래로 86px 이 비어 있었다. 자리를 같은 무게로 맞춰 적는다. */
a.pill.maghero-cta{margin-top:auto;align-self:flex-start;background:rgba(255,255,255,.12);color:#fff}
.maghero-cta:hover{background:rgba(255,255,255,.2)}
.maghero-rank{flex:0 0 auto;font-size:var(--t5);line-height:var(--lh5);color:var(--dark-muted)}
/* 24px(2026-08-09 "1.5배 더 키워") → t3 전 구간 (조중현 2026-08-12 "인기콘텐츠 제목이
   여전히 큰거 같아 살짝 줄여". 그 전에 ≤1023 만 t3 로 내렸었다). 대표글 24 > 목록
   t3 19 > 라벨 t4 16 의 위계. */
.maghero-t{display:block;font-size:var(--t3);line-height:var(--lh3)}
.maghero-meta.c-meta{margin-top:0;flex:0 0 auto}
.maghero-meta .date{font-size:var(--t5)}
@media(max-width:1023px){
  .maghero .maghero-main,.maghero-side{grid-column:1/-1}
  /* 한 칸으로 쌓이면 채울 높이가 없다, 비율로 되돌린다 */
  .maghero-shotwrap{aspect-ratio:auto}
  .maghero-cap{left:16px;right:16px;bottom:16px}
}
.c-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
/* 첫 칩(카테고리)은 잉크 채움 = 강조, 나머지 태그는 회색 pill. 새 토큰 없음. */
.c-tags .pill.cat{background:var(--ink);color:var(--paper)}
/* New 뱃지, 사이트 공용 (조중현 2026-08-09 "사이트 전반적으로 new 뱃지 신설").
   2026-08-11 부터 검정 채움에 흰 글자, 라운드 없음 (조중현). 다크 섹션에서는 뒤집는다
   (조중현 "다크섹션엔 반전"), 검정 위 검정이면 뱃지가 통째로 사라진다 (§13).
   뒤집는 자리는 셋이다: 스크롤 다크 전환(body.is-dark) · 푸터 · 매거진 상단 밴드(.magtop).
   최신 콘텐츠 카드의 c-meta/c-tags 어디든 <span class="pill new">New</span> 로 얹는다. */
.pill.new{background:var(--black);color:#fff;border-radius:0}
body.is-dark .pill.new,footer .pill.new,.magtop .pill.new{background:#fff;color:var(--black)}

/* articles, 균일 2열 썸네일 카드 그리드 (designcompass 형식 / Pentagram 디자인 언어) */
/* Load more (Pentagram 실측: 회색 pill 링크 690×55px, bg rgba(0,0,0,.07), radius 4px, 16px, 중앙 정렬) */
.loadmore-wrap{display:flex;justify-content:center;padding:0;margin-top:var(--rowgap)}
.loadmore-wrap[hidden]{display:none}
.loadmore{width:calc(50% - var(--gap)/2);min-height:var(--hc);background:rgba(0,0,0,.07);color:var(--ink); /* 컨트롤 높이 1종 --hc (§5) */
  border:0;border-radius:4px;font:inherit;font-size:var(--t4);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  transition:background .3s cubic-bezier(.4,0,.2,1)}
.loadmore:hover{background:rgba(0,0,0,.12)}
.lm-plus{font-size:var(--t4)}
@media(max-width:799px){.loadmore{width:100%}}


/* ---- Feed = 유니버스 (Pentagram Archive 실측 기반) ----
   archive.pentagram.com 은 검정 배경 무한 캔버스. 1440px에서 타일 약 157px,
   가로 간격 79~88px, 간격이 타일 폭의 절반. 여백이 이 화면의 핵심이다.
   우리는 canvas 대신 균일 격자로 같은 밀도·같은 어둠을 만든다. */
body.feed-page{background:#000;color:#fff}
body.feed-page header{color:#fff}
body.feed-page .wordmark,body.feed-page nav a,body.feed-page .searchtoggle{color:#fff}
body.feed-page nav a:hover,body.feed-page nav a[aria-current="page"]{color:var(--dark-muted)}
body.feed-page .langtoggle button{color:var(--dark-muted)}
body.feed-page .langtoggle button.on{color:#fff}
body.feed-page .langsep{color:#333}
body.feed-page .page-head h1{color:#fff}
body.feed-page .navtoggle span{background:#fff}
/* 검색 패널 표면은 어느 페이지에서나 라이트(--paper), feed 의 body 색(#fff)을 그대로 상속하면
   흰 위 흰이 된다. 하드코딩된 표면은 다크 대응을 따로 적어준다 (§13, body.is-dark 보정과 같은 방식) */
body.feed-page .searchpanel{color:var(--ink)}

.universe{padding-top:0;background:#000}
/* 원본 비율 유지 → 메이슨리(CSS columns). 정사각 크롭 금지. */
/* 유니버스: 캡 없이 화면 폭을 쓴다 (조중현 지시) */
/* 상단 패딩 0, 헤드 마지막 요소(카운트)→첫 타일 간격은 .feedhead 의 --rowgap 하나가 정한다 (§8) */
/* 아래 패딩 0 (§8), 마지막 블록의 아래 패딩을 두면 푸터 간격이 그만큼 벌어진다.
   푸터 간격은 body.feed-page .footwrap 의 margin-top 보정 하나가 만든다. */
.fgrid{columns:6;column-gap:var(--uni-gap);width:100%;
  padding:0 var(--uni-gap)}
@media(min-width:1728px){.fgrid{columns:8}}
/* --ftile-cap: 타일 캡션 예약 공간(마진 10 + 2줄 클램프). ::after 와 푸터 보정이 같은 값을 공유한다 (§8) */
:root{--uni-gap:80px;--ftile-cap:calc(10px + 2*16.25px)}
.ftile{display:block;position:relative;color:inherit;break-inside:avoid;margin-bottom:var(--uni-gap);display:inline-block;width:100%}
.ftile img{width:100%;height:auto;object-fit:cover;background:var(--ph-dark);
  opacity:.55;transition:opacity .3s cubic-bezier(.4,0,.2,1)}
/* Archive 처럼 기본은 어둡게 물러나 있고, 가리킨 것만 또렷해진다 */
.ftile:hover img,.ftile:focus-visible img{opacity:1}
/* 국문이 먼저다 (§1), 캡션은 data-cap-ko 가 기본이고, EN 모드에서만 data-cap-en 을 쓴다 */
/* 언어를 바꿀 때 화면이 밀리면 안 된다 (§1), KO 1줄·EN 2줄로 캡션 박스 높이가 갈리면
   362타일 메이슨리가 통째로 재배열된다. 두 언어 중 큰 쪽(2줄)으로 예약하고 2줄로 클램프해
   어느 언어든 캡션 박스가 같은 높이를 갖는다. */
.ftile::after{content:attr(data-cap-ko);display:-webkit-box;-webkit-box-orient:vertical;
  -webkit-line-clamp:2;line-clamp:2;overflow:hidden;margin-top:10px;min-height:calc(var(--ftile-cap) - 10px);
  font-size:var(--t5);line-height:16.25px;color:var(--dark-muted);opacity:0;pointer-events:none;
  transition:opacity .3s cubic-bezier(.4,0,.2,1)}
html[data-lang="en"] .ftile::after{content:attr(data-cap-en)}
.ftile:hover::after,.ftile:focus-visible::after{opacity:1}
@media(max-width:1279px){:root{--uni-gap:56px}.fgrid{columns:5}}
@media(max-width:1023px){:root{--uni-gap:40px}.fgrid{columns:4}}
@media(max-width:799px){:root{--uni-gap:24px}.fgrid{columns:2}}


/* Feed(검정) 위의 필터·카운트 */
/* Feed 헤드도 다른 페이지와 같은 96px 상단 여백을 쓴다 (이 규칙이 정렬을 깨고 있었음) */
/* 카운트는 헤드 흐름 안에 있다(h1 과 같은 캡 정렬), 헤드 마지막 요소→첫 타일 = --rowgap (§8) */
.feedhead .workcount{grid-column:1/-1}
.feedhead .workfoot{grid-column:1/-1}
body.feed-page .feedhead{padding-bottom:var(--rowgap)}
body.feed-page .newsfilter span{background:rgba(255,255,255,.1);color:var(--dark-muted)}
body.feed-page .newsfilter span:hover{background:rgba(255,255,255,.18);color:#fff}
body.feed-page .newsfilter span.on{background:#fff;color:#0a0a0a}
body.feed-page .workcount{color:var(--dark-muted)}
/* 마지막 타일 요소→푸터 = --rowgap (§8). 마지막 행 타일의 자기 아래 마진(--uni-gap)과
   호버 캡션(::after)이 opacity:0 으로도 예약하는 플로우 공간(--ftile-cap)이 남으므로
   둘 다 빼서 보정한다, 요소가 있는 곳이 시작이자 끝이다. */
body.feed-page .footwrap{margin-top:calc(var(--rowgap) - var(--uni-gap) - var(--ftile-cap))}
.ftile[hidden]{display:none}


/* 영상도 이미지와 같은 스택 규칙 */
.fullbleed video.shot{width:100%;height:auto;display:block;margin-bottom:12px;object-fit:cover}

/* (삭제됨 2026-07-29) 숫자 페이지네이션 .pagenav/.pagenum, 같은 일(그리드 페이징)은
   work/magazine 과 같은 공용 .loadmore 하나가 한다 (§0-3) */
.artgrid{columns:auto;display:grid;grid-template-columns:repeat(4,1fr);gap:56px var(--gap)}
/* 저널 썸네일은 정방형 한 종이다 (조중현 2026-07-29 "저널은 일반 정방형 구조").
   site.js layoutFeedRatios 는 .artgrid 를 건드리지 않는다, 여기 값이 최종이다. */
.artgrid .post .shot{aspect-ratio:1/1}
.artgrid .post{margin-bottom:0}
@media(max-width:1279px){.artgrid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:1023px){.artgrid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:799px){.artgrid{grid-template-columns:1fr;gap:48px}}

/* 32px 세컨더리 디스플레이 (케이스 리드) */
.lead-para{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:var(--lh-lead);max-width:min(100%,var(--m-lead));margin-top:24px;text-wrap:pretty}

/* contact 연락처 그리드(.contactgrid/.office)는 2026-08-12 삭제 (조중현 "여기 섹션은 삭제"),
   연락은 CTA 와 푸터가 맡는다. 규칙도 함께 내린다. */

/* 케이스 상세 (work-detail) */
/* 순서는 태그 → 제목 → 본문 보기 (조중현 2026-08-09 "왼쪽 정렬되어있는 제목 위에
   태그를 놓고, 그다음 제목, 그다음 본문보기"). 태그가 제목의 아이브로우로 서고
   손잡이는 제목 아래로 내려온다. 전부 왼쪽 정렬이다.
   오른쪽 끝 정렬안(20260809d)은 폐기, 버튼을 같은 줄 반대편으로 보냈었다. */
.case-head{padding-top:48px;padding-bottom:8px}
.case-head h1{margin-top:22px;font-size:var(--disp);font-weight:var(--w-base);letter-spacing:-.02em;line-height:1.05;max-width:min(100%,var(--m-disp));text-wrap:pretty}
.case-tags{display:flex;flex-wrap:wrap;gap:8px}
.fullbleed{width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:40px 0 0}
.fullbleed .shot{background:var(--ph);margin-bottom:12px}
.fullbleed .shot.hero{aspect-ratio:16/9}
.fullbleed .shot.band{aspect-ratio:4/3}
/* .credits(Client/Discipline 두 칸)는 2026-08-08 폐기, 고객 정보(.case-facts)가
   같은 자리에서 더 많은 것을 말한다. 마크업에서 사라졌으므로 규칙도 함께 내린다. */

/* 태블릿 티어 800–1023px: 2단 그리드 */
@media(max-width:1023px) and (min-width:800px){
  .teamgrid,.credits{grid-template-columns:1fr 1fr}
  nav a{display:inline-flex;align-items:center;min-height:44px}
  .wordmark,.foot-more,.foot-social a{min-height:44px;display:inline-flex;align-items:center}
  /* 필터 칩·pill CTA 높이는 기본 규칙의 --hc 하나가 정한다 (§5), 티어별 하드코딩을 두지 않는다 */
  .anchor a{padding:12px 0}
}
@media(max-width:799px){
  /* Pentagram 실측: 모바일도 헤더 60px 유지, 내비는 햄버거 → 전체화면 오버레이 */
  header{height:60px;padding:0}
  .navtoggle{display:flex}
  header nav{position:fixed;inset:60px 0 0;background:var(--paper);z-index:30;
    padding:0 var(--edge);opacity:0;visibility:hidden;transition:opacity .3s cubic-bezier(.4,0,.2,1)}
  body.nav-open header nav{opacity:1;visibility:visible}
  /* feed 는 링크가 흰색, 오버레이도 페이지와 같은 검정이어야 흰 위 흰이 안 된다 (§13) */
  body.feed-page header nav{background:#000}
  body.nav-open{overflow:hidden}
  header nav ul{flex-direction:column;gap:0;padding-top:8px}
  header nav li{border-bottom:1px solid var(--line)}
  header nav a{display:flex;align-items:center;min-height:56px;font-size:var(--t3)}
  body.nav-open .navtoggle span:first-child{transform:translateY(8px) rotate(45deg)}
  body.nav-open .navtoggle span:last-child{transform:translateY(-8px) rotate(-45deg)}
  .wordmark{min-height:44px;display:inline-flex;align-items:center}
  .foot-more{min-height:44px;display:inline-flex;align-items:center}
  .foot-social a{min-height:44px;display:inline-flex;align-items:center}
  /* 보조 CTA pill 높이는 기본 규칙의 --hc(40) 하나가 정한다 (§5), 히트영역 핵이 필요 없다 */
  .anchor a{padding:12px 0}
  .rail{grid-template-columns:1fr}
  .intro-2col{grid-template-columns:1fr;gap:24px}
  .feedhead{grid-template-columns:1fr;gap:20px}
  .credits{grid-template-columns:1fr 1fr}
  /* 케이스 이미지 스택도 본문과 같은 좌우 거터(20px) 공유 */
  .fullbleed{padding:40px 0 0}
  .teamgrid{grid-template-columns:1fr 1fr}
}

/* 보조 CTA pill (Pentagram 실측: bg rgba(0,0,0,.07), color rgba(0,0,0,.7), radius 4px, 16px, 화살표 동반) */
.anchor a.pill{display:inline-flex;align-items:center;gap:8px;
  background:rgba(0,0,0,.07);color:rgba(0,0,0,.7);
  border-radius:4px;padding:12px 16px;font-size:var(--t4);line-height:1.25;
  text-decoration:none;transition:background .3s cubic-bezier(.4,0,.2,1)}
.anchor a.pill:hover{background:rgba(0,0,0,.12);color:var(--ink)}
.anchor a.pill .arrow{font-size:var(--t4)}

/* Work 카드 태그, hover 없이 제목 아래 상시 노출 (조중현 지시)
   pill 자체는 기본 .pill 토큰 그대로 쓴다 (§0-3), 여기서 다시 정의하면
   특이도가 body.is-dark .pill 을 이겨 다크 반전이 무효가 된다 (§13). */
.wgrid .c-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}

/* Pentagram 실측: 워드마크만 좌측, 내비·검색·언어는 전부 우측 정렬(우측 끝이 거터).
   space-between 이 자식 4개를 균등 분배해 내비가 가운데로 밀리던 문제. */
@media(min-width:800px){
  header > nav{margin-left:auto}
  .hdr-tools{margin-left:28px}
}

/* ── 스튜디오 팀 · 대표 디렉터 (Pentagram About 실측: 흑백 인물 4열, 이름 16px + 역할 16px #767676) ── */
.tmember .thumb{width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;display:block;background:var(--ph);filter:grayscale(1);transition:filter .3s cubic-bezier(.4,0,.2,1)}
.tmember:hover .thumb{filter:grayscale(0)}
.tmember figcaption{padding-top:12px}
.tmember .c-title{font-size:var(--t4);line-height:1.25;font-weight:var(--w-base);margin:0}
.tmember .c-desc{font-size:var(--t4);line-height:1.25;color:var(--muted);margin:2px 0 0}
.tmember .tmail{display:inline-block;margin-top:4px;font-size:var(--t5);line-height:1.25;color:var(--muted);text-decoration:none}
.tmember .tmail:hover{color:var(--ink);text-decoration:underline}

/* 아래 패딩 0 (§8), 푸터 간격은 .footwrap 의 margin-top:--rowgap 하나가 만든다 */
/* ── 대표 디렉터 (조중현 2026-08-05 "3단 레이아웃으로 다시 디자인해. 썸네일은 위 팀원
   썸네일 크기와 맞추고, 사진 다음 이력 다음 설명으로") ──
   이름 줄이 전폭으로 서고, 그 아래 세 단이 나란히 선다. 모두 같은 12트랙 위다.
   새 치수를 만들지 않는다 (§0-3):
     ① .dir-id      이름(4) + 직함·메일(8)  ← 전폭
     ② .dir-photo(3) · .dir-career(4) · .dir-body(5)
     ③ .dir-links   전폭
   사진 3트랙은 위 팀 그리드가 4열(=한 칸 3트랙)이라 **팀원 썸네일과 정확히 같은 크기**다.
   이전(2026-07-29)에는 사진 4 + 소개 8 두 덩이에 경력표가 전폭으로 깔렸다.

   세로 간격은 row-gap 한 값이 정한다 (§8), 자식마다 margin-top 을 두지 않는다. */
/* 세 단 사이 간격 (조중현 2026-08-05 "각 칼럼간 간격이 너무 좁아" → 129px,
   이어서 "3단 간격은 50% 줄여" → 64px).
   사진 칼럼은 팀 그리드 한 칸과 **같은 식**으로 적는다: 4열 그리드의 한 칸 =
   (폭 − 3×gap) / 4. 그래서 간격을 어떻게 잡든 썸네일과 크기가 어긋나지 않는다
   (§0-3, 새 치수를 발명하지 않는다).
   이력 칼럼도 같은 한 칸으로 잡는다 (조중현 2026-08-05 "마지막 칼럼을 화면 중앙에서
   시작하게 하자 그러면 위 그리드랑 맞잖아"). 두 칸 + 두 간격이 정확히 폭의 절반이라,
   설명 칼럼은 화면 한가운데에서 시작하면서 팀 그리드의 3번째 트랙, 인트로 2단의
   오른쪽 칼럼과 같은 세로선 위에 선다. 남은 폭은 전부 설명이 받는다. */
.director{display:grid;
  grid-template-columns:calc((100% - 3 * var(--gap-wide)) / 4) calc((100% - 3 * var(--gap-wide)) / 4) minmax(0,1fr);
  gap:48px var(--gap-wide);padding:8px 0 0}
.dir-col{grid-column:1}
.dir-career{grid-column:2}
.dir-body{grid-column:3}
/* 이름·직함·메일·링크는 사진 밑에 한 덩이로 붙는다 (조중현 2026-08-05
   "이름 이메일 기타 링크 같이 묶어서 이미지 밑에 넣고"), 사람의 신원이 한 자리에 모인다. */
.dir-col{display:flex;flex-direction:column;gap:20px}
.dir-id{display:flex;flex-direction:column;gap:4px}
.dir-name{font-size:var(--t3);line-height:1.25;font-weight:var(--w-base);margin:0}
.dir-meta{display:flex;flex-wrap:wrap;gap:4px 20px;margin:0}
.dir-photo{width:100%;height:auto;aspect-ratio:1/1;object-fit:cover;display:block;background:var(--ph);filter:grayscale(1)}
.dir-role{font-size:var(--t4);line-height:1.25;color:var(--muted);margin:0}
.dir-mail{font-size:var(--t4);line-height:1.25;color:var(--muted);text-decoration:none}
.dir-mail:hover{color:var(--ink);text-decoration:underline}
/* 대표 소개는 이 지면에서 가장 많이 읽히는 한 문단이다, 본문(t4)이 아니라 리드로 세운다.
   .lead-para 와 같은 문법(한 단 올린 크기 + 리드 줄높이). 사진 칼럼의 높이와도 가까워진다. */
.dir-bio{font-size:var(--t4);line-height:var(--lh-body);margin:0}
/* 3단이 되면서 소개는 5트랙 칼럼 안으로 들어갔다 (2026-08-05). 그 폭에서 리드(t3)는
   한 줄에 스무 몇 자밖에 못 담아 글이 잘게 부서진다, 본문 프로즈 짝(t4/--lh-body)으로
   내린다 (§2). 글줄길이는 칼럼이 이미 정하므로 max-width 를 따로 걸지 않는다. */
/* 바깥 테두리는 두지 않는다 (조중현 2026-08-05 "경력부분에서 위아래 디바이더 빼").
   목록을 상자로 가두지 않고, 항목 사이를 끊는 선만 남긴다. */
.dir-career{list-style:none;margin:0;padding:0}
/* 4트랙 칼럼 안이라 라벨·값을 좌우로 벌리지 않는다, 값이 두세 글자마다 꺾인다.
   라벨을 값 위에 얹는다. 키라인은 그대로 남아 칼럼 안에서 이력을 끊는다. */
.dir-career li{display:block;padding:12px 0;border-bottom:1px solid #e5e5e5}
.dir-career li:last-child{border-bottom:0}
.dir-when{display:block;font-size:var(--t5);line-height:1.25;color:var(--muted)}
.dir-what{font-size:var(--t4);line-height:1.35;margin-top:2px}
/* 링크 줄은 글자에서 아이콘으로 바뀌었다 (조중현 2026-08-12 "아이콘으로 바꿔").
   아이콘은 18px 인데 손가락은 그보다 크므로 32px 상자 가운데 놓는다. 상자만큼
   왼쪽으로 물려 두면 아이콘의 왼쪽 끝이 위 이름·직함과 같은 세로선에 선다,
   눈에 보이는 것은 아이콘이지 상자가 아니다. 위아래 여백도 같은 이유로 상쇄한다,
   .dir-col 의 세로 간격(20px)은 글자 줄 기준으로 잡혀 있다. */
.dir-links{display:flex;gap:8px;margin:-7px 0 -7px -7px}
.dir-links a{display:grid;place-items:center;width:32px;height:32px;
  color:var(--ink);text-decoration:none;transition:opacity .2s cubic-bezier(.4,0,.2,1)}
.dir-links a:hover{opacity:.5}
/* 빈 칸 (조중현 2026-07-29 "디렉터 칸 2개 더 만들어 더미로" / 팀 "공란을 추가로 3개 더").
   자리만 잡는다, 없는 사람의 이름을 지어 넣지 않는다. 회색 판은 --ph 하나로 통일. */
/* 자리표시자도 같은 3단 위에 선다. 예전 12트랙 레이아웃에서 쓰던
   grid-template-columns:repeat(12,1fr) 이 개편(2026-08-05) 뒤에도 남아 있어
   이 블록들만 1·2·3 트랙(178·83·92px)에 눌려 있었다, 간격만 얹고 격자는 건드리지 않는다. */
/* 디렉터끼리의 간격 (조중현 2026-08-12 "디렉터끼리 간격 너무 붙었고").
   예전에는 이 값이 .is-empty 에만 걸려 있었다. 더미 두 칸만 아래에 붙어 있어서
   그것으로 충분했는데, 한동훈 블록이 실 인물로 서면서 조중현 블록과 8px 짜리
   padding 하나를 사이에 두고 맞붙었다. 사람이 바뀌는 자리는 섹션이 바뀌는 자리와
   같은 크기로 벌린다(--rowgap), 새 치수를 만들지 않는다. */
.director + .director{margin-top:var(--rowgap)}
.director.is-empty .dir-photo{aspect-ratio:1/1;background:var(--ph);display:block}
.tmember.is-empty .thumb{aspect-ratio:1/1;background:var(--ph);display:block}
.tmember.is-empty figcaption{padding-top:0}
@media(max-width:1023px){
  /* 좁아지면 이름 줄은 쌓는다, 4트랙에 이름이 들어가지 않는다 */
  /* 세 단을 그대로 밀어 넣으면 설명 칼럼이 스무 자도 못 담는다.
     사진 덩이는 왼쪽에 두고, 이력·설명을 오른쪽 칼럼에 위아래로 쌓는다. */
  /* 이 티어는 팀 그리드가 2열이라 사진이 썸네일과 짝을 이루지 않는다,
     사진 트랙은 지금 크기(3트랙 × --gap)를 그대로 둔다. */
  .director{grid-template-columns:calc((100% - 2 * var(--gap)) / 3) minmax(0,1fr);
    gap:32px var(--gap-wide)}
  .dir-col{grid-column:1}
  .dir-career{grid-column:2}
  .dir-body{grid-column:2}
}
@media(max-width:799px){
  .director{grid-template-columns:1fr;gap:32px}
  .dir-col,.dir-body,.dir-career{grid-column:1}
  .director + .director{margin-top:calc(var(--rowgap) / 2)}
  .dir-career li{grid-template-columns:90px 1fr;gap:12px}
  .dir-when,.dir-what{grid-column:auto}
}

/* ══ 검색 드로어 (pentagram.com 실측 2026-07-10) ══
   전체화면 전환 아님. 헤더 뒤 최상단에서 내려오는 흰 패널.
   .search__form { padding:124px 0 96px; background:#fff; width:100% }  → 높이 294px
   input 1392×74 @gutter24 / 32px / lh 38.4 / ls -.32px / border-bottom 1px #e3e4e5
   본문 스크롤 잠금 없음 (body overflow: visible 유지, 기본값이라 별도 규칙이 필요 없다).
   열려 있는 동안의 배경 잠금은 CSS 가 아니라 site.js 가 내비 오버레이와 같은 inert 로 한다 (§0-3). */
/* top:0 (헤더 뒤) + padding-top 124px → 입력이 페이지 상단 124px 지점. Pentagram 과 동일. */
.searchpanel{position:fixed;inset:0 0 auto 0;z-index:15;
  background:var(--paper);padding:124px 0 96px;max-height:100vh;overflow-y:auto;
  box-shadow:0 1px 0 var(--line)}
.searchbar{display:flex;align-items:center;gap:16px;
  width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:0}
#searchinput{flex:1;font:inherit;font-size:var(--t2);line-height:38.4px;letter-spacing:-.32px;
  font-weight:var(--w-base);color:var(--ink);background:none;border:0;border-bottom:1px solid #e3e4e5;
  padding:0 0 18px;outline:none}
#searchinput:focus{border-bottom-color:var(--ink)}
/* 닫기 ✕ 는 모바일 전용 (Pentagram: .btnClose 에 md:!hidden).
   데스크톱은 헤더의 돋보기를 다시 눌러 닫는다. 그래서 입력이 콘텐츠 폭 1392 를 다 쓴다. */
.searchclose{display:none;background:none;border:0;font-size:var(--t2);line-height:1;color:var(--muted);cursor:pointer;padding:0 4px}
.searchclose:hover{color:var(--ink)}
.searchresults{width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto;padding:24px 0 0}
.searchresults:empty{padding:0}
@media(max-width:799px){
  .searchpanel{padding:76px 0 48px}
  #searchinput{font-size:var(--t2);line-height:1.2;padding-bottom:12px}
  .searchclose{display:block}
}

/* ══ 언어 토글, 세그먼트 컨트롤 ══
   Pentagram pill 토큰 재사용: 트랙 rgba(0,0,0,.07), radius 4px, 13px, 비활성 rgba(0,0,0,.56) */
.langtoggle{display:inline-flex;align-items:center;gap:0;
  background:rgba(0,0,0,.07);border-radius:4px;padding:2px}
/* --hc(46px)는 히어로 컨트롤 토큰이다, 60px 헤더에 넣으면 뚱뚱해진다 (조중현 2026-07-29) */
.langtoggle button{background:none;border:0;cursor:pointer;font:inherit;
  font-size:var(--t5);line-height:16.25px;padding:4px 8px;border-radius:3px;
  color:rgba(0,0,0,.56);transition:background .3s cubic-bezier(.4,0,.2,1),color .3s cubic-bezier(.4,0,.2,1)}
.langtoggle button:hover{color:var(--ink)}
/* 헤더가 흰색이라 흰 알약을 얹으면 활성 쪽이 '빈 칸'으로 읽힌다. 활성은 잉크로 채운다. */
.langtoggle button.on{background:var(--ink);color:var(--paper)}
.langtoggle button.on:hover{color:var(--paper)}
.langsep{display:none}

/* 다크 섹션용 진입 pill (thematic 위) */
.thematic .anchor{padding:32px 0 0}
.thematic .anchor a.pill{background:rgba(255,255,255,.12);color:#fff}
.thematic .anchor a.pill:hover{background:rgba(255,255,255,.22);color:#fff}

/* ══════════════════════════════════════════════════════════════
   듀당스 고유 문법 (Pentagram 에 없음, 조중현 지시)
   토큰은 기존 것을 그대로 쓴다: 잉크 채움 = 강조, radius 4px, 13/16px.
   ══════════════════════════════════════════════════════════════ */

/* ── Feed 를 워드마크 옆으로 승격 ── */
.feedmark{margin-left:16px;font-size:var(--t5);line-height:16.25px;font-weight:var(--w-strong);letter-spacing:.02em;
  background:var(--ink);color:var(--paper);border-radius:4px;padding:5px 9px;
  transition:opacity .3s cubic-bezier(.4,0,.2,1)}
.feedmark:hover{opacity:.72}
.feedmark[aria-current="page"]{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1px var(--ink)}
@media(max-width:799px){.feedmark{margin-left:12px}}
body.feed-page .feedmark{background:#fff;color:#0a0a0a}
body.feed-page .feedmark[aria-current="page"]{background:transparent;color:#fff;box-shadow:inset 0 0 0 1px #fff}

/* ── 스크롤 시 헤더 도구(검색·언어)를 플로팅으로 살린다 ──
   헤더는 static 이라 스크롤하면 사라진다. 80px 넘어가면 도구만 우상단에 띄운다.
   전환은 헤더가 이미 화면 밖일 때 일어나므로 레이아웃 점프가 보이지 않는다. */
.hdr-tools.is-float{position:fixed;top:12px;right:var(--edge);z-index:30;margin:0;
  gap:14px;padding:8px 12px;border-radius:var(--hr-md); /* 스타디움 금지 (§4) */
  background:rgba(255,255,255,.88);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  box-shadow:0 1px 2px rgba(0,0,0,.06),0 4px 16px rgba(0,0,0,.08);
  animation:tools-in .3s cubic-bezier(.4,0,.2,1)}
@keyframes tools-in{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
body.feed-page .hdr-tools.is-float{background:rgba(20,20,20,.82);box-shadow:0 1px 2px rgba(0,0,0,.4),0 4px 16px rgba(0,0,0,.5)}
body.feed-page .langtoggle{background:rgba(255,255,255,.14)}
body.feed-page .langtoggle button.on{background:#fff;color:#0a0a0a}
@media(prefers-reduced-motion:reduce){.hdr-tools.is-float{animation:none}}

/* ── 플로팅 문의 버튼 ── */
.fab{position:fixed;right:var(--edge);bottom:var(--edge);z-index:30;
  display:inline-flex;align-items:center;gap:8px;
  background:var(--ink);color:var(--paper);border-radius:var(--hr-md); /* 스타디움 금지 (§4) */
  min-height:var(--hc);padding:0 20px;font-size:var(--t4);line-height:1.25; /* 컨트롤 높이 1종, a.pill 과 같은 --hc (§5) */
  /* 잉크 알약(#1a1a1a)이 다크 섹션(#222·배너) 위에서 배경과 붙는다. 흰 링으로 경계를 세운다.
     흰 배경 위에서는 링이 보이지 않으므로 양쪽 다 안전하다. */
  box-shadow:0 0 0 1px rgba(255,255,255,.28),0 2px 6px rgba(0,0,0,.12),0 8px 24px rgba(0,0,0,.24);
  opacity:0;visibility:hidden;transform:translateY(12px);
  transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1),visibility .3s}
.fab.is-on{opacity:1;visibility:visible;transform:none}
.fab:hover{background:#000}
.fab .arrow{font-size:var(--t4);transition:transform .3s cubic-bezier(.4,0,.2,1)}
.fab:hover .arrow{transform:translateX(3px)}
body.feed-page .fab{background:#fff;color:#0a0a0a;box-shadow:0 0 0 1px rgba(0,0,0,.15),0 8px 24px rgba(0,0,0,.5)}
body.feed-page .fab:hover{background:var(--ph)}
@media(max-width:799px){.fab{padding:0 16px;font-size:var(--t5)}} /* 세로는 --hc(40) 가 정한다 (§5) */
@media(prefers-reduced-motion:reduce){.fab{transition:opacity .01s}}

/* 모바일 헤더 순서: 워드마크 · Feed · (여백) · 도구 · 햄버거 */
@media(max-width:799px){
  header > .wordmark{order:1}
  header > .feedmark{order:2}
  header > .hdr-tools{order:3;margin-left:auto;margin-right:8px}
  header > .navtoggle{order:4;margin-left:0}
}

/* ── 진입 카드: 그리드의 마지막 한 칸 (조중현 지시, pill 을 따로 빼지 않는다) ──
   2026-08-09 (조중현 "제목과 본문은 카드내에 화살표와 함께 디자인하자"): 면 아래
   캡션이던 제목·본문이 면 안으로. 위 텍스트, 아래 화살표, sitmore 와 같은 문법. */
.entrycard a{display:block;color:inherit}
.entrycard .entry-face{display:flex;flex-direction:column;align-items:flex-start;
  justify-content:space-between;padding:24px;
  background:rgba(0,0,0,.04);
  transition:background .3s cubic-bezier(.4,0,.2,1)}
.entrycard a:hover .entry-face{background:rgba(0,0,0,.1)}
.entrycard .entry-arrow{line-height:1;color:var(--ink);
  transition:transform .3s cubic-bezier(.4,0,.2,1)}
.entrycard a:hover .entry-arrow{transform:translateX(8px)}
.entrycard .entry-cap{display:block}
.entrycard .entry-label{display:block;font-size:var(--t3);line-height:25px;color:var(--ink)}
.entrycard .entry-count{display:block;font-size:var(--t4);line-height:1.25;color:var(--muted)}
/* Work 카드와 같은 3:2 */
.wgrid .entrycard .entry-face{aspect-ratio:3/2}
/* Articles 4단 카드와 같은 셀 */
.artgrid .entrycard{margin-bottom:0}
.artgrid .entrycard .entry-face{aspect-ratio:1/1}  /* 저널 카드와 같은 정방형 */
/* Magazine 그리드의 마지막 칸 */
.feed:not(.artgrid) .entrycard{margin:0}
.feed:not(.artgrid) .entrycard .entry-face{aspect-ratio:1/1}

/* 홈 섹션 헤드와 그리드 사이. 헤딩 32px 의 1.5배(48px)를 광학 여백으로 쓴다. */
.page-head.homehead{padding-top:0;padding-bottom:48px}
@media(max-width:799px){.page-head.homehead{padding-bottom:32px}}

/* 진입점 영상 커버 (duedance.com 이 실제로 영상을 진입점에 쓴다) */
.wgrid video,.bshot{width:100%;display:block;background:var(--ph)}
.wgrid figure video{aspect-ratio:3/2;object-fit:cover}
video[data-lazyvideo]{background:var(--ph-dark)}

/* ── 태그 = 진입점 (상세 → 필터된 Work 리스트) ──
   위 여백은 .case-tags 컨테이너가 이미 갖는다, a.pill 의 mt 22 를 물려받지 않는다.
   크기는 컨트롤 높이(--hc)를 따르지 않는다 (조중현 2026-08-09 "상세페이지내 태그크기는
   훨씬 줄여줘"). 제목 위 아이브로우가 되면서 라벨(.pill 기본 4px 8px · t5)로 돌아간다,
   제목보다 먼저 읽는 자리라 컨트롤 크기면 제목을 누른다. */
.case-tags a.pill{margin-top:0;min-height:0;padding:4px 10px;font-size:var(--t5);
  transition:background .3s cubic-bezier(.4,0,.2,1),color .3s cubic-bezier(.4,0,.2,1)}
.case-tags a.pill:hover{background:rgba(0,0,0,.12);color:var(--ink)}
.newsfilter [data-cat]{cursor:pointer}

/* ── 맥락형 CTA (상세 케이스 끝, 조중현 지시) ──
   케이스를 끝까지 본 사람의 확신이 최고조인 지점. 이 프로젝트를 물고 퍼널로 넘긴다.
   새 토큰 없음: 잉크 채움 = 강조, radius 4px, 타입 52/19/16. */
.case-cta{margin-top:var(--rowgap)}
.case-cta-inner{background:#222;color:#fff;border-radius:0;
  padding:64px var(--edge) 72px;text-align:center}
.case-cta-eyebrow{font-size:var(--t5);line-height:16.25px;letter-spacing:.04em;
  text-transform:uppercase;color:var(--dark-muted);margin:0 0 20px}
.case-cta-head{font-size:var(--disp);font-weight:var(--w-base);line-height:1.05;letter-spacing:-.02em;
  max-width:20ch;margin:0 auto;text-wrap:pretty}
.case-cta-head .cta-proj{font-style:italic}
.case-cta-sub{font-size:var(--t3);line-height:var(--lh-lead);color:var(--dark-muted);
  max-width:42ch;margin:20px auto 0}
.case-cta-btn.pill{display:inline-flex;align-items:center;gap:8px;margin-top:32px;
  background:#fff;color:#0a0a0a;border-radius:var(--hr-md);min-height:var(--hc);padding:0 22px; /* 높이 1종 --hc (§5) */
  font-size:var(--t4);line-height:1.25;text-decoration:none;
  transition:transform .3s cubic-bezier(.4,0,.2,1),background .3s cubic-bezier(.4,0,.2,1)}
.case-cta-btn.pill:hover{background:var(--ph)}
.case-cta-btn .arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.case-cta-btn.pill:hover .arrow{transform:translateX(4px)}
.anchor.sub-anchor{padding-top:48px;padding-bottom:64px}
@media(max-width:799px){
  .case-cta-inner{padding:40px var(--edge) 48px;border-radius:0}
  .case-cta-sub{font-size:var(--t4)}
  .case-cta-btn.pill{margin-top:24px}
}
@media(prefers-reduced-motion:reduce){.case-cta-btn.pill,.case-cta-btn .arrow{transition:none}}

/* ── 잠긴 프로젝트 (조중현 2026-08-12 "4개 프로젝트는 잠굴거야") ──
   카드는 그대로 서지만 링크가 없다. 마크업에 a 가 아예 없으므로 키보드 탭과 크롤러도
   들어가지 않는다. 손을 올리면 썸네일 우측 상단에 '공개 예정' 이 뜬다. */
/* href 없는 a 다. `.wgrid a` · `.wgrid.is-list a` 의 레이아웃을 그대로 물려받아야 하므로
   display 를 여기서 다시 정하지 않는다. position 만 얹어 배지의 기준을 만든다. */
.cardlock{position:relative;cursor:default}
.lockbadge{position:absolute;top:12px;right:12px;z-index:2;
  padding:6px 10px;background:var(--ink);color:var(--paper);
  font-size:var(--t5);letter-spacing:.02em;line-height:1;
  opacity:0;transition:opacity .2s cubic-bezier(.4,0,.2,1);pointer-events:none}
.cardlock:hover .lockbadge,.cardlock:focus-within .lockbadge{opacity:1}
/* 리스트뷰에서 .cardlock 은 12칼럼 격자다. 배지를 absolute 로 두면 카드 전체를 기준
   으로 잡혀 제목 옆에 뜬다. 격자의 한 칸(커버 자리)에 직접 얹어 썸네일 우측 상단에 세운다. */
.wgrid.is-list .cardlock .lockbadge{position:static;grid-column:1/9;grid-row:2/6;
  place-self:start end;margin:12px}
@media(max-width:1023px) and (min-width:800px){
  .wgrid.is-list .cardlock .lockbadge{grid-column:1/8}
}
@media(max-width:799px){
  /* 좁은 화면은 한 칸으로 쌓이고 순서를 order 가 정한다(제목·메타·커버·설명·태그·버튼).
     배지에만 grid-row 를 주면 명시 배치가 자동 배치보다 먼저 자리를 잡아 커버보다
     윗행을 차지한다. 잠긴 카드에 한해 커버와 배지 둘 다 3행으로 못 박아 같은 칸에 겹친다. */
  .wgrid.is-list .cardlock img,.wgrid.is-list .cardlock video{grid-row:3}
  .wgrid.is-list .cardlock .lockbadge{grid-column:1;grid-row:3}
}
/* 손을 올려도 카드가 눌릴 것처럼 밝아지지 않는다 (.wgrid a:hover img 와 짝) */
.cardlock:hover img,.cardlock:hover video{opacity:1}
@media(hover:none){.lockbadge{opacity:1}}  /* 터치에는 hover 가 없다, 항상 보인다 */
@media(prefers-reduced-motion:reduce){.lockbadge{transition:none}}

/* ── Work 카드: 제목 아래 본문 2줄 (조중현 지시) ── */
.wgrid .c-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  margin-top:6px;font-size:var(--t4);line-height:var(--lh-body);color:var(--muted)} /* 여러 줄 한글 본문, --lh-body (§3) */


/* ── 홈 "Selected Work" 머리글 ──
   카테고리 칩은 2026-08-10 삭제 (조중현 "포폴이 많이 없는데 누르면 적은 량의 포폴로
   이동하는게 별로야"). 태그로 걸러 들어가는 길은 Work 필터 줄과 케이스 태그 pill 이
   갖고 있다. 칩이 서던 자리(.catnav 와 그 반응형·다크 규칙)는 함께 걷어냈다. */
.catnav-sec{padding-top:var(--rowgap)}
/* 머리글 (조중현 2026-08-09 "아래 화살표로 살짝 작게 표기(중앙정렬)").
   본문 t3 보다 한 단 작은 t4, 화살표는 아래 방향. */
.cathead{display:flex;align-items:center;justify-content:center;gap:6px;
  font-size:var(--t4);line-height:var(--lh4);color:var(--ink);margin-top:20px}
.cathead .ico-arrow{width:16px;height:16px;transform:rotate(90deg)}

/* ── 쪽 번호 (저널, 조중현 2026-08-11 "4줄 다음에 1,2,3,4,5 등 페이지네이션") ──
   컨트롤 높이는 1종 --hc (§5), 면·라운드는 필터 칩과 같은 값을 쓴다. 새 어휘를 만들지 않는다. */
.pager{display:flex;flex-wrap:wrap;justify-content:center;gap:6px;margin-top:var(--rowgap)}
.pgnum{min-width:var(--hc);height:var(--hc);padding:0 12px;border:0;border-radius:4px;
  cursor:pointer;font-size:var(--t4);line-height:1.25;font-variant-numeric:tabular-nums;
  background:rgba(0,0,0,.05);color:var(--ink);
  transition:background .2s cubic-bezier(.4,0,.2,1),color .2s}
.pgnum:hover{background:rgba(0,0,0,.1)}
.pgnum.on{background:var(--ink);color:var(--paper)}
body.is-dark .pgnum{background:rgba(255,255,255,.1);color:var(--ink)}
body.is-dark .pgnum:hover,body.is-dark .pgnum.on{background:#fff;color:#0a0a0a}

/* ── 매거진 레코드 본문 (2026-08-10 반입한 Watching 아카이브) ──
   목록에서는 #magrecords 안에 숨어 있고, ?post= 상세가 꺼내 이미지 아래에 편다.
   케이스 본문(.case-p)과 같은 읽기 폭·같은 급수를 쓴다, 새 어휘를 만들지 않는다. */
/* 본문 글줄 폭 하나가 히어로 이미지와 본문을 함께 정한다 (조중현 2026-08-10
   "히어로 이미지 가로크기와 본문 텍스트 가로크기 통일"). 이미지는 그 폭의 70% 다. */
/* 읽기 폭은 px 로 못박는다. ch 는 그 값을 쓰는 요소의 글자 크기를 따라가서,
   같은 var 를 써도 제목·본문·인용이 저마다 다른 폭이 된다 (2026-08-10 요약문만 797 로
   벌어져 이미지와 어긋났다). 672 는 본문 급수에서 68ch 에 해당하던 값이다. */
.rec, .rec-hero, body.rec-page .case-head{--m-rec:min(100%,672px)}
/* 글줄 폭은 상자가 아니라 자식이 갖는다. 상자는 .wrap 그대로 두고 안의 것들만 읽기
   폭으로 좁힌 뒤 가운데 세운다 (조중현 2026-08-10 "저널 이미지는 본문 크기와 딱 맞춰",
   이어서 "중앙 정렬 해야지"). 이미지·본문·목록이 같은 폭 같은 선으로 지면 한가운데 선다. */
.rec{margin-top:32px}
.rec > *{max-width:var(--m-rec);margin-inline:auto}
.rec-hero .shot{margin-inline:auto}
/* 제목 블록도 같은 칼럼에 세운다. 레코드 본문이 있는 화면에서만이다,
   .case-head 는 케이스 상세와 함께 쓰는 컴포넌트라 전역으로 바꾸지 않는다. */
body.rec-page .case-head h1,
body.rec-page .case-head .case-tags,
body.rec-page .case-head .lead-para{max-width:var(--m-rec);margin-inline:auto}
.rec-hero{padding-top:24px}
/* 이미지 폭 = 본문 글줄 폭. 예전 .fullbleed 는 화면을 가로질렀고(1440 에서 1247),
   지금은 글줄과 같은 672 다. 컨테이너 기준으로는 54% 로 줄어든 셈이다. */
.rec-hero .shot{display:block;width:100%;max-width:var(--m-rec);height:auto;
  background:var(--ph)}
/* 작업 범위는 한 줄 글이 아니라 태그다 (조중현 2026-08-10 "work의 테그들 처럼
   디자인 연결성 있게"). Work 카드와 같은 .pill 컴포넌트·같은 성격 분류(svc·out·seg)를
   그대로 쓴다. 누르면 그 태그의 Work 로 간다. */
.rec-tags{margin-top:4px}
.rec-tags .pill{text-decoration:none}
.rec-tags .pill:hover{opacity:.75}
/* 카드에서는 분류(Watching) 뒤에 작업 범위가 이어 붙는다 */
.feed .post .c-tags .pill.cat + .pill{margin-left:0}
.rec-h{font-size:var(--t3);font-weight:var(--w-base);letter-spacing:-.01em;
  line-height:var(--lh3);margin:40px auto 12px}
.rec-sum{font-size:var(--t3);line-height:var(--lh-body);text-wrap:pretty}
/* 기본 정보 표. 좌 항목 · 우 값 2단, 행마다 1px 선 (studio 이력 목록과 같은 문법) */
.rec-meta{display:grid;gap:0;margin-top:24px;border-top:1px solid var(--line)}
.rec-meta > div{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);
  gap:0 var(--gap);padding:12px 0;border-bottom:1px solid var(--line)}
.rec-meta dt{font-size:var(--t5);line-height:1.4;color:var(--muted)}
.rec-meta dd{font-size:var(--t4);line-height:var(--lh4);margin:0;text-wrap:pretty}
.rec-meta a{text-decoration:underline;text-underline-offset:2px}
/* 크레딧 등급(1차·2차). 확인 강도를 말하는 표식이라 값 옆에 작게 붙는다 */
.rec-tier{display:inline-block;margin-left:8px;padding:2px 6px;border-radius:999px;
  font-size:var(--t6);line-height:1.2;background:rgba(0,0,0,.07);color:rgba(0,0,0,.56)}
.rec-note-src{display:block;margin-top:4px;font-size:var(--t6);line-height:1.4;color:var(--muted)}
/* 듀당스의 한 줄. 이미지 바로 다음에 서고 검정 면이다 (조중현 2026-08-10
   "듀당스 한줄이 이미지 다음으로, 그리고 검정 배경으로"). 사실 정리보다 우리 해석을
   먼저 읽힌다. 먹 면은 홈 마그넷·푸터와 같은 var(--ink) 다, 새 색을 만들지 않는다. */
.rec-quote{margin:0 auto 40px;padding:32px;background:var(--ink);color:#fff;
  max-width:var(--m-rec)}
.rec-quote p{font-size:var(--t3);line-height:var(--lh-body);margin:0;text-wrap:pretty;color:#fff}
.rec-quote cite{display:block;margin-top:14px;font-style:normal;
  font-size:var(--t6);letter-spacing:.06em;color:var(--dark-muted)}
/* 크레딧 주석·출처 푸터. 본문보다 한 단 물러선 글이다 */
.rec-flag{margin-top:16px;font-size:var(--t5);line-height:1.5;color:var(--muted)}

/* ── 레코드 본문의 긴 글 (2026-08-12, 매거진 고정 콘텐츠 5편이 들어오며 신설).
   지금까지 레코드는 인용·표·요약 몇 조각이었다. 고정 콘텐츠는 소제목과 목록, 비교표,
   문답까지 있는 한 편의 글이라 본문 요소를 갖춰야 했다. 새 척도를 만들지 않는다,
   글줄은 .rec 의 --m-rec 폭 안에서 본문 --t4 · --lh-body 하나로 흐른다. */
.rec-p{font-size:var(--t4);line-height:var(--lh-body);margin:0 auto 16px;text-wrap:pretty}
.rec-h3{font-size:var(--t4);font-weight:var(--w-strong);line-height:var(--lh4);
  margin:24px auto 8px}
.rec-list{margin:0 auto 16px;padding-left:20px}
.rec-list li{font-size:var(--t4);line-height:var(--lh-body);text-wrap:pretty}
.rec-list li + li{margin-top:6px}
.rec-list-num{padding-left:22px}
/* 프로세스 단계. 이름과 설명이 짝이라 줄을 갈라 세운다, 가운뎃점이나 괄호로 붙이지 않는다 */
.rec-steps{list-style:none;margin:0 auto 16px;padding:0;
  border-top:1px solid var(--line)}
.rec-steps li{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);
  gap:0 var(--gap);padding:12px 0;border-bottom:1px solid var(--line)}
.rec-step-t{font-size:var(--t5);line-height:1.4;color:var(--muted)}
.rec-step-d{font-size:var(--t4);line-height:var(--lh4);text-wrap:pretty}
/* 비교표. 좁은 화면에서는 표만 가로로 민다, 지면 전체가 밀리지 않게 */
.rec-tablewrap{margin:0 auto 20px;overflow-x:auto}
.rec-table{width:100%;border-collapse:collapse;font-size:var(--t5);line-height:1.5}
.rec-table th,.rec-table td{padding:10px 12px 10px 0;text-align:left;vertical-align:top;
  border-bottom:1px solid var(--line);text-wrap:pretty}
.rec-table thead th{font-weight:var(--w-strong);border-bottom-color:var(--ink)}
.rec-table tbody th{font-weight:var(--w-base);color:var(--muted);white-space:nowrap}
/* 문답. 물음이 값의 자리를 잡고 답이 그 아래로 흐른다 */
.rec-faq{margin:0 auto;border-top:1px solid var(--line)}
.rec-faq > div{padding:16px 0;border-bottom:1px solid var(--line)}
.rec-faq dt{font-size:var(--t4);font-weight:var(--w-strong);line-height:var(--lh4)}
.rec-faq dd{margin:8px 0 0;font-size:var(--t4);line-height:var(--lh-body);
  color:var(--muted);text-wrap:pretty}
@media (max-width:640px){
  .rec-steps li{grid-template-columns:1fr;gap:2px}
  .rec-table tbody th{white-space:normal}
}
/* 본문 끝 게시판식 앞뒤 탐색 (조중현 2026-08-10). 아카이브 순서로 최신 2 · 이전 3,
   끝에서는 반대편으로 돌려 어느 글에서도 다섯 개가 선다.
   주제 링크('함께 보기')는 같은 일을 해서 걷어냈다, 목록은 하나다. */
.recnav{margin-top:52px}
.recnav ol{list-style:none;margin:0;padding:0;border-top:1px solid var(--line)}
.recnav li{border-bottom:1px solid var(--line)}
.recnav li a{display:grid;grid-template-columns:auto minmax(0,1fr) auto;
  align-items:baseline;gap:0 var(--gap);padding:14px 0;color:inherit}
.recnav li a:hover .recnav-t{color:var(--muted)}
.recnav-side{font-size:var(--t6);line-height:1.2;color:var(--muted);
  min-width:4ch;letter-spacing:.04em}
.recnav-t{font-size:var(--t4);line-height:var(--lh4);text-wrap:pretty}
.recnav .date{flex:none;color:var(--muted)}
.recnav-all{display:inline-block;margin-top:20px;font-size:var(--t5);
  text-decoration:underline;text-underline-offset:3px}
.recnav-all:hover{color:var(--muted)}
@media(max-width:799px){
  .recnav li a{grid-template-columns:auto minmax(0,1fr);gap:2px var(--gap)}
  .recnav .date{grid-column:2;font-size:var(--t6)}
}
/* <footer> 라 전역 푸터 규칙의 가운데 정렬(margin-inline:auto)을 물려받는다,
   여기서 끊어 왼쪽 선을 본문과 맞춘다 (2026-08-10 이것만 384 로 밀려 있었다) */
.rec-foot{margin:44px auto 0;padding-top:20px;border-top:1px solid var(--line)}
.rec-foot p{font-size:var(--t5);line-height:1.6;color:var(--muted);margin:0 0 8px}
@media(max-width:799px){
  .rec-meta > div{grid-template-columns:1fr;gap:4px 0}
  .rec-h{margin-top:32px}
  .rec-quote{padding:16px}
}

/* ── 케이스 하단 2단: 비슷한 프로젝트 CTA(좌) · 다음 프로젝트(우) (koto.com 레퍼런스) ──
   앞 섹션 마지막 요소→이곳 첫 요소 = --rowgap 하나 (§8). 위 패딩·border 를 두지 않는다.
   키라인은 간격을 만들지 않는다, 별도 층(::before)으로 간격 한가운데에 곧게 그린다 (§7). */
.case-foot{position:relative;margin-top:var(--rowgap);padding-top:0;padding-bottom:0; /* pt·pb 0, 간격은 --rowgap 하나, 푸터 간격도 .footwrap 의 margin-top 하나가 만든다 (§8) */
  display:grid;grid-template-columns:1fr 1fr;gap:var(--gap) 64px;align-items:start}
.case-foot::before{content:"";position:absolute;left:0;right:0;top:calc(var(--rowgap)/-2);height:1px;background:var(--line)}
.case-foot-head{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.15;max-width:min(100%,var(--m-head))} /* --t2 급 섹션 제목은 --m-head 30ch (§3), .page-head h2 와 같다 */
.case-foot-head .cta-proj{font-style:italic}
.case-foot-sub{font-size:var(--t4);line-height:var(--lh-lead);color:var(--muted);margin-top:16px;max-width:min(100%,var(--m-lead))}
.case-foot-btn.pill{display:inline-flex;align-items:center;gap:8px;margin-top:24px;
  background:var(--ink);color:var(--paper);border-radius:var(--hr-md);min-height:var(--hc);padding:0 22px;font-size:var(--t4);line-height:1.25} /* 높이 1종 --hc (§5) */
.case-foot-btn.pill:hover{background:#000}
.case-foot-btn .arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.case-foot-btn.pill:hover .arrow{transform:translateX(4px)}
/* 다음 프로젝트 (우측). 이 페이지가 바라는 건 문의고, 다음 프로젝트는 그다음이다
   (조중현 2026-08-08 "다음프로젝트와 문의하기 버튼 위계 다시 설정하고 다음프로젝트는
   버튼으로 감싸"). 그래서 문의는 채운 알약, 다음 프로젝트는 선으로만 두른 버튼이다.
   이름도 --t2 에서 --t3 로 내렸다. 32px 이면 왼쪽 CTA 제목과 같은 크기라 둘 중
   무엇을 먼저 보라는 건지가 화면에 없었다. 라벨은 버튼 밖에 남는다, 버튼 안에 넣으면
   누르는 것 하나에 글이 세 줄이 된다. */
.case-nextwrap{justify-self:end;width:min(100%,420px)}
.case-next-label{display:block;font-size:var(--t5);letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:12px}
.case-next{display:flex;align-items:center;gap:16px;width:100%;color:inherit;
  border:1px solid var(--line);border-radius:var(--hr-md);padding:12px 16px;
  transition:border-color .2s cubic-bezier(.4,0,.2,1)}
.case-next:hover{border-color:var(--ink)}
.case-next-thumb{width:72px;height:48px;object-fit:cover;background:var(--ph);flex:0 0 auto;border-radius:var(--hr-sm)}
.case-next-name{flex:1 1 auto;min-width:0;font-size:var(--t3);font-weight:var(--w-base);letter-spacing:-.01em;line-height:var(--lh3)}
.case-next-arrow{flex:0 0 auto;display:inline-flex;color:var(--muted);transition:transform .3s cubic-bezier(.4,0,.2,1)}
.case-next:hover .case-next-arrow{transform:translateX(4px);color:var(--ink)}
@media(max-width:799px){
  .case-foot{grid-template-columns:1fr;gap:48px}
  .case-nextwrap{justify-self:start;width:100%}
}


/* ── 리드 마그넷 허브 = 세로가 긴 카드 3장 (조중현 2026-08-12 "세로 비율이 긴 카드 디자인").
   갈래 4카드(.pickcard)와 같은 rgba .04 채움·라운드 없음 문법, 화살표는 카드 바닥에 정박.
   아코디언 동작(하나만 열림)은 그대로, 열린 폼은 카드 안 바닥에서 키라인 아래로 펼쳐진다.
   폼 원자(door-form/field/input/note/sent)는 .inq-form 도 같이 쓴다. ── */
.doorrow{margin-top:40px;display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap-wide);align-items:start}
.door{display:flex;flex-direction:column;min-height:460px;background:rgba(0,0,0,.04);padding:24px;
  scroll-margin-top:76px; /* 푸터 #magnet-* 해시 착지용, .inqsec 과 같은 값 */
  transition:background .3s cubic-bezier(.4,0,.2,1)}
.door:hover{background:rgba(0,0,0,.07)}
/* font:inherit, button 의 UA 기본 웨이트 400 이 자식(.door-no·.door-sub)까지 내려가
   지면 전체가 500 인데 여기만 얇게 읽혔다 (조중현 2026-07-29 "한글 폰트 웨이트 올려").
   버튼 안 텍스트도 §2 의 두 웨이트만 쓴다 */
.door-trigger{display:flex;flex-direction:column;flex:1;width:100%;text-align:left;background:none;border:0;padding:0;cursor:pointer;
  font:inherit;font-weight:var(--w-base);color:inherit}
.door-no{font-size:var(--t4);color:var(--muted);font-variant-numeric:tabular-nums;line-height:1.35}
.door-main{display:block}
.door-title{display:block;margin-top:14px;font-size:var(--t3);font-weight:var(--w-base);line-height:var(--lh3)}
.door-sub{display:block;font-size:var(--t4);color:var(--muted);line-height:var(--lh4);margin-top:8px;max-width:min(100%,var(--m-lead))}
.door-arrow{display:block;margin-top:auto;padding-top:24px;font-size:var(--t3);color:var(--ink);line-height:1.3;
  transition:color .3s cubic-bezier(.4,0,.2,1)}
.door-arrow .ico-arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.door:hover .door-arrow .ico-arrow{transform:translateX(8px)}
.door-trigger:hover .door-title{color:var(--muted)}
/* 열림 상태는 방향이 아니라 색으로 말한다, 화살표는 항상 동쪽 1종, 회전 금지 (§6).
   들어간 문의 화살표는 물러나고, 열린 패널 자체가 상태를 보여준다. */
.door-trigger[aria-expanded="true"] .door-arrow{color:var(--muted)}
.door-panel{border-top:1px solid var(--line);margin-top:20px;padding:20px 0 8px}
.door-form{display:flex;flex-wrap:wrap;gap:20px 28px;align-items:flex-end;max-width:min(100%,var(--m-body))}
.door-field{flex:1 1 220px;min-width:0}
.door-field-wide{flex-basis:100%}
/* 입력·제출 모두 컨트롤, 높이는 1종 --hc 로 묶는다 (§5). 좁은 화면 40 이 자동 전파된다 */
.door-input{width:100%;height:var(--hc);font:inherit;font-size:var(--t3);color:var(--ink);background:none;border:0;
  border-bottom:1px solid #ccc;padding:8px 0;outline:none;transition:border-color .2s}
.door-input::placeholder{color:#aaa}
.door-input:focus{border-bottom-color:var(--ink)}
.door-submit{background:none;border:0;cursor:pointer;font:inherit;font-size:var(--t4);color:var(--ink);
  display:inline-flex;align-items:center;gap:8px;min-height:var(--hc);padding:0 0 9px;border-bottom:1px solid var(--ink);white-space:nowrap}
.door-submit:hover{color:var(--muted);border-bottom-color:var(--muted)}
.door-note{flex-basis:100%;font-size:var(--t5);line-height:1.4;color:var(--muted)}
/* 제출 뒤에는 폼을 흐리기만 하지 않는다, 다음 행동을 문장으로 말한다 (§10) */
.door.is-sent .door-form{opacity:.5;pointer-events:none}
.door-sent{font-size:var(--t4);line-height:var(--lh-body);color:var(--ink);margin-top:20px;max-width:min(100%,var(--m-lead))}
@media(max-width:799px){
  .doorrow{grid-template-columns:1fr;gap:16px}
  .door{min-height:0} /* 스택에서는 세로 비율을 강제하지 않는다, 카드 3장이 화면을 다 먹는다 */
  .door-input{font-size:var(--t4)}
}

/* ── contact 최종 CTA, smatch 식 퍼널의 착지 지점. 폼은 걷어내고 메일 CTA 하나만
   (조중현 2026-08-12 "이 섹션은 중앙정렬하고 인풋창은 삭제해"), 히어로와 같은 잉크 알약. ── */
.inq-cta.pill,.inq-submit.pill{background:var(--ink);color:var(--paper);border-radius:var(--hr-md);padding:0 22px}
.inq-cta.pill:hover,.inq-submit.pill:hover{background:#000;color:var(--paper)}
.inq-cta .arrow,.inq-submit .arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.inq-cta.pill:hover .arrow,.inq-submit.pill:hover .arrow{transform:translateX(4px)}
/* contact 의 CTA 3개(히어로·유사사례·최종)는 전부 한 치수 크게 (조중현 2026-08-12
   "cta 버튼들은 크기가 다 커야해"). 컨트롤 1종 --hc(46) 대신 56, 글자는 t4 → t3.
   회색 유사사례 pill 도 커진 만큼 라운드를 잉크 알약과 같은 --hr-md 로 맞춘다. */
.conhero .inq-cta.pill,.simsec .pill,.inq-submit.pill{min-height:56px;padding:0 32px;font-size:var(--t3);border-radius:var(--hr-md)}
@media(max-width:799px){.conhero .inq-cta.pill,.simsec .pill,.inq-submit.pill{min-height:50px;padding:0 26px}}
.inqsec{padding-top:24px;scroll-margin-top:76px;text-align:center} /* 앵커 착지 시 헤더 60px 아래 숨 쉴 자리 */
.inqsec .con-h2{margin-left:auto;margin-right:auto}
.inq-submit.pill{margin-top:32px}
.inqsec .door-note{display:block;margin-top:20px} /* 도어 밖이라 flex-basis 대신 블록으로 */
.inqsec .door-sent{margin-left:auto;margin-right:auto}
/* ── contact 스매치 랜딩 벤치마크 (조중현 2026-08-11 "스매치는 정답지, 완전 벤치마크") ──
   gnb~히어로는 매거진 .magtop 검정 밴드를 그대로 쓴다. 8단 구조와 섹션별 역할은
   contact.html 머리 주석에 있다. 섹션 간격은 .consec 의 margin-top 하나로 통일. */
.conhero{text-align:center;padding:96px 0 110px}
.conhero h1{font-size:var(--disp);font-weight:var(--w-base);letter-spacing:-.02em;line-height:1.05;
  max-width:min(100%,var(--m-disp));margin:0 auto;text-wrap:pretty}
.conhero .consub{margin-top:18px;font-size:var(--t3);line-height:var(--lh3);color:var(--dark-muted)}
/* 검정 밴드 위 CTA 는 흰 채움이 잉크 채움이다 (푸터 .feedmark 문법) */
.magtop .inq-cta.pill{background:#fff;color:#0a0a0a}
.magtop .inq-cta.pill:hover{background:rgba(255,255,255,.85);color:#0a0a0a}
/* 핵심 메시지 3: 세로 키라인(#333, 다크 밑선 토큰)으로만 나눈다 */
.conkeys{display:flex;justify-content:center;margin-top:64px}
.conkeys>span{padding:0 28px;font-size:var(--t4);line-height:var(--lh4);color:#fff}
.conkeys>span+span{border-left:1px solid #333}
.consec{margin-top:var(--rowgap)}
.con-h2{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2;
  max-width:min(100%,var(--m-head));text-wrap:pretty}
/* 갈래 4카드 = 진입 카드 문법(rgba .04 면, 라운드 없음, 텍스트 위 화살표 아래) + 자격 스펙 3줄.
   1024 미만은 2x2, 800 미만은 1단. */
.conpick{margin-top:40px;display:grid;grid-template-columns:repeat(4,1fr);gap:var(--gap-wide)}
@media(max-width:1023px){.conpick{grid-template-columns:repeat(2,1fr)}}
.pickcard{display:flex;flex-direction:column;background:rgba(0,0,0,.04);padding:24px;
  color:inherit;text-decoration:none;transition:background .3s cubic-bezier(.4,0,.2,1)}
.pickcard:hover{background:rgba(0,0,0,.07)}
.pick-t{font-size:var(--t3);font-weight:var(--w-base);line-height:var(--lh3)}
.pick-d{margin-top:8px;font-size:var(--t4);line-height:var(--lh4);color:var(--muted)}
.pickspecs{margin:28px 0 0;padding:0;list-style:none}
.pickspecs li{border-top:1px solid var(--line);padding:8px 0;font-size:var(--t5);line-height:var(--lh5);color:var(--muted)}
.pickcard .arrow{margin-top:24px;font-size:var(--t3)}
.pickcard .ico-arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.pickcard:hover .ico-arrow{transform:translateX(8px)}
/* QnA 아코디언 (조중현 2026-08-12 "Qna 섹션으로 재구성"): 키라인 행, 하나만 열림.
   화살표는 동쪽 1종·회전 금지, 열림은 색으로 (§6) */
.qnalist{margin-top:24px;border-top:1px solid #e5e5e5;min-height:460px;display:flex;flex-direction:column} /* 블록 높이 460 통일, 행이 리스트를 나눠 가진다 */
.qna{border-bottom:1px solid #e5e5e5;flex:1;display:flex;flex-direction:column;justify-content:center}
.qna-q{display:flex;justify-content:space-between;align-items:center;gap:var(--gap);width:100%;text-align:left;
  background:none;border:0;padding:22px 0;cursor:pointer;font:inherit;font-weight:var(--w-base);color:inherit}
.qna-t{font-size:var(--t3);line-height:var(--lh3)}
.qna-q:hover .qna-t{color:var(--muted)}
.qna-arrow{font-size:var(--t3);color:var(--ink);line-height:1.3;transition:color .3s cubic-bezier(.4,0,.2,1)}
.qna-q[aria-expanded="true"] .qna-arrow{color:var(--muted)}
.qna-a{padding:0 0 24px;max-width:min(100%,var(--m-body))}
.qna-a p{font-size:var(--t4);line-height:var(--lh4);color:var(--muted)}
.qna-a .pill{margin-top:14px} /* 답변 속 빠른 문의(오픈톡) 보조 CTA, 기본 mt 22 는 답변 여백에 과하다 */
/* 유사사례 요청 = 리뷰 수급 전 증거 자리 (조중현 2026-08-12 "유사사례 요청하기 섹션").
   좌 텍스트 / 우 이미지 2단 ("오른쪽에 이미지 영역 잡아놔"), 이미지는 수급 전까지 --ph 면.
   블록 높이는 도어 카드와 같은 460 공유 ("각 섹션별 높이값 통일").
   버튼은 보조 CTA 회색 pill(a.pill) 그대로, 화살표 이동만 잉크 알약과 맞춘다 */
.sim-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-wide);min-height:460px}
.sim-body{display:flex;flex-direction:column;align-items:flex-start;justify-content:center}
/* 버튼은 본문 바로 밑 (조중현 2026-08-12 "본문밑으로 보내고"), a.pill 기본 mt 22 가 간격을 준다 */
.sim-media{background:var(--ph)}
#picks{scroll-margin-top:76px} /* QnA 진입점 착지, .inqsec 과 같은 값 */
.sim-d{margin-top:12px;font-size:var(--t4);line-height:var(--lh4);color:var(--muted);max-width:min(100%,var(--m-lead))}
.simsec .pill .ico-arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.simsec .pill:hover .ico-arrow{transform:translateX(4px)}
/* 리드 마그넷: 머리글은 다른 섹션과 같은 con-h2 제목, 키라인은 도어(칼럼)가 진다.
   검정 컨테이너 = case-cta-inner·thematic 과 같은 #222 지면 (조중현 2026-08-12
   "이렇게 시작하셔도 됩니다 섹션은 검정색 컨테이너로 감싸자"). 도어 원자는 흰 rgba 로 반전. */
.leadhub.sub{--lhpad:24px; /* 안쪽 거터는 thematic 과 동일 (24, 1536 이상 32) */
  margin-top:var(--rowgap);background:#222;color:#fff;padding:48px var(--lhpad) 64px}
@media(min-width:1536px){.leadhub.sub{--lhpad:32px}}
@media(max-width:1023px){.leadhub.sub{--lhpad:var(--edge)}}
.leadhub .door{background:rgba(255,255,255,.06)}
.leadhub .door:hover{background:rgba(255,255,255,.1)}
.leadhub .door-no,.leadhub .door-sub,.leadhub .door-note{color:var(--dark-muted)}
.leadhub .door-arrow{color:#fff}
.leadhub .door-trigger[aria-expanded="true"] .door-arrow{color:var(--dark-muted)}
.leadhub .door-trigger:hover .door-title{color:var(--dark-muted)}
.leadhub .door-panel{border-top-color:rgba(255,255,255,.2)}
.leadhub .door-input{color:#fff;border-bottom-color:#555}
.leadhub .door-input::placeholder{color:#777}
.leadhub .door-input:focus{border-bottom-color:#fff}
.leadhub .door-submit{color:#fff;border-bottom-color:#fff}
.leadhub .door-submit:hover{color:var(--dark-muted);border-bottom-color:var(--dark-muted)}
.leadhub .door-sent{color:#fff}
@media(max-width:799px){.leadhub.sub{padding:40px var(--lhpad) 48px}}
.inq-context{margin-top:16px;font-size:var(--t4);line-height:var(--lh4);color:var(--muted)}
@media(max-width:799px){
  .conhero{padding:64px 0 72px}
  .conkeys{margin-top:40px;flex-direction:column;align-items:center;gap:10px}
  .conkeys>span{padding:0}
  .conkeys>span+span{border-left:0}
  .conpick{grid-template-columns:1fr;gap:24px}
  /* 블록 높이 460 통일은 데스크톱 것, 스택에서는 자연 높이 (도어 카드와 같은 방침) */
  .sim-grid{grid-template-columns:1fr;min-height:0;gap:24px}
  .sim-media{aspect-ratio:4/3}
  .qnalist{min-height:0}
}

/* ===== 케이스 상세 = 좌 텍스트 / 우 이미지 2단 (조중현 2026-08-08) =====
   "무조건 왼쪽에 본문 텍스트 배열해 2단으로, 1단에는 텍스트 2단에는 포트폴리오 이미지."
   2026-07-27 의 좌측 목차(.case-toc)와 챕터마다 끊기던 이미지 스택은 여기서 걷어냈다.

   왼쪽은 글만 있는 칼럼이다. 리드 문단, 챕터(h2 + 본문), 크레딧이 여기 산다.
   32건 중 챕터가 있는 건 하나뿐이라, 리드와 크레딧까지 이 칼럼으로 내리지 않으면
   나머지 31건에서 왼쪽이 통째로 빈 칼럼이 된다.
   오른쪽은 이 프로젝트의 이미지 전부가 원본 순서 그대로 한 줄기로 흐른다. */
/* 두 칼럼 폭을 fr 이 아니라 퍼센트로 적는다. 접을 때 폭이 이어져 움직여야 하는데
   fr 은 0 으로 보간되지 않아 화면이 한 번에 튄다 (2026-07-27 목차 접기에서 겪었다,
   조중현 "뚝딱거려"). 5:7 은 그대로다, 거터를 뺀 나머지를 12 로 나눈 값이다. */
.case-body{--textw:calc((100% - var(--gap-wide))*5/12);
  display:grid;grid-template-columns:var(--textw) minmax(0,1fr);
  gap:0 var(--gap-wide);padding:56px 0 0;align-items:start;
  transition:grid-template-columns .34s cubic-bezier(.4,0,.2,1),column-gap .34s cubic-bezier(.4,0,.2,1)}
/* 글 칼럼 접기 (조중현 2026-08-08 "왼쪽단을 접는게 있어야해, 이미지 크게 볼수 있도록").
   글은 지우지 않고 폭만 0 으로 접는다, 여기서도 전문이 DOM 에 그대로 남는다.
   visibility 로 감춰 접힌 칼럼 안의 링크·버튼이 탭 순서에 걸리지 않게 한다. */
.case-body.text-folded{--textw:0px;column-gap:0}
.case-body.text-folded .case-text{visibility:hidden;overflow:hidden}
/* 첫 페인트 전에 접힌 채로 여는 경우. 케이스 페이지 head 의 짧은 스크립트가 html 에
   이 클래스를 건다, site.js 가 돌기 전이라 .case-body 는 아직 없다. 같은 그림을 만들고,
   site.js 가 제 상태를 걸면서 이 클래스를 걷는다. 손잡이 표식과 라벨도 함께 맞춰 둔다,
   안 맞추면 접힌 화면에 "이미지 크게 보기" 가 잠깐 남는다. */
html.case-boot-folded .case-body{--textw:0px;column-gap:0}
html.case-boot-folded .case-text{visibility:hidden;overflow:hidden}
html.case-boot-folded .case-wide-a{display:none}
html.case-boot-folded .case-wide-b{display:inline}
/* 접는 손잡이는 칼럼 밖, 제목 아래에 둔다. 안에 두면 접히는 순간 손잡이도 같이 사라져
   되돌릴 방법이 없다. 표식은 세로선 + 셰브론, 판을 밀어 닫는 모양이다 (§4.6, 자산 없이 CSS 로). */
/* 아이콘 없이 글자만 선으로 감싼다 (조중현 2026-08-09 "그냥 아이콘 빼고 감싸자").
   세로선 + 셰브론, 글줄 + 셰브론 두 안을 거쳐 폐기했다. 감싸는 문법은 하단
   다음 프로젝트(.case-next)와 같다: --line 테두리, --hr-md 모서리, 호버에 테두리만
   --ink 로. 크기는 t3 (조중현 "크기만 키워"). */
.case-wide{display:inline-flex;align-items:center;gap:12px;margin-top:20px;
  background:none;border:1px solid var(--line);border-radius:var(--hr-md);
  padding:12px 20px;font:inherit;font-size:var(--t3);line-height:var(--lh3);
  color:var(--ink);cursor:pointer;
  transition:border-color .2s cubic-bezier(.4,0,.2,1)}
.case-wide:hover{border-color:var(--ink)}
/* 화살표는 공용 자산(ARROW) 그대로, 호버 동작도 .case-next-arrow 와 같다 (조중현 2026-08-09).
   이미지 크게 보기(열림) 상태에서는 좌우 반전이다 (조중현 "이미지 크게보기에서는 화살표가
   뒤집혀야지"), 글 칼럼이 닫혀 갈 방향을 가리킨다. 호버 밀림도 그 방향을 따른다.
   넛지로 접혀 뜨는 첫 화면(case-boot-folded)은 라벨이 본문 보기라 반전을 푼다. */
.case-wide-arrow{flex:0 0 auto;display:inline-flex;color:var(--muted);transition:transform .3s cubic-bezier(.4,0,.2,1)}
.case-wide:hover .case-wide-arrow{transform:translateX(4px);color:var(--ink)}
.case-wide[aria-expanded="true"] .case-wide-arrow{transform:scaleX(-1)}
.case-wide[aria-expanded="true"]:hover .case-wide-arrow{transform:translateX(-4px) scaleX(-1)}
html.case-boot-folded .case-wide[aria-expanded="true"] .case-wide-arrow{transform:none}
html.case-boot-folded .case-wide[aria-expanded="true"]:hover .case-wide-arrow{transform:translateX(4px)}
/* 제 자리(머리)가 화면 밖으로 나가면 좌상단에 떠서 따라온다 (조중현 2026-08-09 "스크롤
   하면서도 고정되어야지 본문과 함께 언제든지 크게볼 수 있게"). 우상단 도구
   (.hdr-tools.is-float)와 같은 문법이다: 반투명 유리 표면, 같은 층(30), 같은 등장 모션.
   우상단은 도구, 우하단은 문의가 쓰므로 자리는 좌상단이다. 다크 지면에서는 어두운 유리. */
.case-wide.is-float{position:fixed;top:12px;left:var(--edge);z-index:30;margin:0;
  background:rgba(255,255,255,.88);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  box-shadow:0 1px 2px rgba(0,0,0,.06),0 4px 16px rgba(0,0,0,.08);
  animation:tools-in .3s cubic-bezier(.4,0,.2,1)}
body.is-dark .case-wide.is-float{background:rgba(20,20,20,.82);
  box-shadow:0 1px 2px rgba(0,0,0,.4),0 4px 16px rgba(0,0,0,.5)}
@media(prefers-reduced-motion:reduce){.case-wide.is-float{animation:none}}
.case-wide-b{display:none}
.case-wide[aria-expanded="false"] .case-wide-a{display:none}
.case-wide[aria-expanded="false"] .case-wide-b{display:inline}
.case-text{min-width:0}
/* 글 칼럼은 화면에 붙는다. 이미지가 열 화면 넘게 흐르는 동안 왼쪽이 같이 올라가 버리면
   페이지의 대부분에서 왼쪽은 빈 여백으로만 남는다.
   단 글이 화면보다 길면 붙일 수 없다, 붙는 순간 아래쪽 글에 닿지 못한다.
   그 판정은 실제 높이를 재야 하므로 site.js 가 .is-sticky 를 켜고 끈다. */
.case-text.is-sticky{position:sticky;top:88px}
/* 리드 문단은 이 칼럼 안에서만 한 단 내려간다 (1024~1279 구간).
   글 칼럼이 390px 까지 좁아지는 티어라, 32px 을 그대로 두면 국문이 한 줄에 열두 자로
   끊겨 리드가 아니라 제목처럼 읽힌다. 1280 이상은 563px 이라 32px 이 맞는다. */
.case-text .lead-para{margin-top:0}
@media(min-width:1024px) and (max-width:1279px){
  .case-text .lead-para{font-size:var(--t3);line-height:var(--lh-lead)}
}

/* 본문 높이 접기(더 보기, --fold-h)는 2026-08-09 에 걷어냈다 (조중현 "더보기는 없애자").
   칼럼을 열면 전문이 바로 다 보인다. 되살리려면 이 날짜 앞 커밋을 본다. */

/* 챕터는 글 칼럼 안의 하위 제목이다. 앵커 착지 시 헤더에 가리지 않게 여유를 둔다.
   경계는 키라인 한 줄, border 가 아니라 별도 층으로 그린다 (§7). */
.case-chapter{position:relative;margin-top:40px;padding-top:40px;scroll-margin-top:88px}
.case-chapter::before{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:var(--line)}
.case-chapter-head{font-size:var(--t3);font-weight:var(--w-base);letter-spacing:-.01em;
  line-height:var(--lh3);margin-bottom:16px;text-wrap:pretty}
.case-p{font-size:var(--t4);line-height:var(--lh-body);text-wrap:pretty}
.case-p + .case-p{margin-top:16px}
/* 리드에서 내려온 둘째 문장. 리드와 한 덩어리로 읽히되 급수는 본문이다 (2026-08-12) */
.lead-para + .case-lead-rest{margin-top:16px}

/* 작업 범위 (2026-08-12). 문단이 아니라 항목이라 목록으로 적는다. 값은 서비스
   이름이라 국문 모드에서도 영문 그대로다 (case-facts 의 Discipline 행과 같은 규칙).
   1px 선으로 행을 나눠 읽는 문단과 성격이 다르다는 것을 형태로 먼저 보인다. */
.scopelist{list-style:none;display:flex;flex-direction:column}
.scopelist li{font-size:var(--t5);line-height:var(--lh-body);padding:10px 0;
  border-top:1px solid var(--line)}
.scopelist li:first-child{border-top:0;padding-top:0}

/* 이미지 칼럼 */
.case-shots{min-width:0}
.case-shots .shot{width:100%;height:auto;display:block;background:var(--ph)}
/* 이미지 사이 간격 0 (조중현 2026-08-09). 12px 띄우던 것을 붙인다, 한 두루마리로 읽힌다. */
.case-shots .shot + .shot{margin-top:0}

/* 고객 정보. 글 칼럼의 마지막 블록이고 접기 대상 밖이라 언제나 보인다.
   이름과 값이 짝인 목록이라 두 단으로 세운다, 좁은 칼럼에서는 이름 단을 고정폭으로
   두어야 값의 줄바꿈 위치가 행마다 달라지지 않는다. */
.case-facts{position:relative;margin-top:48px}
.case-facts::before{content:"";position:absolute;left:0;right:0;top:-24px;height:1px;background:var(--line)}
.case-facts-head{font-size:var(--t5);font-weight:var(--w-base);letter-spacing:.04em;
  text-transform:uppercase;color:var(--muted);margin-bottom:16px}
.case-facts .fact{display:grid;grid-template-columns:76px minmax(0,1fr);gap:var(--gap);
  padding:9px 0;align-items:baseline}
.case-facts .fact + .fact{border-top:1px solid var(--line)}
.case-facts dt{font-size:var(--t5);color:var(--muted);line-height:1.45}
.case-facts dd{font-size:var(--t4);line-height:1.45;text-wrap:pretty}
@media(max-width:799px){
  .case-facts .fact{grid-template-columns:1fr;gap:2px}
}

@media(prefers-reduced-motion:reduce){
  .case-body{transition:none}
}

/* 1단에서는 접을 칼럼이 없다, 손잡이도 같이 내린다 */
@media(max-width:1023px){
  .case-body{grid-template-columns:1fr;gap:40px;padding-top:40px}
  .case-text.is-sticky{position:static}
  .case-wide{display:none}
}

/* 케이스 래퍼. 안쪽 .wrap 이 이미 캡을 쓰지만, 래퍼 자체가 뷰포트 폭으로 남아
   인스펙터에서 '가로 1900' 으로 보였다. 같은 캡을 명시해 둔다. */
.case{width:min(100% - 2*var(--edge),var(--cap));margin-inline:auto}
.case > .wrap{width:100%;padding-inline:0}
/* .credits 도 자기 캡 식을 갖는다, 이미 캡으로 묶인 .case 안에서는 100% 로 풀어
   --edge 가 이중으로 먹지 않게 한다 (§8 그리드, 콘텐츠는 캡 안에 정렬) */
.case > .credits{width:100%}

/* ===== Programs, 상황 기반 진입점 =====
   2026-08-05 (조중현 "이런 레이아웃으로 컴포넌트 형태 디자인으로 개편해"): 키라인 행 +
   아코디언을 걷어내고 3열 컴포넌트 그리드로 바꿨다. 접었다 펴는 동작이 사라지면서
   11개 상황의 설명이 전부 지면에 드러난다, 무엇을 하는 곳인지 한 번에 읽힌다.
   상자·테두리는 만들지 않는다 (§8), 칸을 나누는 건 여백과 정렬이다.
   같은 컴포넌트를 서비스 탭도 그대로 쓴다. */
.eyebrow{font-size:var(--t5);line-height:16.25px;color:var(--muted);margin-bottom:20px}
/* ===== 상황·서비스 목록 (조중현 2026-08-07 "컨테이너는 삭제하고 제목 크기를 줄이고
   그리드를 잘 맞춰서 4단") =====
   검정 카드는 폐기한다. 면 대신 선으로 끊고, 4단을 사이트의 12칼럼 격자에 얹는다.
   칼럼 간격은 바로 아래 팀 섹션(.intro-2col)과 같은 --gap-wide 다
   (조중현 2026-08-07 "간격을 좀 벌려 아래 섹션과 통일해", 2026-08-05 에 같은 지적이 한 번 있었다).
   한 페이지 안에서 이 구역만 12px 로 붙어 있으면 격자가 둘로 읽힌다.
   대가는 칸 왼쪽이 12칼럼 트랙에서 벗어나는 것이다. 좌우 바깥 끝선은 그대로 맞는다.
   행 간격은 0 이다. 각 칸이 제 위에 키라인을 그어 칼럼마다 제 선을 갖는다,
   간격을 주면 선이 칸에서 떨어져 나와 어디에 걸린 줄인지 안 읽힌다.
   align-items:start, 칸은 제 내용만큼만 선다. */
.proglist{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));align-items:start;
  gap:0 var(--gap-wide);padding:16px 0 112px;list-style:none;margin:0}
/* 서비스도 같은 4단이다. 상황 11개는 4·4·3, 서비스 5개는 4·1 로 앉는다.
   서비스를 3단으로 따로 두는 안은 폐기했다, 다섯 개면 3+2 라 어차피 줄이 안 차고
   탭을 바꿀 때마다 칼럼 폭이 달라져 격자가 둘로 읽힌다. */
/* 면을 걷어냈다 (조중현 2026-08-07). 카드였을 때의 배경·라운드·32px 패딩이 함께 나갔고,
   글자가 칼럼 왼쪽 선에 그대로 붙는다. 지면이 흰색이 되었으므로 색도 라이트로 내려온다.
   키라인은 border 가 아니라 별도 층(::after)이다, border 로 그리면 이웃 칸과 겹쳐 굵어진다 (§7). */
.prog{position:relative;display:flex;flex-direction:column;scroll-margin-top:88px;min-width:0;
  color:var(--ink)}
.prog::after{content:"";position:absolute;left:0;right:0;top:0;height:1px;background:var(--line)}
/* 첫 행의 위 선은 두지 않는다 (§7, 위의 머리글이 이미 경계다). 격자에서는 '첫 항목' 이
   아니라 '첫 행' 전체다, 한 칸만 지우면 네 칸 중 세 칸에만 선이 남아 줄이 끊긴다.
   서비스는 세 칸뿐이라 이 규칙 하나에 다 걸린다. */
.proglist > .prog:nth-child(-n+4)::after{display:none}
/* 칸 전체가 누르는 자리다. 제목과 화살표가 한 줄, 약속은 그 아래 줄이다. */
.prog-head{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px var(--gap);width:100%;
  background:none;border:0;margin:0;padding:24px 0 28px;font:inherit;text-align:left;
  color:inherit;cursor:pointer}
.prog-name{grid-column:1;font-size:var(--t3);font-weight:var(--w-base);letter-spacing:-.01em;
  line-height:var(--lh3)}
/* 표식은 십자 → 마이너스, 보더 두 줄로 그린다. 아이콘 자산 금지 (§4.6 정본).
   2026-08-07 에 공용 화살표를 잠깐 썼다가 되돌렸다 (조중현 "+ - 로 열고 닫아야할거 같고").
   화살표는 '다른 데로 간다' 는 뜻이라 제자리에서 펴지는 이 동작과 어긋난다.
   13px 정사각, 가로선은 늘 있고 세로선만 열릴 때 접힌다. */
.prog-go{grid-column:2;grid-row:1;align-self:start;position:relative;
  width:13px;height:13px;margin-top:6px;color:var(--muted);
  transition:color .2s cubic-bezier(.4,0,.2,1)}
.prog-go::before,.prog-go::after{content:"";position:absolute;background:currentColor}
.prog-go::before{left:0;right:0;top:6px;height:1px}
.prog-go::after{top:0;bottom:0;left:6px;width:1px;
  transition:transform .3s cubic-bezier(.4,0,.2,1)}
.prog-head[aria-expanded="true"] .prog-go::after{transform:scaleY(0)}
.prog-head:hover .prog-go{color:var(--ink)}
/* 부제는 제목의 아래 줄이다. 열리면 또렷해진다, 지금 어느 칸이 열려 있는지 색이 말한다 */
.prog-promise{grid-column:1;font-size:var(--t4);line-height:1.35;color:var(--muted);
  transition:color .2s cubic-bezier(.4,0,.2,1)}
.prog-head:hover .prog-promise,
.prog-head[aria-expanded="true"] .prog-promise{color:var(--ink)}
/* 닫혀 있어도 본문 자리는 비워 둔다 (조중현 2026-08-08 "각 콘텐츠는 열려 있는 크기에서
   + 누르면 본문 나오는걸로 하자"). 칸이 처음부터 '열렸을 때의 높이'로 서 있으므로 + 를
   눌러도 행이 자라지 않는다. 열린다는 건 자리가 생기는 게 아니라 글이 나타나는 것이다.
   visibility 로 감춘다, display:none 이 아니면 자리는 지키면서 읽기·포커스에서는 빠진다
   (탭 패널이 이미 같은 처방을 쓴다, 파일 끝 .panelstack 블록).
   좁은 화면(1단)은 예외다. 열한 칸이 세로로 서 있어 전부 비워 두면 섹션이 2800px 이 된다. */
.prog-panel[hidden]{display:none}
@media(min-width:800px){
  .prog-panel[hidden]{display:block;visibility:hidden;pointer-events:none}
}
/* 칼럼 간격이 40px 이라 본문에 따로 우측 인셋을 두지 않는다, 거터가 이미 벌어져 있다 */
.prog-p{font-size:var(--t4);line-height:var(--lh-body);margin:0;padding:0 0 28px;
  color:var(--muted);text-wrap:pretty}
/* 축은 '가는 곳'이라 밑줄+화살표, 태그는 '거르는 것'이라 회색 글자, 생김새로 역할이 갈린다.
   2026-08-05 컴포넌트 개편에서 라벨 정의행(.prog-facts/.prog-fact/.prog-fact-key)은 폐기했다:
   칸이 3분의 1로 좁아지면서 112px 라벨 칼럼이 값을 두세 글자마다 꺾었다. 라벨 없이도
   두 줄의 생김새 차이가 역할을 말한다. */
.prog-fact-go{display:inline-flex;align-items:center;gap:7px;color:var(--ink);
  text-decoration:underline;text-underline-offset:3px;transition:color .2s cubic-bezier(.4,0,.2,1)}
.prog-fact-go:hover{color:var(--muted)}
.prog-fact-go .arrow{transition:transform .3s cubic-bezier(.4,0,.2,1)}
.prog-fact-go:hover .arrow{transform:translateX(3px)}
.prog-fact-tag{color:var(--muted);transition:color .2s cubic-bezier(.4,0,.2,1)}
.prog-fact-tag:hover{color:var(--ink);text-decoration:underline;text-underline-offset:3px}
/* .prog-cta("여기서 시작하기")는 2026-08-05 폐기 (조중현), 상황 패널이 열린 뒤에도
   문의 버튼을 얹지 않는다. 작업 건수(.prog-fact-n)도 같이 내렸다. */

/* 4단은 데스크톱 폭에서만 성립한다, 좁아지면 칸이 스무 자도 못 담는다.
   브레이크포인트는 사이트 두 개(1024·800)를 그대로 쓴다. 서비스는 상황과 같이 접힌다,
   3단을 유지하면 좁은 폭에서 상황보다 칸이 좁아진다. */
@media(max-width:1023px){
  .proglist{grid-template-columns:repeat(2,minmax(0,1fr))}
  /* 첫 행이 두 칸으로 줄었다, 3·4 번째는 둘째 행이므로 선을 되돌린다 */
  .proglist > .prog:nth-child(-n+4)::after{display:block}
  .proglist > .prog:nth-child(-n+2)::after{display:none}
}
@media(max-width:799px){
  .proglist{grid-template-columns:1fr}
  .proglist > .prog:nth-child(-n+2)::after{display:block}
  .proglist > .prog:first-child::after{display:none}
}

/* ===== 홈 프로그램 인덱스 (히어로 바로 아래, Collins 레퍼런스, 조중현 2026-07-27) =====
   이름(좌) / 약속(우), 키라인으로만 끊는다. 카드도 박스도 없다. */
.progindex{padding-bottom:16px}
/* 액자 안에서는 진입 캡슐 밑 꼬리 여백이 필요 없다, 칼럼이 거기서 끝난다 (조중현 2026-07-28) */
.frame-side .progindex{padding-bottom:0}
.progrow{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,8fr);gap:var(--gap);
  align-items:baseline;padding:26px 0;color:inherit;
  transition:opacity .2s cubic-bezier(.4,0,.2,1)}
/* 키라인은 별도 층(::after)으로 곧게 그린다, border 로 그리면 hover 라운드(4px)를 따라
   양끝이 휜다 (§7). 첫 항목의 위 선은 두지 않고(§7), 마지막 행 아래 선도 없다.
   요소가 있는 곳이 시작이자 끝이다 (§8). left 는 hover 채움의 왼쪽 블리드와 같은 값. */
.progrow::after{content:"";position:absolute;left:8px;right:0;top:0;height:1px;
  background:var(--line);transition:opacity .22s cubic-bezier(.4,0,.2,1)}
.progrow:first-child::after{display:none}
.progrow:hover::after,.progrow:hover + .progrow::after{opacity:0}
.progrow-name{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2}
.progrow-promise{font-size:var(--t4);line-height:1.25;color:var(--muted)}
/* 좁아진 액자 칼럼에서는 본문을 한 급 내린다 (조중현 2026-07-28) */
.frame-side .progrow-promise{font-size:var(--t4);line-height:1.3}
.progrow:hover .progrow-promise{color:var(--ink)}
/* 마지막 행 = 진입점. 다른 행과 같은 셀을 쓰고 화살표 하나만 다르다 */
.progrow-all{grid-template-columns:minmax(0,4fr) minmax(0,8fr) auto}
.progrow-all .progrow-name{color:var(--muted)}
.progrow-arrow{font-size:var(--t3);line-height:25px;color:var(--muted);
  transition:transform .3s cubic-bezier(.4,0,.2,1)}
.progrow-all:hover .progrow-arrow{transform:translateX(4px);color:var(--ink)}
.progrow-all:hover .progrow-name{color:var(--ink)}

@media(max-width:799px){
  .progrow,.progrow-all{grid-template-columns:1fr;gap:6px;padding:20px 0}
  .progrow-name{font-size:var(--t3);line-height:25px}
  .progrow-arrow{display:none}
}

/* 다크 섹션 안의 프로그램 표 (홈), 라이트판과 같은 컴포넌트, 색만 반전한다 */
.thematic .eyebrow{color:var(--dark-muted)}
.thematic-head{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2;
  color:var(--ink);max-width:min(100%,var(--m-head));text-wrap:pretty;margin-bottom:36px}
/* 액자 안에서는 제목 아래 여백을 줄인다, 토글이 바로 자기 여백을 갖는다 (조중현 2026-07-28) */
.heroframe .thematic-head{margin-bottom:20px}
.thematic .progrow::after{background:rgba(255,255,255,.14)}
.thematic .progrow-name{color:#fff}
.thematic .progrow-promise{color:var(--dark-muted)}
.thematic .progrow:hover .progrow-promise{color:#fff}
.thematic .progrow-all .progrow-name{color:var(--dark-muted)}
.thematic .progrow-all:hover .progrow-name{color:#fff}
.thematic .progrow-arrow{color:var(--dark-muted)}
.thematic .progrow-all:hover .progrow-arrow{color:#fff}

/* Programs 2단, 케이스 상세와 같은 골격(좌측 고정 목차 + 본문). 접기 동작도 공유한다 */
.prog-body-grid{padding-top:24px}
.prog-body-grid .proglist{padding:0}
.prog-body-grid .progline{grid-template-columns:minmax(0,4fr) minmax(0,6fr) 24px}
.prog-body-grid .progpanel-in{grid-template-columns:minmax(0,4fr) minmax(0,6fr) 24px}
@media(max-width:1023px){
  .prog-body-grid .progline,.prog-body-grid .progpanel-in{grid-template-columns:minmax(0,4fr) minmax(0,6fr) 24px}
}
@media(max-width:799px){
  .prog-body-grid .progline{grid-template-columns:1fr 24px}
  .prog-body-grid .progpanel-in{grid-template-columns:1fr}
}

/* studio → programs 진입점. 그리드 진입 카드와 같은 면·토큰을 쓴다 (새 컴포넌트 아님) */
.progentry{display:flex;align-items:center;justify-content:space-between;gap:24px;
  margin-top:56px;padding:32px;background:rgba(0,0,0,.04);border-radius:var(--hr-md);color:inherit; /* 진입 캡슐 = --hr-md 9px (§4), 홈 .capgo 와 같다 */
  /* 섹션 마지막 요소, 다음 섹션 .page-head 의 pt 48 과 합쳐 --rowgap 이 된다 (§8) */
  margin-bottom:calc(var(--rowgap) - 48px);
  transition:background .3s cubic-bezier(.4,0,.2,1)}
.progentry:hover{background:rgba(0,0,0,.1)}
.progentry-label{display:block;font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;
  line-height:1.2;max-width:min(100%,var(--m-head));text-wrap:pretty}
.progentry-sub{display:block;margin-top:10px;font-size:var(--t4);line-height:1.25;color:var(--muted)}
.progentry-arrow{flex:0 0 auto;font-size:var(--disp);line-height:1;color:var(--ink);
  transition:transform .3s cubic-bezier(.4,0,.2,1)}
.progentry:hover .progentry-arrow{transform:translateX(6px)}
@media(max-width:799px){
  .progentry{flex-direction:column;align-items:flex-start;gap:16px;padding:24px;margin-top:40px}
  .progentry-label{font-size:var(--t3);line-height:25px}
  .progentry-arrow{font-size:var(--t1)}
}


/* ===== 홈 액자 =====
   2026-07-27 히어로 캐러셀 + 프로그램 표 한 프레임 → 2026-08-04 배너 롤링 단독
   ("히어로 영역은 배너롤링만"). 프로그램 표·탭은 폐기, 상황은 아래 스트립이 맡는다. */
.heroframe{padding:0}

/* ===== 상황 × 매거진 융합 (조중현 2026-08-04) =====
   "각 상황별 아티클을 4열로, 마지막 열은 studio" → "두 섹션을 섞어 하나로" →
   "내용과 디자인 모두 개념적으로 물리적으로 합치라". 두 줄로 쌓는 게 아니라
   한 칼럼이 '상황 → 그 상황에서 읽을 글' 한 묶음이다: 위는 상황(이름·약속,
   studio 아코디언으로), 사이에 '이 상황에서 읽기' 라벨, 아래는 딸린 매거진 글.
   마지막 칼럼은 studio 진입, 먹 액자 위에서 홀로 종이색 면이라 '다른 길' 로 읽힌다. */
/* 가로 슬라이드 (조중현 2026-08-04 "5개로 늘리고 슬라이드를 추가해. 가로 스크롤로").
   한 화면에 4장, 나머지는 옆으로 흐른다. 스크롤바는 감추고 화살표(.mnav)가 조종한다.
   디바이더(윗 키라인)는 뺐다 ("디바이더도 삭제해"). */
/* 4.25장이 보이고 다섯째가 '섹션 모서리에서' 잘린다 (조중현 2026-08-04 "4.2~4.3개로,
   잘릴 때 섹션에서 잘려야"), 레일을 액자 패딩만큼 블리드시켜 자르는 선이 먹 면의
   모서리와 같아지게 한다. 쉬는 정렬은 scroll-padding 이 본문 선으로 되돌린다. */
.sitfuse{display:grid;grid-auto-flow:column;
  /* 폭 계산의 100% 는 패딩을 뺀 콘텐츠 폭이다, 보이는 영역은 콘텐츠 + 오른쪽 패딩
     (섹션 모서리까지)이므로 mpad 를 한 번 더해 4.25 로 나눈다 */
  grid-auto-columns:calc((100% + var(--mpad) - 3.25 * var(--gap)) / 4.25);gap:0 var(--gap);
  overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;
  align-items:stretch;margin:40px calc(-1 * var(--mpad)) 0;
  padding:0 var(--mpad);scroll-padding:0 var(--mpad)}
.sitfuse::-webkit-scrollbar{display:none}
/* 풀 이미지 카드 (조중현 2026-08-04 "이미지 전체가 이미지 영역, 상단 1/3 검정 딤드 위에
   상황명·약속, 하단에 워칭·날짜·콘텐츠 제목. 세로 1.5배"), 카드 전체가 이미지이고
   세로는 폭의 1.5배(2:3). 위 오버레이는 상황(→ studio), 아래 오버레이는 글(→ 매거진).
   서로 다른 링크라 위·아래가 면을 나눠 갖는다. */
/* 세로는 1.5배에서 80%로 눌렀다 (조중현 2026-08-04 "카드 높이값을 80%로"), 폭의 1.2배 */
/* 제목 바닥값에서 걷어낸 2.4줄분을 카드가 그대로 받는다, 섹션 총높이는 그대로다
   (조중현 2026-08-10). 비율(5/6)은 콘텐츠 상자에 걸고 남은 몫은 아래 패딩으로 얹는다.
   box-sizing 을 content-box 로 두는 이유가 이것이다. 안의 오버레이는 모두 절대배치라
   패딩 상자(= 얹은 몫까지)를 기준으로 잡히므로 이미지도 딤드도 카드 전체를 덮는다. */
.sitcol{position:relative;min-width:0;scroll-snap-align:start;color:#fff;
  --sit-fill:calc(2.4 * var(--sub));
  box-sizing:content-box;aspect-ratio:5/6;padding-bottom:var(--sit-fill);overflow:hidden}
.sitcol > .mg-thumb{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  display:block;background:rgba(255,255,255,.08)}
/* 상단 1/3 검정 딤드, 글자를 위한 막이다. 클릭은 통과시킨다 */
/* 상단 딤. 2026-08-11 에 실사진이 들어오면서 한 번 더 세웠다(밝은 노랑 위에서 약속 한 줄이
   묻혔다). 높이 33.4 → 44%, 중간에 정거장을 하나 둬서 글자가 앉는 자리까지 막이 남는다. */
.sitcol::before{content:"";position:absolute;left:0;right:0;top:0;height:44%;z-index:1;
  background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(0,0,0,.42) 55%,rgba(0,0,0,0));
  pointer-events:none}
/* 상황명·약속. 2026-08-10 에 a → div 가 됐다 (조중현 "링크만 삭제"), 글자는 그대로고
   studio 로 가던 링크만 걷어냈다. 누르는 면은 아래 mg-row 가 카드 전체로 덮으므로
   여기는 클릭을 통과시킨다. 그래야 카드 한 장에 진입점이 하나로 남는다. */
.sitcol .sitcard{position:absolute;left:0;right:0;top:0;bottom:55%;z-index:3;
  display:flex;flex-direction:column;gap:8px;color:inherit;padding:24px 24px 0;
  pointer-events:none}
/* 상황명 크기 (조중현 2026-08-04): t3 "좀 더 키워" → t2 "너무 커졌다 좀 줄이고".
   t2 의 80%(25.6px)로 정착. 표(§2) 밖 크기지만 대표가 눈으로 고른 배율의 전례를 따른다. */
.sitcard-name{font-size:calc(var(--t2)*.8);line-height:var(--lh2);letter-spacing:-.01em}
.sitcard-promise{font-size:var(--t4);line-height:var(--lh4);color:rgba(255,255,255,.82)}
/* 글: 누르는 면은 카드 전체다 (조중현 2026-08-10 "카드 한장에 진입점은 하나").
   글자는 아래에 앉힌다, 분류·날짜 킥커 한 줄과 그 아래 제목. */
.sitcol .mg-row{position:absolute;inset:0;z-index:2;
  display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-start;gap:6px;
  text-align:left;padding:0 24px 24px;background:none;border-radius:0}
.sitcol .mg-row:hover{background:none}
.sitcol .mg-row .mg-kicker{margin:0;color:rgba(255,255,255,.78)}
.sitcol .mg-title{font-size:var(--t4);line-height:var(--lh4)}
/* 슬라이드 끝 더보기 칸, 다른 카드와 같은 2:3 면. 딤드 없이 살짝 밝힌 먹 면에
   열한 개 상황을 모두 나열하고("11개 상황 묘사") 바닥의 더보기가 studio 로 데려간다 */
.sitcol-more::before{display:none}
.sitmore{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:space-between;
  gap:14px;padding:24px;background:rgba(255,255,255,.08);color:#fff;
  transition:background .22s cubic-bezier(.4,0,.2,1)}
.sitmore:hover{background:rgba(255,255,255,.14)}
.sitmore-note{font-size:var(--t2);line-height:var(--lh2);color:rgba(255,255,255,.9)}
.sitmore-cta{display:flex;align-items:center;gap:8px;font-size:var(--t4)}
.sitmore-cta .ico-arrow{width:16px;height:16px}

@media(max-width:1023px){.sitfuse{grid-auto-columns:calc((100% + var(--mpad) - 1.25 * var(--gap)) / 2.25);margin-top:36px}
  .magnet-say{grid-template-columns:1fr;gap:20px 0}
  .magnet-tools{align-items:stretch}
  .magnet-nav{justify-content:flex-end}}
@media(max-width:799px){.sitfuse{grid-auto-columns:min(84%,320px);margin-top:32px}}
/* 배너 아래 여백은 0 이다. 액자 안에 배너뿐이라(2026-08-04 "히어로 영역은 배너롤링만")
   떼어놓을 상대가 없고, 히어로 아래 여백은 .heroframe 의 padding-bottom 한 곳이 정한다.
   두 값이 겹치면 좁은 화면에서만 아래가 32px 더 벌어진다. */
.heroframe .banner{margin-bottom:0}
.heroframe .eyebrow{margin-bottom:10px}
/* 왼쪽 태그 줄과 같은 블록 높이(--hc + --toprow-gap)를 차지해야
   그 아래 제목이 덱 상단과 같은 선에서 시작한다 (조중현 2026-07-28).
   .heroframe .eyebrow 와 특이도가 같으므로 반드시 뒤에 와야 이긴다. */
.frame-side .eyebrow{height:var(--hc);display:flex;align-items:center;
  margin-bottom:var(--toprow-gap)}


/* ===== 히어로 메타 레이어 (조중현 2026-07-27) =====
   이미지는 가로로 흐르고, 글자는 제자리에서 페이드된다.
   함께 슬라이드시키면 글자가 이미지를 따라 흘러 읽기 어렵다. */
.bmeta-src{display:none}
.bmeta{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1)}
.bmeta.is-fading{opacity:0}

/* 태그 줄 = 이미지 '바깥' 위. 겹치지 않고 물리적으로 자리를 차지한다 (조중현 2026-07-27).
   비어 있어도 높이를 유지해 전환 때 이미지가 위아래로 흔들리지 않게 한다. */
/* ===== 히어로 태그: 이어붙인 캡슐 바 (조중현 2026-07-28) =====
   캡슐 하나하나가 태그고, 캡슐끼리 오목한 허리로 이어진다.
   허리는 .bjoin 이 그린다: 같은 색 브리지를 빈틈에 놓고 위·아래에서 원을 깎아
   오목한 곡선을 만든다. 브리지는 캡슐보다 넓어 양옆 캡슐 아래로 들어가고,
   캡슐이 위(z-index)에 있어 브리지의 직선 변은 보이지 않는다.
   --waist 가 허리 두께, --r 이 곡률이다. */
/* 허리는 덧그리는 게 아니라 겹쳐서 생긴다 (조중현 2026-07-28).
   캡슐 끝은 반지름 h/2 짜리 반원이다. 두 캡슐을 --lap 만큼 겹쳐두면 두 반원이 교차하며
   그 교차선이 곧 오목한 허리다, 브리지도 마스크도 필요 없다.
   허리 두께 = 2·√((h/2)² − ((h−lap)/2)²). h 56 · lap 5 → 24px. */
.btags{display:flex;flex-wrap:nowrap;align-items:stretch;overflow-x:auto;scrollbar-width:none;
  /* 채움은 불투명이어야 한다, rgba(0,0,0,.06) 을 흰 종이 위에서 계산한 값이 #f0f0f0 다.
     라운드를 낮추면서 겹침(--lap)은 0 이 됐다: 오목한 허리는 캡슐 끝이 반원일 때만 생기고,
     각진 사각형을 겹치면 실수처럼 보인다. 대신 간격 + 검정/회색 교차가 리듬을 만든다. */
  --h:var(--hc,46px);--gap:6px;--fill:#f0f0f0}
.btags::-webkit-scrollbar{display:none}
.btag{position:relative;flex:0 0 auto;display:inline-flex;align-items:center;
  height:var(--h);padding:0 18px;border-radius:var(--hr-sm);
  font-size:var(--t4);line-height:1.2;white-space:nowrap;
  transition:background .22s cubic-bezier(.4,0,.2,1),color .22s}
.btag + .btag{margin-left:var(--gap)}
/* 검정·회색이 번갈아 간다 (조중현 2026-07-28). 순서가 규칙이라 태그가 몇 개든 같은 리듬이 나온다. */
.btag:nth-child(odd){background:var(--ink);color:var(--paper)}
.btag:nth-child(even){background:var(--fill);color:var(--ink)}
/* 가리킨 태그는 반대 톤으로 뒤집힌다 */
.btag:nth-child(odd):hover{background:var(--fill);color:var(--ink)}
.btag:nth-child(even):hover{background:var(--ink);color:var(--paper)}

/* 도트 인디케이터를 없애고 그 자리에 태그 캡슐 바를 놓았다 (조중현 2026-07-28).
   가로 아코디언은 접힌 캡슐이 위치를 이미 말하므로 도트는 중복이었다.
   다섯 줄을 한 칸에 겹쳐 쌓고 활성만 보이게 한다, 줄 높이가 고정돼 전환 때 덜그럭거리지 않는다.
   숨긴 줄은 display:none 이 아니라 visibility:hidden 이어야 칸 높이가 유지된다. */
/* 태그 줄은 롤링 하단에 선다 (조중현 2026-08-04 "이 부분을 롤링 하단으로 내려").
   제목 줄·진행 획 블록은 삭제됐고, 덱 아래는 태그 칩 + 양옆 화살표 한 줄이 전부다. */
.bfoot{display:flex;align-items:center;justify-content:center;gap:14px;
  padding-top:var(--toprow-gap);padding-bottom:0}
/* 양옆 이동 버튼. 토큰은 ⊕·진입 캡슐과 같은 원형 아이콘이다 (조중현 2026-07-28).
   검정 태그 캡슐과 경쟁하지 않도록 평소엔 회색으로 물러나 있는다. */
.bnav{flex:0 0 auto;width:var(--hc);height:var(--hc);border:0;padding:0;border-radius:var(--hr-sm);cursor:pointer;
  background:var(--fill);color:var(--ink);display:grid;place-items:center;
  transition:background .22s cubic-bezier(.4,0,.2,1),color .22s}
.bnav:hover:not(:disabled){background:var(--ink);color:var(--paper)}
/* 순환하지 않으므로 양 끝에서는 갈 곳이 없다, 형태로 말한다 (조중현 2026-07-28) */
.bnav:disabled{opacity:.28;cursor:default}
.bnav svg{display:block}
@media(prefers-reduced-motion:reduce){.bnav{transition:none}}
/* 5벌을 한 칸에 겹쳐 쌓으므로 이 칸의 폭은 '가장 넓은 줄' 로 고정된다.
   프로젝트가 바뀌어도 양옆 화살표가 움직이지 않는다. */
/* 단, 화면이 그 폭보다 좁으면 칸이 화면 밖으로 나간다. .bfoot 의 flex 아이템이라
   min-width:auto 가 max-content 를 바닥으로 잡고 있었다 (375 에서 451px, 문서가 38px
   가로로 스크롤됐다). 0 으로 풀어 좁을 때만 줄어들게 하고, 줄 자체는 이미 overflow-x:auto
   라 그 안에서 옆으로 넘긴다. 넉넉한 화면에서는 줄어들 일이 없어 위 규칙 그대로다. */
.btagstack{display:grid;justify-items:center;align-items:center;min-width:0;max-width:100%}
.btagstack > .btags{grid-area:1 / 1;visibility:hidden;opacity:0;min-width:0;max-width:100%;
  transition:opacity .3s cubic-bezier(.4,0,.2,1)}
.btagstack > .btags.is-on{visibility:visible;opacity:1}
@media(prefers-reduced-motion:reduce){.btagstack > .btags{transition:none}}
@media(max-width:799px){.btags{--gap:5px}
  .btag{font-size:var(--t5);padding:0 11px}
  .bfoot{gap:10px}}

/* ===== 국면 / 서비스 = 세그먼트 토글 (조중현 2026-07-28) =====
   전에는 독립된 버튼 두 개였다. 둘은 한 벌이라 하나의 캡슐 트랙 안에서
   흰 캡슐이 선택된 칸으로 미끄러지는 게 맞다. 첨자 숫자가 순서를 말한다.
   썸 위치는 CSS 가 .is-on 을 보고 정한다, 스크립트를 늘리지 않는다. */
/* 칼럼 폭만큼 늘어나 있었다, .frame-side 가 stretch 라 inline-grid 가 잡아당겨졌다.
   width:max-content 로 라벨만큼만 쥐고, 1fr 칸이라 두 칸은 긴 라벨 기준으로 같아진다.
   가운데로 세운다 (조중현 2026-08-05 "이거는 중앙정렬"). inline 레벨이면 margin:auto 가
   듣지 않으므로 grid 로 바꿔 블록으로 세우고, 폭은 그대로 max-content 로 쥔다.
   왼쪽에 붙이던 align-self/justify-self 는 .frame-side 가 사라져 쓰이지 않는다. */
.segtoggle{position:relative;display:grid;grid-auto-flow:column;grid-auto-columns:1fr;
  width:max-content;margin-inline:auto;
  margin-bottom:14px;padding:3px;border-radius:var(--hr-md);background:var(--ink)}
.segthumb{position:absolute;top:3px;left:3px;width:calc(50% - 3px);height:calc(100% - 6px);
  border-radius:var(--hr-sm);background:var(--paper);pointer-events:none; /* 라운드는 토큰 3단계뿐, 파생값 금지 (§4) */
  transition:translate .42s cubic-bezier(.65,.02,.16,1)}
/* 두 번째 칸이 켜지면 썸이 그 칸으로 간다. 썸이 첫 자식이라 칸은 2·3번째다. */
.segtoggle:has(.seg:nth-child(3).is-on) .segthumb{translate:100% 0}
.seg{position:relative;z-index:1;font:inherit;font-size:var(--t4);line-height:1.25;cursor:pointer;
  border:0;background:transparent;color:var(--dark-muted);
  height:calc(var(--hc) - 6px);padding:0 18px;border-radius:var(--hr-sm);white-space:nowrap; /* §4 토큰만 */
  display:inline-flex;align-items:center;justify-content:center;
  transition:color .3s cubic-bezier(.4,0,.2,1)}
.seg:hover{color:#fff}
.seg.is-on{color:var(--ink)}
@media(prefers-reduced-motion:reduce){.segthumb{transition:none}}
[role="tabpanel"][hidden]{display:none}

/* ===== 화살표가 필요한 진입점 = 아이콘 캡슐 (조중현 2026-07-28) =====
   목록 끝의 '전체 보기'는 목록의 한 행이 아니다. 행으로 두면 항목처럼 읽힌다.
   원형 아이콘 + 라벨을 한 캡슐에 담아 '여기서 나간다'를 형태로 말한다. */
.capgo{position:relative;display:inline-flex;align-items:center;gap:10px;
  margin-top:14px;height:var(--hc);padding:0 26px 0 0;border-radius:var(--hr-md);
  background:rgba(0,0,0,.06);color:var(--ink);
  transition:background .24s cubic-bezier(.4,0,.2,1),color .24s}
.capgo:hover{background:var(--ink);color:var(--paper)}
/* 화살표는 의사요소 기하로 짜다가 축과 머리가 틀어졌다, SVG 로 그린다 (조중현 2026-07-28) */
.capgo-icon{flex:0 0 auto;width:calc(var(--hc) - 8px);height:calc(var(--hc) - 8px);margin:4px;border-radius:var(--hr-sm);
  background:var(--ink);color:var(--paper);display:grid;place-items:center;
  transition:background .24s cubic-bezier(.4,0,.2,1),color .24s}
.capgo:hover .capgo-icon{background:var(--paper);color:var(--ink)}
.capgo-icon svg{display:block;transition:transform .32s cubic-bezier(.4,0,.2,1)}
.capgo:hover .capgo-icon svg{transform:translateX(2px)} /* 동쪽 화살표 1종 (§6), hover 이동도 동쪽 */
.capgo-label{font-size:var(--t4);line-height:1.25}
@media(prefers-reduced-motion:reduce){.capgo,.capgo-icon,.capgo-icon svg{transition:none}}

/* 서비스 행의 실적 카운트 */
.progrow-count{font-size:var(--t5);line-height:16.25px;color:var(--muted);justify-self:end}
.thematic .progrow-count{color:var(--dark-muted)}
.progrow:has(.progrow-count){grid-template-columns:minmax(0,4fr) minmax(0,8fr) auto}
@media(max-width:799px){.progrow:has(.progrow-count){grid-template-columns:1fr}.progrow-count{display:none}}

/* ===== 홈 액자 2단 (조중현 2026-07-27) =====
   오른쪽 롤링 2 : 왼쪽 상품 1. 이미지는 상품 목록 높이에 맞춰 늘어난다. */
@media(min-width:1024px){
  /* 롤링(2)이 왼쪽, 상품(1)이 오른쪽 (조중현 2026-07-27) */
  /* Work 그리드와 같은 12칸에 올린다 (조중현 2026-07-28).
     전에는 2fr/1fr + gap 40 이라 우연히 비슷한 값이 나왔을 뿐 다른 그리드였다.
     오른쪽 3칸은 너무 좁았다, Work 작은 카드와 같은 4칸으로 둔다 (조중현 2026-07-28). */
  .frame-grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));
    gap:0 var(--gap);align-items:stretch}
  .frame-grid > .banner{grid-column:span 8;grid-row:1;display:flex;flex-direction:column}
  .frame-grid > .frame-side{grid-column:span 4;grid-row:1;display:flex;flex-direction:column;
    /* 칼럼 폭은 Work 작은 카드와 같게 두고, 내용만 안쪽으로 들인다 (조중현 2026-07-28).
       거터가 12px 뿐이라 컬러 캡슐과 빽빽한 글자가 붙어 보였다, 12 + 28 = 40px 을 띄운다. */
    padding-left:28px}
  /* hover 채움이 글자에 붙어 있었다, 왼쪽으로만 16px 물러난다.
     오른쪽까지 내밀면 목록 우단이 캡(다른 섹션과 같은 선)에서 16px 어긋난다 (조중현 2026-07-28).
     여기는 padding-left 28px 로 실효 거터가 40px 라 16px 블리드가 거터 미만이다 (§8).
     ::after 키라인 층·첫 행 생략·hover 감춤은 base .progrow 규칙 하나가 맡는다 (§0-3).
     선의 시작점만 이 블리드에 맞춘다. */
  .frame-side .progrow{padding-left:16px;padding-right:0;margin-left:-16px;margin-right:0}
  .frame-side .progrow::after{left:16px}
  /* 비율을 유지한다, 아래 Work 썸네일과 같은 3:2 여야 페이지가 한 리듬으로 읽힌다 */
  .frame-grid .bshot{height:100%}
  /* 좁은 상품 칼럼: 이름 위 / 약속 아래로 쌓는다 */
  .frame-side .progrow,.frame-side .progrow-all{grid-template-columns:1fr;gap:4px}
  .frame-side .progrow-name{font-size:var(--t3);line-height:23px}
  .frame-side .progrow-arrow{display:none}
  .frame-side .progrow-count{display:none}
  .heroframe .thematic-head{margin-bottom:24px}
}

/* 2단 정렬 (조중현 2026-07-28).
   가로 아코디언은 접힌 캡슐이 폭을 먹어 카드가 더 넓어질 수 없고, 미디어가 가로라
   높이도 더 못 키운다, 롤링 칼럼 이 상품 칼럼보다 짧게 남는다(1440 에서 174px).
   위로 붙이면 그 174px 이 덱 아래 흰 구멍으로 몰린다. 세로 가운데로 두면 위아래로 나뉘어
   덱이 상품 목록 가운데를 마주보는 배치가 된다. */
@media(min-width:1024px){
  .frame-grid{align-items:center}
  .frame-grid > .frame-side{align-self:start}
  /* 1단이던 때 상품 표와 떼려고 준 여백이다. 2단에서는 옆으로 나란히 서므로 할 일이 없고,
     margin 박스가 중앙 정렬되어 카드가 28px 위로 밀렸다 (조중현 2026-07-28). */
  .heroframe .banner{margin-bottom:0}
}


/* ===== 히어로 액자: 검정 배경 제거 (조중현 2026-07-27) =====
   .thematic(다크 블록)을 벗고 지면 위에 그대로 앉는다. 폭 규칙은 그대로 유지한다. */
/* 액자가 흰 배경이 되면서 안쪽 .wrap 의 거터가 이중으로 들어가 본문 그리드와 어긋났다.
   프레임이 캡을 지고, 안쪽 wrap 은 좌우 여백 없이 프레임 폭을 그대로 쓴다 (조중현 2026-07-27). */
/* 사이트 공용 화살표, 한 종류만 쓴다 (DESIGN-SYSTEM.md §6).
   히어로 롤링의 이전/다음 셰브론만 예외다(방향 컨트롤이지 화살표가 아니다). */
.ico-arrow{display:block}

/* ===== 히어로 라운드 스케일 (조중현 2026-07-28) =====
   히어로 안에 스타디움(999px)·원(50%)·24px·4px 가 섞여 있어 한 시스템으로 안 읽혔다.
   덜 라운드된 쪽으로 통일한다. 큰 컨테이너 → 컨트롤 두 단계만 쓴다.
     --hr-lg  카드처럼 큰 면
     --hr-md  접힌 캡슐·토글 트랙·진입 캡슐
     --hr-sm  태그·아이콘 버튼 (사이트 정본 pill 토큰과 같은 4px) */
/* 컨트롤 높이도 한 값이어야 한다, 태그 46 · 화살표 46 · 진입 캡슐 58 · 아이콘 44 ·
   토글 43 으로 갈려 있었다 (조중현 2026-07-28). */
/* 라운드·컨트롤 토큰(--hr-lg·md·sm 과 --hc)은 :root 로 승격됐다, 히어로 밖에서도 같은 토큰을 쓴다 (§4·§5) */

/* ── 히어로 액자와 바로 아래 매거진 진입 섹션: 면은 직각, 컨트롤은 사이트와 같다 ──
   조중현 2026-07-30 "r값을 모두 빼자" → "아니 버튼이나 태그들은 다른거랑 일치해야지".
   그래서 경계는 '구역'이 아니라 '역할'이다:
     면(카드·다크 컨테이너·썸네일)                  = --hr-lg → 이 구역에서 0
     컨트롤(태그·아이콘 버튼·토글·진입 캡슐·행 hover) = --hr-md·--hr-sm → 손대지 않는다.
       사이트 어디서나 같은 값이어야 한다 (.cat·.pill·.newsfilter 4px / .fab·.loadmore 9px)
   토큰만 재선언한다, 특이도 싸움도, !important 도 없다 (§0-3·§4). */
:is(.heroframe,.magnet){--hr-lg:0px}
/* 접힌 카드도 카드다, 펼친 카드가 직각인데 접힌 쪽만 9px 이면 같은 물체로 안 읽힌다 */
:is(.heroframe,.magnet) .dcard.is-off{border-radius:var(--hr-lg)}

.heroframe{--toprow-gap:18px}
.heroframe{width:min(100% - 2 * var(--edge),var(--cap));margin-inline:auto;background:var(--paper)}
.heroframe > .wrap{width:100%;padding-inline:0}
/* 헤더(60px) 바로 밑에 붙어 있었다, 세로 여백만 되살린다. 좌우는 0 이어야 본문 그리드와 맞는다. */
/* 2026-08-05 에 위아래를 키웠다 (조중현). 위는 48 → 72(1.5배), 아래는 0 이었다.
   아래 여백은 전부 다음 섹션이 내던 것이라 히어로 쪽에서는 0 을 곱해도 0 이다.
   그래서 위와 같은 값을 직접 줬다.
   이어서 GNB 와의 사이만 다시 50% 늘렸다 (조중현). 72 → 108, 아래는 72 그대로다.
   위아래가 같은 값일 이유는 없다, 위는 헤더와 떼는 자리이고 아래는 다음 섹션과 떼는 자리다.
   좁은 화면도 같은 값을 쓴다, 시작점은 전 페이지 한 값이다
   (§8, .page-head 도 좁은 화면에서 값을 유지한다). */
/* 2026-08-09 (조중현 "gnb와 히어로 영역 사이값을 30% 줄여"): 192 → 134. */
.heroframe{padding-top:134px;padding-bottom:72px}

/* 두 패널을 같은 칸에 겹쳐 쌓되 위에서 붙인다.
   stretch 로 두면 짧은 패널이 늘어나 마지막 행 아래로 빈칸이 생긴다 (조중현 2026-07-27). */
/* 숨은 패널이 자리를 지키게 두면(display:block + visibility:hidden) 칸 높이가 늘 큰 쪽,
   즉 상황 11행에 묶인다, 서비스 5행을 볼 때 아래가 500px 뚫린다. 2026-08-05 에 두
   목록이 같은 행 디자인이 되면서 그 구멍이 더 눈에 띄었다 (조중현 "뻥 뚫리잖아").
   숨은 패널은 자리를 비우고, 대신 높이 변화를 JS 가 한 번의 전환으로 흡수한다.
   덜컹이지 않으면서 빈칸도 남지 않는다. */
.panelstack{display:grid;align-items:start;
  transition:height .34s cubic-bezier(.22,.61,.36,1)}
.panelstack.is-sizing{overflow:hidden}
.panelstack > [role="tabpanel"]{grid-area:1 / 1;align-self:start}
@media(prefers-reduced-motion:reduce){.panelstack{transition:none}}
/* ── 섹션 길이 고정 (조중현 2026-08-07 "조금 덜그럭거리니 섹션 길이를 좀 넉넉하게 고정값을") ──
   위 문단의 판단은 3단 카드 시절 것이다. 그때는 11행 4줄 / 5행 2줄이라 자리를 지키게 두면
   500px 이 뚫렸다. 4단이 된 뒤로는 3줄 / 2줄이라 그 차이가 한 줄로 줄었다. 전제가 바뀌었다.
   그래서 숨은 패널이 다시 자리를 지킨다. 칸 높이가 언제나 긴 쪽에 묶이므로 탭을 바꿔도
   섹션 길이가 그대로고, 아래 팀 섹션이 밀리지 않는다. JS 의 높이 전환은 before 와 after 가
   같아져 저절로 쉰다, 손대지 않는다.
   visibility 로 감춘다, display:none 이 아니면 자리는 지키면서도 읽기·포커스에서는 빠진다.
   좁은 화면(1단)은 예외다. 11행 대 5행이 600px 차이라 자리를 지키면 서비스 탭 아래가
   그만큼 비어 버린다, 거기서는 지금까지처럼 JS 가 두 높이를 잇는다. */
@media(min-width:800px){
  .panelstack > .proglist[hidden]{display:grid}
  .panelstack > .svcpanel[hidden]{display:block}
  .panelstack > [role="tabpanel"][hidden]{visibility:hidden;pointer-events:none}
}
/* 고정 길이는 '전부 펼친 높이' 다 (조중현 2026-08-07 "다 열려 있는 상태의 값이 이미
   고정되어있어야해"). 닫힘 높이에 맞추면 아코디언을 열 때마다 아래가 또 밀린다.
   열릴 자리를 처음부터 비워 두면 열고 닫는 동안 문서가 한 번도 움직이지 않는다.

   그 높이를 CSS 숫자로 박아 두지 않는다. 폭이 좁아질수록 본문이 접혀 높아져서
   1024 에서 1188, 1440 에서 927, 1728 에서 851 로 300px 넘게 갈린다. 한 값으로 덮으면
   가장 좁은 쪽에 묶여 넓은 화면에서 그만큼이 빈다 (조중현 "다 열려도 더길어, 한 300px 은
   줄여야해"). site.js 가 폭·언어마다 실제로 재서 인라인 min-height 로 박는다.
   아래 값은 JS 가 없을 때의 바닥이다. 그 경우 아코디언 자체가 열리지 않으므로 닫힘 높이면 된다. */
.panelstack{min-height:560px}
@media(max-width:1023px){.panelstack{min-height:800px}}
@media(max-width:799px){.panelstack{min-height:0}}
/* 잴 때만 모든 본문을 펼친다. 한 프레임 안에서 켰다 끄므로 화면에는 보이지 않는다. */
.panelstack.is-measuring .prog-panel[hidden]{display:block}

/* 액자 안 표는 본문 목록보다 촘촘하다 (조중현 2026-07-28).
   히어로 액자가 911 로 첫 화면(900)을 넘겼다. 높이를 잡는 건 이미지(왼쪽 666)가 아니라
   이 표가 든 오른쪽 칼럼(847)이라, 이미지를 줄여도 액자는 안 내려간다.
   행 여백만 26 → 14 로 줄여 액자를 첫 화면 안에 넣고 좌우 칼럼 높이를 맞춘다.
   programs.html 의 같은 목록은 본문이니 그대로 둔다, 그래서 .frame-side 로 한정한다. */
/* 행 여백은 스크립트가 정한다, 폭이 늘면 히어로 세로도 같은 비율로 늘어야 하고,
   그 늘어난 높이를 이 행들이 나눠 갖는다 (조중현 2026-07-28). */
.frame-side .progrow{padding-block:var(--rowpad,4px)}


/* '더보기' 행(All 11 programs / All services)은 목록보다 작게, 목차지 항목이 아니다 */
.progrow-all .progrow-name{font-size:var(--t4);line-height:1.25}
.progrow-all .progrow-promise{font-size:var(--t5);line-height:16.25px}
.frame-side .progrow-all .progrow-name{font-size:var(--t4);line-height:1.25}
.progrow-all .progrow-arrow{font-size:var(--t4);line-height:1.25}

/* ===== 목록 행 호버 (조중현 2026-07-28) =====
   가리킨 행은 잉크로 채워지고 나머지는 물러난다. 화살표가 오른쪽에서 나온다.
   레퍼런스의 큰 라운드는 쓰지 않는다, radius 는 pill/버튼 토큰(4px)만 (정본 §1.4). */
/* 블리드는 왼쪽 한쪽으로만, 거터(12px) 미만 폭으로 낸다, 양쪽으로 내면 캡 정렬이 깨진다 (§8).
   오른쪽은 캡 선에 맞춘다. */
.progrow{position:relative;padding-left:8px;margin-left:-8px;border-radius:var(--hr-sm);
  transition:background .22s cubic-bezier(.4,0,.2,1),color .22s}
/* 목록에 마우스가 들어오면 나머지 행은 한 톤 물러난다 */
.progindex:hover .progrow-name{color:var(--muted)}
.progindex:hover .progrow-promise{color:rgba(0,0,0,.32)}
.progrow:hover{background:var(--ink)}
.progrow:hover .progrow-name,
.progrow:hover .progrow-promise,
.progrow:hover .progrow-count{color:var(--paper)}
/* 화살표는 가리킬 때만 나온다 */
.progrow-go{position:absolute;right:16px;top:50%;transform:translate(-6px,-50%);
  font-size:var(--t3);line-height:1;color:var(--paper);opacity:0;pointer-events:none;
  transition:opacity .22s cubic-bezier(.4,0,.2,1),transform .22s cubic-bezier(.4,0,.2,1)}
.progrow:hover .progrow-go{opacity:1;transform:translate(0,-50%)}
/* 진입 행에는 이미 화살표가 있다 */
.progrow-all .progrow-go{display:none}
.progrow-all:hover .progrow-arrow{color:var(--paper)}
@media(hover:none){
  .progindex:hover .progrow-name{color:var(--ink)}
  .progindex:hover .progrow-promise{color:var(--muted)}
  .progrow-go{display:none}
}
@media(prefers-reduced-motion:reduce){.progrow,.progrow-go{transition:none}}

/* ===== 매거진 진입 섹션 (조중현 2026-07-28) =====
   리드 마그넷의 미끼는 뉴스레터가 아니라 매거진 콘텐츠 자체다, 사람들은 글을 통해 들어온다.
   그래서 이메일을 걷는 자리가 아니라 글로 들어가게 만드는 자리다.
   화면을 가로지르지 않는다: 캡 폭 안의 컨테이너로 앉는다(펜타그램식 액자).
   라운드·컨트롤 높이는 히어로와 같은 토큰을 쓴다, 새 어휘를 만들지 않는다. */
/* 세로 압축 (조중현 2026-08-04 "세로길이가 너무 길어"), 패딩을 줄이고
   헤드를 2단(제목 좌 · 리드 우)으로 눕혀 머리 높이를 절반으로 만든다 */
.magnet{--mpad:56px;background:var(--ink);color:#fff;border-radius:var(--hr-lg);padding:48px var(--mpad)}
.magnet-say{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:0 56px;align-items:start}
/* 제목 옆 '더보기' 텍스트 링크 (조중현 2026-08-04 "컨테이너 삭제…제목 옆으로").
   면 없는 글자 + 화살표. 슬라이드 화살표만 오른쪽에 남는다. */
.magnet-tools{display:flex;flex-direction:column;gap:12px;align-items:flex-end}
.magnet-nav{display:flex;gap:8px}
.mnav{width:var(--hc);height:var(--hc);border:0;border-radius:var(--hr-sm);cursor:pointer;
  background:rgba(255,255,255,.12);color:#fff;display:grid;place-items:center;
  transition:background .22s cubic-bezier(.4,0,.2,1),color .22s cubic-bezier(.4,0,.2,1)}
.mnav:hover{background:#fff;color:var(--ink)}
.magnet-grid{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,6fr);gap:0 56px;
  align-items:start}
.magnet .eyebrow{color:var(--dark-muted)}
.magnet-head{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2;
  color:#fff;margin:10px 0 20px;text-wrap:pretty;
  /* 섹션 제목(.page-head h2)과 같은 크기다 (조중현 2026-07-28).
     32px 에서는 폭에 따라 국문이 3줄, 영문이 2줄로 갈려 언어 전환 때 아래가 밀렸다.
     3줄분 바닥값을 걸어 어느 폭·어느 언어에서도 같은 높이를 차지하게 했었다.
     제목이 '리브랜딩 전에 읽어보기 / Read before you rebrand' 로 짧아진 뒤로는
     국·영문이 모든 폭에서 나란히 한 줄이라(390 에서만 나란히 두 줄) 갈릴 일이 없다.
     바닥값을 실제 줄 수인 한 줄로 낮춘다. 줄어든 2.4줄분은 --sit-fill 이 카드로 옮긴다
     (조중현 2026-08-10 "전체 섹션 높이는 유지, 제목과 콘텐츠 빈 영역을 채운다"). */
  min-height:calc(1.2 * var(--sub))}
.magnet-lede{font-size:var(--t4);line-height:var(--lh-body);color:var(--dark-muted);
  max-width:min(100%,var(--m-lead));text-wrap:pretty}
  /* 언어 전환 높이는 site.js 의 min-height 예약이 잡는다, 고정 5줄 바닥값은 2단이 되며 뺐다 */
/* 진입점은 히어로의 아이콘 캡슐과 같은 컴포넌트다, 어두운 면 위에서만 톤이 뒤집힌다 */
.magnet-go{margin-top:26px}
.magnet .capgo{background:rgba(255,255,255,.12);color:#fff}
.magnet .capgo:hover{background:#fff;color:var(--ink)}
.magnet .capgo-icon{background:#fff;color:var(--ink)}
.magnet .capgo:hover .capgo-icon{background:var(--ink);color:#fff}
/* 최신 세 편이 이 섹션의 본체다, 글이 주인공이라 크게 놓는다.
   행 사이 디바이더는 뺐다 (조중현 2026-07-28): 세 줄뿐인 목록에 줄을 그으면 표처럼 읽히고,
   가리킨 행이 라운드 패널로 떠오르는 것만으로 구분이 충분하다.
   킥커와 화살표가 한 줄, 제목은 그 아래, 화살표가 제목 길이에 흔들리지 않는다. */
.magnet-list{display:flex;flex-direction:column;gap:4px}
.mg-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:24px;align-items:center;
  padding:10px;border-radius:var(--hr-sm);color:#fff;  /* 행 hover = 컨트롤, 프로그램 표 .progrow 와 같은 값 */
  transition:background .22s cubic-bezier(.4,0,.2,1)}
.mg-row:hover{background:rgba(255,255,255,.07)}
.mg-thumb{display:block;width:112px;aspect-ratio:1/1;object-fit:cover;
  border-radius:max(0px,calc(var(--hr-lg) - 4px));background:rgba(255,255,255,.11)}
.mg-body{display:block;min-width:0}
.mg-top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:10px}
.mg-kicker{display:block;font-size:var(--t6);line-height:1.2;letter-spacing:.06em;
  text-transform:uppercase;color:var(--dark-muted)}
.mg-date{letter-spacing:0;text-transform:none;color:rgba(255,255,255,.34)}
.mg-date::before{content:"·";margin:0 6px;color:rgba(255,255,255,.34)}
.mg-title{display:block;font-size:var(--t3);line-height:1.3;text-wrap:pretty;
  transition:color .22s cubic-bezier(.4,0,.2,1)}
.mg-go{flex:0 0 auto;display:grid;place-items:center;color:var(--dark-muted);
  transition:transform .3s cubic-bezier(.4,0,.2,1),color .22s}
.mg-row:hover .mg-go{color:#fff;transform:translateX(4px)}
/* 가리킨 글은 남고 나머지는 물러난다, 홈 프로그램 표와 같은 독법 */
.magnet-list:hover .mg-row:not(:hover) .mg-title{color:var(--dark-muted)}
@media(prefers-reduced-motion:reduce){.magnet .capgo,.mg-go,.mg-title{transition:none}}
@media(max-width:1023px){
  .magnet{--mpad:40px;padding:48px var(--mpad)}
  .magnet-grid{grid-template-columns:1fr;gap:36px}
  .magnet-head{max-width:min(100%,var(--m-head))}
  .magnet-lede{max-width:min(100%,var(--m-lead));min-height:0}
}
@media(max-width:799px){
  .magnet{--mpad:20px;padding:32px var(--mpad);border-radius:12px}
  /* 좁은 폭에서는 425~472px 구간이 국문 한 줄 · 영문 두 줄로 갈린다(430px = 큰 아이폰).
     여기서는 바닥값을 두 줄로 남겨 언어 전환에 아래가 밀리지 않게 한다.
     걷어내는 몫이 한 줄분뿐이므로 카드가 받는 몫도 그만큼이다. */
  .magnet-head{min-height:calc(2 * 1.2 * var(--sub))}
  .sitcol{--sit-fill:calc(1.2 * var(--sub))}
  .magnet-grid{gap:28px}
  .mg-row{gap:14px;padding:8px}
  .mg-thumb{width:84px}
  .mg-top{margin-bottom:8px}
  .mg-title{font-size:var(--t4)}
}

/* ===== 목록 첫 항목의 위 선은 두지 않는다 (DESIGN-SYSTEM.md §7) =====
   조중현: "맨 첫 영역의 디바이더는 불필요해." 위에 제목이나 컨트롤이 있으면 그것이 이미 경계다. */
/* .proglist > .prog 는 2026-08-07 카드 폐기와 함께 여기서 빠졌다, 이제 border 가 아니라
   ::after 키라인이고 격자라서 '첫 항목' 이 아니라 '첫 행' 을 지운다 (위 .proglist 블록). */
.progindex > .progrow:first-child,
.service:first-of-type,
.credits > *:first-child,
.footrow:first-of-type{border-top:0}
.progindex > .progrow:first-child::after{display:none}

/* ===== 스크롤 테마 전환 (Collins 방식, DESIGN-SYSTEM.md §13) =====
   홈에서 Work 구역으로 넘어가면 지면 전체가 부드럽게 어두워진다.
   토큰만 뒤집고, 하드코딩된 rgba(0,0,0,…) 표면은 아래에서 따로 대응한다.
   안 그러면 검정 위 검정이 된다. 작업 이미지에는 손대지 않는다. */
body{transition:background-color .7s cubic-bezier(.4,0,.2,1),color .7s cubic-bezier(.4,0,.2,1)}
body.is-dark{
  --ink:#f2f2f2;
  --paper:#0a0a0a;
  --line:#262626;
  --muted:#8c8c8c;
  --ph:#1e1e1e;
  background:var(--paper);
  color:var(--ink);
}
/* 표면 토큰이 아닌 곳들, 다크에서 뒤집는다 */
body.is-dark .pill,
body.is-dark .pill-out,
body.is-dark .newsfilter span,
body.is-dark .loadmore,
body.is-dark .capgo,
body.is-dark .shot-type,
body.is-dark .entry-face{background:rgba(255,255,255,.1);color:var(--ink)}
/* 세 갈래는 다크에서도 갈라져 있어야 한다. 위 규칙이 .pill 을 통째로 회색으로 덮으므로
   먹 채움과 선만은 여기서 다시 세운다 (§13, 검정 위 검정 금지). */
body.is-dark .pill-svc{background:#fff;color:#0a0a0a}
body.is-dark .pill-seg{background:none;color:rgba(255,255,255,.82);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.34)}
/* hover 도 하드코딩 rgba(0,0,0,.1), 다크에서 따로 뒤집는다 (§13, 검정 위 검정 금지) */
body.is-dark .entrycard a:hover .entry-face{background:rgba(255,255,255,.16)}
body.is-dark .newsfilter span:hover{background:#fff;color:#0a0a0a}
body.is-dark .newsfilter span.on{background:#fff;color:#0a0a0a}
body.is-dark .capgo-icon{background:#fff;color:#0a0a0a}
body.is-dark .capgo:hover{background:#fff;color:#0a0a0a}
body.is-dark .capgo:hover .capgo-icon{background:#0a0a0a;color:#fff}
body.is-dark .progrow:hover{background:#fff}
body.is-dark .progrow:hover .progrow-name,
body.is-dark .progrow:hover .progrow-promise,
body.is-dark .progrow:hover .progrow-count{color:#0a0a0a}
body.is-dark .segtoggle{background:rgba(255,255,255,.12)}
body.is-dark .segthumb{background:#fff}
body.is-dark .seg.is-on{color:#0a0a0a}
body.is-dark .btag:nth-child(odd){background:#f2f2f2;color:#0a0a0a}
body.is-dark .btag:nth-child(even){background:rgba(255,255,255,.12);color:var(--ink)}
body.is-dark .btag:nth-child(odd):hover{background:rgba(255,255,255,.12);color:var(--ink)}
body.is-dark .btag:nth-child(even):hover{background:#f2f2f2;color:#0a0a0a}
body.is-dark .bnav{background:rgba(255,255,255,.12);color:var(--ink)}
body.is-dark .bnav:hover:not(:disabled){background:#fff;color:#0a0a0a}
body.is-dark .dcard-go{background:#f2f2f2}
body.is-dark .dcard-go::before,body.is-dark .dcard-go::after{background:#0a0a0a}
/* 제목 알약도 ⊕ 와 같은 옷을 입는다, 둘이 한 덩어리로 붙어 있어 색이 갈리면 따로 논다 */
body.is-dark .dcard-name{background:#f2f2f2;color:#0a0a0a}
/* 플로팅 도구 표면은 다크에서도 라이트로 고정, 내용물 색도 라이트 표면 기준으로 고정한다.
   반전된 --ink(#f2f2f2)를 그대로 두면 rgba(240,…) 표면과 동화된다 (feed-page 대응과 같은 방식) */
/* 밝은 알약은 떠 있을 때만이다 (조중현 2026-08-11 "저널페이지에서 검색, 한영 바꾸는
   버튼이 회색으로 보여"). 상단의 정적 상태에도 배경이 걸려 있었는데, 그때는 패딩도
   라운드도 0 이라 어두운 헤더 위에 아이콘 크기의 회색 덩어리로 보였다.
   정적 상태에서는 배경 없이 흰 글자로 둔다, feed-page 문법과 같다. */
body.is-dark .hdr-tools.is-float{background:rgba(240,240,240,.9);color:#1a1a1a}
body.is-dark .hdr-tools.is-float .searchtoggle{color:#1a1a1a}
body.is-dark .hdr-tools.is-float .searchtoggle:hover{color:rgba(0,0,0,.56)}
body.is-dark .hdr-tools.is-float .langtoggle button:hover{color:#1a1a1a}
body.is-dark .hdr-tools.is-float .langtoggle button.on{background:#1a1a1a;color:#fff}
body.is-dark .hdr-tools:not(.is-float) .searchtoggle{color:#fff}
body.is-dark .hdr-tools:not(.is-float) .searchtoggle:hover{color:var(--dark-muted)}
body.is-dark .hdr-tools:not(.is-float) .langtoggle button{color:var(--dark-muted)}
body.is-dark .hdr-tools:not(.is-float) .langtoggle button.on{background:none;color:#fff}
body.is-dark .langsep{color:#333}
body.is-dark .navtoggle span{background:#fff}
body.is-dark .langtoggle button.on:hover{color:#fff}
body.is-dark .searchpanel{background:var(--paper)}
/* 다크 구간에 들어간 다크 컨테이너는 한 단 밝은 면으로 뒤집어 여전히 '얹힌 것' 으로 읽힌다 */
body.is-dark .magnet{background:#1a1a1a}
body.is-dark .mg-row:hover{background:rgba(255,255,255,.1)}
@media(prefers-reduced-motion:reduce){body{transition:none}}

/* ===== §1 언어, 전환 시 화면이 밀리면 안 된다 (2026-07-28) =====
   이중언어 문단을 같은 그리드 칸에 겹쳐 숨긴 쪽도 자리를 차지하게 한다.
   블록 높이가 항상 큰 쪽(대개 EN)으로 잡혀 전환 때 아래 섹션·푸터가 밀리지 않는다.
   min-height 하드코딩과 달리 어느 폭에서도 맞는다. 파일 끝에 두는 이유:
   .foot-title 등 개별 display 선언을 이겨야 해서다.
   대상: studio 본문(.lede·.svc-desc·.dir-bio·인트로 문단·.dir-what), 케이스 챕터(.case-p),
   프로그램 상세 문단(.prog-p), 공통 푸터(.foot-about·.foot-title),
   케이스 하단 CTA(.case-foot-head·.case-foot-sub, 375 에서 KO 2줄↔EN 1줄이 28px 밀림을 만들었다). */
:is(.lede,.svc-desc,.dir-bio,.case-p,.prog-p,.foot-about,.foot-title,.dir-what,.intro-2col .body p,.case-foot-head,.case-foot-sub){display:grid}
:is(.lede,.svc-desc,.dir-bio,.case-p,.prog-p,.foot-about,.foot-title,.dir-what,.intro-2col .body p,.case-foot-head,.case-foot-sub) > :is(.ko,.en){grid-area:1/1}
html[data-lang="en"] :is(.lede,.svc-desc,.dir-bio,.case-p,.prog-p,.foot-about,.foot-title,.dir-what,.intro-2col .body p,.case-foot-head,.case-foot-sub) > .ko:not(:only-child),
html[data-lang="ko"] :is(.lede,.svc-desc,.dir-bio,.case-p,.prog-p,.foot-about,.foot-title,.dir-what,.intro-2col .body p,.case-foot-head,.case-foot-sub) > .en:not(:only-child){
  display:block;visibility:hidden}

/* ===== 구조는 영문, 콘텐츠 이름은 한글 (조중현 2026-07-29) =====
   "사이트 전체적으로 섹션제목이나 중요한 부분은 영어로 쓰자 콘텐츠제목은 제외하고"

   경계:
     영문, 페이지·섹션 제목, eyebrow, 푸터 라벨, 디스플레이 헤드라인,
            프로그램·서비스 이름과 약속(제품 라벨), 진입점 라벨, 토글 칸
     한글, 프로젝트명·글 제목(콘텐츠 이름), 본문·설명·리드, 케이스 챕터 제목

   DOM 에서 한글을 지우지 않는다, 영문 모드와 크롤러에는 그대로 남고,
   국문 모드에서의 '노출'만 뒤집는다. 파일 끝에 두는 이유는 위 겹침 규칙(.case-foot-head 등)과
   개별 display 선언을 이겨야 해서다. */
html[data-lang="ko"] :is(
  .page-head h1, .page-head h2, .homehead h2, .feedhead h1, .intro-2col :is(h1,h2), .s-head,
  .eyebrow, .footlabel, .foot-role,
  .thematic-head, .case-foot-head, .theme .disp, .thematic .disp,
  .progrow-name, .progline-name, .sitcard-name,
  .svc-title, .svc-sub,
  .capgo-label, .entry-label, .entry-count, .seg, .magnet-alt
) > .ko{display:none}
/* 제외 목록, 규칙보다 조중현의 지시가 우선한다:
   .magnet-head        "여기는 한글로" (2026-07-29)
   .progentry-*        진입점 문장을 한글로 다시 써 달라고 했다 → 컴포넌트 전체를 한글로 (2026-07-29)
   .prog*-promise      "본문 한글로 써" (2026-07-30), 프로그램 '이름'은 제품 라벨이라 영문,
                       그 아래 약속 한 줄은 읽는 문장이라 한글이다 */
html[data-lang="ko"] :is(
  .page-head h1, .page-head h2, .homehead h2, .feedhead h1, .intro-2col :is(h1,h2), .s-head,
  .eyebrow, .footlabel, .foot-role,
  .thematic-head, .case-foot-head, .theme .disp, .thematic .disp,
  .progrow-name, .progline-name, .sitcard-name,
  .svc-title, .svc-sub,
  .capgo-label, .entry-label, .entry-count, .seg, .magnet-alt
) > .en{display:inline}
/* 겹침 자리를 쓰던 .case-foot-head 는 이제 영문 한 벌만 보이므로 겹칠 필요가 없다 */
html[data-lang="ko"] .case-foot-head{display:block}
/* 라벨이 아니라 문장인 머리글은 국문 모드에서 한글로 읽는다.
   위 목록은 'Work' 'Team' 처럼 이름을 부르는 라벨을 영문으로 세우는 규칙인데,
   '듀당스가 문제를 푸는 방법' 은 이름이 아니라 읽는 문장이다 (조중현 2026-08-05,
   한글로 지시했다). 제외 목록과 같은 자리 (§ 위 주석: 규칙보다 지시가 우선한다).
   위 목록의 .page-head h1 을 이겨야 하므로 같은 자리를 한 단계 더 좁혀 적는다. */
html[data-lang="ko"] .page-head h1.head-sentence > .ko{display:inline}
html[data-lang="ko"] .page-head h1.head-sentence > .en{display:none}

/* ===== 전시 내역 · 로케이션 (studio 하단, 조중현 2026-08-11) =====
   경력·이력을 세는 자리라 목록이 아니라 표에 가깝다. 연도가 왼쪽 한 칸, 내용이 오른쪽.
   디렉터 이력(.dir-career)과 같은 문법이다: 항목 사이만 선, 바깥 위아래 선은 없다. */
.recordlist{list-style:none}
.recordlist li{display:grid;grid-template-columns:96px minmax(0,1fr);gap:var(--gap);
  padding:14px 0;line-height:1.45}
.recordlist li+li{border-top:1px solid var(--line)}
.recordlist .ry{font-size:var(--t4);color:var(--muted)}
.recordlist .rt{font-size:var(--t4)}
@media(max-width:799px){
  .recordlist li{grid-template-columns:1fr;gap:2px}
}
.locbox{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gap);margin-top:24px}
.locbox .loc-name{grid-column:1/5;font-size:var(--t3);line-height:var(--lh3)}
.locbox .loc-addr{grid-column:5/13;font-size:var(--t4);line-height:1.6;color:var(--muted)}
.locbox .loc-addr .en{display:block}
@media(max-width:799px){
  .locbox{grid-template-columns:1fr}
  .locbox .loc-name,.locbox .loc-addr{grid-column:1}
}

/* ===== 엔딩 크레딧 (거쳐간 사람들, 조중현 2026-08-11) =====
   화면을 덮고 글자가 아래에서 위로 천천히 오른다. 아무 데나 누르면 닫힌다.
   높이를 px 로 박지 않는다, 이름 수가 바뀌면 올라갈 거리도 함께 바뀌어야 한다.
   그래서 시작을 100vh(화면 아래), 끝을 -100%(제 높이만큼 위)로 잡는다. */
/* 딤은 거의 검정이다. .92 로 두니 뒤 지면의 흰 글자가 그대로 읽혀 크레딧과 겹쳤다.
   블러를 함께 걸어 뒤가 형태로만 남게 한다. */
.credits{position:fixed;inset:0;z-index:200;background:rgba(0,0,0,.96);
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  display:flex;justify-content:center;overflow:hidden;cursor:pointer}
.credits[hidden]{display:none}
.credits-roll{position:absolute;top:0;left:0;right:0;padding:0 var(--edge);
  text-align:center;color:#fff;will-change:transform;
  animation:credits-up var(--credits-dur,52s) linear forwards}
@keyframes credits-up{from{transform:translateY(100vh)}to{transform:translateY(-100%)}}
/* 진짜 영화 크레딧처럼 2단이다 (조중현 2026-08-11): 왼쪽에 직무가 오른끝 정렬로,
   오른쪽에 이름(영문 병기)이 왼끝 정렬로 서서 가운데 홈을 사이에 두고 마주 본다.
   글자는 3배다. 타입 6종(§2) 밖의 크기라 숫자를 새로 적지 않고 토큰에 배수를 건다,
   토큰이 바뀌면 여기도 따라온다. 이 겹장 안에서만 쓰는 예외다. */
.credits-head{font-size:calc(var(--t2)*2);line-height:1.1;font-weight:var(--w-base);margin-bottom:96px}
.credits-row{display:grid;grid-template-columns:1fr 1fr;gap:0 40px;
  max-width:1200px;margin:0 auto 44px;align-items:baseline}
.credits-role{text-align:right;font-size:calc(var(--t5)*3);line-height:1.2;
  letter-spacing:.04em;text-transform:uppercase;color:var(--dark-muted);margin:0}
.credits-name{text-align:left;font-size:calc(var(--t3)*3);line-height:1.2;margin:0}
.credits-end{font-size:calc(var(--t2)*2);line-height:1.1;color:#fff;margin-top:120px}
/* 영화 끝의 잔글씨. 이름보다 한참 작아야 '끝났다' 는 신호가 된다 (조중현 2026-08-11). */
.credits-fine{margin-top:64px;padding-bottom:40vh;color:var(--dark-muted);
  font-size:var(--t6);line-height:2.1;letter-spacing:.08em;text-transform:uppercase}
.credits-fine .credits-mark{margin-top:24px;letter-spacing:.04em;text-transform:none;
  color:rgba(255,255,255,.34)}
/* 연락처 한 줄만 잔글씨 사이에서 올라온다. 여기까지 본 사람이 다음에 할 일이다. */
.credits-fine .credits-cta{margin:20px 0;font-size:var(--t4);letter-spacing:.04em;
  text-transform:none;color:#fff}
@media(max-width:1023px){
  .credits-role{font-size:calc(var(--t5)*2)}
  .credits-name{font-size:calc(var(--t3)*2)}
  .credits-row{margin-bottom:32px;gap:0 24px}
}
@media(max-width:799px){
  .credits-head,.credits-end{font-size:calc(var(--t2)*1.4)}
  .credits-role{font-size:calc(var(--t5)*1.4)}
  .credits-name{font-size:calc(var(--t3)*1.4)}
  .credits-fine{line-height:1.9;letter-spacing:.06em}
}
.credits-close{position:fixed;top:24px;right:var(--edge);z-index:1;
  font-size:var(--t5);letter-spacing:.04em;text-transform:uppercase;color:var(--dark-muted)}
/* 모션을 줄이는 설정에서는 올리지 않는다. 그냥 세워 두고 손으로 굴려 읽게 한다. */
@media(prefers-reduced-motion:reduce){
  .credits{overflow:auto}
  .credits-roll{position:relative;animation:none;padding-top:15vh}
}

/* 썸네일이 없는 보도 카드. 빈 회색 칸이 서는 대신 매체 이름이 면을 채운다 (2026-08-11).
   .shot 자리를 그대로 물려받아 격자에서 이미지 카드와 같은 크기로 선다.
   `.post .shot` 이 display:block 을 걸고 있어 같은 무게로는 가운데 정렬이 먹지 않는다,
   그래서 자리를 한 단계 좁혀 적는다 (2026-08-11 이름이 위에 붙어 있던 원인).
   앵커를 끼우지 않는다, 링크 없는 네 건은 a 로 감싸이지 않아 그 자리에서 규칙이 빠진다.
   글씨는 두 배, 두 줄까지 (조중현 2026-08-11). 세 줄부터는 말줄임으로 끊는다. */
.post .shot.shot-type{display:flex;align-items:center;justify-content:center;text-align:center;
  padding:0 24px;background:rgba(0,0,0,.06);color:var(--muted);
  font-size:calc(var(--t3)*2);line-height:1.25;font-weight:var(--w-base);text-wrap:balance}
.shot-type span{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.post a:hover .shot-type{opacity:.85}
@media(max-width:1023px){.post .shot.shot-type{font-size:calc(var(--t3)*1.5);padding:0 16px}}

/* 언론 보도 딱지. 저널 한 그리드에 큐레이션 글과 보도가 섞여 서므로 썸네일 위에서 갈린다
   (조중현 2026-08-11). 면을 두르지 않는다, 면을 쓰면 캡션의 분류 pill 과 같은 물건으로
   읽힌다 (조중현 "하단에 붙는 태그랑 같잖아"). 색도 넣지 않는다, 사이트는 잉크·종이·선
   세 값뿐이다. 대비는 반전 합성으로 얻는다: 흰 글자를 difference 로 얹으면 밝은 사진 위에서는
   어둡게, 어두운 사진 위에서는 희게 뒤집혀 어떤 이미지에서도 읽힌다. */
.post a{position:relative}
.news-tag{position:absolute;top:12px;left:12px;z-index:1;
  font-size:var(--t5);line-height:1.25;font-weight:var(--w-strong);
  letter-spacing:.08em;text-transform:uppercase;color:#fff;mix-blend-mode:difference;
  pointer-events:none}

/* 오시는 길 · 전시 2단 (조중현 2026-08-11 "로케이션과 전시를 2단으로").
   왼쪽 주소·지도, 오른쪽 전시. 반반 + --gap-wide 라 오른쪽 칼럼이 화면 중앙(50% + gap/2)에서
   시작한다 (조중현 2026-08-11 "그리드는 위 섹션 그리드와 맞춰야지") — 디렉터 3단의 설명 칼럼,
   푸터 오른쪽 열과 같은 세로선이다. 5fr 7fr 로 되돌리면 이 선이 다시 어긋난다. */
.studio-2col{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-wide);
  padding-top:calc(var(--rowgap) - 24px)}
.s-head{font-size:var(--sub);font-weight:var(--w-base);letter-spacing:-.01em;line-height:1.2;
  margin-bottom:24px}
.s-col-loc .loc-name{font-size:var(--t3);line-height:var(--lh3)}
.s-col-loc .loc-addr{font-size:var(--t4);line-height:1.6;color:var(--muted);margin-top:8px}
.s-col-loc .loc-addr .en{display:block}
/* 지도는 비율로 세운다. 높이를 px 로 박으면 좁은 화면에서 띠처럼 눌린다. */
.locmap{margin-top:24px;aspect-ratio:4/3;background:var(--ph)}
.locmap iframe{width:100%;height:100%;border:0;display:block;filter:grayscale(1)}
.locmap iframe:hover{filter:none}
/* 전시 접기 (조중현 2026-08-11 "전시 파트 너무 기니까 접고 펼치게").
   접힌 상태에서는 최근 5개만 보인다, 지도 높이와 얼추 나란해지는 개수다.
   is-folded 와 버튼 노출은 site.js 가 건다, JS 없이는 전체 목록이 보인다. */
.recordlist.is-folded li:nth-child(n+6){display:none}
.ex-toggle[aria-expanded="false"] .ex-less{display:none}
.ex-toggle[aria-expanded="true"] .ex-more{display:none}
@media(max-width:799px){
  .studio-2col{grid-template-columns:1fr;gap:56px}
  .locmap{aspect-ratio:3/2}
}
