/* 에이드리븐 ERP — 아직 디자인 시스템으로 옮기지 못한 화면 CSS.
 *
 * ## 왜 파일이 하나인가
 *
 * `dashboard.css`와 `accounting.css`로 나뉘어 있었는데, 그 경계가 실제
 * 화면과 맞지 않았다. `.error-banner`가 dashboard.css의 **로그인 섹션**에
 * 정의돼 있는데 전 모듈이 쓰고 있었고, 표·패널은 accounting.css에 있는데
 * 판매 화면도 같은 것을 썼다. 그래서 화면마다 `<link>`를 하나 더 붙이고
 * 있었다(네 곳).
 *
 * 겹치는 선택자는 `.btn-link` 하나뿐이었고 선언도 같았다 — 합치는 데
 * 위험이 없다는 뜻이다.
 *
 * ## 이 파일은 임시다
 *
 * **레이어 밖**이라 adriven-ui.css의 모든 규칙을 이긴다(그게 이행 중에
 * 화면이 깨지지 않는 장치다 — adriven-ui.css 머리말 참고). 부품이 하나씩
 * 옮겨갈 때마다 여기서 지운다. 다 옮기면 이 파일이 사라진다.
 *
 * 새 규칙은 여기 넣지 않는다. 디자인 시스템(`ds/<버전>/adriven-ui.css`)의
 * `ad.component` 레이어에 넣는다.
 */

/* ==========================================================================
   대시보드 · 로그인 (옛 dashboard.css)
   ========================================================================== */

/* Portal-specific styles layered on top of vendor/erp-design-tokens/tokens.css.
   Only new, domain-specific rules live here — never redefine a --token
   name from tokens.css locally (see that submodule's README). */

* { box-sizing: border-box; }

body {
  margin: 0;
  font-family: var(--font-family);
  font-size: var(--font-size-base);
  background: var(--bg-primary);
  color: var(--text-primary);
}

.muted { color: var(--text-secondary); }

.btn {
  display: inline-block;
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-md);
  border: none;
  font-family: inherit;
  font-size: inherit;
  cursor: pointer;
  text-decoration: none;
  transition: var(--transition-fast);
}
.btn-primary {
  background: var(--primary);
  color: var(--text-inverse);
}
.btn-primary:hover { background: var(--primary-hover); }

.btn-link {
  background: none;
  border: none;
  color: var(--text-secondary);
  cursor: pointer;
  font-size: inherit;
  text-decoration: underline;
}

