/* ===== H7 HYBRID — dark canvas + lime accent ===== */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  --bg:           #0B0B0E;
  --bg-elev:      #15151A;
  --bg-elev-hi:   #1C1C22;
  --fg:           #F2F2F5;
  --muted:        #B5B5BC;
  --subtle:       #8E8E96;
  --border:       rgba(255,255,255,0.08);
  --border-strong:rgba(255,255,255,0.16);
  --accent:       #C9F23A;
  --accent-hover: #B5DE2C;
  --accent-fg:    #0B0B0E;
  --danger:       #FF7A8A;
  --success:      #6FE3A2;
  /* ★--warn 은 «쓰이고 있었는데 정의가 없었다» — .legal-empty-title 과 .dl-msg-warn 이
     var(--warn) 을 부르지만 값이 없어 «그냥 물려받은 색»으로 떠 있었다(경고로 안 보인다).
     짝인 테두리 rgba(255,209,102,…) 가 원래 의도한 색을 그대로 말해준다 → #FFD166. */
  --warn:         #FFD166;
  --font:    'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
  --mono:    'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
  --width:   680px;
  --radius:  10px;

  /* ── 타이포 스케일 ──────────────────────────────────────────
     px 를 흩뿌리지 않고 여기서만 정의해 다른 페이지도 같은 축을 쓰게 한다.

     ★2026-08-07 척도 교체. 이전 축(본문 15 / 눈꺼풀 11 / 최솟값 8)은
       «이뻐 보이지만 안 읽힌다»는 지적을 받았다. 실제로 12px 미만이
       40곳 넘게 깔려 있었다. 코덱스(openai.com/codex) 실측값을 축으로 삼는다:
         H1 64 · H2 48 · H3 30 · 리드 22 · 본문 17 · 보조 15 · 캡션 14(최솟값)
       ★14px 가 바닥이다. 법적 고지·푸터도 예외 없다 — 읽으라고 있는 글이다. */
  --fs-hero: clamp(40px, 6vw, 64px);     /* 페이지 제목 */
  --fs-h2:   clamp(32px, 4.4vw, 48px);   /* 섹션 제목 */
  --fs-h3:   clamp(24px, 2.6vw, 30px);   /* 구간 소제목 */
  --fs-lead: 22px;                        /* 태그라인·리드 */
  --fs-body: 17px;                        /* 본문 */
  --fs-sm:   15px;                        /* 보조 설명 */
  --fs-xs:   14px;                        /* 캡션·눈꺼풀 라벨 — 바닥 */

  /* 읽는 축(폭). 섹션마다 다르면 스크롤할 때 좌우로 흔들린다 */
  --read:    720px;
  /* 넓은 축 — 큰 시각물(영상·스크린샷)과 카드 격자가 쓴다 */
  --wide:    1040px;
  --sp-section: 84px;   /* 구간 사이 여백 — 리듬을 여기 하나로 모은다 */
}

html { scroll-behavior: smooth; background: var(--bg); font-size: 100%; }
/* ★body 에 본문 크기를 «명시»한다. 전에는 html 이 80%(=12.8px)라
   클래스가 안 붙은 글자(버튼·b·설명 없는 p)가 전부 12.8px 로 떨어졌다.
   토큰을 아무리 올려도 그 글자들은 안 따라온다 — 바닥을 여기서 세운다. */
/* ★word-break: keep-all — 한글은 기본값이 «아무 글자 사이에서나» 줄바꿈이라
   「예시예요」가 「예시예 / 요」로 잘린다. 어절(띄어쓰기) 단위로만 끊게 한다.
   대신 끊을 데가 없는 긴 문자열(URL·이메일)은 overflow-wrap 으로 받아준다. */
body { background: var(--bg); color: var(--fg); font-family: var(--font); -webkit-font-smoothing: antialiased; font-size: var(--fs-body); line-height: 1.6; text-align: center; word-break: keep-all; overflow-wrap: break-word; }
a { color: inherit; text-decoration: none; }

::selection { background: var(--accent); color: var(--accent-fg); }

/* ===== NAV ===== */
header { position: sticky; top: 0; z-index: 100; background: rgba(11,11,14,0.72); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); }
/* ★`nav` 가 아니라 `header nav` 다 — 고디터 전용 내비도 <nav> 라
   범위를 안 좁히면 이 규칙(가운데 정렬·space-between·52px)이 거기까지 걸린다. */
header nav { max-width: var(--width); margin: 0 auto; padding: 0 24px; height: 64px; display: flex; align-items: center; justify-content: space-between; }
.logo { font-size: var(--fs-body); font-weight: 700; letter-spacing: -0.02em; color: var(--fg); }
.nav-links { display: flex; gap: 20px; }
.nav-links a { font-size: var(--fs-sm); color: var(--muted); transition: color 0.15s; }
.nav-links a:hover { color: var(--fg); }
.nav-links a:focus-visible { outline: none; color: var(--accent); }

/* ===== HERO ===== */
.hero { max-width: var(--width); margin: 0 auto; padding: 80px 24px 100px; text-align: center; }
.hero-badge { font-family: var(--mono); font-size: var(--fs-xs); color: var(--subtle); letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 24px; }
.hero-title {
  font-size: var(--fs-hero);
  font-weight: 800;
  letter-spacing: -0.04em;
  line-height: 1.06;
  margin-bottom: 24px;
  color: var(--fg);
}
.gradient-text {
  background: linear-gradient(135deg, var(--fg) 0%, var(--fg) 30%, var(--subtle) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.hero-sub { font-size: var(--fs-lead); color: var(--muted); margin-bottom: 40px; line-height: 1.6; }
.hero-cta { display: flex; align-items: center; justify-content: center; gap: 12px; }
.cta-primary {
  display: inline-block;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--accent);
  background: transparent;
  border: 1.5px solid var(--accent);
  padding: 9px 20px;
  border-radius: 20px;
  letter-spacing: -0.01em;
}
.cta-primary:hover { background: var(--accent); color: var(--accent-fg); border-color: var(--accent); }
.cta-primary:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(201,242,58,0.28); }
.cta-sep { color: var(--border-strong); font-size: var(--fs-sm); margin: 0 4px; }
.cta-secondary { font-size: var(--fs-sm); color: var(--subtle); transition: color 0.15s; }
.cta-secondary:hover { color: var(--fg); }
.cta-secondary:focus-visible { outline: none; color: var(--accent); }

/* ===== MAIN SECTIONS ===== */
main, .yt-section, footer { max-width: var(--width); margin: 0 auto; padding-left: 24px; padding-right: 24px; text-align: center; }
main { padding-bottom: 0; margin-top: 0; }
.section-label { font-size: var(--fs-xs); color: var(--subtle); margin-bottom: 16px; }

/* ===== APP GRID ===== */
.app-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; justify-items: center; }

.app-card {
  background: var(--bg-elev);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 12px;
  text-decoration: none;
  color: inherit;
  cursor: pointer;
  width: 100%;
}
.app-card:hover { border-color: var(--border-strong); background: var(--bg-elev-hi); }
.app-card:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(201,242,58,0.20); }

