@charset "utf-8";
/* (주)동심 중부파트너 — 공용 스타일 1장
 * 스킬: orange-clean-paper-saas (warm paper + 오렌지 시그널 + 라운드 서피스)
 * 보조: beautiful-shadows(웜 틴트 그림자) / animation-on-scroll(리빌)
 * 수치 근거: wjthinkbig.com DOM 실측 2026-07-29
 *   - 썸네일 1:1 / radius 12px / 플레이스홀더 #F8F9FA
 *   - 카드 그리드 gap 24px, 카드 내부 gap 20px
 *   - 드롭다운 h58 / radius 8 / 옵션 padding 14px 20px / transition .275~.375s ease-in-out
 * 색 규율: 웅진 브랜드 오렌지 #FD6B00은 흰 글자 대비 2.88 = AA 실패.
 *   → 글자가 얹히는 면에는 절대 쓰지 않는다. 아이콘·보더·그라디언트 전용(--brand-lit).
 *   글자용은 --brand(#C2410C, 흰글자 5.18) / --brand-deep(#9A3412, paper 6.76).
 */

:root {
  --paper: #f7f6f3;
  --white: #fff;
  --tint: #fdf1e3;
  --tint-soft: #fef7ee;
  --ink: #1c1917;
  --sub: #57534e;
  --muted: #736c67;
  --brand: #c2410c;
  --brand-deep: #9a3412;
  --brand-lit: #fd6b00;
  --line: #e7e2da;
  --line-soft: #f0ece5;
  --ph: #f8f9fa;

  --r-sm: 8px;
  --r: 12px;
  --r-lg: 16px;
  --r-xl: 24px;

  --gap: 24px;
  --max: 1160px;

  /* beautiful-shadows: 중립 검정 대신 웜 브라운을 깔아 페이퍼 톤과 붙인다 */
  --sh-1: 0 1px 2px rgba(87, 60, 35, .05), 0 1px 3px rgba(87, 60, 35, .06);
  --sh-2: 0 2px 4px rgba(87, 60, 35, .05), 0 8px 20px rgba(87, 60, 35, .08);
  --sh-3: 0 4px 8px rgba(87, 60, 35, .06), 0 16px 40px rgba(87, 60, 35, .11);
  --sh-brand: 0 6px 20px rgba(194, 65, 12, .22);

  --ease: cubic-bezier(.22, .61, .36, 1);
  --t-fast: .2s var(--ease);
  --t: .275s ease-in-out;
  --t-slow: .375s ease-in-out;
}

* { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: 'Pretendard Variable', Pretendard, -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
  font-size: 16px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  word-break: keep-all;
}

/* 페이지 상단 웜 라디얼 — orange-clean-paper-saas의 "softer radial page background" */
body::before {
  content: '';
  position: fixed;
  inset: 0 0 auto 0;
  height: 620px;
  background:
    radial-gradient(900px 420px at 18% -10%, rgba(253, 107, 0, .07), transparent 70%),
    radial-gradient(700px 380px at 88% -6%, rgba(194, 65, 12, .05), transparent 72%);
  pointer-events: none;
  z-index: 0;
}

img, svg { max-width: 100%; display: block; }
a { color: var(--brand-deep); }

h1, h2, h3, h4 { margin: 0; line-height: 1.28; letter-spacing: -.02em; }
h1 { font-size: clamp(32px, 4.4vw, 46px); font-weight: 800; letter-spacing: -.033em; }
h2 { font-size: clamp(24px, 2.8vw, 32px); font-weight: 700; }
h3 { font-size: 20px; font-weight: 700; }
p { margin: 0; }

.wrap { position: relative; z-index: 1; max-width: var(--max); margin: 0 auto; padding: 0 24px; }
section { position: relative; z-index: 1; }

/* ── 헤더 ───────────────────────────────────────────── */
.gnb {
  position: sticky; top: 0; z-index: 50;
  background: rgba(247, 246, 243, .82);
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  border-bottom: 1px solid var(--line);
}
.gnb .in {
  max-width: var(--max); margin: 0 auto; padding: 0 24px;
  height: 68px; display: flex; align-items: center; gap: 20px;
}
.gnb .brand { font-weight: 800; font-size: 18px; letter-spacing: -.03em; }
.gnb .brand a { color: var(--ink); text-decoration: none; }
/* 로고 이미지가 들어오면 글자 로고 자리를 그대로 차지한다(생성기 `logoMark()` · 2026-09-11).
   높이만 `height="32"` 로 박고 **폭은 파일 비율에 맡긴다** — 가로로 긴 로고가 눌리지 않게. */
.gnb .brand-logo { display: block; width: auto; height: 32px; }
/* 로마자 병기 — 한글 이름 옆에 작게 붙어 같은 줄의 두 번째 목소리가 된다.
   `.brand` 가 800/18px 이라 여기서 굵기·크기를 다시 잡지 않으면 이름과 같은 무게로 읽힌다. */
.brand-en { font-size: 11px; font-weight: 700; letter-spacing: .06em; color: var(--muted); }
.gnb nav { margin-left: auto; display: flex; gap: 4px; }
.gnb nav a {
  color: var(--sub); text-decoration: none; font-size: 15px; font-weight: 500;
  padding: 9px 14px; border-radius: var(--r-sm); transition: var(--t-fast);
}
.gnb nav a:hover { color: var(--ink); background: rgba(28, 25, 23, .05); }
.gnb nav a[aria-current] { color: var(--brand-deep); background: var(--tint); font-weight: 700; }
.gnb .burger {
  display: none; margin-left: auto; padding: 9px 13px; font-size: 14px; font-weight: 600;
  border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--white); color: var(--ink);
  cursor: pointer;
}

/* ── 히어로 ─────────────────────────────────────────── */
.hero { padding: clamp(48px, 7vw, 84px) 0 clamp(28px, 4vw, 44px); }
.hero h1 { max-width: 17ch; }
.hero h1 em { font-style: normal; color: var(--brand-deep); }
.hero .lead {
  margin-top: 18px; max-width: 54ch; font-size: clamp(16px, 1.55vw, 19px);
  color: var(--sub); line-height: 1.72;
}
.hero .acts { margin-top: 30px; display: flex; flex-wrap: wrap; gap: 12px; }

/* 홈 상단 = **꽉 찬 사진 배너** + 카피 오버레이 + 검색 한 줄 + 바로가기 4칸.
 * 오너 확정 2026-07-31: "우리는 카드뉴스처럼 움직이는 배너가 아니니 margin 없이 꽉 채운다."
 * → 라운드·그림자·좌우 여백 전부 제거하고 뷰포트 폭을 그대로 쓴다.
 * 레퍼(웅진 홈)도 배너 → 퀵메뉴 순서다. 흰 카피 대비는 합성 픽셀 실측으로 통과시킨다(07-판정 §4). */
.herotop { padding-bottom: clamp(8px, 1.4vw, 16px); }
.heroart { position: relative; background: var(--ph); }

/* 3화면 스택. 세 장을 같은 그리드 칸에 겹쳐 두고 보이는 한 장만 켠다 —
   높이가 화면마다 튀지 않고(가장 큰 장 기준으로 고정), 넘김은 opacity·transform 만 건드린다
   (width/height 전환은 D13 layout-transition). 자동재생 없음 = 사용자가 누를 때만 바뀐다. */
.heroslides { display: grid; overflow: hidden; }
.heroslide {
  grid-area: 1 / 1; position: relative; min-height: clamp(320px, 40vw, 520px);
  opacity: 0; visibility: hidden; transform: translateX(28px); pointer-events: none;
  transition: opacity var(--t-slow), visibility var(--t-slow), transform var(--t-slow);
}
.heroslide.on { opacity: 1; visibility: visible; transform: none; pointer-events: auto; }
/* 사진은 절대 배치로 자기 화면을 꽉 채운다. `height:100%` 로는 안 된다 —
   그리드 행 높이가 미정이라 백분율이 auto 로 풀리고, <img> 의 width/height 속성 비율이
   그대로 높이가 된다(1440 폭에서 810px). 그러면 세 화면이 다 810px 로 늘어난다. */
.hphoto img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.hphoto::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(28, 25, 23, .76) 0%, rgba(28, 25, 23, .62) 46%, rgba(28, 25, 23, .14) 100%);
}
.heroin { position: absolute; z-index: 2; inset: 0; display: flex; align-items: center; }
.heroin .wrap { width: 100%; }
.heroin h1 { color: var(--white); max-width: 20ch; text-shadow: 0 2px 18px rgba(0, 0, 0, .28); }
/* 히어로 부제 — 숫자만 놓는다. "믿을 수 있는 파트너" 같은 형용사는 원장이 한 번도 안 믿는다. */
.heroin .herosub {
  margin-top: 14px; color: var(--white); font-size: 16px; font-weight: 600;
  letter-spacing: -.02em; text-shadow: 0 2px 14px rgba(0, 0, 0, .4);
}

/* 2·3화면 = 12칸 분할(글 왼쪽 · 사진 오른쪽). 글은 헤드라인 2줄 + 부제 1줄 + 버튼 1개까지만 —
   히어로에 문단을 넣으면 아무도 안 읽고 사진만 작아진다(L1 §5). */
.hsplit { background: var(--ph); }
.hsplit > .wrap {
  height: 100%; display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(20px, 3vw, 48px); align-items: center; padding-top: 28px; padding-bottom: 76px;
}
.hcopy h2 { font-size: clamp(24px, 3.2vw, 38px); font-weight: 800; letter-spacing: -.032em; }
.hcopy .herosub { margin-top: 12px; font-size: 16px; font-weight: 600; color: var(--sub); letter-spacing: -.02em; }
.hcopy .btn { margin-top: 22px; }
.hshot { margin: 0; border-radius: var(--r); overflow: hidden; background: var(--white); border: 1px solid var(--line); }
.hshot img { width: 100%; height: clamp(240px, 30vw, 400px); object-fit: cover; object-position: top center; }
.hlogos { background: var(--white); }
.hlogos img { object-fit: contain; height: clamp(180px, 25vw, 330px); }

/* 넘김 조작부 — 사진 위에도 흰 면 위에도 같은 대비를 내야 해서 자기 배경(흰 막대)을 갖는다.
   검색바가 히어로 하단 36px 을 덮으므로 그보다 위에 앉힌다. */