/* --- Login --- */
.login-shell {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.login-card {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
  padding: var(--space-8);
  width: 100%;
  max-width: 360px;
  text-align: center;
}
.login-card h1 { margin: 0 0 var(--space-2); font-size: 1.25rem; }
.login-card .btn { margin-top: var(--space-6); width: 100%; }
.error-banner {
  background: var(--danger-bg);
  color: var(--danger);
  border-radius: var(--radius-sm);
  padding: var(--space-3);
  margin-top: var(--space-4);
  font-size: 0.875rem;
}

/* --- Dashboard --- */
.topbar {
  background: var(--header-bg);
  border-bottom: 1px solid var(--header-border);
  color: var(--header-text);
  padding: var(--space-4) var(--space-6);
  display: flex;
  justify-content: space-between;
  align-items: center;
}
/* .topbar-title은 _ui.html의 logo() 매크로로 대체됐다(.ad-logo). */
.topbar { min-height: var(--ad-topbar-h); box-sizing: border-box; }
.topbar-user { display: flex; align-items: center; gap: var(--space-3); }

/* 카드 다섯이 한 줄에 들어가는 폭. 1040px이면 4+1로 끊겨서, 없앤 묶음이
   다시 생긴 것처럼 보였다. */
.dashboard-shell { padding: var(--space-6); max-width: 1200px; margin: 0 auto; }

/* 카드 안 아이콘 칩은 글자 위에 자리를 잡는다(칩 -> 이름 -> 설명).
   칩이 세로로 늘어나지 않게 자기 크기만 차지한다. */
.tile > .ad-tile-icon { margin-bottom: var(--space-1); }

.tile-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: var(--space-4);
}
.tile {
  background: var(--bg-card);
  border: 1px solid var(--border-color);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  padding: var(--space-5);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.tile-name { font-weight: 600; }
.tile-disabled { opacity: 0.5; }

/* --- 카드 위의 「지금 상태」 ------------------------------------------------
   카드가 링크 다섯 개였을 때는 이름과 설명뿐이었다. 이제 **숫자가 먼저
   읽혀야** 이 화면을 여는 이유가 생긴다(SAP Fiori 홈 지침).

   숫자를 크게, 이름표를 작게. 두 칸이 나란히 서고, 좁아지면 아래로 내려간다. */
.tile-stats {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-5);
  margin-top: var(--space-1);
}
.tile-stat { display: flex; flex-direction: column; gap: 1px; }
.tile-stat__value {
  font-size: 1.125rem; font-weight: 700;
  font-variant-numeric: tabular-nums; letter-spacing: -0.01em;
  color: var(--text-primary);
}
.tile-stat__label { font-size: 0.75rem; color: var(--text-secondary); }
/* **조치가 필요한 것에만** 색이 붙는다. 정상 건까지 물들이면 색이 정보를
   잃는다 — 알약(.pill)에 쓰는 규칙과 같다. */
.tile-stat--urgent .tile-stat__value { color: var(--danger); }
.tile-stat--urgent .tile-stat__label { color: var(--danger); }

/* 카드 전체가 클릭 대상이다(「열기」 버튼 없음). <a>와 <button> 두 태그에
   같은 모양을 입힌다 — 형제 시스템은 로그인 토큰 때문에 POST여야 해서
   button이고, 내부 화면은 링크다. 쓰는 사람에게는 같은 카드로 보여야 한다.

   button은 브라우저 기본 스타일(가운데 정렬·회색 배경·시스템 폰트)이
   강해서 하나하나 되돌려야 한다. */
/* 형제 시스템 카드는 <form> 안의 button이라, form이 격자 칸을 차지한다.
   form을 flex로 두면 버튼이 칸 높이를 그대로 채워서, 설명 길이가 다른
   카드들의 높이가 어긋나지 않는다. */
.tile-grid form { display: flex; }

.tile-link {
  text-align: left;
  color: inherit;
  font: inherit;
  text-decoration: none;
  cursor: pointer;
  width: 100%;
  transition: box-shadow 0.12s ease, border-color 0.12s ease, transform 0.12s ease;
}
/* 호버 테두리는 `--primary-light`(= 브랜드 blue-400). 아래 `.kpi-link:hover`가
   이미 같은 토큰을 쓴다 — 같은 상호작용은 같은 색이어야 한다.
   (이 주석은 원래 다크 모드에서 색이 안 보이던 사정을 적고 있었다. 다크
   모드는 2026-09-09에 없앴다.) */
.tile-link:hover {
  border-color: var(--primary-light);
  box-shadow: var(--shadow-md);
  transform: translateY(-1px);
}
/* 키보드로 옮겨다닐 때 어디에 있는지 보여야 한다 — 버튼을 없앤 뒤에는
   카드 자체가 초점을 받으므로 이 테두리가 유일한 표시다. */
.tile-link:focus-visible {
  outline: 2px solid var(--primary-light);
  outline-offset: 2px;
}
@media (prefers-reduced-motion: reduce) {
  .tile-link { transition: none; }
  .tile-link:hover { transform: none; }
}


/* ==========================================================================
   모듈 껍데기 · 표 · 패널 · 알약 (옛 accounting.css)
   ========================================================================== */