.app-icon { width: 48px; height: 48px; min-width: 48px; border-radius: 10px; background: rgba(255,255,255,0.06); flex-shrink: 0; display: flex; align-items: center; justify-content: center; overflow: hidden; font-size: 18px; }
.app-icon img { width: 100%; height: 100%; object-fit: cover; border-radius: 10px; }
.app-info { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 3px; width: 100%; }
.app-name { font-size: var(--fs-body); font-weight: 600; color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.app-tagline { font-size: var(--fs-sm); color: var(--muted); line-height: 1.4; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; text-align: center; }
.app-footer { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 8px; padding-top: 10px; border-top: 1px solid var(--border); width: 100%; }
.app-badge { font-family: var(--mono); font-size: var(--fs-xs); color: var(--accent); border: 1px solid rgba(201,242,58,0.32); border-radius: 4px; padding: 2px 5px; text-transform: lowercase; background: rgba(201,242,58,0.06); }
.app-arrow { font-size: var(--fs-body); color: var(--accent); opacity: 0; transform: translateX(-4px); transition: opacity 0.18s, transform 0.18s; }
.app-card:hover .app-arrow { opacity: 1; transform: translateX(0); }

/* ===== YOUTUBE ===== */
.yt-section { margin-top: 48px; padding-bottom: 0; }
.yt-list { list-style: none; }
.yt-item { display: flex; align-items: center; justify-content: center; flex-direction: column; gap: 4px; padding: 11px 0; border-bottom: 1px solid var(--border); text-align: center; }
.yt-item:first-child { border-top: 1px solid var(--border); }
.yt-title { font-size: var(--fs-sm); color: var(--fg); line-height: 1.4; max-width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.yt-date { font-family: var(--mono); font-size: var(--fs-xs); color: var(--subtle); flex-shrink: 0; }

/* ===== FOOTER ===== */
footer { padding-top: 0; padding-bottom: 56px; margin-top: 48px; }
hr { border: none; border-top: 1px solid var(--border); margin: 40px 0; }
.footer-inner { display: flex; align-items: center; justify-content: center; flex-direction: column; flex-wrap: wrap; gap: 12px; text-align: center; }
.footer-inner span { font-size: var(--fs-sm); color: var(--subtle); }
.footer-links { display: flex; justify-content: center; gap: 16px; }
.footer-links a { font-size: var(--fs-sm); color: var(--subtle); transition: color 0.15s; }
.footer-links a:hover { color: var(--fg); }
.footer-links a:focus-visible { outline: none; color: var(--accent); }

/* ===== ANIMATIONS ===== */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* 메인 카피 reveal — blur 해제 + 미세 lift (은근히) */
@keyframes revealCopy {
  from { opacity: 0; filter: blur(3px); transform: translateY(8px); }
  to   { opacity: 1; filter: blur(0);   transform: translateY(0); }
}
/* gradient-text 전용 — blur 없이 scale+lift (Safari -webkit-text-fill 충돌 방지) */
@keyframes revealCopyGradient {
  from { opacity: 0; transform: translateY(10px) scale(0.99); }
  to   { opacity: 1; transform: translateY(0)    scale(1); }
}

/* 메인 카피 waver — 감쇠 패턴, JS로 6~8s 간격 간헐 발동 */
@keyframes waver {
  0%   { transform: translateX(0)      rotate(0deg); }
  15%  { transform: translateX(-1.2px) rotate(-0.12deg); }
  30%  { transform: translateX(0.8px)  rotate(0.08deg); }
  45%  { transform: translateX(-0.6px) rotate(-0.06deg); }
  60%  { transform: translateX(0.4px)  rotate(0.04deg); }
  75%  { transform: translateX(-0.2px) rotate(-0.02deg); }
  90%  { transform: translateX(0.1px)  rotate(0.01deg); }
  100% { transform: translateX(0)      rotate(0deg); }
}
.title-waving {
  animation: waver 0.9s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}

/* floatBob — 진폭 6px, 3~4s */
@keyframes floatBob {
  0%, 100% { transform: translateY(0); }
  50%       { transform: translateY(-6px); }
}

/* Hero stagger */
.hero-badge    { animation: fadeUp 0.5s cubic-bezier(0.22,1,0.36,1) 0.05s both; }
.hero-title    { opacity: 1; } /* 줄별로 처리 */
.title-line-1  { display: block; animation: revealCopy 1.0s cubic-bezier(0.16,1,0.3,1) 0.10s both; }
.title-line-2  { display: block; animation: revealCopyGradient 1.0s cubic-bezier(0.16,1,0.3,1) 0.28s both; }
.hero-sub      { animation: fadeUp 0.5s cubic-bezier(0.22,1,0.36,1) 0.62s both; }
.hero-cta      { animation: fadeUp 0.5s cubic-bezier(0.22,1,0.36,1) 0.72s both; }

/* Hero app icons */
.hero-apps {
  display: flex;
  gap: 12px;
  margin-top: 48px;
  flex-wrap: wrap;
  justify-content: center;
}

.hero-app-pill {
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--bg-elev);
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 8px 12px 8px 8px;
  cursor: pointer;
  text-decoration: none;
  color: inherit;
  /* entrance: delay는 JS에서 inline으로 주입, backwards fill이 delay 중 투명 처리 */
  animation: fadeUp 0.45s cubic-bezier(0.22,1,0.36,1) both;
  transition: background 0.22s, border-color 0.22s,
              transform 0.4s cubic-bezier(0.22,1,0.36,1),
              box-shadow 0.4s cubic-bezier(0.22,1,0.36,1);
}

.hero-app-pill.bob-ready {
  animation: floatBob ease-in-out infinite;
  animation-fill-mode: none;
}

.hero-app-pill:hover {
  background: var(--bg-elev-hi);
  border-color: var(--border-strong);
  transform: translateY(-2px) scale(1.02);
  box-shadow: 0 6px 18px rgba(0,0,0,0.40);
}
.hero-app-pill:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(201,242,58,0.22);
}

.hero-app-pill-icon {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  background: rgba(255,255,255,0.06);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 14px;
  overflow: hidden;
  flex-shrink: 0;
}

.hero-app-pill-icon img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 8px;
}

.hero-app-pill-name {
  font-size: var(--fs-xs);
  font-weight: 600;
  color: var(--fg);
  letter-spacing: -0.01em;
  white-space: nowrap;
}

/* Card hover lift */
.app-card {
  transition: border-color 0.2s, background 0.2s,
              transform 0.35s cubic-bezier(0.22,1,0.36,1),
              box-shadow 0.35s cubic-bezier(0.22,1,0.36,1);
}
.app-card:hover {
  border-color: var(--border-strong);
  background: var(--bg-elev-hi);
  transform: translateY(-3px);
  box-shadow: 0 8px 24px rgba(0,0,0,0.40);
}

/* Card entrance via IntersectionObserver */
.card-hidden { opacity: 0; transform: translateY(16px); }
.card-visible { animation: fadeUp 0.5s cubic-bezier(0.22,1,0.36,1) both; }

/* YouTube items entrance */
.yt-hidden  { opacity: 0; transform: translateY(10px); }
.yt-visible { animation: fadeUp 0.4s cubic-bezier(0.22,1,0.36,1) both; }

/* CTA button spring */
.cta-primary {
  transition: background 0.18s, color 0.18s, border-color 0.18s,
              transform 0.3s cubic-bezier(0.22,1,0.36,1),
              box-shadow 0.3s cubic-bezier(0.22,1,0.36,1);
}
.cta-primary:hover {
  background: var(--accent);
  color: var(--accent-fg);
  border-color: var(--accent);
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(201,242,58,0.22);
}
.cta-primary:active { background: var(--accent-hover); border-color: var(--accent-hover); color: var(--accent-fg); transform: translateY(0); }

/* ===== APP DETAIL (goditor.html) ===== */
.detail { max-width: var(--read); margin: 0 auto; padding: 56px 24px 40px; text-align: center; }
/* ★히어로의 세로 리듬. gap 하나(26px)로 전부 처리하던 것을 요소별로 나눈다.
   간격이 하나면 뒤로가기·아이콘·제목·리드·버튼·주석이 전부 같은 거리로 붙어
   «한 덩어리»로 읽힌다 — 그게 «시원하지 않다»의 정체였다.
   코덱스는 간격 자체가 위계다: 아이콘↔제목 32 / 제목↔리드 24 / 리드↔버튼 40 / 버튼↔보조 20.
   ★음수 마진(-8px, -2px)은 전부 걷어냈다. 당겨 붙이는 건 답답함을 «만드는» 짓이다. */
.detail-inner { display: flex; flex-direction: column; align-items: center; gap: 0; }
/* 영문 전제로 짜인 스타일이 한글에 그대로 걸려 있었다 —
   uppercase 는 한글에 아무 효과가 없고, mono 는 한글 글리프가 없어 어차피 폴백된다.
   남는 건 letter-spacing 뿐이라 «앱  목록»처럼 자간만 벌어져 보였다. 셋 다 뺀다. */