.heroctl { position: absolute; z-index: 4; left: 0; right: 0; bottom: 54px; pointer-events: none; }
.hbar {
  pointer-events: auto; display: inline-flex; align-items: center; gap: 4px;
  background: rgba(255, 255, 255, .94); border: 1px solid var(--line);
  border-radius: 999px; padding: 4px; box-shadow: var(--sh-1);
}
.hbtn {
  width: 34px; height: 34px; display: grid; place-items: center;
  border: 0; border-radius: 50%; background: transparent; color: var(--ink);
  cursor: pointer; transition: var(--t-fast);
}
.hbtn:hover { background: var(--tint); color: var(--brand-deep); }
/* .hbtn 이 display:grid 라 UA 의 [hidden] 규칙을 이긴다 — 되돌린다(자동넘김 정지 버튼 초기 상태). */
.hbtn[hidden] { display: none; }
.hnum { font-size: 13px; font-weight: 700; color: var(--sub); letter-spacing: 0; padding: 0 6px; font-variant-numeric: tabular-nums; }
.herotop .fsearch { margin-top: -36px; position: relative; z-index: 3; }

/* 바로가기 4칸 — 레퍼 quickMenu 규격(아이콘 40×40 · 라벨 13px/500)을 4등분 그리드로 */
.quicknav { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-top: 20px; }
/* 히어로 **위**에 올린 바로가기줄(2026-08-31 업체 지시). 헤더 밑줄과 바로 붙으면
   메뉴가 두 줄로 읽히고, 사진과 붙으면 배너의 캐프션처럼 보인다 — 위아래를 띄운다. */
.quicktop { padding: 18px 24px 20px; }
.quicktop .quicknav { margin-top: 0; }
.quicknav a {
  display: grid; justify-items: center; gap: 8px; padding: 20px 10px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r);
  text-decoration: none; color: var(--ink); box-shadow: var(--sh-1); transition: var(--t-fast);
}
.quicknav a:hover { border-color: var(--brand-lit); transform: translateY(-3px); box-shadow: var(--sh-2); }
.quicknav a img { width: 40px; height: 40px; }
.quicknav b { font-size: 15px; font-weight: 700; letter-spacing: -.02em; }
.quicknav span { font-size: 13px; font-weight: 500; color: var(--muted); }

/* ── 버튼 ───────────────────────────────────────────── */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  height: 52px; padding: 0 26px; border-radius: var(--r-sm);
  font-size: 16px; font-weight: 700; text-decoration: none; cursor: pointer;
  border: 1px solid transparent; transition: var(--t-fast);
}
.btn-primary { background: var(--brand); color: var(--white); box-shadow: var(--sh-brand); }
.btn-primary:hover { background: var(--brand-deep); transform: translateY(-1px); box-shadow: 0 10px 26px rgba(194, 65, 12, .3); }
.btn-ghost { background: var(--white); color: var(--ink); border-color: var(--line); box-shadow: var(--sh-1); }
.btn-ghost:hover { border-color: var(--brand-lit); color: var(--brand-deep); transform: translateY(-1px); }
.btn:focus-visible, a:focus-visible, button:focus-visible, [tabindex]:focus-visible {
  outline: 3px solid rgba(194, 65, 12, .38); outline-offset: 2px;
}

/* 자료 버튼(상세 히어로) — 상담 요청과 **같은 줄**이다(2026-09-05 업체 요청 ⑤ "상담요청 옆").
   8-31 판은 상담 아래에 "자료" 라벨을 단 별도 줄(`.matlinks`)이었는데, 요청이 "옆"이라고
   못 박았고 실제로도 한 줄이 맞다 — 브로슈어·영상은 상담을 정하기 **전에** 보는 것이다.
   준비 중인 것은 누를 수 없지만 **자리는 보인다** — 자료가 오면 그 자리에 그대로 들어간다. */
.hero .acts .btn { padding: 0 20px; }
/* 자료 버튼은 상담 요청보다 **한 칸 작다** — 셋이 같은 크기로 서면 어느 쪽이 본 행동인지
   흐려진다(2026-07-31 "버튼이 AI티 난다"와 같은 판정). 46px 은 손가락 하한 44 위다. */
.hero .acts .btn-ghost { height: 46px; padding: 0 16px; font-size: 15px; }
.acts .soon { cursor: not-allowed; color: var(--muted); box-shadow: none; background: var(--paper); }
.acts .soon:hover { transform: none; border-color: var(--line); color: var(--muted); }
.soon em { font-style: normal; font-size: 12px; font-weight: 600; color: var(--muted); opacity: .85; }

/* ── 영역 탭 바 (목록 상단 상위 카테고리) ───────────
   12칸을 줄바꿈으로 쌓지 않고 **한 줄로 밀어서** 본다 — 데스크톱은 한 줄에 다 들어가고
   모바일은 가로로 굴린다. 쌓으면 목록 첫 카드가 화면 밖으로 밀려 필터만 보이는 페이지가 된다. */
.domtabs {
  display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none;
  padding-bottom: 4px; margin-bottom: 14px;
}
.domtabs::-webkit-scrollbar { display: none; }
.domtab {
  flex: none; min-height: 44px; padding: 0 16px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line); background: var(--white); color: var(--sub);
  font: inherit; font-size: 14.5px; font-weight: 600; letter-spacing: -.02em;
  white-space: nowrap; transition: var(--t-fast);
}
.domtab:hover { border-color: var(--brand-lit); color: var(--brand-deep); }
.domtab[aria-pressed='true'] {
  background: var(--brand-deep); border-color: var(--brand-deep); color: var(--white); font-weight: 700;
}

/* ── 검색 바 (웅진 select_mate 구조 이식) ────────────── */
.fsearch {
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--r-xl);
  box-shadow: var(--sh-2);
  padding: 16px 18px;
  display: flex; align-items: center; gap: 12px; flex-wrap: nowrap;
}
.fsearch .fields { display: flex; gap: 10px; flex: 1 1 auto; flex-wrap: nowrap; }

.sel { position: relative; flex: 1 1 170px; min-width: 150px; }
.sel > select { position: absolute; opacity: 0; pointer-events: none; width: 0; height: 0; }
.sel .selbtn {
  width: 100%; height: 58px; padding: 0 44px 0 18px;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-sm);
  font: inherit; font-size: 16px; color: var(--muted); text-align: left;
  cursor: pointer; transition: var(--t-slow);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sel .selbtn[data-picked='true'] { color: var(--ink); font-weight: 600; border-color: var(--brand-lit); }
.sel .selbtn:hover { border-color: var(--brand-lit); }
.sel[data-open='true'] .selbtn { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(194, 65, 12, .12); }
.sel .arrow {
  position: absolute; right: 16px; top: 50%; width: 16px; height: 16px;
  margin-top: -8px; pointer-events: none; transition: transform var(--t);
  color: var(--muted);
}
.sel[data-open='true'] .arrow { transform: rotate(180deg); color: var(--brand); }
.sel .opts {
  position: absolute; z-index: 30; top: calc(100% + 6px); left: 0; right: 0;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-sm);
  box-shadow: var(--sh-3); list-style: none; margin: 0; padding: 6px;
  max-height: 0; overflow: hidden; opacity: 0; visibility: hidden;
  transform: translateY(-6px);
  /* max-height 는 전환에서 뺀다 — 레이아웃 프로퍼티 애니메이션은 프레임마다 리플로를 만든다(D13 layout-transition).
     열림 감각(.375s)은 도너 계승값 그대로 transform 이 낸다. */
  transition: opacity var(--t), visibility var(--t), transform var(--t-slow);
}
.sel[data-open='true'] .opts { max-height: 296px; overflow-y: auto; opacity: 1; visibility: visible; transform: none; }
.sel .opts li {
  padding: 14px 20px; border-radius: 6px; font-size: 16px; color: var(--sub);
  cursor: pointer; transition: var(--t);
}
.sel .opts li:hover { background: var(--tint-soft); color: var(--ink); }
.sel .opts li[aria-selected='true'] { background: var(--tint); color: var(--brand-deep); font-weight: 600; }
.fsearch .go {
  width: 58px; height: 58px; flex: 0 0 58px; border-radius: 50%; border: 0;
  background: linear-gradient(135deg, var(--brand-lit), var(--brand));
  color: var(--white); cursor: pointer; display: grid; place-items: center;
  box-shadow: var(--sh-brand); transition: var(--t-fast);
}
.fsearch .go:hover { transform: scale(1.05) rotate(-4deg); }

/* ── 영역 인덱스 (웅진 quickImgwrap 40×40 + 라벨) ───────── */
/* 영역 인덱스 — 40px 라인 아이콘 12칸이었다. 모티프가 겹쳐 구분이 안 되고 템플릿 티만 났다.
   지금은 그 영역 대표 프로그램의 실제 키비주얼을 깔고 이름을 얹는다. */
.domains {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; padding: 22px 0 6px;
}
.domains a {
  text-decoration: none; color: var(--ink); border-radius: var(--r); overflow: hidden;
  background: var(--white); border: 1px solid var(--line); box-shadow: var(--sh-1);
  display: grid; transition: var(--t-fast);
}
.domains a:hover { box-shadow: var(--sh-2); transform: translateY(-3px); border-color: var(--brand-lit); }
/* `height: auto` 를 반드시 같이 준다 — <img height> 속성이 presentational hint 로 살아 있어서
   width 만 CSS로 잡으면 높이는 속성값(675px)이 그대로 쓰이고 aspect-ratio 가 무시된다. */
/* 2026-09-11 오너 "위아래로도 키워줘" — 16:9 contain 이면 폭을 키워도 납작하다. 3:2 상자에 cover 로 채운다
   (원본 1200×675 → 좌우 12.5% 씩 잘림. 키비주얼 캐릭터는 안쪽에 있어 실측상 안 다친다). */
