/* ============================================================
   KPW 웰스원 CRM — Design System  (Deep Navy + Gold)
   빌드 없음 · 오프라인 · 단일 파일. 모든 색/간격/반경/그림자는 토큰만 참조.
   ============================================================ */

/* ---------- 0) Self-hosted Font — 기기 무관 동일 렌더링(오프라인) ---------- */
@font-face{
  font-family:"Noto Sans KR";
  src:url("/static/fonts/NotoSansKR.woff2") format("woff2-variations");
  font-weight:100 900;font-style:normal;font-display:swap;
}

/* ---------- 1) Design Tokens ---------- */
:root{
  /* D4(2026-08-10): 템플릿 곳곳의 하드코딩 차트색을 토큰으로 흡수 — 같은 파랑이 두 파일에 따로 있어 한쪽만 바뀌는 사고 방지 */
  /* 🔴 2026-08-13: 차트 색이 두 벌이었다 — 서버 SVG(charts.PALETTE: 네이비·골드·하늘·와인)와
     이 토큰(파랑·주황·초록)이 서로 달라, 같은 화면에서 도넛과 미터바 색이 갈렸다.
     charts.PALETTE / assets_calc.CH_* 와 **같은 값**으로 통일한다(원본은 charts.PALETTE). */
  --chart-1:#1b2a4a; --chart-2:#c8a24a; --chart-3:#5e77a8; --chart-4:#7c3a4b;
  --chart-5:#9db1d4;
  /* A11(2026-08-11): 어두운 네이비 사이드바 위 텍스트 계조 — base.html 인라인 style과 style.css에
     같은 값(#7d8cab)이 따로 있어 한쪽만 바꾸면 어긋났다. 한 곳(토큰)으로 모은다. 테마 무관 고정. */
  --side-label:#93a1bd;   /* 2026-08-18: 구값 #7d8cab은 사이드바 **상단**(#1e3055) 위에서
                            3.8:1로 AA 미달이었다(하단에서만 4.6:1). 라벨이 상단에 몰려 있어
                            실사용 위치에서 미달 → 5.0:1로 올린다. 새 토큰이 아니라 값 보정. */ --side-label-2:#8a97b4; --side-hover:#9fadcb; --side-hover-2:#b9c5dd;
  --side-item:#c5cee0; --side-item-2:#c9d3e6; --side-active:#ffd97a;
  /* Brand — Deep Navy */
  --brand:#1b2a4a; --brand-strong:#12203c; --brand-ink:#1b2a4a; --brand-2:#283d64;
  --navy-soft:#eaeef6;
  /* PC다크(2026-09-01): --brand **면 위** 글자. 라이트 #fff 그대로 · [P2] 다크에서 #12203c —
     brand 면이 밝은 스틸블루(#9db1d4)가 되므로 흰 글자는 2.3:1로 안 보인다. 리터럴 #fff 12곳을 승격. */
  --on-brand:#fff;

  /* Accent — Gold */
  --gold:#c8a24a; --gold-strong:#b0862f; --gold-soft:#f6efda; --gold-line:#e8d6a4;
  --gold-ink:#8a6a1f;   /* 흰 바탕 위 골드 **글자**(5.05:1) — --gold/--gold-strong은 흰 바탕 소형 글자 AA 미달(2026-08-25 디자인팀) */

  /* Neutrals */
  --ink:#1a2233; --ink-soft:#3d4657; --muted:#6b7482;
  --line:#e5e8f0; --line-soft:#eef1f6;
  --surface:#ffffff; --surface-2:#f8fafc;
  /* 2026-08-13: .gauge-tile·.risk-card·.rs-item에 var(--surface-3)가 하드코딩돼 '제5의 표면색'이 돼 있었다 */
  --surface-3:#fbfcfe;
  --bg:#f3f5f9;

  /* Semantic */
  --ok:#0f7b3f; --ok-bg:#e7f6ec; --ok-line:#bfe6cd;
  --warn:#b45309; --warn-bg:#fdf1e1; --warn-line:#f3d9b3;
  /* 팀(달력 원천) — 2026-08-19(2): 처음엔 남색 계열이라 회사 일정과 배경 차이가 3/255뿐이었다.
     6종을 색으로 갈라야 하므로 보라 계열로 옮겼다(#5b3fa0 on #ede9f7 = 6.61:1). */
  --team:#5b3fa0; --team-bg:#ede9f7; --team-line:#ddd4f0;
  /* red-is-wine(대표 지시) 전면 집행 2026-09-02 — 빨강 → 와인(웰스페이 --wine과 동일 계열).
     다크 [P2]는 자체 값(#FF8A80)이라 무변경. 22개 사용 규칙이 이 3값으로 일괄 정렬된다. */
  --danger:#8c2438; --danger-bg:#f6e9ec; --danger-line:#e3c6cd;

  /* Radius */
  --r-xs:6px; --r-sm:9px; --r:12px; --r-lg:16px; --r-xl:22px; --r-pill:999px;

  /* Elevation */
  --sh-1:0 1px 2px rgba(20,32,60,.06);
  --sh-2:0 3px 12px rgba(20,32,60,.08), 0 1px 3px rgba(20,32,60,.05);
  --sh-3:0 14px 34px rgba(20,32,60,.16);
  --ring:0 0 0 3px rgba(200,162,74,.45);

  /* Type — Modern sans, larger scale */
  --font:"Noto Sans KR","Noto Sans",-apple-system,BlinkMacSystemFont,
         "맑은 고딕","Malgun Gothic","Apple SD Gothic Neo",system-ui,sans-serif;
  --serif:"Palatino Linotype",Palatino,"Nanum Myeongjo","Noto Serif KR",Georgia,
          "Batang","바탕","Times New Roman",serif;
  /* 🔴 2026-08-13 개편 1단계 — 스케일이 5단뿐이라 템플릿이 각자 px를 지어냈다(인라인 font-size 643건·고유 13종).
     실사용 분포(12px 208 · 13px 94 · 11px 76 · 11.5px 72 · 12.5px 61 · 20px 35 …)를 그대로 흡수해
     **빠진 단만 추가**한다. ⚠ 기존 5단의 값은 바꾸지 않는다 — 바꾸면 지금 화면이 전부 움직인다. */
  --fs-2xs:10.5px; --fs-xs:11px; --fs-note:12px;
  --fs-cap:12.5px; --fs-body-sm:13px; --fs-sm:14px; --fs:15px; --fs-md:16px; --fs-lg:19px;
  --fs-xl:20px; --fs-2xl:22px; --fs-3xl:24px;

  /* Space */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:22px; --sp-6:28px;

  /* Motion(2026-08-27) — Notion 가이드(등장 0.5s·spring)·60fps 카테고리를 CRM 토큰으로. 모바일 블록만 참조한다.
     기존 모션 곡선(.msheet·.mtabbar의 cubic-bezier(.2,.8,.25,1))에 spring 하나만 더한다 — 곡선이 셋을 넘으면 '정신없음'. */
  --mo-fast:150ms;  --mo-base:220ms;  --mo-slow:500ms;  --mo-breathe:9s;
  --ease-out:cubic-bezier(.2,.8,.25,1);
  --ease-spring:cubic-bezier(.34,1.56,.64,1);
  --ease-inout:cubic-bezier(.45,0,.55,1);
  --stagger:55ms;
  /* Wash(2026-08-27) — 모바일 카드 바탕용 파스텔 6종. 각각 기존 의미색의 '가장 옅은 단'이다(새 색상군이 아니다).
     ⚠ 모바일 판정 블록 안에서만 쓴다. 인쇄·PC 카드는 --surface 그대로. 워시 위 보조 글자는 --ink-soft(--muted는 AA 미달). */
  --wash-cream:#f9f3e3;   /* gold 계열 · 오늘·고정 */
  --wash-sky:#e9f0fb;     /* navy 계열 · 기본 카드 */
  --wash-mint:#e6f5ee;    /* ok 계열 */
  --wash-lilac:#efeafa;   /* team 계열 */
  --wash-peach:#fdeee6;   /* warn 계열 · 주의 카드 */
  --wash-sand:#f1eee9;    /* 중성 웜그레이 · 카드 사이 쉼표 */
}

/* ---------- 2) Base ---------- */
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;font-family:var(--font);font-size:var(--fs);line-height:1.65;
  color:var(--ink);background:var(--bg);
  word-break:keep-all;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  font-feature-settings:"tnum" 0;
}
a{color:var(--brand);text-decoration:none;transition:color .15s}
a:hover{color:var(--brand-strong);text-decoration:underline}
/* A4(2026-08-11): box-shadow 포커스 링은 .table-scroll(overflow:auto) 안에서 잘려, 표 안의
   버튼·입력칸에서 키보드 포커스 위치가 안 보였다. outline은 클리핑 대상이 아니라 항상 보인다. */
:focus-visible{outline:2px solid var(--gold-strong);outline-offset:2px;box-shadow:none;border-radius:var(--r-xs)}
/* 본문 바로가기(D5) — 시각적으로는 숨겨 두고 **포커스가 오면** 좌상단에 나타난다.
   ⚠ display:none·visibility:hidden으로 숨기면 포커스 자체를 못 받아 아무 소용이 없다.
   ⚠ 인쇄에는 나오지 않는다(아래 @media print에서 .noprint와 같은 취급). */
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;
  background:var(--brand);color:var(--on-brand);padding:10px 16px;border-radius:0 0 var(--r-sm) 0;
  font-size:13px;font-weight:700}
.skip-link:focus{left:0;color:var(--on-brand);text-decoration:none}
#main:focus{outline:none}
::selection{background:var(--gold-soft)}
h1,h2,h3,p{margin:0}
h1{font-size:clamp(23px,2.6vw,30px);font-weight:800;letter-spacing:-.02em;
  color:var(--brand-ink);margin:2px 0 var(--sp-5);line-height:1.25}
h2{font-size:var(--fs-lg);font-weight:800;color:var(--brand-ink);
  margin:0 0 var(--sp-4);letter-spacing:-.01em}
h3{font-size:var(--fs-sm);font-weight:700;color:var(--muted);margin:var(--sp-4) 0 var(--sp-2);letter-spacing:.01em}
small,.hint{font-size:var(--fs-cap);color:var(--muted);line-height:1.55}
.muted{color:var(--muted)}

/* ---------- 3-0) App Shell / Sidebar (참고 레이아웃: 좌측 네비 + 상단 바) ---------- */
.shell{display:flex;min-height:100vh;align-items:stretch}
/* 🔴 2026-08-25 사용자 지시 — "메뉴가 왼쪽에 몰려 보기 불편, 폭을 줄이든 가운데 정렬하든 디자인팀과 결정".
   디자인·UX 두 팀 모두 **폭 축소(224→208px) + 머리(로고·이름)만 가운데**를 골랐다.
   원인은 정렬이 아니라 **빈 오른쪽 면적**(라벨 4~7자, 행마다 오른쪽 71~113px이 빔)이었다.
   ⚠ 메뉴 전체 가운데 정렬은 기각 — 고객 화면의 4단 들여쓰기(묶음→단계→화면→앵커)와 아이콘 열·배지 열이 무너진다.
   ⚠ 200px까지 내리면 '④ 포트폴리오 수립 및 제안'이 두 줄로 접힌다 → 208px + 단계 자간 .06em이 하한. */
.sidebar{
  flex:0 0 208px;position:sticky;top:0;height:100vh;overflow-y:auto;
  background:linear-gradient(180deg,#1e3055 0%,#15233f 55%,#101b31 100%);
  color:#d7deec;padding:16px 12px 12px;display:flex;flex-direction:column;gap:2px;
  border-right:1px solid rgba(200,162,74,.25);
  box-shadow:4px 0 18px rgba(16,26,48,.18);
}
.side-brand{padding:2px 0 14px;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:10px}
/* 🔴 2026-08-25 4차 사용자 지시 — "로고·이름과 아래 탭들이 안 맞는다, 통일". 머리를 가운데로 뒀던 것을
   메뉴와 **같은 왼쪽 기준선(14px)**에 맞춘다(메뉴를 가운데로 옮기면 들여쓰기 계층이 무너지므로 머리가 따라간다). */
.side-brand a{display:flex;justify-content:flex-start;align-items:center;gap:10px;padding-left:14px;color:#fff;font-weight:800;font-size:16.5px;letter-spacing:-.01em}
.side-brand a:hover{text-decoration:none;opacity:.95}
/* 실제 KPW 로고 (2026-08-24) — 원본 313x120(2.6:1). width만 주고 height:auto로 비율을 지킨다.
   ⚠ width/height 속성을 마크업에 함께 적어 **로고가 늦게 떠도 자리가 밀리지 않게** 한다(레이아웃 이동 방지).
   ⚠ 사이드바 안쪽 폭은 224 - 28 = 196px다 — 150px면 여백이 남아 답답하지 않다. */
/* 🔴 2026-08-25 사용자 지시 — "로고가 너무 커짐, 기존 그대로".
   150px(세로 57px)는 그 아래 이름칸보다 커서 사이드바 머리가 로고에 잡아먹혔다.
   80px = 세로 약 31px — 로고를 넣기 전 아이콘+글자 높이와 사실상 같다. */
.side-logo{width:80px;height:auto;display:block}
.side-brand .mark{
  display:inline-grid;place-items:center;width:36px;height:36px;border-radius:11px;flex:none;
  background:linear-gradient(135deg,#dcbb66,#c8a24a);font-size:18px;
  box-shadow:0 2px 6px rgba(200,162,74,.4),inset 0 0 0 1px rgba(255,255,255,.35);
}
.side-brand .mark svg{width:19px;height:19px;color:#13203a}
.side-logout svg{vertical-align:-2px}
/* 묶음 라벨 — 10.5px·자간 .14em은 한글이 낱글자로 흩어져 '조각 글자'처럼 보였다(UX팀 2026-08-25) → 11.5px·.06em */
.side-sec{font-size:11.5px;font-weight:800;letter-spacing:.06em;color:var(--side-label);
  padding:14px 12px 6px;text-transform:uppercase}
.side-nav{display:flex;flex-direction:column;gap:2px}
.side-nav a{
  display:flex;align-items:center;gap:10px;color:#c3cde2;font-size:14px;font-weight:600;
  padding:9px 12px 9px 14px;border-radius:10px;line-height:1.2;transition:background .15s,color .15s;
}
/* 아이콘 칸 고정폭(20px) — 아이콘이 없거나 크기가 달라도 글자 열이 한 선에 맞는다.
   ⚠ 디자인 QA(2026-08-25 2차): 같은 선택자를 18px로 한 번 더 선언해 문서와 실제값이 어긋났었다 → 하나만 남긴다. */
.side-nav a .ico{width:20px;flex:none;display:inline-grid;place-items:center}
.side-nav a .ico svg{width:16.5px;height:16.5px;display:block}
.side-nav a:hover{color:#fff;background:rgba(255,255,255,.09);text-decoration:none}
.side-nav a.active{
  color:#ecd9a4;background:rgba(200,162,74,.14);font-weight:800;
  box-shadow:inset 3px 0 0 var(--gold),inset 0 0 0 1px rgba(200,162,74,.22);
}
.side-foot{margin-top:auto;padding-top:14px;border-top:1px solid rgba(255,255,255,.08)}
.side-logout{display:block;text-align:center;color:#f4cfc9;font-size:13px;font-weight:700;
  padding:9px 10px;border-radius:10px;border:1px solid rgba(244,207,201,.3)}
.side-logout:hover{background:rgba(220,110,100,.25);color:#fff;text-decoration:none}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.mainbar{
  position:sticky;top:0;z-index:40;
  display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;
  background:rgba(255,255,255,.92);backdrop-filter:blur(8px);
  padding:12px clamp(16px,3vw,28px);border-bottom:1px solid var(--line);
}
.mb-title{font-weight:700;color:var(--brand-ink);font-size:15.5px;letter-spacing:.06em}
.mb-sub{font-size:11.5px;color:var(--muted)}
/* 헤더 검색(.mb-search)은 7차 지시로 빠졌다 — 그 자리에 핵심가치 띠(.mb-values). 남는 폭을 다 쓰되 헤더 한 줄(64px)을 넘지 않는다. */
.mb-values{flex:1 1 320px;min-width:0;display:flex;align-items:center;gap:clamp(10px,1.4vw,22px);
  padding:5px 14px;border-radius:var(--r-lg);background:var(--surface);border-left:3px solid var(--gold);
  box-shadow:0 1px 3px rgba(20,32,60,.05);order:1}
.mv-cap{flex:none;display:flex;flex-direction:column;line-height:1.1;padding-right:clamp(8px,1.2vw,16px);border-right:1px solid var(--line)}
.mv-cap b{color:var(--brand-ink);font-size:var(--fs-note);font-weight:800;white-space:nowrap}
.mv-cap small{color:var(--gold-ink);font-size:9px;font-weight:800;letter-spacing:.14em;white-space:nowrap}
.mv-list{flex:1 1 auto;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:0;list-style:none;margin:0;padding:0;min-width:0}
.mv-v{display:flex;flex-direction:column;min-width:0;padding:0 clamp(6px,.9vw,12px);line-height:1.15}
.mv-v+.mv-v{border-left:1px solid var(--line-soft)}
.mv-ko{color:var(--brand-ink);font-size:var(--fs-cap);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}   /* 🔴 2026-09-07: 넘침 처리가 없어 좁아지면 글자가 **겹쳐** 보였다(헤더에 [상담 시작]이 늘면서 드러남) */
.mv-en{color:var(--gold-ink);font-size:9.5px;font-weight:600;letter-spacing:.04em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 영문명은 1500px 아래에서 "Indep…"처럼 잘렸다(1366px 실측) → 접는다. 한글명·캡션만 남긴다 */
@media screen and (max-width:1500px){ .mv-en{display:none} }
@media screen and (max-width:1300px){ .mv-cap small{display:none} }
@media screen and (max-width:1250px){ .mb-values{display:none} }   /* 헤더에 [상담 시작]이 늘어 1100px에서는 다섯 값이 겹친다 → 접는 기준을 올린다(2026-09-07) */
@media print{ .mb-values{display:none} }

/* 본문 영역 — 폭 상한 없이 화면을 꽉 채운다.
   ⚠ 부모(.main)가 flex 컬럼이라 **좌우 마진을 auto로 두면 stretch가 무효화**되어
   내용 너비만큼만 잡히고 가운데로 몰린다(대시보드처럼 내용이 넓은 화면만 우연히 꽉 차 보였음).
   → 좌우 마진 0 + width:100% 로 고정한다. box-sizing:border-box라 padding은 안쪽으로 들어간다. */
.container{max-width:none;width:100%;margin:clamp(20px,3vw,32px) 0;
  padding:0 clamp(15px,3vw,22px)}
/* 읽기·폼 화면 폭 캡(2026-09-02 대표 승인 · 시안 6cd10afa) — 큰 모니터에서 텍스트 행이
   화면 끝까지 흐르지 않게 1320px 상한. 워크벤치(표) 화면은 전폭 유지 — 템플릿이
   container_cls 블록으로 ' cap'을 스스로 선언한 화면에만 적용된다.
   ⚠ width:100%는 유지(flex-auto-margin-shrink 함정 — width 없이 auto 마진만 주면 내용 폭으로 축소). */
/* ⏸ 적용 보류(2026-09-02 대표: "바로 적용하지 말고 시안 먼저") — 승인 시 아래 주석만 해제.
.container.cap{max-width:1320px;margin-left:auto;margin-right:auto} */
/* 헤더 전역 고객 검색 + 최근 연 고객(2026-09-02 · 3파트 감사 — impl-work 규격, 통합자 편입).
   ⚠ 헤더 검색은 7차 지시로 제거된 이력 있음 — 09-02 3파트 감사로 대표 재승인(최근 고객 포함).
   모바일(≤1100px)에서는 숨김 — 하단 탭 '고객'이 담당(핵심가치 접힘과 같은 규칙). */
.mb-search{display:flex;align-items:center;gap:6px;position:relative}
.mb-search .mbs-form{display:flex;gap:4px;margin:0}
.mb-search input[name=q]{width:150px;padding:5px 8px;font-size:12.5px}
.mbs-recent{position:relative}
.mbs-recent>summary{list-style:none;cursor:pointer;font-size:12.5px;padding:5px 8px;border:1px solid var(--line);border-radius:8px;color:var(--ink-soft)}
.mbs-recent>summary::-webkit-details-marker{display:none}
.mbs-recent[open]>summary{background:var(--surface-2)}
.mbs-drop{position:absolute;right:0;top:calc(100% + 4px);min-width:150px;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--sh-2);padding:6px;z-index:60;display:flex;flex-direction:column}
.mbs-drop a{padding:6px 10px;border-radius:6px;font-size:13px;text-decoration:none;color:var(--ink)}
.mbs-drop a:hover{background:var(--surface-2)}
@media screen and (max-width:1100px){.mb-search{display:none}}

.foot{text-align:center;color:var(--muted);font-size:var(--fs-cap);padding:28px 0 36px}
.foot::before{content:"🔒 ";opacity:.7}

/* ---------- 4) Card & Sections ---------- */
.card{
  background:var(--surface);border:1px solid var(--line-soft);border-radius:var(--r-lg);
  padding:var(--sp-5) clamp(18px,2.4vw,24px);margin-bottom:var(--sp-5);box-shadow:var(--sh-1);
}
.card>h2:first-child,.card>.flex-between:first-child{margin-top:0}
.card.accent{border-left:4px solid var(--brand)}
.card.warnline{border-left:4px solid var(--gold)}

/* 저장 결과 안내 줄 — 🔴 2026-08-21 감수: `.okline`·`.ok-line`은 **CSS에 없는 이름**이었다.
   하이웍스 설정·공지·인사정보·교육 네 화면이 이 이름을 쓰는데 규칙이 없어 색 없는 맨 텍스트로 떴다
   (인라인 padding만 걸려 있어 '스타일이 있는 것처럼' 보였고, 그래서 아무도 눈치채지 못했다).
   ⚠ 카드에 얹은 것(`.card.ok-line`)과 홀로 쓰는 것을 나눈다 — 카드에 배경까지 칠하면
     기존 화면들의 카드 색이 통째로 바뀐다(이번 변경의 범위를 넘는다). */
.okline:not(.card),.ok-line:not(.card){
  background:var(--ok-bg);border:1px solid var(--ok-line);color:var(--ok);
  border-radius:var(--r-md,10px);padding:10px 14px;font-size:13.5px}
.warnline:not(.card){
  background:var(--warn-bg);border:1px solid var(--warn-line);color:var(--warn);
  border-radius:var(--r-md,10px);padding:10px 14px;font-size:13.5px}
.card.ok-line,.card.okline{border-left:4px solid var(--ok)}
/* 힌트·문단용 좌 바(2026-09-02 · 3파트감사 P1-3 인라인 골드 바 일괄 치환) — 모바일·인쇄는 기존 모습 유지, [P1]에서 중립(--line) */
.tipline{border-left:3px solid var(--gold);padding-left:10px}

.flex-between{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.flex-between h1,.flex-between h2{margin-bottom:0}

/* 카드 2단 나란히(최근 상담·알림 등) — 좁은 화면에선 세로 스택 */
.card-duo{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:0 var(--sp-4);align-items:start}
@media screen and (max-width:820px){.card-duo{grid-template-columns:minmax(0,1fr)}}

/* ---------- 5) Grid & KPI ---------- */
.grid{display:grid;gap:var(--sp-4)}
.grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
.grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.grid.cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}
/* 5칸 — 은퇴 '예상 월 연금액'처럼 1·2·3층 + 임대 + 합계를 한 줄에 놓을 때 */
.grid.cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}
/* 폭에 따라 4→2→1칸 자동(대시보드 스탯 등) — 미디어쿼리 불필요 */
.grid.fit{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}

/* ---------- 5-1) 공용 유틸 (인라인 style 대체) ---------- */
th.num,td.num{text-align:right}
/* 🔴 2026-09-09: position:relative 가 없으면 **표 안의 .sr-only 가 스크롤 상자를 빠져나간다**.
   .sr-only 는 position:absolute 인데 위치 기준이 될 조상이 없으면 한참 위(또는 초기 기준틀)에
   붙어, 가로로 넓은 표에서 셀이 놓인 x좌표만큼 **문서 전체가 옆으로 늘어난다**.
   제안서 작성 화면이 320px 검사에서 문서폭 818px(창 485px)로 잡힌 원인이 이것이었다 —
   표는 상자 안에서 잘 스크롤되는데 화면만 옆으로 밀렸다(눈으로는 원인을 못 찾는다).
   여기를 위치 기준으로 만들면 절대배치 자식이 상자 밖으로 못 나간다. */
.table-scroll{position:relative;overflow-x:auto;-webkit-overflow-scrolling:touch}
/* 🔵 2026-09-21 — **인쇄용 리포트 안의 넓은 표**에 함께 다는 표식. A4(794px)에서는 맞는데
   화면을 좁히면 넘친다(부동산 '물건별 상세' 8열 · 884px 화면에서 +148px 실측).
   화면에서는 `.table-scroll`을 그대로 써서 **가로 스크롤 + "옆으로 밀어" 안내**를 같이 얻고,
   인쇄에서는 overflow를 풀어 **상자가 종이 위에서 아무 일도 하지 않게** 한다. */
@media print{.rp-scroll{overflow:visible}}
/* 화면에는 안 보이지만 스크린리더는 읽는 텍스트(표의 '동작' 열 머리글 등) — 디자인 QA 2026-08-12 */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* 출처 URL처럼 띄어쓰기 없는 긴 문자열이 좁은 화면에서 칸 밖으로 삐져나가지 않게 */
.hint a,.muted a,td a{overflow-wrap:anywhere;word-break:break-word}
h2.sm{font-size:15.5px;margin:0}
/* 인라인 아이콘(이모지 대체 단색 SVG) — 글자색을 따라감 */
.icn{width:1.05em;height:1.05em;vertical-align:-.16em;display:inline-block;flex:none}
/* 화면에서도 차트가 칸 밖으로 넘치지 않게(인쇄와 동일 규칙) */
.card svg{max-width:100%;height:auto}
.mkt-card svg{height:44px}

/* 게이지(권장 대비 현재) */
.meter{position:relative;height:14px;border-radius:var(--r-pill);background:var(--line-soft);overflow:hidden}
.meter>span{position:absolute;left:0;top:0;bottom:0;border-radius:var(--r-pill);min-width:2px}
.meter-row{display:flex;align-items:center;gap:10px;font-size:var(--fs-sm)}
.meter-row .meter{flex:1}

.kpi{
  position:relative;overflow:hidden;
  background:linear-gradient(160deg,#ffffff 0%,#f7f9fd 100%);
  border:1px solid var(--line);border-radius:var(--r);padding:18px 20px;box-shadow:var(--sh-1);
  transition:transform .16s,box-shadow .16s;
}
.kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;
  background:linear-gradient(180deg,#dcbb66,var(--gold))}
.kpi:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
.kpi .n{font-size:30px;font-weight:800;color:var(--brand-ink);line-height:1.12;
  letter-spacing:-.025em;font-variant-numeric:tabular-nums}
.kpi .l{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:4px;font-weight:600}
.kpi .hint{display:block;margin-top:6px}
/* 클릭형 세부내역 카드: kpi를 details로 감싼 형태 */
details.kpi-details summary{outline:none;padding:0;background:transparent}
details.kpi-details summary:hover{background:transparent}
details.kpi-details summary::-webkit-details-marker{display:none}
details.kpi-details summary::marker{content:""}
details.kpi-details summary::before{content:""}
details.kpi-details[open] summary::before{content:""}
details.kpi-details[open]{box-shadow:var(--sh-2);border-color:var(--gold)}
.drill-hint{text-decoration:underline dotted var(--muted);text-underline-offset:3px;cursor:pointer}

/* 재무상태표·현금흐름표 (상담 양식 2단 대차 형식) */
.bs-table{min-width:300px}
.bs-table .bs-head th{background:var(--brand);color:var(--on-brand);text-align:center;font-size:13.5px;letter-spacing:.3em;padding:9px}
.bs-table .bs-sec td{background:var(--surface-2);font-weight:700;color:var(--brand-ink);border-top:1px solid var(--line)}
.bs-table .bs-total td{background:var(--brand);color:var(--on-brand);font-weight:800;font-variant-numeric:tabular-nums}
.bs-table .bs-net td{background:var(--brand);color:#ffd97a;font-weight:800;font-variant-numeric:tabular-nums}

/* ---------- 6) Tables ---------- */
table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--fs-sm)}
th,td{padding:11px 13px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line-soft)}
th{background:var(--surface-2);color:var(--brand-ink);font-weight:700;font-size:var(--fs-cap);
  letter-spacing:.01em;white-space:nowrap;border-bottom:1px solid var(--line)}
th:first-child{border-top-left-radius:var(--r-sm)}
th:last-child{border-top-right-radius:var(--r-sm)}
/* 진짜 매트릭스 표의 **행 헤더**(D3 · 2026-08-07) — 스크린리더에는 헤더로 알리되
   모양은 본문 셀 그대로 둔다. 그냥 <th>로 두면 전역 th 스타일(회색 배경·작은 글씨·nowrap·
   모서리 라운드)이 붙어 표 왼쪽 열만 헤더처럼 보인다. */
th.rowhead{background:transparent;color:inherit;font-weight:400;font-size:var(--fs-sm);
  white-space:normal;letter-spacing:normal;border-bottom:1px solid var(--line-soft);
  border-top-left-radius:0}
tbody tr:last-child td{border-bottom:0}
tbody tr{transition:background .12s}
tbody tr:hover td{background:var(--surface-2)}
td b{font-weight:700;color:var(--ink)}
/* 표에서 '칸 전체'를 클릭 영역으로 — 글자만 눌러야 하던 불편 해소(고객 목록 등).
   td의 padding(11px 13px)만큼 음수 마진으로 되밀어 링크가 셀을 가득 채우게 한다.
   ⚠ 폼(select·버튼)이 있는 칸에는 쓰지 말 것 — 링크가 덮어 폼을 못 쓰게 된다. */
td > a.cell-link{display:block;margin:-11px -13px;padding:11px 13px;
  color:inherit;text-decoration:none;cursor:pointer}
td > a.cell-link:hover{text-decoration:none}
/* 🔴 2026-08-12(사용자 지적: "고객으로 들어갈 때 어디를 눌러야 할지 헷갈린다")
   칸 전체가 이미 링크였는데 **눌리는 곳처럼 보이지 않았다.** 행에 마우스를 올리면 줄 전체가
   밝아지고 이름에 밑줄이 들어와 '여기를 누르면 들어간다'가 보이게 한다.
   ⚠ 행 클릭을 JS로 흉내내지 않는다 — 셀마다 진짜 <a>라서 키보드·새 탭 열기가 그대로 된다. */
tr.rowlink:hover > td{background:var(--navy-soft)}
tr.rowlink:hover > td > a.cell-link b{text-decoration:underline}
tr.rowlink > td > a.cell-link:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
td:not(:first-child){font-variant-numeric:tabular-nums}
tr.sumrow td{background:var(--gold-soft);border-top:2px solid var(--gold);font-weight:800;color:var(--brand-ink)}
/* 합계 줄 가로 정렬용 빈 행 — 항목 수가 다른 표들의 높이를 맞춘다(내용 없이 높이만 차지) */
tr.rowfill td{border-bottom-color:transparent;color:transparent}

/* 증시현황 주요 일정 — 이번 달 / 다음 달 이후 2단 */
.ev-head{font-size:12.5px;font-weight:800;color:var(--brand-ink);letter-spacing:.03em;
  padding:2px 2px 6px}
.ev-table th,.ev-table td{padding:8px 10px;font-size:12.8px}
.ev-table .c-act{width:44px}

/* 금융자산 심화분석 — 표는 폭을 채우고, 수익률은 표 안에서 바로 입력 */
.fd-table{width:100%}
.fd-in{width:78px;padding:5px 8px;font-size:12.5px;text-align:right}
.fd-opts{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));
  gap:10px 14px;align-items:end;margin-top:10px}
.fd-opts label{font-size:11.5px;color:var(--muted);display:block;margin-bottom:3px}
.fd-opts input{width:100%;padding:7px 10px;font-size:13px}
.fd-save{align-self:end}
.pos{color:var(--ok);font-weight:700}
.neg{color:var(--danger);font-weight:700}

/* ---------- 7) Buttons ---------- */
.btn{
  --b:var(--brand);--bh:var(--brand-strong);
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  background:var(--b);color:var(--on-brand);border:1px solid transparent;border-radius:var(--r-sm);
  padding:10px 18px;font-size:var(--fs);font-weight:700;font-family:inherit;
  cursor:pointer;line-height:1.2;transition:background .15s,box-shadow .15s,transform .05s;
  box-shadow:var(--sh-1);
}
.btn:hover{background:var(--bh);text-decoration:none;color:var(--on-brand)}
.btn:active{transform:translateY(1px)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn.sm{padding:6px 12px;font-size:var(--fs-cap);border-radius:var(--r-xs)}
/* Gold — 핵심 CTA */
.btn.gold{background:linear-gradient(180deg,#d3ae56,#c8a24a);color:#1b2a4a;box-shadow:0 2px 8px rgba(200,162,74,.35)}
.btn.gold:hover{background:linear-gradient(180deg,#c8a24a,#b0862f);color:#1b2a4a}
.btn.ghost{background:var(--navy-soft);color:var(--brand-ink);box-shadow:none}
.btn.ghost:hover{background:#dde4f1;color:var(--brand-ink)}
.btn.danger{background:var(--danger-bg);color:var(--danger);box-shadow:none;border-color:var(--danger-line)}
.btn.danger:hover{background:#f9dcd7;color:var(--danger)}

/* ---------- 8) Forms ---------- */
label{display:block;font-size:var(--fs-cap);color:var(--ink-soft);font-weight:600;margin:11px 0 5px}
input,select,textarea{
  width:100%;padding:10px 12px;border:1px solid #cbd4e2;border-radius:var(--r-sm);
  font-size:var(--fs);font-family:inherit;color:var(--ink);background:#fff;
  transition:border-color .15s,box-shadow .15s;
}
/* 🔴 라디오·체크박스는 **글자 입력칸이 아니다** — 위 `input{width:100%}`가 그대로 먹으면
   동그라미가 칸 전체를 차지해 브라우저가 그것을 가운데 그리고, 옆의 선택지 글자는
   남은 좁은 폭으로 밀려 우측에서 줄바꿈된다(위험성향 진단 화면에서 실제로 그렇게 보였다).
   지금까지는 `label.chk input{width:auto}`처럼 쓰는 곳마다 예외를 달아 왔는데,
   그건 전역 규칙이 틀렸다는 신호였다 — 여기서 한 번에 바로잡는다. (2026-08-02) */
input[type=radio],input[type=checkbox]{
  width:auto;padding:0;margin:0;accent-color:var(--brand);flex:none;
  transition:none}
input:hover,select:hover,textarea:hover{border-color:#a9b6cd}
input[type=radio]:hover,input[type=checkbox]:hover{border-color:transparent}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--gold);box-shadow:var(--ring)}
input::placeholder,textarea::placeholder{color:#9aa4b2}
textarea{min-height:74px;resize:vertical;line-height:1.6}
select{appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);
  background-position:calc(100% - 17px) 55%,calc(100% - 12px) 55%;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:32px}
.row{display:flex;gap:var(--sp-3);flex-wrap:wrap}
.row>div{flex:1;min-width:175px}

/* 자동잠금 임박 배너 — 예전엔 JS가 style.cssText로 직접 칠했다.
   B1-16으로 스크립트를 외부 파일로 옮기면서 모양은 여기로 가져왔다. */
.ka-banner{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:9999;
  background:#1b2a4a;color:#fff;padding:12px 18px;border-radius:12px;
  box-shadow:0 6px 24px rgba(0,0,0,.3);font-size:14px;display:flex;gap:14px;align-items:center}
.ka-banner .ka-go{background:#c8a24a;color:#13203a;border:0;border-radius:8px;
  padding:7px 14px;font-weight:700;cursor:pointer;white-space:nowrap}
/* ⏱️ 헤더의 화면 유지 시간(2026-08-12 사용자 지시) — 평소에도 남은 시간이 보이게.
   누르면 연장되므로 커서를 손가락으로 둔다. 인쇄에는 나오지 않는다. */
/* 🔴 헤더 배치 (2026-08-24 사용자 지시) — 왼쪽부터: 제목 · 검색 … 유지시간(가운데) … 상담화면 · 공지알림증시(맨 오른쪽)
   ⚠ 순서를 **order로 못 박는다**. order를 안 준 항목은 0이라, 하나만 order를 주면 그 항목만 뒤로 밀려
     "상담화면이 유지시간보다 앞에 오는" 어긋남이 생긴다(실제로 한 번 그렇게 났다).
   ⚠ `justify-content:space-between`은 auto 마진과 싸운다 → flex-start로 두고 **auto 마진으로만** 민다.
   ⚠ 유지시간은 평소 hidden이다 — 숨어도 오른쪽 묶음이 제자리를 지키도록 .mb-quick에도 auto를 준다. */
.mainbar{justify-content:flex-start}
.mb-left{order:0}
.mb-search{order:1}
/* 유지시간은 **검색과 오른쪽 묶음 사이 가운데**에 둔다.
   🔴 처음에는 `position:absolute; left:50%`로 헤더 정중앙에 뒀는데, 그 자리가 **검색창 위**여서
     '52:13'이 입력칸 안에 겹쳐 보였다(실측: 검색 573~873, 헤더중앙 804 — 캡처로 확인).
     화면 한가운데가 늘 빈 자리인 것은 아니다 → 흐름 안에서 좌우 auto로 민다.
   ⚠ 평소 hidden이라 auto가 사라진다 → 오른쪽 묶음(.mb-quick)에도 auto를 둬 제자리를 지킨다. */
/* 🔴 auto 마진을 **컴포넌트 블록 안에서** 준다.
     앞에서 `margin-left:auto`를 줘도 뒤에 오는 `.lock-left{margin-left:8px}`가 같은 특이도로 덮어
     "가운데"가 실제로는 구현되지 않았다(실측 895 = 검색끝 873 + gap 14 + margin 8 — 검색창에 붙어 있었다).
     1400px에선 여유가 46px뿐이라 티가 안 났지만 넓은 화면일수록 왼쪽으로 치우친다. */
/* 🔴 2026-08-24(2차 지시) — 유지 시간과 상담화면 버튼을 **한 묶음**으로 붙였다.
     auto 마진은 이제 **묶음에만** 있다. 예전에는 둘이 각자 auto를 갖고 다퉈,
     유지 시간이 hidden이 되는 순간 상담화면 버튼이 좌우로 점프했다.
   ⚠ 두 자식의 높이를 align-items:center로 맞춘다 — 칩(6px 패딩)과 버튼(sm)이 높이가 달라
     붙여 놓으면 밑선이 어긋나 보인다(붙이라는 지시의 핵심은 '가지런히'다). */
/* 🔴 2026-08-25 — 오른쪽에 오는 것 전부를 **한 묶음**으로 싼다(.mb-right).
     예전에는 .mb-tools와 .mb-quick이 형제라, 헤더 폭이 모자라면 wrap이 **둘 사이를 갈랐다**.
     한 줄 오른쪽 끝에 유지시간, 다음 줄 왼쪽에 공지·알림 — 사용자가 말한 "정렬 안 맞음"이다.
   ⚠ auto 마진은 이 묶음에만 준다. 안쪽에 auto가 남아 있으면 묶음 안에서 서로를 밀어낸다.
   ⚠ 묶음 안은 nowrap이 아니다 — 아주 좁은 화면에서 통째로 못 접히면 헤더가 가로로 넘친다. */
.mb-right{display:inline-flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;
  gap:10px;order:3;margin-left:auto}
/* ⚠ 유지시간 칩(패딩 6px)과 상담화면 버튼(sm)은 높이가 다르다 — 붙이라는 지시의 핵심은
     '가지런히'이므로 둘의 높이를 32px로 못 박아 밑선을 맞춘다. */
.mb-tools{display:inline-flex;align-items:center;gap:6px}
.mb-tools > .lock-left,.mb-tools .mb-present > .btn{min-height:32px}
.mb-present{display:inline-flex}
.lock-left{display:none;align-items:center;gap:4px;cursor:pointer;user-select:none;   /* 2026-08-29 사용자 지시: PC(웹)에서는 유지시간 표시를 없앤다 — 모바일 판정 블록에서만 켠다 */
  padding:6px 10px;border-radius:var(--r-sm);border:1px solid var(--line);
  background:var(--surface-2);color:var(--muted);font-size:12.5px;white-space:nowrap}
/* 🔴 `display:inline-flex`가 브라우저 기본 `[hidden]{display:none}`을 이겨, hidden이어도 칩이
     계속 보였다(값 없는 '⏱️ –'). JS가 즉시 켜 주는 화면에서는 안 드러나지만 JS가 막히면 남는다.
   ⚠ 특이도(클래스+속성)로 이기므로 !important 없이 충분하다. */
.lock-left[hidden]{display:none}
.lock-left:hover{border-color:var(--brand);color:var(--brand-ink)}
.lock-left b{font-variant-numeric:tabular-nums;color:var(--ink)}
.lock-left.warm{border-color:var(--warn);color:var(--warn)}
.lock-left.warm b{color:var(--warn)}
.lock-left.hot{border-color:var(--danger);color:var(--danger)}
.lock-left.hot b{color:var(--danger)}
@media print{.lock-left{display:none}}
/* 3단계 경고(2026-08-12) — 10분 전은 기본, 5분 전 주황, 1분 전 빨강.
   ⚠ 색만으로 급한 정도를 알리지 않는다 — 남은 시간(분·초)을 항상 글자로 함께 적는다(접근성). */
.ka-banner .ka-why{opacity:.75;font-size:12px;display:block;margin-top:2px}
/* (.ka-warm/.ka-hot 5분·1분 단계 색은 2026-08-29 경고 1회 전환으로 삭제) */
/* ⚠ width 분기에는 반드시 `screen and`를 붙인다 — 없으면 인쇄(A4)에도 적용된다(A8 규칙) */
@media screen and (max-width:520px){
  .ka-banner{left:12px;right:12px;transform:none;font-size:13px;padding:10px 12px}
}

/* ── 2026 세제개편안 인포그래픽(세금 탭) ── 2026-08-04
   ⚠ 인쇄에서도 읽혀야 한다(리포트에 끼워 내보낼 수 있음) — 배경색은 옅게, 글자는 본문 대비 유지. */
.rf-time{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
.rf-step{flex:1 1 150px;min-width:140px;border:1px solid var(--line);border-radius:10px;
  padding:8px 10px;background:var(--navy-soft)}
.rf-step .rf-when{font-size:11.5px;font-weight:800;color:var(--brand-ink);letter-spacing:.02em}
.rf-step .rf-what{font-size:12.5px;color:var(--ink);margin-top:2px;line-height:1.45}
.rf-card{border:1px solid var(--line);border-left:3px solid var(--brand-ink);border-radius:10px;
  padding:10px 12px;background:#fff}
.rf-card.rf-cut{border-left-color:var(--danger);background:var(--danger-bg)}
.rf-card .rf-head{display:flex;gap:6px;align-items:baseline;flex-wrap:wrap;margin-bottom:6px}
.rf-card .rf-head b{font-size:13.5px;line-height:1.4}
table.rf-t{margin:0;font-size:12.5px}
table.rf-t th{width:52px;text-align:left;vertical-align:top;color:var(--muted);
  font-weight:700;padding:3px 6px 3px 0;background:transparent;border:0}
table.rf-t td{padding:3px 0;border:0;line-height:1.5}
table.rf-t td.rf-new{color:var(--brand-ink);font-weight:600}
.rf-card p.rf-what{font-size:12.5px;margin:6px 0 0;line-height:1.55}
.rf-card .rf-src{font-size:11px;opacity:.75}

/* ---------- 9) Badges / Pills ---------- */
.badge{
  display:inline-flex;align-items:center;gap:4px;
  padding:3px 11px;border-radius:var(--r-pill);font-size:11.5px;font-weight:700;
  border:1px solid transparent;line-height:1.45;white-space:nowrap;
}
.badge.ok{background:var(--ok-bg);color:var(--ok);border-color:var(--ok-line)}
.badge.warn{background:var(--warn-bg);color:var(--warn);border-color:var(--warn-line)}
/* A5(2026-08-11): muted(#6b7482) on line-soft는 대비 4.16:1로 AA(4.5) 미달이었다(배지 중 최다 사용).
   글자색을 ink-soft(#3d4657)로 내려 대비를 확보한다(11.5px bold라 large-text 완화 적용 불가). */
.badge.gray{background:var(--line-soft);color:var(--ink-soft);border-color:var(--line)}
.badge.danger{background:var(--danger-bg);color:var(--danger);border-color:var(--danger-line)}
.badge.navy{background:var(--navy-soft);color:var(--brand-ink);border-color:#d3ddf0}
.badge.gold{background:var(--gold-soft);color:#8a6516;border-color:var(--gold-line)}
.badge.team{background:var(--team-bg);color:var(--team);border-color:var(--team-line)}
/* 자료실 파일명·설명 — 좁은 화면에서 표 전체가 nowrap이 되므로 긴 값(파일명 80자·설명 200자)이
   한 줄로 늘어나 표를 과도하게 넓혔다. 달력 칩(.cal-item)과 같은 말줄임 규칙을 쓴다(전문은 title). */
.lib-name,.lib-note{display:block;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 광고물 심의 기록(로드맵 6순위 · 2026-08-26) — 행 안 한 줄 폼. <details>로 접어 두어 표가 안 넓어진다 */
.lib-review{display:inline-block;vertical-align:middle}
.lib-review>summary{list-style:none;cursor:pointer;display:inline-block}
.lib-review>summary::-webkit-details-marker{display:none}
.lib-review-form{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:flex-end;margin-top:8px;padding:8px 10px;
  border:1px solid var(--line);border-radius:8px;background:#fafbfd;white-space:normal}
.lib-review-form label{display:flex;flex-direction:column;gap:3px;font-size:12px;margin:0}
.lib-review-form input,.lib-review-form select{width:auto;min-width:120px;font-size:13px}
.lib-adrow label.chk{margin-top:22px}
/* 교육자료 하위 폴더(2026-09-04) — 분류 카드 안에 접이식으로 쌓인다. 구분 칩(.chip)과는
   다른 요소라 헷갈리지 않게 얇은 위 경계선으로만 구분한다(색 추가 없음 — 토큰만). */
.lib-sub{border-top:1px solid var(--line-soft);padding-top:10px;margin-top:10px}
.lib-sub:first-of-type{border-top:none;margin-top:0;padding-top:0}
.lib-sub>summary{cursor:pointer;padding:4px 0}

/* ---------- 10) Tabs (anchor nav) ---------- */
.tabs{
  display:flex;gap:4px;flex-wrap:wrap;margin:2px 0 var(--sp-5);
  padding:6px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-pill);
  box-shadow:var(--sh-1);
  position:sticky;top:64px;z-index:30;
}
/* 🔴 2026-08-26 사용자 지시 — "긴 화면에서 다시 올라오기 힘들다, 목차 띠가 스크롤을 따라오게".
   08-25에는 '자산현황만 따라와 다른 화면과 다르다'를 **빼는 쪽**으로 통일했는데 사용자 의도는 반대였다 —
   전 화면이 따라오게 통일한다(.tabs + 화면 목차 띠 .tabnav-stick). top:64px = .mainbar 한 줄 높이.
   ⚠ 900px 아래에서는 sticky를 끈다(아래 media) — 헤더가 접혀 64px가 안 맞고, 띠가 줄바꿈되면 시야만 가린다. */
.tabs a{
  padding:9px 16px;border-radius:var(--r-pill);font-size:var(--fs-sm);font-weight:700;color:var(--ink-soft);
  transition:background .15s,color .15s;
}
.tabs a:hover{background:var(--navy-soft);color:var(--brand-ink);text-decoration:none}
.tabs a:target,.tabs a.active{background:var(--brand);color:var(--on-brand)}

/* 재무지표 — 화면에서도 리포트처럼 '한 줄 1지표'(.gauge-line 재사용).
   줄 안의 산출근거·제안만 클릭해 펼친다. */
@media screen{
  /* 화면 폭 상한을 없앤 뒤로 게이지 SVG(width:100%)가 같이 늘어나 지표 한 줄이 과하게 커졌다.
     화면에서는 게이지 폭을 묶고 여백·글자를 줄여 9개 지표가 한눈에 들어오게 한다. */
  .gauge-line{padding:9px 12px;margin-top:7px;border-radius:8px}
  .gauge-line .gl-head{gap:7px}
  .gauge-line .gl-head .l{font-size:13px}
  .gauge-line .gl-cur{font-size:11.5px}
  .gauge-line .gl-gauge{margin-top:2px;max-width:520px}
  .gauge-line .gl-desc{margin-top:5px;padding-top:5px}
  .gauge-line .ind-desc{margin-top:0;font-size:11px}
  .gauge-line .ind-form{font-size:10.5px}
}
/* 줄 안의 펼침 버튼은 박스 없이 작은 링크처럼 — 지표 한 줄의 높이를 아끼기 위함 */
.gl-more{margin-top:3px}
.gl-more>summary{
  display:inline-block;padding:0;background:none;border:none;border-radius:0;
  font-size:11.5px;color:var(--muted);font-weight:600;
}
.gl-more>summary:hover{background:none;color:var(--brand-ink)}
.gl-more[open]>summary{margin-bottom:2px}
.gl-more table{margin-top:4px;font-size:12px}
.gl-more td{padding:5px 9px}
/* 지표 기준 직접 수정 칸 */
.th-edit{display:flex;gap:8px;flex-wrap:wrap}
.th-edit label{font-size:11.5px;color:var(--muted);display:flex;align-items:center;gap:5px;white-space:nowrap}
.th-edit input{width:78px;padding:5px 7px;font-size:12.5px;text-align:right}

/* 자산현황 2단 선택: 대분류 카드 안의 세부분류 칩 */
.subchips{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0 4px}
.subchips .chip{
  padding:6px 12px;border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface);
  font-size:12.5px;font-weight:700;color:var(--ink-soft);cursor:pointer;line-height:1.3;
}
.subchips .chip:hover{background:var(--navy-soft);color:var(--brand-ink)}
.subchips .chip.on{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
.subchips .chip.on .badge{background:rgba(255,255,255,.22);color:var(--on-brand)}
/* 대시보드 화면 순서 바꾸기 목록 */
.ord-list{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.ord-row{
  display:flex;align-items:center;gap:10px;padding:8px 12px;
  border:1px solid var(--line);border-radius:8px;background:var(--surface);font-size:13px;
}
.ord-no{
  flex:none;width:22px;height:22px;border-radius:50%;background:var(--navy-soft);
  color:var(--brand-ink);font-size:11.5px;font-weight:800;display:flex;align-items:center;justify-content:center;
}
.ord-name{flex:1;min-width:0;font-weight:700;color:var(--ink-soft);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ord-row .btn[disabled]{opacity:.35;pointer-events:none}

/* 자산현황 표 — 세부분류 표끼리 세로줄이 맞도록 열 너비 고정 */
/* 고정폭 열 합계(986px)보다 표가 좁으면 폭 미지정 열(상품명)이 0으로 붕괴한다(2026-09-02 대표 지적
   '자산내역 상품명 실종' — 1440px 노트북에서 실제 발생). min-width로 바닥을 깔고 부족분은
   .table-scroll 가로 스크롤에 맡긴다(986 + 상품명 170 = 1156 → 1160). */
.tx-table{table-layout:fixed;min-width:1160px}
.tx-table td,.tx-table th{overflow:hidden;text-overflow:ellipsis}
/* 상품명은 남는 폭을 다 쓰되 최소 폭을 보장한다 —
   예전엔 다른 칸이 폭을 다 가져가 '미…CMA'처럼 줄바꿈+잘림이 동시에 났다. */
.tx-table .c-title{min-width:170px}
.tx-table .c-title b{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tx-table .c-phase{width:72px}
.tx-table .c-inst{width:104px}
.tx-table .c-owner{width:70px}
.tx-table .c-m{width:100px}
.tx-table .c-t{width:120px}
.tx-table .c-date{width:90px}
.tx-table .c-term{width:82px}
.tx-table .c-type{width:126px}
.tx-table .c-act{width:132px}
/* 가입일·만기일 — 날짜가 두 줄로 감기거나 말줄임(2026-11…)되지 않게 폭·글씨 조정 */
.tx-table td.dt{font-size:11.5px;white-space:nowrap;padding-left:6px;padding-right:6px;
  font-variant-numeric:tabular-nums}
/* 인라인 빠른선택 드롭다운(기간·유형) */
.tx-table select.qs{width:100%;padding:4px 6px;font-size:12px}
.tx-table td:last-child{overflow:visible;white-space:nowrap}
.tx-table td.num{font-variant-numeric:tabular-nums}
/* 🔴 2026-09-07 대표 "자산현황에서 폭 아직도 일정하지않아".
   부동산 표만 자동 폭(내용에 맞춤)이라, 바로 위 투자형·연금형 표와 세로줄이 하나도 안 맞았다.
   ⚠ 자동 폭은 '표 하나'만 보면 예뻐 보이지만, 표를 세로로 쌓는 이 화면에서는 어긋남이 눈에 띈다.
   고정 폭으로 바꾸고 **고정 열 합계를 금융 표와 똑같이(986px)** 맞춘다 —
   그러면 남는 폭을 먹는 이름 열(c-title)의 폭까지 같아져, 두 표의 모든 세로줄이 포개진다.
   소재지 256 = 986 - (72+70+120+120+90+126+132). 숫자를 바꾸면 여기도 함께 고쳐야 한다. */
.re-table .c-loc{width:256px}
.re-table .c-act{width:132px}
/* 부채 표 전용 열(이자율·상환방법·기간) — 다른 표에 없는 성격이라 여기서만 폭을 준다.
   부채는 열이 12개라 합계가 커서 넓은 화면에서도 가로 스크롤이 날 수 있다(정상). */
.tx-table .c-rate{width:74px}
.tx-table .c-repay{width:96px}
.tx-table .c-span{width:110px}
.debt-table{min-width:1276px}
@media screen and (max-width:900px){
  /* 좁은 화면에서는 고정폭을 풀고 가로 스크롤(.table-scroll)에 맡긴다 */
  .tx-table{table-layout:auto;min-width:900px}
}
/* 자산 입력폼 '세부 항목' 접기 — 목록에 안 나오는 칸은 접어 두고 요약만 보여준다(7.27) */
.asset-more{margin-top:6px}
.asset-more>summary{font-weight:700}
.asset-more>summary .muted{font-weight:400;font-size:12px}
.asset-more>summary .badge{margin-left:6px;vertical-align:1px}
.tx-sub{margin-top:10px}
.tx-sub-h{
  display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;
  padding:7px 12px;background:var(--surface-2,#f6f8fb);border-radius:8px;font-weight:700;font-size:13px;
}

/* ---------- 11) Auth (login/setup) ---------- */
.auth-wrap{max-width:410px;margin:min(12vh,96px) auto 0;text-align:center}
.auth-wrap h1{display:flex;align-items:center;justify-content:center;gap:9px;margin-bottom:var(--sp-4)}
.auth-wrap .card{padding:34px 30px;box-shadow:var(--sh-3);border-radius:var(--r-xl);text-align:left;
  border-top:3px solid var(--gold)}
.auth-wrap .card p{text-align:center}
.auth-wrap label{text-align:left}

/* ---------- 12) Feedback / misc ---------- */
.err{background:var(--danger-bg);color:var(--danger);border:1px solid var(--danger-line);
  padding:11px 14px;border-radius:var(--r-sm);font-size:var(--fs-sm);margin:10px 0;font-weight:600}
details{border-radius:var(--r-sm)}
details summary{cursor:pointer;font-weight:700;color:var(--brand-ink);font-size:var(--fs-sm);
  padding:9px 13px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
  list-style:none;transition:background .15s;user-select:none}
details summary:hover{background:var(--navy-soft)}
details summary::-webkit-details-marker{display:none}
details summary::before{content:"＋ ";color:var(--gold-strong);font-weight:800}
details[open] summary::before{content:"－ "}
details[open] summary{border-bottom-left-radius:0;border-bottom-right-radius:0}

.empty{padding:24px;text-align:center;color:var(--muted);font-size:var(--fs-sm)}

/* 체크박스 라벨 (상담 신청내역 등) */
label.chk{display:inline-flex;align-items:center;gap:7px;margin:0;padding:9px 13px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
  font-size:var(--fs-sm);color:var(--ink);font-weight:600;cursor:pointer;transition:background .15s,border-color .15s}
label.chk:hover{background:var(--navy-soft);border-color:#cdd6e6}
label.chk input{width:auto;margin:0;accent-color:var(--brand)}
label.chk:has(input:checked){background:var(--gold-soft);border-color:var(--gold-line);color:var(--brand-ink)}
.kpi .n .won{font-size:14px;color:var(--muted);font-weight:600}

textarea#s,textarea#d{font-family:var(--font);font-size:var(--fs-sm);line-height:1.6}

/* ---------- 14) Stat 카드 (대시보드 상단 — 참고 양식의 컬러 스탯카드) ---------- */
.stat{
  position:relative;overflow:hidden;border-radius:var(--r-lg);padding:18px 20px;
  border:1px solid var(--line);background:var(--surface);box-shadow:var(--sh-1);
  transition:transform .16s,box-shadow .16s;
}
.stat:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
.stat .s-label{font-size:12.5px;font-weight:700;opacity:.85;display:flex;align-items:center;gap:7px}
.stat .s-value{font-size:29px;font-weight:800;letter-spacing:-.025em;line-height:1.15;
  margin-top:6px;font-variant-numeric:tabular-nums}
.stat .s-value .u{font-size:14px;font-weight:600;opacity:.8}
h1 .icn,h2 .icn{color:var(--gold-strong)}
.stat .s-hint{font-size:11.5px;margin-top:6px;opacity:.75}
.stat.navy{background:linear-gradient(135deg,#24385f,#16233f);color:#fff;border-color:#16233f}
.stat.navy .s-hint a{color:#e4c87e}
.stat.gold{background:linear-gradient(135deg,#e4c87e,#c8a24a);color:#1b2a4a;border-color:#c8a24a}
.stat.line{border-left:4px solid var(--gold)}
.stat .s-spark{position:absolute;right:12px;bottom:8px;opacity:.9}

/* ---------- 14-0) 사이드바 사용자 표시 ---------- */
/* 🔴 2026-08-25 사용자 지시 — "000 재무설계사에는 네모칸 없애".
   금색 상자가 로고 바로 밑에 있어 사이드바 머리에 상자가 둘(로고칸+이름칸)이었다.
   ⚠ 지우는 것은 **상자**뿐이다 — 이름·직함 글자와 자리는 그대로 둔다(누구로 들어와 있는지는 늘 보여야 한다). */
.side-user{margin:0 0 6px;padding:0 0 10px 14px;text-align:left;
  border-bottom:1px solid rgba(255,255,255,.08)}
.side-user .su-name{font-weight:800;color:#fff;font-size:14px}
.side-user .su-role{font-size:11px;color:#c8a24a;font-weight:700;margin-top:1px}

/* ---------- 14-0-1) 대시보드 히어로 (시작화면 양식) ---------- */
.hero{
  background:linear-gradient(140deg,#1e3055 0%,#15233f 55%,#101b31 100%);
  border-radius:var(--r-xl);padding:34px clamp(20px,4vw,44px);margin-bottom:var(--sp-5);
  color:#fff;text-align:center;box-shadow:var(--sh-2);
  border:1px solid rgba(200,162,74,.3);position:relative;overflow:hidden;
}
.hero::after{content:"";position:absolute;right:-70px;top:-70px;width:230px;height:230px;
  border-radius:50%;background:radial-gradient(circle,rgba(200,162,74,.2),transparent 70%)}
.hero .h-title{font-size:clamp(20px,2.6vw,27px);font-weight:700;letter-spacing:.02em;margin:0;color:#dcbb66}
.hero .h-sub{color:#93a0bb;font-size:13.5px;margin-top:6px}
.hero .h-search{max-width:560px;margin:18px auto 0}
.hero .h-search input{
  padding:14px 22px;border-radius:16px;border:1px solid rgba(255,255,255,.18);
  background:rgba(255,255,255,.08);color:#fff;font-size:15px;backdrop-filter:blur(4px);
}
.hero .h-search input::placeholder{color:#8d99b5}
.hero .h-search input:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(200,162,74,.3)}
.hero .h-chips{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:14px;position:relative}
.hero .h-chip{
  padding:8px 16px;border-radius:var(--r-pill);font-size:13px;font-weight:700;
  background:rgba(255,255,255,.09);color:#d7deec;border:1px solid rgba(255,255,255,.14);
  transition:background .15s,color .15s;
}
.hero .h-chip:hover{background:rgba(200,162,74,.28);color:#fff;text-decoration:none;border-color:rgba(200,162,74,.5)}

/* ---------- 14-0-2) 로그인/설정 풀스크린 히어로 ---------- */
.hero-screen{
  min-height:100vh;display:grid;place-items:center;padding:30px 16px;
  background:linear-gradient(150deg,#1e3055 0%,#15233f 45%,#0d1729 100%);
  margin:calc(-1 * clamp(20px,3vw,32px)) calc(-1 * clamp(15px,3vw,22px));
}
.hero-inner{text-align:center;max-width:560px;width:100%}
.hero-mark{display:inline-grid;place-items:center;width:64px;height:64px;border-radius:18px;
  background:linear-gradient(135deg,#dcbb66,#c8a24a);font-size:32px;margin-bottom:18px;
  box-shadow:0 6px 24px rgba(200,162,74,.4)}
.hero-mark svg{width:30px;height:30px;color:#13203a}
.hero-title{color:#fff;font-size:clamp(22px,3vw,30px);font-weight:700;letter-spacing:.01em;line-height:1.45;margin:0}
.hero-sub{color:#93a0bb;font-size:14px;margin-top:10px}
.hero-warn{color:#e8b4ac}   /* 네이비 히어로 위 경고 글자(setup) — 인라인 hex를 여기로(2026-08-29 (b)) · 테마 제외 화면 */
.hero-box{
  max-width:420px;margin:22px auto 0;padding:22px;border-radius:18px;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(6px);
}
.hero-box input{
  margin-bottom:8px;padding:12px 16px;border-radius:12px;font-size:15px;
  background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.16);color:#fff;
}
.hero-box input::placeholder{color:#8d99b5}
.hero-box input:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(200,162,74,.3)}
/* 로그인 — 상단 로고 바 + 하단 2단(구분선 없음) */
.login-split{
  display:grid;grid-template-rows:auto 1fr;place-items:stretch;
  padding:34px clamp(24px,6vw,88px) 44px;
}
.ls-top{display:flex;align-items:center}
.ls-body{
  display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,.9fr);align-items:center;
  gap:clamp(28px,6vw,80px);
}
.login-split .ls-left{display:flex;flex-direction:column;justify-content:center;gap:18px;
  align-items:flex-start;max-width:620px}
.ls-logo{width:clamp(190px,17vw,250px);height:auto;display:block}
.ls-title{color:#fff;font-size:clamp(21px,2.4vw,30px);font-weight:700;line-height:1.5;
  letter-spacing:-.01em;margin:0;text-wrap:balance}
.ls-sub{color:#9aa6c1;font-size:clamp(13.5px,1.1vw,15px);line-height:1.75;margin:0}
.ls-kw{color:var(--gold);font-size:12px;font-weight:600;letter-spacing:.14em;margin:2px 0 0}
.login-split .ls-right{display:flex;flex-direction:column;justify-content:center;align-items:center}
.ls-panel{width:100%;max-width:340px}
.ls-eyebrow{color:#8593b1;font-size:11.5px;font-weight:700;letter-spacing:.16em;
  text-transform:uppercase;margin:0 0 18px}
.ls-form{display:flex;flex-direction:column;gap:9px}
/* :not([type=checkbox]) — '아이디 저장' 체크박스가 아이디 칸처럼 커다란 검은 상자가 되지 않게(2026-09-07) */
.ls-form input:not([type=checkbox]){
  padding:12px 15px;border-radius:11px;font-size:14.5px;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.15);color:#fff;
}
.ls-form input::placeholder{color:#8d99b5}
.ls-form input:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(200,162,74,.28)}
/* 🔴 2026-09-07 대표 "아이디 저장 체크 만들어주고 아이디 매번 칠 필요 없게".
   ⚠ 저장하는 것은 **아이디뿐**이다 — 비밀번호는 저장하지 않는다(문구로도 밝힌다). */
.ls-save{display:flex;align-items:center;gap:8px;margin:2px 0 0;font-size:12.5px;color:#8593b1;cursor:pointer;user-select:none}
.ls-save input{width:15px;height:15px;accent-color:var(--gold);cursor:pointer;flex:none}
.ls-submit{width:100%;margin-top:5px;padding:12px}
.ls-msg{margin:0 0 12px;border-radius:10px;padding:10px 14px;font-size:13px}
.ls-ok{background:#153a2a;border:1px solid #2e7d5b;color:#a7e3c5}
.ls-join{margin:16px 0 0;font-size:12.5px;color:#8593b1;line-height:1.7}
.ls-join a{color:var(--gold);font-weight:700}
.ls-join span{display:block;opacity:.75;font-size:12px;margin-top:2px}
.ls-foot{margin:26px 0 0;font-size:11.5px;color:#66718d;letter-spacing:.02em}
@media screen and (max-width:900px){
  .login-split{padding:30px 24px 40px;align-content:center}
  .ls-body{grid-template-columns:minmax(0,1fr);gap:28px}
  .login-split .ls-left{max-width:none}
  .login-split .ls-right{align-items:stretch}
  .ls-title{font-size:21px}
  .ls-logo{width:180px}
  .ls-panel{max-width:none}
}

/* ---------- 14-0-3) 대시보드 — 선 없이 여백으로 구분 + 좌본문/우요약 2단 ---------- */
/* 7차(2026-08-25) — 첫 화면이 **스크롤 없이** 들어오게 세로 밀도를 줄인다: 간격 18→12 · 인사말·지표·카드 패딩 축소 */
.dash{display:flex;flex-direction:column;gap:12px}
/* 4차 지시(2026-08-25): 인사말을 가운데로 */
.dash-head{display:flex;flex-direction:column;gap:3px;align-items:center;text-align:center}
.dh-title{font-size:clamp(18px,1.6vw,22px);font-weight:800;letter-spacing:-.015em;margin:0;color:var(--brand-ink)}
.dh-sub{margin:0;color:var(--muted);font-size:13.5px}
.dh-search{width:min(600px,100%);max-width:600px;margin-top:4px}   /* 7차 지시: 인사말보다 조금 길게(420→600) */
.dh-search input{padding:11px 16px;border-radius:var(--r-pill);background:var(--surface);
  border:1px solid var(--line);font-size:14px}

/* 4차(2026-08-25) 사용자 지시 — "고객이 1명이면 고객 인적사항 칸이 할 일 칸과 안 맞는다 · 공란으로 비워 정렬".
   두 열을 stretch하고 각 열의 **마지막 카드**가 남는 높이를 먹는다 → 왼쪽·오른쪽 열의 밑선이 늘 맞는다
   (고객이 몇 명이든 · 카드 안은 빈 공간으로 남는다). */
.dash-cols{display:grid;grid-template-columns:minmax(0,1.62fr) minmax(0,.94fr);gap:12px;align-items:stretch}
.dash-main>.card:last-child,.dash-side>.card:last-child{flex:1 1 auto}
/* 사이드바 고객 이름 = 링크(2026-08-25) — 묶음 제목 모양은 그대로, 현재 화면이면 강조 */
.side-cname{display:inline-flex;align-items:center;gap:8px;color:inherit}
.side-cname:hover{color:#fff;text-decoration:none}
.side-cname.active{color:var(--gold)}
/* 5차 지시(2026-08-25): 열 안 카드 간격(위아래)을 열 사이 간격(좌우 18px)과 **같게** — "간격 맞춰줘" */
.dash-main,.dash-side{display:flex;flex-direction:column;gap:12px;min-width:0}
@media screen and (max-width:1100px){.dash-cols{grid-template-columns:minmax(0,1fr)}}

/* 선 제거: 대시보드 카드는 테두리 없이 흰 면 + 옅은 그림자만 */
/* 일정 알림 띠 — 지정한 알림 시점부터 당일까지, 항목별로 끌 수 있음 */
.notice-bar{background:var(--surface);border-left:3px solid var(--gold);border-radius:var(--r-lg);
  padding:14px 18px;box-shadow:0 1px 3px rgba(20,32,60,.05);display:flex;flex-direction:column;gap:2px}
.nb-head{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;
  padding-bottom:8px}
.nb-title{font-weight:800;color:var(--brand-ink);font-size:14.5px;display:flex;align-items:center;gap:7px}
.nb-title svg{width:17px;height:17px;color:var(--gold-strong)}
.nb-row{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:7px 0;font-size:13.5px}
.nb-row + .nb-row{border-top:1px solid var(--line-soft)}
.nb-when{font-weight:800;font-size:12px;color:var(--muted);min-width:34px}
.nb-when.today{color:var(--danger)}
.nb-date{color:var(--muted);font-size:12.5px;font-variant-numeric:tabular-nums}
.nb-text{flex:1;min-width:150px;color:var(--ink)}
.nb-off{margin-left:auto}
.nb-off label{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--muted);
  cursor:pointer;margin:0;font-weight:600}
.nb-off input{width:auto;margin:0}
@media screen and (max-width:640px){.nb-off{margin-left:0}}

.dash .grid.fit{grid-template-columns:repeat(4,minmax(0,1fr))}
@media screen and (max-width:1500px){.dash .grid.fit{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media screen and (max-width:560px){.dash .grid.fit{grid-template-columns:minmax(0,1fr)}}
.dash .card{border:0;box-shadow:0 1px 3px rgba(20,32,60,.05);margin-bottom:0;padding:14px 18px}
.dash .card.warnline{border-left:3px solid var(--gold)}
.dash .stat{border:0}
.dash .side-row{font-size:12.5px;padding:5px 0;color:var(--ink-soft);line-height:1.5}
.dash .side-row + .side-row{border-top:1px solid var(--line-soft)}
.dash .side-row b{color:var(--brand-ink)}
.dash .side-row svg{vertical-align:-2px;width:14px;height:14px;color:var(--muted)}
.dash .dash-side .card{padding:16px 18px}
.dash .dash-side label{font-size:12px;margin-top:8px}
.dash .dash-side input,.dash .dash-side select{padding:8px 11px;font-size:13px}
.dash summary{font-size:12.5px;color:var(--muted);cursor:pointer;font-weight:600}
.dash .mkt-grid.mini{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px}
.dash .mkt-card{padding:10px 12px}

.hero-chips{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:20px}
.hero-chip{padding:7px 14px;border-radius:var(--r-pill);font-size:12px;font-weight:600;
  background:rgba(255,255,255,.07);color:#a9b4cc;border:1px solid rgba(255,255,255,.12)}

/* ---------- 14-0-3) 월간 캘린더 (회사 스케줄표 양식) ---------- */
table.cal{table-layout:fixed;min-width:760px}
table.cal th{text-align:center;background:var(--brand);color:var(--on-brand);font-size:12.5px;padding:8px}
table.cal th.sun{color:#ffb3ab}
table.cal th.sat{color:#a8c4ff}
table.cal td{vertical-align:top;height:86px;padding:6px 7px;border:1px solid var(--line-soft);font-size:12px}
table.cal td.out{background:var(--surface-2);opacity:.45}
table.cal td.today{background:var(--gold-soft);box-shadow:inset 0 0 0 2px var(--gold)}
.cal-day{font-weight:800;color:var(--brand-ink);font-size:12.5px;margin-bottom:4px}
.cal-day.sun{color:#c0392b}   /* B7-10: 4.38:1(AA 미달) → 5.44:1 */
.cal-day.sat{color:#3b6fd4}
.cal-item{margin-top:3px;padding:3px 7px;border-radius:7px;font-size:11.5px;font-weight:600;line-height:1.4;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal-item.meet{background:var(--gold-soft);color:#8a6516;border:1px solid var(--gold-line)}
.cal-item.meet a{color:#8a6516}
.cal-item.co{background:var(--navy-soft);color:var(--brand-ink);border:1px solid #d3ddf0}
.cal-item.priv{background:var(--ok-bg);color:#0b5c30;border:1px solid var(--ok-line)}
.cal-x{border:none;background:none;color:var(--danger);cursor:pointer;font-weight:800;padding:0 2px;font-size:12px}
/* 2개월 나란히(작은 캘린더) — 좁은 화면에선 세로 스택 */
.cal-duo{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:14px;margin-top:10px}
.cal-duo table.cal{min-width:0;width:100%}
.cal-duo table.cal th{font-size:11px;padding:5px}
.cal-duo table.cal td{height:56px;padding:3px 4px;font-size:10.5px}
.cal-duo .cal-day{font-size:11px;margin-bottom:2px}
.cal-duo .cal-item{font-size:10px;padding:2px 5px;margin-top:2px}
.cal-duo .cal-title{font-weight:800;color:var(--brand-ink);font-size:13.5px;margin:2px 0 6px;text-align:center}
@media screen and (max-width: 860px){.cal-duo{grid-template-columns:minmax(0,1fr)}}

/* ---------- 14-0-3b) 고객 상세 탭 내비게이션 ---------- */
.tabnav{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:10px 0 14px;
  padding:8px 10px;background:var(--surface-2);border:1px solid var(--line-soft);border-radius:12px}
.tabnav-sep{width:1px;height:20px;background:var(--line-soft);margin:0 4px}
@media screen and (max-width: 700px){.tabnav-sep{display:none}}
/* 탭 그룹 — 상담 단계별로 묶어 라벨을 붙인다(자산현황·파악 / 진단·설계 / 산출물·기록) */
/* 2026-08-18 메뉴 다이어트 — 하위 앵커를 뺀 '화면 링크 한 줄'.
   기존 .side-sub summary와 **같은 모양**을 쓴다(새 모양을 만들면 두 종류가 섞여 보인다). */
/* 2026-08-18 사이드바 정렬 — 모든 행을 [아이콘 18px][글자][배지(우측)] 한 그리드로.
   🔴 예전에는 이모지가 글자에 섞여 있어 **글리프 폭이 제각각**이라 항목마다 텍스트 시작선이
     달랐고(캡처로 확인), 같은 레벨인데 좌 패딩이 11/16/22px 세 종류로 갈렸다.
     아이콘 슬롯을 고정폭으로 두면 텍스트 시작선이 전 항목 동일해진다. */
.side-sub-flat{display:flex;align-items:center;gap:8px;
  padding:6px 10px 6px 22px;border-radius:var(--r-xs);
  color:var(--side-item);font-size:13px;line-height:1.35;text-decoration:none}
.side-sub-flat .ico{width:18px;flex:none;display:inline-grid;place-items:center}
.side-sub-flat .ico svg{width:15px;height:15px;display:block;opacity:.85}
.side-sub-flat .sl{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.side-sub-flat:hover{background:rgba(255,255,255,.06);color:var(--side-hover)}
/* 활성은 **색만으로 알리지 않는다**(색약 사용자) — 좌측 금색 막대 + 배경 + 굵기 세 단서 */
.side-sub-flat.active{color:var(--side-active);font-weight:700;
  background:rgba(200,162,74,.14);box-shadow:inset 3px 0 0 var(--gold)}
/* '미입력' 배지는 오른쪽 끝으로 — 배지 열이 세로로 맞아 한눈에 스캔된다 */
.side-sub-flat .side-empty{margin-left:auto}
/* 리포트 항목(펼침형)도 같은 시작선으로 — 16px였다 */
.side-sub>summary{padding-left:22px}
.side-sub>summary .ico{width:18px;display:inline-grid;place-items:center;vertical-align:-3px}
.side-sub>summary .ico svg{width:15px;height:15px;opacity:.85}
/* 위계: 단계 제목을 묶음 라벨보다 한 단계 밝게(둘이 똑같아 병렬로 보였다) */
.side-stage>summary{color:var(--side-hover-2)}
.tabnav-group{margin-bottom:2px}
.tabnav-group .tabnav{margin:2px 0 8px}
.tabnav-label{display:block;font-size:11px;font-weight:700;letter-spacing:.06em;
  color:var(--muted);padding-left:2px}
/* 화면 목차 띠(base.html 자동 목차)가 스크롤을 따라온다 — 2026-08-26 사용자 지시(.tabs와 같은 규칙).
   sticky는 **그룹**에 건다 — 띠(.tabnav)에 걸면 담는 상자(그룹)가 낮아 몇 px 만에 멈춘다.
   그룹에 페이지 배경을 깔아, 지나가는 내용이 라벨·둥근 모서리 뒤로 비치지 않게 한다.
   ⚠ 자산현황·상세에는 목차 띠 자체를 그리지 않는다(base.html) — 그 화면은 .tabs가 담당한다. */
.tabnav-stick{position:sticky;top:64px;z-index:30;background:var(--bg);
  padding-top:4px;margin-top:-4px;box-shadow:0 6px 8px -6px rgba(20,32,60,.10)}
/* 항목 많은 화면(기초자료 9개·제안서 11개)에서 띠가 2~3줄로 접히면 스크롤 내내 화면을 가린다(UX 감수)
   → 따라오는 띠는 **한 줄 + 가로 스크롤**로 고정한다. */
.tabnav-stick .tabnav{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
.tabnav-stick .tabnav a{white-space:nowrap;flex:none}
/* ⚠ 해제 분기점은 **'모바일 판정'과 같아야 한다** — .mainbar가 static이 되는 분기와 하나로 묶는다.
   🔴 2026-08-27: 예전엔 960px이었는데, 모바일 판정만 820px로 좁히자 **821~960px(확대해 쓰는 PC)**
     에서 헤더는 sticky인데 띠만 static이 되는 어긋난 구간이 생겼다(디자인QA 적발).
     폭 하나로 갈랐던 규칙은 **전부** 같은 조건으로 옮긴다 — 그것이 이번 사고의 교훈이다. */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .tabs,.tabnav-stick{position:static;box-shadow:none}
  .tabnav-stick .tabnav{flex-wrap:wrap;overflow-x:visible}
}
/* 모바일 '맨 위로' — 모바일에서는 띠 sticky를 끄므로 원래 불편("다시 올라오기 힘들다")이
   그대로 남는다 → 우하단 고정 버튼으로 답한다(UX 감수 1-6). CSS-only(#main 앵커)·넓은 화면에선 숨김. */
.totop{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .totop{display:inline-flex;align-items:center;gap:4px;position:fixed;right:14px;bottom:14px;z-index:35;
    padding:9px 14px;border-radius:var(--r-pill);background:var(--m-acc);color:var(--m-acc-ink);
    font-size:var(--fs-cap);font-weight:700;box-shadow:var(--sh-2);text-decoration:none}
  .totop:hover{color:var(--m-acc-ink);text-decoration:none;opacity:.92}
}
@media print{.totop{display:none}}
/* 📱 푸시 알림 상태 줄(계정 화면) — 성공/사유를 색으로도 가른다(글로만 두면 스캔이 안 된다) */
.push-ok{color:var(--ok)}
.push-warn{color:var(--warn-ink,#8a5a00)}

/* ═══ 📱 모바일 개선(2026-08-26 · 60fps 패턴 B·C·D 채택) ═══════════════════════
   전부 **960px 이하에서만** 동작한다 — PC 화면·인쇄물은 하나도 바뀌지 않는다.
   ① 하단 탭바(Tab) ② 누름 반응(Shrink) ③ 목록 순차 등장(Sequence)
   ④ 더보기 시트(Bottom Sheet · CSS만) ⑤ 접히는 머리는 base.js가 클래스만 토글한다.
   ⚠ 움직임은 prefers-reduced-motion에서 전부 꺼진다(맨 아래 규칙). */
.mtabbar{display:none}
.msheet-host{display:none}
@media screen and (max-width:960px){
  /* ⚠ 여기서는 **모양만** 정한다 — 보일지 말지는 아래 '모바일 판정' 블록 하나가 결정한다
     (폭 하나로 숨겼다가 데스크톱 확대 사용자가 메뉴를 잃은 사고가 있었다 · 2026-08-26 저녁).
     ⚠ grid(repeat(5,1fr))로는 <label> 칸이 자리를 못 받아 5번째가 사라졌다(390px 실측) →
     flex + flex:1로 바꾼다. 각 칸이 같은 폭을 갖고 label도 확실히 한 칸을 차지한다. */
  .mtabbar{
    position:fixed;left:0;right:0;bottom:0;z-index:60;
    background:rgba(255,255,255,.9);backdrop-filter:blur(12px);
    border-top:1px solid var(--line);
    padding:6px 4px calc(6px + env(safe-area-inset-bottom,0px));
  }
  /* ⚠ '더보기'는 <label>이라 전역 `label{display:block;margin:11px 0 5px}`(0,0,1)에 밀린다 —
     요소를 붙여 명시도를 올려야 5번째 칸이 제대로 그려진다(실측에서 빈칸으로 나왔다). */
  .mtabbar>a,.mtabbar>label.mtab-more{
    flex:1 1 0;min-width:0;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;margin:0;
    padding:6px 2px;color:var(--muted);font-size:9.5px;font-weight:700;text-decoration:none;
    border-radius:10px;transition:color .18s,transform .12s;cursor:pointer;-webkit-tap-highlight-color:transparent;
  }
  .mtabbar>label.mtab-more:active{transform:scale(.9)}
  .mtabbar .ico svg{width:20px;height:20px}
  .mtabbar>a:active,.mtabbar>.mtab-more:active{transform:scale(.9);text-decoration:none}
  .mtabbar>a[aria-current="page"]{color:var(--brand-ink)}
  .mtabbar .mt-dot{width:16px;height:2.5px;border-radius:2px;background:var(--gold);
    opacity:0;transform:scaleX(.3);transition:opacity .2s,transform .2s}
  .mtabbar>a[aria-current="page"] .mt-dot{opacity:1;transform:scaleX(1)}
  /* (본문 하단 여백·'맨 위로' 위치는 탭바가 실제로 뜨는 '모바일 판정' 블록에서 준다 —
     탭바가 없는데 여백만 생기면 화면 아래가 비어 보인다) */
  /* ⚠ 사이드바 숨김·탭바 표시는 **이 블록에서 하지 않는다** — 아래 별도 블록(모바일 판정)으로 옮겼다.
     🔴 2026-08-26 저녁 사고: 데스크톱에서 브라우저를 확대해 쓰던 설계사의 CSS 폭이 960 아래로
       내려가 **사이드바가 통째로 사라져 일을 못 했다.** 폭 하나로 '모바일'을 단정하면 안 된다. */
  /* ── 더보기 시트: 체크박스가 켜지면 열린다(JS 없음) ── */
  .msheet-host{position:fixed;inset:0;z-index:70;pointer-events:none}
  .msheet-veil{position:absolute;inset:0;background:rgba(16,26,48,.45);opacity:0;
    transition:opacity .25s;cursor:pointer}
  .msheet{
    position:absolute;left:0;right:0;bottom:0;max-height:78vh;overflow-y:auto;
    background:var(--surface);border-radius:18px 18px 0 0;box-shadow:0 -12px 40px rgba(16,26,48,.28);
    transform:translateY(102%);transition:transform .32s cubic-bezier(.2,.8,.25,1);
    padding:8px 14px calc(16px + env(safe-area-inset-bottom,0px));
  }
  .mtab-more-state:checked ~ .msheet-host{pointer-events:auto}
  .mtab-more-state:checked ~ .msheet-host .msheet-veil{opacity:1}
  .mtab-more-state:checked ~ .msheet-host .msheet{transform:none}
  .msheet-grab{width:38px;height:4px;border-radius:2px;background:var(--line);margin:2px auto 10px}
  .msheet-t{font-size:12.5px;font-weight:800;color:var(--brand-ink);margin-bottom:6px}
  .msheet-list{display:flex;flex-direction:column}
  .msheet-list a{
    display:flex;align-items:center;gap:10px;padding:11px 6px;font-size:13px;font-weight:600;
    color:var(--ink);text-decoration:none;border-bottom:1px solid var(--line-soft);
  }
  .msheet-list a:last-child{border-bottom:0}
  .msheet-list a:active{background:var(--surface-2);text-decoration:none}
  .msheet-list .ico svg{width:17px;height:17px;color:var(--muted)}
  .msheet-list .side-empty{margin-left:auto}
  .msheet-close{display:block;width:100%;text-align:center;margin-top:10px;cursor:pointer}
  /* ── 누름 반응(Shrink) — 카드·버튼을 누르면 살짝 작아진다 ── */
  .card,.btn,.pol-card,.rowlink,.side-sub-flat{-webkit-tap-highlight-color:transparent}
  .btn:active,.pol-card:active,.tabnav a:active,.tabs a:active{transform:scale(.97)}
  .btn,.pol-card,.tabnav a,.tabs a{transition:transform .13s cubic-bezier(.2,.8,.25,1)}
  /* ── 목록 순차 등장(Sequence) — 카드가 위에서부터 차례로 ── */
  @keyframes kpwRise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
  .seq-in>.card:nth-child(-n+6),.pol-cards>.pol-card:nth-child(-n+6){
    animation:kpwRise .38s cubic-bezier(.2,.8,.25,1) backwards}
  .seq-in>.card:nth-child(2),.pol-cards>.pol-card:nth-child(2){animation-delay:.05s}
  .seq-in>.card:nth-child(3),.pol-cards>.pol-card:nth-child(3){animation-delay:.1s}
  .seq-in>.card:nth-child(4),.pol-cards>.pol-card:nth-child(4){animation-delay:.15s}
  .seq-in>.card:nth-child(5),.pol-cards>.pol-card:nth-child(5){animation-delay:.2s}
  .seq-in>.card:nth-child(6),.pol-cards>.pol-card:nth-child(6){animation-delay:.25s}
  /* ── 접히는 머리(Morph) — base.js가 .mainbar-slim을 토글한다 ── */
  .mainbar{transition:padding .26s cubic-bezier(.2,.8,.25,1)}
  .mainbar .mb-sub{transition:opacity .2s,max-height .26s;max-height:20px;overflow:hidden}
  body.mainbar-slim .mainbar{padding-top:6px;padding-bottom:6px}
  body.mainbar-slim .mainbar .mb-sub{opacity:0;max-height:0}
  body.mainbar-slim .mainbar .mb-title{font-size:13.5px}
  .mainbar .mb-title{transition:font-size .26s cubic-bezier(.2,.8,.25,1)}
}
/* ── 📱 자산현황 카드형(2026-08-27) — 표를 좌우로 미는 대신 카드로 읽는다 ──────────────
   같은 데이터를 표·카드 두 벌로 렌더하고 **CSS가 하나만** 보여 준다.
   기본은 카드 숨김이라 **PC와 인쇄물은 지금 표 그대로**다(인쇄 규칙을 따로 쓸 필요가 없다). */
.ax-cards{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .taxo-card .table-scroll{display:none}
  .ax-cards{display:flex;flex-direction:column;gap:8px;margin-top:8px}
  .axc{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:11px 13px;
    -webkit-tap-highlight-color:transparent}
  .axc-row{display:flex;gap:12px;justify-content:space-between;align-items:flex-start}
  .axc-l{min-width:0;flex:1 1 auto}
  .axc-r{flex:0 0 auto;text-align:right;max-width:46%}
  .axc-top{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:3px}
  /* ⚠ body의 word-break:keep-all은 공백 없는 긴 상품·계좌명을 못 꺾는다 → anywhere로 넘침을 막는다 */
  .axc-name{font-size:var(--fs-sm);font-weight:700;color:var(--ink);line-height:1.45;
    overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .axc-meta{font-size:var(--fs-note);color:var(--muted);margin-top:2px;overflow-wrap:anywhere}
  /* 부채 잔액 위 작은 라벨 — 색만으로 자산과 가르면 색약·야외 화면에서 구분이 안 된다 */
  .axc-cap{font-size:var(--fs-xs);color:var(--muted);font-weight:700;line-height:1.2}
  .axc-val{font-size:var(--fs-md);font-weight:800;color:var(--brand-ink);line-height:1.25;
    font-variant-numeric:tabular-nums;white-space:nowrap}
  .axc-val small{font-size:var(--fs-xs);font-weight:700;margin-left:1px}
  .axc-val.is-zero{color:var(--muted);font-weight:600}
  .axc-kv{font-size:var(--fs-cap);color:var(--muted);margin-top:2px;white-space:nowrap}
  .axc-kv b{color:var(--ink);font-variant-numeric:tabular-nums}
  .axc-dates{margin-top:7px;padding-top:7px;border-top:1px solid var(--line-soft);
    font-size:var(--fs-xs);color:var(--muted);font-variant-numeric:tabular-nums}
  /* 부채는 잔액을 위험색으로 — 자산 카드와 성격이 반대라는 신호(숫자에 마이너스는 붙이지 않는다) */
  .axc.axc-debt .axc-val{color:var(--danger)}   /* 모바일에선 브리지가 --m-danger로 잇는다 */
  .axc-more{margin-top:8px;border:0;background:transparent;padding:0}
  .axc-more>summary{min-height:38px;display:flex;align-items:center;color:var(--muted);
    background:transparent;border:0;padding:0}
  .axc-det{padding:6px 0 2px}
  .axc-line{display:flex;justify-content:space-between;gap:10px;font-size:var(--fs-cap);
    padding:5px 0;border-bottom:1px solid var(--line-soft)}
  .axc-line span{color:var(--muted)}
  .axc-line b{color:var(--ink);text-align:right;overflow-wrap:anywhere}
  .axc-qs{margin:8px 0 0}
  .axc-qs-l{display:flex;align-items:center;gap:8px;margin:0;font-size:var(--fs-cap);color:var(--muted)}
  .axc-qs-l select{flex:1 1 auto;min-height:38px}
  .axc-act{display:flex;gap:8px;align-items:center;margin-top:9px}
  .axc-act .btn{min-height:38px}
  /* 대분류 이동 칩 — 한 줄 가로 스크롤로 두면 시야를 가리지 않아 sticky를 쓸 수 있다
     (820px 아래에서 sticky를 껐던 이유가 '줄바꿈되면 화면을 덮는다'였다) */
  .tabs{position:sticky;top:0;z-index:30;flex-wrap:nowrap;overflow-x:auto;
    -webkit-overflow-scrolling:touch;scrollbar-width:none}
  .tabs::-webkit-scrollbar{display:none}
  .tabs a{flex:none}
  .taxo-card[id],#records,#comment{scroll-margin-top:60px}
  /* 수정하고 돌아왔을 때 그 카드가 칩 띠에 가리지 않게 — 표의 <tr>이 하던 일을 카드가 이어받는다 */
  .axc{scroll-margin-top:60px}
  .axc.is-back{animation:axcback 1.6s ease-out 1}
  @keyframes axcback{0%,60%{box-shadow:0 0 0 2px var(--gold)}100%{box-shadow:none}}
}

/* ── 📱 '모바일 판정' — 사이드바를 접고 하단 탭바를 켜는 **유일한** 조건 ────────────────
   🔴 2026-08-26 저녁 사고에서 배운 것: `max-width:960px` 하나로 판정하면
     **데스크톱에서 화면을 확대해 쓰는 사람**(노안·고해상도 노트북)이 갑자기 사이드바를 잃는다.
     실제로 그날 저녁 상담 중이던 설계사가 메뉴가 사라져 일을 못 했다.
   → 판정을 둘로 나눈다: ① 정말 좁은 화면(≤820px) ② 손가락 기기(pointer:coarse)이면서 ≤1100px.
     확대만 한 데스크톱은 보통 820~1280px에 머무르고 마우스(pointer:fine)라 **사이드바를 유지**한다.
   ⚠ 이 두 줄이 모바일 전환의 전부다 — 다른 곳에서 사이드바를 숨기지 말 것. */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .sidebar{display:none}
  /* ⚠ `overflow-x:hidden`은 조상을 **스크롤 상자**로 만들어 그 안의 sticky(칩 띠)를 죽인다.
     실제로 스크롤은 문서에서 일어나므로 띠가 영원히 안 붙는다(UX 감수 적발).
     `clip`은 잘라내기만 하고 스크롤 상자를 만들지 않는다 — 모르는 브라우저는 앞 줄(hidden)을 쓴다. */
  .shell{overflow-x:hidden;overflow-x:clip}
  .main{width:100%;min-width:0;padding-bottom:calc(64px + env(safe-area-inset-bottom,0px))}
  .mtabbar{display:flex;width:100vw}
  .msheet-host{display:block}
  .totop{bottom:calc(74px + env(safe-area-inset-bottom,0px))}
}
@media print{.mtabbar,.msheet-host{display:none!important}}
@media (prefers-reduced-motion: reduce){
  .mtabbar>a,.mtabbar>.mtab-more,.msheet,.msheet-veil,.btn,.pol-card,.mainbar,
  .seq-in>.card,.pol-cards>.pol-card{animation:none!important;transition:none!important}
}

/* 📣 필독 공지 팝업(대시보드) — [확인했습니다]를 눌러야 사라진다(2026-08-26 사용자 지시).
   전면 덮개(z-90)는 헤더(40)·목차 띠(30)보다 위 — 읽기 전에는 다른 조작을 막는 것이 필독의 뜻. */
.notice-modal-wrap{position:fixed;inset:0;z-index:90;display:flex;align-items:center;justify-content:center;
  background:rgba(16,26,48,.55);backdrop-filter:blur(2px);padding:20px}
/* 🔵 2026-09-22 대표 지시 — 본문만 스크롤하고 머리(제목·×)와 아래 버튼은 **항상 보이게**.
   예전엔 모달 전체가 overflow-y:auto라 배포 요약처럼 긴 공지에서 [확인했습니다]가 화면 밖에 있었다.
   ⚠ flex 자식이 스크롤되게 하려면 min-height:0이 필요하다(기본 auto면 내용 높이로 버텨 스크롤이 안 생긴다).
   ⚠ ×는 색을 토큰으로 새로 주지 않고 currentColor·inherit로 받는다 — 모바일 테마(--m-*)가 모달 색을
     다시 정의하므로, 여기서 고정 토큰을 쓰면 그 화면에서만 어긋난다(vendor-ui-scope-and-dark). */
.notice-modal{background:var(--surface);border-radius:var(--r-lg);max-width:560px;width:100%;
  max-height:82vh;display:flex;flex-direction:column;overflow:hidden;
  padding:22px 24px;box-shadow:var(--sh-3, 0 18px 50px rgba(16,26,48,.35));
  border-top:4px solid var(--gold)}
.notice-modal .nm-top{display:flex;align-items:flex-start;gap:12px;flex:0 0 auto}
.notice-modal .nm-ttl{flex:1 1 auto;min-width:0}
.notice-modal .nm-head{font-size:12px;font-weight:800;letter-spacing:.08em;color:var(--gold-ink)}
.notice-modal h2{margin:6px 0 2px;font-size:18px;overflow-wrap:anywhere}
.notice-modal .nm-date{font-size:12px;color:var(--muted);margin-bottom:10px}
.notice-modal .nm-x{flex:0 0 auto;width:36px;height:36px;margin:-4px -6px 0 0;
  display:flex;align-items:center;justify-content:center;
  background:transparent;border:1px solid currentColor;border-radius:50%;
  color:inherit;opacity:.55;font-size:22px;line-height:1;cursor:pointer;
  transition:opacity .15s,background .15s}
.notice-modal .nm-x:hover,.notice-modal .nm-x:focus-visible{opacity:1;background:var(--line-soft)}
.notice-modal .nm-body{white-space:pre-wrap;font-size:14px;line-height:1.7;color:var(--ink);
  border-top:1px solid var(--line-soft);padding-top:10px;
  flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain}
.notice-modal .nm-act{display:flex;justify-content:flex-end;gap:8px;margin-top:16px;flex-wrap:wrap;
  flex:0 0 auto;border-top:1px solid var(--line-soft);padding-top:14px}
@media print{.notice-modal-wrap{display:none}}

/* ── 위험·보장: 메리츠 보장분석 참고본 재현(2026-08-26 사용자 지시) ─────────────────
   ① 미가입/부족/충분 3분할 ② 담보 아코디언(권장 vs 가입·부족금액) ③ 레이더 4판 */
.pol-sum3-row{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0;
  border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden}
.pol-sum3-cell{display:flex;flex-direction:column;align-items:center;gap:2px;padding:14px 8px;
  text-decoration:none;background:var(--surface)}
.pol-sum3-cell+.pol-sum3-cell{border-left:1px solid var(--line)}
.pol-sum3-cell:hover{background:var(--navy-soft);text-decoration:none}
.pol-sum3-cell .l{font-size:var(--fs-cap);color:var(--muted);font-weight:700}
.pol-sum3-cell .n{font-size:24px;font-weight:800;line-height:1.1}
.pol-sum3-cell .n small{font-size:12px;font-weight:700;margin-left:1px}
/* 📇 증권 카드형 가입현황(2026-08-26 2차 · 참고본 재현) — 표는 상담 중 훑기 어렵다.
   왼쪽=보험사·상품·기간 / 오른쪽=월납·납입횟수·납입율·납입보험료(참고본과 같은 배치). */
.pol-cards{display:flex;flex-direction:column;gap:8px;margin-top:10px}
.pol-card{display:flex;gap:14px;align-items:stretch;justify-content:space-between;
  border:1px solid var(--line);border-radius:12px;padding:11px 13px;background:var(--surface);
  text-decoration:none;color:inherit;transition:border-color .15s,box-shadow .15s}
.pol-card:hover{text-decoration:none;border-color:var(--gold-line);box-shadow:var(--sh-1)}
.pol-card .pc-l{min-width:0;flex:1 1 auto}
.pol-card .pc-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pol-card .pc-co{font-size:13px;color:var(--brand-ink)}
.pol-card .pc-name{font-weight:700;font-size:14px;color:var(--ink);margin-top:3px;
  overflow:hidden;text-overflow:ellipsis}
.pol-card .pc-term{font-size:11.5px;color:var(--muted);margin-top:2px}
.pol-card .pc-r{flex:0 0 176px;text-align:right}
.pol-card .pc-prem{font-size:17px;font-weight:800;color:var(--brand-ink);line-height:1.2}
.pol-card .pc-prem small{font-size:11px;font-weight:700;margin-left:1px}
.pol-card .pc-kv{display:flex;justify-content:flex-end;gap:8px;font-size:11.5px;color:var(--muted);margin-top:2px}
.pol-card .pc-kv b{color:var(--ink);font-variant-numeric:tabular-nums}
.pol-card .pc-meter{margin-top:5px;height:6px}
.pol-cards-sum{margin-top:10px;padding-top:8px;border-top:1px solid var(--line);
  font-size:12.5px;color:var(--muted)}
@media screen and (max-width:700px){
  .pol-card{flex-direction:column;gap:8px}
  .pol-card .pc-r{flex:none;text-align:left}
  .pol-card .pc-kv{justify-content:flex-start}
}
.cov-area-t{margin:16px 0 6px;font-size:14px;font-weight:800;color:var(--brand-ink)}
.cov-acc{border:1px solid var(--line);border-radius:10px;margin-top:6px;background:var(--surface)}
.cov-acc>summary{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;
  padding:9px 12px;cursor:pointer;list-style:none;border-radius:10px;background:var(--surface-2)}
.cov-acc>summary::-webkit-details-marker{display:none}
.cov-acc[open]>summary{border-bottom:1px solid var(--line-soft);border-radius:10px 10px 0 0}
.cov-acc .cov-name{font-weight:700;font-size:13.5px;color:var(--brand-ink)}
.cov-acc .cov-sum-r{display:flex;align-items:center;gap:8px;margin-left:auto}
.cov-shortage{color:var(--danger);font-weight:800;font-size:13px}
.cov-acc-body{padding:10px 12px}
.cov-gv{display:flex;flex-wrap:wrap;gap:6px 22px;font-size:13px;margin-bottom:6px}
.cov-pol-tbl{width:100%}
.cov-pol-tbl td{padding:4px 8px;border-top:1px solid var(--line-soft)}
.radar-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:8px}
@media screen and (max-width:900px){.radar-grid{grid-template-columns:minmax(0,1fr)}}
.radar-cell{border:1px solid var(--line-soft);border-radius:var(--r-lg);padding:10px;
  display:flex;flex-direction:column;align-items:center;background:var(--surface)}
.radar-t{font-size:13.5px;color:var(--brand-ink);margin-bottom:2px}
.radar-legend{display:flex;gap:14px;font-size:12px;color:var(--muted);align-items:center;flex-wrap:wrap}
.radar-legend .rl{display:inline-block;width:18px;height:0;border-top:2.5px solid;vertical-align:middle;margin-right:4px}
.rl-before{border-color:#8c2438}
.rl-after{border-color:#1b2a4a}
.rl-guide{border-color:#98a0ae;border-top-style:dashed}

/* ---------- 14-0-4) 진행 현황판(파이프라인 보드) ---------- */
.pipe-board{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:10px;align-items:start}
.pipe-col{background:var(--surface-2);border:1px solid var(--line);border-radius:14px;padding:10px;min-height:120px}
.pipe-head{display:flex;justify-content:space-between;align-items:center;gap:6px;
  font-weight:800;font-size:13px;color:var(--brand-ink);padding:4px 4px 10px;
  border-bottom:2px solid var(--line)}
.pipe-head.hot{border-bottom-color:var(--gold)}
.pipe-head.done{border-bottom-color:var(--ok-line)}
.pipe-card{display:block;background:var(--surface);border:1px solid var(--line);border-radius:10px;
  padding:9px 11px;margin-top:8px;box-shadow:var(--sh-1);transition:transform .14s,box-shadow .14s}
.pipe-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2);text-decoration:none}
.pc-name{font-weight:800;font-size:13px;color:var(--brand-ink)}
.pc-meta{font-size:11px;color:var(--muted);margin-top:2px}
.pc-appt{font-size:11px;color:var(--ink-soft);margin-top:4px;background:var(--line-soft);
  border-radius:6px;padding:2px 7px;display:inline-block}
.pc-appt.soon{background:var(--gold-soft);color:#8a6516;font-weight:700;border:1px solid var(--gold-line)}
.pipe-empty{text-align:center;color:var(--muted);font-size:12px;padding:14px 0}
@media screen and (max-width:1100px){.pipe-board{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media screen and (max-width:640px){.pipe-board{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ---------- 14-1) 증시현황 ---------- */
.up{color:#c0392b;font-weight:700}       /* 국내 관례: 상승=빨강 */
/* B7-10(2026-08-03): 예전 #d64545는 흰 배경에서 대비 4.38:1로 **AA(4.5:1) 미달**이었다.
   빔프로젝터·고령 고객 화면에서 숫자가 흐리게 보인다. #c0392b = 5.44:1로 올렸다.
   ⚠ 국내 관례(상승=빨강)는 그대로 두고 채도만 낮췄다. 하락(.down #3b6fd4)은 이미 통과. */
.down{color:#3b6fd4;font-weight:700}     /* 하락=파랑 */
.flat{color:var(--muted);font-weight:700}
.mkt-grid{display:grid;gap:var(--sp-4);grid-template-columns:repeat(3,minmax(0,1fr))}
.mkt-card{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);
  padding:16px 18px;box-shadow:var(--sh-1);transition:transform .16s,box-shadow .16s;
}
.mkt-card:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
.mkt-card .m-name{font-size:13px;font-weight:700;color:var(--ink-soft);display:flex;gap:6px;align-items:center}
.mkt-card .m-price{font-size:24px;font-weight:800;color:var(--brand-ink);letter-spacing:-.02em;
  margin-top:4px;font-variant-numeric:tabular-nums}
.mkt-card .m-chg{font-size:12.5px;margin-top:2px;font-variant-numeric:tabular-nums}
.mkt-card svg{display:block;width:100%;height:44px;margin-top:8px}
.mkt-strip{display:flex;gap:10px;flex-wrap:wrap}
.mkt-chip{
  flex:1 1 150px;display:flex;align-items:center;justify-content:space-between;gap:10px;
  background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:10px 14px;
  box-shadow:var(--sh-1);font-size:13px;
}
.mkt-chip .c-name{font-weight:700;color:var(--ink-soft);font-size:12px}
.mkt-chip .c-price{font-weight:800;color:var(--brand-ink);font-variant-numeric:tabular-nums}
.mkt-chip .c-chg{font-size:11.5px;font-variant-numeric:tabular-nums}
.mkt-table td,.mkt-table th{padding:9px 12px}
.mkt-table .t-spark svg{display:block;width:90px;height:26px}
/* 대시보드 미니 증시 — 4칸(반응형은 클래스로 제어, 인라인 style 금지) */
.mkt-grid.mini{grid-template-columns:repeat(4,minmax(0,1fr))}
@media screen and (max-width:900px){.mkt-grid,.mkt-grid.mini{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}
@media screen and (max-width:560px){.mkt-grid{grid-template-columns:minmax(0,1fr)}}
@media screen and (max-width:400px){.mkt-grid.mini{grid-template-columns:minmax(0,1fr)}}

/* ---------- 13) Responsive ---------- */
/* 📱 모바일 바로가기 재배열(2026-08-26 사용자 지시) — 데스크톱은 그대로, ≤960px에서만:
   대시보드 숨김(첫 화면이 이미 대시보드) · 일정달력 → 웰스톡(카톡) → 이메일 → 자료 → 공지 → 할 일.
   자료·공지는 모바일 전용(m-only) — 데스크톱은 아래 묶음(자료·기준/회사 업무)에 이미 있다. */
/* ⚠ 데스크톱 숨김은 `.side-nav a`(0,1,1)보다 세야 한다 — .m-only만 쓰면 진다(명시도) */
.side-nav a.m-only{display:none}
.lbl-mob{display:none}
/* 🔴 2026-08-27: 이 아래 두 블록은 **사이드바를 손대는 규칙**이다. 조건이 960px로 남아 있어
     821~960px(마우스로 확대해 쓰는 PC)에서 사이드바가 가로줄로 접히고 `.side-sec`(묶음 제목)이
     통째로 사라졌다 — 고객 관리·모니터링·도구·시스템 설정으로 갈 길이 끊긴다(디자인QA 적발).
     8월 26일 저녁 사고와 **같은 실패 방식**이 폭만 좁혀져 재현된 것이라 판정 조건으로 통일한다. */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .side-quick a.q-dash{display:none}
  .side-nav a.m-only{display:flex}
  .lbl-desk{display:none}
  .lbl-mob{display:inline}
  .side-quick .q-cal{order:1}
  .side-quick .q-kakao{order:2}
  .side-quick .q-mail{order:3}
  .side-quick .q-lib{order:4}
  .side-quick .q-notice{order:5}
  .side-quick .q-task{order:6}
  .side-quick .q-perf{order:7}
}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .shell{flex-direction:column}
  .sidebar{position:static;height:auto;flex:none;flex-direction:row;flex-wrap:wrap;
    align-items:center;gap:4px;padding:10px 12px}
  .side-brand{padding:0 8px;border-bottom:0;margin-bottom:0}
  .side-brand .bname{display:none}
  /* 가로줄로 접히면 로고도 줄인다 — 감추지 않는다(브랜드는 어디서나 보여야 한다) */
  .side-logo{width:72px}
  .side-sec{display:none}
  .side-nav{flex-direction:row;flex-wrap:wrap}
  /* 가로 메뉴로 접힐 때 — 손가락으로 누르기엔 31px가 작다(최소 40px 확보) */
  .side-nav a{padding:10px 12px;font-size:13px;min-height:40px;display:flex;align-items:center}
  .side-foot{margin-top:0;margin-left:auto;padding-top:0;border-top:0}
  .mainbar{position:static}
}
@media screen and (max-width:820px){
  .grid.cols-3{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .grid.cols-4{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  .grid.cols-5{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
  /* ⚠ 여기 있던 `.tabs{position:static}`을 걷어냈다(2026-08-27) — 위 자산 카드 블록에서
     칩 띠를 **한 줄 가로 스크롤 + sticky**로 바꿨는데, 이 규칙이 뒤에 있어 그것을 덮어썼다.
     원래 static으로 둔 이유("칩이 줄바꿈되면 화면을 덮는다")는 nowrap으로 사라졌다. */
}
@media screen and (max-width:640px){
  .grid.cols-2,.grid.cols-3,.grid.cols-4,.grid.cols-5{grid-template-columns:minmax(0,1fr)}
  .card{padding:var(--sp-4)}
  th,td{padding:9px 10px}
  /* ⚠ `.card > table`만 잡으면 <details>로 한 겹 감싼 표가 규칙에서 빠져 모바일에서 화면 밖으로 나간다
     (실측: 은퇴자산 '은퇴 후 현금흐름' 10열 표가 390px에서 695px까지 밀려났음). details도 함께 잡는다. */
  .card>table,.card>.table-scroll>table,
  .card details table,.card>details>.table-scroll>table{display:block;overflow-x:auto;white-space:nowrap}
  /* 모바일에서 실제로 자주 누르는 작은 버튼 — 29px는 손가락으로 누르기 빠듯하다 */
  .btn.sm{padding:9px 13px;min-height:38px}
}

/* ---------- 15) Report (인쇄/PDF) ---------- */
/* 화면 보기 — 실제 인쇄물(A4 세로)처럼: 종이 폭으로 중앙 정렬 + 페이지 높이 시뮬레이션 */
@media screen{
  /* 화면에서는 **다른 화면과 똑같이 컨테이너를 꽉 채운다**(사용자 지시 2026-07-31).
     예전에는 840px(A4 폭)로 묶어 두어 넓은 모니터에서 양옆이 크게 비었다.
     ⚠ **인쇄는 영향받지 않는다** — @media print의 `@page{size:A4}`와 `.container{max-width:none}`이
       용지 폭을 따로 정하므로, 화면을 넓혀도 인쇄물은 그대로 A4 한 장씩 나온다.
     ⚠ 다만 화면 배치와 인쇄 배치가 같지 않으므로, **넘침 확인은 인쇄 미리보기로** 해야 한다. */
  /* ── 넓게(wide) 모드 전용 ─────────────────────────────────────────
     설계사마다 `넓게 / 기본` 을 고를 수 있다(POST /report/width, 계정별 저장).
     넓게가 기본값이고, `기본`을 고르면 아래 규칙이 전부 빠져 예전 A4 폭·글자 크기로 돌아간다.
     ⚠ 인쇄는 어느 쪽이든 동일하다 — 폭·글자 조정은 @media screen 안에서만 한다. */
  /* 🔴 수정사항 p6(2026-08-04): 넓게 모드에 **장 높이 규칙이 없어서** 화면을 넓힐수록
     한 장이 가로로 납작해지며 무한히 늘어났다(기본 폭에는 있는 규칙이 wide에만 빠져 있었다).
     ① 폭 상한 — 기본 폭 840px의 1.33배인 **1120px**까지만. 그 이상은 한 줄이 너무 길어
        읽기 어렵고, 표 칸이 벌어져 A4 인쇄물과 배치가 크게 달라진다.
        ⚠ 처음엔 뷰포트 높이에 연동했다가(100vh 기준) **화면이 넓어도 세로가 짧으면 오히려
          리포트가 줄어드는** 부작용이 나와 되돌렸다(렌더 실측 1920×1200에서 660px로 축소).
     ② 장 높이 — 폭에 비례시켜 **가로:세로를 A4로 고정**한다(내용이 넘치면 자연히 늘어난다).
     ⚠ 화면이 좁으면 그대로 줄어든다(상한일 뿐 하한이 아니다).
     ⚠ 인쇄는 @page가 따로 정하므로 여기 규칙이 새면 안 된다 — @media screen 안에 둔다. */
  .report.wide{width:100%;margin:0 auto;max-width:1120px}
  .report.wide>.rpage,
  .report.wide>.rfill{aspect-ratio:192 / 278}
  .report.wide>.rfill{display:flex;flex-direction:column;justify-content:space-between}
  /* 기본(좁게) — 예전처럼 A4에 가까운 폭으로 가운데 정렬. 화면 배치가 인쇄물과 비슷해
     "인쇄하면 어떻게 나오는지"를 눈으로 가늠하기 좋다는 사람들을 위한 모드다. */
  .report:not(.wide){max-width:840px;margin:0 auto}
  /* 🔴 기본 폭에서 **장 높이 시뮬레이션이 통째로 빠져 있었다**(2026-07-31 폭 토글 때 아래 규칙을
     `.report.wide`로 좁히면서 기본 폭 쪽을 안 만들었다). 그래서 짧은 섹션이 383px까지 쪼그라들어
     "세로로 짧게 보인다"는 지적이 나왔다(2026-08-03). 여기서 **인쇄 한 장과 같은 비례**로 되살린다.
     ⚠ 계산 근거: 화면 840px = 인쇄 콘텐츠 폭 192mm(A4 210 − @page 좌우 여백 9mm×2),
       인쇄 한 장의 카드 높이는 `.rpage,.rfill{min-height:278mm}` → 840 × 278/192 ≈ **1216px**.
     ⚠ **반드시 @media screen 안에 둘 것** — 인쇄에 새어 나가면 297mm(≈1122px) 용지보다 커져
       표지·본문이 매 장 두 쪽으로 찢어진다.
     ⚠ 대상은 실제로 한 장이 되는 카드(`.rpage`·`.rfill`·표지)만 — 부록처럼 흘려 보내는 카드까지
       한 장 높이로 만들면 인쇄와 화면의 장 수가 어긋난다.
     ⚠ 넓게 모드는 사용자 지시로 그대로 둔다(820px).
     ⚠ **2차 리포트에도 그대로 걸린다**(사용자 지시) — 2차는 폭 토글이 없어 늘 기본 폭이고
       카드 구성(`.report-cover`·`.rpage.rfill`·`.rlast`)이 1차와 같다. 규칙을 두 벌로 나누면
       다음에 한쪽만 고쳐져 갈라진다. */
  .report:not(.wide)>.report-cover,
  .report:not(.wide)>.rpage,
  .report:not(.wide)>.rfill{min-height:1216px}
  /* 내용이 위로 몰리고 아래가 텅 비지 않게 — 인쇄의 `.rfill` 규칙과 같은 배치로 편다 */
  .report:not(.wide)>.rfill{display:flex;flex-direction:column;justify-content:space-between}
  /* 페이지 경계는 남긴다 — 어디서 장이 나뉘는지 보이지 않으면 리포트를 편집할 수 없다.
     폭이 넓어진 만큼 높이는 조금 줄여, 내용이 위로 몰리고 아래가 텅 비는 것을 막는다. */
  .report.wide>.card{min-height:820px;display:flex;flex-direction:column;justify-content:space-between}
  .report.wide>.report-cover{min-height:820px}
  /* 🔴 2026-09-28 — 폰(390·320px)에서 리포트 장이 **다음 장 위로 겹쳤다**(09-27 발견 · 실측: 카드 높이 820px 고정 · 내용 최대 2,295px).
     원인: aspect-ratio 카드에 **명시적 min-height(위 820px)** 가 걸리면 '내용만큼 늘어나는' 자동 최소 높이가 꺼져
     높이가 max(비율 높이, 820px)로 **고정**되고 내용은 넘친다. 넓은 화면은 비율 높이(≈1,600px)가 커서 안 드러났다.
     → 비율 카드만 min-height를 auto로 되돌린다 = 높이 max(A4 비율, 내용). 넓은 화면(비율 높이 ≥ 820px)은 그대로다.
     ⚠ 폭 분기(@media)를 새로 만들지 않는다 · 인쇄는 @media screen 밖이라 무관. */
  .report.wide>.rpage,
  .report.wide>.rfill{min-height:auto}
  /* 화면이 넓어졌으니 글자도 한 단계 키운다(사용자 지시 2026-07-31).
     ⚠ **화면 전용**이다 — 인쇄에서 키우면 A4 한 장에 맞춰 둔 섹션이 다음 장으로 밀린다.
     ⚠ 개별 값을 일일이 고치지 않고 여기서 한 번에 올린다(값이 흩어지면 다음에 또 어긋난다). */
  .report.wide table{font-size:14.5px}
  .report.wide .bsa-table,.report.wide .cfa-table{font-size:14.5px}
  .report.wide th,.report.wide td{padding:7px 12px}
  .report.wide p,.report.wide li{font-size:14.5px}
  .report.wide .hint,.report.wide .muted{font-size:12.5px}
  .report.wide h3{font-size:15.5px}
  /* 화면이 넓으니 좁게 잡아 둔 칸 때문에 두 줄로 접히던 것들을 편다.
     (인쇄에서는 폭이 A4로 좁아 원래대로 접혀야 하므로 여기서만 푼다) */
  .report.wide table{table-layout:auto}
  .report.wide th,.report.wide td{white-space:normal}
  .report.wide .num,.report.wide td.num,.report.wide th.num,
  .report.wide .subtot td,.report.wide .sumrow td{white-space:nowrap}   /* 금액은 절대 쪼개지지 않게 */
  /* 자산내역 표의 날짜·만기 칸(.dt) — 화면에서 2~3줄로 접히던 것을 한 줄로 편다.
     이 표들은 인라인 `table-layout:fixed`라 위의 auto 규칙이 닿지 않고, 74~78px 칸의
     실제 내용 폭은 좌우 패딩 24px를 빼면 50px 남짓이라 `2026-05-15`도 `납입만기`도 못 담았다.
     인쇄본은 글자 10px·패딩 7px이라 원래 폭으로 한 줄에 들어가므로 **화면에서만** 넓힌다. */
  /* 창을 넓히면 **상품명 칸만** 계속 늘어나고 금융기관은 84px에 묶여 'KB외…'로 잘렸다
     (사용자 지시 2026-07-31). 표가 `table-layout:fixed`라 폭을 안 준 열(상품명)이 남는 공간을
     혼자 가져가기 때문이다. 모든 열에 폭을 주면 남는 공간이 **비례로 나뉜다**.
     → 화면에서만 이름/기관/소유자 칸에 폭을 주고, 인쇄본 열 배분은 건드리지 않는다. */
  /* 🔴 2026-08-04: 이 폭들을 **창 폭과 무관하게 강제**하고 있었다. 합이 970px이라
     창이 좁으면 표가 부모(652px)를 318px 넘겨 **페이지 전체에 가로 스크롤**이 생겼다
     (실측 1000px 창에서 272px 넘침). `table-layout:fixed`는 열에 명시 폭이 있으면
     그 폭을 우선해 표를 늘리므로, `width:100%`를 줘도 비례 축소가 되지 않는다.
     → **넓게 볼 수 있는 창에서만** 이 폭을 강제한다. 그보다 좁으면 원래 인라인 px로 돌아가고
       위의 `.report table{width:100%}`가 열을 비례로 줄여 준다.
     ⚠ 기준 1400px 근거: 리포트 최대 폭 1120 + 사이드바 약 240 + 여백 — 실측으로 확인했다. */
  /* 🔵 2026-09-27(대표 "상품명이 더 많이 나오게") — 위 방식(모든 열에 폭 → 비례 배분)은 상품명을
     230px에 묶어 1070px 표에서도 긴 이름이 잘렸다. 이제 **상품명만 폭을 안 주고** 나머지 열을
     내용에 맞춘 최소폭(--ag-* 변수 · 아래 '자산내역 표 열 폭')으로 잡아 남는 폭을 상품명에 몰아준다.
     금융기관이 'KB외…'로 잘리던 07-31 문제는 기관 칸을 넓은 창에서 130px로 두어 막는다. */
  @media (min-width:1400px){
    .report.wide .ag-t{--ag-own:72px;--ag-org:130px;--ag-dt:100px;--ag-dts:84px;
      --ag-m:104px;--ag-amt:128px;--ag-note:96px}
    .report.wide .ag-t.ag-ins{--ag-own:80px;--ag-note:72px}
    .report.wide .ag-t.ag-re{--ag-org:90px;--ag-note:64px}
    .report.wide .ag-t.ag-debt{--ag-m:112px;--ag-note:56px}
    .report.wide .ag-t.ag-fin{--ag-note:112px}   /* 채권 요약 '액면 1,000만'까지(1차 수정에서 96px로 잘렸다) */
  }
  .report.wide .ag-block .dt,.report.wide .ag-block .dt-s{white-space:nowrap}
}
/* 리포트 안에서는 내부 가로 스크롤 금지 — 차트·표는 페이지 폭에 맞춰 축소 */
/* 🔴 2026-08-04: 그런데 **표가 실제로는 축소되지 않고 있었다.**
   리포트 표는 `table-layout:fixed`인데 `width` 선언이 없어서, 브라우저가 각 열의 지정 px을
   **더한 값**(예: 56+70+84+…=970px)을 표 폭으로 잡았다 → 부모가 652px이면 318px이 넘쳐
   창이 좁을 때 페이지 전체에 가로 스크롤이 생겼다(실측 1000px 창에서 272px 넘침).
   `width:100%`를 주면 fixed 레이아웃이 지정 px을 **비례 배분**해 열 비율을 유지한 채 줄어든다.
   ⚠ 열 폭을 %로 일일이 바꾸지 않는다 — 비율이 바뀌면 인쇄 배치가 달라진다.
   ⚠ 좁아지면 숫자·날짜가 줄바꿈돼 행 높이가 들쭉날쭉해지므로 그 칸은 nowrap으로 묶는다. */
.report table{width:100%}
.report td.num,.report th.num,.report td.dt,.report th.dt{white-space:nowrap}
/* ⚠ 반대로 **글자 칸의 nowrap**은 좁은 화면에서 표를 못 줄이게 막는다
   (실측: 08 은퇴 민감도 분석의 '가정' 칸이 296px로 버텨 표가 823px에서 안 내려갔다).
   좁을 때만 줄바꿈을 허용한다 — 숫자·날짜 칸은 그대로 nowrap을 유지해 자릿수가 안 쪼개진다.
   ⚠ 인쇄에는 걸리지 않는다(용지 폭은 항상 충분하다). */
@media screen and (max-width:1200px){
  .report td:not(.num):not(.dt):not(.dt-s),
  .report th:not(.num):not(.dt):not(.dt-s){white-space:normal}
}
.report div[style*="overflow-x"]{overflow-x:visible !important}
/* 리포트 본문 제목 — 세리프로 격을 높인다(.report 범위로 한정) */
.report h2{font-size:21px;letter-spacing:.02em;
  border-bottom:2px solid var(--brand);padding-bottom:10px}
.report h3{letter-spacing:.01em}
/* 🔴 수정사항 p5(2026-08-04): 재무상태표·현금흐름표의 소제목이 **네이비**라 표 머리글과
   구분이 잘 안 되고 흐리게 보였다 → **검정**으로 바꾸고 위아래 간격을 줄여 표에 붙인다.
   ⚠ 대상은 그 두 표가 있는 섹션(03 재무상태표 · 05 현금흐름표)뿐 — 다른 섹션 제목은 그대로 둔다
     (전역으로 바꾸면 리포트 전체 색 체계가 무너진다).
   ⚠ 인쇄에도 그대로 적용된다(고객 전달본이 화면과 같아야 한다). */
.rsec-bs h3, .rsec-cf h3{color:#111;margin-top:8px;margin-bottom:4px}
.rsec-bs .sum-block-h, .rsec-cf .sum-block-h{color:#111;margin-bottom:5px}
.rsec-bs .bs-table, .rsec-cf .bs-table{margin-top:4px}
/* 리포트 수정(2026-08-11): 재무상태표 화면 미리보기에서 미세한 overflow로 세로 스크롤바가 떴다.
   좌우 컬럼은 filler 행(bs-fill)으로 높이가 맞춰지므로 스크롤이 불필요 — 이 표에서만 제거한다.
   (모바일 가로 스크롤이 필요한 다른 표의 .table-scroll은 그대로 둔다.) */
.rsec-bs .table-scroll{overflow:visible}
/* 리포트 내 양호/적합 배지 — 초록 대신 브랜드 네이비 톤(게이지 상태색과 통일) */
.report .badge.ok{background:var(--navy-soft);color:var(--brand-ink);border-color:#c9d5ea}
/* 섹션 번호 — 골드 세리프 넘버링(클래식 미니멀) */
.sec-no{color:var(--gold-strong);font-weight:700;
  font-size:.92em;letter-spacing:.06em;margin-right:10px;
  padding-right:10px;border-right:1px solid var(--gold-line)}
/* 기준 대비 게이지 타일 */
.gauge-tile{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--surface-3)}
.gauge-tile .l{font-size:12.5px;font-weight:700;color:var(--ink-soft);margin-bottom:2px}
.gauge-tile .hint{margin-top:2px}
/* SWOT 4분면 표 — 헤더를 네이비로 */
.report .swot-table th{background:var(--navy-soft);color:var(--brand-ink)}
/* 인사말 아래 — 독립 재무설계 전문가 그룹 소개(6분야) */
.fpg{text-align:center}
.fpg-eyebrow{font-size:12px;color:var(--gold-strong);font-weight:700;letter-spacing:.3em;text-indent:.3em}
.fpg-title{font-size:27px;font-weight:700;color:var(--brand-ink);
  margin-top:8px;letter-spacing:.04em}
.fpg-lead{font-size:13px;color:var(--ink-soft);line-height:1.85;margin-top:12px}
.fpg-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px 26px;margin-top:22px;text-align:left}
.fpg-item{border-top:1px solid var(--line);padding-top:10px}
.fpg-item .no{color:var(--gold-strong);font-weight:700;font-size:13px}
.fpg-item .t{font-weight:800;color:var(--brand-ink);font-size:15px;letter-spacing:.14em;margin-top:5px}
.fpg-item .d{font-size:12.3px;color:var(--muted);line-height:1.75;margin-top:6px}
@media screen and (max-width:720px){.fpg-grid{grid-template-columns:minmax(0,1fr)}}

/* 2단 재무제표 — 좌우 합계 라인 정렬: 빈 공간을 filler 행이 흡수 */
.bs-stretch{height:100%}
.bs-fill td{height:100%;border:none;background:none;padding:0}
/* 부채측 표의 남는 세로 공간을 '자산 구성' 도넛이 채운다(합계 3줄은 좌측 총자산 합계와 같은 바닥선) */
.bs-donut td{height:100%;border:none;background:none;padding:10px 6px;vertical-align:middle}
.bs-donut-box{border:1px solid var(--line);border-radius:10px;padding:10px 12px;
  display:flex;flex-direction:column;justify-content:center;height:100%}
.bs-donut-box h3{margin:0 0 8px}
.bs-donut-row{display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.bs-donut-box .hint{margin-top:8px}

/* 분석·평가 코멘트(설계사 직접 수정) */
.cmt{margin-top:8px;border-left:3px solid var(--gold);padding:2px 0 2px 10px}
.cmt-body{font-size:12.8px;line-height:1.7;color:var(--ink-soft);white-space:pre-wrap}
.cmt-body:empty{display:none}
.cmt-by{font-size:11px;color:var(--muted);margin-top:4px}
.cmt-edit>summary{font-size:11.5px;color:var(--muted);cursor:pointer;margin-top:5px;
  padding:0;border:none;background:none;list-style:none}
.cmt-edit>summary::-webkit-details-marker{display:none}
.cmt-edit>summary::before{content:'✏️ ';font-size:11px}
.cmt-edit>summary:hover{color:var(--gold-strong)}
@media print{.cmt{border-left-color:#cfd6e2}}

/* 카톡 발송본 — 분야 선택 칩 */
.kk-picks{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:8px;margin-top:8px}
.kk-pick{display:grid;grid-template-columns:18px minmax(0,1fr);grid-template-rows:auto auto;
  column-gap:8px;align-items:center;border:1px solid var(--line);border-radius:10px;
  padding:9px 11px;cursor:pointer;background:var(--surface)}
.kk-pick:hover{border-color:var(--gold-strong)}
.kk-pick input{grid-row:1/3;margin:0;width:16px;height:16px}
.kk-l{font-weight:700;font-size:13.5px;color:var(--brand-ink)}
.kk-d{font-size:11.5px;color:var(--muted)}
.kk-pick.off{opacity:.5;cursor:not-allowed}

/* 인사말·관리 인사 (2026-08-29) — 카톡 화면 그룹 머리 · /greet 편집 · /broadcast 단체 발송.
 * 모바일 우선: 그리드는 기존 .kk-picks(auto-fill minmax 230)를 그대로 쓰고 여기서는 제목·폼·미리보기만 얹는다.
 * 폭을 고정하지 않는다(320px에서 가로 넘침이 생기지 않도록). 규칙은 한 줄씩 — 전역 diff 감사가 읽기 쉽게. */
.kk-grp-t{font-size:13px;font-weight:800;color:var(--brand-ink);letter-spacing:.02em;margin:14px 0 2px;display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
.kk-grp-t:first-child{margin-top:2px}
.kk-sub-t{font-size:11.5px;font-weight:700;color:var(--muted);margin:10px 0 -2px}
.kk-act{display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.kk-short{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-soft)}
.kk-short input{width:15px;height:15px;margin:0}
.greet-item{border:1px solid var(--line);border-radius:10px;padding:8px 11px;margin-top:8px;background:var(--surface)}
.greet-item>summary{cursor:pointer;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.greet-item[open]>summary{margin-bottom:8px}
.greet-l{display:block;font-size:12px;font-weight:700;color:var(--ink-soft);margin-top:8px}
.greet-l textarea{width:100%;margin-top:4px;font-weight:400}
.greet-act{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px}
.greet-def{margin-top:8px}
.greet-pre{white-space:pre-wrap;word-break:break-word;margin:4px 0;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;background:var(--surface-2);font-family:inherit;font-size:12.5px;line-height:1.65;color:var(--ink-soft)}
.bc-pick{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px}
.bc-l{display:block;font-size:12px;font-weight:700;color:var(--ink-soft);min-width:0;flex:1 1 240px}
.bc-l select{width:100%;margin-top:4px;font-weight:400}
.bc-short{display:inline-flex;align-items:center;gap:6px;flex:0 0 auto;font-weight:400}
.bc-short input{width:15px;height:15px;margin:0}
.bc-prev{margin-top:8px}
.bc-prev-h{font-size:12.5px;margin-bottom:2px}
.bc-off td{opacity:.55}
.bc-all{display:inline-flex;align-items:center;margin:0}
/* 임시 비밀번호 강제 변경 전용 화면 (2026-08-31) — 한 가지 일만 보이게 가운데 한 장. */
.pwf-wrap{display:flex;justify-content:center;padding:22px 8px}
.pwf-card{max-width:480px;width:100%}
.pwf-l{display:block;font-size:12.5px;font-weight:700;color:var(--ink-soft);margin-top:12px}
.pwf-l input{width:100%;margin-top:4px;font-weight:400}
.pwf-btn{width:100%}
/* 업로드 진입점 (2026-08-31) — 위험·보장 PDF · 고객등록 엑셀의 파일 라벨(label이 input을 감싼다). */
.up-l{display:block;font-size:12.5px;font-weight:700;color:var(--ink-soft)}
.up-l input[type=file]{display:block;width:100%;margin-top:4px;font-weight:400}
/* 위험·보장 2차 2-D — 충족도 레이더(R1~R4). 모바일에서는 세로로 쌓인다(폭 고정 없음). */
.d13-radar{display:flex;flex-wrap:wrap;gap:14px;align-items:center}
.d13-radar-svg{flex:0 1 260px;min-width:220px}
.d13-radar-svg svg{max-width:100%;height:auto}
.d13-radar-side{flex:1 1 240px;min-width:0}
.d13-radar-list{list-style:none;margin:6px 0 0;padding:0;font-size:12.5px}
.d13-radar-list li{display:flex;justify-content:space-between;gap:10px;padding:3px 0;border-bottom:1px solid var(--line)}
.d13-radar-list li b.ink-danger{color:var(--danger)}
/* 2026 부동산 세제개편 상세(/reform/realty · 2026-08-31) — 새 이름 전용(tc-*). */
.tc-compare{display:flex;flex-wrap:wrap;align-items:stretch;gap:10px}
.tc-box{flex:1 1 180px;min-width:150px;border:1px solid var(--line);border-radius:10px;padding:12px 14px;background:var(--surface)}
.tc-box.tc-after{border-color:var(--danger)}
.tc-box.tc-after .tc-amt{color:var(--danger)}
.tc-amt{font-size:22px;font-weight:800;margin-top:2px;font-variant-numeric:tabular-nums}
.tc-banner{position:sticky;top:0;z-index:5}
/* 증권 입력폼 2-C(2026-08-31) — 13 대분류 × 세부담보 골격. 새 이름 전용(pf-sub/pf-meta). */
.pf-sub{margin-top:14px;padding-top:10px;border-top:1px solid var(--line)}
.pf-sub:first-of-type{margin-top:8px;border-top:0;padding-top:0}
.pf-sub-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:4px}
.pf-meta{margin-top:6px}
.pf-meta>summary{cursor:pointer;font-size:12px;color:var(--ink-soft)}
.pf-meta-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px}
.pf-meta-row label{display:block;font-size:12px;font-weight:700;color:var(--ink-soft);flex:1 1 140px;min-width:120px}
.pf-meta-row input,.pf-meta-row select{width:100%;margin-top:3px;font-weight:400}
/* 오늘의 브리핑(2026-08-31) — /briefing + 대시보드 리본. 새 이름 전용(bf-*). */
.bf-ribbon{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--gold);border-radius:10px;padding:8px 14px;margin-bottom:12px;font-size:13px;color:inherit;text-decoration:none}
.bf-ribbon b{color:var(--brand-ink)}
/* 📱 고객이 보낸 상담 요청(2026-09-08) — 브리핑 리본과 같은 모양이되 **좌측 바만 와인**.
   고객이 우리에게 말을 건 것이라 다른 리본과 구분돼야 한다(대기 중일 때만 렌더된다). */
.bf-ribbon.bf-rb-urgent{border-left-color:var(--danger)}
.bf-rb-chip{background:var(--surface-2);border:1px solid var(--line);border-radius:999px;padding:1px 9px;font-size:12px;font-weight:700}
.bf-rb-go{margin-left:auto;color:var(--brand-ink);font-weight:800;white-space:nowrap}
.bf-chips{display:flex;gap:8px;flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;margin-bottom:4px}
.bf-chip{flex:0 0 auto;background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:5px 14px;font-size:13px;font-weight:700;color:var(--ink-soft);text-decoration:none}
.bf-chip b{color:var(--brand-ink);margin-left:2px}
.bf-chip.off{opacity:.55;font-weight:400}
.bf-sec-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.bf-issue{border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin-top:10px;background:var(--surface)}
.bf-t{display:flex;flex-wrap:wrap;align-items:center;gap:7px}
.bf-body{margin:4px 0 6px;color:var(--ink-soft)}
.bf-src{font-size:12px;color:var(--muted);margin:0 0 8px}
.bf-empty{border:1px dashed var(--line);border-radius:10px;padding:14px;text-align:center;background:var(--surface-2);margin-top:10px}
.bf-news{display:flex;gap:12px;align-items:flex-start;border-top:1px dashed var(--line);padding-top:10px;margin-top:10px;text-decoration:none;color:inherit}
.bf-thumb{width:96px;height:64px;object-fit:cover;border-radius:8px;flex:0 0 auto;border:1px solid var(--line)}
.bf-news-b{display:flex;flex-direction:column;gap:2px;min-width:0}
.bf-quick{font-size:12.5px;color:var(--muted);margin:10px 0 0}
/* 웰스페이(2026-08-31 · 대표 승인 시안) — 새 이름 전용(wpx-*).
 * 🔴 대표 피드백: "빨간색은 항상 와인색" — 웰스페이는 --wine 토큰을 쓴다(전 화면 --danger 교체는 별도 확인). */
:root{--wine:#8c2438;--wine-bg:#f6e9ec;--wine-line:#e3c6cd}
.wine{color:var(--wine)}
.badge.wine{background:var(--wine-bg);color:var(--wine);border:1px solid var(--wine-line)}
.wpx-grid{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:14px;align-items:start}
@media screen and (max-width:980px){.wpx-grid{grid-template-columns:1fr}}
.wpx-balance{border-left:3px solid var(--gold)}
.wpx-big{font-size:34px;font-weight:800;line-height:1.1;margin:2px 0}
.wpx-big small{font-size:16px;font-weight:700;color:var(--muted)}
.wpx-recon{display:flex;gap:12px;flex-wrap:wrap;border-top:1px dashed var(--line);margin-top:10px;padding-top:8px;font-size:12.5px;color:var(--ink-soft)}
.wpx-gauge{height:8px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line);overflow:hidden;margin:4px 0 2px}
.wpx-gauge i{display:block;height:100%;background:var(--brand-ink)}
.wpx-tiers{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;margin-top:10px}
.wpx-tier{position:relative;border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--surface)}
.wpx-tier .nm{font-weight:800;font-size:13px;letter-spacing:.04em}
.wpx-tier .rg{font-size:12px;color:var(--muted)}
.wpx-tier.t-bronze .nm{color:#8a5a2b}
.wpx-tier.t-silver .nm{color:#6b7280}
.wpx-tier.t-gold .nm{color:var(--gold)}
.wpx-tier.t-partner .nm{color:var(--brand-ink)}
.wpx-tier.cur{border-color:var(--brand-ink);box-shadow:inset 0 0 0 1px var(--brand-ink)}
.wpx-tier .now{position:absolute;top:-8px;right:8px;font-size:10.5px;font-weight:800;background:var(--brand-ink);color:#fff;border-radius:999px;padding:1px 8px}
.wpx-form{display:flex;gap:10px;flex-wrap:wrap}
.wpx-form label{display:block;font-size:12px;font-weight:700;color:var(--ink-soft);flex:1 1 150px;min-width:130px}
.wpx-form input,.wpx-form select{width:100%;margin-top:3px;font-weight:400}
.wpx-empty{border:1px dashed var(--line);border-radius:10px;padding:16px;text-align:center;background:var(--surface-2)}
.wpx-princ{display:flex;gap:14px;flex-wrap:wrap;font-size:13px}
.wpx-p{display:inline-flex;gap:6px;align-items:center;font-weight:700;color:var(--ink-soft)}
/* 문장형 표 opt-out(2026-08-31 · mobile_check cbackups 넘침 833px 수습) —
 * 모바일 규칙 .card>.table-scroll>table{white-space:nowrap;display:block}은 숫자 표용이다.
 * 긴 문장이 든 안내 표에 걸리면 줄바꿈이 죽어 화면 밖으로 삐져나간다 → t-wrap을 붙여 되돌린다.
 * (클래스 특이도 (0,2,1)이라 위치와 무관하게 이긴다 — 모바일 판정 블록은 손대지 않음) */
.card>.table-scroll>table.t-wrap{white-space:normal;display:table;width:100%}
/* 고객별 받은 메일(POP3 · 2026-08-31) — 새 이름 전용(mail-*). */
.mail-body{white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:13px;line-height:1.7;background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:12px 14px;max-height:60vh;overflow:auto}
.mail-empty{border:1px dashed var(--line);border-radius:10px;padding:16px;text-align:center;background:var(--surface-2)}
.tc-arrow{align-self:center;font-size:20px;color:var(--muted)}
.tc-list{margin:4px 0 0;padding-left:18px;font-size:13px;line-height:1.7}
.tc-news{display:flex;gap:12px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line);text-decoration:none;color:inherit}
.tc-news:first-of-type{border-top:0}
.tc-thumb{width:110px;height:74px;object-fit:cover;border-radius:8px;flex:0 0 auto;border:1px solid var(--line)}
.tc-news-b{display:flex;flex-direction:column;gap:2px;min-width:0}

/* 자산 입력폼 — 세부분류 전용 항목 그룹 */
.tf-grp{margin-top:10px;padding:10px 12px;border:1px dashed var(--line);border-radius:10px;
  background:var(--surface-2)}
.tf-head{font-size:12px;font-weight:800;color:var(--brand-ink);letter-spacing:.04em;margin-bottom:6px}

/* 현금흐름 분석 3열 — 그래프 종류·크기를 통일하고 제목/차트/표 시작선을 맞춘다 */
.cfa3-col>h3{margin:0 0 6px;min-height:20px}
.cfa3-chart{height:214px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}
.cfa3-chart svg{max-width:100%;height:auto}
.cfa3-col table{width:100%}
.cfa3-col .hint{margin-top:6px}
.cfa3-dot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px}
@media screen and (max-width:900px){.cfa3-chart{height:auto}}

/* 월 현금흐름표(화면) — 과목을 전부 표시하는 양식이라 행이 많다. 화면에서는 밀도를 높여 축소 */
@media screen{
  .cfs-compact .bs-table th,.cfs-compact .bs-table td{padding:3px 8px;font-size:12px;line-height:1.35}
  .cfs-compact .bs-table .bs-head th{font-size:12.5px;padding:6px}
  .cfs-compact .bs-table{min-width:0}
}

/* 자산현황 — 자산 성격별 상품 목록 블록 */
.ag-block{margin-top:12px}
.ag-head{display:flex;align-items:baseline;gap:8px;
  border-left:3px solid var(--gold-strong);padding:2px 0 6px 10px}
.ag-name{font-weight:800;color:var(--brand-ink);font-size:14px}
.ag-sub{font-size:11.5px;color:var(--muted)}
.ag-tot{margin-left:auto;font-size:12px;color:var(--ink-soft);font-weight:600}
/* ── 자산내역 표 열 폭(2026-09-27 대표 요청) ─────────────────────────────
   ① "가입일과 만기일 사이에 간격이 없다"(화면) ② "PDF에서 상품명이 더 많이 나오게, 다른 칸은 좁혀"
   예전엔 열 폭이 템플릿 인라인 px 한 벌뿐이었다. 그런데 글자 크기가 인쇄 10px · 화면 14~14.5px로
   달라 **인쇄에 맞춘 78px 날짜 칸이 화면에선 글자보다 좁아** 가입일이 만기일 칸까지 넘쳐 붙었다.
   → 폭을 변수로 빼서 **인쇄(기본값) · 화면 · 넓은 화면(1400px↑)** 세 벌로 둔다.
   원칙: 상품명(.c-nm)만 폭을 주지 않는다 → 나머지 열의 최소폭을 뺀 **남는 폭 전부가 상품명**으로 간다.
   ⚠ 인쇄 값을 바꾸면 util._AG_WRAP_COLS(장 나누기 높이 추정)의 px도 같이 바꿀 것 — 두 곳이 짝이다.
   ⚠ 인쇄 표 폭 692px 기준 상품명 몫: 금융 144 · 보장 192 · 부동산 188 · 기타 192 · 부채 146(옛 98·156·164·146·110).
   ⚠ 금융 표 비고(인쇄 104px · 화면 104~112px)는 줄이지 않는다 — 채권 요약이 3줄 안에 다 들어가는 최소폭이다(96px에서 '액면…'이 잘렸다).
   ⚠ 날짜 칸은 가입일 글자 끝~만기일 글자 시작 간격을 인쇄 약 27px로 유지한다(대표 확인 "PDF는 잘 나온다"). */
.ag-t{--ag-own:46px;--ag-org:80px;--ag-dt:78px;--ag-dts:56px;--ag-m:74px;--ag-amt:88px;
  --ag-note:104px;--ag-txt:84px;--ag-rate:48px}
.ag-t.ag-ins{--ag-own:54px;--ag-dt:76px;--ag-note:64px}
.ag-t.ag-re{--ag-org:64px;--ag-note:56px}
.ag-t.ag-etc{--ag-note:64px}
.ag-t.ag-debt{--ag-m:84px;--ag-txt:80px;--ag-note:44px}
.ag-t th.c-own{width:var(--ag-own)}
.ag-t th.c-org{width:var(--ag-org)}
.ag-t th.dt{width:var(--ag-dt)}
.ag-t th.dt-s{width:var(--ag-dts)}
.ag-t th.c-m{width:var(--ag-m)}
.ag-t th.c-amt{width:var(--ag-amt)}
.ag-t th.c-note{width:var(--ag-note)}
.ag-t th.c-txt{width:var(--ag-txt)}
.ag-t th.c-rate{width:var(--ag-rate)}
.ag-t td.dt,.ag-t td.dt-s{font-variant-numeric:tabular-nums}
/* 인쇄 — 상품명은 말줄임 대신 **줄바꿈**(종이엔 title이 없어 잘린 이름을 볼 방법이 없다 · 2026-09-27 검수).
   화면은 템플릿 인라인(nowrap·말줄임) 그대로 — 인라인을 이기려고 !important. 늘어난 행 높이는
   util._AG_WRAP_COLS['fin'] 상품명 항목이 장 나누기에 반영한다. */
@media print{
  .ag-t td.ag-nm{white-space:normal !important;overflow:visible !important;text-overflow:clip !important;
    word-break:keep-all;overflow-wrap:anywhere}
}
/* 화면 — 글자가 커서(14~14.5px) 인쇄 폭으로는 날짜가 넘친다. 날짜만 한 단계 작게(--fs-note)
   하고 칸 좌우 여백을 10px로 맞춰, 표 폭 790px(기본 폭 모드)에서도 상품명 몫 약 180px(옛 196px)을 지킨다 — 날짜 간격과 맞바꾼 값. */
@media screen{   /* 자산내역 표 열 폭 — 화면 */
  .ag-t{--ag-own:60px;--ag-org:96px;--ag-dt:86px;--ag-dts:72px;--ag-m:90px;--ag-amt:104px;
    --ag-note:64px;--ag-txt:84px;--ag-rate:56px}
  .ag-t.ag-fin{--ag-note:104px;--ag-amt:112px;--ag-m:84px}   /* 112 = 100억대(14자리) 평가액이 넘치지 않는 폭(실측) */
  /* 비고 104 = 채권 요약이 3줄 안에 다 보이는 폭(76px에선 '6개월…'로 잘렸다 · 디자인팀 검수) */
  .ag-t.ag-ins{--ag-own:70px;--ag-dt:86px}   /* 인쇄의 .ag-ins 값(76px)이 화면에 새지 않게 */
  .ag-t.ag-re{--ag-org:72px;--ag-note:56px}
  .ag-t.ag-etc{--ag-org:80px}
  .ag-t.ag-debt{--ag-m:104px;--ag-txt:90px;--ag-note:48px}
  .report .ag-t th,.report .ag-t td{padding-left:10px;padding-right:10px}
  .report .ag-t td.dt,.report .ag-t td.dt-s{font-size:var(--fs-note)}
  /* 기본 폭 모드(표 790px)는 상품명 몫이 162px뿐이라 말줄임이 잦다 → 인쇄처럼 **줄바꿈**(2026-09-27 디자인팀 2차 검수).
     넓게 모드는 칸이 넉넉해 말줄임 유지. 인쇄 장 나누기는 util._AG_WRAP_COLS['fin'](인쇄 144px 기준)가 이미 반영 — 화면 카드는 내용만큼 늘어난다. */
  .report:not(.wide) .ag-t.ag-fin td.ag-nm{white-space:normal !important;overflow:visible !important;text-overflow:clip !important;
    word-break:keep-all;overflow-wrap:anywhere}
  /* 넓게 모드인데 창이 1400px보다 좁을 때 — 글자 14.5px라 10억대 금액(1,234,567,890)이 100px 칸을 넘친다(실측 1280px) */
  @media (max-width:1399px){ .report.wide .ag-t{--ag-amt:112px} .report.wide .ag-t.ag-fin{--ag-note:104px} }
}   /* /자산내역 표 열 폭 — 화면 */
.ag-empty{font-size:12px;color:var(--muted);border:1px dashed var(--line);
  border-radius:8px;padding:7px 12px;margin:2px 0 0}

/* 재무설계 6단계 — 세로 프로세스 표(PLAN/DO/SEE 레일 + 화살표 흐름) */
.proc-table{width:100%;border-collapse:collapse}
.proc-table td{border:none;padding:0;background:none}
.proc-table .ph{width:88px;background:var(--brand-2);text-align:center;vertical-align:middle;
  border-right:10px solid #fff;padding:12px 6px}
.proc-table .ph.do{background:var(--brand-2)}
.proc-table .ph.see{background:var(--brand-2)}
.proc-table .ph-en{font-size:16.5px;font-weight:700;
  letter-spacing:.14em;text-indent:.14em;color:var(--gold)}
.proc-table .ph-ko{font-size:11px;color:#fff;opacity:.85;margin-top:3px;letter-spacing:.3em;text-indent:.3em}
.proc-table .st{width:212px;border:1px solid var(--line);border-right:none;
  background:var(--surface-2);padding:14px 16px}
.proc-table .st .no{color:var(--gold-strong);font-weight:700;font-size:12px}
.proc-table .st b{display:block;color:var(--brand-ink);font-size:14.5px;margin-top:1px}
.proc-table .st .en{font-style:italic;font-size:11.5px;color:var(--muted);margin-top:1px}
.proc-table .ds{border:1px solid var(--line);border-left:none;padding:14px 18px;
  font-size:13px;color:var(--ink-soft);line-height:1.8;vertical-align:middle}
.proc-table .arw td{text-align:center;color:var(--gold-strong);font-size:12px;padding:10px 0;line-height:1}

/* 목차 페이지 — 클래식 세리프 2단 목차 */
.toc-title{letter-spacing:.28em;text-indent:.28em;text-align:center;
  border-bottom:none !important;padding-bottom:0 !important;color:var(--brand-ink)}
.toc-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px 22px;margin-top:16px}
.toc-item{display:flex;gap:12px;align-items:flex-start;
  border-bottom:1px solid var(--line-soft);padding-bottom:9px}
.toc-item .toc-no{color:var(--gold-strong);font-weight:700;
  font-size:17px;line-height:1.3;min-width:26px}
.toc-item b{font-size:13.5px;color:var(--brand-ink)}
.toc-item .hint{margin-top:1px}
@media screen and (max-width:720px){.toc-grid{grid-template-columns:minmax(0,1fr)}}

/* 표지 · 미드나잇 모노그램(기본) — 여백 중심, 로고 우상단 */
.rc-cap{width:100%;display:flex;justify-content:flex-end}
.rc-mid{background:#13203a;
  border-radius:var(--r-lg);padding:36px 40px 34px;margin-bottom:18px;box-shadow:var(--sh-2);
  display:flex;flex-direction:column;align-items:center;text-align:center;min-height:660px}
.rcm-logo{height:30px}
.rc-body{margin:auto 0;padding:24px 0}
.rcm-title{font-family:var(--serif);font-size:40px;font-weight:400;color:var(--gold);
  letter-spacing:.22em;text-indent:.22em;line-height:1.62}
.rcm-title b{font-weight:700}
.rc-vline{width:1px;height:52px;background:var(--gold);opacity:.7;margin:30px auto}
.rcm-name{font-family:var(--serif);font-style:italic;font-size:21px;color:var(--gold)}
.rc-name{font-size:28px;font-weight:700;color:var(--gold)}
.rc-sub2{margin-top:16px;font-size:12.5px;color:var(--gold);opacity:.8;letter-spacing:.16em}
.rc-bottom{font-family:var(--serif);font-size:12px;color:var(--gold);
  letter-spacing:.2em;line-height:2}
.rc-bottom b{color:var(--gold)}

/* 표지 · 화이트 클래식 프레임(?cover=light) */
.rc-light{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  padding:16px;margin-bottom:18px;box-shadow:var(--sh-2);display:flex}
.rcl-in{flex:1;border:1px solid var(--brand);outline:1px solid rgba(27,42,74,.3);outline-offset:4px;
  border-radius:4px;display:flex;flex-direction:column;align-items:center;text-align:center;
  padding:34px 36px 30px;min-height:620px}
.rcl-logo{height:30px}
.rcl-title{font-family:var(--serif);font-size:38px;font-weight:700;color:var(--brand-ink);
  letter-spacing:.1em;line-height:1.5}
.rc-dia{color:var(--gold-strong);font-size:14px;margin:20px 0;letter-spacing:.4em;text-indent:.4em}
.rcl-name{font-family:var(--serif);font-size:17px;color:var(--brand-ink);line-height:1.9}
.rcl-name .rc-name{color:var(--gold-strong)}
.rcl-sub{font-size:13.5px;opacity:.8}
.rcl-meta{font-family:var(--serif);font-size:12.5px;color:var(--brand-ink);opacity:.85;
  letter-spacing:.18em;line-height:1.9}
.rcl-meta b{color:var(--gold-strong)}
.rdiv{border-top:2px solid var(--line);margin:20px 0}
.report-foot{margin:18px 4px 0;font-size:11.5px;color:var(--muted);line-height:1.6;
  border-top:1px solid var(--line);padding-top:12px}

/* 표지 · 투톤 분할(시안3) — 좌 네이비 밴드 + 우 화이트, 로고 우상단(협업), 날짜·FP 우하단 */
.rc-split{display:flex;background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  overflow:hidden;min-height:680px;margin-bottom:18px;box-shadow:var(--sh-2)}
.rcs-band{width:16.5%;background:#13203a;display:flex;align-items:center;justify-content:center}
.rcs-vert{writing-mode:vertical-rl;letter-spacing:.5em;color:var(--gold);
  font-family:var(--serif);font-size:14px;opacity:.92}
.rcs-main{flex:1;display:flex;flex-direction:column;padding:30px 42px 30px 58px}
.rcs-logos{display:flex;justify-content:flex-end;align-items:center;gap:14px}
.rcs-logo-kumho{height:20px}
.rcs-logo-kpw{height:30px}
.rcs-logo-div{width:1px;height:26px;background:var(--line)}
.rcs-body{margin:0;padding-top:56px}
.rcs-title{font-family:var(--serif);font-size:48px;font-weight:400;color:var(--brand-ink);
  letter-spacing:.1em;line-height:1.8}
.rcs-title b{font-weight:700}
.rcs-rule{width:160px;height:2px;background:var(--gold);margin:34px 0}
.rcs-name{font-family:var(--serif);font-size:21px;color:var(--brand-ink)}
.rcs-name .rc-name{font-size:34px;font-weight:700;color:var(--gold-strong)}
.rcs-sub{margin-top:14px;font-size:15px;color:var(--ink-soft);letter-spacing:.06em}
.rcs-meta{margin-top:auto;text-align:right;font-family:var(--serif);font-size:15px;
  color:var(--brand-ink);letter-spacing:.14em;line-height:2}
.rcs-meta b{color:var(--gold-strong)}

/* 리포트 편집 모드 — 저장되지 않는 인쇄 전 미세조정(1차·2차 공용) */
.report[contenteditable="true"]{outline:2px dashed var(--gold);outline-offset:6px;border-radius:8px;cursor:text}
.r-edited{background:#fff3c4;box-shadow:0 0 0 2px #f2dd9a;border-radius:3px}
.edit-tip{display:none;background:var(--gold-soft);border:1px solid var(--gold-line);color:#8a6516;
  padding:9px 14px;border-radius:10px;font-size:12.5px;margin:0 0 12px;font-weight:600}

/* 2차 리포트(실행 제안서) — 와인 포인트 구분 */
.rcs-rule.wine{background:#7c3a4b}
.rc2-sub{margin-top:10px;font-family:var(--serif);font-size:13px;color:#7c3a4b;
  letter-spacing:.22em;text-indent:.22em}
.report .wine{color:#7c3a4b}

/* 투자정책 명세서 — 2p 중앙 배치 */
.ips-center{max-width:640px;margin:0 auto;text-align:left;padding:8px 0}
.ips-center h3{text-align:center}
.ips-center ul{margin-top:10px;line-height:1.95;padding-left:4px;list-style:none;font-size:13px;color:var(--ink-soft)}
/* 투자정책지침 — 번호·원칙·설명 3열 표(항목별 줄 수가 달라도 좌측 열이 어긋나지 않음) */
.ips-table{width:100%;border-collapse:collapse;margin-top:10px;table-layout:fixed}
.ips-table td{border:none;border-bottom:1px solid var(--line);padding:9px 8px;vertical-align:top}
.ips-table tr:last-child td{border-bottom:none}
.ips-table .ino{width:34px;color:var(--gold-strong);font-weight:800;font-size:12px;
  font-family:var(--serif),serif;text-align:center;padding-top:11px}
.ips-table .ipt{width:132px;font-weight:700;color:var(--brand-ink);font-size:13px;line-height:1.5}
.ips-table .ipd{font-size:12.5px;color:var(--ink-soft);line-height:1.65}
@media screen and (max-width:640px){
  .ips-table,.ips-table tbody,.ips-table tr,.ips-table td{display:block;width:auto}
  .ips-table .ino{display:none}
  .ips-table .ipt{padding-bottom:2px}
  .ips-table .ipd{padding-top:0}
}

/* 요약 재무현황·자산 구성 — 분단 박스(표+도넛) */
.sum-block{border:1px solid var(--line);border-radius:10px;padding:12px;
  display:flex;flex-direction:column}
.sum-block-h{font-weight:800;color:var(--brand-ink);font-size:13px;margin-bottom:8px;
  border-left:3px solid var(--gold-strong);padding-left:9px}
/* ⚠ 2026-09-13 — .sum-block-h 는 있는데 **.sum-block-v(값)가 없었다**.
   주식 평가손익 3칸의 금액이 본문 글자 그대로 나오고 있었다. 머리글의 짝을 채운다. */
.sum-block-v{font-weight:800;font-size:var(--fs-lg);font-variant-numeric:tabular-nums;
  margin-top:auto;letter-spacing:-.01em}
.sum-donut{flex:1;display:flex;align-items:center;justify-content:center;
  gap:12px;margin-top:6px;text-align:left;line-height:1.9}
.sum-donut>div{display:flex;flex-direction:column;align-items:flex-start;gap:2px}

/* 자산 성격별 목록 — 공란행·연한 소계 */
.ag-blank td{height:26px;border-bottom:1px solid var(--line-soft);background:#fff}
tr.subtot td{background:var(--surface-2);border-top:1.5px solid var(--line);
  font-weight:700;color:var(--brand-ink)}

/* 재무상태표 — 자산군 예시 상품 유형 */
.bs-ex{font-size:10.5px;font-weight:400;color:var(--muted);margin-top:2px}

/* 재무상태 분석 — 전폭 행(표 넓게 + 우측 도넛) */
/* 04 재무상태 분석 — **06 현금흐름 분석과 같은 배치**로 맞춘다(사용자 지시 2026-07-31).
   예전에는 flex + 표에 max-width:460px가 걸려 있어, 화면이 넓어져도 표만 왼쪽에 작게 남았다.
   `.cfa-row`와 같은 그리드(표 = 남는 폭 전부 · 도넛 = 250px 고정)를 쓴다. */
.bsa-row{display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:14px;align-items:center;margin-top:12px}
.bsa-tbl{min-width:0}
.bsa-chart{justify-self:center;text-align:center;line-height:1.9}
/* 리포트 수정(2026-08-11): 도넛 3개 표시 크기를 명시적으로 통일한다(fixed_pad로 SVG W가 같아졌고,
   여기서 표시폭까지 고정해 확실히 같은 크기로 보이게). */
.bsa-chart svg{width:100%;max-width:235px;height:auto}
/* 소제목: 회색·작던 것을 검정·키움(사용자 지시) */
.bsa-sub{font-size:12.5px;font-weight:500;color:var(--brand-ink)}
/* 리포트 수정(2026-08-11): ▣ 소제목이 작다는 지적 — 키우고 표와 간격을 준다 */
.bsa-tbl h3{font-size:15.5px;font-weight:700;margin:0 0 5px;color:var(--brand-ink)}
/* 표: 글자 키우고 행 간격은 조이고, 구분↔평가액이 벌어지지 않게 폭 상한 */
.bsa-table{width:100%;font-size:15px}   /* 리포트 수정(2026-08-11): 표 글씨가 작다는 지적 — 13.5→15 */
.bsa-table th,.bsa-table td{padding:6px 12px}
.bsa-table td{font-weight:600}
@media screen and (max-width:720px){.bsa-row{grid-template-columns:minmax(0,1fr)}}

/* 현금흐름 분석 — 항목 표(공통 폭) + 우측 도넛(세로 정렬) */
.cfa-row{display:grid;grid-template-columns:minmax(0,1fr) 250px;gap:14px;align-items:center;margin-top:6px}
.cfa-row>table{min-width:0;width:100%}
.cfa-chart{justify-self:center;text-align:center;line-height:1.9}
/* 소득/지출 분석 표 — 04(재무상태 분석)처럼 글자 키우고 행 간격은 조인다 */
.cfa-table{font-size:13.5px}
.cfa-table th,.cfa-table td{padding:6px 12px}
.cfa-table td{font-weight:600}
@media screen and (max-width:720px){.cfa-row{grid-template-columns:minmax(0,1fr)}}

/* 건전성 지표 — 뜻·공식 */
.ind-desc{font-size:11.5px;color:var(--ink-soft);margin-top:5px;line-height:1.55}
.ind-form{font-size:11px;color:var(--muted);margin-top:2px;
  border-top:1px dashed var(--line);padding-top:4px}

/* 손글씨 메모 칸(코멘트·SWOT 기입란) */
.memo-lines{margin-top:8px}
.memo-lines div{border-bottom:1px solid var(--line);height:28px}
.swot-ex{font-size:11.5px;color:#a8b0bd;font-style:italic}
.swot-lines div{border-bottom:1px dashed var(--line);height:22px}
.fill-line{border-bottom:1px dashed var(--line);height:20px}
/* 재무상태표 — 예시 상품 행(연한 회색 + 예시 태그) */
.bs-exrow td{color:#a9b1be}
.ex-tag{font-size:9.5px;color:var(--gold-strong);border:1px solid var(--gold-line);
  border-radius:4px;padding:0 4px;margin-left:6px}

/* 보장보험 우선순위 — 휠(좌) + 1~7 설명 세로 정렬(우) */
.wheel-wrap{display:flex;gap:16px;align-items:center;margin-top:12px}
.wheel-svg{flex:0 0 42%;text-align:center}
.wheel-side{flex:1;display:flex;flex-direction:column;gap:7px}
.wheel-item{border:1px solid var(--line);border-radius:9px;padding:7px 11px;font-size:12px;color:var(--brand-ink)}
.wheel-item .d{font-size:10.8px;color:var(--muted);line-height:1.55;margin-top:2px}
@media screen and (max-width:720px){.wheel-wrap{flex-direction:column}}

/* 위험설계 표준안 — 보장항목 카드 */
.risk-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px 14px;margin-top:10px}
.risk-card{border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--surface-3)}
.risk-card .rk-h{display:flex;align-items:center;gap:6px;font-weight:800;font-size:12.5px;
  color:var(--brand-ink);margin-bottom:6px}
.risk-card .rk-ic{font-size:15px}
.risk-card table th,.risk-card table td{padding:4px 7px;font-size:11px}
@media screen and (max-width:720px){.risk-grid{grid-template-columns:minmax(0,1fr)}}

/* 6단계 프로세스 — 단독 페이지(칸은 콘텐츠 높이만큼만 — 상하 스트레치 없음) */
.proc-fill{flex:1;display:flex;flex-direction:column}

/* 건전성 지표 — 한 줄 1지표 타일: 그래프 전폭 + 항목별 하단 설명란 */
.gauge-line{border:1px solid var(--line);border-radius:10px;padding:14px 16px;background:var(--surface-3);margin-top:12px}
.gauge-line .gl-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.gauge-line .gl-head .l{font-size:14px;font-weight:800;color:var(--brand-ink)}
.gauge-line .gl-cur{margin-left:auto;font-size:12px;color:var(--ink-soft);font-weight:600}
.gauge-line .gl-gauge{margin-top:6px}
.gauge-line .gl-gauge svg{width:100%;max-width:100% !important}
.gauge-line .gl-desc{margin-top:8px;border-top:1px dashed var(--line);padding-top:7px}

/* 라이프사이클 수기 타임라인 — 끝-끝 가로선 + 양끝 눈금(상담 중 직접 기입) */
.hand-timeline{position:relative;height:52px;margin:12px 6px 4px;border-bottom:1.6px solid #8fa0bd}
.hand-timeline::before,.hand-timeline::after{content:"";position:absolute;bottom:-1px;width:1.6px;height:13px;background:#8fa0bd}
.hand-timeline::before{left:0}
.hand-timeline::after{right:0}

/* 07 진단 페이지 — 도넛 4개 상하 분산으로 페이지 채움 */
.diag-donuts{gap:20px}

/* 인쇄 요약 스트립 */
.report-summary{display:flex;flex-wrap:wrap;gap:8px;margin:0 4px 16px}
.rs-item{flex:1 1 120px;border:1px solid var(--line);border-radius:10px;padding:8px 10px;background:var(--surface-3)}
.rs-item .rl{font-size:11px;color:var(--muted);margin-bottom:3px}
.rs-item .rv{font-size:13px;font-weight:700;color:var(--brand-ink)}

/* ═══ B7-6·B7-12(2026-08-03) 화면 최소 글자 크기 ═══════════════════════════
   🔴 인쇄용 밀도 규칙(9.5~11.5px)이 **화면에도 그대로** 걸려 빔프로젝터에서 안 읽혔다.
   인쇄는 A4 한 장에 담아야 해서 밀도가 필요하므로 **화면에서만** 하한을 건다.
   ⚠ 반드시 @media screen 안에 둘 것 — 인쇄에 새면 표가 다음 장으로 밀린다.
   ⚠ 여기 값을 올릴 때는 인쇄 넘침을 print_check.py로 다시 확인할 것. */
@media screen{
  /* 보장 체크시트 — 담보 33행이라 가장 촘촘했다 */
  .cov-t th,.cov-t td{font-size:12.5px}
  .cov-t th{font-size:12px}
  .cov-t td.muted{font-size:12px}
  .cov-t td .badge{font-size:10.5px}
  /* 캘린더 — 두 달을 나란히 두느라 10px까지 내려가 있었다 */
  .cal-duo table.cal th{font-size:12px}
  .cal-duo table.cal td{font-size:12px}
  .cal-duo .cal-day{font-size:12px}
  .cal-duo .cal-item{font-size:11.5px}
  /* 지표 게이지 설명·산식 */
  .gauge-line .ind-desc{font-size:12px}
  .gauge-line .ind-form{font-size:11.5px}
  /* 자산 표 날짜 칸 */
  .tx-table td.dt{font-size:12px}
  /* muted/hint가 10.5~11px까지 내려간 자리 — 화면에서는 12px 하한(인쇄본은 원래 크기 유지).
     ⚠ 2026-08-13: 원래는 **인라인 style 문자열**을 셀렉터로 잡고 있었다
       (`[style*="font-size:11px"]`). 인라인을 유틸 클래스로 바꾸는 순간 이 하한이 조용히 풀려
       글자가 11px로 작아진다 — 그래서 유틸 클래스(.fs-xs/.fs-2xs) 형태도 함께 잡는다.
       하한을 없애는 게 아니라 **표현 방식이 둘 다 존재하는 동안 둘 다 막는다.** */
  .card .hint[style*="font-size:10.5px"],
  .card .hint[style*="font-size:11px"],
  .kpi .hint[style*="font-size:10.5px"],
  .kpi .hint[style*="font-size:11px"],
  .card .hint.fs-2xs, .card .hint.fs-xs,
  .kpi .hint.fs-2xs, .kpi .hint.fs-xs{font-size:12px !important}
}

/* 🔴 인쇄에서는 접힌 내용(details)이 **모두 펼쳐져야** 한다 — 화면에서 접어 둔 근거·산식이
   리포트에서 통째로 빠지면 "숫자만 있고 근거가 없는 문서"가 된다(B7-7 · 2026-08-03).
   ⚠ 화면 정리를 위해 details를 새로 쓸 때마다 이 규칙 덕에 인쇄는 자동으로 안전하다. */
@media print{
  details{display:block !important}
  details>summary{display:block !important;list-style:none;font-weight:700;cursor:auto}
  details>summary::marker,details>summary::-webkit-details-marker{display:none}
  details>*{display:revert !important}
  /* 🔴 A2·A3(2026-08-11): 접어 둔 details까지 인쇄에 펼쳐지므로, 설계사 전용(.fp-only)은
     인쇄에서 반드시 숨긴다. 그러지 않으면 ①고객상세의 접힌 주민번호 details가 종이에 찍히고
     ②포트폴리오 '상품 후보'·설계사 메모 등이 작업 화면을 그대로 뽑는 경로로 새어 나간다
     (컴플라이언스: 특정 상품명 직접 노출 금지). 정식 산출물(report.html)에는 .fp-only가 없다.
     ⚠ details 펼침 규칙보다 **뒤**에 둬야 display:none이 이긴다. */
  .fp-only{display:none !important}
  /* 인쇄 개인정보(코드 대조 ⑤ · 2026-09-01): 연락처·생년처럼 화면·상담화면 모드에는 보이되
     종이에는 찍히면 안 되는 값 — .fp-only(설계사 전용)와 달리 고객 앞 화면에서는 보인다.
     템플릿에서 값을 감싸는 요소에 .p-priv를 붙인다(여기서 선택자를 늘리지 말 것). */
  .p-priv{display:none !important}
}

@media print{
  /* A4 고정 + 상하 여백 0(표지 네이비 밴드 상하 풀블리드) — 본문 카드가 자체 상하 마진으로 여백을 만든다 */
  @page{size:A4;margin:0 9mm}
  /* 편집 모드 흔적은 인쇄에 남기지 않는다 */
  .r-edited{background:none !important;box-shadow:none !important}
  .report[contenteditable="true"]{outline:none}
  *{-webkit-print-color-adjust:exact !important;print-color-adjust:exact !important}
  .sidebar,.mainbar,.foot,.noprint,.skip-link{display:none !important}
  .shell{display:block}
  html,body{background:#fff;font-size:11.5px;-webkit-text-size-adjust:100%}
  .container{margin:0;max-width:none;width:auto;padding:0}   /* 인쇄는 용지 폭 그대로 */
  .report{counter-reset:none}
  .card{box-shadow:none;border:1px solid #cfd6e4;padding:14px 16px;margin:7mm 0;
    break-inside:avoid;page-break-inside:avoid}
  .kpi{box-shadow:none;border:1px solid #cfd6e4}
  h1{font-size:19px}
  h2{font-size:17px;break-after:avoid;page-break-after:avoid}
  h3{font-size:12.5px;break-after:avoid;page-break-after:avoid}
  h2+*,h3+*{break-before:avoid}
  table{break-inside:auto}
  thead{display:table-header-group}          /* 표 머리글 페이지마다 반복 */
  tr{break-inside:avoid;page-break-inside:avoid}
  .grid{break-inside:avoid}
  svg{max-width:100%!important;height:auto}
  a{color:inherit;text-decoration:none}
  .report-cover{border-radius:0;box-shadow:none;margin:0;
    height:297mm;display:flex;
    break-after:page;page-break-after:always}
  .rc-split .rcs-main{padding:12mm 4mm 12mm 12mm}
  .rc-mid{border-radius:0;min-height:0}
  .rc-light{border-radius:0;border:none}
  .rc-split{border-radius:0;border:none;min-height:0;box-shadow:none}
  .rcl-in{min-height:0}
  .rc-body{margin:auto 0}
  .rpage{break-before:page;page-break-before:always}
  /* 페이지 채움: 주요 섹션이 인쇄 페이지 높이를 꽉 채우도록
     (카드 여백·테두리 몫을 빼서 다음 페이지로 밀리지 않게 여유 확보) */
  /* 일반 페이지 가용 높이 = 297 − 카드 상하 마진 14mm − 테두리 여유 ≈ 278mm (vh 사용 금지) */
  .rpage,.rfill{min-height:278mm}
  .rlast{min-height:266mm}   /* 마지막 페이지 — 하단 고지문 자리 확보 */
  .rfill{display:flex;flex-direction:column;justify-content:space-between}
  .rdiv{border-top:2px solid #cfd6e4;margin:0}
  .report-summary{break-inside:avoid;break-after:avoid}
  .report-foot{break-before:avoid}
  .gauge-tile{border:1px solid #cfd6e4;background:#fff;break-inside:avoid;padding:7px 10px}
  .ag-head{break-after:avoid;page-break-after:avoid;padding:0 0 2px 10px}
  .ag-name{font-size:12.5px}
  /* 자산군 표는 페이지 중간에서 잘리지 않게 — 넘치면 블록째 다음 페이지로 */
  .ag-block{margin-top:14px;break-inside:avoid;page-break-inside:avoid}
  .ag-block table th,.ag-block table td{padding:3.5px 7px;font-size:10px;line-height:1.45}
  .ag-block table tr.ag-blank td{height:22px;padding:2px 7px}   /* 수기 기입 가능한 공란 높이 */
  .bs-table th,.bs-table td{padding:4.5px 8px;font-size:10.5px}
  /* 월 현금흐름표는 과목을 전부 싣는 양식이라 행이 30줄을 넘는다.
     현금흐름 화면에는 .cfs-compact 밀도 규칙이 있었는데 리포트 05 섹션에는 그 클래스가 없어
     매 고객마다 A4를 4mm씩 넘겼다(실측 1139px). 같은 취지로 인쇄에서도 행 높이만 조인다. */
  .cfs-page .bs-table th,.cfs-page .bs-table td{padding:3.4px 8px;line-height:1.32}
  /* 투자정책지침 표 — 2p가 한 페이지에 수렴하도록 인쇄에서만 밀도를 조인다.
     폭 제한을 풀어 설명이 한 줄에 더 들어가게 하고 행 패딩을 줄인다. */
  .ips-center{max-width:none;padding:4px 0}
  .ips-table{margin-top:6px}
  .ips-table td{padding:5px 8px}
  .ips-table .ino{padding-top:6px}
  .ips-table .ipt{width:150px;font-size:12.5px}
  .ips-table .ipd{font-size:12px;line-height:1.55}
  .fpg-title{font-size:23px;margin-top:5px}
  .fpg-lead{font-size:12px;line-height:1.7;margin-top:8px}
  .fpg-grid{gap:10px 22px;margin-top:12px}
  .fpg-item{padding-top:6px}
  .fpg-item .t{font-size:14px;margin-top:3px}
  .fpg-item .d{font-size:11.5px;line-height:1.55;margin-top:3px}

  /* 6단계 프로세스 — 칸 높이와 분단 사이 여백을 키워 페이지를 채움 */
  .proc-page .proc-table .st{padding:16px 16px}
  .proc-page .proc-table .ds{padding:16px 18px;font-size:13.5px;line-height:1.85}
  /* 화살표 6줄이 A4를 20px 넘기게 만들던 자리 — 22px로 낮춰 한 장에 들어오게 한다
     (개발도구/print_audit.py로 실측: 1142px → 1094px) */
  .proc-page .proc-table .arw td{padding:22px 0;font-size:13px}
  .bsa-row,.cfa-row,.wheel-wrap,.wheel-item,.risk-card,.sum-block{break-inside:avoid}
  .bsa-row{margin-top:7px;gap:12px}
  .bsa-row h3{margin:0}
  .cfa-row{gap:12px}
  .sum-block{padding:7px}
  .sum-block-h{margin-bottom:4px}
  .sum-donut{margin-top:2px}
  .memo-lines div{height:24px}
  /* 11 종합 제안 — 고객/설계사 SWOT 8칸이 얹혀 A4를 26mm 넘겼다(실측 1221px).
     기입 줄 높이를 낮추고 인쇄에서는 다섯째 줄을 접어 한 장에 맞춘다(손글씨 4줄이면 충분). */
  .swot-lines div{height:13px}
  .swot-lines div:nth-child(5){display:none}
  .swot-table th,.swot-table td{padding:4px 8px}
  .swot-ex{font-size:10.5px}
  .swot-div{margin:12px 0 8px !important}
  .report-foot{margin:8px 0 7mm;padding-top:8px;font-size:10.5px}
  .risk-grid{gap:5px 8px;margin-top:6px}
  .wheel-item{padding:5px 10px}
  .wheel-item .d{font-size:10.3px;line-height:1.5}
  .wheel-wrap{margin-top:8px;gap:12px}
  .risk-card{padding:6px 9px}
  .risk-card .rk-h{font-size:11.5px;margin-bottom:3px}
  .risk-card table th,.risk-card table td{padding:2px 5px;font-size:9.7px;line-height:1.45}
  .bs-exrow td{padding:3px 8px;font-size:10px}
  /* 인쇄 밀도: 칸 여백은 여유 있게, 괘선은 진하게(출력 시 흐림 방지) */
  th,td{padding:6.5px 9px;font-size:11px;border-bottom-color:#b9c4d6}
  th{border-bottom:1.5px solid #8fa0bd}
  tr.subtot td{border-top:1.5px solid #8fa0bd}
  tr.sumrow td{border-top:2px solid var(--gold-strong)}
  .ag-blank td{border-bottom-color:#b9c4d6}
  .fill-line,.memo-lines div{border-bottom-color:#b9c4d6}
  .swot-lines div{border-bottom-color:#b9c4d6}
  /* 보장분석(09) — 8항목 확장에 맞춰 한 페이지 수렴 */
  .cov-page .wheel-wrap{margin-top:6px;gap:10px}
  .cov-page .wheel-svg{flex:0 0 37%}
  .cov-page .wheel-item{padding:4px 9px}
  .cov-page .wheel-item .d{font-size:9.7px;line-height:1.45}
  .cov-page table th,.cov-page table td{padding:4px 8px;font-size:10px}
  .cov-page .fill-line{height:14px}
  .cov-page h3{margin-top:8px}
  /* 연말정산 — 팁 확대로 길어진 표를 한 페이지에 수렴 */
  .tax-page table th,.tax-page table td{padding:4px 7px;font-size:9.8px;line-height:1.5}
  .tax-page .kpi{padding:7px 9px}
  .tax-page h3{margin-top:8px}
  /* 지표 한 줄 타일 — 전폭 그래프 + 하단 설명란 */
  .gauge-line{break-inside:avoid;padding:12px 14px;margin-top:12px;border-color:#cfd6e4;background:#fff}
  .hand-timeline{break-inside:avoid;height:15mm;border-bottom-color:#5b6675}
  .hand-timeline::before,.hand-timeline::after{background:#5b6675}
  /* 07 진단 — 도넛 4개를 위아래로 벌려 페이지 채움 */
  .diag-page>div:first-child{flex:1;display:flex;flex-direction:column;min-height:0}
  .diag-page .diag-donuts{flex:1;gap:22px;margin-top:14px}
  .grid{gap:8px}
  /* 인쇄 폭(~692px)이 반응형 분기점(820px)보다 좁아도 격자 유지 */
  .grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}
  .grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}
  .grid.cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}
  .row{gap:8px 14px}
  .kpi{padding:8px 10px}
}

/* ---------- 16) Motion ---------- */
@media (prefers-reduced-motion:reduce){
  *{transition:none !important;animation:none !important}
}

/* 기초자료 — 항목명을 바꾼 칸에 원래 이름을 표시(어느 칸인지 잃지 않게) */
.lblbase{font-size:10.5px;color:var(--muted);margin:-2px 0 3px 2px}

/* ---------- 17) 리포트 준비 점검 패널 (_readiness.html) ---------- */
.rd-card h3{margin-bottom:4px}
.rd-table{margin-top:6px}
.rd-table td{vertical-align:top}
.rd-table .rd-src{color:var(--muted);font-size:11.5px}
.rd-table .rd-diff{font-weight:700;color:var(--danger)}
/* 조치 버튼이 두 줄로 감기지 않게 열 폭 확보 */
.rd-table .rd-act{width:104px}
.rd-table td:last-child{white-space:nowrap;text-align:right}
/* 인쇄물에는 내부 점검 패널을 싣지 않는다(고객 전달용 리포트가 아님) */
@media print{.rd-card{display:none}}

/* ---------- 22) 기초자료 고정 저장바 ----------
   폼이 길어 중간에서 고치면 저장 버튼까지 스크롤을 왕복해야 했다. */
.intake-bar{
  position:sticky;bottom:0;z-index:20;display:flex;justify-content:space-between;align-items:center;
  gap:10px;flex-wrap:wrap;background:rgba(255,255,255,.96);backdrop-filter:blur(4px);
  border-top:1px solid var(--line);padding:11px 14px;margin:14px -16px 0;
  box-shadow:0 -4px 14px rgba(27,42,74,.07)}
.intake-bar .hint{margin:0}
@media print{.intake-bar{display:none}}

/* ---------- 21) 토스트(비차단 알림) ----------
   고객 앞에서 마무리하는 자리라 확인 버튼을 눌러 닫는 모달(alert)은 흐름을 끊는다. */
.kk-toast{
  position:fixed;left:50%;bottom:28px;transform:translateX(-50%) translateY(12px);
  background:var(--brand-ink);color:#fff;padding:11px 18px;border-radius:999px;
  font-size:13.5px;font-weight:600;box-shadow:0 6px 20px rgba(27,42,74,.28);
  opacity:0;pointer-events:none;transition:opacity .18s,transform .18s;z-index:9999}
.kk-toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
@media print{.kk-toast{display:none}}

/* ---------- 20) 절세계좌 비교(세로형) ----------
   계좌가 열, 비교 항목이 행이다. 첫 열(항목명)은 스크롤해도 붙어 있어야 어느 항목인지 안 잃는다. */
.tax-cmp{table-layout:fixed;min-width:820px}
.tax-cmp th:first-child,.tax-cmp td:first-child{width:112px}
.tax-cmp .tc-h{background:var(--surface-2);color:var(--brand-ink);font-weight:700;
  text-align:left;position:sticky;left:0;z-index:1}
.tax-cmp td{vertical-align:top;font-size:12.5px;line-height:1.5;text-align:left}
.tax-cmp th{text-align:left}

/* ---------- 19) 위험성향 진단 문항 ----------
   고객과 마주 앉아 고르는 화면이라 **선택지 전체가 클릭 영역**이어야 한다.
   4지선다를 2열로 접어 7문항이 한 화면에 가깝게 들어오게 한다(예전엔 세로로 28줄이었다). */
.rq{padding:12px 0;border-bottom:1px solid var(--line)}
.rq:last-of-type{border-bottom:none}
.rq-q{font-size:14px;display:block;margin-bottom:8px}
.rq-opts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.rq-opt{justify-content:flex-start;font-weight:500;font-size:13.5px;line-height:1.35;
  align-items:center;min-height:46px;padding:9px 12px}
.rq-t{flex:1 1 auto}
.rq-s{flex:none;font-size:11px;color:var(--muted);font-weight:600;
  background:var(--surface-2);border-radius:999px;padding:2px 7px}
label.chk:has(input:checked) .rq-s{background:#fff;color:var(--gold-strong)}
@media screen and (max-width:760px){.rq-opts{grid-template-columns:minmax(0,1fr)}}

/* ---------- 18) 🖥️ 상담화면(프레젠테이션) 모드 ----------
   고객과 화면을 같이 볼 때 **설계사 전용 항목만** 감춘다(2026-08-02).
   ⚠ 보안 장치가 아니다 — CSS로 가리는 것이므로 권한 제어를 대신하지 않는다.
     진짜 접근 제어는 소유권 관문·암호화가 담당한다.
   ⚠ 숨길 요소에는 템플릿에서 `.fp-only` 를 붙인다(여기서 선택자를 늘리지 말 것 —
     화면마다 구조가 달라 선택자로 잡으려 하면 엉뚱한 것까지 사라진다). */
body.present .fp-only{display:none !important}
.present-bar{
  background:var(--gold-soft);border:1px solid var(--gold-line);border-left:4px solid var(--gold);
  color:var(--brand-ink);border-radius:8px;padding:8px 12px;margin:10px 16px -2px;
  font-size:12.5px;line-height:1.5}
@media print{.present-bar{display:none}}

/* #앵커 이동 시 착지점이 상단 고정 바(.mainbar + 목차 띠)에 가려지지 않게.
   2026-08-26: 목차 띠 sticky화로 90→132px(헤더 64 + 띠 약 68). ⚠ **id를 가진 모든 요소**에 건다 —
   h2[id]만 잡으면 폼·카드 앵커(intakeform·fin-edit·pp-* 등 div/form/details)가 띠 밑에 깔린다
   (UX·디자인QA 감수에서 적발 — 개별 나열은 반드시 누락이 생긴다).
   ⚠ 명시도 (0,2,0)이라 화면별 h2[id]·클래스 규칙보다 세다 — 화면별 예외는 id 선택자로만 이긴다.
   ⚠ 모바일에서는 sticky를 끄므로(.mainbar static 분기와 **같은 조건**) 예전 값으로 되돌린다.
     🔴 2026-08-27: 이 분기만 960px로 남겨 두면 821~960px(확대해 쓰는 PC)에서 띠는 붙어 있는데
       착지 여백만 90px이라 앵커가 띠 밑에 깔린다 — 폭으로 가르는 규칙은 전부 한 조건으로. */
.container [id]{scroll-margin-top:132px}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .container [id]{scroll-margin-top:90px}
}

/* ═══ 사이드바 아코디언 — 2026-08-13 개편 1단계로 base.html의 <style> 블록에서 이관 ═══
   템플릿에 스타일이 남아 있으면 '스타일은 style.css 한 곳'이라는 규칙이 깨지고,
   같은 값이 두 파일에 생겨 한쪽만 바뀌는 사고가 난다(--side-* 토큰이 그 사고의 산물이다). */
/* 사이드바 대분류 아코디언(클릭 시 하위 펼침) — details/summary 네이티브(오프라인·JS불필요).
       ⚠ 전역 details summary 스타일(흰 배경·테두리·＋마커)을 사이드바에서는 모두 무효화한다. */
    .side-grp{margin:0;border:none;background:transparent;border-radius:0}
    /* 원래 섹션 라벨(.side-sec)과 같은 모양으로 명시 지정 — 전역 details summary 스타일에 안 휘둘리게.
       텍스트는 왼쪽 정렬(대시보드·하위 항목과 좌측 라인 일치), 화살표만 margin-left:auto로 오른쪽. */
    .side-grp>summary{list-style:none;cursor:pointer;display:flex;align-items:center;
      user-select:none;background:transparent;border:none;border-radius:0;
      padding:14px 11px 6px;font-size:10.5px;font-weight:800;letter-spacing:.14em;
      color:var(--side-label);text-transform:uppercase;transition:color .15s}
    .side-grp>summary:hover{background:transparent;color:var(--side-hover)}
    .side-grp>summary::before,.side-grp[open]>summary::before{content:""}   /* 전역 ＋/－ 마커 제거 */
    .side-grp>summary::-webkit-details-marker{display:none}
    .side-grp>summary::after{content:"⌄";margin-left:auto;opacity:.55;font-size:12px;
      letter-spacing:0;transition:transform .15s;transform:translateY(-1px)}
    .side-grp:not([open])>summary::after{transform:rotate(-90deg)}
    /* 이 고객 화면 링크(아이콘 없이 살짝 들여쓰기) */
    .sidecli a{padding:7px 10px 7px 16px;font-size:13px}
    /* 사이드바 하위 탭(위험·보장) — 눌러서 펼치는 2단 메뉴.
       ⚠ 전역 `details summary`(흰 배경·＋마커)를 여기서도 무효화해야 한다(대시보드 흰박스 회귀 전례). */
    .side-sub{margin:0;border:none;background:transparent;border-radius:0}
    .side-sub>summary{list-style:none;cursor:pointer;display:flex;align-items:center;
      background:transparent;border:none;border-radius:6px;
      padding:7px 10px 7px 16px;font-size:13px;color:var(--side-item);user-select:none}
    .side-sub>summary::-webkit-details-marker{display:none}
    /* ⚠ style.css의 전역 `details summary::before{content:"＋ "}` / `details[open] …{"－ "}` 가
       사이드바 하위 탭에도 붙어 왼쪽에 '＋/－'가 보였다. 사이드바에서는 확실히 지운다
       (전역 규칙이 나중에 바뀌어도 여기서 이기도록 명시). */
    .sidebar details.side-sub>summary::before,
    .sidebar details.side-sub[open]>summary::before{content:"" !important;margin:0}
    .side-sub>summary::marker{content:"";font-size:0}
    .side-sub>summary::after{content:"⌄";margin-left:auto;opacity:.55;font-size:11px;
      transition:transform .15s}
    .side-sub:not([open])>summary::after{transform:rotate(-90deg)}
    .side-sub>summary:hover{background:rgba(255,255,255,.09);color:#fff}
    .side-sub>summary.active{color:var(--side-active);font-weight:700}
    /* 제목 자체가 그 화면으로 가는 링크다(예전 '화면 열기' 줄을 없앤 자리).
       ⌄ 화살표 쪽 여백을 누르면 펼침, 글자를 누르면 이동 — 두 동작이 겹치지 않게 링크를 글자 폭으로 제한한다. */
    .side-sub>summary>a{color:inherit;text-decoration:none;flex:0 1 auto;min-width:0}
    .side-sub>summary>a:hover{text-decoration:underline}
    /* 하위 항목은 한 단 더 들여쓰기 — 어느 것이 하위인지 눈으로 구분되게 */
    .side-sub-nav a{padding-left:30px;font-size:12.5px}
    /* 숫자 입력칸의 위·아래 화살표(스피너) 전역 제거 — 전 화면 일관(사용자 지시 7.26) */
    input[type=number]{-moz-appearance:textfield}
    input[type=number]::-webkit-outer-spin-button,
    input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
    /* 금액 입력(.numin)은 오른쪽 정렬(천원단위 쉼표는 스크립트가 처리) */
    input.numin{text-align:right}
    /* B8-3 제품 5단계 묶음 — 고객 화면들을 단계로 접었다 폈다 한다(details 네이티브, JS 없음) */
    .side-stage{margin:0;border:none;background:transparent}
    .side-stage>summary{list-style:none;cursor:pointer;display:flex;align-items:center;
      background:transparent;border:none;padding:9px 10px 5px 12px;
      font-size:10.5px;font-weight:800;letter-spacing:.06em;color:var(--side-label-2);user-select:none}
    /* 208px에서 한 줄을 지키기 위해 라벨은 말줄임(flex 안의 맨 텍스트는 말줄임이 안 걸려 span.sl로 감싼다) */
    .side-stage>summary .sl{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
    .side-stage>summary::-webkit-details-marker{display:none}
    .sidebar details.side-stage>summary::before,
    .sidebar details.side-stage[open]>summary::before{content:"" !important;margin:0}
    .side-stage>summary::after{content:"⌄";margin-left:auto;opacity:.5;font-size:11px;
      letter-spacing:0;transition:transform .15s}
    .side-stage:not([open])>summary::after{transform:rotate(-90deg)}
    .side-stage>summary:hover{color:var(--side-hover-2)}
    /* '미입력' 배지 — 열어 보고 나서야 비었음을 아는 일을 없앤다 */
    .side-empty{margin-left:6px;padding:1px 5px;border-radius:4px;font-size:10px;font-weight:700;
      background:rgba(255,255,255,.12);color:var(--side-item-2);letter-spacing:0;white-space:nowrap}
    /* 화면 안 구획으로 바로 가는 링크(모니터링·기준) — 한 단 들여쓰기 */
    .side-nav a.sub{padding-left:32px;font-size:12px;opacity:.9}
    /* 리포트 열람 중 목차 */
    .rtoc a{display:block;padding:5px 10px;font-size:12.5px;border-radius:6px;line-height:1.35}
    .rtoc .rtoc-edit{color:var(--gold);font-weight:700}
    .rtoc .rtoc-back{opacity:.75;font-size:12px}

/* ═══ 유틸리티 — 2026-08-13 개편 1단계 ══════════════════════════════════════
   왜 만드나: 템플릿 인라인 style이 2,446건인데 그 정체는 대부분 **같은 간격·같은 글자크기의 반복**이다
   (margin-top 827 · font-size 643 · flex 조합 481). 값이 조금씩 달라 화면마다 여백이 어긋나고,
   "여백을 한 단계 넓히자"는 한 마디가 수백 곳 수정이 된다.
   ⚠ 이 단계에서는 **정의만** 한다 — 적용(치환)은 화면별 3단계에서 배치로 한다.
   ⚠ 클래스명은 짧고 뜻이 분명하게. 기존 클래스는 건드리지 않는다(회귀가 마크업 문자열을 검사한다). */
@media screen, print {
  /* 🔴 2026-08-13 실측 교훈 — 이 유틸들은 **인라인 style을 대체**하려고 만들었다.
     인라인은 어떤 선택자에도 이기지만, 클래스는 `.card .hint`(0,2,0) 같은 더 구체적인 규칙에 진다.
     실제로 인라인을 그대로 클래스로 바꿨더니 KPI의 '원' 단위 글자가 커지는 등
     financial 화면 픽셀의 10.4%가 어긋났다(개발도구/shot_diff.py로 발견).
     → 여백·글자 유틸에만 `!important`를 붙여 **인라인이 하던 역할을 그대로 이어받게** 한다.
       가독성 하한 규칙(.card .hint.fs-xs 등)은 특정도가 더 높아(0,3,0) 여전히 이긴다 —
       !important끼리는 특정도로 승부가 나기 때문이다.
     ⚠ 그래서 이 유틸은 '값을 한곳에서 고치기 위한 것'이지 '조합해 레이아웃을 짜는 것'이 아니다. */
  /* 위 여백 — 실사용 6/8/10/12/16px을 그대로 단으로 삼는다(임의의 4배수 스케일로 바꾸면 화면이 다 움직인다) */
  .mt-0{margin-top:0!important}
  .mt-1{margin-top:4px!important}
  .mt-2{margin-top:6px!important}
  .mt-3{margin-top:8px!important}
  .mt-4{margin-top:10px!important}
  .mt-5{margin-top:12px!important}
  .mt-6{margin-top:16px!important}
  .mb-0{margin-bottom:0!important}
  .mb-2{margin-bottom:6px!important}
  .mb-3{margin-bottom:8px!important}
  .mb-5{margin-bottom:12px!important}

  /* 글자 크기 — 토큰과 1:1(px를 템플릿에 다시 적지 않게) */
  .fs-2xs{font-size:var(--fs-2xs)!important}
  .fs-xs{font-size:var(--fs-xs)!important}
  .fs-note{font-size:var(--fs-note)!important}
  .fs-cap{font-size:var(--fs-cap)!important}
  /* ⚠ 2026-09-13 — fs-body-sm 은 있는데 **fs-body 가 없었다**. 템플릿 3곳이 쓰고 있었고
     정의가 없으니 글자 크기가 그냥 안 먹었다(오류도 안 난다). 본문 기준값과 1:1. */
  .fs-body{font-size:var(--fs)!important}
  .fs-body-sm{font-size:var(--fs-body-sm)!important}
  .fs-sm{font-size:var(--fs-sm)!important}
  .fs-md{font-size:var(--fs-md)!important}
  .fs-lg{font-size:var(--fs-lg)!important}
  .fs-xl{font-size:var(--fs-xl)!important}
  .fs-2xl{font-size:var(--fs-2xl)!important}
  .fs-3xl{font-size:var(--fs-3xl)!important}
  .fw-400{font-weight:400!important}
  .fw-700{font-weight:700!important}

  /* 자주 쓰는 배치 — `display:flex;gap:6px;flex-wrap:wrap` 조합만 40회 반복됐다 */
  .row-act{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
  .row-act-8{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
  .push-right{margin-left:auto}
  .nowrap{white-space:nowrap}

  /* 표 열폭 — 리포트가 56~104px을 표마다 다르게 인라인으로 적고 있다(199건).
     의미로 이름을 준다: 같은 성격의 열은 어느 표에서나 같은 폭이어야 한다. */
  .c-date{width:96px}
  .c-money{width:110px}
  .c-money-sm{width:92px}
  .c-owner{width:74px}
  .c-badge{width:64px}
  .c-act{width:104px}
}

/* ═══ 공용 컴포넌트(_ui.html 매크로용) — 2026-08-13 개편 2단계 ═════════════════
   빈 상태·증감·안내 카드는 화면마다 다시 그려져 6가지 모양으로 갈려 있었다.
   여기서 한 벌만 정의하고, 화면은 매크로만 부른다. */
@media screen, print {
  /* 빈 상태 — 기존 .empty(가운데 회색 글씨)를 유지하면서 '왜 비었나 + 다음 행동'을 담는다 */
  .empty-t{font-size:var(--fs-md);font-weight:700;color:var(--ink-soft)}
  /* 온보딩형(설명·버튼 여러 개) — 가운데 정렬이면 여러 줄 설명이 읽기 어렵다. 왼쪽으로 편다.
     화면마다 `style="text-align:left"`+`font-size:16px`을 손으로 적던 것을 여기로 모은다. */
  .empty-box{text-align:left;padding:20px 22px}
  .empty-box .empty-t{font-size:var(--fs-md)}
  .empty-box .hint{margin:8px 0 0}
  /* 표가 비었을 때의 한 줄 — 2026-08-13 개편. 14곳이 제각각이었다(13곳은 그냥 왼쪽 회색 글씨,
     1곳만 .empty의 24px 가운데 블록). 왼쪽 회색 글씨는 "행이 하나 있는데 내용이 없는" 것처럼 보여
     설계사가 화면이 덜 그려졌는지 자료가 없는지 매번 다시 판단해야 했다.
     → 가운데 정렬 + 넉넉한 위아래 여백으로 **의도적으로 비어 있음**을 읽히게 한다.
     ⚠ .empty(24px)보다 얕게 잡는다 — 표 안에서는 24px이면 행 하나가 카드처럼 커진다. */
  td.empty-cell{text-align:center;color:var(--muted);font-size:var(--fs-sm);padding:16px 12px}
  td.empty-cell a{white-space:nowrap}
  /* 페이지 제목 — 화면 38곳이 '<h1 style="margin-bottom:4px">' + 바로 아래 부제 한 줄로
     완전히 같은 구조인데, 여백을 각자 인라인으로 적고 있었다(제목 간격을 한 단계 넓히자는
     한 마디가 38곳 수정이 된다). 의미로 이름을 준다 — 여기가 이 화면의 제목이다. */
  h1.page-t{margin-bottom:4px}
  h1.page-t + .muted{font-size:var(--fs-body-sm)}
  /* 제목 옆 부연 — '현금흐름표 <span>— 월간·부부합산</span>' 처럼 제목의 범위·기준을 덧붙이는 조각.
     98곳이 <span class="muted" style="font-size:12px|11.5px;font-weight:400">였다
     (제목의 굵기를 상속받으니 매번 400으로 되돌리고 크기도 매번 적었다).
     🔴 처음엔 "제목 급에 따라 두 단"으로 **통합**했다가 11.5px가 12px로 커져 리포트 제목이 한 줄 더
       접혔고, A4 섹션 2개가 8mm·3mm 넘쳤다(print_check가 잡았다). 인쇄가 걸린 화면에서는
       0.5px도 줄바꿈을 바꾼다 → **크기는 원래 두 값을 그대로 두고 반복만 없앤다.**
     ⚠ !important인 이유: 인라인을 대체하는 클래스라 인라인의 힘을 이어받아야 한다
       (.report.wide .muted 12.5px 등 더 구체적인 규칙에 지면 리포트 글자가 조용히 커진다). */
  .h-sub{font-weight:400!important;font-size:12px!important}
  .h-sub-s{font-weight:400!important;font-size:11.5px!important}

  /* (증감 .dl* · 안내카드 .nt* 는 쓰이는 곳이 없어 2026-08-13 제거 — _ui.html 주석 참조) */
}

/* 🔴 좁은 화면(폰)에서 리포트가 **페이지 전체를 옆으로 밀던** 문제 — 2026-08-13 실측(mobile_check.py).
   리포트 카드는 A4 비율(192:278)을 고정해 '인쇄하면 어떻게 나오는지'를 보여 주는 화면이라
   폰 폭에는 애초에 들어갈 수 없다. 억지로 줄이면 인쇄 미리보기라는 목적 자체가 깨진다.
   → 페이지가 밀리는 대신 **리포트 상자만 옆으로 넘긴다**(표에 쓰는 .table-scroll과 같은 문법).
   ⚠ @media screen 안에 둔다 — 인쇄에 overflow가 새면 잘린다. */
@media screen and (max-width:640px){
  .report{overflow-x:auto;-webkit-overflow-scrolling:touch}
  /* 리포트 안의 표도 제 상자 안에서만 넘치게(표 하나가 리포트를 또 밀지 않도록) */
  .report table{display:block;overflow-x:auto;max-width:100%}
}

/* 2026-08-19 달력 원천 구분 — 6종이 한 칸에 섞이면 못 읽는다.
   🔴 2026-08-19(2) 감수: **색만으로는 실패했다.** 실측으로 팀(#e7edf7)↔회사(#eaeef6)는 배경 차이가
     RGB 3/1/1, 알림(#fdf1e1)↔상담(#f6efda)은 7/2/7이었다 — 같은 날 두 칩이 나란히 놓이면 구별이 안 되고
     2칸 미니 달력(10px)에서는 테두리 단서도 사라진다. 게다가 색은 **흑백 인쇄와 색약에서 통째로 죽는다**.
   → ① 팀을 보라 계열로 옮기고 ② **글자 표식(상·회·팀·개·알)** 을 앞에 붙여 색에 의존하지 않게 했다.
   ⚠ 표식은 **월 그리드 안에서만** 붙인다 — '오늘·이번 주' 카드는 이미 라벨 배지를 따로 그리므로
     거기서도 붙이면 "알 만기"처럼 같은 말이 두 번 나온다. */
.cal-item.team{background:var(--team-bg);color:var(--team);border:1px solid var(--team-line)}
.cal-item.team a{color:var(--team)}
.cal-item.alert{background:var(--warn-bg);color:var(--warn);
  border:1px solid var(--warn-line);border-left:2px solid var(--warn)}
.cal-item.alert a{color:inherit}
/* ── 일정 달력 전용 화면 (2026-08-20) ─────────────────────────────────
   칸 높이는 눈대중이 아니라 **합산**으로 정했다(디자인팀 계산):
     td패딩 16 + 날짜줄 21 + 칩 25×3 + 칩간격 4×2 + 더보기줄 23 = 143 → 144px.
   기존 86px 칸은 칩 2개에서 이미 넘쳤다 — 그래서 "칸이 안 맞는다"는 지적이 나왔다.
   ⚠ 좁은 화면에서는 토큰만 바꿔 칸을 줄인다(규칙을 다시 쓰지 않는다). */
.cal-page{--cal-cell-h:144px;--cal-chip-fs:12.5px;--cal-chip-py:3px;--cal-chip-px:8px;--cal-day-fs:13px}
.cal-scroll{overflow-x:auto}
table.cal.cal-lg{width:100%;min-width:0}
table.cal.cal-lg th{font-size:var(--fs-cap);padding:9px 8px}
table.cal.cal-lg td{height:var(--cal-cell-h);padding:8px}
.cal-lg .cal-day{font-size:var(--cal-day-fs);margin-bottom:4px;display:inline-block;
  text-decoration:none;padding:1px 5px;border-radius:var(--r-xs)}
.cal-lg .cal-day:hover{background:var(--line-soft);text-decoration:none}
.cal-lg .cal-item{font-size:var(--cal-chip-fs);padding:var(--cal-chip-py) var(--cal-chip-px);
  margin-top:4px;line-height:1.35}
/* 오늘 — 배경만으로 알리지 않는다(인쇄·색약). 날짜 숫자를 네이비 원으로(흰 글자 14.2:1). */
.cal-lg td.today .cal-day{background:var(--brand-ink);color:var(--on-brand);font-weight:800}
.cal-lg td.picked{box-shadow:inset 0 0 0 2px var(--brand-ink)}
.cal-lg td.past{background:var(--surface-2)}
.cal-more{display:block;margin-top:3px;padding:2px 8px;border-radius:var(--r-xs);
  font-size:var(--fs-note);font-weight:700;text-align:center;
  background:var(--navy-soft);color:var(--brand-ink);text-decoration:none}
.cal-more:hover{text-decoration:none;filter:brightness(.97)}
/* 원천 토글 — 🔴 켜짐/꺼짐을 **색만으로** 알리면 색약에서 구분이 사라진다(WCAG 1.4.1).
   ✓/○ 접두 + 실선/점선 테두리로 두 겹을 준다. */
.cal-filter{display:flex;flex-wrap:wrap;gap:6px}
.cal-filter a{display:inline-flex;align-items:center;gap:5px;min-height:34px;
  padding:6px 12px;border-radius:999px;font-size:var(--fs-cap);font-weight:700;text-decoration:none}
.cal-filter a:hover{text-decoration:none}
.cal-filter a.on{border:1.5px solid currentColor}
.cal-filter a.on::before{content:"✓";font-weight:800}
.cal-filter a.off{border:1.5px dashed var(--line);background:var(--surface);color:var(--ink-soft)}
.cal-filter a.off::before{content:"○";font-size:10px}
.cal-filter a.on.meet{background:var(--gold-soft);color:#8a6516}
.cal-filter a.on.co{background:var(--navy-soft);color:var(--brand-ink)}
.cal-filter a.on.team{background:var(--team-bg);color:var(--team)}
.cal-filter a.on.priv{background:var(--ok-bg);color:#0b5c30}
.cal-filter a.on.alert{background:var(--warn-bg);color:var(--warn)}
.cal-daypanel{border-left:3px solid var(--gold)}
.cal-daypanel .row-item{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:9px 2px;border-top:1px solid var(--line-soft)}
@media screen and (max-width:1279px){.cal-page{--cal-cell-h:132px;--cal-chip-fs:12px;--cal-chip-py:2px;--cal-day-fs:12.5px}}
@media screen and (max-width:1023px){.cal-page{--cal-cell-h:124px;--cal-chip-fs:11.5px;--cal-day-fs:12px}}
@media screen and (max-width:767px){
  .cal-page{--cal-cell-h:114px;--cal-chip-fs:10.5px;--cal-chip-px:6px;--cal-day-fs:11px}
  /* 320px에서 7열을 다 욱여넣으면 칸당 41px — 글자가 한 자도 안 들어간다.
     월 그리드의 값은 '빈 날·몰린 날'의 2차원 패턴이므로 형태를 바꾸지 않고 가로 스크롤로 둔다
     (디자인팀 판단). 대신 최소 폭을 정해 칩 글자가 6~7자는 보이게 한다. */
  .cal-scroll table.cal.cal-lg{min-width:644px}
}
@media print{
  .cal-filter,.cal-more,.cal-page .row-act{display:none}
  .cal-lg td.today{box-shadow:none;border:2px solid #000 !important}
  .cal-lg td.today .cal-day{background:none !important;color:#000 !important;border:1.5px solid #000}
  .cal-lg td.past{background:none}
}

/* ⚠ 2026-08-20 사용자 지적: 화면에서 표식까지 글자로 나오니 **칸이 더 복잡하고 안 맞는다**.
   → 표식은 **인쇄에서만** 붙인다. 화면은 색으로(팀을 보라로 옮겨 6종이 실제로 갈린다),
     흑백 인쇄는 글자로 — 각 매체에서 필요한 단서만 쓴다. */
@media print{
  .cal-item{background:none !important;border:1px solid #cfd6e2 !important;color:#000 !important}
  .cal-item a{color:#000 !important}
  table.cal .cal-item::before{font-weight:800;margin-right:3px}
  table.cal .cal-item.meet::before{content:"상 "}
  table.cal .cal-item.co::before{content:"회 "}
  table.cal .cal-item.team::before{content:"팀 "}
  table.cal .cal-item.priv::before{content:"개 "}
  table.cal .cal-item.alert::before{content:"알 "}
}

/* 맨 위 오른쪽 바로가기 — 공지·알림·증시 (2026-08-24 사용자 지시)
   ⚠ 헤더는 flex + wrap이다. 이 묶음은 **검색 다음, 상담화면 버튼 앞**에 오며
     좁은 화면에서는 줄바꿈으로 내려간다(감추지 않는다 — 모바일에서만 못 보는 메뉴를 만들지 않는다). */
/* 🔴 2026-08-24 정렬 — 유지시간은 가운데, 공지·알림·증시는 맨 오른쪽(사용자 지시).
   ⚠ 오른쪽 고정은 **.mb-present의 margin-left:auto**가 맡는다(여기 아니다).
     여기에도 auto를 두면 유지시간이 보일 때/숨을 때 **상담화면 버튼이 좌우로 점프**한다.
     present에 걸어 두면 유지시간이 숨어도 오른쪽 묶음이 1px도 안 움직인다.
   ⚠ order는 전부 못 박는다 — 예전에 present와 quick이 **둘 다 order:3**이라 DOM 순서에 기대고 있었다.
   ⚠ .mainbar는 wrap이다. 좁아지면 이 묶음이 줄바꿈으로 내려간다(감추지 않는다). */
.mb-quick{display:inline-flex;align-items:center;gap:4px}
.mbq{display:inline-flex;align-items:center;gap:5px;position:relative;
  padding:7px 11px;border-radius:var(--r-pill);border:1px solid var(--line);
  background:var(--surface-2);color:var(--muted);font-size:12.5px;line-height:1;white-space:nowrap}
.mbq:hover{border-color:var(--brand);color:var(--brand-ink)}
.mbq.on{border-color:var(--brand);background:var(--brand);color:var(--on-brand)}
.mbq.on svg{color:var(--on-brand)}
.mbq svg{width:15px;height:15px}
.mbq-theme{display:none}   /* 화면 모드 토글 — 판정 블록([8] 모바일 · [P2] PC)에서 켠다 · 2026-09-01 PC도 다크 지원 */
/* 안 읽은 건수 — 색만으로 알리지 않는다(숫자를 함께 쓴다) */
.mbq-n{display:inline-flex;align-items:center;justify-content:center;min-width:17px;height:17px;
  padding:0 4px;border-radius:9px;background:var(--danger);color:var(--on-brand);
  font-size:11px;font-weight:700;font-variant-numeric:tabular-nums}
@media screen and (max-width:640px){
  /* 좁으면 글자를 접고 아이콘만 — 줄이 길어져 헤더가 두 줄로 밀리는 것을 막는다 */
  .mbq-t{display:none}
  /* 좁으면 묶음을 왼쪽에 붙여 둔다 — auto를 남기면 한 줄을 통째로 차지해 헤더가 3줄이 된다 */
  .mb-right{margin-left:0;gap:6px}
}

/* ── KPW 핵심가치 배너 (2026-08-25 재설계 · 디자인팀 결정) ────────────────────────
   사용자 지시(2차): "핵심가치만 바탕이 파란색이라 안 어울린다. 로고는 빼라." →
   **흰 카드 + 왼쪽 골드 바 3px + 남색/골드잉크 글자**. 대시보드 카드 문법(.dash .card: 흰 면·그림자)과 같은 옷.
   ⚠ 골드 톱 룰은 쓰지 않는다 — 바로 아래 .stat-strip이 톱 룰을 쓰고 있어 "지표 줄이 하나 더"로 읽힌다.
   ⚠ 로고가 빠지면 다섯 낱말의 주어가 없어진다 → 캡션 "KPW 핵심가치 / CORE VALUES"가 주어를 맡는다.
   대비: 한글 --brand-ink 14.2:1 · 영문 --gold-ink 5.05:1 · 설명 --ink-soft 9.5:1 (모두 AA).
   ⚠ 설명(kb-d)은 한 줄로 자르되 **"…"가 남는 폭에서는 통째로 접는다**(1520px 아래 · 전문은 title).
   ⚠ 인쇄에는 안 나온다(대시보드 전용). */
.kpw-banner{
  display:flex;align-items:center;gap:clamp(14px,2vw,28px);
  padding:12px clamp(16px,2.2vw,24px);margin:0 0 16px;
  border-radius:var(--r-lg);overflow:hidden;
  background:var(--surface);border-left:3px solid var(--gold);
  box-shadow:0 1px 3px rgba(20,32,60,.05);
}
.kb-cap{flex:0 0 auto;display:flex;flex-direction:column;gap:1px;
  padding-right:clamp(12px,1.6vw,22px);border-right:1px solid var(--line)}
.kb-cap-ko{color:var(--brand-ink);font-size:var(--fs-body-sm);font-weight:800;letter-spacing:-.01em;white-space:nowrap}
.kb-cap-en{color:var(--gold-ink);font-size:var(--fs-2xs);font-weight:800;letter-spacing:.16em;white-space:nowrap}
/* 다섯 칸 — 색면 대신 세로 구분선으로 나눈다 */
.kb-list{flex:1 1 auto;display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:0;list-style:none;margin:0;padding:0;min-width:0}
.kb-v{display:flex;flex-direction:column;gap:1px;min-width:0;padding:0 clamp(10px,1.2vw,16px)}
.kb-v+.kb-v{border-left:1px solid var(--line-soft)}
.kb-ko{color:var(--brand-ink);font-size:var(--fs-sm);font-weight:700;letter-spacing:-.01em;white-space:nowrap}
.kb-en{color:var(--gold-ink);font-size:var(--fs-2xs);font-weight:700;letter-spacing:.06em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kb-d{color:var(--ink-soft);font-size:var(--fs-xs);letter-spacing:-.02em;line-height:1.35;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@media screen and (max-width:1520px){ .kb-d{display:none} }
@media screen and (max-width:900px){
  .kpw-banner{gap:12px;padding:10px 14px}
  .kb-cap-en{display:none}
  .kb-v{padding:0 8px}
  .kb-ko{font-size:var(--fs-body-sm)}
}
@media screen and (max-width:640px){
  .kpw-banner{flex-direction:column;align-items:stretch;gap:8px}
  .kb-cap{flex-direction:row;gap:8px;align-items:baseline;border-right:0;padding:0 0 6px;
    border-bottom:1px solid var(--line-soft)}
  .kb-cap-en{display:inline}
  .kb-list{grid-template-columns:repeat(auto-fit,minmax(84px,1fr));gap:4px 0}
  .kb-v+.kb-v{border-left:0}
  .kb-en{display:none}
}
@media print{ .kpw-banner{display:none} }

/* 사이드바 맨 위 바로가기 묶음 (2026-08-24 2차 지시로 최상단 이동)
   ⚠ 아래 '회사 업무·고객 관리…' 묶음과 **성격이 다르다**(펼침 없이 바로 가는 곳) —
     밑선 하나로 경계를 준다. 색이나 굵기로 강조하지는 않는다(메뉴가 더 시끄러워진다). */
.side-quick{padding-bottom:8px;margin-bottom:4px;border-bottom:1px solid var(--line)}

/* ── 대시보드 지표 카드 (2026-08-25 사용자 지시) ─────────────────────────────
   지시: "내담당고객·7일내상담예정·진행중상담이 왜 갑자기 세로가 됐지?
          어제 작업했던 것처럼 **일렬로 길게** 늘려주고 **칸도 원상복귀**해줘."
   🔴 세로로 보인 진짜 원인 — 이 묶음이 대시보드 **왼쪽 열(.dash-main ≈ 화면의 62%)** 안에
      들어 있었다. 1366px 노트북이면 왼쪽 열이 약 660px이라 칸당 130px밖에 안 나오고,
      좁은 화면·확대 배율에서는 999px 분기에 걸려 2칸 → 1칸으로 접혀 **세로로 쌓였다**.
      → 이제 이 묶음은 좌우 2단 **바깥**, 화면 전체 폭에 놓는다(dashboard.html).
        같은 1366px에서 칸당 250px 이상 — "일렬로 길게"가 실제로 성립한다.
   🔴 "칸도 원상복귀" — 08-24에 다섯을 하나로 합쳤던 띠(gap:1px 한 장짜리 바)를 풀고
      **각자 테두리·둥근모서리·그림자를 가진 카드 5장**으로 되돌린다(그 이전 모습).
   ⚠ `minmax(0,1fr)`은 유지한다 — 기본값 auto면 긴 값(1,234.5억·9,999명)이 칸을 밀어내
     한 줄이 가로로 넘친다(카드로 되돌려도 이 위험은 그대로다).
   ⚠ 접힘 경계는 카드 폭 기준으로 다시 잡았다 — 전체 폭을 쓰므로 예전 999px보다 훨씬 늦게 접힌다.
   ⚠ 인쇄에는 안 나온다 · 미디어쿼리는 전부 `screen` 한정(A8 규칙). */
.stat-strip{
  display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:12px;margin-bottom:0;
}
/* 카드 모양은 전역 .stat이 이미 갖고 있다(테두리·둥근모서리·그림자·hover).
   여기서는 **다섯 칸을 하나로 읽히게 하는 표식**만 얹는다 — 금색 톱 룰. */
.stat-strip .stat{border-top:3px solid var(--gold);min-width:0;padding:10px 14px}
/* ⚠ 라벨은 줄바꿈을 막는다 — '7일 내 상담 예정'이 두 줄이 되면 그 칸만 키가 커져
     다섯 장의 밑선이 어긋난다(2026-08-24 디자인팀 지적 · 카드로 돌아와도 같다). */
.stat-strip .s-label{font-size:12px;font-weight:700;color:var(--muted);opacity:1;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stat-strip .s-value{
  font-size:clamp(20px,1.6vw,24px);
  color:var(--brand-ink);white-space:nowrap;font-variant-numeric:tabular-nums;
}
.stat-strip .s-value .u{font-size:13px;font-weight:600;color:var(--muted);opacity:1}
/* 힌트는 한 줄로 말줄임 — 단계 나열처럼 긴 줄이 칸 키를 늘리지 않게(전문은 title에 있다) */
.stat-strip .s-hint{color:var(--muted);opacity:1;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 🟡 디자인 QA(2026-08-24) — 금색 링크는 흰 바탕에서 대비 3.33:1로 **AA 미달**이었다.
   11.5px 본문 크기라 '큰 글자 3:1' 예외에도 해당되지 않는다. 남색 + 밑줄로 남긴다. */
.stat-strip .s-hint a{color:var(--brand);text-decoration:underline}

/* 전체 폭을 쓰므로 다섯 칸은 1100px까지 버틴다(칸당 약 200px).
   ⚠ 5는 홀수라 2칸으로 접히면 마지막 칸이 혼자 남는다 → 전체폭으로 늘려 빈 자리를 없앤다. */
@media screen and (max-width:1100px){
  .stat-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media screen and (max-width:820px){
  .stat-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .stat-strip > .stat:last-child{grid-column:1/-1}
}
@media screen and (max-width:560px){
  .stat-strip{grid-template-columns:minmax(0,1fr)}
  /* 세로로 다섯 개가 쌓이면 첫 화면을 통째로 잡아먹는다 → 라벨 왼쪽 · 값 오른쪽 가로형으로.
     ⚠ `minmax(0,1fr)`이어야 한다 — 1fr의 최소폭 기본값은 auto(내용 최소폭)라
       라벨이 길어지면 줄어들지 않고 카드가 옆으로 밀려 가로 스크롤이 생긴다. */
  .stat-strip .stat{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;
    column-gap:var(--sp-2);padding:12px 16px}
  .stat-strip .s-value{grid-row:1;grid-column:2;margin-top:0;font-size:19px}
  .stat-strip .s-hint{grid-column:1/-1;margin-top:2px}
}
@media print{ .stat-strip{display:none} }

/* ── 대시보드 상단 2단 (2026-08-25 사용자 2차 지시): 회사 게시판(좌, 크게) | 오늘·이번 주(우) ──
   "게시판은 우측 하단에 작게가 아니라 검색 밑에 크게, 알림 위에. 오른쪽에는 오늘/이번 주 알림 내용."
   ⚠ 비율은 .dash-cols와 **같은 값**(1.62:.94)이어야 한다 — 다르면 위·아래 세로 이음선이 두 줄로 어긋난다.
   ⚠ stretch + min-height 280px — 공지 0·자료 0이어도 "크게"가 성립하고 두 카드 밑선이 맞는다.
   ⚠ 게시판 안은 공지 | 자료 **좌우 2열** — 상하로 쌓으면 높이가 두 목록의 합(≈600px)이 되어 오른쪽 카드가 텅 빈다. */
.dash-top{display:grid;grid-template-columns:minmax(0,1.62fr) minmax(0,.94fr);gap:12px;align-items:stretch}
/* 7차 지시(2026-08-25): 게시판·오늘/이번 주 높이를 **절반**으로 — 아래 내용이 자연스럽게 올라온다 */
.dash-top>.card{display:flex;flex-direction:column;min-height:120px;margin:0;min-width:0}
.bd-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:0 24px;flex:1;min-height:0;margin-top:6px}
.bd-col{min-width:0;display:flex;flex-direction:column}
.bd-col .bd-sec{margin-top:0}
.bd-notices{max-height:248px;overflow:auto;overscroll-behavior:contain}
/* 4차: 게시판이 공통자료만 담는다(공지 제거) → 카드 안 목록 상한을 조금 올린다 */
.dash-top .bd-files{max-height:150px}
.bd-col .empty{flex:1;display:grid;place-items:center;padding:12px 8px}
.bd-grid .bd-kb{display:none}                    /* 2열 모드에서는 용량 열을 감춘다(파일명 자리) */
.dt-scroll{max-height:150px;overflow:auto;overscroll-behavior:contain}
.dt-foot{margin-top:auto;padding-top:8px}
/* 통합 목록 한 줄(3차): [종류 칩] 제목 … [바로가기] [×] — 날짜 머리글 아래 60px 들여쓰기 */
.dt-row{display:flex;flex-wrap:wrap;gap:6px 8px;align-items:center;font-size:13.5px;padding:2px 0 2px 60px}
.dt-row .dt-t{flex:1 1 auto;min-width:0}
.dt-row .nb-off{display:inline;margin:0}
@media screen and (max-width:640px){ .dt-row{padding-left:0} }
/* 할 일 카드 — 오른쪽 좁은 열용 압축 배치(5차): 제안 한 건 = 두 줄(누구·무엇 / 이유·버튼) */
.todo-row{padding:7px 0;border-top:1px solid var(--line-soft);font-size:13px}
.todo-row:first-child{border-top:0}
.todo-row .tr-h{display:flex;gap:6px;align-items:baseline;flex-wrap:wrap}
.todo-row .tr-a{display:flex;gap:6px;align-items:center;justify-content:flex-end;flex-wrap:wrap;margin-top:4px}
.todo-row .hint{margin:2px 0 0}
/* 빈 상태 — 옆 게시판 카드의 .empty와 같은 자리감(가운데) */
.dt-scroll .empty-inline{margin:0;padding:12px 8px;text-align:center}
/* 고객 인적사항 표(관리자 9열) — 1300px 부근에서 auto 레이아웃이 이름 셀을 "홍길/동"으로 쪼갰다(디자인 QA 실측).
   좁아지면 줄바꿈이 아니라 .table-scroll의 가로 스크롤로 넘어가야 한다. */
.dash-main .table-scroll table{min-width:680px}
.dash-main .table-scroll.dash-cli table{min-width:520px}   /* 2026-08-26 열 8→5(생년·직업·연락처 제거) */   /* 760이면 1440px에서도 늘 스크롤(왼쪽 열 표 폭 ≈ 696px) */
@media screen and (max-width:1300px){
  .bd-grid{grid-template-columns:minmax(0,1fr)}
  .bd-col+.bd-col{margin-top:12px}
  .bd-notices,.bd-files{max-height:180px}
  .bd-grid .bd-kb{display:table-cell}
}
@media screen and (max-width:1100px){
  .dash-top{grid-template-columns:minmax(0,1fr)}
  .dash-top>.card{min-height:0}
  .dt-scroll{max-height:none}
}
@media print{ .dash-top{display:block} .dt-scroll,.bd-notices,.bd-files{max-height:none;overflow:visible} }

/* ── 대시보드 회사 게시판 (2026-08-25 사용자 지시) ───────────────────────────
   공지(글)와 공유자료(파일)를 한 카드에서 본다 — 회사에서 온 것을 한 자리에서.
   ⚠ 두 묶음을 가르는 것은 색이 아니라 **작은 머리글**이다(카드 안에 카드를 또 만들지 않는다). */
.bd-sec{display:flex;align-items:baseline;gap:6px;
  font-size:12px;font-weight:800;color:var(--muted);letter-spacing:.02em;
  padding-bottom:5px;margin-bottom:4px;border-bottom:1px solid var(--line-soft)}
/* 🔴 "여기서 **다** 볼 수 있게"(사용자 지시)라 파일을 전부 싣는다 —
     다만 자료가 수십 개가 되면 카드가 첫 화면을 통째로 잡아먹는다.
     → 상자 안에서만 세로로 스크롤시킨다(카드 높이는 고정, 목록은 전부 살아 있다).
   ⚠ 가로도 함께 열어 둔다 — 파일명이 길면 표가 카드를 넘어 **페이지 전체**가 가로로 스크롤된다. */
.bd-files{max-height:248px;overflow:auto;overscroll-behavior:contain}
.bd-files table{margin:0}
.bd-files td{padding:5px 6px;font-size:12.5px;vertical-align:middle}
/* 파일명은 한 줄로 자른다 — 두 줄이 되면 줄 높이가 제각각이라 목록이 울퉁불퉁해진다(전문은 title에) */
.bd-files .lib-name{display:inline-block;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}

/* 휴지통 아이콘 버튼 (2026-08-25 사용자 지시로 '삭제' 글자를 대신한다)
   ⚠ 글자가 사라져도 **누르기 쉬워야** 한다 — 폭을 32px로 못 박아 손가락 과녁을 지킨다
     (글자 버튼과 높이를 맞춰야 표의 밑선이 어긋나지 않는다).
   ⚠ 이름은 title·aria-label이 진다(HTML) — 여기서는 모양만 다룬다. */
.btn.ic-del{padding:0;min-width:32px;width:32px;height:30px;
  display:inline-flex;align-items:center;justify-content:center;font-size:14px;line-height:1}

/* 재무상태표 아래 '참고 · 퇴직급여' 상자 (2026-08-25 사용자 지시)
   ⚠ 표와 **다르게** 보여야 한다 — 합계에 안 들어가는 금액이라, 같은 표처럼 보이면
     "왜 더해도 총자산이 안 맞지"가 난다. 바탕을 깔고 점선으로 갈라 둔다. */
.bs-ref{border:1px dashed var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);padding:8px 12px}
.bs-ref-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  font-size:12.5px;font-weight:800;color:var(--muted);margin-bottom:2px}
.bs-ref-h .num{margin-left:auto;color:var(--ink)}
.bs-ref-tag{font-size:11px;font-weight:600}
/* 항목은 표가 아니라 **한 줄에 흐르는 칩**이다 — 많아야 셋(DB·DC·기초자료)이라 표까지 갈 일이 없고,
   인쇄에서 세로 공간을 아낀다(A4 한 장 규격). */
.bs-ref-rows{display:flex;flex-wrap:wrap;gap:4px 16px;font-size:12.5px}
.bs-ref-rows .num{font-weight:700}
/* 인쇄 — 상자를 통째로 뺀다. 1차 리포트 03면은 A4 한 장이 꽉 차 있어 두 줄(≈56px)도 넘쳤다
   (smoke_t12 인쇄 검사). 인쇄에서는 표 안의 퇴직연금(DB/DC) 행에 흐리게 적힌 "참고 N"이 뜻을 진다. */
@media print{ .bs-ref{display:none} }

/* ── 절세계좌 4총사 — 시뮬레이션 조건·선택 (2026-08-25 사용자 지시) ────────────
   ⚠ 입력칸은 auto-fit으로 흐르게 둔다 — 칸을 고정하면 좁은 화면에서 라벨이 잘린다. */
.sim-in{display:grid;grid-template-columns:repeat(auto-fit,minmax(196px,1fr));
  gap:var(--sp-3);align-items:end;margin-top:var(--sp-3)}
.sim-in label{display:flex;flex-direction:column;gap:4px;margin:0;
  font-size:12px;font-weight:700;color:var(--muted)}
.sim-in input,.sim-in select{width:100%}
/* 견줄 계좌 고르기 — 칩처럼 보이게 두되 **진짜 체크박스**를 남긴다
   (그림만 바꾸면 키보드·스크린리더가 못 쓴다). */
.sim-pick{border:1px solid var(--line);border-radius:var(--r-sm);
  padding:8px 12px 10px;background:var(--surface-2)}
.sim-pick legend{font-size:12px;font-weight:800;color:var(--muted);padding:0 4px}
.sim-chk{display:inline-flex;align-items:center;gap:6px;margin:0 14px 0 0;
  font-size:13px;font-weight:600;color:var(--ink);cursor:pointer;white-space:nowrap}
/* 결과표에서 가장 유리한 열 — 색만으로 알리지 않는다(맨 아래 문장이 이름을 말한다) */
.sim-out .sim-best{background:rgba(200,162,74,.14)}
.sim-out td{font-variant-numeric:tabular-nums}
/* ⚠ .tax-cmp가 td를 왼쪽 정렬로 못 박아 두었다(설명 문장용) — 금액 칸만 되돌린다.
     가로로 견주는 표라 자릿수가 안 맞으면 큰 수·작은 수를 눈으로 못 가른다. */
.sim-out td.num{text-align:right}
@media screen and (max-width:560px){ .sim-chk{margin-bottom:6px} }

/* ── 위험·보장: 13 대분류 × 세부담보 진단 (2026-08-27) ──────────────────────
   d13- 접두사로 전역 충돌을 막는다. 색·크기는 전부 토큰 — 임의 hex 금지. */
/* miss = '미가입(필수 아님)' 신설 배지 — 채운 danger와 구분되는 **빨간 외곽선** 톤.
   필수 공백(danger)보다 한 급 아래라는 뜻을 색 채도가 아니라 채움/테두리로 가른다. */
.badge.miss{background:var(--surface);color:var(--danger);border-color:var(--danger)}
/* 피보험자 탭 — 아래 숫자의 주어. .subchips .chip과 같은 문법(알약형)로 통일 */
.d13-tabs{display:flex;gap:6px;flex-wrap:wrap;margin:12px 0 2px}
.d13-tab{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;
  border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface);
  font-size:var(--fs-cap);font-weight:700;color:var(--ink-soft);text-decoration:none;line-height:1.3}
a.d13-tab:hover{background:var(--navy-soft);color:var(--brand-ink);text-decoration:none}
.d13-tab.on{background:var(--brand);border-color:var(--brand);color:var(--on-brand)}
.d13-tab.on .badge{background:rgba(255,255,255,.22);color:var(--on-brand);border-color:transparent}
.d13-tab .badge{padding:1px 8px;font-size:var(--fs-2xs)}
/* 요약 줄 + 13 대분류 칩 */
.d13-counts{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-top:10px}
.d13-chips{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
.d13-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;
  border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface);
  font-size:var(--fs-cap);font-weight:700;color:var(--ink-soft);text-decoration:none;line-height:1.3}
a.d13-chip:hover{background:var(--navy-soft);color:var(--brand-ink);text-decoration:none}
.d13-chip .badge{padding:1px 7px;font-size:var(--fs-2xs)}
.d13-chip.off{opacity:.5}                 /* 필터 보기에서 항목이 없는 그룹 — 이동할 곳이 없다 */
/* 그룹 제목(앵커 착지점) + 세부담보 한 줄 */
.d13-grp-t{margin:18px 0 4px;font-size:var(--fs-sm);font-weight:800;color:var(--brand-ink);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.d13-sub{border:1px solid var(--line);border-radius:10px;margin-top:6px;background:var(--surface)}
.d13-row{display:flex;align-items:center;gap:6px 10px;flex-wrap:wrap;padding:8px 12px;
  font-size:var(--fs-body-sm)}
details.d13-sub>summary{border:0;border-radius:10px;background:var(--surface-2)}
details.d13-sub[open]>summary{border-bottom:1px solid var(--line-soft);border-radius:10px 10px 0 0}
.d13-name{font-weight:700;color:var(--brand-ink);min-width:0}
.d13-amts{display:flex;gap:4px 14px;flex-wrap:wrap;margin-left:auto;
  font-size:var(--fs-cap);color:var(--muted);font-variant-numeric:tabular-nums}
.d13-amts b{color:var(--ink)}
.d13-gap{color:var(--danger);font-weight:800;font-size:var(--fs-cap);white-space:nowrap}
.d13-body{padding:9px 12px}
.d13-body table{font-size:var(--fs-cap)}
@media screen and (max-width:520px){
  /* 320~430px: 금액 묶음을 다음 줄로 내려 라벨·배지와 겹치지 않게 — 가로 스크롤 금지 */
  .d13-amts{margin-left:0;width:100%;justify-content:flex-start}
}

/* 권장금액 조정 폼(2026-08-27) — 권장은 전부 [가정]이라 이 고객만의 사정은 설계사가 적는다.
   ⚠ .fp-only라 프레젠테이션(고객 앞) 모드에서는 보이지 않는다. */
.d13-fix{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;margin-top:10px;
  padding-top:9px;border-top:1px dashed var(--line)}
.d13-fix label{display:flex;flex-direction:column;gap:3px;margin:0}
.d13-fix input{min-height:34px}
.d13-fix .hint{flex:1 1 100%;margin:0}
@media print{.d13-fix{display:none}}

/* ── 📱 대시보드 고객 카드형(2026-08-27 · 사용자 영상 지시) ─────────────────────────
   "모바일에서 가로로 길게 늘리는 건 없애라" — 표를 옆으로 밀어야 보이던 것을 카드로 바꾼다.
   기본은 카드 숨김이라 **PC와 인쇄물은 지금 표 그대로**다(자산현황 카드형과 같은 방식). */
.cli-cards{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .dash-cli{display:none}                     /* 표(가로 스크롤)를 통째로 접는다 */
  .cli-cards{display:flex;flex-direction:column;gap:8px;margin-top:10px}
  /* 카드 전체가 링크 — 손가락으로는 줄 전체를 누르는 것이 자연스럽다(셀 링크는 PC 관행) */
  .clic{display:flex;gap:10px;justify-content:space-between;align-items:flex-start;
    background:var(--surface);border:1px solid var(--line);border-radius:12px;
    padding:11px 13px;text-decoration:none;color:inherit;-webkit-tap-highlight-color:transparent}
  .clic:hover,.clic:focus-visible{text-decoration:none;border-color:var(--brand)}
  .clic:active{transform:scale(.99)}
  .clic-l{min-width:0;flex:1 1 auto}
  .clic-r{flex:0 0 auto;text-align:right;color:var(--muted);font-size:var(--fs-cap)}
  .clic-r b{display:block;font-size:var(--fs-md);color:var(--brand-ink);
    font-variant-numeric:tabular-nums;line-height:1.2}
  /* ⚠ body의 word-break:keep-all은 공백 없는 긴 회사명을 못 꺾는다 → anywhere로 넘침을 막는다 */
  .clic-name{font-size:var(--fs-sm);font-weight:700;color:var(--ink);overflow-wrap:anywhere}
  .clic-meta{font-size:var(--fs-note);color:var(--muted);margin-top:2px;overflow-wrap:anywhere}
  .clic-badges{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin-top:7px}
}
@media print{.cli-cards{display:none!important}}

/* 설계사별 담당 현황 — 모바일 카드형(2026-08-27) */
.fps-cards{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .dash-fps{display:none}                     /* 표(가로 스크롤)는 접고 카드로 본다 */
  .fps-cards{display:flex;flex-direction:column;gap:7px;margin-top:8px}
  .fpsc{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:baseline;
    background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:9px 12px}
  .fpsc-name{flex:1 1 100%;font-size:var(--fs-sm);color:var(--ink)}
  .fpsc-kv{font-size:var(--fs-cap);color:var(--muted)}
  .fpsc-kv b{color:var(--ink);font-variant-numeric:tabular-nums;margin-left:2px}

  /* ── 옆으로 밀어야 하는 표(연도축·계좌 비교처럼 **가로가 본질인 표**) ──────────────
     카드로 쪼개면 비교 자체가 깨지므로 가로 스크롤을 남긴다. 대신 두 가지를 준다:
       ① 오른쪽 가장자리 그라데이션 — "여기서 잘렸다"가 눈에 보인다(잘린 줄 모르는 것이 문제였다)
       ② 첫 열 고정 — 옆으로 밀어도 '무엇의 값인지'를 잃지 않는다
     ⚠ 표가 실제로 넘칠 때만 그림자가 보이도록 background-attachment 기법을 쓴다. */
  .table-scroll{
    background:
      linear-gradient(to right, var(--m-glass-fb) 30%, transparent) left / 24px 100% no-repeat,
      linear-gradient(to left, var(--m-glass-fb) 30%, transparent) right / 24px 100% no-repeat,
      radial-gradient(farthest-side at 0 50%, var(--m-line), transparent) left / 12px 100% no-repeat,
      radial-gradient(farthest-side at 100% 50%, var(--m-line), transparent) right / 12px 100% no-repeat;
    background-attachment:local, local, scroll, scroll}
  .table-scroll table th:first-child,
  .table-scroll table td:first-child{position:sticky;left:0;background:var(--m-glass-fb);z-index:1}
  .table-scroll table tr:first-child th:first-child{z-index:2}
}

/* ── 📱 모바일 상단 바 압축(2026-08-27 · 사용자 지시 "상단 디자인 UI/UX 개선") ────────
   UI디자이너·UX 두 팀 감수안(A안 — 한 줄 유틸리티 바). 실측 122px → 약 57px(-53%).
   ⚠ 판정 조건은 '모바일 판정' 블록과 **글자까지 같아야 한다** — 다른 폭으로 가르면
     확대해 쓰는 PC가 메뉴를 잃는 사고(2026-08-26 저녁)가 재발한다.
   ⚠ 이 블록은 **파일 끝**에 있어야 한다 — .mb-right(≤640px)·.mbq와 같은 특이도를
     '순서'로 이긴다. 위로 옮기면 조용히 무력화된다.
   ⚠ 세션 타이머는 **지우지 않는다** — 저장 전에 잠기는 것을 막는 장치다(2026-08-12 지시).
     테두리·배경만 걷어 글자 칩으로 낮추고, 5분·1분 전 경고색은 기존 규칙이 그대로 산다. */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .mainbar{gap:var(--sp-2) var(--sp-3);padding:var(--sp-2) var(--sp-4)}
  .mb-left{flex:0 1 auto;min-width:0}
  .mb-title{font-size:var(--fs-cap);letter-spacing:.04em;white-space:nowrap}
  /* 접힌 머리가 제목을 오히려 '키우는' 역전을 막는다(같은 특이도 → 후순위 승) */
  body.mainbar-slim .mainbar .mb-title{font-size:var(--fs-cap)}
  /* 부제는 접는다 — 인사말은 대시보드 본문과 중복이고, 보안·암호화 안내는 푸터가 유지한다.
     매 화면 반복되는 정적 문구는 며칠이면 읽히지 않는다(UX 감수). */
  .mb-sub{display:none}
  /* 🔴 nowrap을 넣지 않는다 — 원래 wrap이었던 데는 이유가 있다(424행 주석):
     "아주 좁은 화면에서 통째로 못 접히면 헤더가 가로로 넘친다".
     게다가 이 조건에서 `.shell{overflow-x:clip}`이라 넘친 아이콘은 **스크롤도 안 되고 사라진다** —
     공지·알림·증시로 갈 길이 끊긴다(디자인QA 적발). 320px에서는 두 줄로 자연히 내려가게 둔다. */
  .mb-right{margin-left:auto;gap:var(--sp-2)}
  .mb-tools{gap:var(--sp-1)}
  .mb-tools>.lock-left:not([hidden]){display:inline-flex}   /* 모바일에서만 보인다(PC는 전역 display:none) · hidden은 그대로 숨김 */
  .mb-tools>.lock-left{padding:var(--sp-1) var(--sp-2);border:0;background:transparent;
    font-size:var(--fs-xs);min-height:40px}
  .mb-present{display:none}                                 /* 모바일에서는 상담화면 버튼 없음(2026-08-28 사용자) — 판정 안에서만 */
  /* 상담화면 — 아이콘만(이름은 aria-label이 고정한다). .btn.sm을 이기려면 세 클래스가 필요하다 */
  .mb-present .mbp-t{display:none}
  .mb-present>.btn.sm{min-height:40px;min-width:40px;padding:0 var(--sp-2);justify-content:center}
  /* 공지·알림·증시 — 테두리 칩 → 아이콘 버튼 */
  .mbq-t{display:none}
  .mbq{min-height:40px;min-width:40px;justify-content:center;padding:0;border:0;background:transparent}
  .mbq svg{width:18px;height:18px}
  .mbq.on{background:var(--m-acc);color:var(--m-acc-ink);border-radius:var(--r-pill)}
  /* 안 읽은 건수는 아이콘 모서리에 겹쳐 올린다(자리를 안 먹는다) */
  .mbq-n{position:absolute;top:1px;right:1px;min-width:15px;height:15px;font-size:var(--fs-2xs)}
  body.mainbar-slim .mainbar{padding-top:var(--sp-1);padding-bottom:var(--sp-1)}
}

/* ── 📣 로그인 화면 안내 팝업(2026-08-27) — 로그인 전에 알려야 하는 것 ─────────────
   ⚠ JS 없이 동작한다(CSP가 인라인 스크립트를 막는다) — 숨긴 체크박스가 켜지면 사라진다.
   ⚠ 로그인 화면은 공개 페이지다. 여기 들어갈 문구는 관리자 화면에서 관리한다. */
.ln-state:checked ~ .ln-host{display:none}
.ln-host{position:fixed;inset:0;z-index:95;display:flex;align-items:center;justify-content:center;
  padding:var(--sp-4)}
.ln-veil{position:absolute;inset:0;background:rgba(16,26,48,.55);cursor:pointer;margin:0}
.ln-box{position:relative;max-width:420px;width:100%;background:var(--surface);
  border-radius:var(--r-lg);padding:var(--sp-6);box-shadow:var(--sh-3);
  border-top:4px solid var(--gold)}
.ln-t{margin:0 0 var(--sp-3);font-size:var(--fs-lg);color:var(--brand-ink)}
.ln-b{margin:0 0 var(--sp-5);color:var(--ink);white-space:pre-line;line-height:1.65}
.ln-ok{display:block;text-align:center;margin:0;cursor:pointer;text-decoration:none}
/* '이번만 닫기'(2026-09-04) — 기록을 남기지 않는 부차 동작이라 텍스트 등급으로 낮춘다.
   주 동작([확인했습니다] 링크)과 위계를 분명히 벌려 둔다. */
.ln-later{display:block;text-align:center;margin:var(--sp-3) 0 0;cursor:pointer;
  font-size:var(--fs-sm);color:var(--muted)}
.ln-later:hover{color:var(--ink)}
@media print{.ln-host{display:none}}

/* ── 🚨 긴급 안내 배너(2026-08-27) — 지금 일하는 사람에게 곧바로 닿아야 하는 것 ────────
   ⚠ 화면 맨 위에 붙인다(사이드바보다 위) — 놓치면 뜻이 없다.
   ⚠ .fp-only라 고객 앞(프레젠테이션)에서는 안 보인다 · @media print에서도 빠진다. */
.urgent-bar{position:sticky;top:0;z-index:99;display:flex;align-items:center;gap:var(--sp-2);
  padding:var(--sp-3) var(--sp-4);background:var(--danger);color:var(--on-brand);
  font-size:var(--fs-body-sm);font-weight:700;line-height:1.5}
.urgent-bar[hidden]{display:none}
.urgent-ico{font-size:1.1em}
@media print{.urgent-bar{display:none!important}}


/* ═══ PC 디자인 1단계 전역 신설(2026-08-29 · 계획서 검수결과/구현계획_PC디자인_20260828.md §1-A·§1-G) ═══
   :root 신설 토큰 3(아무도 참조하지 않던 이름 → 새는 곳 없음) + .fchip(새 이름 · 모바일에서도 알약으로 보이게 기본 규칙). 그 외 전역은 손대지 않는다. */
:root{--fs-display:28px;--gap:24px;--line-strong:#cfd6e4}
.fchips{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.fchip{display:inline-flex;align-items:center;gap:4px;min-height:28px;padding:0 12px;border:1px solid var(--line);border-radius:999px;
  background:var(--surface);color:var(--ink-soft);font-size:12.5px;font-weight:600;text-decoration:none;white-space:nowrap}
.fchip:hover{text-decoration:none;color:var(--ink);border-color:var(--line-strong,#cfd6e4)}
.fchip.on{background:var(--navy-soft);color:var(--brand);border-color:var(--brand)}
.fchip-sep{width:1px;height:18px;background:var(--line);margin:0 4px}
/* 2단계 전역 신설(새 이름 · 새는 곳 없음): 우측 패널은 기본 숨김([P1] 1440px+에서만) · 대시보드 상태 카드 클래스(인라인 4px 바 대체 · 모바일·인쇄는 이 값) */
.cd-panel{display:none}
.card.dangerline{border-left:4px solid var(--danger)}
.cd-rail,.tb-dense,.present-only{display:none}
/* 고객 목록 행 펼침(2026-08-29 · 새 이름 · 모바일에서도 동작) — 기본은 hidden 속성(UA display:none) */
.cli-table{width:100%}
.cli-table td.two b{display:block}                        /* 모바일에서도 이름/회사 두 줄(P1 밖 폭 대비 · 이름·회사가 한 줄로 붙던 문제) */
.cli-table td.two span{display:block;font-size:12px;color:var(--muted)}
.crow-detail>td{background:var(--surface-2)}
.crd{display:flex;flex-wrap:wrap;gap:8px 22px;align-items:center;padding:4px 2px}
.crd-kv{display:inline-flex;gap:6px;align-items:baseline;font-size:12.5px}
.crd-kv>span{color:var(--muted)}
.crd-kv>b{color:var(--ink);font-variant-numeric:tabular-nums}
.crd-act{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap;margin-left:auto}
/* 펼침 행은 hidden 속성 + .noprint — @media print 블록 무변경(스모크 md5) */
body.present .present-only{display:inline}

/* [P1] ═══ PC 디자인 1단계(2026-08-29 · 계획서 검수결과/구현계획_PC디자인_20260828.md · 시안 PC시안_3안 §6 · A 목업) ═══
   **모바일 판정의 정확한 여집합**: 모바일 = (w≤820) ∨ (coarse ∧ w≤1100) → 여집합 = (w≥1101) ∨ (w≥821 ∧ fine).
   ⚠ `not (pointer:coarse)` 대신 `(pointer:fine)`(구형 크롬 호환 · 리드 결정 Q4) — 포인터 없는 기기(pointer:none · 821~1100px)는
     어느 블록도 안 맞아 현행 화면을 본다(무해). 이 블록 밖(전역·모바일·인쇄)은 건드리지 않는다 →
     모바일·인쇄 무변경이 **구조로** 성립(인쇄는 screen이 아니라 자동 제외). smoke_pcdesign.py가 판정 블록 md5·print md5를 고정한다.
   골드는 3곳만 남긴다: ① .side-nav a.active/.side-sub-flat.active 좌 3px 바 ② 오늘(table.cal td.today 1px inset · .dtg-h .badge.gold 8px 점) ③ 2단계 패널 헤어라인 자리.
   리포트·제안서 계열(.rc*·.sec-no·.toc-no·.fpg-*·.ips-table·.ex-tag) 20여 규칙은 1.5단계(인쇄 담당)로 분리 — 여기 없음.
   body 14px는 보류(리드 결정 Q2 · 현행 15 유지). */
@media screen and (min-width:1101px), screen and (min-width:821px) and (pointer:fine){
  /* ── 토큰 보정(모바일은 브리지가 --m-*로 덮으므로 여기서만) ── */
  :root{--ring:0 0 0 3px var(--navy-soft);--r-sm:8px;--side-active:#fff}
  :focus-visible{outline-color:var(--brand-2)}
  ::selection{background:var(--navy-soft)}
  /* ── 셸: 사이드바 단색 · 활성은 좌 3px 골드 바만(골드 ①) · 상단바 핵심가치 띠 골드 제거 ── */
  .sidebar{background:var(--brand-strong);border-right:1px solid rgba(255,255,255,.06);box-shadow:none}
  .side-nav a.active{color:#fff;background:rgba(255,255,255,.08);box-shadow:inset 3px 0 0 var(--gold)}
  .side-sub-flat.active{background:rgba(255,255,255,.08)}
  .side-cname.active{color:#fff}
  .rtoc .rtoc-edit{color:var(--side-hover-2)}
  .side-user .su-role{color:var(--side-label)}
  .mb-values{border-left-color:var(--line);box-shadow:none}
  .mv-cap small,.mv-en{color:var(--ink-soft)}
  .mainbar{box-shadow:none}
  .present-bar{background:var(--navy-soft);border:1px solid #d5dcea;color:var(--brand-ink)}
  /* ── 카드 평면화(그림자 0 · --line 테두리 · 반경 --r) · 컬러 바 제거 ── */
  .card{border:1px solid var(--line);border-radius:var(--r);box-shadow:none}
  .dash .card{border:1px solid var(--line);box-shadow:none}
  .card.accent{border-left:1px solid var(--line)}
  .card.warnline,.dash .card.warnline{border:1px solid var(--warn-line)}
  .tipline{border-left-color:var(--line)}
  .kpi{background:var(--surface);box-shadow:none;transition:none}
  .kpi::before{content:none}
  .kpi:hover{transform:none;box-shadow:none}
  .kpi .n{font-size:var(--fs-display);font-weight:600;letter-spacing:-.01em}
  .kpi .l{font-size:12px;font-weight:500;color:var(--ink-soft)}
  .kpi .n.neg{color:var(--danger)}
  details.kpi-details[open]{box-shadow:none;border-color:var(--brand)}
  .gauge-tile,.risk-card,.gauge-line,.rs-item{background:var(--surface-2)}
  .auth-wrap .card{border-radius:var(--r);border-top-color:var(--brand)}
  .stat,.pol-card,.pipe-card,.mkt-card{box-shadow:none}
  .stat:hover,.mkt-card:hover{transform:none;box-shadow:none}
  .pol-card:hover{border-color:var(--line-strong);box-shadow:none}
  .kk-pick:hover{border-color:var(--line-strong)}
  .notice-bar{border-left-color:var(--line);box-shadow:none}
  .nb-title svg{color:var(--brand-2)}
  /* ── 표 규칙 7: 행 40 · 세로선 없음 · 흰 머리(12/600/--ink-soft) · 숫자 우측 · 첫 열 이름 --brand · hover · 빈 셀 ── */
  th,td{padding:11px 12px}
  th{background:var(--surface);color:var(--ink-soft);font-size:12px;font-weight:600;letter-spacing:0;border-bottom:1px solid var(--line)}
  th:first-child,th:last-child{border-radius:0}
  th.rowhead{background:transparent;font-size:var(--fs-sm)}
  td > a.cell-link{margin:-11px -12px;padding:11px 12px}
  td > a.cell-link b{color:var(--brand)}
  tbody tr:hover td{background:var(--surface-2)}
  tr.rowlink:hover > td{background:var(--navy-soft)}
  tr.rowlink:hover > td:first-child{box-shadow:inset 3px 0 0 var(--brand)}
  tr.sumrow td{background:var(--surface-2);border-top:2px solid var(--brand);color:var(--ink)}
  td.empty-cell{padding:12px;font-size:13px}
  /* 2줄 셀(고객 목록 실명/회사 · 연락처/직업) · 회사 빈값은 — (D3) */
  td.two{padding:8px 12px}
  td.two > a.cell-link{margin:-8px -12px;padding:8px 12px}
  .two b{display:block;color:var(--brand);line-height:1.3}
  .two span{display:block;font-size:12px;color:var(--ink-soft);line-height:1.3;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .two span:empty::before{content:"—"}
  /* ── 대시보드 KPI 3단(라벨 12/500 · 값 28/600 --ink · 힌트 12) · 골드 톱 룰 삭제 · 칸 전체 링크 + 힌트 링크는 위층 ── */
  .stat-strip{gap:16px}
  .stat-strip .stat{border:1px solid var(--line);border-top:1px solid var(--line);border-radius:var(--r);padding:18px 20px;min-height:108px;box-shadow:none}
  .stat-strip .stat:hover{transform:none;box-shadow:none}
  .stat-strip .s-label{font-size:12px;font-weight:500;color:var(--ink-soft)}
  .stat-strip .s-value{font-size:var(--fs-display);font-weight:600;color:var(--ink)}
  .stat-strip .s-value .u{font-size:14px;color:var(--ink-soft)}
  .stat-strip .s-hint{font-size:12px;color:var(--muted)}
  .stat-strip .s-value.is-zero{color:var(--ink-soft)}
  .stat .s-tap{display:block;position:absolute;inset:0;z-index:1;border-radius:inherit}
  .stat .s-hint a{position:relative;z-index:2}
  /* ── 버튼 3단: primary(.btn·.btn.gold) · secondary(.btn.ghost 흰) · tertiary(.btn.link) · 그림자 0 ── */
  .btn{box-shadow:none;font-weight:600;min-height:36px;padding:6px 14px;font-size:14px}
  .btn:active{transform:none}
  .btn.sm{min-height:32px;padding:4px 12px;font-size:13px}
  .btn.gold,.btn.gold:hover{background:var(--brand);color:var(--on-brand);box-shadow:none}
  .btn.gold:hover{background:var(--brand-strong)}
  .btn.ghost{background:var(--surface);border-color:var(--line);color:var(--ink)}
  .btn.ghost:hover{background:var(--surface-2);color:var(--ink)}
  .btn.link{background:none;border:0;color:var(--brand);padding:0 6px;min-height:0}
  /* ── 입력: 포커스 네이비 · hover --line-strong ── */
  input:focus,select:focus,textarea:focus{border-color:var(--brand-2)}
  input:hover,select:hover,textarea:hover{border-color:var(--line-strong)}
  /* ── 배지 5종+team+miss: 6px 반경 · 12/600 · gold→네이비 소프트(리드 결정 Q12 · 클래스명 유지) · '오늘'은 8px 골드 점(골드 ②) ── */
  .badge{border-radius:6px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600}
  .badge.gold{background:var(--navy-soft);color:var(--brand-ink);border-color:#d3ddf0}
  .dtg-h .badge.gold::before{content:"";width:8px;height:8px;border-radius:50%;background:var(--gold);display:inline-block;flex:none}
  /* ── 빈 상태 3요소 ── */
  .empty,.empty-box{border:1px dashed var(--line);border-radius:var(--r);background:var(--surface-2);padding:28px;text-align:center}
  .empty-t{font-size:14px;font-weight:600;color:var(--ink)}
  .empty p{color:var(--ink-soft)}
  /* ── 탭 띠(상세 목차) 밑줄형 · 대분류 띠 · 세부분류 칩 틴트 ── */
  .tabnav{background:none;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:0;gap:20px}
  .tabnav a.btn.ghost{background:none;border:0;min-height:40px;padding:0;color:var(--ink-soft);border-radius:0;position:relative}
  .tabnav a.btn.ghost:hover{color:var(--ink);background:none}
  .tabnav-label{font-size:11px;color:var(--ink-soft)}
  .tabs{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:none}
  .tabs a{border-radius:8px}
  .subchips .chip{min-height:28px;border-radius:999px;padding:4px 12px}
  .subchips .chip.on{background:var(--navy-soft);color:var(--brand);border-color:var(--brand)}
  .subchips .chip.on .badge{background:var(--brand);color:var(--on-brand)}
  /* ── 제목 ── */
  h1{font-size:22px;font-weight:700}
  h2{font-weight:700}
  h3{font-size:15px;color:var(--ink)}
  .dh-title{font-size:22px}
  /* ── 골드 치환(공통 컴포넌트 · 리포트 계열 제외) ── */
  details summary::before{color:var(--brand-2)}
  label.chk:has(input:checked){background:var(--navy-soft);border-color:#d5dcea}
  label.chk:has(input:checked) .rq-s{color:var(--brand)}
  h1 .icn,h2 .icn{color:var(--brand-2)}
  .hero .h-search input:focus,.hero-box input:focus,.ls-form input:focus{border-color:var(--brand-2);box-shadow:0 0 0 3px rgba(255,255,255,.25)}
  .ls-join a{color:#fff}
  .ls-kw{color:var(--side-label)}
  .cal-item.meet{background:var(--navy-soft);color:var(--brand);border-color:#d3ddf0}
  .cal-filter a.on.meet{background:var(--navy-soft);color:var(--brand)}
  table.cal td.today{background:var(--surface-2);box-shadow:inset 0 0 0 1px var(--gold)}
  .notice-modal{border-top-color:var(--brand)}
  .notice-modal .nm-head{color:var(--ink-soft)}
  .pipe-head.hot{border-bottom-color:var(--brand)}
  .pc-appt.soon{background:var(--warn-bg);color:var(--warn);border-color:var(--warn-line)}
  .cmt{border-left-color:var(--line)}
  .cmt-edit>summary:hover{color:var(--brand-2)}
  .cal-daypanel{border-left-color:var(--line)}
  .ln-box{border-top-color:var(--brand)}
  /* ── [P1-2a] 2단계 B(파이썬 불필요분 · 2026-08-29 · 계획서 §2 B1~B15) ─────────────────────────
     ① 툴바 .tbar ② 상세 그리드 .cd-grid/.cd-main/.cd-panel(패널은 1440px 이상에서만 — 1366은 레일) ③ 패널 골드 헤어라인(골드 ③)
     ④ sticky 첫 열 .stk ⑤ 밀도 html[data-pcdense=dense] ⑥ 탭 띠 숨김(.cd-tabs) ⑦ 헤더 액션 행 ⑨ 대시보드 카드 클래스 ⑩ 리포트 골드 → 네이비(화면만 · 인쇄 무변경) */
  .tbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-height:44px;margin:0 0 12px}
  .tbar .tb-t{display:flex;align-items:baseline;gap:8px;flex:0 0 auto;white-space:nowrap}
  .tbar .tb-t h1{margin:0;font-size:22px}
  .tbar .tb-cnt{font-size:13px;color:var(--ink-soft);font-variant-numeric:tabular-nums;white-space:nowrap}
  .tbar .tb-cnt b{color:var(--ink)}
  .tbar form.tb-q{display:flex;align-items:center;gap:6px;margin:0;flex:0 1 240px;min-width:180px}
  .tbar form.tb-q input{min-height:32px;padding:4px 10px;font-size:13px;margin:0}
  .tbar form.tb-q .btn{min-height:32px}
  /* 2행 규칙(1366·1440 공통 · 실측: 뷰명+검색+칩 6개+버튼 3개 = 1,340px > 본문 1,172): 1행 = 뷰명·건수 ｜ 검색 ｜ 촘촘·휴지통·＋고객등록,
     2행 = 정렬·묶기 칩 ｜ 안내. 칩을 1행에 끼우면 어느 폭에서든 버튼이 떨어지므로 칩 줄을 **의도적으로** 2행에 둔다(P-1 칩이 늘어도 자리 있음). */
  .tbar .fchips{flex:1 1 100%;min-width:0;order:5}
  .tbar .tb-r{display:flex;gap:8px;align-items:center;margin-left:auto;flex:0 0 auto}
  .tbar .fchips .fchip{padding:0 10px;font-size:12px}
  .tbar .tb-hint{flex:1 1 100%;font-size:12px;color:var(--muted);margin:-4px 0 0}
  @media (max-width:1300px){.tbar .tb-hint{display:none}}   /* 1366 이하: 안내 한 줄 접음(두 줄 규칙: 칩 상자만 wrap, 버튼 묶음은 늘 첫 줄) */
  .tb-dense{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;font-size:12px;border:1px solid var(--line);border-radius:999px;background:var(--surface);color:var(--ink-soft);cursor:pointer;font-family:inherit}
  .tb-dense[aria-pressed="true"]{background:var(--navy-soft);color:var(--brand);border-color:var(--brand)}
  /* 상세 헤더 액션 행 */
  .cd-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap}
  .cd-actions{display:flex;gap:6px;align-items:center;flex-wrap:wrap;flex:0 0 auto;padding-top:4px}
  .cd-tabs{display:none}                                   /* 탭 띠 → 사이드바 정본(D2 · B9). 모바일은 유지(판정 밖) */
  /* 상세 그리드 — 1440px 이상에서만 2열(본문 하한 700px · 리드 Q1 ② · 1366은 레일) */
  .cd-grid{display:block}
  .cd-main{min-width:0}
  .cd-rail{display:flex;gap:12px;align-items:center;flex-wrap:wrap;font-size:13px;color:var(--ink-soft);padding:8px 12px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface-2);margin:0 0 14px}
  .cd-rail b{color:var(--ink)}
  /* ⚠ 1440 모니터의 실제 뷰포트는 스크롤바(≈17px) 때문에 1423px — 1440으로 걸면 1440 화면에서 패널이 영원히 안 뜬다 → 1400 */
  @media (min-width:1400px){
    /* 🔴 2026-09-07: 2열(본문+오른쪽 400px 패널)을 없앴다 — 그 패널 때문에 왼쪽 자산내역·인적사항이 좁았다(대표 지적). 요약은 이름 밑 접이식(.cp-fold). */
    .cd-grid{display:block}
    .cd-rail{display:none}   /* 접이식 요약이 같은 정보를 준다 */
    .cd-main .grid.cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}   /* 본문 748px에서 KPI 4칸은 숫자가 줄바꿈 → 2×2(리드 Q1) */
  }
  .cd-panel .cp-t{font-size:15px;font-weight:700;color:var(--ink);margin:0}
  .cd-panel .hair{width:40px;height:1px;background:var(--gold);margin:8px 0 12px}
  .cd-panel .cp-row{display:flex;justify-content:space-between;align-items:center;gap:10px;min-height:36px;border-top:1px solid var(--line-soft);font-size:13px}
  .cd-panel .cp-row:first-of-type{border-top:0}
  .cd-panel .cp-k{color:var(--ink-soft)}
  .cd-panel .cp-v{font-weight:600;color:var(--ink);text-align:right;font-variant-numeric:tabular-nums}
  .cd-panel .cp-v .badge{margin-left:4px}
  .cd-panel form.cp-stage{display:flex;gap:6px;align-items:center;margin:0}
  .cd-panel form.cp-stage select{min-height:30px;padding:2px 26px 2px 8px;font-size:12.5px;width:auto}
  .cd-panel .cp-sec{font-size:12px;font-weight:600;color:var(--ink-soft);margin:14px 0 4px}
  .cd-panel .cp-rec{display:grid;grid-template-columns:52px 1fr;gap:6px;font-size:12.5px;padding:5px 0;border-top:1px solid var(--line-soft)}
  .cd-panel .cp-rec .d{color:var(--muted);font-variant-numeric:tabular-nums}
  .cd-panel .cp-rec .t{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cd-panel .cp-owner{margin-top:12px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;font-size:12.5px;color:var(--ink-soft)}
  .kvt .row>div{min-width:140px}
  .kvt .hint{font-size:11.5px}
  .cli-table td:nth-child(2){max-width:340px}                /* 고객 셀 말줄임 한계(긴 회사명) — 4열이라 어느 폭에도 가로 넘침 0 */
  tr.crow > td > a.cell-link[aria-expanded="true"] b{text-decoration:underline}
  /* sticky 첫 열(체크 열 다음 = 이름/대출명) — 헤더 sticky(top)는 .table-scroll(overflow:auto) 안에서 페이지 스크롤에 안 붙는다(Q5 · 미적용) */
  .table-scroll.stk table th:nth-child(2),.table-scroll.stk table td:nth-child(2){position:sticky;left:0;z-index:1;background:var(--surface);box-shadow:1px 0 0 var(--line)}
  .table-scroll.stk tr.rowlink:hover>td:nth-child(2){background:var(--navy-soft)}
  .table-scroll.stk tbody tr:hover td:nth-child(2){background:var(--surface-2)}
  /* ⚠ overflow:auto 래퍼 안의 sticky는 래퍼(스크롤 컨테이너) 기준이라 페이지 스크롤에 안 붙는다(Q5).
     12열 부채 표가 전폭에 들어가는 폭(1366 실측 1033/1033 · 1440 1107/1107)에서만 래퍼를 overflow:visible로 풀고 머리를 붙인다.
     그 아래 폭(900 등)은 가로 스크롤이 필요하므로 auto 유지 = 머리 sticky 없음(사유 기록). */
  /* 🔴 2026-09-13 실측 — 이 기준(1300px)이 틀렸다. `.stk` 래퍼는 **부채 표에만** 붙고
     그 표는 `.debt-table{min-width:1276px}` 이다. 1440px 창에서 담는 칸은 1107px 뿐이라
     표가 들어가지 않는데 overflow를 풀어 버려 **문서 전체가 가로로 122px 밀렸다**
     (실측 doc.scrollWidth 1531 / clientWidth 1409 · 고객상세는 제일 많이 쓰는 화면이다).
     표(1276) + 사이드바·여백(실측 333) = **1609px** 부터만 안전하다. */
  @media (min-width:1620px){
    .taxo-card .table-scroll.stk{overflow:visible}
    .taxo-card .table-scroll.stk table tr:first-child th{position:sticky;top:64px;z-index:3;background:var(--surface);box-shadow:0 1px 0 var(--line)}
    .taxo-card .table-scroll.stk table th:nth-child(2),.taxo-card .table-scroll.stk table td:nth-child(2){position:static;box-shadow:none}
  }
  /* 밀도 촘촘(32px 행) */
  html[data-pcdense="dense"] th,html[data-pcdense="dense"] td{padding:6px 12px}
  html[data-pcdense="dense"] td > a.cell-link{margin:-6px -12px;padding:6px 12px}
  html[data-pcdense="dense"] td.two{padding:4px 12px}
  html[data-pcdense="dense"] td.two > a.cell-link{margin:-4px -12px;padding:4px 12px}
  html[data-pcdense="dense"] select.qs,html[data-pcdense="dense"] td select{min-height:28px;padding-top:2px;padding-bottom:2px}
  html[data-pcdense="dense"] .btn.sm{min-height:28px}
  /* 대시보드 상태 카드(B12 · 인라인 4px 컬러 바 → 클래스) — 1단계 규칙과 같이 1px 상태색 테두리 */
  .card.dangerline,.dash .card.dangerline{border:1px solid var(--danger-line)}
  /* ⑩ 리포트·제안서 골드 20여 규칙 → 네이비(화면만 · @media print 무변경이라 PDF는 그대로) */
  .sec-no,.fpg-eyebrow,.fpg-item .no,.proc-table .st .no,.proc-table .arw td,.toc-item .toc-no,.ips-table .ino,.ex-tag,
  .rc-dia,.rcl-name .rc-name,.rcl-meta b,.rcs-name .rc-name,.rcs-meta b{color:var(--brand-2)}
  .sec-no{border-right-color:var(--line)}
  .ex-tag{border-color:var(--line)}
  .rcm-title,.rcm-name,.rc-name,.rc-sub2,.rc-bottom,.rc-bottom b,.rcs-vert,.proc-table .ph-en{color:#fff}
  .rc-vline,.rcs-rule{background:rgba(255,255,255,.6)}
  .ag-head,.sum-block-h{border-left-color:var(--brand-2)}
  .report[contenteditable="true"]{outline-color:var(--brand-2)}
  .edit-tip{background:var(--navy-soft);border-color:#d5dcea;color:var(--brand-ink)}
  /* ── 3파트 감사 반영(2026-09-02 · 검수결과/3파트감사_20260902_ERP웹_UI.md) ──────────────
     P1-3 골드 좌 바 규율 — 브리핑 리본은 [P1] 허용 3곳 밖(대시보드·브리핑·다크까지 노출) → 중립선.
       ⚠ proposal·retirement 등 인라인 border-left 골드는 템플릿 소유라 여기서 못 덮는다(보고서 기록).
     P2-4 벤치마크 표 — 전역 input(패딩 10px)이 행을 66px로 키워 표 규칙(≈40px 행)에서 이탈 → 압축.
     UX P2 마지막 상담 요지 — 우측 패널 최근 3건 목록을 요지 1건(일자·구분·첫 줄·다음약속)으로. */
  .bf-ribbon{border-left-color:var(--line)}
  #thform td,#guideform td,#tables td,#model td{padding:7px 12px}
  #thform td input,#guideform td input,#tables td input,#model td input{padding:5px 10px}
  .cd-panel .cp-last{padding:6px 0 0;font-size:12.5px}
  .cd-panel .cp-last-h{display:flex;gap:6px;align-items:center;color:var(--muted);font-variant-numeric:tabular-nums}
  .cd-panel .cp-last-t{margin:4px 0 0;color:var(--ink);line-height:1.5;overflow:hidden;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
  .cd-panel .cp-last-n{margin-top:4px;color:var(--ink-soft)}
  .cd-panel .cp-more{display:inline-block;margin-top:6px;font-size:12px}
}

/* ══════════════════════════════════════════════════════════════════════════════════════
   📱 모바일 4건 + 모션 시스템 (2026-08-27 저녁 · 디자인 시안 UI시안_모션_20260827 §D-1 순서)
   [1] keyframes 7종 + 워시 유틸 → [2] 지표 띠 → [3] KPW 일정 → [4] 달력 → [5] 게시판·자료실·공지
   → [6] 모션 적용 → [7] 옆으로 미는 표 안내 1줄
   ⚠ 모바일 판정은 이 파일의 다른 블록과 **글자까지 같은** 리터럴 한 종류. PC·인쇄 무변경.
   ⚠ 토큰(--mo-*·--ease-*·--wash-*)은 :root에. reduced-motion은 1914행 전역 규칙이 전부 끈다.
   ⚠ 이 묶음은 파일 **맨 끝**에 있어야 한다 — 앞 블록과 같은 특이도를 순서로 이긴다.
   ══════════════════════════════════════════════════════════════════════════════════════ */

/* [1] 키프레임(전역 정의 · 참조는 모바일 블록) — 전부 opacity/transform(합성 레이어). width는 .meter 14px 한 줄뿐 */
@keyframes kpwSlideUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
@keyframes kpwSpring{0%{opacity:0;transform:translateY(10px) scale(.97)}70%{opacity:1;transform:translateY(-2px) scale(1.005)}100%{transform:none}}
@keyframes kpwPop{0%{opacity:0;transform:scale(.6)}60%{opacity:1;transform:scale(1.12)}100%{transform:scale(1)}}
@keyframes kpwFill{from{width:0}}
@keyframes kpwBreathe{from{transform:scale(1);opacity:.7}to{transform:scale(1.07);opacity:1}}
@keyframes kpwShimmer{from{background-position:-200% 0}to{background-position:200% 0}}
@keyframes kpwDotIn{from{transform:scale(0)}to{transform:scale(1)}}
/* 워시 유틸(전역 정의 · 모바일 블록 안의 카드만 붙인다 · 워시 위 보조 글자는 --muted 금지 → --ink-soft) */
.wash-cream{background:var(--wash-cream)}.wash-sky{background:var(--wash-sky)}.wash-mint{background:var(--wash-mint)}
.wash-lilac{background:var(--wash-lilac)}.wash-peach{background:var(--wash-peach)}.wash-sand{background:var(--wash-sand)}

/* [2] ── stat-strip 공통(값 변화 없음): 늘린 링크·모바일 라벨은 기본 숨김 ─────────────── */
.stat .s-tap,.stat .sl-m{display:none}
/* ── 📱 지표 카운터 띠(2026-08-27 · 디자인) — 2393행 1열 규칙을 같은 특이도·뒤에서 덮는다 ── */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .stat-strip{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;
    gap:1px;background:var(--m-line);border-radius:var(--r);
    scrollbar-width:none;position:relative}
  .stat-strip::-webkit-scrollbar{display:none}
  /* 우측 페이드 — 셀이 불투명이라 컨테이너 배경엔 못 그린다 → sticky 가짜 요소가 오른쪽 가장자리에 붙는다 */
  .stat-strip::after{content:"";flex:none;position:sticky;right:0;width:24px;margin-left:-24px;z-index:2;
    pointer-events:none;background:linear-gradient(to left, var(--m-bg) 20%, transparent)}
  .stat-strip .stat{flex:0 0 calc((100% - 2px - 12px)/3);min-width:82px;height:64px;
    display:flex;flex-direction:column;justify-content:center;gap:2px;
    padding:6px 8px;border:0;border-top:0;border-radius:0;box-shadow:none;background:var(--surface);
    scroll-snap-align:start;transform:none;transition:background var(--mo-fast)}
  .stat-strip .stat:hover{transform:none;box-shadow:none;background:var(--m-glass-b)}
  .stat-strip .stat:active{background:var(--m-acc-soft)}
  /* 순서: 행동 대상 → 규모 (UX §3) */
  .stat-strip .st-up{order:1}.stat-strip .st-al{order:2}.stat-strip .st-cli{order:3}
  .stat-strip .st-mid{order:4}.stat-strip .st-aum{order:5}
  .stat-strip .s-label{white-space:normal;overflow:hidden;font-size:var(--fs-xs);line-height:1.2;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;gap:0;order:0}
  .stat-strip .s-label svg{display:none}
  .stat-strip .sl-pc{display:none}.stat-strip .sl-m{display:inline}
  .stat-strip .s-value{grid-row:auto;grid-column:auto;margin:0;font-size:var(--fs-xl);line-height:1.1;order:1}
  .stat-strip .s-value .u{font-size:var(--fs-note)}
  .stat-strip .s-value.is-zero{color:var(--muted)}
  .stat-strip .s-hint{display:none}
  /* 셀 전체가 링크 — .stat이 position:relative(649행)라 절대배치가 카드 안에 갇힌다 */
  .stat .s-tap{display:block;position:absolute;inset:0;z-index:1;border-radius:inherit}
  .stat .s-tap:focus-visible{outline-offset:-3px}
  .stat-strip .stat:focus-within{scroll-snap-align:start}
}

/* [3] ── KPW 일정 — 인라인 style 대체 클래스(값 동일 · PC 무변경) ───────────────────────
   .dtg-h ← class="mt-2"(6px!important) + style="display:flex;gap:8px;align-items:baseline"
   .dt-bd ← style="min-width:52px;text-align:center"(.badge는 inline-flex라 text-align은 사실상 무효 — 그대로 옮김)
   .dt-kind ← style="margin:0;padding:1px 6px" · #calendar .dt-body ← style="margin:0 0 12px;padding:12px 14px"
   .dt-alloff ← style="display:inline;margin-left:6px" */
.dtg-h,label.dtg-h{display:flex;gap:8px;align-items:baseline;margin:6px 0 0;padding:0;
  font-size:inherit;color:inherit;font-weight:inherit;cursor:default}
.dt-bd{min-width:52px;text-align:center}
.dt-row .dt-kind{margin:0;padding:1px 6px}
#calendar .dt-body{margin:0 0 12px;padding:12px 14px}
.dt-alloff{display:inline;margin-left:6px}
.dt-hid,.dt-why{margin:8px 0 0}
.dt-title{color:inherit}
.dt-title:hover{color:inherit;text-decoration:none}
.h-sub-m,.dt-hid-m,.dt-edit-lbl,.dtg-chev,.dt-empty-m{display:none}
/* ── 📱 KPW 일정 압축(2026-08-27 · 디자인) ─────────────────────────────────────── */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .dt-more,.h-sub-pc,.dt-hid-pc,.dt-why,.dt-foot-pc,.dt-cta2{display:none}
  .h-sub-m,.dt-hid-m,.dt-empty-m{display:inline}
  .dt-title::after{content:" ›";color:var(--ink-soft);font-weight:800}
  #calendar .dt-body{padding:0;margin:0 0 8px;box-shadow:none;background:transparent}
  /* 날짜 헤더 — 오늘은 골드 워시 띠, 나머지는 텍스트. 접힘 헤더는 44px 타깃 */
  .dtg-h{margin:6px 0 0;padding:6px 8px;border-radius:var(--r-sm);min-height:36px;align-items:center}
  .dtg-h.dtg-today{background:var(--m-acc-soft)}
  .dtg-h .badge.gray{background:none;border:0;padding:0;min-width:0;color:var(--ink-soft)}
  label.dtg-h.dtg-far{min-height:44px;cursor:pointer;-webkit-tap-highlight-color:transparent}
  .dtg-chev{display:inline-block;margin-left:auto;color:var(--ink-soft);
    transition:transform var(--mo-base) var(--ease-out)}
  .dtg-tgl:checked + .dtg-h .dtg-chev{transform:rotate(90deg)}
  /* 접힘: 체크박스 → 헤더 → 본문 순서라 `+ .dtg-h + .dtg-body`로 닿는다 */
  .dtg-tgl:not(:checked) + .dtg-h + .dtg-body{display:none}
  .dtg-tgl:checked + .dtg-h + .dtg-body{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  /* 행 — 점 + 접두 + 제목 한 줄 */
  .dt-row{flex-wrap:nowrap;padding:0 8px;min-height:36px;font-size:var(--fs-body-sm);gap:6px}
  .dt-row .dt-kind{display:inline-flex;align-items:center;gap:5px;background:none;border:0;padding:0;
    font-size:var(--fs-note);font-weight:700;color:var(--ink-soft);flex:none}
  .dt-row .dt-kind::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--m-mute)}
  .dt-row .dt-kind.meet::before{background:var(--m-acc)}
  .dt-row .dt-kind.co::before{background:var(--m-ink2)}
  .dt-row .dt-kind.team::before{background:var(--m-mute)}
  .dt-row .dt-kind.priv::before{background:var(--m-ok)}
  .dt-row .dt-kind.alert::before{background:var(--m-warn)}
  .dt-row .dt-kind::after{content:" ·";color:var(--muted)}
  .dt-row .dt-t{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .dt-row .dt-t a{color:var(--ink)}
  /* CTA — 행 아래 풀폭(다음 줄). flex-wrap을 다시 켜야 하므로 has-cta 행만 wrap */
  .dt-row.has-cta{flex-wrap:wrap}
  .dt-row .dt-cta{flex:1 1 100%;min-height:40px;justify-content:center;margin:4px 0 6px}
  .dt-task a{font-size:var(--fs-cap);font-weight:700}
  /* × 그만 보기 — 기본 숨김, '알림 정리' 편집 모드에서만 40px 타깃으로 (Show/Hide) */
  .dt-row .nb-off{display:none}
  .dt-edit-state:checked ~ .dt-body .dt-row .nb-off{display:inline-flex;animation:kpwPop var(--mo-base) var(--ease-spring) both}
  .dt-edit-state:checked ~ .dt-body .cal-x{min-width:40px;min-height:40px;font-size:var(--fs-md);
    border-radius:50%;background:var(--m-danger-soft)}
  .dt-foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
  .dt-edit-lbl{display:inline-flex;align-items:center;min-height:44px;padding:0 8px;margin:0;
    font-size:var(--fs-cap);font-weight:700;color:var(--brand);cursor:pointer}
  .dt-edit-state:checked ~ .dt-foot .dt-edit-lbl::before{content:"완료 · "}
  .dt-alloff{display:none}
  .dt-edit-state:checked ~ .dt-foot .dt-alloff{display:inline;flex:1 1 100%;margin:0}
  .dt-alloff .btn{width:100%;min-height:40px}
  .dt-hid{margin:8px 8px 0;font-size:var(--fs-note)}
  /* 블록 순서(모바일만) — KPW 일정 → 지표 → 게시판. .dash-top을 '없는 상자'로 만들어 두 카드가
     .dash flex의 직계 자식처럼 order를 받는다(.dash-top>.card 규칙은 display:contents 부모에도 그대로 적용). */
  .dash>.dash-top{display:contents}
  .dash>.dash-head{order:0}
  .dash-top>#calendar{order:1}
  .dash>.stat-strip{order:2}
  .dash-top>#board{order:3}
  .dash>.dash-cols{order:4}
  .dash>#dash-order{order:5}
  .dash>.notice-modal-wrap{order:-1}
}

/* [4] ── 📱 달력 압축(2026-08-27 · 디자인) — 칩→점, 6주 264px, 아젠다 아래, FAB+시트 ─────────
   PC·인쇄 무변경: 새 요소(.cal-dots·.cal-fab·.cm-*)는 기본 숨김, 나머지는 모바일 판정 안에서만 덮는다. */
.cal-dots,.cal-fab,.cm-veil,.cm-grab,.cm-close,.cm-title{display:none}
.cal-page .cal-empty{margin-top:8px}
/* ?d 없이 서버가 자동으로 연 오늘 패널(.cal-auto)은 PC에서도 **그리드 아래** — 사람이 칸을 눌러 연 패널은 그리드 위(감수 ⑨) */
.cal-page>.cal-daypanel.cal-auto{order:1}
.cal-page>.dash-cols{order:2}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  /* 순서: 도구 → 그리드 → 아젠다 → 관리(시트) — .dash.cal-page는 flex column(772행) */
  .cal-page>.cal-head{order:0}
  .cal-page>.cal-tools{order:1}
  .cal-page>.cal-gridcard{order:2}
  .cal-page>.cal-daypanel,.cal-page>.cal-daypanel.cal-auto{order:3}
  .cal-page>.cal-manage,.cal-page>.dash-cols.cal-manage{order:4}
  /* ① 월 이동 한 줄 40px: ‹ 2026년 8월 › + 오늘 */
  .cal-head{display:grid;grid-template-columns:40px minmax(0,1fr) 40px auto;align-items:center;gap:var(--sp-1)}
  .cal-head .cal-title{grid-column:2;grid-row:1;text-align:center;font-size:var(--fs-md);margin:0}
  .cal-head .cal-nav{display:contents}
  .cal-nav .cn-t{display:none}
  .cal-nav>.btn.sm{min-width:40px;min-height:40px;padding:0;justify-content:center}
  .cal-nav>.btn:first-child{grid-column:1;grid-row:1}
  .cal-nav>.btn:last-child{grid-column:3;grid-row:1}
  .cal-nav>.cn-today{grid-column:4;grid-row:1;padding:0 var(--sp-3);border-radius:var(--r-pill)}
  /* ② 칩 띠 — 한 줄 가로 스크롤(자산현황 .tabs와 같은 문법) */
  .cal-tools .row-act,.cal-tools .cal-filter{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
    scrollbar-width:none;padding-bottom:2px}
  .cal-tools .row-act::-webkit-scrollbar,.cal-tools .cal-filter::-webkit-scrollbar{display:none}
  .cal-tools .row-act>*,.cal-tools .cal-filter>*{flex:none}
  /* ③ 그리드 — 토큰만 덮는다(규칙을 다시 쓰지 않는다 · 2200행 주석 원칙) */
  .cal-page{--cal-cell-h:40px;--cal-day-fs:var(--fs-note)}
  .cal-scroll table.cal.cal-lg{min-width:0;table-layout:fixed;width:100%}   /* 2244행 644px 강제를 푼다 · 7열 균등(QA 🔴) */
  .cal-scroll{overflow-x:auto}                                 /* 안전망 — 그래도 넘치면 잘리지 않고 밀린다 */
  table.cal.cal-lg th{padding:5px 0;font-size:var(--fs-xs)}
  table.cal.cal-lg td{padding:0;height:var(--cal-cell-h);vertical-align:top}
  .cal-lg .cal-item,.cal-lg .cal-more{display:none}         /* 칩 텍스트는 37px 칸에 못 들어간다 */
  .cal-lg .cal-day{display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:1px;
    width:100%;height:100%;min-height:40px;margin:0;padding:3px 0 0;border-radius:0;background:transparent}
  .cal-lg .cal-day:hover{background:var(--m-glass-b)}
  .cal-lg .cal-n{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;
    font-size:var(--cal-day-fs);font-weight:800;line-height:1}
  /* 오늘 — 칸 전체 대신 **숫자만** 원(2212행 규칙을 좁힌다). 색+원+aria-current 세 단서 */
  .cal-lg td.today .cal-day{background:transparent;color:var(--m-ink)}
  .cal-lg td.today .cal-n{background:var(--m-acc);color:var(--m-acc-ink)}
  /* 오늘·선택 칸 테두리 1px = 골드 사용처 ②(면 채움 없음 · 정보는 원·aria-current가 진다) */
  .cal-lg td.picked,table.cal td.today{box-shadow:inset 0 0 0 1px var(--m-gold)}
  table.cal td.today{background:var(--m-acc-soft)}
  /* 점 — kind 색은 기존 칩 토큰과 같은 계열(색만으로 알리지 않는다: 건수는 aria-label 글자) */
  .cal-dots{display:flex;gap:2px;align-items:center;height:8px}
  .cal-dots .cd{width:5px;height:5px;border-radius:50%;background:var(--m-mute)}
  .cal-dots .cd.meet{background:var(--m-acc)}
  .cal-dots .cd.co{background:var(--m-ink2)}
  .cal-dots .cd.team{background:var(--m-mute)}
  .cal-dots .cd.priv{background:var(--m-ok)}
  .cal-dots .cd.alert{background:var(--m-warn)}
  .cal-dots .cd.plus{width:auto;height:auto;background:none;font-style:normal;font-size:var(--fs-2xs);
    font-weight:800;line-height:1;color:var(--ink-soft)}
  /* ④ 아젠다 — 그리드 바로 아래, 왼쪽 골드 바 유지 */
  .cal-daypanel{scroll-margin-top:60px}
  .cal-daypanel .row-item{flex-wrap:nowrap;min-height:44px}
  .cal-daypanel .row-item>span:nth-child(2){min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
  .cal-note .cal-note-2{display:none}                       /* 안내문은 첫 문장만(문장 중간 잘림 없이) */
  /* ⑤ FAB + 관리 시트(회사·팀·개인 3카드를 그대로 담는다) */
  .cal-fab{display:grid;place-items:center;position:fixed;right:14px;z-index:36;
    bottom:calc(74px + env(safe-area-inset-bottom,0px));width:56px;height:56px;border-radius:50%;
    background:var(--m-acc);color:var(--m-acc-ink);font-size:26px;font-weight:800;
    box-shadow:var(--m-fab-sh);cursor:pointer;margin:0;
    transition:transform var(--mo-fast) var(--ease-out)}
  .cal-fab:active{transform:scale(.92)}
  .cal-page ~ .totop{right:auto;left:14px}                   /* '맨 위로'와 자리 충돌 방지(둘 다 main의 자식) */
  .cal-manage{position:fixed;left:0;right:0;bottom:0;z-index:70;display:flex;flex-direction:column;gap:10px;
    max-height:84vh;overflow-y:auto;background:var(--m-surface);border-radius:18px 18px 0 0;
    padding:8px 14px calc(16px + env(safe-area-inset-bottom,0px));
    box-shadow:var(--m-sheet-sh);
    transform:translateY(102%);transition:transform var(--mo-slow) var(--ease-out);visibility:hidden}
  .cm-state:checked ~ .cal-manage{transform:none;visibility:visible}
  .cm-veil{display:block;position:fixed;inset:0;z-index:69;background:var(--m-veil);opacity:0;
    pointer-events:none;transition:opacity var(--mo-base);margin:0}
  .cm-state:checked ~ .cm-veil{opacity:1;pointer-events:auto}
  .cm-grab{display:block;width:38px;height:4px;border-radius:2px;background:var(--m-line);margin:2px auto 4px;flex:none}
  .cm-close{display:block;text-align:center;margin-top:6px;cursor:pointer}
  .cal-manage>div{display:flex;flex-direction:column;gap:10px}
  .cal-manage .card{border:1px solid var(--m-line);margin:0}
  .cal-manage .cal-x{min-width:40px;min-height:40px;font-size:var(--fs-md)}   /* 삭제 × 44px급 타깃 */
  .cm-title{display:block;margin:0 0 4px;font-size:var(--fs-md);color:var(--brand-ink)}
  /* QA: 자료실 올리기 폼 — 좁은 폰에서 칸을 한 줄씩(.row>div min-width:175px가 2칸을 억지로 나란히 놓아 넘쳤다) */
  .lib-up .row>div{flex:1 1 100%;min-width:0}
}
/* 360px 이하(iPhone SE·갤럭시 소형) — 셀 최소폭을 37px 아래로: 숫자 원 18px · 점 4px. 사이드바와 무관한 크기 규칙 */
@media screen and (max-width:360px){
  .cal-lg .cal-n{width:18px;height:18px;font-size:var(--fs-xs)}
  .cal-dots .cd{width:4px;height:4px}
  .cal-lg .cal-day{padding-top:2px}
}
@media print{.cal-fab,.cm-veil,.cm-grab,.cm-close{display:none!important}}

/* [5] ── 📱 회사 게시판 카드형(2026-08-27 · 디자인) — 표는 접고 카드 5장 · 워시 순환 ─────── */
.bd-cards{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .dash-top .bd-files{display:none}
  .bd-cards{display:flex;flex-direction:column;gap:8px;margin-top:10px}
  .bdc{display:block;padding:11px 13px;border-radius:var(--r);border:1px solid transparent;
    color:inherit;text-decoration:none;-webkit-tap-highlight-color:transparent;
    transition:transform var(--mo-fast) var(--ease-out),box-shadow var(--mo-fast)}
  .bdc:hover,.bdc:focus-visible{text-decoration:none;border-color:var(--m-acc)}
  .bdc:active{transform:scale(.985)}
  .bdc-top{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:4px}
  .bdc-name{font-size:var(--fs-sm);font-weight:700;color:var(--ink);line-height:1.45;overflow-wrap:anywhere;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  /* 워시 위 보조 글자는 --muted가 아니라 --ink-soft (§C: muted는 워시에서 4.1:1로 AA 미달) */
  .bdc-meta{font-size:var(--fs-note);color:var(--ink-soft);margin-top:3px;font-variant-numeric:tabular-nums}
  .bdc-more{display:flex;align-items:center;min-height:44px;padding:0 4px;font-size:var(--fs-cap);
    font-weight:700;color:var(--brand);text-decoration:none}
}
@media print{.bd-cards{display:none!important}}

/* ── 📱 자료실 카드형(2026-08-27 · 디자인) — ⋯ 안에 [받기][삭제] · 심의는 PC 표에서만 ───────── */
.lib-cards{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .lib-cat .table-scroll{display:none}
  .lib-cards{display:flex;flex-direction:column;gap:8px;margin-top:12px}
  .libc{border-radius:var(--r);padding:11px 4px 11px 13px;border:1px solid transparent}
  .libc-h{display:flex;gap:6px;align-items:flex-start}
  .libc-l{min-width:0;flex:1 1 auto}
  .libc-top{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:4px}
  .libc-name{display:block;font-size:var(--fs-sm);font-weight:700;color:var(--ink);line-height:1.45;
    overflow-wrap:anywhere;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .libc-meta{font-size:var(--fs-note);color:var(--ink-soft);margin-top:3px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
  .libc-note{font-size:var(--fs-cap);color:var(--ink-soft);margin-top:3px;overflow-wrap:anywhere}
  .libc-more{flex:none;border:0;background:transparent;padding:0;margin:0;position:relative}
  .libc-more>summary{list-style:none;display:grid;place-items:center;width:44px;height:44px;margin:-6px 0 0;
    padding:0;border:0;background:transparent;border-radius:50%;font-size:var(--fs-lg);font-weight:800;
    color:var(--ink-soft);cursor:pointer}
  .libc-more>summary::before{content:none}                 /* 631행 전역 ＋/－ 접두를 지운다 */
  .libc-more[open]>summary::before{content:none}
  .libc-more>summary::-webkit-details-marker{display:none}
  .libc-more[open]>summary{background:var(--m-surface);box-shadow:var(--m-card-sh)}
  .libc-act{position:absolute;right:4px;top:40px;z-index:5;display:flex;gap:6px;flex-wrap:wrap;
    padding:8px;background:var(--m-surface);border:1px solid var(--m-line);border-radius:var(--r-sm);
    box-shadow:var(--m-card-sh);animation:kpwPop var(--mo-base) var(--ease-spring) both}
  .libc-act form{margin:0}
  .libc-act .btn{min-height:40px}
  .libc-act .btn.ic-del{width:44px;min-width:44px;height:40px}
}
@media print{.lib-cards{display:none!important}}

/* ── 📱 공지 목록 행(2026-08-27 · 디자인) ─────────────────────────────────────── */
.ntc-list{display:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .ntc-table{display:none}
  .ntc-list{display:flex;flex-direction:column}
  .ntc{display:block;padding:12px 4px;border-top:1px solid var(--line-soft);color:inherit;text-decoration:none;min-height:44px}
  .ntc:first-child{border-top:0}
  .ntc:hover,.ntc:focus-visible{text-decoration:none;background:var(--m-glass-b)}
  .ntc.is-pin{background:var(--m-acc-soft)}
  .ntc-top{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
  .ntc-read{margin-left:auto;font-size:var(--fs-note);color:var(--ink-soft)}
  .ntc-t{font-size:var(--fs-sm);color:var(--ink);margin-top:4px;overflow-wrap:anywhere;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
  .ntc.is-new .ntc-t{font-weight:800}                       /* 안 읽음 = 굵게(메일함 관례 · 색만 아님) */
  .ntc-meta{font-size:var(--fs-note);color:var(--ink-soft);margin-top:2px}
}
@media print{.ntc-list{display:none!important}}

/* [6] ── 📱 모션 적용(2026-08-27 · 디자인) — 등장은 1회, 반복은 블롭뿐. 1914행 reduced-motion이 전부 끈다 ── */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  /* 인사말 + 블롭 2개 — 상단에만 절제(브리프). radial-gradient로 그려 blur() 비용을 피한다 */
  .dash-head{position:relative;isolation:isolate;padding:10px 0 6px;animation:kpwSlideUp var(--mo-slow) var(--ease-out) both}
  .dash-head::before,.dash-head::after{content:"";position:absolute;z-index:-1;border-radius:50%;pointer-events:none;
    animation:kpwBreathe var(--mo-breathe) var(--ease-inout) infinite alternate}
  /* 코어 색은 워시가 아니라 --gold(#c8a24a)·--chart-3(#5e77a8)의 rgba — 워시는 --bg와 명도차 2~3%라 안 보였다(감수 🔴-1) */
  .dash-head::before{width:220px;height:220px;left:-70px;top:-90px;
    background:radial-gradient(circle at 50% 50%, var(--m-wash1) 0%, transparent 68%)}
  .dash-head::after{width:180px;height:180px;right:-60px;top:-40px;animation-delay:-4s;
    background:radial-gradient(circle at 50% 50%, var(--m-wash2) 0%, transparent 68%)}
  /* 카드 등장 — dash-top 두 카드 + 지표 띠(seq-in은 .dash 직계 .card만 잡으므로 겹치지 않는다 · 998행) */
  .dash-top>.card{animation:kpwSpring var(--mo-slow) var(--ease-spring) both}
  .dash-top>#calendar{animation-delay:calc(var(--stagger)*1)}
  .stat-strip{animation:kpwSlideUp var(--mo-slow) var(--ease-out) both;animation-delay:calc(var(--stagger)*2)}
  .dash-top>#board{animation-delay:calc(var(--stagger)*3)}
  /* 행·셀·카드 stagger — 6개까지(그 이후는 즉시: 스크롤 아래는 어차피 안 보인다) */
  .dtg-body>.dt-row:nth-child(-n+6),.bd-cards>.bdc:nth-child(-n+5){
    animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  .dtg-body>.dt-row:nth-child(2),.bd-cards>.bdc:nth-child(2){animation-delay:calc(var(--stagger)*1)}
  .dtg-body>.dt-row:nth-child(3),.bd-cards>.bdc:nth-child(3){animation-delay:calc(var(--stagger)*2)}
  .dtg-body>.dt-row:nth-child(4),.bd-cards>.bdc:nth-child(4){animation-delay:calc(var(--stagger)*3)}
  .dtg-body>.dt-row:nth-child(5),.bd-cards>.bdc:nth-child(5){animation-delay:calc(var(--stagger)*4)}
  .dtg-body>.dt-row:nth-child(6){animation-delay:calc(var(--stagger)*5)}
  /* 지표 띠는 DOM(nth-child)이 아니라 **보이는 순서**(order · st-*)로 시차를 준다(감수 🔴-2) */
  .stat-strip>.stat{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  .stat-strip>.stat.st-up{animation-delay:0s}
  .stat-strip>.stat.st-al{animation-delay:calc(var(--stagger)*1)}
  .stat-strip>.stat.st-cli{animation-delay:calc(var(--stagger)*2)}
  .stat-strip>.stat.st-mid{animation-delay:calc(var(--stagger)*3)}
  .stat-strip>.stat.st-aum{animation-delay:calc(var(--stagger)*4)}
  .bd-cards>.bdc{animation-name:kpwSpring;animation-timing-function:var(--ease-spring)}   /* 게시판은 카드 '통통' */
  /* 뱃지 톡 — NEW·알림 숫자(0이 아닐 때만: is-zero엔 안 건다) */
  .bdc-new,.stat-strip .st-al .s-value:not(.is-zero) .s-num{display:inline-block;
    animation:kpwPop var(--mo-base) var(--ease-spring) both;animation-delay:calc(var(--mo-slow) + var(--stagger))}
  /* 게이지 차오름 — 기존 .meter(254행)의 인라인 width를 향해 0에서 */
  .meter>span{animation:kpwFill var(--mo-slow) var(--ease-out) both}
  /* 증시 스켈레톤 — 값이 오기 전 '…' 자리를 shimmer로. 값이 오면 dashboard.js가 innerHTML을 갈아 끼우므로 저절로 사라진다 */
  #mini-mkt .m-price.muted{color:transparent;border-radius:var(--r-xs);min-height:20px;
    background:linear-gradient(90deg,var(--m-line) 25%,var(--m-glass-b) 50%,var(--m-line) 75%);
    background-size:200% 100%;animation:kpwShimmer 1.4s linear infinite}
  #mini-mkt .mkt-card{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  /* 달력 — 그리드 등장, 점은 열(요일)별로 시차, 오늘 원 pop, 아젠다 slide-up */
  .cal-gridcard{animation:kpwSlideUp var(--mo-slow) var(--ease-out) both}
  .cal-dots .cd{animation:kpwDotIn var(--mo-base) var(--ease-spring) both;animation-delay:calc(var(--mo-base) + var(--stagger)*var(--col,0))}
  table.cal td:nth-child(2) .cd{--col:1}table.cal td:nth-child(3) .cd{--col:2}table.cal td:nth-child(4) .cd{--col:3}
  table.cal td:nth-child(5) .cd{--col:4}table.cal td:nth-child(6) .cd{--col:5}table.cal td:nth-child(7) .cd{--col:6}
  .cal-lg td.today .cal-n{animation:kpwPop var(--mo-base) var(--ease-spring) both;animation-delay:var(--mo-slow)}
  .cal-daypanel{animation:kpwSlideUp var(--mo-base) var(--ease-out) both;animation-delay:calc(var(--stagger)*2)}
}

/* [7] ── 📱 옆으로 밀어야 하는 표 위 1줄(UX §5 규칙 2) — 마크업 변경 없이 .table-scroll 공통.
   ⚠ 표가 실제로 넘칠 때만: base.js가 scrollWidth>clientWidth를 재서 .is-overflow를 단다(2열 KV 표엔 안 뜬다).
   sticky left:0 — 옆으로 밀어도 문구가 가장자리에 남는다. 카드형이 붙어 display:none인 표에는 안 그려진다. */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .table-scroll.is-overflow::before{content:"옆으로 밀어 비교하세요 ›";display:block;position:sticky;left:0;
    font-size:var(--fs-note);color:var(--muted);padding:0 2px 4px;font-weight:600;z-index:3}
}

/* [8] ══ 📱 모바일 2모드 테마(2026-08-29 · 계획서 검수결과/구현계획_모바일2모드_20260828.md · 시안 모바일시안_최종_20260828.html) ══
   라이트 = 글래스 라이트(KPW 네이비 #1b2a4a 1색) · 다크 = 딥 다크(바탕 #0E1220 · 스틸블루 #9db1d4) · 골드는 --m-gold 장식 3곳만.
   구조(순서가 곧 우선순위):
     ① :root 라이트(기본) → ② 시스템 다크(중첩 @media prefers-color-scheme · 수동 라이트는 :not으로 제외)
     → ③ 수동 다크 html[data-mtheme=dark](②와 선언 집합 동일 — smoke_mtheme가 대조) → ④ 브리지 → ⑤ 컴포넌트.
   규칙:
   · 전부 **모바일 판정 리터럴 안**(PC·인쇄 무변경). 판정 리터럴을 하나 더 만들지 않는다 — 다크는 **중첩 @media**로.
   · --m-* 값은 리터럴만(PC 토큰 var() 참조 금지 — 값을 공유하지 않는다).
   · ④ 브리지 = 판정 안에서 PC 토큰 **이름**을 --m-*로 되돌려 잇는다(계획 Q1 승인). 77개 템플릿이 var(--surface)·var(--ink)·var(--line)을
     참조하므로 이것이 시안 밖 화면 22면을 한 번에 일반화하는 지렛대다. PC는 판정 밖이라 1px도 안 바뀐다.
     ⚠ 브리지는 .shell(로그인 화면 래퍼)에만 건다 — 비로그인 4면(.hero-screen)은 테마 제외(계획 Q4 확정).
     ⚠ --brand-ink(글자)는 --m-ink, --brand(면)는 --m-acc — 둘을 같이 accent로 이으면 다크에서 제목까지 스틸블루가 된다.
     ⚠ 골드 토큰(--gold*)은 브리지하지 않는다 — PC의 골드 참조는 모바일에서 accent로 흡수. 골드는 --m-gold 한 토큰, 사용처 3곳만.
     ⚠ --chart-*(서버 SVG와 짝) · --side-*(사이드바는 숨김) · --fs-* · --sp-* · 모션 토큰은 브리지 제외.
   · blur는 **고정 요소**(상단바·탭바·sticky 칩 띠)만. 카드는 blur 없이 알파(--m-glass)만(Q6 확정 · 저사양 스크롤).
     backdrop-filter 미지원 기기는 불투명 폴백(--m-glass-fb) — @supports로 가른다.
   · color-scheme:dark는 ②③ 안에만(var() 불가 · 라이트는 meta color-scheme=light 그대로).
   · !important는 알림 숫자 인라인 style 하나뿐(인라인을 이길 다른 길이 없다). 나머지는 앞 블록과 같은 특이도를 **순서**로 이긴다(파일 맨 끝). */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  /* ── ① 라이트(기본) ── */
  :root{
    --m-bg:#EEF0F4; --m-bg2:#F8F9FB; --m-surface:#FFFFFF; --m-top:rgba(238,240,244,.72);
    --m-glass:rgba(255,255,255,.62); --m-glass-fb:#F8F9FB; --m-glass-b:rgba(255,255,255,.85);
    --m-ink:#1D2230; --m-ink2:#4A5162; --m-mute:#5F6778; --m-line:rgba(29,34,48,.08);
    --m-acc:#1b2a4a; --m-acc-ink:#FFFFFF; --m-acc-soft:#eaeef6; --m-num:#1b2a4a;
    --m-danger:#C62828; --m-danger-soft:#FBE4E2; --m-ok:#1F7A4A; --m-ok-soft:#E3F3EA; --m-warn:#A44A0E; --m-warn-soft:#FBEBDF;
    --m-wash-1:rgba(27,42,74,.08); --m-wash-2:rgba(94,119,168,.09); --m-wash-3:rgba(31,122,74,.07); --m-wash-4:rgba(164,74,14,.07); --m-wash-5:rgba(27,42,74,.05); --m-wash-6:rgba(29,34,48,.04);
    --m-pill:rgba(29,34,48,.06); --m-pill-c:#4A5162; --m-chip-on:#1b2a4a; --m-chip-on-c:#FFFFFF;
    --m-tb-bg:rgba(255,255,255,.72); --m-tb-on:#1b2a4a;
    --m-glow:rgba(27,42,74,.12); --m-wash1:rgba(27,42,74,.12); --m-wash2:rgba(94,119,168,.12);
    --m-sheet-sh:0 -8px 30px rgba(29,34,48,.10); --m-fab-sh:0 8px 20px rgba(27,42,74,.28); --m-card-sh:0 1px 2px rgba(29,34,48,.04),0 8px 24px rgba(29,34,48,.05);
    --m-frame:#D7DAE2; --m-knob:#FFFFFF; --m-knob-sh:0 1px 2px rgba(29,34,48,.25); --m-veil:rgba(29,34,48,.45);
    --m-gold:#c8a24a; --m-plate:#F8F9FB; --m-r:20px; --m-r-sm:14px;
  }
  /* ── ② 시스템 다크 — 수동 라이트(data-mtheme=light)는 제외. JS가 꺼져도 시스템 다크는 여기서 먹는다 ── */
  @media (prefers-color-scheme:dark){
    html:not([data-mtheme=light]){
      color-scheme:dark;
      --m-bg:#0E1220; --m-bg2:#161C30; --m-surface:#171C2E; --m-top:rgba(14,18,32,.80);
      --m-glass:rgba(255,255,255,.06); --m-glass-fb:#171C2E; --m-glass-b:rgba(255,255,255,.10);
      --m-ink:#F2F3F7; --m-ink2:#c5cee0; --m-mute:#93a1bd; --m-line:rgba(255,255,255,.10);
      --m-acc:#9db1d4; --m-acc-ink:#12203c; --m-acc-soft:rgba(157,177,212,.16); --m-num:#FFFFFF;
      --m-danger:#FF8A80; --m-danger-soft:rgba(255,138,128,.14); --m-ok:#86d9a8; --m-ok-soft:rgba(134,217,168,.14); --m-warn:#F0A36A; --m-warn-soft:rgba(240,163,106,.16);
      --m-wash-1:rgba(255,255,255,.06); --m-wash-2:rgba(255,255,255,.06); --m-wash-3:rgba(255,255,255,.06); --m-wash-4:rgba(255,255,255,.06); --m-wash-5:rgba(255,255,255,.06); --m-wash-6:rgba(255,255,255,.06);
      --m-pill:rgba(255,255,255,.10); --m-pill-c:#c5cee0; --m-chip-on:#F2F3F7; --m-chip-on-c:#12203c;
      --m-tb-bg:rgba(23,28,46,.80); --m-tb-on:#9db1d4;
      --m-glow:rgba(157,177,212,.14); --m-wash1:transparent; --m-wash2:transparent;
      --m-sheet-sh:0 -12px 40px rgba(0,0,0,.5); --m-fab-sh:0 10px 24px rgba(0,0,0,.45); --m-card-sh:none;
      --m-frame:#2A3148; --m-knob:#FFFFFF; --m-knob-sh:0 1px 2px rgba(0,0,0,.45); --m-veil:rgba(6,9,18,.62);
      --m-gold:#c8a24a; --m-plate:#F8F9FB; --m-r:20px; --m-r-sm:14px;
    }
  }
  /* ── ③ 수동 다크 — ②와 바이트 단위로 같은 선언(전처리기가 없어 중복 · smoke_mtheme ③이 집합 일치를 고정) ── */
  html[data-mtheme=dark]{
    color-scheme:dark;
    --m-bg:#0E1220; --m-bg2:#161C30; --m-surface:#171C2E; --m-top:rgba(14,18,32,.80);
    --m-glass:rgba(255,255,255,.06); --m-glass-fb:#171C2E; --m-glass-b:rgba(255,255,255,.10);
    --m-ink:#F2F3F7; --m-ink2:#c5cee0; --m-mute:#93a1bd; --m-line:rgba(255,255,255,.10);
    --m-acc:#9db1d4; --m-acc-ink:#12203c; --m-acc-soft:rgba(157,177,212,.16); --m-num:#FFFFFF;
    --m-danger:#FF8A80; --m-danger-soft:rgba(255,138,128,.14); --m-ok:#86d9a8; --m-ok-soft:rgba(134,217,168,.14); --m-warn:#F0A36A; --m-warn-soft:rgba(240,163,106,.16);
    --m-wash-1:rgba(255,255,255,.06); --m-wash-2:rgba(255,255,255,.06); --m-wash-3:rgba(255,255,255,.06); --m-wash-4:rgba(255,255,255,.06); --m-wash-5:rgba(255,255,255,.06); --m-wash-6:rgba(255,255,255,.06);
    --m-pill:rgba(255,255,255,.10); --m-pill-c:#c5cee0; --m-chip-on:#F2F3F7; --m-chip-on-c:#12203c;
    --m-tb-bg:rgba(23,28,46,.80); --m-tb-on:#9db1d4;
    --m-glow:rgba(157,177,212,.14); --m-wash1:transparent; --m-wash2:transparent;
    --m-sheet-sh:0 -12px 40px rgba(0,0,0,.5); --m-fab-sh:0 10px 24px rgba(0,0,0,.45); --m-card-sh:none;
    --m-frame:#2A3148; --m-knob:#FFFFFF; --m-knob-sh:0 1px 2px rgba(0,0,0,.45); --m-veil:rgba(6,9,18,.62);
    --m-gold:#c8a24a; --m-plate:#F8F9FB; --m-r:20px; --m-r-sm:14px;
  }

  /* ── ④ 브리지 — PC 토큰 이름 → --m-* (로그인 화면 래퍼 .shell + body 직계 보조 요소만 · .hero-screen 제외) ── */
  .shell,.skip-link,.urgent-bar,.ln-host{
    --bg:var(--m-bg); --surface:var(--m-glass-fb); --surface-2:var(--m-glass-b); --surface-3:var(--m-glass-fb);
    --ink:var(--m-ink); --ink-soft:var(--m-ink2); --muted:var(--m-mute);
    --line:var(--m-line); --line-soft:var(--m-line);
    --brand:var(--m-acc); --brand-strong:var(--m-acc); --brand-ink:var(--m-ink); --brand-2:var(--m-acc); --navy-soft:var(--m-acc-soft);
    --gold:var(--m-acc); --gold-strong:var(--m-acc); --gold-soft:var(--m-acc-soft); --gold-line:var(--m-glass-b); --gold-ink:var(--m-acc);
    --ok:var(--m-ok); --ok-bg:var(--m-ok-soft); --ok-line:transparent;
    --warn:var(--m-warn); --warn-bg:var(--m-warn-soft); --warn-line:transparent;
    --danger:var(--m-danger); --danger-bg:var(--m-danger-soft); --danger-line:transparent;
    /* 웰스페이 와인색(QA 2026-08-31 🔴1) — 다크에서 진와인은 안 보인다 → 모바일 danger 톤으로 브리지 */
    --wine:var(--m-danger); --wine-bg:var(--m-danger-soft); --wine-line:transparent;
    --team:var(--m-ink2); --team-bg:var(--m-pill); --team-line:transparent;
    --sh-1:var(--m-card-sh); --sh-2:var(--m-card-sh); --sh-3:var(--m-sheet-sh); --ring:0 0 0 3px var(--m-acc-soft);
    --wash-cream:var(--m-wash-1); --wash-sky:var(--m-wash-2); --wash-mint:var(--m-wash-3);
    --wash-lilac:var(--m-wash-4); --wash-peach:var(--m-wash-5); --wash-sand:var(--m-wash-6);
    --r:var(--m-r-sm); --r-lg:var(--m-r);
  }

  /* ── ⑤ 컴포넌트 ── */
  /* 바탕·글자(body는 .shell 밖이라 직접) · 링크·포커스 */
  body{background:var(--m-bg);color:var(--m-ink)}
  /* ⚠ 링크색은 브리지(a{color:var(--brand)} → --m-acc)가 처리한다 — 여기서 `.shell a{color}`를 쓰면 (0,1,1)이
     .totop·.btn 같은 (0,1,0) 글자색을 이겨 글자=배경색이 된다(QA 🔴2 · 2026-08-29 회귀). 다시 넣지 말 것. */
  .skip-link,.skip-link:focus{background:var(--m-acc);color:var(--m-acc-ink)}
  /* 상단바 — 1차는 position:static 유지(1283행 · sticky는 (c)에서 앵커 여백 3곳과 함께) · 유리 */
  .mainbar{background:var(--m-glass-fb);border-bottom:1px solid var(--m-line)}
  .mainbar .mb-title{color:var(--m-ink)}
  .mbq,.mbq svg,.mb-tools>.lock-left{color:var(--m-ink2)}
  .mbq{background:transparent;border-color:transparent}
  .mb-tools>.lock-left b{color:var(--m-ink)}
  .mb-tools>.lock-left.warm,.mb-tools>.lock-left.warm b{color:var(--m-warn)}
  .mb-tools>.lock-left.hot,.mb-tools>.lock-left.hot b{color:var(--m-danger)}
  .mbq.on svg{color:var(--m-acc-ink)}
  .mbq-n{color:var(--m-acc-ink)}                            /* danger 면 위 글자 — 다크 #FF8A80 위 #fff는 2.3:1 */
  .urgent-bar{color:var(--m-acc-ink)}                       /* 의미색 빨강 위 글자 — 다크의 밝은 빨강에는 흰 글자가 안 보인다 */
  /* 탭바 — 유리 바 하나(떠 있는 알약 없음) · 활성 글자 + 아래 골드 점 4px(골드 사용처 ①) */
  .mtabbar{background:var(--m-glass-fb);border-top:1px solid var(--m-line)}
  .mtabbar>a,.mtabbar>label.mtab-more{color:var(--m-mute)}
  .mtabbar>a[aria-current="page"]{color:var(--m-tb-on)}
  .mtabbar .mt-dot{width:4px;height:4px;border-radius:50%;background:var(--m-gold)}
  .mtabbar>a[aria-current="page"] .mt-dot{transform:none}
  /* 유리 카드 — blur 없이 알파만. 지원 안 하면 불투명 폴백 */
  .card,.stat,.kpi,.axc,.clic,.fpsc,.mkt-card,.pol-card,.dash .card,.dash .stat{
    background:var(--m-glass-fb);border:1px solid var(--m-glass-b);box-shadow:var(--m-card-sh)}
  /* PC가 hex 리터럴로 칠한 면들(브리지가 못 잡는다): KPI 그라데이션 · 카톡 안내 배너 · 개편 카드 · 심의 폼 */
  .kpi::before{background:var(--m-acc)}
  .kpi .n{color:var(--m-num)}
  .rf-card,.lib-review-form{background:var(--m-glass-fb)}
  .ka-banner{background:var(--m-acc);color:var(--m-acc-ink)}
  .card{border-radius:var(--m-r)}
  .axc,.clic,.fpsc,.pol-card{border-radius:var(--m-r-sm)}
  .bdc,.libc,.ntc{border-color:transparent}                  /* 워시 순환 카드 — 배경은 .wash-*(브리지)가 정한다 */
  .card a.bdc,.card a.ntc,.card a.clic{color:inherit}
  .card.accent{border-left:4px solid var(--m-acc)}
  .card.warnline,.dash .card.warnline{border-left:3px solid var(--m-warn)}
  /* 히어로(대시보드 첫 카드 = KPW 일정) — 그라데이션 한 선언 + 글로우 원 1개 */
  .dash-top>#calendar{position:relative;isolation:isolate;overflow:hidden;
    background:linear-gradient(160deg,var(--m-bg2) 0%,var(--m-glass-fb) 100%)}
  .dash-top>#calendar::after{content:"";position:absolute;z-index:-1;right:-60px;top:-60px;width:200px;height:200px;border-radius:50%;
    pointer-events:none;background:radial-gradient(circle,var(--m-glow),transparent 70%)}
  /* 지표 띠 — 골드 룰 없음 · 셀 = 유리 · 숫자 --m-num(라이트 네이비 · 다크 흰색 — 골드 금지) */
  .stat-strip{box-shadow:none}
  .stat-strip .stat{background:var(--m-glass-fb);border:0}
  .stat-strip .s-label,.stat-strip .s-value .u{color:var(--m-mute)}
  .stat-strip .s-value{color:var(--m-num)}
  .stat-strip .s-value.is-zero{color:var(--m-mute)}
  .stat-strip .s-value[style]{color:var(--m-danger)!important}     /* 알림 인라인 danger — 인라인은 !important 외엔 못 이긴다 */
  /* 칩(대분류 띠 · sticky라 blur 허용) · 활성 칩 */
  .tabs{background:var(--m-glass-fb);border-color:var(--m-line);box-shadow:none}
  .tabs a{color:var(--m-ink2)}
  .tabs a:hover{background:var(--m-glass-b);color:var(--m-ink)}
  .tabs a:target,.tabs a.active{background:var(--m-chip-on);color:var(--m-chip-on-c)}
  .subchips .chip.on,.d13-tab.on{background:var(--m-chip-on);border-color:var(--m-chip-on);color:var(--m-chip-on-c)}
  .subchips .chip.on .badge,.d13-tab.on .badge{background:transparent;color:inherit;border-color:currentColor}
  .tabnav{background:transparent;border-color:var(--m-line)}
  .tabnav-label{color:var(--m-mute)}
  /* 배지 — 의미색은 브리지 · 중립은 --m-pill · 골드 면 금지 · 등급(navy)·고정(gold)·필독(danger)에만 골드 헤어라인(골드 사용처 ③) */
  .badge.gray{background:var(--m-pill);color:var(--m-pill-c);border-color:transparent}
  .badge.navy,.badge.gold{background:var(--m-acc-soft);color:var(--m-acc);border-color:transparent}
  .badge.navy,.badge.gold,.dash .side-row .badge.danger{box-shadow:inset 0 0 0 1px var(--m-gold)}
  /* 버튼 — 면은 acc 단색(골드 그라데이션 금지) · ghost는 유리 · danger는 소프트 */
  .btn{--b:var(--m-acc);--bh:var(--m-acc);color:var(--m-acc-ink);box-shadow:none}
  .btn:hover{color:var(--m-acc-ink)}
  .btn.gold,.btn.gold:hover{background:var(--m-acc);color:var(--m-acc-ink);box-shadow:none}
  .btn.ghost{background:var(--m-glass);border-color:var(--m-glass-b);color:var(--m-ink);box-shadow:none}
  .btn.ghost:hover{background:var(--m-glass-b);color:var(--m-ink)}
  .btn.danger,.btn.danger:hover{background:var(--m-danger-soft);color:var(--m-danger);border-color:transparent}
  /* 폼 — 유리 입력 · placeholder는 --m-mute · 네이티브 피커·체크박스는 color-scheme이 따라 바꾼다 */
  input,select,textarea{background:var(--m-glass);border-color:var(--m-glass-b);color:var(--m-ink);border-radius:var(--m-r-sm)}
  input:hover,select:hover,textarea:hover{border-color:var(--m-mute)}
  input::placeholder,textarea::placeholder{color:var(--m-mute)}
  input[type=radio],input[type=checkbox]{accent-color:var(--m-acc)}
  .dh-search input{background:var(--m-glass);border-color:var(--m-glass-b);box-shadow:none}
  /* 시트·모달·덮개 — 불투명 면(--m-surface) · blur 없음 */
  .msheet,.cal-manage{background:var(--m-surface);box-shadow:var(--m-sheet-sh);border-top:1px solid var(--m-line)}
  .notice-modal,.ln-box{background:var(--m-surface);border-top-color:var(--m-acc)}
  .msheet-veil,.cm-veil,.notice-modal-wrap,.ln-veil{background:var(--m-veil)}
  .msheet-grab,.cm-grab{background:var(--m-line)}
  .msheet-t,.cm-title,.notice-modal h2,.ln-t{color:var(--m-ink)}
  .notice-modal .nm-head{color:var(--m-acc)}
  .msheet-list a{color:var(--m-ink);border-bottom-color:var(--m-line)}
  .msheet-list a:active{background:var(--m-glass)}
  .msheet-list .ico svg{color:var(--m-mute)}
  /* 화면 모드 토글 버튼(상단바 알림 옆 · base.html .mbq-theme) — 판정 밖 기본 display:none(PC는 테마 없음) · 해/달은 aria-pressed로 */
  .mbq-theme{display:inline-flex;font:inherit;cursor:pointer;color:var(--m-ink2)}
  .mbq-theme .mt-moon{display:none}
  .mbq-theme[aria-pressed="true"] .mt-sun{display:none}
  .mbq-theme[aria-pressed="true"] .mt-moon{display:block}
  .msheet-note{margin-top:10px;font-size:var(--fs-note);color:var(--m-mute);text-align:center}
  /* 달력 — 요일 머리는 글자만 · 부채·일요일은 의미색 · 오늘 숫자 원은 acc(오늘·선택 칸 골드 테두리는 [4]에서) */
  table.cal th{background:transparent;color:var(--m-mute)}
  table.cal th.sun{color:var(--m-danger)}
  .cal-page>.cal-daypanel{border-left:3px solid var(--m-acc)}
  /* 달력 칩·칸 글자가 PC hex 리터럴(#0b5c30 초록 · #8a6516 골드 · #c0392b/#3b6fd4 요일)이라 브리지가 못 잡는다(QA: 다크 '개인' 칩 미가독) */
  .cal-filter a.on.priv,.cal-item.priv,.cal-item.priv a{color:var(--m-ok)}
  .cal-filter a.on.meet,.cal-item.meet,.cal-item.meet a,.pc-appt.soon{color:var(--m-acc)}
  .cal-filter a.on.co{color:var(--m-acc)}
  .cal-filter a.off{color:var(--m-ink2);border-color:var(--m-line);background:var(--m-glass)}
  .cal-day.sun{color:var(--m-danger)}
  .cal-day.sat,table.cal th.sat{color:var(--m-acc)}
  .cal-item.co{border-color:var(--m-glass-b)}               /* PC 리터럴 #d3ddf0 */
  .ka-banner .ka-go{background:var(--m-acc-ink);color:var(--m-acc)}
  .cal-nav>.cn-today{background:var(--m-acc);color:var(--m-acc-ink)}
  /* 리포트 표 머리(브리지로 면이 acc가 된다 → 글자도 짝을 맞춘다) */
  .bs-table .bs-head th,.bs-table .bs-total td{color:var(--m-acc-ink)}
  /* 서버 SVG 차트(파이썬 팔레트 네이비·골드 고정) — 색을 바꾸지 않고 **밝은 접시** 위에 둔다(F12 · 양 모드 동일) */
  /* 서버 차트는 전부 width= 속성이 있고(charts.py) 아이콘은 .icn(width 없음) — 클래스 없는 <div> 안의 도넛(고객상세·금융자산·투자)도 잡힌다((b) 프로브) */
  .container svg[width]:not(.icn){background:var(--m-plate);border-radius:var(--m-r-sm)}
  .mkt-card svg{background:transparent}                     /* 시세 스파크라인은 접시 없이(카드 자체가 면) */
  /* 인사말 바탕 워시 원 2개(다크는 transparent) */
  .dash-head::before{background:radial-gradient(circle at 50% 50%, var(--m-wash1) 0%, transparent 68%)}
  .dash-head::after{background:radial-gradient(circle at 50% 50%, var(--m-wash2) 0%, transparent 68%)}
  /* 유리(알파) + blur — 지원 기기에서만. 카드는 알파만, blur는 고정 요소(상단바·탭바·sticky 칩 띠)만 */
  @supports ((-webkit-backdrop-filter:blur(1px)) or (backdrop-filter:blur(1px))){
    .card,.stat,.kpi,.axc,.clic,.fpsc,.mkt-card,.pol-card,.dash .card,.dash .stat,.stat-strip .stat{background:var(--m-glass)}
    .mainbar{background:var(--m-top);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}
    .mtabbar{background:var(--m-tb-bg);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}
    .tabs{background:var(--m-top);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}
  }
}

/* [9] ══ 📱 60fps 인터랙션 5건(2026-08-29 (c) · 스펙 검수결과/60fps채택시안_20260828.html · JS는 static/js/mobile_fx.js) ══
   전부 모바일 판정 안 · PC·인쇄 무변경 · 움직임은 transform/opacity(+폭 transition 1개) · reduced-motion은 전역 규칙(*{animation:none})이 전부 끈다.
   ① 행 추가 .is-new  ② 저장 버튼 .fx-savebar/.fx-save(폼 안 sticky)  ③ 확인 시트 .fxs-*  ④ 복사됨 플립 .fx-ch  ⑤ 빈 상태 순차 등장 */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  /* ① 새 행 — 14px 아래에서 220ms · placeholder는 --m-mute(브리지 --muted) */
  #othertbl tr.is-new{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  /* ② 저장 버튼 — 폼 안 sticky(탭바 위) · pill 96px ↔ 풀폭 · 문구는 두 span 교차 opacity(레이아웃 점프 없음)
     ⚠ .intake-bar(고정 바)도 같은 규칙으로 덮는다 — 특이도 (0,2,1) > (0,1,0). JS가 없으면 보통 버튼 그대로(body.fx-sticky가 없다) */
  body.fx-sticky form .fx-savebar{position:sticky;bottom:calc(74px + env(safe-area-inset-bottom,0px));z-index:34;
    display:flex;justify-content:flex-end;align-items:center;gap:8px;margin:12px 0 0;padding:0;background:transparent;border:0;box-shadow:none;pointer-events:none}
  body.fx-sticky form .fx-savebar>*{pointer-events:auto}
  body.fx-sticky .totop{right:auto;left:14px}                          /* 저장 pill이 우하단이라 '맨 위로'는 왼쪽으로(달력 FAB와 같은 규칙) */
  body.fx-sticky .fx-savebar .hint,body.fx-sticky .fx-savebar .btn.ghost{display:none}   /* pill 상태에선 저장 하나만(취소·안내는 폼 머리에 있다) */
  body.fx-sticky .fx-savebar.full .btn.ghost{display:inline-flex}
  body.fx-sticky .fx-save{position:relative;width:96px;min-height:44px;justify-content:center;border-radius:var(--r-pill);
    box-shadow:var(--m-fab-sh);transition:width var(--mo-base) var(--ease-out),border-radius var(--mo-base) var(--ease-out);overflow:hidden;white-space:nowrap}
  body.fx-sticky .fx-save .fx-l,body.fx-sticky .fx-save .fx-s{transition:opacity var(--mo-base) var(--ease-out)}
  body.fx-sticky .fx-save .fx-l{opacity:0;position:absolute;inset:0;display:flex;align-items:center;justify-content:center}
  body.fx-sticky .fx-save .fx-s{opacity:1}
  body.fx-sticky .fx-savebar.full{justify-content:stretch}
  body.fx-sticky .fx-savebar.full .fx-save{width:100%;flex:1 1 auto;border-radius:var(--m-r-sm);box-shadow:none}
  body.fx-sticky .fx-savebar.full>span{flex:1 1 auto}                 /* intake의 버튼 묶음 span도 늘린다(안 늘리면 100%가 66px) */
  body.fx-sticky .fx-savebar.full .fx-save .fx-l{opacity:1}
  body.fx-sticky .fx-savebar.full .fx-save .fx-s{opacity:0}
  /* ③ 확인 시트 — 시트 토큰 재사용(--m-surface·--m-veil·--m-sheet-sh) · 상단 룰은 accent(골드 면 금지) · 3/3 전까지 버튼은 회색 */
  .fxs-host{position:fixed;inset:0;z-index:95;pointer-events:none}
  .fxs-veil{position:absolute;inset:0;background:var(--m-veil);opacity:0;transition:opacity var(--mo-base)}
  .fxs{position:absolute;left:0;right:0;bottom:0;max-height:88vh;overflow-y:auto;background:var(--m-surface);border-radius:18px 18px 0 0;
    border-top:3px solid var(--m-acc);box-shadow:var(--m-sheet-sh);padding:8px 16px calc(16px + env(safe-area-inset-bottom,0px));
    transform:translateY(102%);transition:transform var(--mo-base) var(--ease-out)}
  .fxs-host.on .fxs{transform:none}                      /* on은 호스트에 붙는다(JS) */
  body.fxs-open .fxs-host{pointer-events:auto}
  body.fxs-open .fxs-veil{opacity:1}
  .fxs-grab{width:38px;height:4px;border-radius:2px;background:var(--m-line);margin:2px auto 12px}
  .fxs-t{font-size:var(--fs-md);font-weight:800;color:var(--m-ink);margin:0 0 4px;overflow-wrap:anywhere}
  .fxs-sub{font-size:var(--fs-cap);color:var(--m-mute);margin:0 0 10px}
  .fxs-row{display:flex;gap:10px;align-items:flex-start;min-height:44px;padding:8px 0;margin:0;border-top:1px solid var(--m-line);
    font-size:var(--fs-body-sm);font-weight:500;color:var(--m-ink);cursor:pointer;-webkit-tap-highlight-color:transparent}
  .fxs-row input[type=checkbox]{width:22px;height:22px;flex:none;margin-top:2px;accent-color:var(--m-ok)}
  .fxs-row span{overflow-wrap:anywhere}
  .fxs-cnt{font-size:var(--fs-note);color:var(--m-mute);text-align:right;margin:4px 0 10px;font-variant-numeric:tabular-nums}
  .fxs-act{display:flex;gap:8px;flex-wrap:wrap}
  .fxs-act .btn{flex:1 1 140px;min-height:46px;justify-content:center}
  /* ⚠ .btn.danger(0,2,0)를 이기려면 .fxs-act를 붙인다 — 3/3 전엔 위험색이 없어야 한다('읽기 전엔 빨강 없음') */
  .fxs-act .fxs-ok{background:var(--m-pill);color:var(--m-mute);border-color:transparent;transition:background var(--mo-base) var(--ease-out),color var(--mo-base) var(--ease-out)}
  .fxs-act .fxs-ok:disabled{opacity:1;cursor:not-allowed}
  .fxs-act .fxs-ok:not(:disabled){background:var(--m-danger);color:var(--m-acc-ink)}
  /* ④ 복사 버튼 글자 플립 — rotateX 150ms · 글자당 30ms(JS가 transition-delay) · 완료는 --m-ok-soft/--m-ok */
  [data-copy]{white-space:nowrap}
  [data-copy] .fx-ch{display:inline-block;transition:transform var(--mo-fast) var(--ease-out),opacity var(--mo-fast) var(--ease-out);
    transform-origin:50% 50%;backface-visibility:hidden}
  [data-copy] .fx-ch.in{transform:rotateX(-90deg);opacity:0}
  [data-copy].fx-out .fx-ch{transform:rotateX(90deg);opacity:0}
  [data-copy].fx-in .fx-ch.in{transform:none;opacity:1}
  [data-copy].is-copied{background:var(--m-ok-soft);color:var(--m-ok);border-color:transparent}
  /* ⑤ 빈 상태 — 제목 → 설명 → CTA 순차(220ms · 80ms 스태거) · 글자만 있는 .empty는 블록 하나 · 아이콘 원은 마크업 없음(카피는 기존 그대로) */
  .empty,.empty-box,.cal-empty,td.empty-cell{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  .empty-box>*{animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
  .empty-box>*:nth-child(2){animation-delay:80ms}
  .empty-box>*:nth-child(3){animation-delay:160ms}
  .empty-box>*:nth-child(4){animation-delay:240ms}
}

/* ── 📱 3파트 감사 반영(2026-09-02 · 검수결과/3파트감사_20260902_ERP모바일.md · 기준 md5 갱신) ── */
/* ① clients 진행단계 select 잘림 — 브라우저 기본 select 폭이 셀보다 커 "1. 파("로 잘렸다(.tx-table 611행과 같은 수법) */
/* ② 관리자 지표 복원 — 스크롤바 숨긴 스냅 띠 뒤의 4·5칸(활동 설계사·전체 관리자산)이 '없는 것'으로 읽혔다 → 2행(3+2)으로 전부 노출 */
/* ③ 고객 상세 실행 버튼 20여 개 기본 접힘 — 요약 카드가 첫 화면에. 문법은 대시보드 .dtg-tgl과 동일(JS 0) */
.cdt-lbl{display:none}   /* 접기 라벨은 모바일 판정 안에서만 — PC는 [P1]이 .cd-tabs째 숨기고, 인쇄는 .cdt-body 기본 표시라 무변경 */
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .cli-table select.qs{width:100%;min-width:0}
  .stat-strip{flex-wrap:wrap;overflow-x:hidden}
  .stat-strip::after{content:none}
  .stat-strip .stat{flex:1 1 calc((100% - 2px - 12px)/3)}
  .cd-tabs{margin:0 0 12px}
  .cd-tabs .cdt-lbl{display:flex;align-items:center;gap:8px;min-height:44px;margin:0;padding:10px 12px;background:var(--surface);border:1px solid var(--line);border-radius:var(--m-r-sm);font-size:var(--fs-body-sm);font-weight:700;color:var(--ink);cursor:pointer;-webkit-tap-highlight-color:transparent}
  .cd-tabs .cdt-sub{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:var(--fs-note);font-weight:400}
  .cd-tabs .cdt-chev{color:var(--ink-soft);font-weight:800;transition:transform var(--mo-base) var(--ease-out)}
  .cd-tabs .cdt-tgl:checked ~ .cdt-lbl .cdt-chev{transform:rotate(90deg)}
  .cd-tabs .cdt-tgl:not(:checked) ~ .cdt-body{display:none}
  .cd-tabs .cdt-tgl:checked ~ .cdt-body{padding-top:10px;animation:kpwSlideUp var(--mo-base) var(--ease-out) both}
}

/* 📅 고객 요약 접이식(2026-09-07 대표 "이름 밑에 접었다 펼쳤다 … 기본은 접혀 있되").
   예전 .cd-panel은 1400px 이상에서만 뜨는 오른쪽 세로 패널이라 왼쪽 자산내역·인적사항을 좁혔다.
   이제 폭을 차지하지 않는 가로 한 줄이다. ⚠ 규칙은 **한 줄로** 쓴다 — 줄을 나누면 기준선 검사가
   이어짐 줄을 새 규칙으로 본다(2026-09-07에 실제로 걸렸다). ⚠ [P2] 다크 블록보다 앞에 둔다. */
.cp-fold{display:block;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:0;margin:0 0 14px}
.cp-sum{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;cursor:pointer;padding:9px 14px;font-size:13px;list-style:none}
.cp-sum::-webkit-details-marker{display:none}
.cp-sum::before{content:"+";color:var(--muted);font-weight:700;font-size:13px;width:12px;text-align:center}
.cp-fold[open] .cp-sum::before{content:"−"}
.cp-sum b{font-size:14px}
.cp-sum-v{color:var(--ink-soft)}
.cp-sum-v.gold{color:var(--gold-strong);font-weight:600}
.cp-fold[open] .cp-sum{border-bottom:1px solid var(--line)}
.cp-fold .hair{width:40px;height:1px;background:var(--gold);margin:10px 14px 6px}
.cp-fold .cp-row{display:flex;gap:10px;align-items:center;justify-content:space-between;padding:5px 14px;font-size:13px}
.cp-fold .cp-k{color:var(--muted);white-space:nowrap}
.cp-fold .cp-v{text-align:right;min-width:0}
.cp-fold .cp-sec{padding:8px 14px 2px;font-size:12px;color:var(--muted);font-weight:600}
.cp-fold .cp-last{padding:0 14px 10px;font-size:12.5px}
.cp-fold .cp-owner{padding:0 14px 10px;font-size:12.5px}
.cp-appt{padding:2px 0 10px;border-top:1px dashed var(--line);margin-top:6px}
.cp-appt .hint{padding:0 14px}

/* ⚠ [P2] PC 다크 블록은 **파일 맨 끝**에 있어야 한다(다크 재정의가 마지막에 이겨야 하므로).
   그 뒤에 새 규칙을 붙이면 smoke_pcdark가 잡는다 — 2026-09-04에 비품관리·브리핑 CSS가
   [P2] 뒤에 붙어 실제로 실패했고, 아래처럼 [P2] **앞으로** 옮겼다. 새 규칙은 여기까지만. */
/* ---------- 📞 모바일 전용 인라인 요소(2026-09-04) — 전화 링크는 PC 웹에서 지운다(대표 지시).
   판정 조건은 사이드바 모바일 규칙과 **같은 한 조건**(820px / coarse 1100px)만 쓴다. ---------- */
.m-only-i{display:none !important}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .m-only-i{display:inline-flex !important}
  .pc-only-i{display:none}
}
/* ---------- 📧 이메일 대시보드(/email · 2026-09-04) ---------- */
.mailx-grid{display:grid;grid-template-columns:190px minmax(0,1fr);gap:14px;align-items:start;margin-top:12px}
.mailx-nav{display:flex;flex-direction:column;gap:2px;padding:8px}
/* 지금 열린 메일함이 누구 것인지(2026-09-04) — 같은 주소가 두 아이디에 걸리면 남의 메일함이 열린다 */
.mailx-who{padding:6px 10px 8px;border-bottom:1px solid var(--line);margin-bottom:6px;
  font-size:12.5px;font-weight:700;color:var(--ink)}
.mailx-who-a{display:block;font-weight:400;font-size:11.5px;color:var(--muted);
  word-break:break-all;margin-top:2px}
.mailx-nav a{display:block;padding:8px 10px;border-radius:8px;color:var(--ink-soft);text-decoration:none;font-weight:600;font-size:13.5px}
.mailx-nav a:hover{background:var(--navy-soft);color:var(--brand-ink);text-decoration:none}
.mailx-nav a.active{background:var(--brand);color:var(--on-brand)}
.mailx-nav-sep{border-top:1px solid var(--line);margin:6px 4px}
.mailx-main{min-width:0}
.mailx-2col{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:start}
.mailx-list{width:100%;border-collapse:collapse;font-size:13px}
.mailx-list td{padding:6px 4px;border-top:1px dashed var(--line);vertical-align:top}
.mailx-list tr:first-child td{border-top:0}
.mailx-from{width:34%;color:var(--ink-soft);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px}
.mailx-date{width:1%;white-space:nowrap;font-size:12px}
.mailx-clients{display:flex;flex-direction:column;gap:4px;max-height:52vh;overflow:auto}
.mailx-client{display:flex;flex-direction:column;padding:7px 10px;border:1px solid var(--line);border-radius:8px;text-decoration:none;color:inherit;background:var(--surface)}
.mailx-client:hover{border-color:var(--brand);text-decoration:none}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .mailx-grid{grid-template-columns:minmax(0,1fr)}
  .mailx-nav{flex-direction:row;flex-wrap:wrap}
  .mailx-nav-sep{display:none}
  .mailx-2col{grid-template-columns:minmax(0,1fr)}
  .mailx-list .mailx-date{display:none}
}
/* ---------- 🧰 비품관리(/company/assets · 2026-09-04) ---------- */
.cox-grid{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:14px;align-items:start}
/* 🔴 그리드 자식은 기본 min-width:auto라 **표가 넓으면 칸이 늘어난다** — .table-scroll이 감싸도
   화면 전체가 가로로 밀린다(2026-09-04 실측: 500px에서 문서 폭 606). 0으로 눌러야 표가 스스로 스크롤한다. */
.cox-grid>*{min-width:0}
.cox-table td,.cox-table th{vertical-align:top}
.cox-table .btn{white-space:nowrap}
.cox-decide{display:flex;gap:4px;align-items:center;margin:0;flex-wrap:wrap}
.cox-decide input[type=text]{flex:1;min-width:120px;padding:4px 8px;font-size:12px}
/* 강조행(선택한 품목·오늘 이용) — 인라인 style 대신 클래스로. 강조 위 보조 글자는 --muted가 아니라
   --ink-soft를 써야 AA를 넘긴다(파스텔 워시 위 소형 글자 대비 사고와 같은 계열 · 2026-09-04 QA). */
.cox-hit{background:var(--gold-soft)}
.cox-hit .hint,.cox-hit .muted{color:var(--ink-soft)}
/* 사용 수칙(대장 메모) — 빌리는 사람이 읽어야 하는 줄이라 힌트보다 진하게 */
.cox-rule{font-size:12px;color:var(--ink-soft);margin-top:2px}
/* 반납 보고 폼 줄 — 표 안에서 한 칸을 통으로 쓰는 접이식 영역 */
.cox-ret{background:var(--surface-2);border-top:1px dashed var(--line)}
.cox-ret .row>div{min-width:120px}
.cox-ret summary{cursor:pointer;color:var(--brand-ink)}
/* 품목 열은 이름+규격+수칙+취득이 겹쳐 들어가 좁으면 글자가 세로로 쌓인다 */
.cox-table td:first-child,.cox-table th:first-child{min-width:190px}
@media screen and (max-width:820px), screen and (pointer:coarse) and (max-width:1100px){
  .cox-grid{grid-template-columns:minmax(0,1fr)}
}

/* 📅 브리핑 투자 파트 — 다가오는 증시 일정(2026-09-04) · 기사 카드와 구분되는 옅은 판 */
.bf-mkt{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2);
  padding:10px 12px;margin:0 0 10px}
.bf-mkt-h{display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap}
.bf-mkt-l{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-direction:column;gap:5px}
.bf-mkt-l li{display:flex;align-items:baseline;gap:7px;flex-wrap:wrap;font-size:13px;color:var(--ink)}
.bf-mkt-d{color:var(--ink-soft);font-size:12px;font-variant-numeric:tabular-nums}
.bf-chip-ev{margin-left:4px;font-size:11.5px;color:var(--ink-soft)}
@media screen and (max-width:640px){
  .bf-mkt-l li{gap:5px}
  .bf-mkt-l li .fs-cap{flex-basis:100%}
}

/* [N1] ═══ 사이드바 개편(2026-09-08 · 대표 승인 · 시안_사이드바_UI_20260907.md 2안「3존 워크벤치」+ 공통 패치 · 실측 대응 D/E) ═══
   원칙: 26줄이 전부 같은 모양이라 소속(오늘/고객/회사·자료)이 안 보이는 **균질함**이 문제 → 존 배경·라벨 2층·활성 판으로 푼다.
   ⚠ 이 블록은 **덧쓰기**다 — 앞 구역(136~183 · 943~960 · 2196~2270)의 원본 줄을 지우지 않고 특정도를 한 단 올려 이긴다
     (smoke_pcdesign '원본 줄 삭제 0' 규율). 죽은 규칙 2건(묶음 라벨 10.5px/.14em · 단계 색 #8a97b4)은 여기서 되살린 값이 이긴다.
   ⚠ [P2] 다크는 파일 끝 고정 — 이 블록은 반드시 그 **앞**에 둔다(pcdark-p2-must-be-last). 알파 판(rgba 흰)은 배경 무관해 다크 추가 규칙 불요.
   골드는 여전히 3곳 규칙 안: 활성 좌 3px 바(①) + 고객존 카드 헤어라인이 ③(2단계 패널 헤어라인) 자리를 승계. */
:root{ --side-zone:rgba(255,255,255,.045); --side-zone-line:rgba(255,255,255,.09); }
/* ── 스크롤바 다이어트(D③) — 폭 17→8px · scrollbar-gutter로 유무에 따른 레이아웃 점프 방지 ── */
.sidebar{scrollbar-width:thin;scrollbar-gutter:stable}
.sidebar::-webkit-scrollbar{width:8px}
.sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:4px}
/* ── 구역 제목(오늘 · 고객 · 회사·자료) — 클릭 안 되는 소제목. 묶음 라벨과 같은 층(11.5px·.06em) ── */
.sidebar .side-zone-t{padding:14px 12px 4px;font-size:11.5px;letter-spacing:.06em;color:var(--side-label)}
/* ── 오늘존: 살짝 밝은 판 — "여기가 시작점". 옛 밑선(.side-quick border-bottom)은 판이 대신한다 ── */
.sidebar .side-quick{background:var(--side-zone);border:1px solid var(--side-zone-line);
  border-radius:var(--r-sm);padding:6px;margin-bottom:2px;border-bottom:1px solid var(--side-zone-line)}
/* ── 죽은 규칙 살리기 ①: 묶음 라벨은 .side-sec 값(11.5px·.06em) — .side-grp>summary(10.5px·.14em)가 이기고 있었다 ── */
.sidebar .side-grp>summary{font-size:11.5px;letter-spacing:.06em;padding:12px 11px 6px}
/* ── 묶음 경계 — 여백 대신 헤어라인(D6). 고객 카드 뒤 첫 서랍은 구역 제목이 경계라 선을 안 긋는다 ── */
.sidebar .side-grp:not(.side-grp-pin)+.side-grp{border-top:1px solid rgba(255,255,255,.07);margin-top:2px}
/* ── 서랍 항목: 한 단 아래(13px·500) + 아이콘 다이어트 — 매일 쓰는 층(오늘존 14px·700)이 물리적으로 더 크고 진하다 ── */
.sidebar .side-grp:not(.side-grp-pin) .side-nav a{font-size:13px;font-weight:500;padding-top:7px;padding-bottom:7px}
.sidebar .side-grp:not(.side-grp-pin) .side-nav a .ico{display:none}   /* ⚠ 고객 카드(.side-grp-pin)는 제외 — 화면 줄 패딩·방패 아이콘이 여기 규칙에 먹혔다(09-09 실측) */
.sidebar .side-quick a{font-weight:700}
.sidebar .side-cust a{font-weight:700}
/* ── 고객존: 골드 헤어라인 카드 — "지금 이 고객을 다루는 중"이 한 덩어리로 보인다 ── */
.sidebar .side-grp-pin{background:rgba(255,255,255,.03);border:1px solid rgba(200,162,74,.28);
  border-radius:var(--r-sm);padding:2px 4px 6px;margin:4px 0 8px}
/* 이름 줄 = 카드 헤더. 9.5px 아이브로 '상담 중인 고객'을 얹어 이름의 역할을 선언한다(::before — 전역 ＋/－ 마커 규칙보다 뒤·특정도 우위) */
.sidebar .side-grp-pin>summary{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:8px 8px 6px;letter-spacing:0;text-transform:none}
.sidebar .side-grp-pin>summary::before{content:"상담 중인 고객";font-size:9.5px;font-weight:700;letter-spacing:.05em;color:var(--side-label)}
.sidebar .side-grp-pin>summary::after{display:none}
.sidebar .side-grp-pin .side-cname{font-size:13.5px;font-weight:800;color:#fff}
.sidebar .side-grp-pin .side-cname.active{color:var(--side-active)}
/* ── 소제목(진단·세금·제안·리포트·전달) — 클릭 안 되는 구분줄. 죽은 규칙 살리기 ②: 묶음(11.5px·어두운 회청)보다 작지만 **밝게**(#b9c5dd) — 크기·명도 두 축으로 2층 ── */
.sidebar .side-stage-h{padding:7px 10px 2px 12px;font-size:10.5px;font-weight:800;letter-spacing:.04em;color:var(--side-hover-2)}
.sidebar .side-stage>summary{color:var(--side-hover-2);letter-spacing:.04em}
/* 세로 레일 — 소제목 아래 화면 묶음을 1px 선으로 묶는다(absolute 오버레이 · 레이아웃 무영향) */
.sidebar .side-stage-nav{position:relative;padding-bottom:2px}
.sidebar .side-stage-nav::before{content:"";position:absolute;left:15px;top:2px;bottom:4px;width:1px;background:rgba(255,255,255,.12);pointer-events:none}
/* 화면 줄: 아이콘 없이 시작선 26px(레일 15px 오른쪽 4px). 위험·보장만 방패 아이콘(변별 가치가 있는 단 하나) */
.sidebar .side-sub-flat{padding:5px 10px 5px 26px}   /* 행 30→26px — 항상 펼친 22줄이 1080p 한 화면에 들어오게 */
.sidebar .side-sub-flat.active{border-radius:0 var(--r-xs) var(--r-xs) 0}   /* 골드 바가 둥근 모서리를 따라 휘지 않게 */
.sidebar .side-sub-flat .ico{width:16px}
.sidebar .side-sub-flat .ico svg{width:14px;height:14px}
/* ── 활성: 판을 실존시키고(백10% · 바탕 대비 1.37:1) 골드 바는 유지 · 글자 #fff(색상 단서 대신 명도 단서) · hover(백9%)와는 바·굵기가 가른다 ── */
.sidebar .side-nav a.active,.sidebar .side-sub-flat.active{background:rgba(255,255,255,.10);box-shadow:inset 3px 0 0 var(--gold)}
.sidebar .side-nav a.active{color:#fff}
.sidebar .side-sub-flat.active{color:#fff;font-weight:700}
/* ── 「미입력」 배지 → 빈 동그라미 점(E) — 글자가 라벨에 붙어 '자산현황·상세미입력'으로 읽히던 문제의 근원 제거.
     글자는 시각적으로만 감춘다(font-size:0) — 스크린리더는 그대로 읽고 title이 뜻을 준다. 흰 55% 링 ≈ 남색 위 5.5:1(비텍스트 3:1 ✓).
     ⚠ 숫자 배지(할 일·공지·웰스페이·자산관리 건수)는 그대로 — 점은 고객 화면 줄(.side-sub-flat)에서만 ── */
.sidebar .side-sub-flat .side-empty{width:7px;height:7px;padding:0;flex:none;border-radius:50%;background:transparent;
  border:1.5px solid rgba(255,255,255,.55);font-size:0;margin-left:auto}
/* ── 더보기 서랍(접힘 ①) — 닫힘 chevron 대비 .5→.7 "여긴 열린다" ── */
.sidebar .side-more>summary{padding-left:12px}
.sidebar .side-more>summary::after{opacity:.7}
.sidebar .side-grp>summary::after{opacity:.7}
/* 고객 목록으로 — 카드 안 마지막 줄, 한 단 옅게 */
.sidebar .side-grp-pin .rtoc-back{padding-left:12px;font-size:12px;opacity:.75}
/* 821~960px 접힘 모드(가로줄) — 존 판·카드·레일이 가로 줄에서 어색하지 않게 평면으로 */
@media screen and (min-width:821px) and (max-width:960px){
  .sidebar .side-quick,.sidebar .side-grp-pin{background:transparent;border:none;padding:0;margin:0}
  .sidebar .side-zone-t,.sidebar .side-stage-h,.sidebar .side-stage-nav::before{display:none}
  .sidebar .side-grp-pin>summary::before{display:none}
}

/* [N2] ═══ 현금흐름표 안 '상담 후' 직접 입력(2026-09-09 대표 지시 7번) ═══
   "이 현금흐름표 안에서 수정해서 저장되게끔 해야지 밑에 항목별 직접입력으로하면 헷갈리고 안맞아".
   표 칸 안에 들어가는 입력이라 칸을 넓히지 않는 것이 관건 — 폭을 고정하고 오른쪽 정렬한다.
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). 다크 대응은 var()로 받으므로 추가 규칙 불필요. */
.cf-in{padding:2px 4px}
.cf-in input{width:100%;min-width:84px;max-width:130px;padding:4px 6px;font-size:12.5px;
  text-align:right;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--ink)}
.cf-in input::placeholder{color:var(--muted);opacity:.85}
.cf-in input:focus{outline:2px solid var(--gold);outline-offset:1px;border-color:var(--gold)}
/* 직접 넣은 칸은 표에서 바로 구분되어야 한다 — 자동값(회색 글씨)과 헷갈리면 안 된다 */
.cf-man input{border-color:var(--gold);background:var(--gold-soft);font-weight:700}
@media screen and (max-width:640px){
  .cf-in input{min-width:72px;font-size:12px;padding:3px 5px}
}

/* [N3] ═══ 💵 Cash Flow 현금흐름 시스템 도해(2026-09-09 대표 지시 9번 · 양식 재현) ═══
   대표가 준 양식(캐쉬플로우.png)을 화면용으로 옮긴 것. 상자는 HTML(글자 선명·반응형),
   흐름선만 SVG로 그린다 — 선을 SVG로 두면 애니메이션(stroke-dashoffset)을 걸 수 있다.
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). 색은 var()로 받아 다크에서도 산다.
   ⚠ 애니메이션은 **인쇄**와 **동작 줄이기(prefers-reduced-motion)** 에서 반드시 멈춘다 —
     상담 중 고객이 어지러워하면 화면의 체크박스로도 끌 수 있다(.cfs-still). */
.cfsys{display:grid;grid-template-columns:132px 120px 1fr;gap:0;align-items:center;margin-top:14px}
.cfs-src{text-align:right;padding-right:10px}
.cfs-src-l{font-size:12px;color:var(--muted)}
.cfs-src-m{font-size:19px;font-weight:800;color:var(--brand)}
.cfs-src-y{font-size:13px;font-weight:700;color:var(--gold-strong);margin-top:2px}
.cfs-wire{width:120px;height:320px;display:block}
.cfs-line{fill:none;stroke:var(--line);stroke-width:3;opacity:.9}
.cfs-flow{fill:none;stroke:var(--brand);stroke-width:3;stroke-linecap:round;
  stroke-dasharray:14 26;animation:cfs-move 2.6s linear infinite}
.cfs-flow.cfs-dn{stroke:var(--gold-strong);animation-duration:3.4s}
.cfs-flow.cfs-mid{animation-duration:2s}
@keyframes cfs-move{from{stroke-dashoffset:40}to{stroke-dashoffset:0}}
.cfs-nodes{display:flex;flex-direction:column;gap:18px;min-width:0}
/* ⚠ 첫 칸은 '소득 → 지출' 한 쌍(상자 2 + 화살표)이 들어갈 만큼 넓어야 한다 —
   240px로 뒀더니 지출 상자가 오른쪽 설명 위로 넘쳐 글자가 겹쳤다(2026-09-09 캡처로 발견).
   ⚠ 그리드 자식은 min-width:0 (기본 auto면 넓은 내용이 칸을 밀어낸다 · grid-child-min-width-auto). */
.cfs-row{display:grid;grid-template-columns:minmax(300px,336px) minmax(0,1fr);gap:16px;align-items:center}
.cfs-row>*{min-width:0}
.cfs-pair{display:flex;align-items:center;gap:4px;flex-wrap:nowrap;min-width:0}
.cfs-arrow{width:44px;height:24px;flex:0 0 44px}
.cfs-head{fill:var(--line);stroke:none}
.cfs-box{border:2px solid var(--brand);border-radius:10px;background:var(--wash-sky);
  padding:10px 12px;text-align:center;min-width:0;flex:1 1 0}
.cfs-box-t{font-size:14px;font-weight:800;color:var(--brand)}
.cfs-box-n{font-size:18px;font-weight:800;color:var(--ink);margin-top:2px}
.cfs-box-s{font-size:11px;color:var(--muted)}
.cfs-box-save{border-color:var(--ok)}
.cfs-box-save .cfs-box-t{color:var(--ok)}
.cfs-box-yout{border-color:var(--gold-strong)}
.cfs-box-yout .cfs-box-t{color:var(--gold-strong)}
.cfs-side{min-width:0}
.cfs-hl{background:var(--gold-soft);border-left:3px solid var(--gold);padding:5px 9px;
  border-radius:4px;font-size:12.5px;font-weight:700;color:var(--ink);margin-bottom:6px}
.cfs-able{background:var(--wash-sky);border-radius:6px;padding:7px 10px;font-size:13px}
.cfs-plan{margin:8px 0 0;padding-left:20px;font-size:12.5px;line-height:1.75;color:var(--ink-soft)}
.cfs-gap{background:var(--wash-cream);border-radius:6px;padding:7px 10px;font-size:13px}
.cfs-gap-neg{background:var(--danger-bg);color:var(--danger)}
/* 체크박스로 끄기 · 인쇄 · 동작 줄이기 — 세 경로 모두 정지 */
.cfs-still .cfs-flow{animation:none;stroke-dasharray:none;opacity:.55}
@media (prefers-reduced-motion:reduce){
  .cfs-flow{animation:none;stroke-dasharray:none;opacity:.55}
}
@media print{
  .cfs-flow{animation:none;stroke-dasharray:none}
  .cfsys{grid-template-columns:120px 100px 1fr}
}
@media screen and (max-width:900px){
  /* 좁은 화면에서는 기둥·선을 접고 상자를 위에서 아래로 세운다 — 선만 지우면 흐름이 안 보이니
     상자 왼쪽에 색 띠를 남겨 어느 갈래인지 알 수 있게 한다. */
  .cfsys{grid-template-columns:1fr;gap:10px}
  .cfs-src{text-align:left;padding:0}
  .cfs-wire{display:none}
  .cfs-row{grid-template-columns:1fr;gap:8px}
  .cfs-pair{flex-wrap:wrap}
  .cfs-arrow{display:none}
  .cfs-box{text-align:left;border-left-width:6px}
}

/* [N4] ═══ 📨 웰스레터 칸(브리핑 · 2026-09-09) ═══
   회사 컴퓨터 레터 프로그램이 올린 그날 레터와 고객 전달용 카톡 문안.
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). 색은 var()로 받는다. */
.bf-lt{padding:2px 0}
.bf-lt-h{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap}
.bf-lt-d{font-size:16px;color:var(--brand)}
/* 레터를 그 자리에서 펼친다(2026-09-09 대표 지시).
   🔴 처음엔 높이를 600px로 고정했다가 상자 안에서 스크롤이 생겼다
     ("화면이 너무 커 스크롤하지말고 페이지 폭에 맞춰서").
   → PDF가 **A4 한 장**이라 상자 비율을 A4(595:842)로 고정하면 폭에 맞춰 전체가 들어온다.
     높이를 px로 잡지 않는다 — 폭이 달라지면 높이도 함께 따라온다. */
.bf-lt-view{margin-top:10px;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fff}
.bf-lt-view.bf-lt-a4{aspect-ratio:595 / 842}
.bf-lt-view iframe{display:block;width:100%;height:100%;border:0}
.bf-lt-view img{display:block;width:100%;height:auto}
/* 비율을 못 쓰는 옛 브라우저 대비 — 최소 높이만 준다(그때는 안에서 스크롤) */
@supports not (aspect-ratio: 1 / 1){ .bf-lt-view.bf-lt-a4{height:900px} }
.bf-lt-kk{margin-top:12px;padding:10px 12px;background:var(--wash-sky);border-radius:8px}
.bf-lt-kk textarea{width:100%;margin-top:6px;font-size:12.5px;line-height:1.7;
  border:1px solid var(--line);border-radius:6px;padding:8px 10px;background:var(--surface);color:var(--ink)}

/* [N5] ═══ ✏️ 일정 수정 폼(달력 · 2026-09-09 대표 지시) ═══
   그동안 일정은 추가·삭제만 됐다 — 날짜가 하루 밀리면 지우고 다시 넣어야 했고
   지우는 순간 알림·반복·고객 연결이 함께 날아갔다.
   목록이 길어지지 않게 접어 두고, 편 동안만 들여쓴 상자로 보이게 한다.
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). 색은 var()로 받아 다크에서도 산다. */
.cal-ed{margin:-2px 0 6px 12px}
.cal-ed-s{cursor:pointer;font-size:12px;color:var(--muted);list-style:none;padding:1px 0}
.cal-ed-s::-webkit-details-marker{display:none}
.cal-ed-s:hover{color:var(--brand)}
.cal-ed[open]{padding:8px 10px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px}
.cal-ed[open] .cal-ed-s{color:var(--ink);font-weight:600}

/* [N6] ═══ 🧭 재무설계 컨설팅 Process(2026-09-10 대표 지시) ═══
   회사 교육자료 PPT를 그대로 옮긴 화면. 원본은 Step 1→6 세로 흐름에 화살표로 이어져 있고,
   Step 1~2 위에 **빨간 네모칸**(강조)이 덧그려져 있었다 — 대표 지시로 그 상자는 옮기지 않았다.
   겉모습은 우리 카드·토큰으로. 색은 var()로 받아 다크에서도 산다.
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). */
/* ⚠ 화면 전용 — 인쇄는 용지 폭을 그대로 쓴다(@media print 블록은 md5로 고정돼 있어 건드리지 않는다) */
@media screen{.container.procw{max-width:760px;margin-left:auto;margin-right:auto}}
.proc{max-width:760px}
.proc-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.proc-no{flex:0 0 auto;font-size:12px;font-weight:700;color:var(--brand);
  border:1px solid var(--brand);border-radius:999px;padding:2px 10px;white-space:nowrap}
.proc-en{font-size:12px;color:var(--muted);letter-spacing:.02em}
.proc-t{font-size:14px;color:var(--ink)}
.proc-ul{margin:4px 0 0;padding-left:18px;line-height:1.75}
.proc-ul li{font-size:13px;color:var(--ink-soft)}
.proc-arrow{text-align:center;color:var(--muted);font-size:14px;line-height:1;margin:6px 0 -6px}
/* ⚠ 인쇄 규칙을 @media print에 새로 넣지 않는다 — 그 블록들은 기준선(md5)으로 얼려 두었다
   (smoke_pcdesign ②). 카드가 페이지 경계에서 잘리지 않게 하는 것은 여기서 항상 건다. */
.proc-step{break-inside:avoid;page-break-inside:avoid}

/* [N8] ═══ 📆 리포트 08 은퇴후 현금흐름표 — 화면과 **같은 가로형 표**(2026-09-11) ═══
   🔴 한 번 세로형으로 바꿨다가 대표 지적("내가 안 시켰는데")으로 원복했다.
     지시는 "이 표를 리포트에도 나오게 하라"였다 — 모양을 바꾸라는 뜻이 아니었다.
   ⚠ 아래 규칙은 retirement.html 인라인 <style>의 **사본**이다(그 화면은 건드리지 않는다).
     화면 표 스타일을 고치면 여기도 같이 고친다 — 두 곳이 갈라지면 같은 표가 다르게 보인다.
   ⚠ 가로 표라 세로 A4를 넘는다 → 이 장만 **가로 용지**로 인쇄한다(아래 @page ret-cf).
   ⚠ [P2] 다크 블록보다 앞에 둔다(pcdark-p2-must-be-last). */
/* 소득원 칸 안 작은 글씨 — 비중·수령기간·행 설명을 여기로 내렸다(과세 칸 재사용 중단 · 2026-09-11) */
/* 🔴 2026-09-11 대표 지시 "연금액이 부족하거나 세금 부분들은 빨간 표시" —
   사내 규칙대로 **와인색**(--danger)을 쓴다(red-is-wine). 색만으로 알리지 않도록 글자도 함께 둔다. */
.ret-cfm td.tax{color:var(--danger)}
.ret-cfm tr.gap td.neg{color:var(--danger);font-weight:700}
.ret-cfm tr.gap td.num{font-weight:600}
.ret-cfm td.sub-same{color:var(--line)}
/* 건보료 칸 2단(부과 / 피부양자 합산) · 사적연금 한도 초과 배지 — 2026-09-11 감수 */
.ret-cfm .ins-dep{display:block;font-size:9px;font-weight:400;color:var(--muted);margin-top:1px}
.ret-cfm .cap-over{display:inline-block;margin-left:3px;font-size:8.5px;font-weight:700;
  color:var(--danger);border:1px solid var(--danger);border-radius:3px;padding:0 2px;vertical-align:middle}
.ret-cfm .sub-meta{display:block;font-size:10px;color:var(--muted);font-weight:400;margin-top:1px}
.ret-cfm .sub-same{color:var(--line);text-align:center}
@page ret-cf{size:A4 landscape;margin:10mm}
.report .rpage-land{page:ret-cf}
.report .retcf-wrap{overflow-x:auto}
/* 🔴 인쇄에서는 스크롤이 없다 — 가로 용지(사용 가능 폭 ≈277mm)에 **한 장으로** 들어가도록 줄인다.
   (실측: 기본 크기면 19개 나이 열이 1,400px을 넘어 둘째 장으로 밀렸다)
   ⚠ 화면은 그대로 둔다 — 화면에는 가로 스크롤이 있고 글자가 작아질 이유가 없다. */
@media print{
  .report .retcf-wrap{overflow:visible}
  .report .rpage-land .ret-cfm{font-size:8.2px}
  .report .rpage-land .ret-cfm th,.report .rpage-land .ret-cfm td{padding:2px 3px}
  .report .rpage-land .ret-cfm th.yr{min-width:40px;font-size:8px}
  .report .rpage-land .ret-cfm .src{min-width:92px}
  .report .rpage-land .ret-cfm .tax{min-width:52px;font-size:8px}
  .report .rpage-land .ret-cfm .ins{min-width:30px}
  .report .rpage-land .ret-cfm .sub-meta{font-size:7px}
  /* 🔴 2026-09-17 대표 지적 "연금 장 PDF 칸·정렬이 안 맞는다" — 크롬은 문서 전체를 **첫 장(세로) 폭**으로 배치하고
     가로 용지 장에서도 폭을 다시 잡지 않는다 → 카드는 세로 폭(190mm)에 남고 표만 카드 밖으로 삐져나갔다.
     또 세로 장 최소 높이(.rpage 278mm)가 가로 장(높이 190mm)에도 걸려 각주가 둘째 장으로 밀렸다.
     → 가로 장만 폭 277mm·최소 높이 해제 + 한 장에 들도록 밀도 조정(연금 장 있는 고객 12명 PDF 실측 전원 1장). */
  .report .rpage-land{width:277mm!important;max-width:none!important;min-height:0!important;padding:14px 18px!important}
  .report .rpage-land h2{margin-bottom:4px}
  .report .rpage-land .mt-2{margin-top:4px!important}
  .report .rpage-land .mt-3{margin-top:6px!important}
  .report .rpage-land .mt-5{margin-top:8px!important}
  .report .rpage-land .grid.cols-5{gap:6px}
  .report .rpage-land .kpi{padding:6px 9px!important;min-height:0!important}
  .report .rpage-land .kpi .n{font-size:14px!important;margin:1px 0}
  .report .rpage-land .kpi .l{font-size:10px}
  .report .rpage-land .hint{font-size:8.5px!important;line-height:1.35!important}
  .report .rpage-land .ret-cfm{font-size:8px}
  .report .rpage-land .ret-cfm th,.report .rpage-land .ret-cfm td{padding:1.5px 3px!important;line-height:1.2!important}
  .report .rpage-land .ret-cfm .ins-dep{font-size:6.5px;margin-top:0}
  /* 🔴 2026-09-17 — 08 각 연금액 산출 근거: 암호화 해제 상태로 전 고객 실측하니 4명이 A4 초과(+57~+312px).
     값·행 구성은 그대로 두고 인쇄 밀도만 조인다. */
  .report .pen-basis-page h2{margin-bottom:4px}
  .report .pen-basis-page h3{margin-top:8px!important;font-size:11.5px}
  .report .pen-basis-page table th,.report .pen-basis-page table td{padding:2px 5px!important;font-size:9.5px!important;line-height:1.3!important}
  .report .pen-basis-page .hint,.report .pen-basis-page p{font-size:9px!important;line-height:1.35!important;margin-top:3px!important}
  .report .pen-basis-page .mt-2{margin-top:3px!important}
  .report .pen-basis-page .mt-4,.report .pen-basis-page .mt-5{margin-top:6px!important}
  .report .pen-basis-page .badge{font-size:9px;padding:1px 6px}
}
  /* 은퇴후 현금흐름표 — 상담 양식과 같은 가로형(소득원 × 나이).
     첫 세 열(소득원·과세·건보료)은 가로 스크롤 중에도 붙어 있어야 어느 행인지 알 수 있다. */
.report .ret-cfm{border-collapse:separate;border-spacing:0;font-size:12px;white-space:nowrap}
.report .ret-cfm th, .report .ret-cfm td{border-bottom:1px solid var(--line);padding:5px 8px}
.report .ret-cfm th.yr{text-align:center;font-weight:600;line-height:1.25;min-width:74px}
.report .ret-cfm th.yr .muted{font-size:10px;font-weight:400}
.report .ret-cfm td.num{text-align:right;font-variant-numeric:tabular-nums}
.report .ret-cfm .src{position:sticky;left:0;background:var(--surface);z-index:2;min-width:118px}
.report .ret-cfm th.src{z-index:3}
.report .ret-cfm .tax{color:var(--muted);font-size:11px;min-width:74px}
.report .ret-cfm .ins{text-align:center;font-weight:700;min-width:52px}
.report .ret-cfm .ins-o{color:var(--danger)} .ret-cfm .ins-t{color:var(--gold-strong)} .ret-cfm .ins-x{color:var(--muted)}
.report .ret-cfm tr.off td{opacity:.45}                     /* 값이 하나도 없는 소득원은 흐리게(자리는 지킨다) */
  /* 상품별 세부 줄 — 층 합계 아래에 한 단 들여써서 '이 층을 이루는 것'임을 보이게 */
.report .ret-cfm tr.sub-src td{font-size:11px;color:var(--muted);border-bottom:1px dotted var(--line)}
.report .ret-cfm tr.sub-src .src{padding-left:18px;font-weight:400}
  /* 양식의 빨간 점선 — 여기서부터 아래가 '합계·필요·부족' 구획이라는 표시 */
.report .ret-cfm tr.sum td{border-top:2px dashed var(--danger);border-bottom:none;background:var(--surface-2)}
.report .ret-cfm tr.need td{background:var(--surface-2)}
.report .ret-cfm tr.gap td{background:var(--surface-2);font-weight:600}
.report .ret-cfm tr.gap td.neg{color:var(--danger)}
.report .ret-cfm tr.bal td{font-size:11px}

/* [N9-통합] 2026-09-15 — 채권 보조 줄(D팀 인라인 스타일 두 벌을 규칙 하나로) · 대시보드 리본 첫 링크(A팀) */
.bond-sub{display:flex;flex-wrap:wrap;gap:2px 6px;align-items:center;margin-top:2px}
.bf-rb-split>.bf-rb-main{min-width:0}
/* [N9] ═══ 2026-09-15 대표 요청(A팀) — 사이드바 「회사·자료」 서랍 · 대시보드 레터 줄 · 브리핑 레터 날짜 칩·읽기 크기 ═══
   ⚠ [P2] 다크 블록보다 **앞**에 둔다(pcdark-p2-must-be-last). 색은 var()로만 받는다(다크 추가 규칙 불요).
   ⚠ 날짜 칩은 기존 .subchips .chip(자료실 구분 칩과 같은 알약)을 그대로 쓴다 — 여기서는 간격만. */
/* 「회사·자료」가 구역 제목에서 서랍 제목이 되었다 — 옛 구역 제목(.side-zone-t 14px)만큼 위 여백을 남겨 구역 경계가 보이게 */
.sidebar .side-grp-co>summary{padding-top:14px}
/* [N10] 2026-09-16 — 「고객」도 구역 제목에서 서랍 제목이 되었다(대표 지시). 회사·자료와 같은 위 여백으로 구역 경계를 지킨다.
   ⚠ [P2] 다크 블록보다 앞이다(pcdark-p2-must-be-last) · 색은 건드리지 않는다(기존 .side-grp>summary 그대로). */
.sidebar .side-grp-cu>summary{padding-top:14px}
/* 대시보드 브리핑 리본 — 한 링크였던 리본을 [브리핑] [레터] [열기] 세 링크로 나눴다(<a> 안에 <a> 불가) */
.bf-rb-split>a{display:inline-flex;flex-wrap:wrap;align-items:center;gap:8px;color:inherit;text-decoration:none;min-width:0}
.bf-rb-split>a:hover b,.bf-rb-split>a:focus-visible b{text-decoration:underline}
/* ⚠ 레터 링크 왼쪽에 구분선을 긋지 않는다 — 좁은 화면에서 다음 줄로 내려가면 선이 허공에 뜬다(아이콘 📨이 구분을 맡는다).
     새 폭 분기(@media)도 만들지 않는다(모바일 판정 한 곳 원칙). */
.bf-rb-split>.bf-rb-letter{margin-left:6px}
.bf-rb-split>.bf-rb-go{color:var(--brand-ink)}
.bf-rb-thumb{width:22px;height:28px;object-fit:cover;object-position:top;border:1px solid var(--line);border-radius:3px;background:#fff}
/* 브리핑 레터 날짜 칩 — 날짜 줄 바로 아래(오늘 날짜 옆) */
.bf-lt-days{margin:8px 0 0}
.bf-lt-dw{font-weight:400;opacity:.75;margin-left:1px}
/* 읽기 크기(대표 "오늘의 레터가 너무 커 화면에 꽉참") — 읽기 폭 800px 가운데 · 높이는 화면의 75%까지.
   A4 비율은 그대로 두고(폭이 좁은 화면에서는 한 장이 다 보인다) 넘치는 높이만 자른다 → 안쪽 뷰어가 넘김을 맡는다.
   iframe은 절대배치로 상자를 꽉 채운다(max-height로 줄어든 높이에서 height:100%가 흔들리지 않게). */
.bf-lt-view.bf-lt-a4{position:relative;max-width:800px;max-height:75vh;margin-left:auto;margin-right:auto}
.bf-lt-view.bf-lt-a4 iframe{position:absolute;top:0;left:0;width:100%;height:100%}
/* 이미지 레터 — 비율 고정을 풀고 폭에 맞춘 뒤 세로만 상자 안에서 넘긴다 */
.bf-lt-view.bf-lt-img{aspect-ratio:auto;overflow-y:auto}
@supports not (aspect-ratio: 1 / 1){ .bf-lt-view.bf-lt-a4{height:75vh} }
/* 📨 레터 썸네일 카드(2026-09-23 저녁 대표) — 통째 축소("정신없다") → 남색 상자("배경이 똑같아 안 이쁘다 ·
   오늘의 PICK·HTML 저장이 계속 보여 별로") → 지금: 날짜 + 레터의 「오늘의 PICK」 문장 앞 4줄만.
   배경은 **요일마다 다른 연한 색**(기존 --wash-* 토큰 · 새 색 0개): 월 sky · 화 mint · 수 lilac · 목 peach · 금 cream · 주말 sand.
   칸 수: 최소 170px · **최대 6칸**(칸 폭 하한을 (100% − 간격 5개)/6로 잡아 7칸이 못 생기게 한다).
   ⚠ 폭 분기(@media)를 새로 만들지 않는다(모바일 판정 한 곳 원칙). 다크에서는 wash가 한 값이라 색 구분이 옅어진다(토큰 규칙 그대로). */
.bf-lt-cards{display:grid;gap:12px;
  grid-template-columns:repeat(auto-fill,minmax(max(170px,calc((100% - 60px) / 6)),1fr))}
.bf-lt-card{display:flex;flex-direction:column;gap:8px;min-width:0;padding:12px 12px 14px;
  border:1px solid var(--line);border-radius:12px;background:var(--wash-sand);color:var(--ink);text-decoration:none;
  transition:border-color .15s, transform .15s}
.bf-lt-card:hover,.bf-lt-card:focus-visible{border-color:var(--brand);text-decoration:none;transform:translateY(-1px)}
.bf-lt-card.wd0{background:var(--wash-sky)}
.bf-lt-card.wd1{background:var(--wash-mint)}
.bf-lt-card.wd2{background:var(--wash-lilac)}
.bf-lt-card.wd3{background:var(--wash-peach)}
.bf-lt-card.wd4{background:var(--wash-cream)}
.bf-lt-card-h{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
.bf-lt-hook-t{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden;
  font-size:13px;line-height:1.6;min-height:calc(1.6em * 4);word-break:keep-all;overflow-wrap:anywhere}
.bf-lt-hook-t b{font-weight:800;color:var(--brand-ink)}
.bf-lt-hook-t.is-none{color:var(--muted)}
/* 📨 레터 크게 보기(/letters/view/날짜 · 2026-09-23) — 위 막대(날짜·[⬇ HTML 저장]·← 브리핑) + 레터 전체.
   레터는 iframe이 막대 아래 화면을 꽉 채우고 레터 안에서 넘긴다. */
.lv-body{margin:0;background:var(--wash-sand);color:var(--ink)}
.lv-bar{position:sticky;top:0;z-index:2;display:flex;justify-content:space-between;align-items:center;gap:8px;
  flex-wrap:wrap;padding:10px 16px;background:var(--surface);border-bottom:1px solid var(--line)}
.lv-t{font-size:16px}
.lv-act{display:flex;gap:6px;flex-wrap:wrap}
.lv-main{max-width:1100px;margin:0 auto;padding:12px 16px 24px}
.lv-frame{display:block;width:100%;height:calc(100vh - 90px);min-height:480px;border:1px solid var(--line);
  border-radius:8px;background:#fff}
.lv-img{display:block;width:100%;height:auto;border-radius:8px;background:#fff}

/* ⚠ 2026-09-16 — 이 블록은 [P2]보다 **앞**에 있어야 한다. 낮에 파일 끝(=[P2] 뒤)에 붙어 있었고,
     smoke_pcdark가 '[P2]~파일 끝'을 면제 구역으로 보기 때문에 그 사이 CSS가 무검사였다(pcdark-p2-must-be-last). */
/* 📥 파일 드래그앤드롭 영역(2026-09-16) — 점선 상자. 끌어 오면 금색으로 살아난다.
   ⚠ 기능이 아니라 **안내**다 — 안에 원래 '파일 선택' 입력이 그대로 있어, 드롭이 막힌 환경에서도 쓴다. */
.dropzone{border:2px dashed var(--line);border-radius:10px;padding:14px;background:var(--surface-2);
  transition:border-color .12s,background .12s}
.dropzone.over{border-color:var(--gold);background:var(--surface)}
.dropzone .dz-hint{margin:8px 0 0;font-size:12px;color:var(--muted)}
.dropzone .dz-picked{margin-top:6px;font-size:12.5px;font-weight:700;color:var(--gold-strong)}

/* ===== 인라인 수정 (공용) 2026-09-17 =====
   대표 지시 "각 항목 옆에 수정칸 → 클릭 시 그 자리에서 펼침 → 저장 후 같은 위치로". 설계: 검수결과/설계_인라인수정_{기술,UI,UX}_20260917.md
   ⚠ 토큰만 쓴다(새 hex 0) · [P2] 다크 블록보다 **앞**(pcdark-p2-must-be-last) · 다크는 var()로 자동.
   ⚠ @media print 블록·모바일 판정 리터럴을 **새로 만들지 않는다**(smoke_pcdesign md5 고정) —
     인쇄 숨김은 마크업의 .noprint, 좁은 화면은 표 규칙과 같은 640px 분기를 쓴다. */
.ied-btn{display:inline-block;font-size:var(--fs-cap);font-weight:600;color:var(--muted);padding:5px 8px;
  border-radius:var(--r-xs);background:none;border:0;cursor:pointer;text-decoration:none;white-space:nowrap;line-height:1.3;
  transition:background var(--mo-fast),color var(--mo-fast)}
.ied-btn:hover{color:var(--brand-ink);background:var(--navy-soft);text-decoration:none}
.ied-btn[aria-expanded=true],.ied-box[open]>summary.ied-btn{color:var(--brand-ink);font-weight:700}
.ied-btn[aria-expanded=true]::after,.ied-box[open]>summary.ied-btn::after{content:' 중'}
.ied-box>summary{list-style:none;margin:0}
.ied-box>summary::-webkit-details-marker{display:none}
.ied-box>summary::before{content:none}   /* 공용 summary의 "＋/－" 표식은 쓰지 않는다 — 연필+글자가 트리거다 */
/* 값 옆 [수정] — 숫자 열 정렬을 깨지 않게 값 뒤 오른쪽 끝(좁으면 다음 줄로 · 잘림 금지) */
.ied-cell{display:flex;justify-content:flex-end;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
.ied-cell.ied-cell-l{justify-content:space-between}
/* 편집 행 — :target(JS 없음) 또는 .is-open(JS·검증 오류 복귀)일 때만 표시 */
.ied-row{display:none}
.ied-row:target,.ied-row.is-open{display:table-row}
.ied-row>td{padding:0;background:var(--surface-2);white-space:normal}
.ied-panel{padding:var(--sp-3) var(--sp-4) var(--sp-3) 22px;border-left:3px solid var(--brand);
  border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);background:var(--surface-2)}
details.ied-box>.ied-panel{border-radius:var(--r-sm);margin-top:var(--sp-2)}
.ied-form{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--sp-2) var(--sp-3);align-items:end;margin:0}
.ied-err{grid-column:1/-1;margin:0;padding:8px 10px;border-radius:var(--r-xs);font-size:var(--fs-cap)}
.ied-fields{min-width:0;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);align-items:flex-end}
.ied-fields>label{margin:0;min-width:0;flex:1 1 220px;overflow-wrap:anywhere}
.ied-fields>label.ied-w,.ied-fields>.hint{flex-basis:100%}
.ied-fields>.hint{margin:0}
.ied-fields input{width:100%;min-width:0;margin-top:3px}
.ied-fields input.numin{text-align:right;font-variant-numeric:tabular-nums;max-width:180px}
.ied-fields input[aria-invalid=true]{border-color:var(--danger)}
.ied-fields .hint{display:block;font-weight:400;margin-top:2px}
.ied-cur{font-weight:400;color:var(--muted);margin-left:var(--sp-1)}
.ied-act{display:flex;gap:var(--sp-2);align-items:center;justify-content:flex-end}
/* 저장 직후 그 자리 — 성공은 ok 계열 워시(1.8s 뒤 투명) · 문구는 5초 뒤 흐려지되 새로고침 전까지 남는다 */
.ied-saved>td,.ied-blk.ied-saved{background:var(--ok-bg)}
@media screen{
  .ied-saved>td,.ied-blk.ied-saved{animation:iedsaved 1.8s var(--ease-out) 1 forwards}
  .ied-target:target>td,.ied-blk.ied-target:target{animation:iedback 1.6s ease-out 1}
}
@keyframes iedsaved{0%,55%{background:var(--ok-bg)}100%{background:transparent}}
@keyframes iedback{0%,60%{box-shadow:inset 0 0 0 2px var(--brand)}100%{box-shadow:none}}
.ied-note{display:inline-block;margin-left:var(--sp-2);font-size:var(--fs-cap);font-weight:700;color:var(--ok);
  animation:iedfade 1s 5s var(--ease-out) 1 forwards}
@keyframes iedfade{to{opacity:.55}}
/* 자동값(C형) — [수정] 대신 "어디서 바꾸는지" 링크 · 섹션 줄은 제목 왼쪽·링크 오른쪽 */
.ied-go{font-size:var(--fs-xs);font-weight:400;color:var(--muted);white-space:nowrap;margin-left:var(--sp-2)}
.ied-go a{color:var(--brand-ink)}
.ied-sec{display:flex;justify-content:space-between;align-items:baseline;gap:var(--sp-2);flex-wrap:wrap}
/* 기초자료로 건너간 칸(?focus=키) — 어느 칸을 고치러 왔는지 */
input.ied-focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--navy-soft)}
.ied-from{margin:0 0 10px;border-left:3px solid var(--brand);padding-left:10px}
.ied-clear{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
@media screen and (max-width:640px){
  .ied-btn{padding:10px 12px;min-height:36px}
  .ied-form{grid-template-columns:minmax(0,1fr)}
  .ied-fields>label{flex-basis:100%}
  .ied-fields input,.ied-fields input.numin{max-width:none;font-size:var(--fs-md)}
  .ied-act{display:grid;grid-template-columns:1fr 1fr}
  .ied-act .btn{min-height:44px}
  /* 표가 가로 스크롤 상자 안에 있어도 편집 패널은 화면 안에 남는다 */
  .ied-panel{position:sticky;left:0;max-width:calc(100vw - 2*var(--sp-4))}
  /* B2B QA 2026-09-17 ① — 카드 안 표의 **보이는 스크롤 상자**는 100vw-32px보다 좁다(320 뷰포트: main+card 패딩 → 256px).
     100vw 기준 폭이 32px 넘쳐 scrollLeft 0에서 오른쪽 테두리가 화면 끝에 잘렸다(b2b2_after_pay_err_320.png).
     → 편집 행을 품은 .table-scroll을 크기 컨테이너로 삼아 패널 폭을 그 폭(100cqw)에 맞춘다.
     ⚠ :has로 좁혀 건다 — 컨테이너 없이 cqw만 남으면 뷰포트 폭(100svw)으로 풀려 지금보다 넓어진다.
       :has·cqw 미지원 구형 브라우저는 두 줄 다 버리고 위 100vw 값으로 남는다(살짝 잘림만 · 기능 정상). */
  .table-scroll:has(.ied-row){container-type:inline-size}
  .table-scroll:has(.ied-row) .ied-panel{max-width:100cqw}
  /* B2B QA 2026-09-17 ② — 모바일 sticky 첫 열(공용 .table-scroll td:first-child · ≤820px)이 긴 이름(250px+)이면
     뒤 열을 덮어 [✏️ 수정]·삭제를 못 누른다 → 첫 열은 40vw(320px에서 128px)까지만 · 말줄임. 글자는 DOM에 그대로라
     스크린리더는 다 읽고, 편집 패널을 열면 전체 값이 입력칸에 보인다.
     제외: 편집 행(.ied-row)·colspan 칸(합계 줄·B2B 정산 기록 패널·반납 폼처럼 표 폭 전체를 쓰는 칸)·라벨:값 표(.ied-assume 스택).
     .cox-table td:first-child{min-width:190px}(0,2,1)보다 특이도를 높여 min-width도 같이 푼다. */
  .table-scroll table:not(.ied-assume) tr:not(.ied-row)>td:first-child:not([colspan]),
  .table-scroll table:not(.ied-assume) tr:not(.ied-row)>th:first-child:not([colspan]){
    max-width:40vw;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  /* 첫 칸 안의 보조 줄(div.hint·.cox-rule — 규격·계약·메모)은 자식 블록이라 위 말줄임이 안 물려받는다 → 같은 말줄임 */
  .table-scroll table:not(.ied-assume) tr:not(.ied-row)>td:first-child:not([colspan])>div{overflow:hidden;text-overflow:ellipsis}
}
@media (prefers-reduced-motion:reduce){
  .ied-saved>td,.ied-blk.ied-saved,.ied-target:target>td,.ied-blk.ied-target:target,.ied-note{animation:none}
}
/* 상담화면(고객 앞) — 서버가 렌더하지 않지만 캐시된 화면 대비 이중 차단 */
body.present .ied-btn,body.present .ied-row,body.present .ied-box,body.present .ied-note,body.present .ied-go{display:none!important}
/* 3차(회사 화면) 2026-09-17 — 회사자산 대장·상품 등록·B2B 표·달력 일정·공지·자료실.
   토큰만 · 새 hex 0 · 모바일 판정 리터럴·@media print 블록 추가 없음(위 공용 규칙을 그대로 탄다). */
.ied-fields select,.ied-fields textarea{width:100%;min-width:0;margin-top:3px}
.ied-fields>label.ied-n{flex:0 1 160px}                       /* 날짜·금액·상태처럼 짧은 칸 */
.ied-fields>.ied-chks{flex-basis:100%;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);align-items:center}
.ied-fields>.row{flex-basis:100%}                          /* 기존 .row 묶음(회사 정보 폼)을 그대로 넣을 때 한 줄 전체 */
.ied-fields>.ied-chks>b{font-size:var(--fs-cap);color:var(--ink-soft);font-weight:600}
.ied-fields>.ied-chks label{display:inline-flex;align-items:center;gap:4px;margin:0;font-weight:400}
.ied-fields>.ied-chks input{width:auto;margin:0}
.ied-after{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px dashed var(--line-soft)}  /* 저장 폼 밖 덩어리(사진 올리기) */
.ied-after form{margin:0;display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);align-items:flex-end}
.ied-after label{margin:0;flex:1 1 220px;min-width:0}
.ied-after input[type=file]{width:100%;margin-top:3px}
.ied-cell-act{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-2);align-items:center}   /* 마지막 열: [✏️ 수정] + 삭제 */
.ied-cell-act form{margin:0}
.cal-page .cal-ed>.ied-box{margin:0}                         /* 달력: 옛 .cal-ed 래퍼가 자리(margin)를 잡고 상자는 공용 ied_box */
.ied-blk.ied-saved{border-radius:var(--r-xs)}                /* 표 밖 목록(일정 줄·자료실 카드·공지 카드) 강조 */
/* 열린 상태의 전역 details 표식 "－ "(details[open] summary::before · 특이도 0,1,3)이 공용 .ied-box>summary::before(0,1,2)를 이겨
   "－ ✏️ 수정 중"으로 보였다(달력·B2B 회사 카드 캡처에서 발견 · 1차 블록의 빈틈) → 클래스 둘로 특이도를 올려 없앤다 */
.ied-box[open]>summary.ied-btn::before{content:none}
/* 검증 오류 칸(aria-invalid) — 공용 규칙은 .ied-fields input만 잡는다 → select·textarea·별도 폼(B2B #b2b-form·자료 수정·공지 작성)까지 같은 빨간 테두리 */
select[aria-invalid=true],textarea[aria-invalid=true],input[aria-invalid=true]{border-color:var(--danger)}
/* 백로그(모바일 복귀 스크롤) — 숨은 표 행(#row-키) 대신 JS가 데려간 카드(#card-키)·시트 안 일정 줄에 잠깐 테두리(anchor.js .axc.is-back과 같은 뜻).
   동작 줄이기 사용자는 JS가 클래스를 붙이지 않는다(정적 .ied-saved 워시만 남는다) → 여기 @media 불필요.
   .ied-saved와 겹치면 워시 애니메이션이 사라지지 않게 둘을 함께 적는다. */
.ied-blk.is-back{animation:iedback 1.6s ease-out 1}
.ied-blk.ied-saved.is-back{animation:iedsaved 1.8s var(--ease-out) 1 forwards,iedback 1.6s ease-out 1}
/* /3차(회사 화면) 끝 */
/* 2차-A(은퇴자산·리포트 설정·코멘트 m.cmt 흡수) 2026-09-17 — 위 공용 규칙·3차 소구역(.ied-fields select/textarea·.ied-chks)을 그대로 쓴다.
   토큰만 · 새 hex 0 · 모바일 판정 리터럴·@media print 블록 추가 없음. */
.ied-fields textarea{min-height:90px;line-height:1.5}
/* 코멘트(m.cmt) — 옛 .cmt-edit>summary 규칙(11.5px·연필 ::before)보다 특이도를 높여 공용 트리거 모양으로 통일 */
.cmt-edit.ied-box>summary.ied-btn{font-size:var(--fs-cap);margin-top:var(--sp-1);padding:5px 8px;color:var(--muted)}
.cmt-edit.ied-box>summary.ied-btn::before{content:none}
.cmt-edit.ied-box>summary.ied-btn:hover{color:var(--brand-ink)}
/* 코멘트 그 자리 복귀 강조 — 바깥 div의 class="cmt"는 그대로 두고(회귀 검사가 개수를 센다) data 속성·:target으로 */
.cmt[data-ied-saved]{background:var(--ok-bg);border-radius:0 var(--r-xs) var(--r-xs) 0}
@media screen{
  .cmt[data-ied-saved]{animation:iedsaved 1.8s var(--ease-out) 1 forwards}
  .cmt:target{animation:iedback 1.6s ease-out 1}
}
@media (prefers-reduced-motion:reduce){.cmt[data-ied-saved],.cmt:target{animation:none}}
body.present .cmt-edit{display:none!important}                /* 고객 앞 — 서버가 렌더하지 않지만 캐시 대비 이중 차단(QA 1차 🟡2) */
/* 값 보기(리포트 설정 SWOT 등) — 라벨:값 목록 · 긴 글은 줄바꿈, 빈 값은 흐리게 */
dl.ied-kv{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:var(--sp-1) var(--sp-3);margin:var(--sp-2) 0 0;font-size:var(--fs-body-sm)}
.ied-kv dt{font-weight:600;color:var(--ink-soft);white-space:nowrap}
.ied-kv dd{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;min-width:0}
.ied-kv dd.none,.ied-val .none{color:var(--muted)}
.ied-val{margin:var(--sp-2) 0 0;font-size:var(--fs-body-sm);overflow-wrap:anywhere;white-space:pre-wrap}
.ied-val b{font-variant-numeric:tabular-nums}
/* 은퇴 계산 가정 표 — 값 칸이 길어도 [수정]은 오른쪽 끝, 좁으면 다음 줄 */
.ied-assume tr.ied-target>td:first-child{width:34%;color:var(--muted);vertical-align:top}
.ied-assume .ied-cell-l>span:first-child{min-width:0;overflow-wrap:anywhere}
/* 펼친 접이식의 전역 "－ " 마커(details[open] summary::before · 특이도 0,1,2)가 공용 .ied-box>summary::before(0,1,1)를 이긴다 → 여기서 끈다 */
details.ied-box[open]>summary::before{content:none}
@media screen and (max-width:640px){
  dl.ied-kv{grid-template-columns:1fr;gap:2px var(--sp-3)}
  .ied-kv dt{margin-top:var(--sp-1)}
  /* 라벨:값 표는 가로 스크롤(.card>table 640px 규칙) 대신 **라벨 위 · 값 아래**로 쌓는다 — 320px에서 값이 잘려 나가지 않게 */
  table.ied-assume,.ied-assume tbody,.ied-assume tr.ied-target,.ied-assume tr.ied-target>td,.ied-assume .ied-row>td{display:block;width:auto}
  table.ied-assume{width:100%;white-space:normal}
  .ied-assume .ied-row:target,.ied-assume .ied-row.is-open{display:block}
  .ied-assume tr.ied-target{border-bottom:1px solid var(--line-soft);padding:6px 0}
  .ied-assume tr.ied-target>td{border-bottom:0;padding:2px 8px}
  .ied-assume tr.ied-target>td:first-child{width:auto;font-size:var(--fs-cap)}
}
/* 2차-B(제안서 행 편집·세금설계/부동산 C형 링크·자산/증권 복귀 강조) 2026-09-17 — 위 공용 규칙을 그대로 탄다.
   토큰만 · 새 hex 0 · 모바일 판정 리터럴·@media print 블록 추가 없음. */
.ied-go.ied-go-b{display:block;margin:2px 0 0;white-space:normal}     /* 값 아래 한 줄로(kv 칸·물건 이름 아래) */
.ied-sec>h2{min-width:0}
a.pol-card.ied-blk.ied-saved{border-radius:var(--r-sm)}               /* 증권 카드(가입현황) 저장 워시 */
.ied-target.ied-saved .ied-note{vertical-align:middle}
/* ===== /인라인 수정 (공용) 끝 ===== */

/* [UM] ═══ 설계사 관리 (um-) 2026-09-17 — flex 구성원 관리 패턴 1차 · 시안 검수결과/설계_설계사관리_UI_20260917.md ═══
   목록(/users) 위젯·칩·조직 묶음·7칸 표·모바일 카드 / 상세(/users/{id}) 머리·탭·2단·섹션·키-값 / 전사 설정.
   새 hex 0 · 새 토큰 0 · 인쇄 규칙 무변경(.noprint만). 섹션 편집은 위 공용 인라인 수정(.ied-box/.ied-panel/.ied-form/.ied-act/
   .ied-fields/.ied-saved)을 그대로 쓴다 — 여기서는 트리거 위치(카드 오른쪽 위)만 덧댄다.
   ⚠ 모바일 판정 리터럴(820px ∨ coarse·1100px)을 **새로 만들지 않는다**(smoke_pcdesign 블록 수·md5 고정).
     좁은 화면 규칙은 파일에 이미 있는 `@media screen and (max-width:820px){`(카드 듀오·그리드 열 축소 선례)를 한 번 더 쓴다 —
     전역 모바일 내비(≤820px)와 표→카드 전환점이 같아진다(2026-09-17 QA ②: 641~820px 모바일 내비+가로 스크롤 표 해소).
     ⚠ 남는 틈: pointer:coarse 821~1100px(태블릿 가로)은 여전히 표 — 그 구간은 표 폭 960px이 대체로 들어가고,
       그 조건만의 리터럴은 파일에 없어 새로 만들지 않는다(pcdesign 규율). body/html에 붙는 전역 모바일 클래스도 없다(base.js·mobile_fx.js 확인). */
.um-h-act{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;margin-left:auto}
.um-inline{display:inline-block;vertical-align:middle}
.um-nowrap{white-space:nowrap}
/* 확인 필요 위젯 — 숫자 우선(관리자는 "몇 건"을 먼저 본다) · 0건도 자리를 지킨다 */
.um-alerts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--sp-3);margin-bottom:var(--sp-4)}
.um-alert{display:flex;flex-direction:column;gap:2px;min-height:64px;padding:var(--sp-3) var(--sp-4);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);color:inherit;text-decoration:none;
  transition:background var(--mo-fast),border-color var(--mo-fast)}
a.um-alert:hover{border-color:var(--brand-2);background:var(--surface-2);text-decoration:none;color:inherit}
.um-alert .n{font-size:var(--fs-2xl);font-weight:800;line-height:1.15;color:var(--brand-ink);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.um-alert .n small{font-size:var(--fs-cap);font-weight:600;color:var(--muted);margin-left:2px}
.um-alert .l{font-size:var(--fs-cap);font-weight:600;color:var(--ink-soft);word-break:keep-all}
.um-alert.on{border-color:var(--brand);background:var(--navy-soft)}
.um-alert.zero{background:var(--surface-2)}
.um-alert.zero .n{color:var(--muted);font-weight:600}
/* 접이식 패널(비번 요청·미배정·추가·안내) — 카드 자체가 details */
.um-panel>summary{background:transparent;border:0;padding:0;font-size:var(--fs-lg)}
.um-panel>summary:hover{background:transparent}
/* 검색 + 조건 칩 */
.um-filter{display:flex;gap:var(--sp-2) var(--sp-3);align-items:center;flex-wrap:wrap;margin:0 0 var(--sp-2)}
.um-q-wrap{position:relative;display:block;flex:0 1 280px;min-width:0;margin:0}
.um-q-wrap .icn{position:absolute;left:11px;top:50%;width:16px;height:16px;transform:translateY(-50%);color:var(--muted);pointer-events:none}
.um-q{width:100%;padding:8px 12px 8px 34px}
.subchips.um-chips{margin:0;flex:1 1 320px}
.um-chip{display:inline-flex;align-items:center;gap:6px;min-height:32px;background:var(--navy-soft);border-color:var(--navy-soft);color:var(--brand-ink)}
.um-chip-k{font-weight:500;color:var(--ink-soft)}
/* 칩 × — 보이는 원은 22px 그대로, 누르는 영역은 padding으로 24px(WCAG 2.5.8) · 모바일 28→36px. 배경은 content-box에만 칠한다 */
.um-chip-x{display:inline-flex;box-sizing:content-box;width:22px;height:22px;padding:1px;margin:-3px -7px -3px 0;border-radius:50%;
  align-items:center;justify-content:center;background-clip:content-box;color:var(--brand-ink);font-size:14px;line-height:1;text-decoration:none}
.um-chip-x:hover{background:var(--surface);text-decoration:none}
.um-more-wrap{display:inline-block}
.um-more-wrap>summary.um-chip-add{display:inline-flex;align-items:center;min-height:32px;padding:0 12px;border:1.5px dashed var(--line);
  border-radius:var(--r-pill);background:var(--surface);color:var(--ink-soft);font-size:12.5px;font-weight:600}
.um-more-wrap>summary.um-chip-add::before{content:none}
.um-more-wrap>summary.um-chip-add:hover{background:var(--navy-soft)}
.um-more{margin-top:var(--sp-2);padding:var(--sp-3) var(--sp-4);background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
  display:flex;gap:var(--sp-3);flex-wrap:wrap;align-items:end}
.um-more label{display:flex;flex-direction:column;gap:3px;font-size:var(--fs-cap);margin:0;min-width:120px}
.um-more select{width:auto;min-width:120px}
.um-clear{font-size:var(--fs-cap);color:var(--muted);text-decoration:underline;margin-left:auto}
/* 조직 묶음(사번 앞자리) — 평면 머리 · 기본 열림 */
.um-grp{margin-top:var(--sp-3)}
.um-grp:first-of-type{margin-top:0}
.um-grp>summary.um-grp-h{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;min-height:44px;padding:8px 12px;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);font-size:var(--fs-body-sm);font-weight:700;color:var(--ink-soft);
  position:sticky;top:64px;z-index:3}   /* 긴 목록에서 어느 묶음인지 놓치지 않게 — top:64px = .mainbar 한 줄 높이(.tabs 선례) */
.um-grp>summary.um-grp-h::before{content:"▸";font-size:11px;color:var(--muted);font-weight:800;transition:transform var(--mo-fast)}
.um-grp[open]>summary.um-grp-h::before{transform:rotate(90deg)}
.um-grp>summary.um-grp-h:hover{background:var(--surface-2)}
.um-grp-t{font-variant-numeric:tabular-nums}
.um-grp-m{font-weight:500;color:var(--muted)}
.um-grp.um-off>summary.um-grp-h{color:var(--muted)}
.um-grp>.table-scroll{margin-top:var(--sp-2)}
.um-grp-hint{margin:var(--sp-2) 0 0}
/* 7칸 표 — 고정 폭 합 766 + 이름 열 ≥ 200 → 960px, 좁으면 .table-scroll */
table.um-t{width:100%;min-width:960px;table-layout:fixed;border-collapse:collapse}
.um-t col.um-c2{width:84px}.um-t col.um-c3{width:96px}.um-t col.um-c4{width:190px}.um-t col.um-c5{width:112px}.um-t col.um-c6{width:84px}.um-t col.um-c7{width:200px}
.um-t th{font-size:12px;font-weight:600;color:var(--muted);text-align:left;padding:8px 12px;border-bottom:1px solid var(--line)}
.um-t td{padding:8px 12px;vertical-align:middle;border-bottom:1px solid var(--line-soft);font-size:var(--fs-body-sm);color:var(--ink-soft)}
.um-t th.num,.um-t td.num{text-align:right;font-variant-numeric:tabular-nums}
.um-t td.num b{color:var(--ink)}
.um-who .cell-link{display:flex;gap:10px;align-items:center;color:inherit;text-decoration:none}
.um-nm{display:flex;flex-direction:column;min-width:0}
.um-nm b{font-size:var(--fs-sm);color:var(--ink);overflow-wrap:anywhere}
.um-id{font-size:var(--fs-note);color:var(--muted);font-weight:400;font-variant-numeric:tabular-nums;display:block;overflow-wrap:anywhere}
.um-av{flex:none;width:28px;height:28px;border-radius:50%;background:var(--navy-soft);color:var(--brand-ink);font-size:var(--fs-cap);font-weight:800;
  display:inline-flex;align-items:center;justify-content:center;letter-spacing:0}
.um-av.lg{width:64px;height:64px;font-size:var(--fs-2xl)}
.um-av.off{background:var(--line-soft);color:var(--ink-soft)}
.um-roles{display:inline-flex;gap:4px;flex-wrap:wrap;align-items:center}
.um-roles .fs-xs,.um-h-badges .fs-xs{padding:2px 8px}
.um-st .um-approve{margin-top:4px}
.um-note{display:block;font-size:var(--fs-cap);margin:4px 0 0}
.um-qe .um-id{margin-top:2px}
/* 모바일 카드(표와 같은 데이터 두 벌 · CSS가 한쪽만) — 기본 숨김, ≤820px(전역 모바일 내비와 같은 폭)에서 교체 */
.um-cards{display:none}
.um-card{display:grid;grid-template-columns:36px minmax(0,1fr) auto;gap:4px 10px;align-items:center;min-height:56px;padding:10px 12px;
  background:var(--surface);border:1px solid var(--line);border-radius:10px;color:inherit;text-decoration:none}
.um-card .um-av{width:36px;height:36px;font-size:var(--fs-sm)}
.um-card-nm b{font-size:15px;color:var(--ink);overflow-wrap:anywhere}
.um-card-l2,.um-card-l3{grid-column:2 / span 2}
.um-card-approve{margin:-2px 0 6px}
.um-card-approve .btn{width:100%;min-height:44px}
/* 상세 — 프로필 머리 · 2단 · 섹션 · 키-값 */
.um-head{display:flex;gap:var(--sp-4);align-items:center;flex-wrap:wrap}
.um-h-main{min-width:0;flex:1 1 240px}
.um-h-name{font-size:var(--fs-2xl);font-weight:800;color:var(--brand-ink);line-height:1.25;letter-spacing:-.01em;overflow-wrap:anywhere}
.um-h-meta{font-size:var(--fs-body-sm);color:var(--ink-soft);margin-top:2px;overflow-wrap:anywhere}
.um-h-badges{display:flex;gap:4px;flex-wrap:wrap;margin-top:6px}
.um-body{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:var(--sp-4);align-items:start}
.um-main{min-width:0}
.um-aside{position:sticky;top:72px}
.um-aside .card{margin-bottom:var(--sp-4)}
.um-sec{position:relative;padding-top:var(--sp-3);scroll-margin-top:72px}
.um-sec-h{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;padding:0 96px var(--sp-2) 0;border-bottom:1px solid var(--line-soft);margin-bottom:var(--sp-1)}
.um-sum .um-sec-h,.um-dup .um-sec-h{padding-right:0}
h2.um-sec-t{font-size:var(--fs-body-sm);font-weight:700;color:var(--ink-soft);margin:0;letter-spacing:.01em}
.um-sec-s{font-size:var(--fs-cap);color:var(--muted);margin-left:var(--sp-1)}
.um-sec .um-note{margin:var(--sp-2) 0 0}
.um-sec .ied-err{margin:var(--sp-2) 0}
.um-kv{display:grid;grid-template-columns:140px minmax(0,1fr);gap:var(--sp-2) var(--sp-4);align-items:baseline;padding:10px 0;border-bottom:1px solid var(--line-soft);min-height:44px}
.um-kv:last-of-type{border-bottom:0}
.um-kv.sm{grid-template-columns:84px minmax(0,1fr);padding:7px 0;min-height:0}
.um-k{font-size:var(--fs-body-sm);font-weight:600;color:var(--ink-soft);word-break:keep-all}
.um-v{display:flex;flex-wrap:wrap;gap:4px 20px;align-items:baseline;min-width:0}
.um-p{display:inline-flex;gap:6px;align-items:baseline;flex-wrap:wrap;overflow-wrap:anywhere}
.um-pk{font-size:var(--fs-note);font-weight:500;color:var(--muted)}
.um-pv{font-size:var(--fs-sm);font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums}
.um-pv.none{color:var(--muted);font-weight:400}
.um-dup{border:1px solid var(--warn-line)}
.um-dup-t td,.um-dup-t th{font-size:var(--fs-note);padding:5px 6px}
.um-dup-me>td{background:var(--surface-2)}
/* 섹션 편집 트리거(공용 .ied-box>summary.ied-btn) — 카드 오른쪽 위에 고정, 패널은 값 아래에 펼쳐진다 */
.um-sec>details.ied-box>summary.ied-btn{position:absolute;top:var(--sp-3);right:clamp(18px,2.4vw,24px);background:none;border:0}
.um-sec>details.ied-box>summary.ied-btn:hover{background:var(--navy-soft)}
.um-sec .ied-form>p.hint{grid-column:1 / -1;margin:0}
.um-sec .ied-fields{grid-column:1 / -1}
.um-sec .ied-fields select{width:100%;min-width:0;margin-top:3px}
.um-checks{border:0;padding:0;margin:0;display:flex;gap:var(--sp-3);flex-wrap:wrap;grid-column:1 / -1}
.um-checks legend{font-size:var(--fs-cap);font-weight:600;color:var(--ink-soft);padding:0;margin-bottom:4px}
.um-checks label.chk{font-weight:400;margin:0}
.um-test .um-grow{flex:1 1 220px}
.um-test .um-selfend{align-self:end}
@media screen and (max-width:820px){
  .um-grp>.table-scroll{display:none}
  .um-cards{display:flex;flex-direction:column;gap:7px;margin-top:var(--sp-2)}
  .um-grp>summary.um-grp-h{padding:10px 12px;top:0}   /* 모바일은 .mainbar가 static → 화면 맨 위에 붙는다(.tabs 선례) */
  .um-alerts{grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--sp-2)}
  .um-alert{min-height:56px;padding:var(--sp-2) var(--sp-3)}
  .um-alert .n{font-size:var(--fs-xl)}
  .um-q-wrap{flex:1 1 100%}
  .um-chip,.um-more-wrap>summary.um-chip-add{min-height:36px}
  .um-chip-x{width:28px;height:28px;padding:4px;margin:-6px -12px -6px 0}   /* 보이는 원 28 · 누르는 영역 36 */
  .um-av.lg{width:56px;height:56px;font-size:var(--fs-xl)}
  .um-h-name{font-size:var(--fs-xl)}
  .um-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch}
  .um-tabs a{white-space:nowrap;flex:none}
  .um-kv{grid-template-columns:1fr;gap:4px;padding:8px 0}
  .um-kv.sm{grid-template-columns:84px minmax(0,1fr)}
  .um-p{flex:1 1 100%}
}
@media screen and (max-width:900px){
  .um-body{grid-template-columns:1fr}
  .um-aside{order:-1;position:static}
}
@media (prefers-reduced-motion:reduce){
  .um-alert,.um-grp>summary.um-grp-h::before{transition:none}
}

/* 연말정산 모바일 2026-09-17 — tax.html의 `.row` 4칸(귀속연도·총급여·결정세액·기납부세액 / 상속·증여 4칸)
   전역 `.row>div{flex:1;min-width:175px}`는 다른 화면이 같이 쓰므로 두고, 연말정산 폼(form.tax-sheet) 안에서만
   접는 규칙을 못 박는다: ≤820px 2열(4칸이 3+1로 갈리지 않게) · ≤640px 1열 · min-width:0(칸이 카드 밖으로 못 나감).
   ⚠ 2b 캡처(--window-size=320)의 오른쪽 잘림은 크롬 창 최소 폭 때문에 레이아웃이 320보다 넓게 잡힌 것 —
   실제 320px 뷰포트에선 전역 규칙만으로도 1열이지만, 폭과 무관하게 같은 결과가 나오도록 여기서 고정한다. */
@media screen and (max-width:820px){
  .tax-sheet .row>div{flex:1 1 calc(50% - var(--sp-3));min-width:0}
}
@media screen and (max-width:640px){
  .tax-sheet .row>div{flex-basis:100%}
}

/* [P2] ═══ 🖥 PC 다크모드(2026-09-01 · 계획서 검수결과/구현계획_PC다크_20260901.md) ═══
   모바일 딥 다크(바탕 #0E1220 · 스틸블루 #9db1d4)와 동계열. 판정 리터럴은 [P1]과 글자까지 동일 — 새 리터럴 금지.
   구조: 토글 노출(양 모드) → ② 시스템 다크(중첩 @media · 수동 라이트는 :not으로 제외)
   → ③ 수동 다크 html[data-mtheme=dark](②와 선언 집합 동일 — smoke_pcdark가 대조).
   규칙:
   · PC 템플릿은 var(--surface)·var(--ink)를 직접 참조 → **PC 토큰을 html에서 직접 재정의**(브리지 없음). 값은 리터럴만(--m-* 참조 금지).
   · 토큰이 못 잡는 hex 리터럴 규칙만 가드(html:not/html[data-mtheme=dark]) 하위로 덮어쓴다.
     ⚠ 요소 선택자로 글자색 금지(.totop/.btn 특이도 사고 선례) — a:hover·.btn hover는 --brand-strong 재정의로 잇고 사이드바 면만 리터럴 복원.
   · 재정의 안 함: --chart-*(서버 SVG와 짝 — 대신 밝은 접시) · --side-*(사이드바 양 모드 동일) · --gold(장식 3곳 유지) · 크기·모션 토큰.
   · .report 서브트리는 **종이 스코프**: 다크에서도 흰 종이(인쇄 결과와 일치 · #111/#fff 리터럴 20여 곳을 안 뒤집는다).
   · @media print·모바일 [8][9]·[P1]·전역 라이트 값 무변경(--on-brand 추가와 #fff→var(--on-brand) 승격 12곳만 — 라이트 값 동일). */
@media screen and (min-width:1101px), screen and (min-width:821px) and (pointer:fine){
  /* ── 토글 노출(양 모드 — 라이트에서도 보여야 되돌릴 수 있다) · 해/달은 aria-pressed로 ── */
  .mbq-theme{display:inline-flex}
  .mbq-theme .mt-moon{display:none}
  .mbq-theme[aria-pressed="true"] .mt-sun{display:none}
  .mbq-theme[aria-pressed="true"] .mt-moon{display:block}
  /* ── ② 시스템 다크 — 수동 라이트(data-mtheme=light)는 제외. JS가 꺼져도 시스템 다크는 여기서 먹는다 ── */
  @media (prefers-color-scheme:dark){
    html:not([data-mtheme=light]){
      color-scheme:dark;
      --bg:#0E1220; --surface:#171C2E; --surface-2:#1D2338; --surface-3:#191F33;
      --ink:#F2F3F7; --ink-soft:#c5cee0; --muted:#93a1bd;
      --line:rgba(255,255,255,.10); --line-soft:rgba(255,255,255,.06); --line-strong:rgba(255,255,255,.20);
      --brand:#9db1d4; --brand-strong:#b9c9e6; --brand-2:#b9c9e6; --brand-ink:#F2F3F7; --navy-soft:rgba(157,177,212,.16);
      --on-brand:#12203c;
      --gold-strong:#c8a24a; --gold-ink:#c8a24a; --gold-soft:rgba(200,162,74,.16); --gold-line:rgba(200,162,74,.35);
      --ok:#86d9a8; --ok-bg:rgba(134,217,168,.14); --ok-line:rgba(134,217,168,.28);
      --warn:#F0A36A; --warn-bg:rgba(240,163,106,.16); --warn-line:rgba(240,163,106,.30);
      --danger:#FF8A80; --danger-bg:rgba(255,138,128,.14); --danger-line:rgba(255,138,128,.28);
      --wine:#FF8A80; --wine-bg:rgba(255,138,128,.14); --wine-line:rgba(255,138,128,.28);
      --team:#b8a5e8; --team-bg:rgba(184,165,232,.16); --team-line:rgba(184,165,232,.30);
      --sh-1:0 1px 2px rgba(0,0,0,.35); --sh-2:0 3px 12px rgba(0,0,0,.40); --sh-3:0 14px 34px rgba(0,0,0,.55);
      --wash-cream:rgba(255,255,255,.06); --wash-sky:rgba(255,255,255,.06); --wash-mint:rgba(255,255,255,.06);
      --wash-lilac:rgba(255,255,255,.06); --wash-peach:rgba(255,255,255,.06); --wash-sand:rgba(255,255,255,.06);
    }
    /* ── 컴포넌트(hex 리터럴 복구 · ③과 선언 집합 동일) ── */
    /* 사이드바(2026-09-01 사용자 "색상이 안어울려" · 시안_다크사이드바_20260901.md): 라이트 네이비 #12203c는
       본문 강청 팔레트(H226°·S~37%)보다 붉고 채도 2배라 라이트 잔재로 떠 보였다 → --bg와 --surface의
       중간 보간 #131829(같은 색 가족 · bg<사이드바<카드 3단 위계). --side-* 7종 대비 최저 6.02(AA 통과). */
    html:not([data-mtheme=light]) .sidebar{background:#131829;border-right:1px solid rgba(255,255,255,.08)}
    /* rgba 흰 리터럴 면(hex grep이 못 잡던 것 · 렌더 캡처로 발견): 상단바·기초자료 저장바 — blur는 원 규칙 그대로 */
    html:not([data-mtheme=light]) .mainbar{background:rgba(14,18,32,.88)}
    html:not([data-mtheme=light]) .intake-bar{background:rgba(23,28,46,.96);box-shadow:0 -4px 14px rgba(0,0,0,.35)}
    html:not([data-mtheme=light]) input,html:not([data-mtheme=light]) select,html:not([data-mtheme=light]) textarea{background:#161C30;border-color:rgba(255,255,255,.14);color:#F2F3F7}
    html:not([data-mtheme=light]) input:hover,html:not([data-mtheme=light]) select:hover,html:not([data-mtheme=light]) textarea:hover{border-color:rgba(255,255,255,.24)}
    html:not([data-mtheme=light]) input[type=radio]:hover,html:not([data-mtheme=light]) input[type=checkbox]:hover{border-color:transparent}
    html:not([data-mtheme=light]) input::placeholder,html:not([data-mtheme=light]) textarea::placeholder{color:#93a1bd}
    html:not([data-mtheme=light]) .btn.danger:hover{background:rgba(255,138,128,.22);color:#FF8A80}
    html:not([data-mtheme=light]) .badge.navy,html:not([data-mtheme=light]) .badge.gold{border-color:transparent}
    html:not([data-mtheme=light]) .report .badge.navy{border-color:#d3ddf0}
    html:not([data-mtheme=light]) .report .badge.gold{border-color:#e8d6a4}
    html:not([data-mtheme=light]) label.chk:hover{border-color:rgba(255,255,255,.20)}
    html:not([data-mtheme=light]) label.chk:has(input:checked){border-color:transparent}
    html:not([data-mtheme=light]) label.chk:has(input:checked) .rq-s{background:rgba(255,255,255,.10);color:#F2F3F7}
    html:not([data-mtheme=light]) table.cal th{background:#1D2338;color:#93a1bd}
    html:not([data-mtheme=light]) table.cal th.sun{color:#FF8A80}
    html:not([data-mtheme=light]) table.cal th.sat{color:#9db1d4}
    html:not([data-mtheme=light]) .cal-day.sun{color:#FF8A80}
    html:not([data-mtheme=light]) .cal-day.sat{color:#9db1d4}
    html:not([data-mtheme=light]) .cal-item.priv,html:not([data-mtheme=light]) .cal-item.priv a,html:not([data-mtheme=light]) .cal-filter a.on.priv{color:#86d9a8}
    html:not([data-mtheme=light]) .cal-item.meet,html:not([data-mtheme=light]) .cal-item.meet a,html:not([data-mtheme=light]) .cal-filter a.on.meet{color:#c8a24a}
    html:not([data-mtheme=light]) .cal-item.co,html:not([data-mtheme=light]) .cal-item.meet{border-color:transparent}
    html:not([data-mtheme=light]) .push-warn{color:#F0A36A}
    html:not([data-mtheme=light]) .rl-before{border-color:#FF8A80}
    html:not([data-mtheme=light]) .rl-after{border-color:#9db1d4}
    html:not([data-mtheme=light]) .up{color:#FF8A80}
    html:not([data-mtheme=light]) .down{color:#9db1d4}
    html:not([data-mtheme=light]) .wpx-tier.t-bronze .nm{color:#d8a86e}
    html:not([data-mtheme=light]) .wpx-tier.t-silver .nm{color:#a9b1bd}
    html:not([data-mtheme=light]) .kk-toast{background:#223052;color:#F2F3F7}
    html:not([data-mtheme=light]) .present-bar{border-color:transparent}
    html:not([data-mtheme=light]) .edit-tip{border-color:transparent}
    html:not([data-mtheme=light]) .rf-card,html:not([data-mtheme=light]) .lib-review-form{background:#171C2E}
    html:not([data-mtheme=light]) .ka-banner{border:1px solid rgba(255,255,255,.10)}
    /* 로그인 계열 보조 캡션(QA_다크전수_20260901 🟡): #8593b1 + span opacity.75가 3.55:1로 AA 미달 →
       #9fadcb(--side-hover와 동일 값 · 직접 7.19 · span .9시 6.10). 비로그인 화면은 항상 네이비 디자인이라
       라이트 쪽은 기존 유지(오늘 범위는 다크). */
    html:not([data-mtheme=light]) .ls-eyebrow,html:not([data-mtheme=light]) .ls-join,html:not([data-mtheme=light]) .hero-sub{color:#9fadcb}
    html:not([data-mtheme=light]) .ls-join span{opacity:.9}
    /* 서버 SVG(charts.py)는 var(--brand-ink) 등 5종을 **속성으로 직접 참조**한다(QA 🔴1·2: 흰 구멍 위 흰 숫자·레이더 실종).
       밝은 접시 안에서는 그 5종을 라이트 값으로 복원 — 접시+내용이 양 모드 동일해진다(파이썬·재시작 없이 해결). */
    html:not([data-mtheme=light]) .container svg[width]:not(.icn){background:#F8F9FB;border-radius:8px;
      --brand-ink:#1b2a4a;--ink-soft:#3d4657;--muted:#6b7482;--line:#e5e8f0;--danger:#8c2438}
    html:not([data-mtheme=light]) .mkt-card svg{background:transparent}
    /* 종이 스코프 — 리포트·제안서는 다크에서도 흰 종이(토큰 로컬 복원 · CSS 변수 상속) */
    html:not([data-mtheme=light]) .report{color-scheme:light;background:#fff;color:#1a2233;
      --bg:#fff; --surface:#ffffff; --surface-2:#f8fafc; --surface-3:#fbfcfe;
      --ink:#1a2233; --ink-soft:#3d4657; --muted:#6b7482;
      --line:#e5e8f0; --line-soft:#eef1f6; --line-strong:#cfd6e4;
      --brand:#1b2a4a; --brand-strong:#12203c; --brand-2:#283d64; --brand-ink:#1b2a4a; --navy-soft:#eaeef6;
      --on-brand:#fff; --gold-strong:#b0862f; --gold-ink:#8a6a1f; --gold-soft:#f6efda; --gold-line:#e8d6a4;
      --ok:#0f7b3f; --ok-bg:#e7f6ec; --ok-line:#bfe6cd; --warn:#b45309; --warn-bg:#fdf1e1; --warn-line:#f3d9b3;
      /* red-is-wine(대표 지시) 전면 집행 2026-09-02 — 빨강 → 와인(웰스페이 --wine과 동일 계열).
     다크 [P2]는 자체 값(#FF8A80)이라 무변경. 22개 사용 규칙이 이 3값으로 일괄 정렬된다. */
  --danger:#8c2438; --danger-bg:#f6e9ec; --danger-line:#e3c6cd; --wine:#8c2438; --wine-bg:#f6e9ec; --wine-line:#e3c6cd;
      --team:#5b3fa0; --team-bg:#ede9f7; --team-line:#ddd4f0;
      --sh-1:0 1px 2px rgba(20,32,60,.06); --sh-2:0 3px 12px rgba(20,32,60,.08), 0 1px 3px rgba(20,32,60,.05); --sh-3:0 14px 34px rgba(20,32,60,.16)}
    html:not([data-mtheme=light]) .report input,html:not([data-mtheme=light]) .report select,html:not([data-mtheme=light]) .report textarea{background:#fff;border-color:#cbd4e2;color:#1a2233}
    html:not([data-mtheme=light]) .report .up{color:#c0392b}
    html:not([data-mtheme=light]) .report .down{color:#3b6fd4}
  }
  /* ── ③ 수동 다크 — ②와 바이트 단위로 같은 선언(전처리기가 없어 중복 · smoke_pcdark가 집합 일치를 고정) ── */
  html[data-mtheme=dark]{
    color-scheme:dark;
    --bg:#0E1220; --surface:#171C2E; --surface-2:#1D2338; --surface-3:#191F33;
    --ink:#F2F3F7; --ink-soft:#c5cee0; --muted:#93a1bd;
    --line:rgba(255,255,255,.10); --line-soft:rgba(255,255,255,.06); --line-strong:rgba(255,255,255,.20);
    --brand:#9db1d4; --brand-strong:#b9c9e6; --brand-2:#b9c9e6; --brand-ink:#F2F3F7; --navy-soft:rgba(157,177,212,.16);
    --on-brand:#12203c;
    --gold-strong:#c8a24a; --gold-ink:#c8a24a; --gold-soft:rgba(200,162,74,.16); --gold-line:rgba(200,162,74,.35);
    --ok:#86d9a8; --ok-bg:rgba(134,217,168,.14); --ok-line:rgba(134,217,168,.28);
    --warn:#F0A36A; --warn-bg:rgba(240,163,106,.16); --warn-line:rgba(240,163,106,.30);
    --danger:#FF8A80; --danger-bg:rgba(255,138,128,.14); --danger-line:rgba(255,138,128,.28);
    --wine:#FF8A80; --wine-bg:rgba(255,138,128,.14); --wine-line:rgba(255,138,128,.28);
    --team:#b8a5e8; --team-bg:rgba(184,165,232,.16); --team-line:rgba(184,165,232,.30);
    --sh-1:0 1px 2px rgba(0,0,0,.35); --sh-2:0 3px 12px rgba(0,0,0,.40); --sh-3:0 14px 34px rgba(0,0,0,.55);
    --wash-cream:rgba(255,255,255,.06); --wash-sky:rgba(255,255,255,.06); --wash-mint:rgba(255,255,255,.06);
    --wash-lilac:rgba(255,255,255,.06); --wash-peach:rgba(255,255,255,.06); --wash-sand:rgba(255,255,255,.06);
  }
  html[data-mtheme=dark] .sidebar{background:#131829;border-right:1px solid rgba(255,255,255,.08)}
  html[data-mtheme=dark] .mainbar{background:rgba(14,18,32,.88)}
  html[data-mtheme=dark] .intake-bar{background:rgba(23,28,46,.96);box-shadow:0 -4px 14px rgba(0,0,0,.35)}
  html[data-mtheme=dark] input,html[data-mtheme=dark] select,html[data-mtheme=dark] textarea{background:#161C30;border-color:rgba(255,255,255,.14);color:#F2F3F7}
  html[data-mtheme=dark] input:hover,html[data-mtheme=dark] select:hover,html[data-mtheme=dark] textarea:hover{border-color:rgba(255,255,255,.24)}
  html[data-mtheme=dark] input[type=radio]:hover,html[data-mtheme=dark] input[type=checkbox]:hover{border-color:transparent}
  html[data-mtheme=dark] input::placeholder,html[data-mtheme=dark] textarea::placeholder{color:#93a1bd}
  html[data-mtheme=dark] .btn.danger:hover{background:rgba(255,138,128,.22);color:#FF8A80}
  html[data-mtheme=dark] .badge.navy,html[data-mtheme=dark] .badge.gold{border-color:transparent}
  html[data-mtheme=dark] .report .badge.navy{border-color:#d3ddf0}
  html[data-mtheme=dark] .report .badge.gold{border-color:#e8d6a4}
  html[data-mtheme=dark] label.chk:hover{border-color:rgba(255,255,255,.20)}
  html[data-mtheme=dark] label.chk:has(input:checked){border-color:transparent}
  html[data-mtheme=dark] label.chk:has(input:checked) .rq-s{background:rgba(255,255,255,.10);color:#F2F3F7}
  html[data-mtheme=dark] table.cal th{background:#1D2338;color:#93a1bd}
  html[data-mtheme=dark] table.cal th.sun{color:#FF8A80}
  html[data-mtheme=dark] table.cal th.sat{color:#9db1d4}
  html[data-mtheme=dark] .cal-day.sun{color:#FF8A80}
  html[data-mtheme=dark] .cal-day.sat{color:#9db1d4}
  html[data-mtheme=dark] .cal-item.priv,html[data-mtheme=dark] .cal-item.priv a,html[data-mtheme=dark] .cal-filter a.on.priv{color:#86d9a8}
  html[data-mtheme=dark] .cal-item.meet,html[data-mtheme=dark] .cal-item.meet a,html[data-mtheme=dark] .cal-filter a.on.meet{color:#c8a24a}
  html[data-mtheme=dark] .cal-item.co,html[data-mtheme=dark] .cal-item.meet{border-color:transparent}
  html[data-mtheme=dark] .push-warn{color:#F0A36A}
  html[data-mtheme=dark] .rl-before{border-color:#FF8A80}
  html[data-mtheme=dark] .rl-after{border-color:#9db1d4}
  html[data-mtheme=dark] .up{color:#FF8A80}
  html[data-mtheme=dark] .down{color:#9db1d4}
  html[data-mtheme=dark] .wpx-tier.t-bronze .nm{color:#d8a86e}
  html[data-mtheme=dark] .wpx-tier.t-silver .nm{color:#a9b1bd}
  html[data-mtheme=dark] .kk-toast{background:#223052;color:#F2F3F7}
  html[data-mtheme=dark] .present-bar{border-color:transparent}
  html[data-mtheme=dark] .edit-tip{border-color:transparent}
  html[data-mtheme=dark] .rf-card,html[data-mtheme=dark] .lib-review-form{background:#171C2E}
  html[data-mtheme=dark] .ka-banner{border:1px solid rgba(255,255,255,.10)}
  html[data-mtheme=dark] .ls-eyebrow,html[data-mtheme=dark] .ls-join,html[data-mtheme=dark] .hero-sub{color:#9fadcb}
  html[data-mtheme=dark] .ls-join span{opacity:.9}
  html[data-mtheme=dark] .container svg[width]:not(.icn){background:#F8F9FB;border-radius:8px;
    --brand-ink:#1b2a4a;--ink-soft:#3d4657;--muted:#6b7482;--line:#e5e8f0;--danger:#8c2438}
  html[data-mtheme=dark] .mkt-card svg{background:transparent}
  html[data-mtheme=dark] .report{color-scheme:light;background:#fff;color:#1a2233;
    --bg:#fff; --surface:#ffffff; --surface-2:#f8fafc; --surface-3:#fbfcfe;
    --ink:#1a2233; --ink-soft:#3d4657; --muted:#6b7482;
    --line:#e5e8f0; --line-soft:#eef1f6; --line-strong:#cfd6e4;
    --brand:#1b2a4a; --brand-strong:#12203c; --brand-2:#283d64; --brand-ink:#1b2a4a; --navy-soft:#eaeef6;
    --on-brand:#fff; --gold-strong:#b0862f; --gold-ink:#8a6a1f; --gold-soft:#f6efda; --gold-line:#e8d6a4;
    --ok:#0f7b3f; --ok-bg:#e7f6ec; --ok-line:#bfe6cd; --warn:#b45309; --warn-bg:#fdf1e1; --warn-line:#f3d9b3;
    /* red-is-wine(대표 지시) 전면 집행 2026-09-02 — 빨강 → 와인(웰스페이 --wine과 동일 계열).
     다크 [P2]는 자체 값(#FF8A80)이라 무변경. 22개 사용 규칙이 이 3값으로 일괄 정렬된다. */
  --danger:#8c2438; --danger-bg:#f6e9ec; --danger-line:#e3c6cd; --wine:#8c2438; --wine-bg:#f6e9ec; --wine-line:#e3c6cd;
    --team:#5b3fa0; --team-bg:#ede9f7; --team-line:#ddd4f0;
    --sh-1:0 1px 2px rgba(20,32,60,.06); --sh-2:0 3px 12px rgba(20,32,60,.08), 0 1px 3px rgba(20,32,60,.05); --sh-3:0 14px 34px rgba(20,32,60,.16)}
  html[data-mtheme=dark] .report input,html[data-mtheme=dark] .report select,html[data-mtheme=dark] .report textarea{background:#fff;border-color:#cbd4e2;color:#1a2233}
  html[data-mtheme=dark] .report .up{color:#c0392b}
  html[data-mtheme=dark] .report .down{color:#3b6fd4}
}