.detail-back { font-size: var(--fs-xs); color: var(--subtle); transition: color 0.15s; align-self: center; }
.detail-back:hover { color: var(--fg); }
.detail-back:focus-visible { outline: none; color: var(--accent); }
.detail-header { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; }
.detail-icon { width: 72px; height: 72px; border-radius: 16px; background: var(--bg-elev); border: 1px solid var(--border); display: flex; align-items: center; justify-content: center; font-size: 27px; flex-shrink: 0; }
.detail-icon img { width: 100%; height: 100%; object-fit: cover; border-radius: 15px; display: block; }
.detail-meta { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 6px; min-width: 0; }
.detail-badge { font-size: var(--fs-xs); color: var(--subtle); }
.detail-title { font-size: var(--fs-hero); font-weight: 800; letter-spacing: -0.03em; line-height: 1.05; color: var(--fg); }
.detail-tagline { font-size: var(--fs-lead); color: var(--muted); line-height: 1.55; max-width: 48ch; }
.detail-desc { font-size: var(--fs-body); color: var(--muted); line-height: 1.8; text-align: left; max-width: 62ch; }
.detail-cta { display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap; }
.detail-note { font-size: var(--fs-sm); color: var(--subtle); line-height: 1.75; max-width: 62ch; text-align: left; }
.video-embed { display: flex; flex-direction: column; align-items: center; gap: 8px; margin: 8px 0; width: 100%; }
.video-frame { width: 100%; aspect-ratio: 16 / 9; border-radius: var(--radius); overflow: hidden; background: #000; border: 1px solid var(--border); }
.video-frame iframe { width: 100%; height: 100%; display: block; border: 0; }
.video-caption { font-size: var(--fs-xs); color: var(--subtle); text-align: center; }
.feature-list { list-style: none; display: flex; flex-direction: column; align-items: stretch; gap: 11px; width: 100%; max-width: 62ch; margin: 0 auto; }
.feature-list li { font-size: var(--fs-body); color: var(--muted); display: flex; gap: 10px; align-items: baseline; justify-content: flex-start; text-align: left; line-height: 1.65; }
.feature-dot { color: var(--accent); font-family: var(--mono); }

/* ===== SIGNUP (signup.html) ===== */
.signup { max-width: var(--width); margin: 0 auto; padding: 80px 24px 100px; text-align: center; }
.signup-inner { display: flex; flex-direction: column; align-items: center; gap: 16px; }
.signup-title { font-size: var(--fs-h2); font-weight: 800; letter-spacing: -0.03em; line-height: 1.1; margin-top: 4px; color: var(--fg); text-align: center; }
.signup-sub { font-size: var(--fs-sm); color: var(--muted); line-height: 1.7; margin-bottom: 16px; text-align: center; }
.signup-form { display: flex; flex-direction: column; align-items: center; gap: 10px; width: 100%; max-width: 360px; }
.signup-label { font-size: var(--fs-xs); color: var(--subtle); align-self: center; }
.signup-input {
  font-family: var(--font);
  font-size: var(--fs-body);
  color: var(--fg);
  background: var(--bg-elev);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 12px 14px;
  outline: none;
  text-align: center;
  width: 100%;
  transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
}
.signup-input::placeholder { color: var(--subtle); }
.signup-input:focus { border-color: var(--accent); background: var(--bg-elev-hi); box-shadow: 0 0 0 3px rgba(201,242,58,0.18); }
.signup-submit {
  align-self: center;
  font-family: var(--font);
  font-size: var(--fs-body);
  font-weight: 600;
  color: var(--accent);
  background: transparent;
  border: 1.5px solid var(--accent);
  padding: 9px 20px;
  border-radius: 20px;
  cursor: pointer;
  letter-spacing: -0.01em;
  margin-top: 6px;
  transition: background 0.18s, color 0.18s, border-color 0.18s,
              transform 0.3s cubic-bezier(0.22,1,0.36,1),
              box-shadow 0.3s cubic-bezier(0.22,1,0.36,1);
}
.signup-submit:hover {
  background: var(--accent);
  color: var(--accent-fg);
  border-color: var(--accent);
  transform: translateY(-2px);
  box-shadow: 0 8px 22px rgba(201,242,58,0.22);
}
.signup-submit:active { background: var(--accent-hover); border-color: var(--accent-hover); transform: translateY(0); }
.signup-submit:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(201,242,58,0.28); }
.signup-msg { font-size: var(--fs-sm); min-height: 18px; margin-top: 4px; text-align: center; }
.signup-msg-error { color: var(--danger); }
.signup-msg-ok { color: var(--success); }
.signup-fineprint { font-size: var(--fs-sm); color: var(--subtle); margin-top: 16px; text-align: center; }

/* ===== RESPONSIVE ===== */
@media (max-width: 600px) {
  /* .hero-title 축소 override 제거 — --fs-hero 가 이미 clamp 라 좁은 화면에서
     스스로 40px 로 내려간다. 두 군데서 크기를 정하면 축이 갈라진다. */
  .app-grid { grid-template-columns: 1fr; }
  .hero, main, .yt-section, footer { padding-left: 20px; padding-right: 20px; }
  header nav { padding: 0 20px; }
  .hero-apps { gap: 8px; margin-top: 40px; }
  .hero-app-pill { padding: 6px 10px 6px 6px; }
  .hero-app-pill-icon { width: 28px; height: 28px; font-size: 12px; }
  .hero-app-pill-name { font-size: var(--fs-xs); }
}

@media (prefers-reduced-motion: reduce) {
  .hero-badge, .hero-title, .title-line-1, .title-line-2,
  .hero-sub, .hero-cta, .hero-apps {
    animation: none; opacity: 1; transform: none; filter: none;
  }
  .hero-app-pill, .hero-app-pill.bob-ready { animation: none; opacity: 1; }
  .title-waving { animation: none; }
  .card-hidden { opacity: 1; transform: none; }
  .yt-hidden { opacity: 1; transform: none; }
  * { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; }
}

/* ===== PRICING (pricing.html) ===== */
/* 4단 카드는 680px 안에 안 들어간다 → 이 페이지만 넓은 컨테이너를 쓴다. 토큰·컴포넌트는 그대로 재사용. */
.pricing { max-width: 1040px; margin: 0 auto; padding: 8px 24px 64px; text-align: center; }
.pricing-inner { display: flex; flex-direction: column; align-items: center; gap: 16px; }
.pricing-title { font-size: var(--fs-h2); font-weight: 800; letter-spacing: -0.03em; line-height: 1.1; color: var(--fg); }
.pricing-sub { font-size: var(--fs-sm); color: var(--muted); line-height: 1.75; max-width: 62ch; text-wrap: balance; }

.event-banner {
  display: inline-flex; align-items: center; gap: 8px;
  background: rgba(201,242,58,0.08);
  border: 1px solid rgba(201,242,58,0.32);
  border-radius: 20px; padding: 8px 16px; margin-bottom: 4px;
}
.event-banner-tag { font-family: var(--mono); font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase; color: var(--accent); }
.event-banner-text { font-size: var(--fs-sm); font-weight: 600; color: var(--fg); }

.plan-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; width: 100%; margin-top: 30px; align-items: stretch; }
.plan-card {
  background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 28px 20px; display: flex; flex-direction: column; align-items: center; gap: 12px; text-align: center;
  transition: border-color 0.2s, background 0.2s, transform 0.35s cubic-bezier(0.22,1,0.36,1), box-shadow 0.35s cubic-bezier(0.22,1,0.36,1);
}
.plan-card:hover { border-color: var(--border-strong); background: var(--bg-elev-hi); transform: translateY(-3px); box-shadow: 0 8px 24px rgba(0,0,0,0.40); }
.plan-card-featured { border-color: rgba(201,242,58,0.42); }
.plan-ribbon { font-size: var(--fs-xs); color: var(--accent); }
/* ★리본이 한 카드에만 있으면 그 카드만 아래로 밀려 이름줄이 어긋난다.
   자리를 «항상» 비워둬서 네 장의 기준선을 맞춘다. */