.domains a img { width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover; object-position: center; background: var(--paper); align-self: start; }
.domains a b { font-size: 15px; font-weight: 700; letter-spacing: -.024em; padding: 12px 14px 0; }
.domains a span {
  font-size: 12.5px; font-weight: 500; color: var(--muted); letter-spacing: -.02em;
  padding: 3px 14px 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 홈은 4열 — 6열이면 키비주얼이 180px 폭에 100px 높이라 "아예 안 보인다"(2026-09-11 오너).
   11영역 = 4+4+3. 마지막 줄 한 칸 비는 것보다 그림이 읽히는 게 먼저다. */
.domains.wrapd { grid-template-columns: repeat(4, 1fr); gap: 14px; padding: 8px 0 0; }

/* ── 닫는 상담 유도 ─────────────────────────────────── */
/* 마감 밴드 아래 여백은 푸터가 이미 갖고 있다(`.foot` margin-top). 둘을 더하면 1440에서
   빈 띠가 190px 뜬다 — 내용이 끝난 자리에 화면 4분의 1이 비면 "만들다 만 페이지"로 읽힌다. */
.closing { padding: 0 0 clamp(40px, 5vw, 64px); }
.closing .band {
  display: flex; align-items: center; justify-content: space-between; gap: 26px; flex-wrap: wrap;
  background: var(--tint); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: clamp(26px, 3.4vw, 40px) clamp(22px, 3vw, 40px);
}
.closing h2 { font-size: clamp(21px, 2.3vw, 28px); letter-spacing: -.03em; }
.closing p { margin-top: 8px; color: var(--sub); font-size: 15px; }
.closing .acts { display: flex; gap: 10px; flex-wrap: wrap; }

/* ── 섹션 헤더 ──────────────────────────────────────── */
.sec { padding: clamp(52px, 7vw, 92px) 0; }
.sechead { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; margin-bottom: 28px; flex-wrap: wrap; }
.sechead p { margin-top: 10px; color: var(--sub); max-width: 56ch; }
.seclink { font-size: 15px; font-weight: 700; color: var(--brand-deep); text-decoration: none; white-space: nowrap; }
.seclink:hover { text-decoration: underline; }

/* ── 카드 그리드 ────────────────────────────────────── */
.grid { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--gap); }
.span-3 { grid-column: span 3; }
.span-4 { grid-column: span 4; }
.span-5 { grid-column: span 5; }
.span-6 { grid-column: span 6; }
.span-7 { grid-column: span 7; }
.span-8 { grid-column: span 8; }
.span-12 { grid-column: span 12; }

/* 카드 = 웅진 `.listGridBoxWrap` 실측 이식 (2026-07-31 재실측)
 *   데스크톱 264×467 / 모바일 169×343 · 카드 내부 gap 20(모바일 12) · 썸네일 1:1 radius 12
 *   라벨 12px/500 · 제목 18px/600 · 설명 14px **2줄 clamp** · 해시 13px/500
 *   레퍼 카드에는 버튼이 없다 — 면 전체가 링크다. */
.card {
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--sh-1); overflow: hidden; transition: var(--t-fast);
  display: flex; flex-direction: column;
}
.card:hover { transform: translateY(-4px); box-shadow: var(--sh-3); border-color: rgba(253, 107, 0, .4); }
.cardlink { display: flex; flex-direction: column; height: 100%; text-decoration: none; color: inherit; }
/* 썸네일은 16:9 — 원천 키비주얼(공급 브랜드가 만든 슬라이드)이 가로형이라 1:1로 자르면 카피가 잘린다.
   `contain` 으로 얹고 남는 자리는 종이 톤으로 채운다(잘린 글자보다 여백이 낫다). */
.card .thumb {
  aspect-ratio: 16 / 9; background: var(--paper); overflow: hidden; position: relative;
}
.card .thumb img { width: 100%; height: 100%; object-fit: contain; transition: transform .5s var(--ease); }
.card:hover .thumb img { transform: scale(1.045); }
.card .badge {
  position: absolute; left: 10px; top: 10px; font-style: normal;
  font-size: 11px; font-weight: 700; letter-spacing: -.02em;
  padding: 4px 9px; border-radius: 999px; background: var(--ink); color: var(--white);
}
.card .body { padding: 18px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.card .cat { font-size: 12px; font-weight: 500; color: var(--muted); letter-spacing: -.01em; }
.card :is(h2, h3) { font-size: 18px; font-weight: 600; letter-spacing: -.028em; }
.card .benefit {
  font-size: 14px; font-weight: 500; color: var(--sub); line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.card .hash { margin-top: auto; padding-top: 4px; font-size: 13px; font-weight: 500; color: var(--muted); }
/* 설명이 없는 카드(공개 정보가 브랜드·연령뿐인 3종)는 해시를 바닥으로 밀지 않는다 —
   `margin-top:auto` 가 제목과 해시 사이에 34~56px 구멍을 내고, 그러면 제목이 위 블록에 붙어
   읽힌다(D13 heading-rhythm 실측: 위 18px vs 아래 34px). 텍스트 묶음은 위에 붙이고 남는 자리는
   카드 아래에 둔다. [근거: 2026-08-07 "상세 미공개" 자리표시 문장 삭제] */
.card .body:not(:has(.benefit)) .hash { margin-top: 0; }
.card .hash span { white-space: nowrap; }
.card[hidden] { display: none; }

/* ── 사실 목록(하는 일 · 프로그램 요점) ───────────────
   흰 카드 3장을 나란히 놓는 판이었다. 둥근 모서리·그림자·같은 패딩의 카드 3장은
   어느 생성형 템플릿에나 있는 모양이라 그 자체가 AI티다(오너 지적 2026-08-07).
   카드를 걷고 편집 기호만 남긴다: 위 헤어라인 + 브랜드색 번호 + 제목 + 본문.
   번호는 순서가 실재할 때만 의미가 있으므로 `.facts.plain`은 번호를 지운다. */
.tri { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(22px, 2.4vw, 34px); }
.tri article {
  border-top: 2px solid var(--ink); padding-top: 16px;
}
.tri .stepn {
  display: inline-block; font-size: 12.5px; font-weight: 800; letter-spacing: .1em;
  color: var(--brand-deep); margin-bottom: 6px;
}
.tri :is(h2, h3) { font-size: 18px; margin-bottom: 8px; letter-spacing: -.03em; }
/* 상세의 `이 프로그램이 하는 일`은 1열이라 카드가 span-8 폭을 통째로 먹는다 —
   상한이 없으면 1440에서 한 줄 92자가 된다(D13 line-length). */
.tri p { font-size: 14.8px; color: var(--sub); line-height: 1.66; max-width: 62ch; }

/* ── 자료실 ─────────────────────────────────────────── */
/* 표지 없는 텍스트 줄 목록이었다. 자료는 **표지가 곧 내용 설명**이라 표지를 띄운다. */
.doccards { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--gap); }
.doccard {
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--sh-1); overflow: hidden; transition: var(--t-fast);
}
.doccard:hover { transform: translateY(-4px); box-shadow: var(--sh-3); border-color: rgba(253, 107, 0, .4); }
.doccard a { display: grid; text-decoration: none; color: inherit; height: 100%; align-content: start; }
.doccard img { width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: contain; background: var(--paper); align-self: start; }
/* 표지가 없는 자료 — 원장이 올린 PDF 에는 표지 이미지가 없다. `<img>` 를 비워 두면 깨진 그림이
   뜨므로 제목을 큼직하게 깐 판을 대신 넣는다. 크기(16:9)는 표지와 같아 카드 줄이 어긋나지 않는다. */
.doccover {
  aspect-ratio: 16 / 9; background: var(--tint-soft); border-bottom: 1px solid var(--line-soft);
  display: grid; align-content: center; justify-items: center; gap: 10px; padding: 18px; text-align: center;
}
.doccover span { font-size: 17px; font-weight: 700; letter-spacing: -.028em; color: var(--sub); line-height: 1.35; }
.doccover em {
  font-style: normal; font-size: 11.5px; font-weight: 700; letter-spacing: .08em; color: var(--white);
  background: var(--brand); border-radius: 999px; padding: 3px 10px;
}
.doccard .body { padding: 18px; display: grid; gap: 8px; }
.doccard .cat { font-size: 12px; font-weight: 500; color: var(--muted); }
.doccard h2 { font-size: 17px; font-weight: 600; letter-spacing: -.028em; }
.doccard .benefit { font-size: 14px; font-weight: 500; color: var(--sub); line-height: 1.5; }
.doccard .hash { font-size: 12.5px; font-weight: 500; color: var(--muted); }
.doccard .hash span + span::before { content: " · "; }

/* 자료 보기 화면 — 올린 PDF 를 사이트 안에서 편다.
   높이를 뷰포트로 잡는 이유: 쪽수를 모르는 PDF 라 내용 높이를 미리 알 수 없고, 고정 px 로 두면
   폰에서는 우표만 하고 PC 에서는 여백만 남는다. 82vh 는 헤더와 위 버튼 줄을 뺀 나머지다.
   못 펴는 뷰어가 있어도 화면이 무너지지 않도록 배경과 테두리는 박스가 갖는다. */
.pdfbox {
  border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden;
  background: var(--paper); box-shadow: var(--sh-1);
}
.pdfbox iframe { display: block; width: 100%; height: 82vh; min-height: 420px; border: 0; }
/* PDF 뷰어가 없는 브라우저에서 상자를 대신하는 한 줄(app.js 가 갈아 끼운다). */
.pdfoff {
  padding: 26px 22px; text-align: center; font-size: 14.5px; font-weight: 500; line-height: 1.6;
  color: var(--sub); background: var(--paper); border: 1px dashed var(--line); border-radius: var(--r-md);
}
/* 버튼 줄은 뷰어 **위**에 둔다 — 뷰어가 비는 기기에서 아래에 있으면 빈 사각형만 보고 나간다. */
.docact { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 20px; }
.doctoc { margin-top: 26px; padding: 22px; background: var(--paper); border-radius: var(--r-md); border: 1px solid var(--line-soft); }
.doctoc h2 { font-size: 17px; font-weight: 700; letter-spacing: -.028em; }
.doctoc ul { margin-top: 12px; display: grid; gap: 8px; padding-left: 18px; }
.doctoc li { font-size: 14.5px; font-weight: 500; color: var(--sub); line-height: 1.55; }

