/* 공통 디자인 기준: 토큰 · 글꼴 · 공통 부품(버튼·입력·선택·탭·태그·알림·대화상자·표·빈 상태·로딩)
   화면 틀에는 색을 쓰지 않는다. 색은 셀 상태·알림 같은 의미에만, 강조 파랑은 초점·링크·선택에만. */
@font-face{font-family:"Pretendard";src:url("/fonts/PretendardVariable.woff2") format("woff2-variations"),url("/fonts/PretendardVariable.woff2") format("woff2");font-weight:45 920;font-style:normal;font-display:swap}

:root{
  color-scheme:light;
  /* 면 */
  --ground:#f2f4f7; --surface:#ffffff; --raised:#f7f8fa; --active:#e9ecf1;
  --border:#e1e5ea; --rule:#eceff3; --control:#8a939e; --control-soft:#d3d8de;
  /* 글자 */
  --text:#111418; --muted:#59626e; --faint:#6b7480;
  /* 동작 */
  --primary:#16191d; --primary-hover:#2c3137; --on-primary:#ffffff;
  --accent:#1d5fbf; --accent-soft:#e8f0fb; --focus:#1d5fbf;
  /* 의미 색: 바탕 · 글자 · 기호 */
  --chg-bg:#fff3c4; --chg-ink:#5c4300; --chg-mark:#b38600;
  --chk-bg:#ffe6d2; --chk-ink:#7f3300; --chk-mark:#cf5f0a;
  --new-bg:#ddf3e4; --new-ink:#18562f; --new-mark:#2e7d4a;
  --rm-bg:#eef0f3;  --rm-ink:#59626e;
  --warn-bg:#fff7e6; --warn-line:#f0d49a; --warn-ink:#7a4b00;
  --err-bg:#fdeeee;  --err-line:#f2c0c0;  --err-ink:#a01f1f;
  --ok-bg:#e3f4e9;   --ok-line:#bfe3cb;   --ok-ink:#18562f;
  --info-bg:#eef3fb; --info-line:#cfdcf1; --info-ink:#1f3f73;
  /* 글꼴 · 크기 */
  --font:"Pretendard",-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo","Malgun Gothic",system-ui,sans-serif;
  --fs-xs:12px; --fs-sm:13px; --fs-md:14px; --fs-lg:16px; --fs-xl:20px;
  /* 간격(4px 단위) · 모서리 · 높이 */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:20px; --s6:24px; --s8:32px;
  --gap:12px; --pad:16px;
  --r-tag:4px; --r-ctl:6px; --r-card:8px;
  --h-ctl:32px; --h-ctl-sm:26px; --h-ctl-lg:40px; --row:30px;
  /* 떠 있는 것(대화상자·메뉴)에만 쓰는 그림자 */
  --float:0 12px 32px rgba(17,20,24,.16),0 2px 6px rgba(17,20,24,.08);
}
@media (prefers-color-scheme:dark){:root{
  color-scheme:dark;
  --ground:#0f1114; --surface:#171a1e; --raised:#1d2126; --active:#262b31;
  --border:#2a2f36; --rule:#22262c; --control:#6b7480; --control-soft:#3a414a;
  --text:#e8eaed; --muted:#a3abb5; --faint:#8e96a0;
  --primary:#e8eaed; --primary-hover:#ffffff; --on-primary:#111418;
  --accent:#6ea3f0; --accent-soft:#1b2a41; --focus:#6ea3f0;
  --chg-bg:#3d3412; --chg-ink:#f3e3a3; --chg-mark:#d9b43a;
  --chk-bg:#46280f; --chk-ink:#ffcfa8; --chk-mark:#f08a3c;
  --new-bg:#173322; --new-ink:#b4e5c3; --new-mark:#5cc283;
  --rm-bg:#22262c;  --rm-ink:#a3abb5;
  --warn-bg:#33270f; --warn-line:#5c4716; --warn-ink:#f3d48e;
  --err-bg:#3a1a1a;  --err-line:#6b2c2c;  --err-ink:#ffb4b4;
  --ok-bg:#173322;   --ok-line:#2a5a3b;   --ok-ink:#b4e5c3;
  --info-bg:#172338; --info-line:#2b3f5f; --info-ink:#b9cff2;
  --float:0 12px 32px rgba(0,0,0,.5);
}}