/* 리본 없는 카드의 자리맞춤. ★고정 14px 이 아니라 «리본 한 줄의 실제 높이»여야
   등급 이름 baseline 이 네 장 모두 맞는다(--fs-xs × line-height 1.6). */
.plan-card::before { content: ''; display: block; font-size: var(--fs-xs); height: 1.6em; }
.plan-card:has(.plan-ribbon)::before { display: none; }
.plan-name { font-size: var(--fs-h3); font-weight: 700; letter-spacing: -0.02em; color: var(--fg); }
.plan-price { font-size: var(--fs-lead); font-weight: 700; letter-spacing: -0.02em; color: var(--fg); }
.plan-price-note { font-size: var(--fs-xs); color: var(--subtle); min-height: 21px; }
.plan-divider { width: 100%; border-top: 1px solid var(--border); margin: 6px 0; }
.plan-features { list-style: none; display: flex; flex-direction: column; gap: 9px; width: 100%; flex: 1; }
.plan-features li { font-size: var(--fs-sm); color: var(--muted); line-height: 1.6; display: flex; gap: 7px; align-items: baseline; justify-content: flex-start; text-align: left; }
.plan-features .feature-dot { color: var(--accent); font-family: var(--mono); flex-shrink: 0; }
.plan-features .plan-feature-tbd { color: var(--subtle); font-style: normal; opacity: 0.75; }
.plan-cta {
  font-family: var(--font); font-size: var(--fs-sm); font-weight: 600; color: var(--accent);
  background: transparent; border: 1.5px solid var(--accent); padding: 9px 18px; border-radius: 20px;
  cursor: pointer; letter-spacing: -0.01em; width: 100%; margin-top: 6px;
  transition: background 0.18s, color 0.18s, border-color 0.18s, transform 0.3s cubic-bezier(0.22,1,0.36,1), box-shadow 0.3s cubic-bezier(0.22,1,0.36,1);
}
.plan-cta:hover { background: var(--accent); color: var(--accent-fg); transform: translateY(-2px); box-shadow: 0 8px 22px rgba(201,242,58,0.22); }
.plan-cta:active { background: var(--accent-hover); border-color: var(--accent-hover); transform: translateY(0); }
.plan-cta:focus-visible { outline: none; box-shadow: 0 0 0 3px rgba(201,242,58,0.28); }
.plan-cta-quiet { color: var(--muted); border-color: var(--border-strong); }
.plan-cta-quiet:hover { background: var(--bg-elev-hi); color: var(--fg); border-color: var(--border-strong); box-shadow: none; }

/* 구매 신청 폼 — 카드 아래 인라인으로 펼쳐진다 */
.order-panel { width: 100%; max-width: 380px; margin-top: 28px; background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius); padding: 22px 20px; display: none; flex-direction: column; align-items: center; gap: 10px; }
.order-panel.is-open { display: flex; animation: fadeUp 0.35s cubic-bezier(0.22,1,0.36,1) both; }
.order-panel-title { font-size: var(--fs-body); font-weight: 700; color: var(--fg); }
.order-panel-plan { font-size: var(--fs-xs); color: var(--accent); }
.order-result { width: 100%; display: flex; flex-direction: column; gap: 8px; text-align: left; }
.order-result-row { display: flex; justify-content: space-between; gap: 12px; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); padding-bottom: 6px; }
.order-result-key { color: var(--subtle); flex-shrink: 0; }
.order-result-val { color: var(--fg); font-weight: 600; text-align: right; word-break: break-all; }
.order-warn { font-size: var(--fs-sm); color: var(--muted); line-height: 1.6; text-align: center; margin-top: 4px; }

@media (max-width: 900px) { .plan-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .plan-grid { grid-template-columns: 1fr; } .pricing { padding-left: 20px; padding-right: 20px; } }

/* ===== ACCOUNT STATUS (login.html 로그인 후) ===== */
.account-panel { width: 100%; max-width: 380px; background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius); padding: 22px 20px; display: none; flex-direction: column; align-items: center; gap: 12px; }
.account-panel.is-open { display: flex; animation: fadeUp 0.35s cubic-bezier(0.22,1,0.36,1) both; }
.account-rows { width: 100%; display: flex; flex-direction: column; gap: 8px; }
.account-row { display: flex; justify-content: space-between; gap: 12px; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); padding-bottom: 6px; }
.account-key { color: var(--subtle); }
.account-val { color: var(--fg); font-weight: 600; text-align: right; word-break: break-all; }
.account-val-accent { color: var(--accent); }
.login-alt { font-size: var(--fs-sm); color: var(--subtle); margin-top: 14px; }
.login-alt a { color: var(--accent); font-weight: 600; }
.login-alt a:hover { text-decoration: underline; }

/* 브랜드 마크 — 앱에서 넘어온 사용자가 같은 제품임을 알아보게 */
.brand-mark { width: 48px; height: 48px; border-radius: 11px; display: block; margin: 0 auto 2px; }

/* 결제수단 안내 — 버튼 누르기 전에 보이는 자리 */
.pay-notice {
  font-size: var(--fs-sm); color: var(--muted); line-height: 1.7;
  background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 10px 16px; max-width: 520px; margin: 4px auto 0;
}
.pay-notice strong { color: var(--fg); font-weight: 600; }
.pay-notice-tag {
  font-family: var(--mono); font-size: var(--fs-xs); letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--accent); margin-right: 8px;
}
.pay-notice-inline { max-width: 100%; font-size: var(--fs-sm); padding: 9px 12px; margin-bottom: 4px; }

/* «불러오는 중…» 같은 상태 문구. 전에는 HTML 안에 style="font-size:12px" 로
   박혀 있어 토큰을 올려도 안 따라왔다 — 클래스로 꺼내 축에 태운다. */
.dim { font-size: var(--fs-sm); color: var(--subtle); line-height: 1.7; }

/* 푸터 사업자정보 — data/business.json 값이 있을 때만 렌더된다 */
.footer-biz { font-size: var(--fs-sm); color: var(--subtle); line-height: 1.8; margin-top: 4px; max-width: 560px; }
.footer-biz-sep { margin: 0 8px; opacity: 0.4; }
.footer-biz-item { display: inline-block; white-space: nowrap; }

/* 더미(예시) 표식 — 자리표시자가 «진짜»로 읽히면 사고다. 눈에 띄게 둔다 */
.dummy-notice{
  font-size:var(--fs-sm); color:var(--muted); line-height:1.7;
  background:rgba(255,209,102,.07); border:1px solid rgba(255,209,102,.35);
  border-radius:var(--radius); padding:10px 16px; max-width:560px; margin:6px auto 0;
}
.dummy-notice b{color:var(--fg); font-weight:600}
.dummy-tag{
  display:inline-block; font-family:var(--mono); font-size:var(--fs-xs); letter-spacing:.06em;
  text-transform:uppercase; color:#FFD166; border:1px solid rgba(255,209,102,.5);
  background:rgba(255,209,102,.10); border-radius:4px; padding:1px 6px; margin-right:7px;
}
.dummy-tag-sm{font-size:var(--fs-xs); padding:0 4px; margin-right:4px}
.plan-per{font-size:var(--fs-sm); font-weight:500; color:var(--subtle); letter-spacing:0}
.plan-card-now{border-color:rgba(201,242,58,.42)}
.plan-feat-off{opacity:.42; text-decoration:line-through}
.plan-feat-off .feature-dot{color:var(--subtle); text-decoration:none}

/* 앱 페이지 안의 요금제 블록 — 상세는 680px 폭이라 4단이 안 들어간다.
   이 블록만 폭을 풀어준다(가운데 정렬 유지). */