/* ── 교육행사 ───────────────────────────────────────── */
.evt .grid { align-items: start; }
.poster {
  border: 1px solid var(--line); border-radius: var(--r); overflow: hidden;
  background: var(--paper); box-shadow: var(--sh-1);
}
.poster img { width: 100%; height: auto; display: block; }
/* 행사 상세(구성 목록)는 포스터 안에 이미 다 적혀 있다 — 페이지에는 제목 + 포스터만 남긴다
   (2026-08-07 오너 지시). 카드 폭이 273px라 포스터 본문 글자는 그 자리에서 못 읽는다 —
   포스터를 원본(900×1280)으로 여는 링크가 곧 상세 화면이다. 캡션은 이름 확정 + 그 진입점. */
.poster figcaption {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 14px 16px 15px; border-top: 1px solid var(--line);
  font-size: 16px; font-weight: 700; letter-spacing: -.028em; color: var(--ink);
}
.poster figcaption span { font-size: 13.5px; font-weight: 600; color: var(--brand-deep); white-space: nowrap; }
.poster a:hover img { opacity: .92; }
.poster a { display: block; cursor: zoom-in; }

/* 포스터 확대판(.lb) — `<dialog>`를 쓰는 이유: 상위 레이어라 `.wrap`의 z-index·overflow를 타지
   않고, Esc 닫기·배경 비활성·포커스 가둠을 브라우저가 그냥 준다. 배경은 잉크 톤으로만 덮는다
   (글로우·후광 금지, 디자인-공통코어 §3). 이미지 바깥 여백을 눌러도 닫히므로 ✕는 보조 출구다. */
.lb {
  /* width/height 는 UA 기본값(fit-content)을 지킨다 — `auto` 로 덮으면 `inset:0` 탓에 가로가
     92vw 로 늘어나고, 과제약된 `margin:auto` 가 0으로 풀려 이미지가 왼쪽에 붙는다. */
  width: fit-content; height: fit-content; max-width: 92vw; max-height: 92vh;
  padding: 0; border: 0; overflow: visible;
  background: transparent; box-shadow: var(--sh-3);
}
.lb::backdrop { background: rgba(28, 25, 23, .78); }
.lb img { width: auto; height: auto; max-width: 92vw; max-height: 92vh; border-radius: var(--r); }
.lbx {
  position: absolute; top: 10px; right: 10px;
  width: 44px; height: 44px; display: grid; place-items: center;
  padding: 0; border: 1px solid rgba(255, 255, 255, .55); border-radius: 999px;
  background: rgba(28, 25, 23, .86); color: var(--white); cursor: pointer;
  transition: background var(--t-fast);
}
.lbx:hover, .lbx:focus-visible { background: var(--ink); }
.lbx svg { width: 20px; height: 20px; }
@media (max-width: 640px) {
  .lb, .lb img { max-width: 96vw; max-height: 88vh; }
}
@keyframes lbpop { from { opacity: 0; transform: scale(.965); } }
.lb[open] { animation: lbpop .22s var(--ease); }
@media (prefers-reduced-motion: reduce) {
  .lb[open] { animation: none; }
}

/* 대표 프로그램·공급 브랜드 판은 히어로 2·3화면으로 올라갔다(2026-08-07). 여기 있던
   `.feature`·`.partners` 규칙은 렌더되는 마크업이 없어져 같이 지운다 — 죽은 CSS는 남기지 않는다. */

/* ── 상세 키비주얼 ─────────────────────────────────── */
.keyshot {
  border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
  background: var(--paper); box-shadow: var(--sh-1);
}
.keyshot img { width: 100%; height: auto; display: block; }

/* ── 브로슈어 페이저(.bviewer) ───────────────────────
   자료가 있는 프로그램은 오른쪽 단이 키비주얼 한 장이 아니라 **넘겨 보는 브로슈어**다
   (2026-09-05 의뢰 ④ · 참고 화면은 동심 본사 e북).

   무대 높이를 `70vh` 로 묶는 이유는 판형이다 — 받은 16종이 가로형 5(780×540 · 960×540 · 1446×836)
   세로·정방 11(595×765 ~ 794×794)로 섞여 있다. 비율을 고정하면 한쪽이 반드시 잘리고,
   `height:auto` 로 풀면 세로 브로슈어가 화면 두 개 높이로 서서 다음 쪽 버튼이 안 보인다.
   높이를 묶고 `contain` 으로 넣으면 가로든 세로든 같은 자리에 앉고, 넘길 때 페이지가 안 튄다.

   쪽은 전부 마크업에 있고 한 장만 보인다 — JS 가 죽어도 표지는 뜬다. */
.bviewer {
  border: 1px solid var(--line); border-radius: var(--r-lg); overflow: hidden;
  background: var(--paper); box-shadow: var(--sh-1);
}
.bvstage {
  display: grid; place-items: center; padding: 12px;
  min-height: 220px; max-height: 70vh;
  /* `pan-y` 가 없으면 가로로 미는 손짓을 브라우저가 **스크롤로 먼저 가져간다** —
     그 순간 `pointerup` 대신 `pointercancel` 이 오고 넘김이 통째로 죽는다(390 실측).
     세로 스크롤은 그대로 남긴다: 브로슈어를 보다 페이지를 내리는 동작을 뺏으면 안 된다. */
  touch-action: pan-y;
}
/* 겹쳐 두지 않고 한 칸에 한 장만 넣는다 — 절대배치로 겹치면 컨테이너가 높이를 잃어
   쪽마다 판형이 다를 때 상자가 최대 높이로 굳는다(가로 브로슈어 밑에 흰 여백 200px). */
/* `height:auto` 가 없으면 `<img height="900">` 속성이 CSS 높이로 작용해 상자가 70vh 세로로 서고,
   그 안에 가로 쪽이 가운데 떠서 위아래가 200px 씩 빈다(2026-09-05 preview 실측). */
.bvpage { display: none; width: auto; height: auto; max-width: 100%; max-height: calc(70vh - 24px); object-fit: contain; }
.bvpage.on { display: block; }
.bvbar {
  display: flex; align-items: center; gap: 4px;
  padding: 6px 8px; border-top: 1px solid var(--line); background: var(--white);
}
/* 44px — 폰에서 넘기는 손가락 규격(Apple HIG). 화살표는 작아도 **누르는 면**은 크다.
   46 인 이유는 여백이 아니라 **재는 일** 때문이다: 이 바는 `[data-reveal]`(0.62초 translateY)
   안에 있고, 모바일 프로브는 로드 0.5초 뒤 — 즉 그 전환이 끝나기 전에 잰다. 변환 중인
   요소의 사각형은 44 가 아니라 44−1/16384 로 돌아와(2026-09-05 실측 43.99993896484375)
   "44px 미만 탭타겟" 이 한 번 걸러 한 번씩 뜬다. 규격에 딱 붙여 놓으면 반올림 한 톨에
   게이트가 흔들린다 — 손가락에도 2px 이 손해일 리 없으니 경계에서 내려온다. */