/* 모듈 화면(판매·회계) 스타일 — 위 대시보드 섹션의 topbar/btn/tile에 얹는다.
   erp-design-tokens 변수만 쓰고 새 --token은 만들지 않는다. */

.btn-link { background: none; border: none; color: var(--text-secondary); cursor: pointer; font-size: inherit; font-family: inherit; text-decoration: underline; }
.btn-secondary { background: var(--bg-light); color: var(--text-primary); border: 1px solid var(--border-color); }
.btn-secondary:hover { background: var(--bg-hover); }
.btn-sm { padding: var(--space-2) var(--space-3); font-size: 0.8125rem; }

/* 예전에는 `calc(100vh - 61px)`로 상단 바 높이를 손계산해 박아 뒀는데,
   글자 크기나 여백을 바꾸는 순간 어긋난다. 이제 토큰이 두 곳의 단일
   출처다(--ad-topbar-h). */
.module-shell { display: flex; min-height: calc(100vh - var(--ad-topbar-h)); }
.module-sidebar {
  width: 200px; flex: none; background: var(--sidebar-bg); border-right: 1px solid var(--sidebar-border);
  padding: var(--space-5) var(--space-3);
}
.module-sidebar .back-link {
  display: flex; align-items: center; gap: var(--space-2); font-size: 0.8125rem; color: var(--text-tertiary);
  text-decoration: none; margin-bottom: var(--space-5);
}
.module-sidebar .back-link:hover { color: var(--text-secondary); }
/* 한글에는 대소문자가 없어 `text-transform: uppercase`가 무의미하고(섞인
   영문만 튄다), 양수 자간은 낱글자를 흩어놓는다. KRDS도 24px 이하는 자간
   0을 규정한다. 크기도 11px → 13px로 올린다 — 11px + 흐린 회색 + 벌어진
   자간은 읽기 어려운 조건 세 개가 겹친 것이었다. */
.nav-group-title {
  display: flex; align-items: center; gap: var(--space-2);
  font-size: 0.8125rem; font-weight: 700; color: var(--text-tertiary);
  padding: 0 var(--space-3); margin-bottom: var(--space-3);
}
.nav-item {
  display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-sm); color: var(--sidebar-text); font-size: 0.875rem; margin-bottom: 2px;
  text-decoration: none;
}
.nav-item:hover { background: var(--bg-hover); color: var(--sidebar-text-hover); }
.nav-item.active { background: var(--sidebar-active-bg); color: var(--sidebar-active-text); font-weight: 600; }
.module-main { flex: 1; padding: var(--space-6); overflow-x: auto; }
.module-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--space-6); flex-wrap: wrap; gap: var(--space-3); }
.module-header h2 { margin: 0 0 var(--space-1); font-size: 1.125rem; }
.module-header .muted { color: var(--text-secondary); font-size: 0.8125rem; margin: 0; }
.quick-actions { display: flex; gap: var(--space-2); }

.kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-6); }
.kpi-card {
  background: var(--bg-card); border: 1px solid var(--border-color); border-radius: var(--radius-lg);
  padding: var(--space-4) var(--space-5); box-shadow: var(--shadow-sm); display: block; text-decoration: none; color: inherit;
}
.kpi-link { transition: var(--transition-fast); cursor: pointer; }
.kpi-link:hover { border-color: var(--primary-light); box-shadow: var(--shadow-md); }
.kpi-label { font-size: 0.8125rem; color: var(--text-secondary); margin-bottom: var(--space-2); }
.kpi-value { font-size: 1.375rem; font-weight: 700; font-variant-numeric: tabular-nums; letter-spacing: -0.01em; }
.kpi-value.warn { color: var(--warning); }

/* 패널 사이 여백을 패널이 스스로 갖는다. 예전에는 26곳에서 인라인으로
   `margin-bottom: var(--space-6)`을 넣고 있었고, 빠뜨린 곳은 붙어 있었다.
   마지막 패널은 0으로 되돌려 페이지 끝에 여백이 두 번 들어가지 않게 한다. */
