/* =============================================================
   공문작성 도우미 — 화면

   🚨 **디자인을 새로 정하지 않는다** (기획서 §6).
   `doc.kupst.org`(공문 결재)와 **같은 얼굴**이어야 한다 — 같은 사람이 두 화면을
   오가며 쓴다. 값은 `kupst-doc` 의 `app.css`(바탕)와 `finish.css`(마감층,
   2026-08-26 · 업무 포털 `portal-ui.css` 와 같은 규칙)에서 가져왔다.

     본문 #222222 · 주색 #3074f0 · 보조 #309ff0 · 짙은 남색 #2a4886
     경계선 #d4d4d6 · 바탕 #f1f4fa

   ⚠ **어두운 벌을 만들지 않는다.** doc 이 일부러 밝은 쪽만 둔다 — 결재 화면이
     종이에 가까운 흰 바탕을 전제로 잡혀 있기 때문이다. 도우미도 한글 문서
     미리보기를 종이처럼 보여 주므로 같은 판단을 따른다. `layout.php` 의
     `color-scheme: light` 가 못박는다.

   🚨 **웹폰트를 불러오지 않는다.** CSP 가 바깥 출처를 막고 있고, 공문 한 건
   다듬자고 폰트 수백 KB 를 받게 할 이유가 없다.

   ⚠ 쓰는 사람이 316명이고 연령대가 넓다. 터치 영역은 doc 값을 그대로 쓴다
     (단추 min-height 50px · 입력 48px — 화면설계서 §6).
   ============================================================= */

:root {
  /* doc 의 app.css 와 같은 값 */
  --card: #ffffff;
  --line: #d4d4d6;
  --text: #222222;
  --muted: #666666;
  --accent: #3074f0;
  --accent-deep: #2a4886;
  --accent-weak: #eef4ff;
  --danger: #dc2626;
  --warn: #d97706;
  --ok: #059669;
  --radius: 10px;

  /* doc 의 finish.css 와 같은 값 */
  --f-line-soft: #eef2f9;
  --f-accent-2: #309ff0;
  --f-shadow: 0 1px 2px rgba(23,48,105,.06), 0 1px 3px rgba(23,48,105,.05);
  --f-shadow-md: 0 2px 4px rgba(23,48,105,.05), 0 8px 20px -10px rgba(23,48,105,.20);
  --f-ring: 0 0 0 3px rgba(48,116,240,.26);
  --f-dim: #5c6a84;

  /* 🚨 지적의 갈래 — 화면에서 반드시 갈라 보인다 (기획서 §6).
     🔴 규칙은 틀린 것이고, 🟡 제안은 의견이다. 섞어 놓으면 규칙 위반도
     「제안이니까」 하고 넘긴다. Phase 5 에서 쓴다. */
  --lint: #dc2626;
  --lint-bg: #fef2f2;
  --ai: #d97706;
  --ai-bg: #fffaf0;
}

* { box-sizing: border-box; }

/*
 * ⚠ `hidden` 속성은 어떤 display 지정보다 우선해야 한다.
 *
 * 브라우저 기본 스타일의 `[hidden] { display: none }` 은 **작성자 스타일에
 * 무조건 진다.** `.modal { display: grid }` 같은 규칙 하나가 `hidden` 을 통째로
 * 무력화한다. kupst-doc 이 2026-07-31 에 실제로 그렇게 되어, 결재 화면을 열자마자
 * 모달이 늘 떠 있었다. curl 검증은 HTML 에 `hidden` 이 있으니 통과했다.
 */
[hidden] { display: none !important; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  color: var(--text);
  font-family: "Pretendard Variable", Pretendard, "Noto Sans KR", system-ui, -apple-system,
               "Malgun Gothic", "Apple SD Gothic Neo", sans-serif;
  font-size: 16px;
  line-height: 1.55;
  letter-spacing: -.011em;
  padding-bottom: env(safe-area-inset-bottom);

  /* doc 의 finish.css 와 같은 바탕 */
  background-color: #f1f4fa;
  background-image:
    radial-gradient(1100px 340px at 50% -170px, rgba(48,116,240,.10), transparent 70%);
  background-repeat: no-repeat;
}

/* 건수·쪽수처럼 줄줄이 서는 숫자는 자리폭을 고정한다 */
.counter, table, .num { font-variant-numeric: tabular-nums; }

.wrap {
  width: 100%;
  /* ⚠ doc 과 같은 680px. Phase 5 의 다듬기 화면(좌 원문 / 우 지적)은 이보다
       넓어야 하는데, 그때 그 화면에만 넓은 자리를 준다 — 여기를 넓히면
       모든 화면이 함께 늘어나 doc 과 얼굴이 달라진다. */
  max-width: 680px;
  margin: 0 auto;
  padding: 0 16px;
}

