/* ============================================================
   TAEHWA ENVIRONMENT — shared theme
   3 moods via [data-mood]; KR/EN via [data-lang]
   ============================================================ */

/* 폰트는 각 HTML의 <head>에서 <link>로 직접 불러온다. CSS 안의 @import는
   theme.css를 다 받은 뒤에야 폰트 요청이 시작돼(직렬) 모바일에서 첫 글자가
   늦게 뜬다. 또한 static 대신 variable + dynamic-subset 을 쓴다 — static은
   굵기(5종)마다 한글 폰트 파일을 통째로 받지만, dynamic-subset은 실제 화면에
   쓰인 글자 조각만 받는다. */

/* ---------- design tokens (mood-independent) ---------- */
:root {
  --font-sans: "Pretendard Variable", "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;

  --fs-hero: clamp(44px, 6.6vw, 108px);
  --fs-display: clamp(34px, 4.4vw, 68px);
  --fs-h1: clamp(30px, 3.6vw, 54px);
  --fs-h2: clamp(25px, 2.6vw, 40px);
  --fs-h3: clamp(20px, 1.5vw, 26px);
  --fs-lead: clamp(18px, 1.5vw, 24px);
  --fs-body: clamp(16px, 1.05vw, 18px);
  --fs-small: 14px;
  --fs-eyebrow: clamp(12px, 0.85vw, 14px);

  --maxw: 1200px;
  --maxw-wide: 1480px;
  --pad-x: clamp(20px, 5vw, 80px);
  --sec-y: clamp(72px, 11vw, 160px);

  --radius-s: 10px;
  --radius: 18px;
  --radius-l: 28px;

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --dur: 0.7s;

  --header-h: 68px;

  /* accent override hook used by Tweaks; falls back to mood accent */
  --accent-user: ;
}