.panel {
  background: var(--bg-card); border: 1px solid var(--border-color);
  border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden;
  margin-block-end: var(--space-6);
}
.panel:last-child { margin-block-end: 0; }
.panel-head { display: flex; justify-content: space-between; align-items: center; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-light); }
.panel-head h3 { margin: 0; font-size: 0.9375rem; }
.panel-head .link, .link { font-size: 0.8125rem; color: var(--primary); font-weight: 600; text-decoration: none; }

/* 표 안 14px. 결정된 눈금이다 — 표 밖 15px, 표 안 14px(2026-09-09 쟁점 3).
   예전 13px은 세 방향(KRDS 17px / 15px / 13px)이 갈린 중에 가장 작은 쪽이었다.
   이 규칙은 레이어 밖이라 adriven-ui.css의 ad.base를 이긴다 — 이행이 끝나면
   이 파일이 비고 눈금이 한 곳으로 모인다. */
table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
/* 표 머리글도 같은 이유로 대문자 변환과 자간을 뺀다. 이 규칙은 거의 모든
   화면에 있고, 명암비는 --text-tertiary를 4.83으로 올려 함께 해소했다. */
thead th {
  text-align: left; padding: var(--space-3) var(--space-5); color: var(--text-tertiary); font-weight: 600;
  font-size: 0.75rem; border-bottom: 1px solid var(--border-light);
}
tbody td, tfoot td { padding: var(--space-3) var(--space-5); border-bottom: 1px solid var(--border-light); vertical-align: middle; }
tbody tr:last-child td { border-bottom: none; }
tfoot td { font-weight: 700; border-top: 2px solid var(--border-color); border-bottom: none; }
.num { text-align: right; font-variant-numeric: tabular-nums; }
.memo-main { font-weight: 600; }
.acct-flow { display: flex; align-items: center; gap: 6px; color: var(--text-secondary); white-space: nowrap; }
.acct-flow .arrow { color: var(--text-tertiary); font-size: 0.75rem; }

.pill { display: inline-flex; align-items: center; gap: 5px; padding: 3px var(--space-2); border-radius: var(--radius-full); font-size: 0.75rem; font-weight: 600; background: var(--border-light); color: var(--text-secondary); }
.pill::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--text-tertiary); }
.pill.ok { background: var(--success-bg); color: var(--success); }
.pill.ok::before { background: var(--success); }
.pill.pending { background: var(--warning-bg); color: var(--warning); }
.pill.pending::before { background: var(--warning); }
.pill.bad { background: var(--danger-bg); color: var(--danger); }
.pill.bad::before { background: var(--danger); }

/* 계정과목/경비/분개 입력 폼 공통 */
form label { font-size: 0.8125rem; color: var(--text-secondary); }
form input, form select {
  display: block; margin-top: 4px; padding: var(--space-2) var(--space-3); border: 1px solid var(--border-color);
  border-radius: var(--radius-sm); font-family: inherit; font-size: 0.875rem; background: var(--bg-card); color: var(--text-primary);
}
#line-table input, #line-table select { margin-top: 0; width: 100%; }

/* 파일 선택칸은 브라우저가 자체 버튼을 그려서 이미 높이를 갖는다 — 위
   공통 패딩(8px)을 그대로 받으면 옆의 텍스트 입력칸보다 5px쯤 높아지고,
   폼이 align-items:flex-end인 flex 행이라 그 셀만 커지면서 라벨 줄이
   어긋나 보인다. 세로 패딩만 줄여 이웃 입력칸 높이에 맞춘다. */
form input[type="file"] { padding-top: 5px; padding-bottom: 5px; }