/* ⚠️ 100vw + translateX(-50%) 로 폭을 넓히려 했더니 flex 부모 안에서 어긋나
   카드가 잘리고 버튼이 페이지 상단으로 튀었다. 요금제를 «독립 섹션»으로 빼서
   이미 검증된 .pricing(max-width 1040px) 규칙을 그대로 쓴다. */
/* ★요금제 절만 «작게» 되돌리던 두 override 를 뗐다(.plan-name 15px, 제목 clamp 26~34).
   축을 한 번 올려놓고 여기서 다시 깎으면 같은 위계의 글자가 페이지마다 달라진다.
   폭이 모자라면 글자를 줄이는 게 아니라 격자를 줄인다(아래 미디어쿼리). */
.pricing .plan-name{ font-weight:700; letter-spacing:-.02em; color:var(--fg); }

/* 이벤트 종료 후 결제 안내 — 접어둔다. 지금 크게 두면 «결제가 된다»고 오해한다 */
.future-pay{ margin-top:26px; border:1px solid var(--border); border-radius:var(--radius); background:var(--bg-elev); text-align:left; }
.future-pay summary{ cursor:pointer; padding:12px 18px; font-size:var(--fs-sm); color:var(--muted); list-style:none; }
.future-pay summary::-webkit-details-marker{ display:none; }
.future-pay summary::before{ content:'▸ '; color:var(--accent); }
.future-pay[open] summary::before{ content:'▾ '; }
.future-pay summary:hover{ color:var(--fg); }
.future-pay-body{ padding:0 18px 18px; display:flex; flex-direction:column; align-items:center; gap:12px; }
.order-launch{ display:flex; gap:8px; flex-wrap:wrap; justify-content:center; }
.order-launch .plan-cta{ width:auto; min-width:120px; margin-top:0; }
@media(max-width:560px){ .pricing-block{ padding:0 20px; } }

/* 다운로드 로그인 안내 모달 — UX 유도이지 보안 게이트가 아니다 */
/* ⚠️ (구) 다운로드 로그인 모달 스타일 — 마크업은 2026-08-07 에 지웠다(문구는 goditor.html 주석에).
   스타일만 남긴다: 모달이 다시 필요해지면 클래스 이름째 재사용된다. 지금은 아무 데서도 안 쓴다. */
.modal[hidden]{ display:none }
.modal{ position:fixed; inset:0; z-index:200; display:flex; align-items:center; justify-content:center; padding:20px }
.modal-backdrop{ position:absolute; inset:0; background:rgba(0,0,0,.72); backdrop-filter:blur(3px) }
.modal-box{ position:relative; background:var(--bg-elev); border:1px solid var(--border-strong); border-radius:14px;
  padding:26px 24px 20px; max-width:380px; width:100%; display:flex; flex-direction:column; align-items:center; gap:10px;
  box-shadow:0 20px 60px rgba(0,0,0,.6); animation:fadeUp .28s cubic-bezier(.22,1,.36,1) both }
.modal-title{ font-size:var(--fs-lead); font-weight:800; letter-spacing:-.02em; color:var(--fg); text-align:center }
.modal-sub{ font-size:var(--fs-sm); color:var(--muted); line-height:1.75; text-align:center }
.modal-sub b{ color:var(--fg) }
.modal-actions{ display:flex; gap:8px; align-items:center; margin-top:6px; flex-wrap:wrap; justify-content:center }
.modal-actions .plan-cta{ width:auto; min-width:96px; margin-top:0 }
.modal-close{ background:none; border:0; color:var(--subtle); font-size:var(--fs-sm); cursor:pointer; margin-top:2px; font-family:var(--font) }
.modal-close:hover{ color:var(--fg) }
.dl-resume{ color:var(--success) }
.dl-resume a{ color:var(--accent); font-weight:600 }
.cta-pulse{ box-shadow:0 0 0 3px rgba(201,242,58,.28) }

/* 가격 표기 — 예시 정가와 «지금 무료»를 함께 보여준다 */
.plan-amount{ font-size:var(--fs-lead); font-weight:700; letter-spacing:-.02em }
.plan-now{ display:block; font-size:var(--fs-xs); font-weight:600; color:var(--accent); margin-top:1px; letter-spacing:.02em }
.plan-price-note{ line-height:1.5 }
.plan-empty{ grid-column:1/-1; font-size:var(--fs-sm); color:var(--subtle); padding:20px 0 }
.pricing-apps{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:10px; width:100%; max-width:520px; margin-top:8px }
.dl-msg{ min-height:18px }
.dl-msg-ok{ color:var(--success) }
.dl-msg-warn{ color:var(--warn) }

/* ★확장 수집 구간 감싸개 — .signup-form 의 세로 flex 를 «그대로 통과»시켜야
   라벨·입력이 다른 필드와 같은 간격으로 선다. display:contents 가 그 일을 한다.
   단 [hidden] 을 이겨버리면 안 되므로 :not([hidden]) 으로 범위를 좁힌다. */
.ext-block:not([hidden]) { display: contents; }

/* ── 확장 가입 폼 (ttj 기준, 뉴스레터 제외) ── */
.signup-form-wide{ max-width:400px; }
.lbl-hint{ opacity:.5; font-weight:400; }
.field-row{ display:flex; gap:8px; width:100%; align-items:stretch; }
.field-row .signup-input{ flex:1; }
.field-btn{
  font-family:var(--font); font-size:var(--fs-sm); font-weight:600; white-space:nowrap;
  color:var(--muted); background:var(--bg-elev); border:1px solid var(--border-strong);
  border-radius:var(--radius); padding:0 14px; cursor:pointer;
}
.field-btn:hover:not(:disabled){ color:var(--fg); border-color:var(--accent); }
.field-btn:disabled{ opacity:.42; cursor:not-allowed; }
.field-note{ font-size:var(--fs-sm); color:var(--subtle); line-height:1.6; text-align:center; margin-top:-4px; }
.field-note b{ color:var(--muted); }


.agree-box{
  width:100%; background:var(--bg-elev); border:1px solid var(--border);
  border-radius:var(--radius); padding:12px 14px; display:flex; flex-direction:column; gap:9px; margin-top:6px;
}
.agree-item{ display:flex; align-items:flex-start; gap:9px; font-size:var(--fs-sm); color:var(--muted); cursor:pointer; text-align:left; line-height:1.6; }
.agree-item input{ margin-top:2px; accent-color:var(--accent); flex-shrink:0; }
.agree-item a{ color:var(--accent); text-decoration:underline; text-underline-offset:2px; }
.agree-all span b{ color:var(--fg); font-size:var(--fs-body); }
.agree-divider{ border-top:1px solid var(--border); }

/* ── 약관·개인정보 문서 ── */
.legal{ max-width:var(--width); margin:0 auto; padding:56px 24px 72px; text-align:left; }
.legal-inner{ display:flex; flex-direction:column; gap:14px; }
.legal-title{ font-size:var(--fs-h2); font-weight:800; letter-spacing:-.03em; color:var(--fg); }
.legal-meta{ font-size:var(--fs-xs); color:var(--subtle); }
.legal-sec{ margin-top:14px; }
.legal-h{ font-size:var(--fs-lead); font-weight:700; color:var(--fg); margin-bottom:6px; }
.legal-p{ font-size:var(--fs-body); color:var(--muted); line-height:1.85; margin-bottom:6px; }
.legal-empty{ background:var(--bg-elev); border:1px solid rgba(255,209,102,.35); border-radius:var(--radius); padding:22px 20px; text-align:center; }
.legal-empty-title{ font-size:var(--fs-lead); font-weight:700; color:var(--warn); margin-bottom:8px; }
.legal-empty-sub{ font-size:var(--fs-body); color:var(--muted); line-height:1.8; }
.legal-empty-sub a{ color:var(--accent); }