/* ── 머리띠 ───────────────────────────────────────────────────
   ⚠ 어둡게 칠하지 않는다 — 로고 그림 안에 조합 이름이 들어 있어 남색 바탕에서
     글자가 사라질 수 있다. 대신 위에 가는 조합색 선을 얹는다 (doc finish.css). */
.site-head {
  position: sticky; top: 0; z-index: 20;
  padding: 0;
  border-bottom: 1px solid var(--f-line-soft);
  background: var(--card);
  background: color-mix(in srgb, var(--card) 88%, transparent);
  -webkit-backdrop-filter: saturate(1.6) blur(10px);
  backdrop-filter: saturate(1.6) blur(10px);
  box-shadow: 0 1px 0 rgba(23,48,105,.04), 0 6px 20px -18px rgba(23,48,105,.5);
}
.site-head::before {
  content: ''; display: block; height: 3px;
  background: linear-gradient(90deg, var(--accent-deep), var(--accent) 45%, var(--f-accent-2));
}
.site-head > .wrap {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-top: 12px;
  padding-bottom: 12px;
}

/* 조합 로고 — kupst.org 머리글과 같은 가로형이다. **로고에 조합 이름이 들어 있어
   글자를 따로 찍으면 같은 문구가 두 번 나온다** (doc CLAUDE.md §화면 디자인). */
.brand {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  text-decoration: none;
}
.brand-logo {
  display: block;
  height: 30px;
  width: auto;
  /* 이미지가 아직 안 왔을 때 줄이 튀지 않도록 자리를 잡아 둔다 (682:120). */
  aspect-ratio: 682 / 120;
}
.brand-service {
  padding: 3px 9px;
  border-radius: 999px;
  background: var(--accent-weak);
  color: var(--accent-deep);
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: .04em;
  white-space: nowrap;
}
@media (max-width: 380px) {
  .brand-logo { height: 24px; }
  .brand-service { display: none; }
}

.site-user { font-size: 13px; color: var(--muted); text-align: right; line-height: 1.3; }
.site-user b { display: block; font-size: 14px; font-weight: 600; color: var(--text); }

/* ── 메뉴띠 ─────────────────────────────────────────────── */
.site-nav {
  border-top: 1px solid var(--f-line-soft);
  overflow-x: auto;
}
.site-nav .wrap {
  display: flex;
  gap: 4px;
  padding-top: 4px;
}
.site-nav a {
  /* 연령대를 고려한 터치 영역 (doc 과 같은 값) */
  padding: 12px 14px;
  color: var(--muted);
  text-decoration: none;
  font-size: 14.5px;
  font-weight: 600;
  white-space: nowrap;
  border-bottom: 2px solid transparent;
}
/* ⚠ 지금 자리를 나타내는 클래스는 **`on`** 이다.
     doc 의 `layout.php` 는 `is-current` 를 쓰는데 그 이름은 어느 CSS 에도 없어
     **밑줄이 안 그려진다**(2026-09-03 실측). 같은 실수를 물려받지 않는다. */
.site-nav a.on { color: var(--accent); border-bottom-color: var(--accent); }

/* ── 본문 ─────────────────────────────────────────────── */
main { padding-top: 20px; padding-bottom: 8px; }

.page-title { font-size: 20px; font-weight: 700; margin: 0 0 8px; letter-spacing: -.02em; }
.lead { color: var(--muted); margin: 0 0 20px; }
.small { font-size: 14px; }
.muted { color: var(--muted); }
.sep { color: var(--line); margin: 0 6px; }

/* ── 카드 ─────────────────────────────────────────────────────
   1px 테두리만으로는 납작하다. 두 겹 그림자로 살짝 띄운다 (doc finish.css). */
.card {
  background: var(--card);
  border: 1px solid var(--f-line-soft);
  border-radius: 16px;
  padding: 18px 16px;
  margin-bottom: 16px;
  box-shadow: var(--f-shadow);
}
.card > h2 {
  font-size: 15.5px;
  font-weight: 800;
  letter-spacing: -.02em;
  margin: 0 0 14px;
}
/* 구역 제목 — 포털·doc 과 같이 왼쪽에 색 막대를 세운다 */
.card > h2::before {
  content: ''; display: inline-block; vertical-align: -1px;
  width: 3px; height: 13px; border-radius: 2px; margin-right: 8px;
  background: linear-gradient(180deg, var(--accent), var(--f-accent-2));
}
/* 🚨 여백을 인라인 `style=` 으로 잡지 않는다 — CSP 가 `style-src 'self'` 라
     **조용히 막힌다.** 끝 여백은 여기서 없앤다. */