/* --- 영업관리 단계 막대 ---------------------------------------------------
   홈에서는 링크(그 단계 목록으로 간다), 상세에서는 버튼(그 단계로 옮긴다)
   이지만 **모양은 같아야 한다** — 쓰는 사람에게는 같은 막대다. 대시보드
   카드가 <a>와 <button> 두 태그를 `.tile-link` 하나로 묶은 것과 같은 방식.

   칸 다섯이 폭을 똑같이 나눈다(`flex: 1 1 0`). 내용 길이에 맞춰 늘어나게
   두면 건수가 바뀔 때마다 칸 폭이 달라져서 어제와 비교할 수 없다. */
.stage-track {
  display: flex; gap: var(--space-2); list-style: none;
  margin: 0; padding: var(--space-5); flex-wrap: wrap;
}
.stage-step { flex: 1 1 0; min-width: 120px; display: flex; }
.stage-link {
  flex: 1; display: flex; flex-direction: column; gap: 2px;
  padding: var(--space-3) var(--space-4); text-align: left;
  border: 1px solid var(--border-color); border-radius: var(--radius-md);
  background: var(--bg-card); color: var(--text-primary);
  text-decoration: none; font: inherit; cursor: pointer;
}
.stage-link:hover { border-color: var(--primary-light); background: var(--bg-hover); }
.stage-link--current {
  border-color: var(--primary); background: var(--ad-brand-wash);
}
.stage-name { font-weight: 600; font-size: 0.875rem; }
.stage-count { font-size: 0.75rem; color: var(--text-secondary); }
.stage-amount { font-size: 0.8125rem; font-variant-numeric: tabular-nums; }

/* 표 안의 「완료」처럼 줄에 끼워 넣는 폼은 자기 줄을 만들면 안 된다. */
tbody td > form { margin: 0; }

@media (max-width: 640px) {
  .module-shell { flex-direction: column; }
  .module-sidebar { width: 100%; border-right: none; border-bottom: 1px solid var(--sidebar-border); }
}

/* --- 연령 구간 (미수금·미지급금) -------------------------------------------
 *
 * 「연체 3,200만원」만으로는 어제 지난 한 건인지 반년 묵은 다섯 건인지
 * 알 수 없다. 둘은 할 일이 완전히 다르다 — 앞은 전화 한 통, 뒤는 대손을
 * 의심할 자리다.
 *
 * 단계 막대(.stage-track)와 같은 꼴로 만든다. 같은 시스템에서 같은 모양을
 * 두 번 발명하면 쓰는 사람이 매번 새로 읽는다. 다만 이것은 누르는 것이
 * 아니라 **읽는 것**이라 링크가 아니다.
 *
 * 디자인 시스템으로 옮길 후보다(이 파일 머리말 참고).
 */
.aging {
  display: flex; gap: var(--space-3); flex-wrap: wrap;
  padding: var(--space-4) var(--space-5) 0;
}
.aging__cell {
  flex: 1 1 0; min-width: 120px;
  display: flex; flex-direction: column; gap: 2px;
  padding: var(--space-3) var(--space-4);
  border: 1px solid var(--border-light); border-radius: var(--radius-md);
  background: var(--bg-subtle);
}
.aging__label { font-size: 0.75rem; color: var(--text-secondary); }
.aging__amount { font-weight: 600; font-variant-numeric: tabular-nums; }
.aging__count { font-size: 0.75rem; color: var(--text-tertiary); }
/* 오래된 쪽일수록 눈에 걸리게. 색만으로 뜻을 전하지 않으려고 건수·금액이
   늘 함께 있고, 60일 초과는 테두리로도 구분된다. */
.aging__cell--d31_60 .aging__amount { color: var(--warning); }
.aging__cell--d60_plus { border-color: var(--danger); }
.aging__cell--d60_plus .aging__amount { color: var(--danger); }
/* 0원인 구간은 조용히. 빼지는 않는다 — 칸 수가 자료에 따라 달라지면
   어제 보던 자리에 오늘 다른 숫자가 있다. */
.aging__cell--empty { opacity: 0.55; }