/* ── 아이콘 이중 라운딩 해소 ──────────────────────────────────
   goditor.png 은 «이미» 둥근 모서리가 구워져 있다(반경 = 변의 25%).
   그런데 컨테이너도 border-radius 로 또 깎고 있었다:
     .detail-icon 72px → PNG 18px vs CSS 16px  (+ border 1px 로 안쪽이 70px)
     .app-icon    48px → PNG 12px vs CSS 10px
   두 곡선이 어긋난 틈으로 컨테이너 배경·테두리가 초승달처럼 비쳤다.

   ★아이콘이 이미 «완성된 모양»이므로 컨테이너는 아무것도 하지 않는다.
     단 이모지 폴백(onerror 로 img 가 사라지는 경우)에는 배경이 필요하므로
     :has(img) 로 «이미지가 있을 때만» 물러나게 한다.
     onerror 가 img 를 지우면 :has 가 풀려 배경이 저절로 돌아온다. */
.detail-icon:has(img),
.app-icon:has(img),
.hero-app-pill-icon:has(img) {
  background: none;
  border: 0;
  border-radius: 0;
  overflow: visible;
}
/* PNG 가 이미 둥글다 — 여기서 또 깎으면 어긋난다 */
.detail-icon img,
.app-icon img,
.hero-app-pill-icon img,
.brand-mark {
  border-radius: 0;
}

/* ── 읽는 축 통일 ──────────────────────────────────────────────
   요금제 절이 1040px, 상세가 720px 이라 스크롤할 때 좌우로 흔들렸다.
   ★넓어야 하는 건 «카드 격자»뿐이다. 글은 상세와 같은 축에 둔다. */
.pricing-inner > .section-h,
.pricing-inner > .pricing-title,
.pricing-inner > .pricing-sub,
.pricing-inner > .dummy-notice,
.pricing-inner > .event-banner { max-width: var(--read); }
.pricing-inner > .future-pay { max-width: var(--read); width: 100%; }

/* ── 섹션 제목 ────────────────────────────────────────────────
   "주요 기능"이 눈꺼풀 라벨(10px)이라 본문보다 작았다 — 제목인데 제목으로 안 보인다.
   눈꺼풀(.section-label)은 그대로 두고, «진짜 제목» 한 단계를 만든다. */
.section-h {
  font-size: var(--fs-h2);
  font-weight: 800;
  letter-spacing: -0.02em;
  line-height: 1.25;
  color: var(--fg);
}
.detail-inner > .section-h { align-self: center; }

/* 구획 사이 여백 — 화면 한 개씩 비어 연결이 끊기던 것을 좁힌다 */
.detail hr { margin: 28px 0 20px; }
.detail-inner > .feature-list { margin-bottom: 4px; }
.video-embed { margin: 4px 0 0; }

@media (max-width: 700px) {
  .detail-desc, .detail-note, .detail-tagline, .feature-list { max-width: 100%; }
}

/* ── 인증 화면 (login / signup) — 담백한 형태 ───────────────────
   ★박스 입력을 «밑줄»로 바꾸는 것이 심플해 보이는 가장 큰 요인이다.
   기존 .signup-input 을 «대체»하지 않고 .auth 안에서만 모양을 바꾼다
   (다른 곳의 입력창은 그대로 — 룩어라이크 클래스를 새로 만들지 않는다). */
.auth { max-width: 400px; margin: 0 auto; padding: 64px 24px 72px; }
.auth-mark { width: 52px; height: 52px; display: block; margin: 0 auto 14px; }
/* ★display:block 이 UA 의 [hidden]{display:none} 을 이긴다(작성자 스타일이 세다).
   그래서 hidden 을 걸어놔도 «앱에서 안 왔는데» GODITOR 아이콘이 떠 있었다.
   .ext-block 에서 만난 것과 같은 함정 — display 를 주면 [hidden] 을 같이 적어야 한다. */
.auth-mark[hidden] { display: none; }
.auth-title { font-size: var(--fs-h2); font-weight: 800; letter-spacing: -.03em; text-align: center; color: var(--fg); }
.auth-sub { font-size: var(--fs-sm); color: var(--muted); text-align: center; line-height: 1.7; margin-top: 8px; }

.auth-card {
  margin-top: 26px; border: 1px solid var(--border); border-radius: 12px;
  padding: 26px 22px 22px; display: flex; flex-direction: column; gap: 4px; background: transparent;
}
/* 밑줄 입력 */
.auth-card .signup-input {
  background: transparent; border: 0; border-bottom: 1px solid var(--border-strong);
  border-radius: 0; padding: 13px 2px; text-align: left; font-size: var(--fs-body);
}
.auth-card .signup-input:focus { border-bottom-color: var(--accent); background: transparent; box-shadow: none; }
.auth-card .signup-input::placeholder { color: var(--subtle); }
.auth-card .signup-label { align-self: flex-start; margin-top: 12px; }
.auth-card .signup-form { max-width: 100%; gap: 2px; align-items: stretch; }
.auth-card .signup-submit {
  width: 100%; margin-top: 20px; padding: 13px 0; font-size: var(--fs-body); font-weight: 700;
  background: var(--accent); color: var(--accent-fg); border-color: var(--accent);
}
.auth-card .signup-submit:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: var(--accent-fg); }
.auth-card .signup-msg { text-align: center; }

/* ★카드 «밖» 하단 링크 한 줄 — 지금 우리에겐 이게 없었다 */
.auth-links {
  display: flex; align-items: center; justify-content: center; gap: 14px;
  margin-top: 20px; font-size: var(--fs-sm); color: var(--subtle);
}
.auth-links a { color: var(--muted); }
.auth-links a:hover { color: var(--fg); }
.auth-links .sep { color: var(--border-strong); }

@media (max-width: 560px) { .auth { padding: 48px 20px 56px; } }
.auth-inner { display: flex; flex-direction: column; align-items: center; }
.auth .auth-card { width: 100%; }
.auth-card .agree-box { margin-top: 18px; }
.auth-card .field-row { margin-top: 2px; }
.auth-card .field-btn { border-radius: 0; border: 0; border-bottom: 1px solid var(--border-strong); padding: 0 10px; }
.find-result { display: flex; flex-direction: column; align-items: center; text-align: center; }
.find-result[hidden] { display: none; }
.find-result-label { font-family: var(--mono); font-size: var(--fs-xs); color: var(--subtle); text-transform: uppercase; letter-spacing: .06em; }
.find-result-value { font-size: var(--fs-h3); font-weight: 700; color: var(--fg); margin: 8px 0 10px; letter-spacing: -.01em; word-break: break-all; }
.find-result-note { font-size: var(--fs-sm); color: var(--subtle); line-height: 1.7; }
.find-result-note a { color: var(--accent); }
.find-manual { font-size: var(--fs-body); color: var(--muted); line-height: 1.85; margin-bottom: 18px; }
.find-manual b { color: var(--fg); }

/* ── 구간 재설계 (5구간, 각 구간이 «한 가지»만 말한다) ──────────
   전에는 .detail 한 섹션에 뒤로가기·정체·CTA·영상·기능이 다 섞여 있었다.
   여백은 --sp-section 하나로 모아 리듬을 한 곳에서 조절한다. */
.detail { padding: 40px 24px var(--sp-section); }
/* ★영상과 기능은 «넓은 축»을 쓴다.
   영상은 코덱스의 큰 제품 스크린샷 자리다 — 본문 폭에 갇혀 있으면
   «큰 시각물»이 아니라 그냥 삽화가 된다. 읽는 글만 --read 로 잡아 준다. */
.showcase, .features { max-width: var(--wide); margin: 0 auto; padding: 0 24px var(--sp-section); }
/* 제목·리드는 읽는 글이므로 넓은 축을 따라가지 않는다 */
.features-inner { display: flex; flex-direction: column; align-items: stretch; gap: 14px; max-width: var(--read); margin: 0 auto; }
.features-inner > .section-h { text-align: center; }
.pricing { padding-top: 0; }

/* ★틀(머리·바닥)은 «가장 넓은 내용»만큼 넓어야 한다.
   내용이 1040px 인데 머리띠가 680px 이면 영상이 헤더 밖으로 삐져나온 것처럼 보인다.
   넓히는 건 «틀»뿐이고 읽는 글은 그대로 --read 축에 있다. */
header nav, footer { max-width: var(--wide); }