/* ---------- 바탕 ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--ground);color:var(--text);font-family:var(--font);font-size:var(--fs-md);line-height:1.5;
  font-feature-settings:"ss06";-webkit-font-smoothing:antialiased}
h1,h2,h3{margin:0;font-weight:600;letter-spacing:-.01em}
p{margin:0}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
code{font-family:var(--font);font-variant-numeric:tabular-nums;background:var(--raised);border:1px solid var(--rule);border-radius:var(--r-tag);padding:0 5px}
.num,td.n,th.n{font-variant-numeric:tabular-nums}
[hidden]{display:none!important}
.nowrap{white-space:nowrap}
.grow{flex:1;min-width:0}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* 키보드 초점: 모든 조작 요소에 같은 파란 테 */
:focus{outline:none}
:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:var(--r-ctl)}

/* ---------- 아이콘(색은 글자색을 따름) ---------- */
.ico{display:inline-block;flex:none;width:14px;height:14px;background:currentColor;vertical-align:-2px;
  -webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
.i-check{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E")}
.i-warn{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5M12 17.2v.3'/%3E%3C/svg%3E")}
.i-err{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}
.i-info{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v5.5M12 7.6v.3'/%3E%3C/svg%3E")}
.i-ask{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9.6 9.4a2.5 2.5 0 1 1 3.6 2.3c-.8.4-1.2 1-1.2 1.8v.4M12 17v.3'/%3E%3C/svg%3E")}
.i-x{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'%3E%3Cpath d='M6.5 6.5l11 11M17.5 6.5l-11 11'/%3E%3C/svg%3E")}
.i-chev{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 5.5l6.5 6.5L9 18.5'/%3E%3C/svg%3E")}
.i-upload{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 15V4M7.5 8.5L12 4l4.5 4.5'/%3E%3Cpath d='M4 14v4.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V14'/%3E%3C/svg%3E")}
.i-download{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 4v11M7.5 10.5L12 15l4.5-4.5'/%3E%3Cpath d='M4 14v4.5A1.5 1.5 0 0 0 5.5 20h13a1.5 1.5 0 0 0 1.5-1.5V14'/%3E%3C/svg%3E")}
.i-chat{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M4 5.5h16v10H10l-4.5 3.5v-3.5H4z'/%3E%3C/svg%3E")}
.i-sheet{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Crect x='4' y='4' width='16' height='16' rx='1.5'/%3E%3Cpath d='M4 9.5h16M4 14.5h16M10 9.5V20'/%3E%3C/svg%3E")}
.i-pen{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Cpath d='M4.5 19.5l1-4.5L15.5 5l3.5 3.5-10 10z'/%3E%3C/svg%3E")}
.i-reply{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9.5 6L4 11.5 9.5 17'/%3E%3Cpath d='M4.5 11.5H14a6 6 0 0 1 6 6V19'/%3E%3C/svg%3E")}
.i-undo{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 5L4 9l4 4'/%3E%3Cpath d='M4.5 9H14a5.5 5.5 0 0 1 0 11h-3'/%3E%3C/svg%3E")}
.i-redo{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M16 5l4 4-4 4'/%3E%3Cpath d='M19.5 9H10a5.5 5.5 0 0 0 0 11h3'/%3E%3C/svg%3E")}
.i-reset{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 12a7.5 7.5 0 1 0 2.2-5.3'/%3E%3Cpath d='M4.5 4.5v4h4'/%3E%3C/svg%3E")}
.i-next{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12h15M14 6.5l5.5 5.5-5.5 5.5'/%3E%3C/svg%3E")}
.i-lock{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Crect x='5' y='10.5' width='14' height='9.5' rx='1.5'/%3E%3Cpath d='M8.5 10.5V8a3.5 3.5 0 0 1 7 0v2.5'/%3E%3C/svg%3E")}
.i-more{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='black'%3E%3Ccircle cx='5.5' cy='12' r='1.8'/%3E%3Ccircle cx='12' cy='12' r='1.8'/%3E%3Ccircle cx='18.5' cy='12' r='1.8'/%3E%3C/svg%3E")}
.i-panel{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'%3E%3Crect x='3.5' y='4.5' width='17' height='15' rx='2'/%3E%3Cpath d='M14.5 4.5v15'/%3E%3C/svg%3E")}
.i-search{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round'%3E%3Ccircle cx='10.5' cy='10.5' r='6'/%3E%3Cpath d='M15 15l5 5'/%3E%3C/svg%3E")}

/* ---------- 버튼: 주(거의 검정) · 보조(흰 바탕 테두리) · 위험(빨간 글자) · 글자형 ---------- */
button,.btn{font:inherit;font-size:var(--fs-sm);font-weight:500;line-height:1;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;height:var(--h-ctl);padding:0 12px;
  border-radius:var(--r-ctl);border:1px solid var(--control-soft);background:var(--surface);color:var(--text);
  text-decoration:none;white-space:nowrap;transition:background-color .12s,border-color .12s,color .12s}
button:hover,.btn:hover{border-color:var(--control);background:var(--raised);text-decoration:none}
button:active,.btn:active{background:var(--active)}
button.primary,.btn.primary{background:var(--primary);border-color:var(--primary);color:var(--on-primary)}
button.primary:hover,.btn.primary:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
button.danger,.btn.danger{color:var(--err-ink);border-color:var(--err-line)}
button.danger:hover,.btn.danger:hover{background:var(--err-bg);border-color:var(--err-ink)}
button.primary.danger{background:var(--err-ink);border-color:var(--err-ink);color:#fff}
button.ghost,.btn.ghost{border-color:transparent;background:transparent;color:var(--muted)}
button.ghost:hover,.btn.ghost:hover{background:var(--active);color:var(--text)}
button.link{border:0;background:none;height:auto;padding:0;color:var(--accent);font-weight:500}
button.link:hover{background:none;text-decoration:underline}
button.small,.btn.small{height:var(--h-ctl-sm);padding:0 9px;font-size:var(--fs-xs)}
button:disabled,.btn.disabled{cursor:not-allowed;background:var(--raised);border-color:var(--border);color:var(--faint);pointer-events:none}
button.primary:disabled{background:var(--active);border-color:var(--active);color:var(--muted)}

/* ---------- 입력 · 선택 ---------- */
input[type=text],input[type=password],input[type=tel],input[type=date],input[type=number],select,textarea{
  font:inherit;font-size:var(--fs-sm);color:var(--text);background:var(--surface);
  border:1px solid var(--control);border-radius:var(--r-ctl);height:var(--h-ctl);padding:0 10px;min-width:0}
input::placeholder,textarea::placeholder{color:var(--faint)}
select{padding-right:28px;appearance:none;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2359626e' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 10l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 8px center;background-size:14px}
textarea{height:auto;padding:8px 10px;line-height:1.55;resize:vertical;width:100%}
input:hover,select:hover,textarea:hover{border-color:var(--text)}
input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--focus);outline-offset:0;border-color:var(--focus);border-radius:var(--r-ctl)}
input:disabled,select:disabled,textarea:disabled{background:var(--raised);color:var(--muted);border-color:var(--control-soft);cursor:not-allowed}
input[type=checkbox],input[type=radio]{width:16px;height:16px;margin:0;accent-color:var(--primary);flex:none;cursor:pointer}
input[type=file]{font:inherit;font-size:var(--fs-sm);color:var(--muted);max-width:100%}
input[type=file]::file-selector-button{font:inherit;font-size:var(--fs-xs);font-weight:500;height:var(--h-ctl-sm);padding:0 10px;margin-right:10px;
  border:1px solid var(--control-soft);border-radius:var(--r-ctl);background:var(--surface);color:var(--text);cursor:pointer}
.field{display:flex;flex-direction:column;gap:6px}
.field>label,label.lab{font-size:var(--fs-xs);font-weight:500;color:var(--muted)}
label{cursor:pointer}
label:has(> input[type=checkbox]),label:has(> input[type=radio]){display:inline-flex;align-items:center;gap:6px}

/* ---------- 탭(밑줄) · 필터(눌림 버튼 묶음) ---------- */
.tabs{display:flex;gap:2px;align-items:stretch}
.tabs a{display:inline-flex;align-items:center;padding:0 10px;color:var(--muted);font-size:var(--fs-sm);font-weight:500;
  text-decoration:none;border-bottom:2px solid transparent;margin-bottom:-1px}
.tabs a:hover{color:var(--text);text-decoration:none}
.tabs a.on,.tabs a[aria-current=page]{color:var(--text);border-bottom-color:var(--text)}
.seg{display:inline-flex;gap:2px;padding:2px;background:var(--active);border-radius:var(--r-ctl)}
.seg button{height:24px;padding:0 10px;border:0;background:transparent;color:var(--muted);font-size:var(--fs-xs);border-radius:4px}
.seg button:hover{background:transparent;color:var(--text)}
.seg button.on,.seg button[aria-pressed=true]{background:var(--surface);color:var(--text);box-shadow:0 0 0 1px var(--border)}

/* ---------- 태그(상태 표시: 옅은 바탕 + 같은 계열 글자 + 기호) ---------- */
.tag,.badge{display:inline-flex;align-items:center;gap:4px;flex:none;height:20px;padding:0 7px;border-radius:var(--r-tag);
  font-size:var(--fs-xs);font-weight:500;line-height:1;white-space:nowrap;background:var(--rm-bg);color:var(--rm-ink);vertical-align:1px}
.tag .ico,.badge .ico{width:12px;height:12px}
.badge.ok,.tag.ok{background:var(--ok-bg);color:var(--ok-ink)}
.badge.chk,.tag.chk{background:var(--chk-bg);color:var(--chk-ink)}
.badge.fail,.tag.err{background:var(--err-bg);color:var(--err-ink)}
.badge.none{background:var(--rm-bg);color:var(--rm-ink)}
.tag.new{background:var(--new-bg);color:var(--new-ink)}
.tag.chg{background:var(--chg-bg);color:var(--chg-ink)}
.badge.ok::before,.badge.chk::before,.badge.fail::before,.badge.none::before{content:"";width:12px;height:12px;background:currentColor;
  -webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat}
.badge.ok::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7.5'/%3E%3C/svg%3E")}
.badge.chk::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 7.5v5.5M12 16.4v.3'/%3E%3C/svg%3E")}
.badge.fail::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}
.badge.none::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linejoin='round'%3E%3Crect x='5' y='10.5' width='14' height='9.5' rx='1.5'/%3E%3Cpath d='M8.5 10.5V8a3.5 3.5 0 0 1 7 0v2.5'/%3E%3C/svg%3E")}

/* ---------- 알림: 안내 · 경고 · 오류 · 완료 (아이콘 + 글자) ---------- */
.notice,.warn{position:relative;display:block;font-size:var(--fs-sm);line-height:1.5;padding:8px 12px 8px 34px;border-radius:var(--r-ctl);
  background:var(--info-bg);border:1px solid var(--info-line);color:var(--info-ink)}
.notice::before,.warn::before{content:"";position:absolute;left:12px;top:11px;width:14px;height:14px;background:currentColor;
  -webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat;
  --i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M12 11v5.5M12 7.6v.3'/%3E%3C/svg%3E")}
.notice.warn2,.warn,.notice.is-warn{background:var(--warn-bg);border-color:var(--warn-line);color:var(--warn-ink)}
.notice.warn2::before,.warn::before,.notice.is-warn::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3.5L2.5 20h19z'/%3E%3Cpath d='M12 10v4.5M12 17.2v.3'/%3E%3C/svg%3E")}
.notice.is-err{background:var(--err-bg);border-color:var(--err-line);color:var(--err-ink)}
.notice.is-err::before{--i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}
.notice a{color:inherit;text-decoration:underline;font-weight:600}
.notice button{margin-left:8px;vertical-align:baseline}
/* 한 줄 상태 문구(작업 진행·결과). 오류는 빨간 글자 + 아이콘 */
.status{font-size:var(--fs-xs);color:var(--muted);min-height:18px;white-space:pre-line;line-height:1.5}
.status:empty{min-height:0}
.status.err{color:var(--err-ink);padding-left:18px;position:relative}
.status.err::before{content:"";position:absolute;left:0;top:2px;width:13px;height:13px;background:currentColor;
  -webkit-mask:var(--i) center/contain no-repeat;mask:var(--i) center/contain no-repeat;
  --i:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpath d='M9 9l6 6M15 9l-6 6'/%3E%3C/svg%3E")}
.status.busy::before,.loading::before{content:"";display:inline-block;width:12px;height:12px;margin-right:7px;vertical-align:-2px;
  border:2px solid var(--control-soft);border-top-color:var(--text);border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- 대화상자 ---------- */
dialog{border:1px solid var(--border);border-radius:10px;background:var(--surface);color:var(--text);padding:0;
  width:min(480px,94vw);max-width:94vw;max-height:90vh;box-shadow:var(--float)}
dialog.wide{width:min(920px,96vw)}
dialog>form{display:flex;flex-direction:column;gap:var(--s3);padding:var(--s5) var(--s6) var(--s5)}
dialog h2{font-size:var(--fs-lg);font-weight:600;line-height:1.4}
dialog .sub{font-size:var(--fs-sm);color:var(--muted)}
dialog::backdrop{background:rgba(17,20,24,.42)}
.dlg-actions,dialog .row.end{display:flex;gap:var(--s2);justify-content:flex-end;flex-wrap:wrap;margin-top:var(--s2);
  padding-top:var(--s4);border-top:1px solid var(--rule)}
dialog.confirm .msg{font-size:var(--fs-md);white-space:pre-line;line-height:1.6}

/* ---------- 표(관리·확인 화면) ---------- */
.tbl,.btable{width:100%;border-collapse:collapse;font-size:var(--fs-sm);white-space:normal}
.tbl th,.btable th{text-align:left;font-weight:500;font-size:var(--fs-xs);color:var(--muted);padding:8px 10px;border-bottom:1px solid var(--border);
  background:var(--surface);position:sticky;top:0;z-index:1;white-space:nowrap}
.tbl td,.btable td{text-align:left;vertical-align:top;padding:8px 10px;border-bottom:1px solid var(--rule)}
.tbl tbody tr:last-child td,.btable tbody tr:last-child td{border-bottom:0}
.tbl tbody tr:hover td,.btable tbody tr:hover td{background:var(--raised)}
.btable td.n,.btable th.n{text-align:right}
.btable ul{margin:4px 0 0;padding-left:16px;font-size:var(--fs-xs);color:var(--muted)}

/* ---------- 빈 상태 · 로딩 ---------- */
.empty{padding:48px 16px;text-align:center;color:var(--muted);font-size:var(--fs-md);line-height:1.6}
.empty strong{display:block;color:var(--text);font-size:var(--fs-lg);font-weight:600;margin-bottom:4px}
.empty button{margin-top:var(--s4)}
.loading{color:var(--muted)}

/* ---------- 알림 띠(토스트): 화면 아래 가운데, 한 줄 문구 + 동작 단추 하나 ---------- */
.toasts{position:fixed;left:50%;bottom:var(--s6);transform:translateX(-50%);z-index:50;display:flex;flex-direction:column;gap:var(--s2);
  align-items:center;pointer-events:none;width:max-content;max-width:min(640px,92vw)}
.toast{pointer-events:auto;display:flex;align-items:center;gap:var(--s3);min-height:40px;padding:6px 8px 6px 14px;border-radius:var(--r-card);
  background:var(--primary);color:var(--on-primary);font-size:var(--fs-sm);box-shadow:var(--float);max-width:100%}
.toast .msg{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.toast button{height:var(--h-ctl-sm);padding:0 10px;font-size:var(--fs-xs);background:transparent;color:var(--on-primary);border-color:currentColor}
.toast button:hover{background:var(--primary-hover);color:var(--on-primary);border-color:currentColor}
.toast button.x{border-color:transparent;padding:0 6px}
.toast.is-err{background:var(--err-ink)}
/* 단축키 표시 */
kbd{font-family:var(--font);font-size:11px;font-weight:500;color:var(--muted);background:var(--raised);border:1px solid var(--border);border-bottom-width:2px;
  border-radius:var(--r-tag);padding:0 4px;line-height:16px}

@media (prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;animation-duration:0s!important;animation-iteration-count:1!important}}