.bvbtn {
  width: 46px; height: 46px; flex: none; display: grid; place-items: center;
  border: 0; border-radius: 50%; background: transparent; color: var(--ink); cursor: pointer;
  transition: var(--t-fast);
}
.bvbtn:hover:not(:disabled) { background: var(--tint); color: var(--brand-deep); }
.bvbtn:disabled { color: var(--line); cursor: default; }
.bvnum {
  font-size: 13px; font-weight: 700; color: var(--sub); padding: 0 4px;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
/* "크게 보기"는 오른쪽 끝 — 넘기는 손과 확대하는 손을 갈라 놓는다(오탭 방지). */
/* `<button>` 이 아니라 `<a href="1쪽.webp">` 다 — `<dialog>` 를 모르는 브라우저(구형 웹뷰)에서
   눌러도 아무 일이 안 나는 버튼 대신 그림이 새 창에 뜬다. JS 가 살아 있으면 가로챈다.
   그래서 `inline-flex` 로 눌리는 면을 44px 로 세운다(a 는 기본이 inline 이라 높이가 안 선다). */
.bvzoom {
  margin-left: auto; display: inline-flex; align-items: center; min-height: 46px; padding: 0 14px;
  border: 1px solid var(--line);
  border-radius: var(--r-sm); background: var(--white); color: var(--ink);
  font-size: 14px; font-weight: 700; letter-spacing: -.02em; cursor: pointer;
  text-decoration: none; transition: var(--t-fast);
}
.bvzoom:hover { border-color: var(--brand-lit); color: var(--brand-deep); }

/* 전체화면 브로슈어 — `.lb`(포스터 확대판)를 그대로 물려받고 아래 컨트롤 줄만 더한다.
   `.lb` 는 `width:fit-content` 라 이미지 크기를 따라간다. 여기서는 **쪽마다 폭이 달라서**
   상자가 넘길 때마다 흔들린다 — 폭을 고정해 상자를 세워 두고 안에서 그림만 바뀌게 한다. */
.bv-lb {
  width: min(92vw, 1100px); max-height: 94vh;
  background: var(--white); border-radius: var(--r); overflow: hidden;
}
/* `display:flex` 는 **열렸을 때만** 준다. 클래스 본체에 얹으면 UA 기본 규칙
   `dialog:not([open]) { display: none }` 을 덮어써서, 닫힌 상자가 본문 맨 끝에
   흰 박스(‹ › · 빈 카운터 · PDF 내려받기 · ✕)로 그대로 남는다 — 브로슈어가 달린
   7종 상세 전부에서 그랬다(2026-09-05 실측: `getComputedStyle().display === 'flex'`,
   `open === false`). 선택자 특이도가 아니라 **UA 규칙과의 순서 싸움**이라 `[open]` 한정이 답이다. */
.bv-lb[open] { display: flex; flex-direction: column; }
.bvlbstage {
  flex: 1; min-height: 0; overflow: auto; display: grid; place-items: center;
  padding: 12px; background: var(--paper);
}
.bvlbstage img { display: none; width: auto; max-width: 100%; height: auto; border-radius: var(--r-sm); }
.bvlbstage img.on { display: block; }
.bvlbbar {
  display: flex; align-items: center; gap: 4px; flex: none;
  padding: 6px 10px; border-top: 1px solid var(--line); background: var(--white);
  border-radius: 0 0 var(--r) var(--r);
}
.bvpdf {
  margin-left: auto; display: inline-flex; align-items: center; min-height: 46px; padding: 0 12px;
  font-size: 14px; font-weight: 700; color: var(--brand-deep); text-decoration: none;
}
.bvpdf:hover { text-decoration: underline; }

/* 영상 대화상자 — 16:9 한 칸. iframe 은 열 때만 꽂힌다(app.js). */
.vdlg {
  width: min(92vw, 960px); padding: 0; border: 0; overflow: visible;
  background: var(--ink); border-radius: var(--r); box-shadow: var(--sh-3);
}
.vdlg::backdrop { background: rgba(28, 25, 23, .78); }
.vbox { aspect-ratio: 16 / 9; width: 100%; background: #000; border-radius: var(--r) var(--r) 0 0; overflow: hidden; }
.vbox iframe { display: block; width: 100%; height: 100%; border: 0; }
.vfoot { padding: 10px 14px; text-align: right; }
.vfoot a {
  display: inline-flex; align-items: center; min-height: 44px; padding: 0 6px;
  font-size: 14px; font-weight: 700; color: var(--white); text-decoration: none;
}
.vfoot a:hover { text-decoration: underline; }

h1 .aka { font-size: 16px; font-weight: 500; color: var(--muted); letter-spacing: -.01em; }

/* ── 공지사항 ───────────────────────────────────────── */
/* 홈 요약 — 흰 카드 3장 나란히였다. 카드 안에 든 게 라벨·제목·두 줄·화살표뿐이라
   내용보다 껍데기가 컸고, 셋이 같은 크기로 서니 그 자체가 템플릿 티였다(오너 지적 2026-08-07).
   지금은 줄 목록이다 — 구분 · 제목 · 한 줄 설명이 한 행에 서고 행마다 헤어라인만 있다. */
.notices { display: grid; gap: 0; border-top: 1px solid var(--line); }
.notice {
  display: grid; grid-template-columns: 74px minmax(0, 1fr) auto; align-items: baseline;
  gap: 4px 18px; padding: 18px 4px; border-bottom: 1px solid var(--line);
  transition: var(--t-fast);
}
.notice:hover { background: var(--tint); }
.notice .tag { font-style: normal; font-size: 13px; font-weight: 600; color: var(--muted); letter-spacing: -.01em; }
.notice :is(h2, h3) { font-size: 16.5px; font-weight: 700; line-height: 1.42; letter-spacing: -.03em; }
.notice p { grid-column: 2; font-size: 14.2px; color: var(--sub); line-height: 1.6; }
.notice a {
  grid-row: 1 / span 2; grid-column: 3; align-self: center;
  font-size: 14px; font-weight: 700; color: var(--brand-deep); text-decoration: none; white-space: nowrap;
}
.notice a::after { content: ' →'; }
.notice a:hover { text-decoration: underline; }

/* ── 공지 게시판 표 (목록 페이지) ─────────────────────────
   같은 3건이라도 홈은 카드(요약), 목록은 표다. 카드 3열은 "이게 전부"로 읽히고 4번째 공지가
   들어오면 줄이 깨진다. 표는 총 건수·구분·제목이 한 축에 정렬돼 세로 스캔 한 번에 끝난다.
   열 폭·정렬은 웅진 `/notice` 목록 실측을 따른다(번호 좁게 중앙 · 제목 가변 좌 · 메타 고정 중앙).
   [근거: 2026-08-07 오너 지시 캡처] */
.boardbar { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 10px; }
.boardbar .cnt { font-size: 14.5px; font-weight: 700; color: var(--sub); letter-spacing: -.02em; }
.boardbar .cnt em { font-style: normal; font-weight: 800; color: var(--brand-deep); }
.board {
  width: 100%; border-collapse: collapse; table-layout: fixed;
  background: var(--white); border: 1px solid var(--line);
  border-radius: var(--r); overflow: hidden; box-shadow: var(--sh-1);
}
.board thead th {
  padding: 13px 16px; font-size: 13.5px; font-weight: 700; color: var(--muted);
  background: var(--tint-soft); border-bottom: 1px solid var(--line); text-align: center;
}
.board td { padding: 14px 16px; text-align: center; font-size: 14px; color: var(--muted); border-bottom: 1px solid var(--line-soft); }
.board tbody tr { transition: background var(--t-fast); }
.board tbody tr:hover { background: var(--tint-soft); }
.board tbody tr:last-child td { border-bottom: 0; }
.board .c-no { width: 92px; }
.board .c-dt { width: 116px; }
.board :is(th, td).c-ti { text-align: left; }
.board .c-ti a { display: block; text-decoration: none; color: inherit; }
.board .c-ti b { display: block; font-size: 16px; font-weight: 700; color: var(--ink); letter-spacing: -.02em; line-height: 1.45; }
/* 요약 한 줄 — 넘치면 자른다. 목록의 값은 "한 화면에 몇 건이 들어오나"라 줄 높이가 흔들리면 안 된다. */
.board .c-ti span { display: block; margin-top: 3px; font-size: 13.5px; color: var(--sub); line-height: 1.6; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.board .c-ti a:hover b { text-decoration: underline; }
.board .c-ti a:focus-visible { outline: 2px solid var(--brand); outline-offset: 3px; border-radius: var(--r-sm); }
/* 상시 고정 표시 — 번호가 붙지 않는 건의 자리. 아이콘 전용이라 --brand-lit 대신 글자 대비색을 쓴다. */
.board .pin { display: inline-flex; color: var(--brand); }
.board .pin svg { width: 16px; height: 16px; display: block; }

/* ── 공지 본문 (notice/<주소>/) ──────────────────────────
   목록에서 제목을 누르면 여는 글. 본문 폭은 문장 길이로 잡는다 —
   원장이 쓰는 안내문은 68자 줄이 되면 눈이 다음 줄 머리를 못 찾는다. */
.postmeta { display: flex; align-items: center; gap: 12px; margin-top: 14px; font-size: 14px; color: var(--muted); }
.postmeta .tag {
  font-style: normal; font-weight: 700; color: var(--brand-deep);
  background: var(--tint); border-radius: 999px; padding: 5px 12px; font-size: 13px;
}
.post { max-width: 46em; padding-bottom: 4px; border-bottom: 1px solid var(--line); }
.post p { font-size: 16px; line-height: 1.85; color: var(--ink); }
.post p + p { margin-top: 1.05em; }
/* 공지에 붙는 사진 — 원장이 올리면 항상 16:9다(관리 화면이 잘라서 올린다). 그래서 여기서
   비율을 강제할 필요가 없고, `width/height` 속성만으로 적재 전에도 자리가 잡힌다. */
.postshot { margin: 0 0 22px; }
.postshot img { display: block; width: 100%; height: auto; border-radius: 14px; border: 1px solid var(--line); }

/* 이전/다음 — 게시판에서 글로 들어온 사람이 목록으로 되돌아가지 않고도 옆 글을 읽게 한다.
   없는 쪽도 자리를 비우지 않고 "없습니다"로 남긴다(칸이 하나면 어느 방향인지 안 보인다). */
.postnav { display: grid; gap: 0; margin-top: 30px; border-top: 1px solid var(--line); }
.postnav .pn {
  display: grid; grid-template-columns: 74px minmax(0, 1fr); align-items: baseline; gap: 4px 18px;
  padding: 16px 4px; border-bottom: 1px solid var(--line); text-decoration: none; color: inherit;
  transition: var(--t-fast);
}
.postnav a.pn:hover { background: var(--tint); }
.postnav .pn > span { font-size: 13px; font-weight: 600; color: var(--muted); }
.postnav .pn b { font-size: 15.5px; font-weight: 700; letter-spacing: -.02em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.postnav .pn.off b { font-weight: 500; color: var(--muted); }
.post + .acts, .postnav + .acts { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 26px; }

@media (max-width: 560px) {
  .post p { font-size: 15.5px; }
  .postnav .pn { grid-template-columns: minmax(0, 1fr); gap: 2px; }
}

/* ── 질문(FAQ) — <details>라 JS 없이 열린다 ─────────────── */
/* 질문마다 흰 카드 한 장씩 띄우던 판이었다. 카드 여섯 장이 같은 간격으로 떠 있으면
   내용과 무관하게 "생성된 FAQ"로 읽힌다(오너 지적 2026-08-07). 목록은 목록으로 둔다:
   행 사이 헤어라인 하나, 펼친 행만 연한 바탕. */
.qalist { display: grid; gap: 0; border-top: 1px solid var(--line); }
.qa {
  border-bottom: 1px solid var(--line); overflow: hidden;
}
.qa[open] { background: var(--tint-soft); }
.qa summary {
  list-style: none; cursor: pointer; padding: 19px 56px 19px 14px; position: relative;
  font-size: 16.5px; font-weight: 700; letter-spacing: -.02em; transition: var(--t-fast);
}
.qa summary::-webkit-details-marker { display: none; }
.qa summary::after {
  content: ''; position: absolute; right: 24px; top: 50%; width: 11px; height: 11px;
  margin-top: -8px; border-right: 2px solid var(--muted); border-bottom: 2px solid var(--muted);
  transform: rotate(45deg); transition: transform var(--t);
}
.qa[open] summary::after { transform: rotate(-135deg); margin-top: -3px; }
.qa summary:hover { color: var(--brand-deep); background: var(--tint-soft); }
/* 답변 줄길이 상한 — 카드 폭을 그대로 쓰면 1440에서 한 줄 148자가 되어 눈이 줄을 잃는다(D13 line-length). */
.qa p { padding: 0 22px 22px 14px; max-width: 620px; font-size: 15px; color: var(--sub); line-height: 1.7; }
/* 닫힌 답변은 **레이아웃에서도** 빼야 한다 — 크로뮴은 닫힌 <details> 내용을 display:none 이 아니라
   content-visibility 로 감춰서 rect 가 그대로 남는다. `.qa{overflow:hidden}` 이 눈에는 안 보이게 하지만
   그 유령 사각형이 아래 카드와 겹쳐 "글자가 가려짐"으로 잡힌다(D13 text-occlusion). */
.qa:not([open]) p { display: none; }

/* 열 머리 h2 — 위 여백이 아래보다 좁으면 "앞 블록의 캡션"으로 읽힌다(D13 heading-rhythm). */
.colhead { margin-top: 34px; }

/* ── 상세 스펙표 ────────────────────────────────────── */
.spec { width: 100%; border-collapse: collapse; background: var(--white); border-radius: var(--r); overflow: hidden; }
.spec th, .spec td { padding: 15px 20px; text-align: left; border-bottom: 1px solid var(--line-soft); font-size: 15px; }
.spec th { width: 168px; background: var(--tint-soft); color: var(--sub); font-weight: 700; }
.spec tr:last-child th, .spec tr:last-child td { border-bottom: 0; }

/* ── 안내 상자 ──────────────────────────────────────── */
/* `.blank`(▢ 미정 자리표시)는 은퇴시켰다 — 값이 없으면 줄을 아예 만들지 않는다(2026-08-10 오너 지시).
   `.pending` 은 남는다. 이건 "값이 비었다"가 아니라 **아직 안 되는 기능**을 알리는 자리다.
   문의 폼 전송은 2026-08-31에 실제로 붙어서 그 안내를 지우고, 지금 남은 쓰임은
   자료실의 발행처 표기 안내다. 값의 부재는 숨기고, 기능의 부재는 밝힌다. */
.pending {
  border: 1px dashed var(--line); border-radius: var(--r); padding: 22px;
  background: rgba(255, 255, 255, .5); color: var(--muted); font-size: 14.5px;
}

/* ── 문의 폼 ────────────────────────────────────────── */
.form { display: grid; gap: 16px; }
.form label { display: grid; gap: 7px; font-size: 14.5px; font-weight: 700; color: var(--sub); }
.form input, .form select, .form textarea {
  font: inherit; font-size: 16px; color: var(--ink); background: var(--white);
  border: 1px solid var(--line); border-radius: var(--r-sm); padding: 14px 16px;
  transition: var(--t-fast); width: 100%;
}
.form input:focus, .form select:focus, .form textarea:focus {
  outline: 0; border-color: var(--brand); box-shadow: 0 0 0 3px rgba(194, 65, 12, .12);
}
.form textarea { min-height: 132px; resize: vertical; }
.form .row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
/* 동의 줄 — 체크박스가 글자 첫 줄에 붙도록 `align-items:start`. 글은 본문급으로 낮춘다 —
   라벨 굵기 그대로 두면 동의문이 입력칸 제목처럼 읽힌다. */
.form .agree { grid-template-columns: 22px 1fr; align-items: start; gap: 10px; font-weight: 500; }
/* 체크박스는 **눈에 22px · 손가락에 44px** 다. 기본 체크박스를 그대로 두면 22×22 가
   그대로 탭타겟이 돼 모바일에서 오탭이 난다(390 실측 22×22). 그렇다고 네모를 44px 로
   키우면 동의란이 체크박스 하나로 도배된다 — `appearance:none` 으로 상자를 직접 그려
   누르는 면은 44, 보이는 면은 22 로 갈라 둔다(음수 마진으로 글자 줄과 수평을 맞춘다). */
.form .agree input {
  appearance: none; -webkit-appearance: none;
  width: 44px; height: 44px; margin: -11px 0 -11px -11px; padding: 0;
  border: 0; background: none; cursor: pointer;
  display: grid; place-content: center;
}
.form .agree input::before {
  content: ''; width: 22px; height: 22px; border-radius: 6px;
  border: 1.5px solid var(--line); background: var(--white); transition: var(--t-fast);
}
.form .agree input:hover::before { border-color: var(--brand-lit); }
.form .agree input:checked::before {
  border-color: var(--brand); background: var(--brand)
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5 6.5 11.5 12.5 4.5'/%3E%3C/svg%3E")
    center / 15px no-repeat;
}
.form .agree span { font-size: 13.8px; line-height: 1.6; color: var(--muted); }
/* 미끼 칸 — 사람에겐 안 보이고 봇에겐 보인다. `display:none` 은 일부 봇이 건너뛰므로
   화면 밖으로 밀어 놓는다(초점 순서에서는 tabindex=-1 로 빠진다). */
.form .hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
/* 전송 결과 한 줄. 색만으로 알리지 않는다 — 문장이 본체고 색은 거듬이다. */
.formstat {
  margin: 0; padding: 13px 16px; border-radius: var(--r-sm); font-size: 14.5px; font-weight: 600;
  background: var(--paper); border: 1px solid var(--line); color: var(--sub);
}
.formstat.ok { background: var(--tint-soft); border-color: var(--brand-lit); color: var(--brand-deep); }
.formstat.bad { background: #fff5f5; border-color: #f0b4ac; color: #a52f1c; }
.formnote { margin-top: 14px; font-size: 14px; color: var(--muted); line-height: 1.65; }

.contactinfo { display: grid; gap: 14px; }
.contactinfo div { display: flex; gap: 12px; font-size: 15px; }
.contactinfo dt { flex: 0 0 84px; color: var(--muted); font-weight: 600; }
.contactinfo dd { margin: 0; color: var(--ink); font-weight: 600; }

/* ── 빈 결과 ────────────────────────────────────────── */
.empty {
  grid-column: 1 / -1; padding: 64px 24px; text-align: center;
  border: 1px dashed var(--line); border-radius: var(--r-lg); background: rgba(255, 255, 255, .6);
}
.empty b { display: block; font-size: 18px; margin-bottom: 8px; }
.empty p { color: var(--sub); font-size: 15px; }

/* ── 결과 툴바 (웅진 `.hasthumbListBtnWrap` 실측: 높이 50 · 좌 "총 N건" · 우 컨트롤) ── */
.resbar {
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  min-height: 50px; margin: 18px 0 14px;
}
/* 24/26px 였다. 2026-08-07 오너 판정 "T3도 이렇게 좀 작게"(웅진 "총 58건" 툴바 크롭 제시) —
   레퍼 툴바 카운트는 본문급 한 줄이지 페이지 제목이 아니다. 게시판 카운트(`.boardbar .cnt`)와
   같은 규격으로 맞춘다: 14.5px/700 회색 + 숫자만 브랜드색 800. 위계는 카드 제목(18px)이 잡는다. */
.resbar .cnt { font-size: 14.5px; font-weight: 700; color: var(--sub); letter-spacing: -.02em; }
.resbar .cnt em { font-style: normal; font-weight: 800; color: var(--brand-deep); }
.resbar .sum { font-size: 14px; font-weight: 600; color: var(--muted); }
.resbar .tools { display: flex; align-items: center; gap: 10px; }
.resbar .reset {
  min-height: 40px; padding: 0 14px; background: var(--white); border: 1px solid var(--line);
  border-radius: var(--r-sm); color: var(--sub); font: inherit; font-size: 14px; font-weight: 600;
  cursor: pointer; transition: var(--t-fast);
}
.resbar .reset:hover { color: var(--brand-deep); border-color: var(--brand-lit); }
.listmain { padding-top: 22px; }

.crumb { font-size: 13.5px; color: var(--muted); margin-bottom: 14px; }
.crumb a { color: var(--muted); text-decoration: none; }
.crumb a:hover { color: var(--brand-deep); }

/* ── 푸터 ───────────────────────────────────────────── */
.foot { border-top: 1px solid var(--line); background: rgba(255, 255, 255, .5); }
.foot .in { max-width: var(--max); margin: 0 auto; padding: 44px 24px; display: grid; gap: 22px; }
.foot .fb { font-weight: 800; font-size: 17px; }
.foot .fi { display: flex; flex-wrap: wrap; gap: 8px 22px; font-size: 14px; color: var(--sub); }
.foot .fc { font-size: 13px; color: var(--muted); }

/* ── 스크롤 리빌 (animation-on-scroll) ──────────────── */
[data-reveal] { opacity: 0; transform: translateY(18px); transition: opacity .62s var(--ease), transform .62s var(--ease); }
[data-reveal].in { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .01ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
  [data-reveal] { opacity: 1; transform: none; }
}

/* ── 반응형 ─────────────────────────────────────────── */
@media (max-width: 1000px) {
  .span-3 { grid-column: span 4; }
  .span-4 { grid-column: span 6; }
  .span-5, .span-6, .span-7, .span-8 { grid-column: span 12; }
  .tri { grid-template-columns: 1fr; }
  .notices { grid-template-columns: minmax(0, 1fr); }
  .doccards { grid-template-columns: repeat(2, 1fr); }
  .domains { grid-template-columns: repeat(3, 1fr); }
  .domains.wrapd { grid-template-columns: repeat(3, 1fr); }
  .hsplit > .wrap { grid-template-columns: minmax(0, 1fr); gap: 18px; padding-bottom: 84px; }
  .hshot img { height: clamp(200px, 34vw, 300px); }
}

@media (max-width: 760px) {
  .gnb nav { display: none; }
  .gnb .burger { display: block; }
  .gnb nav.open {
    display: flex; flex-direction: column; position: absolute; top: 68px; left: 0; right: 0;
    background: var(--white); border-bottom: 1px solid var(--line); padding: 10px 16px; gap: 2px;
    box-shadow: var(--sh-2);
  }
  .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-12 { grid-column: span 12; }

  /* 프로그램 카드만 모바일 2열 유지 — 앵커(웅진 `/prod/subjectList.do`) 모바일 목록이 2열이고,
     1열로 풀면 17종 목록이 세로 11,064px(레퍼 2,965px의 3.7배)가 되어 스캔이 불가능해진다.
     타이포도 레퍼 390 실측을 따른다: 라벨 10.5 · 제목 14 · 설명 12.25(2줄 clamp) · 해시 11.375.
     [근거: 2026-07-31 390 나란히 실측 · clients/개별외주/동심중부파트너/07-나란히/] */
  .card.span-3 { grid-column: span 6; }
  .card.span-3 .body { padding: 12px; gap: 6px; }
  .card.span-3 .cat { font-size: 11px; }
  /* 제목 14 → 16. 설명을 14로 올리면서 같이 올린다 — 둘이 같은 14px 이면 제목이 굵기·색으로만
     구분돼 카드 위계가 납작해진다(레퍼 제목:설명 = 1.14:1 을 그대로 유지한다). */
  .card.span-3 :is(h2, h3) { font-size: 16px; }
  /* 설명은 2줄 — 3줄로 풀어 두던 자리다. 2026-08-07 오너 판정 "사진이 너무 작고 글이 너무 많다":
     390 실측에서 카드 278px 중 사진이 88px(32%)뿐이었고 설명 3줄 + 해시 3줄이 나머지를 먹었다.
     푸는 대신 **문장을 줄였다**(programs.json benefit 26~37자 → 15~25자) — 2줄에 온전히 들어가므로
     말줄임이 뜨지 않는다(잘린 문장은 "칸을 채웠다"로 읽힌다는 판정은 그대로 유효하다). */
  /* 12.5px 였다. 2026-08-07 오너 판정 "이 정도 사이즈까지는 커야 돼"(웅진 카드 크롭 제시) —
     데스크톱·레퍼 설명 규격인 14px 로 올린다. 문장이 이미 15~25자로 줄어 있어 2줄에 그대로 들어간다
     (게이트 W2 모바일적합이 말줄임 발생을 잰다). */
  .card.span-3 .benefit { font-size: 14px; -webkit-line-clamp: 2; }
  /* 해시는 2개까지 — 173px 폭에서 4개는 3줄(61px)로 흘러 사진(96px)만큼 자리를 먹었다.
     마크업에는 전부 남는다(데스크톱 260px 카드는 4개를 2줄에 담고, 검색엔진도 그대로 읽는다). */
  .card.span-3 .hash { font-size: 11.5px; }
  .card.span-3 .hash span:nth-child(n+3) { display: none; }
  .card.span-3 .badge { font-size: 10px; padding: 3px 7px; left: 8px; top: 8px; }

  /* 사진을 키우는 레버는 타일 폭뿐이다 — 키비주얼 22장이 전부 16:9 배너라 문장이 가장자리까지 찬다.
     4:3 박스에 `cover` 로 잘라 확대하면 "인성을품은아이"·"비상교육이 만든" 같은 카피의 첫·끝 글자가
     날아간다(그래서 `contain` 은 유지한다). 대신 목록 그리드만 래퍼 패딩 24 → 16 으로 되찾고
     칸 사이를 24 → 12 로 좁힌다. 390 실측: 타일 159 → 173 · 사진 157×88 → 171×96.
     여백은 8px 남아 가로 스크롤이 생기지 않는다. [근거: 2026-08-07 오너 지시 "사진 키워라"] */
  /* 카드는 제 내용만큼만 세운다(`align-items:start`) — 늘려 맞추면(기본값 `stretch`) 설명 1줄짜리
     카드가 옆 2줄 카드 높이까지 늘어나 본문과 해시 사이에 60px 짜리 흰 구멍이 생긴다.
     사진은 그대로인데 카드만 커지니 사진이 더 작아 보인다. `.evt .grid` 와 같은 처리다. */
  .listmain #list { margin-inline: -8px; gap: 12px; align-items: start; }

  /* 전화 링크 탭타겟 — 390 실측에서 100×18px이었다. 원장이 모바일에서 누르는 유일한 즉시 전환 동선이라
     44px 미만은 오탭을 만든다(Practical UI 하드룰). [근거: 2026-07-31 auditMobile telTargets] */
  a[href^="tel:"] { display: inline-flex; align-items: center; min-height: 44px; }
  /* 나머지 손가락 규격 — 2026-08-07 전 페이지 실측에서 44px 미만이 무더기로 나왔다:
     크럼 "홈" 12×16 · 헤더 로고 112×21 · `.seclink` 72×25 · 버거 54×40 · 캐러셀 버튼 34×34 ·
     초기화 66×40 · 공지 인라인 링크 124×23 · 메일 링크 171×18.
     글자 크기는 건드리지 않는다(레퍼 실측 타이포가 정본) — **누르는 면만** 넓힌다.
     인라인 링크는 세로 패딩 + 같은 크기 음수 마진이라 줄바꿈·행간이 그대로다. */
  .gnb .brand a { display: inline-flex; align-items: center; min-height: 44px; }
  .gnb .burger { min-height: 44px; padding: 11px 14px; }
  .crumb a { display: inline-block; padding: 13px 16px; margin: -13px -12px; }
  .seclink, .resbar .reset { display: inline-flex; align-items: center; min-height: 44px; }
  .notice a, a[href^="mailto:"], .qa p a { display: inline-block; padding: 12px 0; margin: -12px 0; }
  .hbtn { width: 44px; height: 44px; }
  /* 영역 타일은 모바일 2열 — 3열이면 390 에서 타일 폭 118px·그림 66px 높이라 키비주얼이 안 읽힌다(2026-09-11).
     2열이면 11칸이 6줄이지만 그림이 170px 폭으로 살고, 대표 프로그램명도 한 줄(말줄임)로 다시 보인다. */
  .domains, .domains.wrapd { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .domains a b { font-size: 13.5px; padding: 10px 11px 0; letter-spacing: -.03em; }
  .domains a span { font-size: 11.5px; padding: 2px 11px 11px; }
  .closing .band { flex-direction: column; align-items: stretch; gap: 18px; }
  .closing .acts .btn { width: 100%; }
  .doccards { grid-template-columns: 1fr; }
  .form .row { grid-template-columns: 1fr; }

  /* 필터는 모바일에서도 "딱 한 줄"이다 — 오너 확정(2026-07-29 G-W "한 줄이라 더 깔끔",
     2026-07-31 "필터가 공간을 너무 차지한다"). 축 2개 + 검색 아이콘이 한 행 전부이고,
     초기화는 결과 툴바로 내렸다(레퍼 웅진도 목록 툴바에 컨트롤을 둔다).
     [근거: 2026-07-31 390 나란히 실측 · 07-판정.html §1] */
  .fsearch { padding: 10px; gap: 8px; }
  .fsearch .fields { gap: 8px; min-width: 0; }
  .sel { flex: 1 1 0; min-width: 0; }
  .sel .selbtn { height: 52px; padding: 0 28px 0 12px; font-size: 14px; }
  .sel .arrow { right: 10px; }
  .sel .opts li { padding: 12px 14px; font-size: 15px; }
  .fsearch .go { width: 52px; height: 52px; flex: 0 0 52px; }
  .resbar { margin: 14px 0 12px; }
  /* 모바일 히어로는 폭이 좁아 가로 그라디언트의 옅은 쪽에 카피가 걸린다(390 실측: 흰글자 대비 3.66).
     같은 색을 평평하게 깔아 최저 대비를 4.5 위로 올린다. [근거: 07-판정.html §4 대비 실측] */
  .hphoto::after { background: rgba(28, 25, 23, .6); }
  .heroin h1 { font-size: 26px; text-shadow: 0 2px 14px rgba(0, 0, 0, .38); }
  /* 모바일 2·3화면은 글 위 · 사진 아래. 사진 높이를 고정해 히어로 전체가 한 화면을 넘지 않게 잡는다. */
  .hsplit > .wrap { padding-top: 18px; padding-bottom: 74px; }
  .hcopy h2 { font-size: 22px; }
  .hcopy .herosub { font-size: 14.5px; }
  .hcopy .btn { margin-top: 16px; height: 48px; padding: 0 20px; }
  /* 인포그래픽·로고 판은 모바일에서 잘리면 못 읽는다 — 잘라 채우지 말고 통째로 줄인다. */
  .hshot img { height: auto; max-height: 210px; object-fit: contain; }
  .hlogos img { max-height: 150px; }
  .heroctl { bottom: 44px; }
  .herotop .fsearch { margin-top: -26px; }
  .quicktop { padding: 12px 16px 14px; }
  /* 탭 바는 화면 가장자리까지 흘려야 "더 있다"가 보인다 — 래퍼 패딩을 음수 마진으로 되찾고
     끝에 같은 크기의 안쪽 여백을 준다(마지막 칸이 모서리에 붙어 잘린 것처럼 보이지 않게). */
  .domtabs { margin-inline: -24px; padding-inline: 24px; }
  .domtab { font-size: 14px; padding: 0 14px; }
  /* 상세 버튼 3개는 폰에서 줄이 접힌다 — 접힌 줄이 왼쪽에만 붙어 어긋나 보이지 않게 늘려 채운다. */
  .hero .acts .btn { flex: 1 1 auto; justify-content: center; padding: 0 14px; }
  .quicknav { grid-template-columns: repeat(4, 1fr); gap: 8px; margin-top: 14px; }
  .quicknav a { padding: 14px 4px; gap: 6px; }
  .quicknav a img { width: 32px; height: 32px; }
  .quicknav b { font-size: 13px; }
  .quicknav span { font-size: 11.5px; }
  .qa summary { font-size: 15.5px; padding: 16px 44px 16px 16px; }
  .qa p { padding: 0 16px 18px; font-size: 14.5px; }
  /* 390px에서는 구분·제목·링크가 한 행에 못 선다 — 위에서 아래로 쌓는다. */
  .notice { grid-template-columns: minmax(0, 1fr); gap: 6px; padding: 16px 4px; }
  .notice p, .notice a { grid-column: 1; }
  .notice a { grid-row: auto; justify-self: start; }
  /* 390px에서 3열 표는 제목 폭이 130px로 눌린다. 표를 풀어 한 건 = 한 블록으로 쌓는다 —
     번호(핀) 열은 내리고(구분 값이 같은 말을 한다), 구분은 제목 위 라벨로 올린다(모바일은
     위에서 아래로 읽는다 — 메타가 요약 밑에 남으면 다음 건의 머리처럼 붙어 보인다).
     제목 링크는 탭타겟 44px를 확보한다. */
  .board, .board tbody, .board td { display: block; width: auto; }
  .board thead { display: none; }
  .board tbody tr {
    display: flex; flex-direction: column; width: auto;
    padding: 0 16px; border-bottom: 1px solid var(--line-soft);
  }
  .board tbody tr:last-child { border-bottom: 0; }
  .board td { padding: 0; text-align: left; border-bottom: 0; }
  .board .c-no { display: none; }
  .board .c-dt { order: -1; padding-top: 12px; font-size: 12.5px; }
  .board .c-ti a { min-height: 44px; padding: 2px 0 14px; }
  .board .c-ti b { font-size: 15px; }
  .board .c-ti span { white-space: normal; }
  .spec th { width: 116px; }
}

/* 360 — 갤럭시 S·아이폰 SE 폭. 여기서만 깨지던 것을 잡는다(2026-08-07 31페이지 실측).
   회사소개 `.spec` 표가 368px로 넘쳐 페이지 전체에 가로 스크롤이 생겼다(머리열 116 + 값 여백).
   카드 설명 clamp 는 여기서 더 풀지 않는다 — 문장 자체를 25자 이하로 줄여 360에서도 2줄에 들어간다. */
@media (max-width: 400px) {
  .spec th { width: 104px; }
  .spec th, .spec td { padding: 13px 12px; font-size: 14.5px; }
}

/* ── 상세 하단 전환 밴드 ─────────────────────────────── */
.ctaband {
  display: flex; align-items: center; justify-content: space-between; gap: 26px; flex-wrap: wrap;
  padding: clamp(28px, 3.6vw, 44px);
  background: linear-gradient(135deg, var(--tint-soft), var(--tint));
  border: 1px solid rgba(253, 107, 0, .24);
  border-radius: var(--r-xl);
  box-shadow: var(--sh-1);
}
.ctaband h2 { font-size: clamp(21px, 2.3vw, 27px); }
.ctaband p { margin-top: 10px; color: var(--sub); max-width: 52ch; font-size: 15px; }
.ctaband .acts { display: flex; gap: 12px; flex-wrap: wrap; }

/* ── 대표 인사말 상자(회사소개) ─────────────────────────────
   문단 간격을 CSS 가 쥔다: 마크업 인라인 margin 은 문단이 늘거나 줄면 같이 안 움직인다. */
/* ── 회사소개 · 대표 인사말 편지 (2026-09-11 · 레퍼 = 합창단 단체소개 인사말) ──
   글씨: 교보손글씨 2025 이유빈 — 무료·웹 탑재 허용, **포맷 변경·서브셋 금지**라 TTF 원본(5.7MB) 그대로.
   회사소개 한 페이지에서만 내려받고, swap 이라 글은 먼저 뜨고 글씨체가 뒤에 갈아입는다. */
@font-face {
  font-family: 'KyoboHandwriting2025yubin';
  src: url('assets/fonts/KyoboHandwriting2025lyb.ttf') format('truetype');
  font-weight: 400; font-style: normal; font-display: swap;
}
:root { --font-hand: 'KyoboHandwriting2025yubin', 'Nanum Pen Script', cursive; }
.eyebrow { font-size: 12px; letter-spacing: .22em; font-weight: 700; color: var(--brand-deep); text-transform: uppercase; }
.about-hero .eyebrow { margin-top: 18px; }
.about-hero h1 { margin-top: 8px; }
.letter-sec { position: relative; isolation: isolate; overflow: hidden; padding: 0 0 clamp(80px, 10vw, 136px); }
.letter-sec .about-hero { padding: 6px 0 14px; }
.letter-sec .about-hero .eyebrow { margin-top: 10px; }
.letter-sec .about-hero h1 { margin-top: 4px; }
.letter-sec .about-hero .crumb { margin-top: 0; }
.after-letter { padding-top: clamp(56px, 7vw, 88px); }
.letter-bg { position: absolute; inset: 0; z-index: -1; }
.letter-bg img { width: 100%; height: 100%; object-fit: cover; display: block; }
.letter-bg .scrim { position: absolute; inset: 0; background: rgba(255,255,255,.62); }
.letter-in { max-width: 760px; margin: 0 auto; padding: 0 20px; text-align: center; }
.letter-in .eyebrow { margin: 0 0 22px; }
.letter { position: relative; background: var(--white); border-radius: 24px; padding: clamp(40px, 6vw, 64px) clamp(22px, 5vw, 64px);
  box-shadow: 0 30px 60px -30px rgba(28,25,23,.28), 0 0 0 1px rgba(28,25,23,.05); }
.letter::before { content: ""; position: absolute; inset: 12px; border: 1px solid rgba(194,65,12,.22); border-radius: 16px; pointer-events: none; }
.letter-ic { width: 34px; height: 34px; color: var(--brand); }
.letter-quote { margin-top: 18px; font-family: var(--font-hand); font-size: clamp(30px, 4.6vw, 42px); line-height: 1.35; color: var(--ink); }
.hairline { width: 48px; height: 1px; background: var(--brand); opacity: .55; margin: 26px auto; }
.letter-body p { font-family: var(--font-hand); font-size: clamp(20px, 2.4vw, 24px); line-height: 1.85; color: #3f3a36; word-break: keep-all; }
.letter-body p + p { margin-top: 22px; }
.letter .sign { margin-top: 36px; font-family: var(--font-hand); font-size: clamp(22px, 2.6vw, 26px); color: var(--ink); }
@media (max-width: 760px) { .letter { border-radius: 20px; } .letter::before { inset: 9px; border-radius: 13px; } }

/* == 폼 다이얼로그 (2026-09-09) == */
/* 교육행사의 [행사진행문의] 상자. 골격은 포스터 확대판(`.lb`)을 그대로 쓰고 — 상위 레이어·
   Esc·바깥 클릭·초점 가둠을 브라우저가 준다 — 폼이 들어가면서 달라지는 것만 여기서 덮는다:
   배경(투명 → 흰색) · 폭(fit-content → 고정) · 안쪽 여백.
   ⚠ `display` 는 건드리지 않는다. `.evform { display:… }` 를 얹는 순간 UA 규칙
   `dialog:not([open]) { display: none }` 을 이겨서, 닫힌 폼이 교육행사 본문 맨 끝에
   흰 박스로 늘 떠 있게 된다(브로슈어 상자에서 실제로 그랬다 — `.bv-lb[open]` 주석 참조). */
.evform {
  width: min(92vw, 440px); max-height: 92vh; overflow: auto;
  background: var(--white); border: 1px solid var(--line); border-radius: var(--r-lg);
  box-shadow: var(--sh-3);
}
/* 안쪽 여백을 상자가 아니라 **폼이** 갖는다. 상자에 주면 그 여백을 누르는 순간
   `e.target === dialog` 가 되어(app.js 의 바깥 클릭 판정) 쓰던 글이 그대로 닫힌다. */
.evform .form { padding: 24px 20px 22px; }
.evform h2 { font-size: 20px; letter-spacing: -.03em; padding-right: 44px; } /* ✕ 자리를 비운다 */
.evform .evformlead { margin-top: -7px; font-size: 14.5px; color: var(--muted); line-height: 1.6; }
/* ✕ 는 흰 상자 위에 뜬다 — 포스터 확대판의 잉크 원을 그대로 쓰면 폼 위에서 너무 무겁다.
   누르는 면 44px 은 `.lbx` 에서 그대로 물려받는다(모바일 탭타겟 게이트).
   ⚠ `position` 을 `absolute` 에서 `sticky` 로 바꾼다. 상자가 `overflow:auto` 라 폼이 화면보다 길면
   절대배치 ✕ 는 상자 **내용 맨 위**에 붙어 같이 굴러 올라가 사라진다 — 폰에서 칸을 다 채운 원장이
   닫을 곳을 잃는다(출구가 Esc·바깥 클릭만 남는데 폰에는 Esc 가 없다). */
.evform .lbx {
  position: sticky; top: 10px; right: auto; z-index: 2;
  margin: 10px 10px -54px auto;
  background: var(--paper); border: 1px solid var(--line); color: var(--sub);
}
.evform .lbx:hover, .evform .lbx:focus-visible { background: var(--ink); color: var(--white); }
/* 진행 희망 행사 체크 묶음(2026-09-11 복수 선택). `<fieldset>` 은 브라우저 기본 테두리·여백이
   제각각이라 전부 걷고 다시 세운다 — 폼의 다른 `<label>` 들과 줄이 어긋나면 상자 안이 흔들려 보인다. */
.evform .evchk { border: 0; padding: 0; margin: 0; min-width: 0; }
.evform .evchk legend {
  padding: 0; font-size: 14.5px; font-weight: 700; color: var(--sub);
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin-bottom: 2px;
}
/* "여러 개 고르셔도 됩니다" — 지시가 아니라 안심시키는 말이라 제목보다 작고 옅다. */
.evform .evchk legend span { font-size: 12.5px; font-weight: 500; color: var(--muted); }
/* 한 줄에 하나씩 쌓는다. 행사명이 길어(`사회정서기술! 전인교육`) 2열로 깔면 360 에서 줄이 접히고,
   접힌 두 줄짜리 라벨 옆의 체크박스가 어느 줄에 속하는지 눈으로 안 갈린다. */
.evform .evchk .chk {
  display: flex; align-items: center; gap: 10px; min-height: 44px; /* 탭타겟 하드룰 */
  font-size: 15px; font-weight: 500; color: var(--ink); cursor: pointer;
  border-top: 1px solid var(--line-soft);
}
.evform .evchk .chk:first-of-type { border-top: 0; }
/* 18px 은 브라우저 기본(13px)보다 크다 — 폰에서 손가락으로 정확히 겨냥하는 대상이라 키운다.
   `accent-color` 는 체크 표시를 브랜드색으로 칠한다(지원 안 하면 기본 파랑, 기능은 같다). */
.evform .evchk .chk input { width: 18px; height: 18px; flex: none; accent-color: var(--brand); }
.evform .evchk .chk span { min-width: 0; }
@media (max-width: 640px) {
  .evform { width: 94vw; max-height: 90vh; }
  .evform .form { padding: 22px 16px 20px; }
}

/* 히어로 리드 바로 아래 첫 문의 버튼. 포스터 그리드와 붙지 않게 아래 여백을 준다 —
   이름을 따로 두는 이유는 e2e 가 이 자리를 `.evopen[data-event-open]` 으로 집기 때문이다
   (`_dev/event-form-e2e.mjs`): 히어로에서 연 상자는 아무것도 프리체크되지 않아야 한다. */
.evopen { margin-bottom: 4px; }

/* 포스터 카드 안의 [행사진행문의] — 캡션 아래 한 줄. 카드 폭을 다 쓰는 이유는
   포스터가 세로로 길어서 버튼이 오른쪽 끝에 붙으면 눈이 거기까지 안 가기 때문이다. */
.poster .evask { padding: 0 16px 16px; }
.poster .evask .btn { width: 100%; justify-content: center; }

/* ── 데스크톱 기본 배율 125% (2026-09-11 오너: "125% 로 확대해서 보니 딱 괜찮다 — default 로") ──
   브라우저 확대와 같은 효과를 내는 것은 `zoom` 뿐이다(px 로 짠 사이트라 root font-size 로는 안 커진다).
   폰·태블릿(<1024)은 그대로 — 거기서 1.25 는 한 줄에 글자가 모자란다. */
@media (min-width: 1024px) { html { zoom: 1.25; } }