/* ── 내비 «한 줄» (소문의섬 › GODITOR + 구간 + 계정) ──────────────
   전에는 전역(53px) + 앱전용(47px) 두 줄로 화면 위 100px 을 이동수단이 먹었다.
   코덱스는 64px 한 줄이고, 제품 페이지인데도 «제품 전용 내비가 따로 없다».
   그래서 합쳤다. 왼쪽=계층+이동 / 오른쪽=계정 — 코덱스와 같은 배치다.

   ★.nav--app 은 고디터 페이지에만 붙는다. 다른 페이지의 header nav 는 그대로다. */
.nav-left { display: flex; align-items: center; gap: 10px; min-width: 0; }
.nav-crumb-sep { color: var(--subtle); font-size: var(--fs-sm); }
.nav-crumb-current { font-size: var(--fs-sm); font-weight: 700; color: var(--fg); letter-spacing: -0.01em; }
/* 구간 링크는 계층에서 한 칸 떨어뜨린다 — «어디에 있나»와 «어디로 가나»는 다른 말이다 */
.nav-sections { display: flex; align-items: center; gap: 20px; margin-left: 18px; }

.appnav-link {
  font-size: var(--fs-sm); color: var(--muted); transition: color 0.15s;
  display: inline-flex; align-items: center; gap: 6px;
  border-bottom: 1.5px solid transparent; padding: 4px 0;
}
a.appnav-link:hover { color: var(--fg); }
a.appnav-link:focus-visible { outline: none; color: var(--accent); }
/* 지금 보고 있는 구간 표시 — 아래 scrollspy 가 붙인다 */
.appnav-link.is-current { color: var(--fg); border-bottom-color: var(--accent); }
/* ★아직 없는 문서. 누를 수 없고, 그렇게 «보이게» 한다 */
.appnav-link.is-soon { color: var(--subtle); opacity: .6; cursor: default; }
/* 한글에 mono·letter-spacing 을 걸지 않는다 — «준비  중»처럼 자간만 벌어진다 */
.appnav-soon {
  font-size: var(--fs-xs); color: var(--subtle);
  border: 1px solid var(--border-strong); border-radius: 4px; padding: 1px 6px;
}

/* 고정 내비가 앵커 목적지를 덮지 않게 — 한 줄(64) + 숨쉴 틈.
   ★두 줄일 때는 118 이었다. 높이가 줄면 이 값도 같이 줄어야 한다. */
#overview, #pricing { scroll-margin-top: 88px; }

@media (max-width: 860px) {
  /* 좁아지면 «어디로 가나»(구간)가 «어디에 있나»(계층)보다 급하다 */
  .nav-crumb-sep, .nav-crumb-current { display: none; }
  .nav-sections { margin-left: 0; gap: 16px; }
}
@media (max-width: 620px) {
  /* 더 좁으면 준비 중 배지부터 접는다 — 링크 자체는 남긴다 */
  .appnav-soon { display: none; }
  .nav-sections { gap: 14px; }
}

/* ★«← 앱 목록» 뒤로가기 제거(현빈).
   히어로 패딩 안에 홀로 앉아 제목과 175px 떨어져 아무 관계도 못 맺고 있었다.
   상위로 가는 길은 이제 내비 왼쪽의 «소문의섬 ›» 이 맡는다 — 코덱스도 로고가 그 일을 한다.
   .detail-back 규칙은 남겨둔다: 다른 앱 상세가 생기면 그 페이지가 쓸 수도 있다. */

/* ── 히어로 세로 리듬 — 간격이 곧 위계다 ─────────────────────────
   상하 여백이 사실상 0이라 위아래 구간에 눌려 있었다. 코덱스처럼 크게 연다. */
.detail { padding-top: clamp(96px, 9vw, 128px); padding-bottom: clamp(96px, 9vw, 128px); }
.detail-header  { gap: 32px; }             /* 아이콘 ↔ 제목 */
.detail-meta    { gap: 24px; }             /* 제목  ↔ 리드 */
.detail-cta     { margin-top: 40px; }      /* 리드  ↔ 버튼 */
.detail-alt     { margin-top: 20px; }      /* 버튼  ↔ 보조 문구 */

/* ── 히어로 아이콘 진입 + 광택 + 호버 틸트 (현빈 E안) ───────────────
   ★컨테이너는 :has(img) 로 이미 radius 0 · overflow visible 이다
     (goditor.png 에 모서리가 «이미 구워져» 있어 컨테이너가 물러난 설계).
     그래서 광택을 overflow:hidden 으로 자르면 «네모로» 쓸린다.
     ⇒ 아이콘 PNG 자체를 마스크로 쓴다. 모서리 알파가 0이라(실측: 96×96, 네 모서리 알파 0,
       투명 5.5%) 실루엣이 정확히 맞고, ★아이콘 모양이 바뀌어도 CSS 를 안 고쳐도 된다.

   ★html.js 로 «잠근다» — 이 한 글자가 안전장치다.
     opacity:0 을 무조건 걸면 JS 가 안 도는 환경에서 히어로가 «통째로 안 보인다».
     .js 는 아래 부트 스크립트가 붙이므로, JS 가 없으면 애초에 감추지 않는다. */
html.js .detail-icon,
html.js .detail-title,
html.js .detail-lead { opacity: 0; transform: translateY(14px); }

.hero-in .detail-icon  { animation: heroRise .62s cubic-bezier(.2,.7,.2,1) 0s   forwards; }
.hero-in .detail-title { animation: heroRise .62s cubic-bezier(.2,.7,.2,1) .09s forwards; }
.hero-in .detail-lead  { animation: heroRise .62s cubic-bezier(.2,.7,.2,1) .18s forwards; }
@keyframes heroRise { to { opacity: 1; transform: none; } }

.detail-icon { position: relative; transition: box-shadow .18s ease-out; will-change: transform; }
.detail-icon::after {
  content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 2;
  background: linear-gradient(105deg, transparent 38%, rgba(255,255,255,.42) 50%, transparent 62%);
  background-size: 300% 100%; background-position: 150% 0; background-repeat: no-repeat;
  -webkit-mask-image: url(/assets/icons/goditor.png); mask-image: url(/assets/icons/goditor.png);
  -webkit-mask-size: 100% 100%;                       mask-size: 100% 100%;
}
.hero-in .detail-icon::after { animation: heroSheen 1.15s cubic-bezier(.4,0,.2,1) .62s; }
.detail-icon:hover::after    { animation: heroSheen 1.15s cubic-bezier(.4,0,.2,1); }
@keyframes heroSheen { from { background-position: 150% 0; } to { background-position: -50% 0; } }

/* 틸트 그림자는 box-shadow 가 아니라 drop-shadow — 컨테이너가 네모라 box-shadow 면
   둥근 아이콘 뒤로 «네모 그림자»가 진다 */
.detail-icon.is-tilt img { filter: drop-shadow(0 16px 26px rgba(0,0,0,.55)); }

/* ★「움직임 줄이기」를 켠 사람에겐 전부 끈다.
   전정기관 질환·멀미로 실제로 필요한 사람이 있다 — 접근성 요건이다.
   ★opacity 를 1 로 «되돌리는» 게 핵심이다. 애니메이션만 끄면 opacity:0 이 남아
     그 설정을 쓰는 사람에게 히어로가 통째로 안 보인다. */
@media (prefers-reduced-motion: reduce) {
  html.js .detail-icon,
  html.js .detail-title,
  html.js .detail-lead { opacity: 1; transform: none; animation: none !important; }
  .detail-icon::after  { animation: none !important; }
  .detail-icon         { transition: none !important; }
}
.detail-note    { margin-top: 20px; }

.detail-lead { font-size: var(--fs-lead); color: var(--muted); line-height: 1.6; max-width: 40ch; }
.detail-alt { font-size: var(--fs-sm); color: var(--subtle); }
/* 버전과 칩 안내가 «둘 다» 있을 때만 가운뎃점을 넣는다.
   한쪽만 보이는 경우(윈도우 = 버전만 / json 실패 = 칩 안내만)에 점이 뜨면 안 된다. */