/* ---------- MOOD: mono (Apple minimal — default) ---------- */
:root,
[data-mood="mono"] {
  --bg: #ffffff;
  --bg-alt: #f5f5f7;
  --surface: #ffffff;
  --text: #1d1d1f;
  --text-soft: #5c5c61;
  --text-faint: #707074;
  --line: #e3e3e6;
  --line-strong: #d2d2d7;
  --accent: #1a7a4e;
  --accent-strong: #0f5c39;
  --accent-tint: #eef5f0;
  --dark-bg: #131314;
  --dark-bg-2: #1f1f22;
  --dark-text: #f5f5f7;
  --dark-soft: #a7a7ad;
  --hero-grad: radial-gradient(120% 90% at 70% 10%, #2a2a2e 0%, #131314 55%, #0a0a0b 100%);
  --shadow: 0 1px 2px rgba(0,0,0,.04), 0 12px 36px rgba(0,0,0,.07);
  --shadow-lift: 0 2px 8px rgba(0,0,0,.06), 0 24px 60px rgba(0,0,0,.12);
}

/* ---------- MOOD: green (deep green + nature) ---------- */
[data-mood="green"] {
  --bg: #f5f8f4;
  --bg-alt: #e9f1ea;
  --surface: #ffffff;
  --text: #122019;
  --text-soft: #4a5b50;
  --text-faint: #606f65;
  --line: #dde8df;
  --line-strong: #cadbcd;
  --accent: #1f7a44;
  --accent-strong: #0f5a30;
  --accent-tint: #e6f1e9;
  --dark-bg: #0c2419;
  --dark-bg-2: #11321f;
  --dark-text: #eaf3ec;
  --dark-soft: #9cc0a8;
  --hero-grad: radial-gradient(120% 100% at 72% 8%, #1b5236 0%, #0e2c1d 52%, #07190f 100%);
  --shadow: 0 1px 2px rgba(13,50,31,.05), 0 12px 36px rgba(13,50,31,.08);
  --shadow-lift: 0 2px 8px rgba(13,50,31,.08), 0 24px 60px rgba(13,50,31,.14);
}

/* ---------- MOOD: blue (trust / industrial) ---------- */
[data-mood="blue"] {
  --bg: #f7fafd;
  --bg-alt: #eaf1f9;
  --surface: #ffffff;
  --text: #0e1f33;
  --text-soft: #46586d;
  --text-faint: #606f83;
  --line: #dce7f2;
  --line-strong: #c8d9ec;
  --accent: #1c5fb0;
  --accent-strong: #0d4488;
  --accent-tint: #e8f0fa;
  --dark-bg: #0a1c33;
  --dark-bg-2: #102844;
  --dark-text: #e8f0fa;
  --dark-soft: #9bb4d2;
  --hero-grad: radial-gradient(120% 100% at 72% 8%, #1b4f8c 0%, #0c2747 52%, #06162b 100%);
  --shadow: 0 1px 2px rgba(10,28,51,.05), 0 12px 36px rgba(10,28,51,.08);
  --shadow-lift: 0 2px 8px rgba(10,28,51,.08), 0 24px 60px rgba(10,28,51,.14);
}

/* resolved accent (Tweaks color override wins if set) */
:root { --c-accent: var(--accent); --c-warn: #c2762e; }

/* ---------- reset / base ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  line-height: 1.65;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
  transition: background-color .5s var(--ease), color .5s var(--ease);
}
img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; }
h1, h2, h3, h4, p { margin: 0; }
/* keep-all: 한국어는 기본값이면 음절 아무데서나 줄이 바뀐다("기준."이 "기 /
   준."으로 쪼개짐). 좁은 화면일수록 심해지므로 단어 단위로 끊는다.
   overflow-wrap은 그래도 한 단어가 폭보다 길 때의 탈출구. */
h1, h2, h3, h4 { font-weight: 700; line-height: 1.1; letter-spacing: -0.02em; word-break: keep-all; overflow-wrap: break-word; }
p, li, dd, dt, figcaption, .lead, .badge, .btn { word-break: keep-all; overflow-wrap: break-word; }
.serif { letter-spacing: -0.01em; }
strong { font-weight: 700; }
::selection { background: var(--c-accent); color: #fff; }
:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 3px; border-radius: 4px; }

/* lang toggle visibility */
[data-lang="ko"] .lang-en { display: none !important; }
[data-lang="en"] .lang-ko { display: none !important; }

/* ---------- layout helpers ---------- */
.wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding-inline: var(--pad-x); }
.wrap-wide { width: 100%; max-width: var(--maxw-wide); margin: 0 auto; padding-inline: var(--pad-x); }
.section { padding-block: var(--sec-y); }
.section-tight { padding-block: clamp(48px, 7vw, 96px); }

.eyebrow {
  display: inline-flex; align-items: center; gap: 10px; white-space: nowrap;
  font-size: var(--fs-eyebrow); font-weight: 600; letter-spacing: 0.18em;
  text-transform: uppercase; color: var(--c-accent);
}
.eyebrow::before {
  content: ""; width: 26px; height: 1.5px; background: var(--c-accent); display: inline-block;
}
.eyebrow.center { justify-content: center; }

.lead { font-size: var(--fs-lead); color: var(--text-soft); line-height: 1.55; font-weight: 400; }

/* ---------- buttons ---------- */
.btn {
  display: inline-flex; align-items: center; gap: 10px;
  font-size: var(--fs-body); font-weight: 600; line-height: 1;
  padding: 16px 28px; border-radius: 999px; cursor: pointer; border: 1px solid transparent;
  transition: transform .35s var(--ease), background-color .3s var(--ease), color .3s, border-color .3s, box-shadow .3s;
  white-space: nowrap;
}
.btn .arr { transition: transform .35s var(--ease); }
.btn:hover .arr { transform: translateX(4px); }
.btn-primary { background: var(--c-accent); color: #fff; }
.btn-primary:hover { background: var(--accent-strong); transform: translateY(-2px); box-shadow: var(--shadow-lift); }
.btn-ghost { background: transparent; color: var(--text); border-color: var(--line-strong); }
.btn-ghost:hover { border-color: var(--c-accent); color: var(--c-accent); }
.btn-light { background: rgba(255,255,255,.12); color: #fff; border-color: rgba(255,255,255,.28); backdrop-filter: blur(8px); }
.btn-light:hover { background: rgba(255,255,255,.2); transform: translateY(-2px); }
.btn-onlight { background: #fff; color: var(--text); }
.btn-onlight:hover { transform: translateY(-2px); box-shadow: var(--shadow-lift); }

/* ---------- header ---------- */
.site-header {
  position: fixed; inset: 0 0 auto 0; z-index: 100; height: var(--header-h);
  display: flex; align-items: center;
  transition: background-color .4s var(--ease), box-shadow .4s, border-color .4s, height .4s;
  border-bottom: 1px solid transparent;
}
.site-header .wrap-wide { display: flex; align-items: center; justify-content: space-between; gap: 24px; }
.site-header.scrolled {
  background: color-mix(in srgb, var(--bg) 80%, transparent);
  -webkit-backdrop-filter: saturate(180%) blur(18px);
  backdrop-filter: saturate(180%) blur(18px);
  border-bottom-color: var(--line);
}
/* 히어로 위에서 스크롤 중 — 어두운 유리.
   맨 위(y<=10)에서는 .scrolled가 없어 완전히 투명하고, 스크롤이 시작되는
   순간부터 이 배경이 깔린다. 이게 없으면 올라오는 히어로 글자가 투명한
   헤더와 겹쳐 읽을 수 없다. */
.site-header.scrolled.on-dark {
  background: color-mix(in srgb, var(--dark-bg) 72%, transparent);
  border-bottom-color: rgba(255, 255, 255, .10);
}

/* over-hero (top, transparent) — light text */
.site-header.on-dark { color: #fff; }
.site-header.on-dark .brand-name { color: #fff; }
.site-header.on-dark .nav-link { color: rgba(255,255,255,.86); }
.site-header.on-dark .lang-toggle { border-color: rgba(255,255,255,.3); color: #fff; }
.site-header.on-dark .menu-btn span { background: #fff; }

/* 메뉴가 열리면 헤더 뒤 배경은 밝은 오버레이가 된다. 이때 .on-dark(흰 글자)가
   남아 있으면 로고와 햄버거가 흰색 위 흰색이 돼 사라진다 — on-dark보다 뒤에
   두어 확실히 덮어쓴다. */
.site-header.menu-open { color: var(--text); }
.site-header.menu-open .brand-name,
.site-header.menu-open .nav-link { color: var(--text); }
.site-header.menu-open .menu-btn span { background: var(--text); }
.site-header.menu-open .lang-toggle { border-color: var(--line-strong); color: var(--text); }

.brand { display: inline-flex; align-items: center; gap: 11px; }
.brand-logo { height: 40px; width: auto; display: block; }
.brand-logo-white { display: none; }
.site-header.on-dark .brand-logo-color { display: none; }
.site-header.on-dark .brand-logo-white { display: block; }
/* 로고 교체는 .on-dark와 특정도가 같으므로(클래스 3개) 반드시 그 뒤에 와야
   메뉴 열린 상태에서 컬러 로고로 되돌아온다. 위로 옮기지 말 것. */
.site-header.menu-open .brand-logo-color { display: block; }
.site-header.menu-open .brand-logo-white { display: none; }
/* 두 법인을 헤더에도 병기한다(2026-07-28 확정). 한 줄로 다 펴면 데스크톱에선
   내비와 부딪히고 폰에선 넘치므로, 좁아지면 두 줄로 내리고 가운데 점을 숨긴다.
   점은 한 줄일 때만 뜻이 있는 구분자라 마크업에서도 aria-hidden 처리돼 있다. */
.brand-name { font-size: 17px; font-weight: 800; letter-spacing: -0.03em; color: var(--text); line-height: 1.2; white-space: nowrap; }
.brand-name .bn-sep { color: var(--text-faint); margin: 0 .3em; }
@media (max-width: 1240px) {
  .brand-name { display: flex; flex-direction: column; align-items: flex-start; font-size: 13.5px; line-height: 1.24; }
  .brand-name .bn-sep { display: none; }
}

.nav { display: flex; align-items: center; gap: clamp(18px, 2.4vw, 40px); flex: none; }
.nav-link {
  position: relative; font-size: 15.5px; font-weight: 500; color: var(--text); padding: 6px 2px;
  transition: color .25s; white-space: nowrap;
}
.nav-link::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -2px; height: 2px;
  background: currentColor; transform: scaleX(0); transform-origin: left; transition: transform .3s var(--ease);
}
.nav-link:hover::after, .nav-link.active::after { transform: scaleX(1); }
.nav-link.active { color: var(--c-accent); }
.site-header.on-dark .nav-link.active { color: #fff; }

.header-right { display: flex; align-items: center; gap: 16px; }
.lang-toggle {
  display: inline-flex; align-items: center; border: 1px solid var(--line-strong); border-radius: 999px;
  overflow: hidden; font-size: 12.5px; font-weight: 700; height: 32px; color: var(--text);
}
.lang-toggle button {
  appearance: none; background: none; border: 0; color: inherit; cursor: pointer;
  padding: 0 11px; height: 100%; font: inherit; opacity: .55; transition: opacity .2s, background-color .2s, color .2s;
}
.lang-toggle button.on { opacity: 1; background: var(--c-accent); color: #fff; }
/* 터치용(모바일 메뉴 안) — 손가락 최소 타겟 44px */
.lang-toggle.lg { height: 44px; font-size: 14px; }
.lang-toggle.lg button { padding: 0 18px; }

/* 헤더 견적문의 버튼 — 인라인 style로 두면 좁은 화면에서 줄일 수 없다 */
.btn-quote { padding: 11px 20px; font-size: 14.5px; }

.menu-btn { display: none; width: 44px; height: 44px; border: 0; background: none; cursor: pointer; flex-direction: column; gap: 5px; align-items: center; justify-content: center; }
.menu-btn span { width: 22px; height: 2px; background: var(--text); border-radius: 2px; transition: transform .3s, opacity .3s; }

/* mobile menu */
.mobile-nav {
  position: fixed; inset: 0; z-index: 99; background: color-mix(in srgb, var(--bg) 96%, transparent);
  -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px);
  display: flex; flex-direction: column; justify-content: center; gap: 8px; padding: var(--pad-x);
  /* visibility (not just opacity) so closed links leave the tab order and the
     a11y tree; delayed to 0s so the fade-out still plays. */
  opacity: 0; pointer-events: none; visibility: hidden;
  transition: opacity .35s var(--ease), visibility 0s linear .35s;
}
.mobile-nav.open {
  opacity: 1; pointer-events: auto; visibility: visible;
  transition: opacity .35s var(--ease), visibility 0s;
}
.mobile-nav a { font-size: clamp(28px, 8vw, 44px); font-weight: 700; letter-spacing: -0.02em; padding: 10px 0; color: var(--text); }
/* 모바일 메뉴는 세로 중앙 정렬이라, 주소창이 접혔다 펴지며 높이가 줄면 위아래가
   잘린다. 넘칠 때만 스크롤되도록. */
.mobile-nav { overflow-y: auto; -webkit-overflow-scrolling: touch; }
.mobile-nav a.active { color: var(--c-accent); }

/* ---------- footer ---------- */
.site-footer { background: var(--dark-bg); color: var(--dark-text); padding-block: clamp(44px, 6vw, 88px) 30px; }
.site-footer a { color: var(--dark-soft); transition: color .2s; }
.site-footer a:hover { color: var(--dark-text); }
.footer-top { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 48px; align-items: start; }
.footer-logo { width: 92px; opacity: .96; margin-bottom: 20px; }
/* 두 법인명을 밝히는 줄 — 로고 바로 아래, 소개 문단 위 */
.footer-legal { color: var(--dark-text); font-weight: 700; font-size: 15.5px; margin-bottom: 10px; letter-spacing: -0.01em; }
.footer-desc { color: var(--dark-soft); max-width: 34ch; font-size: 15px; line-height: 1.55; }
.footer-col h4 { font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--dark-soft); margin-bottom: 12px; font-weight: 700; }
/* gap 대신 링크 자체에 세로 패딩 — 그래야 손가락 타겟이 44px가 된다
   (gap으로 벌리면 간격만 넓어지고 누를 수 있는 영역은 그대로다).
   ※ 15px×1.65 + 위아래 10px = 44.75px. 푸터가 성기다고 이 패딩을 줄이면
     타겟이 44px 밑으로 떨어진다 — 촘촘하게 만들 땐 제목·설명·바깥 여백을
     줄일 것(2026-07-30에 그렇게 조정했다). */
.footer-col ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; font-size: 15px; }
.footer-col ul li { display: flex; }
.footer-col ul a { display: block; padding: 10px 0; }
/* 주소는 누르는 곳이 아니라 44px 규칙 대상이 아니다 — 여기서 여백을 줄인다. */
.footer-col ul li.addr { padding: 5px 0; line-height: 1.5; }
.footer-bottom {
  margin-top: clamp(28px, 5vw, 72px); padding-top: 20px; border-top: 1px solid rgba(255,255,255,.12);
  display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap;
  font-size: 13px; color: var(--dark-soft); line-height: 1.5;
}
/* 영문 법인명은 항상 다음 줄. 한 줄에 붙이면 좁은 화면에서 "Ltd."만 홀로 넘어간다. */
.footer-bottom .copy-en { display: block; }
/* 사업자등록번호 — 좁으면 법인마다 한 줄, 넓으면 한 줄에 구분선.
   .biz에 nowrap을 줘서 상호와 번호가 서로 다른 줄로 갈라지지 않게 한다. */
.footer-bottom .biz-no { display: flex; flex-direction: column; gap: 3px; }
.footer-bottom .biz { white-space: nowrap; }
@media (min-width: 721px) {
  .footer-bottom .biz-no { flex-direction: row; gap: 14px; }
  .footer-bottom .biz + .biz::before { content: "|"; margin-right: 14px; color: rgba(255,255,255,.28); }
}

/* ---------- reveal animations ---------- */
[data-reveal] { opacity: 0; transform: translateY(34px); transition: opacity .9s var(--ease), transform .9s var(--ease); will-change: opacity, transform; }
[data-reveal].in { opacity: 1; transform: none; }
[data-reveal][data-delay="1"] { transition-delay: .08s; }
[data-reveal][data-delay="2"] { transition-delay: .16s; }
[data-reveal][data-delay="3"] { transition-delay: .24s; }
[data-reveal][data-delay="4"] { transition-delay: .32s; }
[data-reveal][data-delay="5"] { transition-delay: .40s; }
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1 !important; transform: none !important; }
  html { scroll-behavior: auto; }
}

/* ---------- 히어로 없는 내부 페이지 ----------
   2026-07-28 고객 요청으로 소개·사업분야·사업실적·고객센터의 첫 히어로를 걷어냈다.
   헤더가 position:fixed라 히어로가 없어지면 본문 첫 줄이 헤더 밑에 깔린다.
   그래서 <main class="no-hero">가 헤더 높이만큼 자리를 만들어 준다.
   (.sub-nav의 sticky top도 같은 --header-h를 쓰므로 탭은 그대로 붙는다.) */
main.no-hero { padding-top: var(--header-h); }

/* 히어로를 걷어내면서 그 안에 있던 <h1>도 같이 사라졌다. 화면에는 필요 없지만
   페이지마다 h1 하나는 있어야 스크린리더 목차와 검색 결과 제목이 성립한다.
   눈에는 안 보이고 읽기 도구에만 남는 제목. */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
}

/* ---------- page hero (interior pages) ---------- */
.page-hero {
  position: relative; min-height: clamp(360px, 56vh, 600px); display: flex; align-items: flex-end;
  background: var(--hero-grad); color: #fff; overflow: hidden; padding-bottom: clamp(48px, 6vw, 80px);
  padding-top: calc(var(--header-h) + 40px);
}
.page-hero::after { content: ""; position: absolute; inset: 0; background:
  radial-gradient(80% 60% at 85% 120%, color-mix(in srgb, var(--c-accent) 38%, transparent), transparent 70%); opacity: .8; }
.page-hero .wrap-wide { position: relative; z-index: 2; }
.page-hero h1 { font-size: var(--fs-display); max-width: 18ch; }
.page-hero .eyebrow { color: #fff; }
.page-hero .eyebrow::before { background: #fff; }
.page-hero .lead { color: rgba(255,255,255,.78); max-width: 56ch; margin-top: 22px; }
.page-hero .crumb { font-size: 13px; color: rgba(255,255,255,.6); margin-bottom: 22px; letter-spacing: .04em; }

/* ---------- generic cards / grids ---------- */
.grid { display: grid; gap: clamp(18px, 2vw, 30px); }
.g-2 { grid-template-columns: repeat(2, 1fr); }
.g-3 { grid-template-columns: repeat(3, 1fr); }
.g-4 { grid-template-columns: repeat(4, 1fr); }

.card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: clamp(26px, 2.4vw, 40px); transition: transform .5s var(--ease), box-shadow .5s, border-color .5s;
}
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); border-color: transparent; }
.card .num { font-size: var(--fs-small); font-weight: 700; color: var(--c-accent); letter-spacing: .08em; }
.card h3 { font-size: var(--fs-h3); margin: 14px 0 12px; }
.card p { color: var(--text-soft); font-size: var(--fs-body); }

/* section heading block */
.sec-head { max-width: 760px; }
.sec-head.center { margin-inline: auto; text-align: center; }
.sec-head h2 { font-size: var(--fs-h2); margin-top: 18px; }
.sec-head p { margin-top: 18px; }

/* stat figure */
.stat-num { font-size: clamp(48px, 7vw, 104px); font-weight: 800; letter-spacing: -0.04em; line-height: .95; color: var(--text); }
.stat-num .unit { font-size: .42em; font-weight: 700; color: var(--c-accent); margin-left: 6px; letter-spacing: -0.01em; }
.stat-label { color: var(--text-soft); margin-top: 12px; font-size: var(--fs-body); }

/* ============================================================
   SHARED COMPONENTS (V2) — process, tables, org, ideology
   ============================================================ */

/* --- sub-section anchor nav (sticky tabs) --- */
.sub-nav { position: sticky; top: var(--header-h); z-index: 40; background: color-mix(in srgb,var(--bg) 88%,transparent); -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px); border-bottom: 1px solid var(--line); }
/* 가로 스크롤 탭 — 모바일에서 손가락으로 넘길 때 탭 단위로 물리게 */
.sub-nav .wrap-wide { display: flex; gap: clamp(10px,2vw,30px); overflow-x: auto; padding-block: 7px; scrollbar-width: none; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; overscroll-behavior-x: contain; }
.sub-nav .wrap-wide::-webkit-scrollbar { display: none; }
/* 세로 패딩 11px + 본문 22px ≈ 44px 터치 타겟 */
.sub-nav a { font-size: 15px; font-weight: 600; color: var(--text-soft); white-space: nowrap; padding: 11px 2px; border-bottom: 2px solid transparent; transition: color .2s, border-color .2s; scroll-snap-align: start; }
.sub-nav a:hover, .sub-nav a.active { color: var(--c-accent); border-bottom-color: var(--c-accent); }

/* --- section title (numbered) --- */
.sec-num-head { display: flex; align-items: baseline; gap: 18px; margin-bottom: clamp(28px,3vw,44px); flex-wrap: wrap; }
.sec-num-head .n { font-size: clamp(30px,3.4vw,52px); font-weight: 800; letter-spacing: -0.03em; color: color-mix(in srgb,var(--c-accent) 34%, var(--line-strong)); line-height: 1; }
.sec-num-head h2 { font-size: var(--fs-h2); letter-spacing: -0.02em; }
.badge-row { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; }
.badge { font-size: 13px; font-weight: 700; padding: 6px 13px; border-radius: 999px; background: var(--accent-tint); color: var(--accent-strong); border: 1px solid color-mix(in srgb,var(--c-accent) 18%, transparent); }
.badge.co { background: var(--bg-alt); color: var(--text-soft); border-color: var(--line-strong); }

/* --- process steps --- */
.steps { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; counter-reset: step; }
.step { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 22px 18px; text-align: center; transition: transform .4s var(--ease), box-shadow .4s, border-color .4s; }
.step:hover { transform: translateY(-4px); box-shadow: var(--shadow-lift); border-color: transparent; }
.step .sn { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; border-radius: 50%; background: var(--accent-tint); color: var(--accent-strong); font-weight: 800; font-size: 16px; margin-bottom: 14px; }
.step:hover .sn { background: var(--c-accent); color: #fff; }
.step p { font-size: 14.5px; font-weight: 600; color: var(--text); line-height: 1.35; }
.step::after { content: ""; position: absolute; top: 42px; right: -12px; width: 12px; height: 2px; background: var(--line-strong); z-index: 1; }
.step:last-child::after { display: none; }

/* --- data / spec table --- */
.spec-table { width: 100%; border-collapse: collapse; font-size: 15px; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.spec-table caption { text-align: left; font-weight: 700; font-size: var(--fs-h3); color: var(--text); padding: 0 0 16px; caption-side: top; }
.spec-table th, .spec-table td { padding: 14px 18px; text-align: left; border-bottom: 1px solid var(--line); vertical-align: top; }
.spec-table thead th { background: var(--bg-alt); color: var(--text); font-weight: 700; font-size: 14px; letter-spacing: .02em; }
.spec-table tbody tr:last-child td { border-bottom: 0; }
.spec-table tbody tr:hover td { background: color-mix(in srgb,var(--c-accent) 4%, var(--surface)); }
.spec-table .c { text-align: center; white-space: nowrap; }
.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.table-scroll .spec-table { min-width: 640px; }
/* focusable (tabindex=0) so the table can be panned by keyboard where it
   overflows — needs a visible ring when it takes focus that way. */
.table-scroll:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 3px; border-radius: var(--radius-s); }

/* --- 좁은 화면: 표를 가로 스크롤 대신 행별 카드로 --- */
/* 폰에서 옆으로 미는 표는 오른쪽에 내용이 있다는 걸 알아채기도 어렵고 조작도
   힘들다. 그래서 헤더를 숨기고 각 행을 카드로 세운 뒤, 칸마다 원래 열 이름을
   ::before로 붙인다. 열 이름은 td의 data-ko/data-en에서 읽으므로 언어 전환도
   따라간다 — 표를 만드는 쪽에서 이 두 속성을 꼭 넣어야 한다. */
/* 선택자에 .table-scroll을 붙여 특정도를 올린 이유: projects.html·services.html의
   <style>이 theme.css 뒤에 로드돼서, 같은 특정도(.board-table td)로는 페이지쪽
   padding·border-bottom에 밀린다. 이 접두어를 떼지 말 것. */
@media (max-width: 720px) {
  .table-scroll { overflow-x: visible; }
  .table-scroll .spec-table,
  .table-scroll .board-table { min-width: 0; border: 0; background: transparent; border-radius: 0; }

  /* thead는 지우지 않고 화면에서만 숨긴다 — 스크린리더의 표 구조는 유지 */
  .table-scroll .spec-table thead, .table-scroll .board-table thead {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
  .table-scroll .spec-table tbody, .table-scroll .spec-table tr, .table-scroll .spec-table td,
  .table-scroll .board-table tbody, .table-scroll .board-table tr, .table-scroll .board-table td {
    display: block; width: auto;
  }

  .table-scroll .spec-table tr, .table-scroll .board-table tr {
    background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
    padding: 14px 16px; margin-bottom: 12px;
  }
  .table-scroll .spec-table tbody tr:hover td,
  .table-scroll .board-table tbody tr:hover td { background: transparent; }

  .table-scroll .spec-table td, .table-scroll .board-table td {
    border: 0; padding: 7px 0; text-align: left; white-space: normal; vertical-align: baseline;
    display: grid; grid-template-columns: 84px 1fr; gap: 12px; align-items: baseline;
  }
  .table-scroll .spec-table td::before, .table-scroll .board-table td::before {
    font-size: 12.5px; font-weight: 700; color: var(--text-faint); line-height: 1.5;
  }
  [data-lang="ko"] .table-scroll .spec-table td::before,
  [data-lang="ko"] .table-scroll .board-table td::before { content: attr(data-ko); }
  [data-lang="en"] .table-scroll .spec-table td::before,
  [data-lang="en"] .table-scroll .board-table td::before { content: attr(data-en); }
  /* .c는 넓은 화면에서 가운데 정렬용 — 카드에서는 의미가 없다 */
  .table-scroll .spec-table td.c, .table-scroll .board-table td.c { text-align: left; }

  /* 순번은 라벨 없이 카드 머리의 작은 번호로 */
  .table-scroll .board-table td.col-no {
    display: block; width: auto; padding: 0 0 8px;
    color: var(--c-accent); font-weight: 800; font-size: 13px; text-align: left;
  }
  .table-scroll .board-table td.col-no::before { content: none; }

  /* "등록된 실적이 없습니다" 행은 카드 분해 대상이 아니다 */
  .table-scroll .board-table tr.board-empty td { display: block; padding: 16px; text-align: center; }
  .table-scroll .board-table tr.board-empty td::before { content: none; }
}

/* --- item chips grid (분석 항목) --- */
.items-wrap { background: transparent; border: 0; border-radius: 0; padding: 0; }
.item-group + .item-group { margin-top: clamp(26px,3vw,40px); padding-top: clamp(26px,3vw,40px); border-top: 1px solid var(--line); }
.items-panel { background: transparent; border: 0; border-radius: 0; padding: 0; }
.ip-head { display: flex; align-items: baseline; gap: 12px; margin-bottom: 8px; padding-left: 15px; position: relative; }
.ip-head::before { content: ""; position: absolute; left: 0; top: 4px; bottom: 4px; width: 5px; border-radius: 3px; background: var(--c-accent); }
.item-group.ig-warn .ip-head::before { background: var(--c-warn); }
.item-group.ig-warn .ip-head .cnt { color: var(--c-warn); }
.ip-head h3 { font-size: var(--fs-h3); display: inline; }
.ip-head .cnt { font-size: 14px; font-weight: 700; color: var(--c-accent); }
.subgroup { display: grid; grid-template-columns: 190px 1fr; gap: clamp(16px,2.4vw,40px); padding: 13px 0 13px 15px; align-items: start; }
.sg-label { font-size: 15.5px; font-weight: 700; color: var(--text); }
.sg-label .sg-sub { display: block; font-size: 12.5px; font-weight: 500; color: var(--text-faint); margin-top: 4px; letter-spacing: .01em; }
.item-cloud { display: flex; flex-wrap: wrap; gap: 9px 22px; }
.item-cloud span { font-size: 14.5px; padding: 0; border: 0; border-radius: 0; background: transparent; color: var(--text-soft); white-space: nowrap; }
@media (max-width: 640px) { .subgroup { grid-template-columns: 1fr; gap: 10px; padding: 12px 0 12px 15px; } }

/* --- consultation strip --- */
.consult { display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; background: var(--accent-tint); border: 1px solid color-mix(in srgb,var(--c-accent) 16%,transparent); border-radius: var(--radius-l); padding: clamp(22px,2.4vw,32px) clamp(26px,3vw,40px); }
.consult .ct-l .t { font-weight: 700; font-size: var(--fs-h3); color: var(--text); }
.consult .ct-l .s { color: var(--text-soft); font-size: 15px; margin-top: 4px; }
.consult .ct-l .s a { color: var(--accent-strong); font-weight: 700; }

/* --- org chart --- */
.org { display: flex; flex-direction: column; align-items: center; gap: 0; }
.org-top { background: var(--c-accent); color: #fff; border-radius: 14px; padding: 16px 30px; font-weight: 800; font-size: var(--fs-h3); text-align: center; }
.org-note { font-size: 13px; color: var(--text-faint); margin-top: 6px; }
.org-connector { width: 2px; height: 30px; background: var(--line-strong); }
/* 칸 수는 조직이 바뀔 때마다 손대야 하는 곳이라 auto-fit으로 둔다 — 칸을 하나
   더 넣어도(2026-07-28 청정기술연구소) 마크업만 고치면 된다. */
.org-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 16px; width: 100%; position: relative; }
.org-col { display: flex; flex-direction: column; gap: 10px; position: relative; }
.org-col::before { content: ""; position: absolute; top: -30px; left: 50%; width: 2px; height: 30px; background: var(--line-strong); }
.org-col::after { content: ""; position: absolute; top: -30px; left: -8px; right: -8px; height: 2px; background: var(--line-strong); }
.org-col:first-child::after { left: 50%; }
.org-col:last-child::after { right: 50%; }
.org-head { background: var(--surface); border: 2px solid var(--c-accent); color: var(--accent-strong); border-radius: 12px; padding: 14px; font-weight: 700; text-align: center; font-size: 16px; }
.org-item { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; font-size: 14.5px; color: var(--text-soft); text-align: center; transition: border-color .3s, color .3s; }
.org-item:hover { border-color: var(--c-accent); color: var(--text); }

/* --- ideology diagram (경영이념) --- */
.ideology { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(16px,1.8vw,26px); }
.ideo-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-l); padding: clamp(26px,2.6vw,38px); position: relative; overflow: hidden; }
/* display:block 필수 — 마크업이 <span>이라 인라인이면 width/height가 무시되고
   안쪽 svg의 width:100%가 카드 폭 전체로 부풀어 아이콘이 거대해진다. */
.ideo-card .ideo-ic { display: block; width: 46px; height: 46px; color: var(--c-accent); margin-bottom: 18px; }
.ideo-card .ideo-ic svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.6; }
.ideo-card .who { font-size: 13px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; color: var(--c-accent); }
.ideo-card h3 { font-size: var(--fs-h3); margin: 6px 0 14px; }
.ideo-card ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.ideo-card li { font-size: 15px; color: var(--text-soft); padding-left: 18px; position: relative; }
.ideo-card li::before { content: ""; position: absolute; left: 0; top: 9px; width: 6px; height: 6px; border-radius: 50%; background: var(--c-accent); }
/* start 정렬 — center로 두면 두 칼럼의 높이가 달라(비전이 더 김) 각각 세로
   중앙에 놓이면서 '사훈'과 '비전' 라벨의 높이가 어긋난다. */
.vision-band { margin-top: clamp(18px,2vw,26px); background: var(--dark-bg); color: var(--dark-text); border-radius: var(--radius-l); padding: clamp(28px,3vw,44px); display: grid; grid-template-columns: auto 1fr; gap: clamp(24px,4vw,60px); align-items: start; }
.vision-band .vlabel { font-size: 13px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase; color: var(--dark-soft); }
.vision-band .vmotto { font-size: clamp(20px,2vw,30px); font-weight: 800; letter-spacing: -0.02em; margin-top: 8px; }
.vision-band .vmotto .accent { color: color-mix(in srgb,var(--c-accent) 72%,#fff); }
.creed { display: flex; gap: 14px; flex-wrap: wrap; }
/* 직계 자식만 — 자손 선택자로 두면 안쪽 .lang-ko/.lang-en 까지 알약이 돼
   칩 안에 칩이 하나 더 그려진다. */
.creed > span { font-size: clamp(18px,1.8vw,26px); font-weight: 800; letter-spacing: -0.01em; padding: 9px 22px; border-radius: 999px; background: color-mix(in srgb, var(--c-accent) 30%, transparent); color: #fff; }

.btn-sm { font-size: 13.5px; padding: 9px 16px; border-radius: 999px; }

@media (max-width: 900px) {
  .steps { grid-template-columns: repeat(3, 1fr); }
  .step::after { display: none; }
  .ideology { grid-template-columns: 1fr; }
  .org-cols { grid-template-columns: 1fr 1fr; }
  .org-col::before, .org-col::after { display: none; }
  .vision-band { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .steps { grid-template-columns: repeat(2, 1fr); }
  .org-cols { grid-template-columns: 1fr; }
}

/* responsive */
@media (max-width: 980px) {
  .g-4 { grid-template-columns: repeat(2, 1fr); }
  .g-3 { grid-template-columns: repeat(2, 1fr); }
  .footer-top { grid-template-columns: 1fr 1fr; gap: 36px; }
}
/* 좁아지기 시작하면 내비를 접기 전에 간격·글자부터 줄여 최대한 버틴다.
   가로 메뉴는 한 번 접히면 방문자가 두 번 눌러야 이동할 수 있어, 접는 건
   정말 안 들어갈 때만 한다. */
@media (max-width: 1000px) {
  .site-header .wrap-wide { gap: 14px; }
  .brand { gap: 8px; }
  .nav { gap: 16px; }
  .nav-link { font-size: 14.5px; }
  .header-right { gap: 10px; }
  .btn-quote { padding: 10px 15px; font-size: 13.5px; }
}
/* 데스크톱 가로 메뉴를 햄버거로 접는 기준.
   예전엔 980px이었는데, 화면 배율을 올려 쓰는 PC에서는(예: 150% 확대 → 1440px
   모니터가 CSS 960px로 잡힌다) 멀쩡한 데스크톱인데도 메뉴가 통째로 숨어버렸다.
   위 1000px 규칙으로 줄인 상태에서 헤더가 실제로 필요한 폭을 재보면 700px
   남짓이라, 기준을 760px로 내렸다. 다시 올리지 말 것. */
@media (max-width: 760px) {
  .nav { display: none; }
  .menu-btn { display: flex; }
  .header-right { gap: 8px; }
  .site-header .wrap-wide { gap: 12px; }
}
@media (max-width: 720px) {
  .g-2, .g-3, .g-4 { grid-template-columns: 1fr; }
  /* 한 칸으로 쌓이면 칸 사이 간격이 그대로 세로 여백이 된다 — 48px는 너무 성기다. */
  .footer-top { grid-template-columns: 1fr; gap: 26px; }
  /* 바로가기 4개를 2열로 — 링크 하나의 높이(44px 타겟)는 그대로 두고 줄 수만 절반으로
     줄인다. 세로로 성기던 푸터를 줄이는 방법은 이것뿐이다(패딩을 깎으면 타겟이 무너진다).
     ※ 항목이 짧은 이 칸에만 적용. 문의 칸은 이메일·주소가 길어 2열로 만들면 되레 깨진다. */
  .footer-links ul { display: grid; grid-template-columns: 1fr 1fr; column-gap: 16px; }
}
/* 헤더 한 줄 = 로고 40 + gap 8 + 회사명(두 줄) 92 + gap 12 + 견적문의 98 + gap 8
   + 햄버거 44 ≈ 302px. 360px(갤럭시 S 계열 최소폭)에서 쓸 수 있는 폭이 320px이라
   그대로 들어가므로, 그보다 좁을 때만 글자 로고를 접는다. 흔한 아이폰 폭(390·393)
   에서 회사명이 사라지지 않도록 기준을 400이 아니라 359로 둔 것 — 올리지 말 것.
   ※ display:none이 위 1240px 규칙의 display:flex를 덮으려면 이 블록이 뒤에 있어야
     한다(특정도가 같아 순서로 결정된다). 위로 옮기지 말 것. */
@media (max-width: 359px) {
  .brand-name { display: none; }
  .btn-quote { padding: 10px 14px; font-size: 13.5px; }
  .site-header .wrap-wide { gap: 10px; }
}

/* 터치 기기에서는 hover 상태가 '탭 후 고착'되거나 아예 발생하지 않는다.
   장식용 hover는 마우스가 있는 환경으로 한정. */
@media (hover: none) {
  .card:hover, .step:hover { transform: none; box-shadow: none; border-color: var(--line); }
  .org-item:hover { border-color: var(--line); color: var(--text-soft); }
}

/* ---------- photos (shared) ---------- */
.photo {
  position: relative; overflow: hidden; margin: 0;
  border-radius: var(--radius); border: 1px solid var(--line);
  background: var(--bg-alt); aspect-ratio: 4 / 3;
}
.photo img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .7s var(--ease); }
.photo:hover img { transform: scale(1.045); }
.photo figcaption {
  position: absolute; inset: auto 0 0 0; padding: 40px 18px 15px;
  background: linear-gradient(to top, rgba(12,14,18,.74), rgba(12,14,18,.28) 55%, transparent);
  color: #fff; font-size: 14px; font-weight: 600; letter-spacing: -0.01em; line-height: 1.35;
}
.photo.tall { aspect-ratio: 3 / 4; }
.photo.wide { aspect-ratio: 16 / 9; }

.photo-strip { display: grid; gap: clamp(12px, 1.4vw, 20px); }
.photo-strip.c2 { grid-template-columns: repeat(2, 1fr); }
.photo-strip.c3 { grid-template-columns: repeat(3, 1fr); }
.photo-strip.c4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 860px) {
  .photo-strip.c3, .photo-strip.c4 { grid-template-columns: 1fr 1fr; }
  .photo-strip.c2 { grid-template-columns: 1fr; }
}
@media (max-width: 520px) {
  .photo-strip.c3, .photo-strip.c4 { grid-template-columns: 1fr; }
}