.card > p:first-child { margin-top: 0; }
.card > p:last-child  { margin-bottom: 0; }

/* ── 알림 띠 ──────────────────────────────────────────────────
   ⚠ 색만으로 말하지 않는다 — 왼쪽 굵은 선이 종류를 한 번 더 말한다 (doc finish.css). */
.note {
  padding: 12px 14px;
  border: 1px solid;
  border-left-width: 4px;
  border-radius: 12px;
  font-size: 14px;
  margin-bottom: 16px;
  box-shadow: var(--f-shadow);
}
.note-info  { background: var(--accent-weak); border-color: #b9d2fb; border-left-color: var(--accent); }
.note-warn  { background: #fffbeb; border-color: #fde68a; border-left-color: #d97706; }
.note-error { background: #fef2f2; border-color: #fecaca; border-left-color: #dc2626; color: #991b1b; }
.note p:first-child { margin-top: 0; }
.note p:last-child { margin-bottom: 0; }
.note h2 { font-size: 15px; margin: 0 0 6px; }

/* ── 목록 ─────────────────────────────────────────────── */
.doc-list { list-style: none; margin: 0; padding: 0; }
.doc-list li {
  background: var(--card);
  border: 1px solid var(--f-line-soft);
  border-radius: 16px;
  padding: 14px 16px;
  margin-bottom: 10px;
  box-shadow: var(--f-shadow);
}
.doc-list li:hover { background: color-mix(in srgb, var(--accent-weak) 45%, transparent); }
.doc-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.doc-title { font-weight: 600; }
.doc-sub { font-size: 13px; color: var(--muted); margin-top: 4px; }

/* ── 표시(뱃지) ────────────────────────────────────────── */
.badge {
  display: inline-block;
  padding: 3px 10px;
  border: 1px solid transparent;
  border-radius: 999px;
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: -.01em;
  white-space: nowrap;
}
/* doc 의 tone-* 과 같은 값 */
.badge.tone-ok   { background: #ecfdf5; color: #047857; border-color: #a7f3d0; }
.badge.tone-run  { background: #eff6ff; color: #1d4ed8; border-color: #bfdbfe; }
.badge.tone-warn { background: #fffbeb; color: #92400e; border-color: #fde68a; }
.badge.tone-bad  { background: #fef2f2; color: #b91c1c; border-color: #fecaca; }
.badge.tone-idle { background: #f3f4f6; color: var(--muted); border-color: var(--line); }

/* ── 빈 자리 ───────────────────────────────────────────── */
.empty {
  background: var(--card);
  border: 1px dashed var(--line);
  border-radius: 16px;
  padding: 40px 20px;
  text-align: center;
  box-shadow: var(--f-shadow);
}
.empty-code { font-size: 32px; font-weight: 800; color: var(--line); margin: 0 0 8px; }
.empty-title { font-weight: 700; margin: 0 0 12px; }

/* ── 단추 ─────────────────────────────────────────────────────
   ⚠ 터치 크기(min-height 50px)를 건드리지 않는다 — 연령대를 고려한 값이다
     (doc 화면설계서 §6). 색과 그림자만 doc 의 마감층을 따른다. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 50px;
  min-width: 44px;
  padding: 12px 20px;
  border: 1px solid transparent;
  border-radius: 12px;
  font-size: 16px;
  font-weight: 700;
  font-family: inherit;
  text-decoration: none;
  cursor: pointer;
}
.btn-primary {
  color: #fff;
  background: linear-gradient(180deg, var(--accent), color-mix(in srgb, var(--accent) 82%, #000));
  box-shadow: 0 1px 2px rgba(23,48,105,.2), 0 8px 18px -10px var(--accent);
  transition: filter .14s ease, box-shadow .14s ease, transform .14s ease;
}
.btn-primary:hover {
  background: linear-gradient(180deg, var(--accent), var(--accent-deep));
  box-shadow: 0 2px 4px rgba(23,48,105,.22), 0 12px 24px -12px var(--accent);
}
.btn-primary:active { transform: translateY(1px); }
.btn-ghost {
  background: #fff; color: var(--text); border-color: var(--line);
  box-shadow: var(--f-shadow);
  transition: border-color .14s ease, box-shadow .14s ease;
}
.btn-ghost:hover {
  border-color: color-mix(in srgb, var(--accent) 45%, var(--line));
  box-shadow: var(--f-shadow-md);
}
.btn-sm { min-height: 40px; padding: 8px 14px; font-size: 14px; }
.btn:disabled { opacity: .5; cursor: not-allowed; }

/* 손이 닿는 자리는 눈에도 보이게 (doc finish.css) */
a:focus-visible, button:focus-visible, summary:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: none; box-shadow: var(--f-ring); border-radius: 10px;
}

/* ── 로그인 안내 ──────────────────────────────────────── */
.split { display: grid; gap: 16px; margin-bottom: 16px; }
@media (min-width: 640px) { .split { grid-template-columns: 1.4fr 1fr; align-items: start; } }
.split-b {
  background: var(--card);
  border: 1px solid var(--f-line-soft);
  border-radius: 16px;
  padding: 16px;
  box-shadow: var(--f-shadow);
}
.split-b .row { display: flex; gap: 12px; padding: 6px 0; font-size: 14px; }
.split-b .k { color: var(--f-dim); min-width: 44px; font-weight: 700; font-size: 12.5px; letter-spacing: .03em; }
.split-b .v { flex: 1; }

/* ── 발 ───────────────────────────────────────────────── */
.site-foot {
  margin-top: 40px;
  padding: 20px 0 32px;
  color: var(--muted);
  font-size: 13px;
}
.site-foot p { margin: 0; }

/*
 * ⚠ 움직임을 싫다고 한 사람에게는 움직이지 않는다. 접근성 설정이다 (doc finish.css).
 */
@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; }
}

/* ── 편집기 (Phase 2) ───────────────────────────────────── */
.edit-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 12px;
}
.save-state { font-size: 13px; color: var(--muted); }
/* 🚨 저장 실패는 눈에 띄어야 한다 — 모르면 글을 잃는다. */
.save-state.warn { color: var(--danger); font-weight: 600; }

.lbl { display: block; font-size: 13px; font-weight: 600; color: var(--f-dim); margin: 0 0 6px; }
/* ⚠ 입력 높이 48px — 연령대가 넓다 (doc 화면설계서 §6). */
.inp {
  width: 100%; min-height: 48px; padding: 10px 12px;
  border: 1px solid var(--line); border-radius: 10px;
  background: var(--card); color: var(--text);
  font-family: inherit; font-size: 16px;
}
.inp:focus { outline: none; border-color: var(--accent); box-shadow: var(--f-ring); }
.inp-title { font-size: 18px; font-weight: 600; margin-bottom: 12px; }

/* 종류 고르기 */
.pick {
  display: block; padding: 12px 14px; margin-bottom: 8px;
  border: 1px solid var(--line); border-radius: 12px; cursor: pointer;
}
.pick:has(input:checked) { border-color: var(--accent); background: var(--accent-weak); }
.pick input { margin-right: 8px; }
.pick-name { font-weight: 700; }
.pick-why { display: block; font-size: 13px; color: var(--muted); margin-top: 4px; margin-left: 22px; }

/* 도구 막대 */
.toolbar {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  padding: 6px; margin-bottom: 10px;
  background: var(--card); border: 1px solid var(--f-line-soft);
  border-radius: 12px; box-shadow: var(--f-shadow);
}
/* ⚠ 터치 영역 44×44 이상 */
.tb {
  min-width: 44px; min-height: 44px; padding: 0 10px;
  border: 1px solid transparent; border-radius: 8px;
  background: transparent; color: var(--text);
  font-family: inherit; font-size: 15px; cursor: pointer;
}
.tb:hover { background: var(--accent-weak); }
.tb-w { min-width: 64px; font-size: 13px; }
.tb-sep { width: 1px; height: 24px; background: var(--line); margin: 0 4px; }

.actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 20px; }
.actions .grow { flex: 1; }

/* 🚨 목록 줄 전체가 문서로 가는 길이다 (2026-09-03 — 「작업하던 문서를 볼 수가
   없어」). 제목만 걸면 손가락으로 누르기 어렵다. */
.doc-link { display: block; color: inherit; text-decoration: none; }
.doc-link:hover .doc-title { color: var(--accent); text-decoration: underline; }
.doc-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* 🚨 판정 근거 띠 (2026-09-03 사용자 지시).
   ⚠ **조용해야 한다.** 24시간 파기 알림과 다투면 둘 다 안 읽힌다 —
     이건 「늘 거기 있는 사실」이지 경고가 아니다. */
.basis {
  background: var(--accent-weak);
  border-bottom: 1px solid var(--f-line-soft);
  font-size: 12.5px;
  color: var(--f-dim);
}
.basis .wrap { padding-top: 7px; padding-bottom: 7px; }
.basis strong { color: var(--accent-deep); font-weight: 700; }
.basis a { color: var(--accent); }