#dl-ver:not([hidden]) ~ #dl-mac:not([hidden])::before {
  content: '·'; margin: 0 7px; color: var(--border-strong);
}
/* 로그인 안내는 항상 보이므로, 앞에 «보이는 형제가 있을 때만» 점을 받는다. */
#dl-alt > span:not([hidden]) ~ #dl-login-hint::before {
  content: '·'; margin: 0 7px; color: var(--border-strong);
}
.detail-alt a { color: var(--muted); text-decoration: underline; text-underline-offset: 3px; }
.detail-alt a:hover { color: var(--accent); }
.cta-download { min-width: 220px; padding: 12px 26px; font-size: var(--fs-body); font-weight: 700; }

/* ② 이벤트 띠 — 요금제 절에 있던 배너를 여기로 옮겼다(첫 화면 근처) */
.event-strip {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 13px 24px; margin-bottom: var(--sp-section);
  background: rgba(201,242,58,.06); border-top: 1px solid rgba(201,242,58,.22);
  border-bottom: 1px solid rgba(201,242,58,.22);
}
.event-strip .event-banner-text { font-size: var(--fs-sm); font-weight: 600; color: var(--fg); }

/* ④ 기능 — «펼친» 구간 ────────────────────────────────────────
   2×2 격자(.feature-grid)를 걷어냈다. 기능을 접어 넣으면 한 줄짜리 문구
   넷이 되고, 그러면 기능이 아니라 «목록»으로 읽힌다.
   기능 하나가 화면 한 폭을 쓰게 펼치고, 글과 그림의 자리를 좌우로 교차시킨다. */
.feature-row {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 48px; align-items: center;
  margin-top: var(--sp-section);
}
/* 짝수 구간은 글과 그림의 자리를 맞바꾼다.
   ★:nth-child 는 제목 블록(.features-inner)까지 세어 어긋난다 — 클래스로 «명시»한다. */
.feature-row--rev .feature-copy { order: 2; }

.feature-copy { text-align: left; display: flex; flex-direction: column; gap: 12px; }
.feature-h { font-size: var(--fs-h3); font-weight: 700; letter-spacing: -0.02em; line-height: 1.25; color: var(--fg); }
/* 44ch ≈ 460px — 코덱스 본문 폭(437px 안팎)에 맞춘다. 더 길면 눈이 되돌아올 때 줄을 놓친다 */
.feature-body { font-size: var(--fs-body); color: var(--muted); line-height: 1.7; max-width: 44ch; }

.feature-shot {
  border: 1px solid var(--border); border-radius: var(--radius);
  overflow: hidden; background: var(--bg-elev);
}
.feature-shot img { width: 100%; height: auto; display: block; }
/* ★파일이 아직 없을 때 — 깨진 이미지 아이콘 대신 «준비 중» 판을 보여준다.
   img 의 onerror 가 이 클래스를 붙이고 자기를 지운다. 파일이 들어오면
   onerror 가 안 돌아 이 규칙도 안 걸린다 — CSS 를 되돌릴 필요가 없다. */
.feature-shot.shot-pending {
  aspect-ratio: 16 / 10;
  display: flex; align-items: center; justify-content: center;
  border-style: dashed;
}
.feature-shot.shot-pending::after {
  content: attr(data-pending);
  font-family: var(--mono); font-size: var(--fs-xs); color: var(--subtle);
}

/* 리드는 가운데 정렬 — 왼쪽 축을 맞출 상대(2×2 격자)가 사라졌다 */
/* text-wrap:balance — 마지막 줄에 «다.» 한 글자만 남는 고아 줄을 막는다 */
.features-lead { font-size: var(--fs-body); color: var(--muted); line-height: 1.7; text-align: center; text-wrap: balance; }
.features-req { font-size: var(--fs-xs); color: var(--subtle); margin-top: var(--sp-section); text-align: center; }

/* 좌우 교차는 «나란히 놓을 폭»이 있을 때만 성립한다. 좁아지면 세로로 쌓고
   순서 뒤바꿈도 푼다(안 풀면 짝수 구간만 그림이 글 위로 올라간다). */
@media (max-width: 860px) {
  .feature-row { grid-template-columns: 1fr; gap: 22px; }
  .feature-row--rev .feature-copy { order: 0; }
  .feature-body { max-width: 100%; }
}

@media (max-width: 700px) {
  :root { --sp-section: 56px; }
}

/* ─────────────────────────────────────────────────────────────
   개발자문서 (goditor-api.html)

   ★먼저 있는 걸 찾아 썼다. 뼈대(.legal / .legal-inner / .legal-title / .legal-meta /
     .legal-sec / .legal-h / .legal-p)와 내비(.nav--app 일가), 뒤로가기(.detail-back)는
     «그대로» 재사용한다 — 이 사이트의 「왼쪽 정렬 긴 글」은 이미 한 벌로 정해져 있다.

   ★없어서 새로 만든 건 셋뿐이다. 개발자문서에만 있는 표현이라 어디에도 없었다:
       .doc-code  코드블록      .doc-c/.doc-tools  인라인 코드·도구 이름
       .doc-note  주의 상자     (+ .doc-h3 / .doc-list / .doc-count 소품)
     ⚠️.legal-empty 를 노트 상자로 돌려쓰지 않았다. 그건 「약관이 아직 없다」는
       한 가지 뜻에 묶인 클래스고 가운데 정렬이다 — 뜻이 다른 자리에 쓰면 다음 사람이
       약관 문구를 고치다가 이 페이지를 깨뜨린다.
   ★색·서체·간격은 전부 기존 토큰이다. 새 색을 만들지 않았다. */
.doc-h3 { font-size: var(--fs-body); font-weight: 700; color: var(--fg); margin-top: 22px; margin-bottom: 8px; }
.doc-count { font-family: var(--mono); font-size: var(--fs-xs); color: var(--subtle); font-weight: 400; margin-left: 6px; }

.doc-list { list-style: none; display: flex; flex-direction: column; gap: 8px; margin: 6px 0 6px; }
.doc-list li { font-size: var(--fs-body); color: var(--muted); line-height: 1.85; padding-left: 16px; position: relative; }
/* 불릿은 .feature-dot 와 같은 «액센트 기호» 규칙을 따른다(같은 사이트에서 두 종류를 만들지 않는다) */
.doc-list li::before { content: '·'; position: absolute; left: 0; color: var(--accent); font-family: var(--mono); }

/* 코드블록 — 가로로 긴 명령이 페이지를 밀어내지 않게 «자기 안에서» 스크롤한다 */
.doc-code {
  background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 14px 16px; margin: 10px 0 14px; overflow-x: auto; text-align: left;
}
.doc-code code {
  font-family: var(--mono); font-size: var(--fs-xs); line-height: 1.8;
  color: var(--fg); white-space: pre;
}

/* 인라인 코드 — 본문 흐름을 끊지 않게 배경은 아주 옅게만 */
.doc-c, .doc-tools code {
  font-family: var(--mono); font-size: 0.92em; color: var(--accent);
  background: rgba(201,242,58,0.06); border: 1px solid rgba(201,242,58,0.18);
  border-radius: 4px; padding: 1px 5px; white-space: nowrap;
}
/* 도구 이름 묶음 — 줄바꿈으로 흐르는 칩 목록 */
.doc-tools { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 6px; }

.doc-note {
  background: var(--bg-elev); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 16px 18px; margin: 14px 0; text-align: left;
}
/* 경고는 «약관 준비 중» 상자와 같은 --warn 계열을 쓴다 — 이 사이트에서 노란 테두리는 이미 「멈춰서 읽어라」다 */
.doc-note--warn { border-color: rgba(255,209,102,.35); }
.doc-note-title { font-size: var(--fs-body); font-weight: 700; color: var(--warn); margin-bottom: 6px; }
.doc-note-body { font-size: var(--fs-sm); color: var(--muted); line-height: 1.8; }
