/* 신규 채널 등록 모달 — 목업(아티팩트 1b27966c)의 CSS를 그대로 옮긴 것.
   ⛔ 이 파일은 손으로 고치지 않는다. 화면을 바꿔야 하면 목업을 고치고 다시 옮긴다.
      (기억으로 새로 짰다가 목업과 전혀 다른 화면이 나왔다 — 2026-08-20)
   목업은 독립 페이지라 body/:root 를 쓴다. 어드민 전역과 부딪히지 않게
   모든 셀렉터를 #cnModal 아래로 내렸다: :root→#cnModal, body→#cnModal .cn-page.
   아래 '모달 골격'만 목업에 없는 부분(목업은 페이지, 여기선 모달). */

.cn-overlay {
  position: fixed; inset: 0; z-index: 130;
  background: rgba(26,29,33,.42);
  display: flex; align-items: flex-start; justify-content: center;
  padding: 24px 16px; overflow-y: auto;
}
.cn-overlay[hidden] { display: none; }
.cn-modal {
  width: 100%; max-width: 1160px; margin: auto;
  background: #F4F5F7;                      /* 목업 body 배경 — 흰 카드가 떠 보이게 */
  border-radius: 20px; box-shadow: 0 4px 8px rgba(16,24,40,.06), 0 16px 40px rgba(16,24,40,.12);
  padding: 0; overflow: hidden;
}
/* 닫기 버튼은 두지 않는다 — 바깥 클릭·Esc 로 닫는다(사용자 지시 2026-08-20). */

/* ══════════ 아래부터 목업 CSS 원본 (셀렉터만 #cnModal 스코프) ══════════ */

/* ⚠ 목업과 어드민 전역(common.css)이 클래스명 17개를 공유한다. 목업이 지정하지
   '않는' 속성은 어드민 값이 그대로 남아 섞인다 — caret 이 삼각형이 되고, 제목 줄에
   흰 배경이 깔리고, 글자 굵기가 달라졌다. 모달 안에서는 전역 정의를 통째로 되돌린다.
   목업 규칙이 아래에 오므로 그대로 이긴다.
   ⛔ 이 블록은 목업 CSS 블록보다 반드시 위에 있어야 한다. 그리고 목업 CSS 를 다시
      옮길 때 같이 지워지기 쉽다 — 실제로 한 번 날려서 제목 줄 흰 배경이 되돌아왔다
      (2026-08-20). 재이식 후 `grep -c "all: revert"` 로 살아 있는지 확인할 것.
   ⛔ 목업이 새 클래스를 쓰면 이 목록도 같이 늘려야 한다. */
#cnModal .btn,
#cnModal .btn-ghost,
#cnModal .btn-primary,
#cnModal .cal-caret,
#cnModal .cal-nav-ico,
#cnModal .cal-pop,
#cnModal .cal-pop-actions,
#cnModal .cal-trigger,
#cnModal .field,
#cnModal .num,
#cnModal .pagehead,
#cnModal .pagehead-title,
#cnModal .table-card,
#cnModal .table-scroll,
#cnModal .ua-act,
#cnModal .ua-chip,
#cnModal .ua-table { all: revert; }

/* 상태 셀렉터는 위 목록으로 안 잡힌다 — 목업은 비활성을 부모 .off{opacity:.45}
   하나로만 표현하는데 어드민 :disabled{opacity:.4} 가 겹쳐 두 번 흐려졌다. */
#cnModal .ua-act:disabled, #cnModal input:disabled, #cnModal button:disabled { opacity: 1; }

#cnModal{
    --bg:#F4F5F7; --surface:#FFFFFF; --surface-2:#F4F5F7; --surface-3:#FAFBFC;
    --thead-bg:#EEF0F3;
    --line:#ECEEF1; --line-2:#E4E7EB; --line-strong:#D6DAE0;
    --text:#1A1D21; --text-2:#4A5159; --muted:#79818B; --charcoal:#3A4047;
    --brand:#3E4D41; --brand-2:#4A5A4D; --brand-ink:#2E3A30;
    --sage:#9BAA9E; --sage-tint:#EAEFEB; --sage-tint-2:#DCE5DE;
    --pos:#1F8A4C; --pos-bg:#E7F4EC; --neg:#D23B3B; --neg-bg:#FCEDED;
    --radius:18px; --radius-lg:20px; --radius-md:12px; --radius-sm:10px; --radius-pill:999px;
    --shadow-card:0 1px 2px rgba(16,24,40,.04), 0 8px 24px rgba(16,24,40,.06);
    --shadow-pop:0 4px 8px rgba(16,24,40,.06), 0 16px 40px rgba(16,24,40,.12);
    --font-sans:-apple-system, BlinkMacSystemFont, "Apple SD Gothic Neo", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  }
#cnModal *{box-sizing:border-box;}
#cnModal .cn-page{
    margin:0; background:var(--bg); color:var(--text);
    font-family:var(--font-sans); font-size:14px; line-height:1.5;
    padding:20px 16px 60px;
  }
#cnModal .wrap{max-width:1100px; margin:0 auto;}
#cnModal .pagehead{display:flex; align-items:center; gap:12px; margin-bottom:16px; flex-wrap:wrap;}
#cnModal .pagehead-title{font-size:20px; font-weight:700; letter-spacing:-.01em; margin:0;}
#cnModal .pagehead .spacer{flex:1 1 auto;}
#cnModal .note{color:var(--muted); font-size:12.5px; margin:0 0 18px;}
#cnModal .btn{
    display:inline-flex; align-items:center; justify-content:center; gap:6px;
    border:1px solid var(--line); border-radius:var(--radius-pill);
    font-size:13px; font-weight:600; padding:8px 14px;
    background:var(--surface); color:var(--charcoal);
    font-family:inherit; cursor:pointer;
  }
#cnModal .btn-primary{background:var(--brand); border-color:var(--brand); color:#fff; padding:11px 16px; font-size:14px;}
#cnModal .btn-primary:hover{background:var(--brand-2); border-color:var(--brand-2);}
#cnModal .btn-ghost{background:var(--surface); border-color:var(--line-strong); color:var(--charcoal);}
#cnModal .btn-ghost:hover{background:var(--surface-2);}
#cnModal .ua-act{
    display:inline-flex; align-items:center; gap:4px;
    font-size:11.5px; font-weight:600; line-height:1;
    padding:6px 9px; border-radius:var(--radius-sm);
    border:1px solid var(--line-strong); background:var(--surface); color:var(--text-2);
    cursor:pointer; white-space:nowrap; font-family:inherit;
  }
#cnModal .ua-act:hover{background:var(--surface-2); color:var(--text);}
#cnModal .ua-act.danger{color:var(--neg); border-color:var(--neg-bg);}
#cnModal .ua-chip{display:inline-block; font-size:11px; font-weight:700; padding:2px 9px; border-radius:var(--radius-pill); white-space:nowrap;}
#cnModal .chip-sale{color:var(--brand); background:var(--sage-tint-2);}
#cnModal .chip-supply{color:var(--text-2); background:var(--surface-2);}
#cnModal .chip-popup{color:var(--brand-ink); background:var(--sage-tint);}
#cnModal .chip-active{color:var(--pos); background:var(--pos-bg);}
#cnModal .table-card{background:var(--surface); border:none; border-radius:var(--radius); box-shadow:var(--shadow-card); overflow:hidden; margin-bottom:22px;}
#cnModal .table-scroll{overflow-x:auto;}
#cnModal .ua-table{width:100%; border-collapse:separate; border-spacing:0; font-size:12.5px; min-width:640px;}
#cnModal .ua-table thead th{
    position:sticky; top:0; z-index:1;
    background:var(--thead-bg); color:var(--text-2);
    font-weight:700; text-align:left; white-space:nowrap;
    padding:9px 12px; border-bottom:1px solid var(--line);
  }
#cnModal .ua-table tbody td{padding:10px 12px; border-bottom:1px solid var(--line); vertical-align:middle; color:var(--text);}
#cnModal .ua-table tbody tr:nth-child(even) td{background:rgba(243,244,246,.5);}
#cnModal .ua-table tbody tr:last-child td{border-bottom:none;}
#cnModal .ua-table tbody tr.clickable{cursor:pointer;}
#cnModal .ua-table tbody tr.clickable:hover td{background:var(--sage-tint);}
#cnModal .num{font-variant-numeric:tabular-nums; text-align:right;}
#cnModal th.num{text-align:right;}
/* ── 폼 ── */
#cnModal .card{background:var(--surface); border-radius:var(--radius); box-shadow:var(--shadow-card); padding:20px 22px; margin-bottom:18px;}
#cnModal .card-head{display:flex; align-items:center; gap:10px; margin:0 0 16px;}
#cnModal .card-title{font-size:15px; font-weight:700; margin:0; letter-spacing:-.01em;}
#cnModal .card-head .spacer{flex:1 1 auto;}
#cnModal .hint{font-size:11.5px; color:var(--muted); font-weight:400;}
#cnModal .grid2{display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:0 16px;}
@media (max-width:720px){#cnModal .grid2{grid-template-columns:1fr;}
}
#cnModal .field{margin-bottom:14px;}
#cnModal .field label{display:block; font-size:12px; font-weight:600; color:var(--text-2); margin-bottom:6px;}
#cnModal .field input, #cnModal .field select, #cnModal .field textarea{
    width:100%; padding:10px 12px;
    border:1px solid var(--line-strong); border-radius:var(--radius-md);
    font-size:14px; font-family:inherit; color:var(--text); background:var(--surface);
  }
#cnModal .field textarea{min-height:72px; resize:vertical; line-height:1.5;}
#cnModal .field input:focus, #cnModal .field select:focus, #cnModal .field textarea:focus{outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent;}
/* 세그먼트 토글 */
#cnModal .seg{display:inline-flex; background:var(--surface-2); border-radius:var(--radius-sm); padding:3px; gap:3px;}
#cnModal .seg button{
    appearance:none; border:none; background:transparent; font-family:inherit;
    font-size:13px; font-weight:600; color:var(--text-2);
    padding:7px 16px; border-radius:8px; cursor:pointer;
  }
#cnModal .seg button[aria-pressed="true"]{background:var(--surface); color:var(--brand-ink); box-shadow:0 1px 2px rgba(16,24,40,.06);}
/* 반복 줄 (수수료·비용·거래) */
#cnModal .rows{display:flex; flex-direction:column; gap:8px;}
#cnModal .row{display:grid; gap:8px; align-items:center;}
#cnModal .row-fee{grid-template-columns:1fr 110px 38px;}
#cnModal .row-cost{grid-template-columns:1fr 150px 38px;}
/* 거래 줄 — 제품 셀이 세로로 길어질 수 있어 위쪽 정렬 *//* 제품 칸은 입금일 칸과 같은 폭(그리드 절반 - gap 절반).
     남는 폭은 수량·단가·금액·원가가 나눠 갖는다. */
#cnModal .row-txn{grid-template-columns:calc(50% - 8px) repeat(4, minmax(0, 1fr)) 34px;
           align-items:start;}
#cnModal .row-txn > :not(.prodcell){margin-top:0;}
#cnModal .rows .row-txn{padding:10px 0; border-bottom:1px solid var(--line);}
#cnModal .rows .row-txn:last-child{border-bottom:none;}
@media (max-width:860px){#cnModal .row-fee, #cnModal .row-cost{grid-template-columns:1fr 100px 38px;}
#cnModal .row-txn{grid-template-columns:1fr 1fr; align-items:center;}
#cnModal .row-txn .prodcell{grid-column:1 / -1;}
#cnModal .row-txn .del{grid-column:2; justify-self:end;}
#cnModal .rowhead.row-txn{display:none;}
}
#cnModal .row input, #cnModal .row select{
    width:100%; padding:9px 11px; border:1px solid var(--line-strong);
    border-radius:var(--radius-sm); font-size:13.5px; font-family:inherit; color:var(--text); background:var(--surface);
  }
#cnModal .row input:focus, #cnModal .row select:focus{outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent;}
#cnModal .row input.num-in{text-align:right; font-variant-numeric:tabular-nums;}
#cnModal .del{
    width:32px; height:32px; border-radius:50%; border:1px solid var(--line);
    background:var(--surface); color:var(--muted); cursor:pointer;
    display:inline-flex; align-items:center; justify-content:center; font-size:16px; line-height:1; padding:0;
  }
#cnModal .del:hover{background:var(--neg-bg); color:var(--neg); border-color:var(--neg-bg);}
#cnModal .del.small{width:26px; height:26px; font-size:14px; flex:0 0 auto;}
/* 제품 셀 — 세트면 세로로 늘어난다 */
#cnModal .prodcell{display:flex; flex-direction:column; gap:6px; align-items:flex-start; min-width:0;}
#cnModal .prodcell.is-set{
    background:var(--surface-3); border:1px solid var(--line-2);
    border-radius:var(--radius-sm); padding:8px 9px;
  }
#cnModal .partline{display:flex; gap:6px; align-items:center; width:100%; min-width:0;}
#cnModal .partline > .cs{flex:1 1 auto; min-width:0;}
/* 구성품 단가 — 직접 입력 */
#cnModal .p-price{
    flex:0 0 84px; width:84px; padding:9px 8px; text-align:right;
    border:1px solid var(--line-strong); border-radius:var(--radius-sm);
    font:inherit; font-size:13px; color:var(--text); background:var(--surface);
    font-variant-numeric:tabular-nums;
  }
#cnModal .p-price:focus{outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent;}
#cnModal .p-price.auto{border-color:var(--sage); background:var(--surface-3);}
/* 세트 단가 = 구성품 합 (읽기 전용) */
#cnModal .t-price.sum{background:var(--surface-2)!important; color:var(--text-2)!important;}
#cnModal .addpart{
    appearance:none; border:1px dashed var(--line-strong); background:transparent;
    color:var(--muted); font-family:inherit; font-size:11px; font-weight:600;
    padding:4px 9px; border-radius:var(--radius-sm); cursor:pointer; align-self:flex-start;
  }
#cnModal .addpart:hover{border-color:var(--sage); color:var(--brand); background:var(--sage-tint);}
#cnModal .setbadge{color:var(--brand); background:var(--sage-tint-2);}
/* 읽기 전용 칸 */
#cnModal .t-amt{background:var(--surface-2)!important; color:var(--text-2)!important;}
#cnModal .t-cost{background:var(--sage-tint)!important; color:var(--brand-ink)!important; font-weight:600;}
/* 프리셋에서 자동으로 채워진 단가 */
#cnModal .t-price.auto{border-color:var(--sage); background:var(--surface-3);}
/* ── 커스텀 드롭다운 (.cs-*) — 어드민 공통 컴포넌트 ── */
#cnModal .cs{position:relative; display:block; min-width:0;}
#cnModal .cs-btn{
    appearance:none; width:100%; height:38px;
    display:inline-flex; align-items:center; gap:8px;
    padding:0 10px 0 12px;
    border:1px solid var(--line-strong); border-radius:10px;
    background:var(--surface); color:var(--text);
    font-family:inherit; font-size:14px; line-height:1.2;
    cursor:pointer; text-align:left;
  }
#cnModal .cs-btn:hover{border-color:var(--muted);}
#cnModal .cs-btn:focus-visible{outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent;}
#cnModal .cs-btn[aria-expanded="true"]{border-color:var(--brand);}
#cnModal .cs-btn.is-empty .cs-btn-text{color:var(--muted);}
#cnModal .cs-btn-text{flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;}
#cnModal .cs-caret{
    flex:0 0 auto; width:8px; height:8px; margin-right:3px; pointer-events:none;
    border-right:2px solid var(--muted); border-bottom:2px solid var(--muted);
    transform:translateY(-2px) rotate(45deg); transition:transform .16s ease;
  }
#cnModal .cs-btn[aria-expanded="true"] .cs-caret{transform:translateY(1px) rotate(225deg); border-color:var(--brand);}
#cnModal .cs-pop{
    position:absolute; top:calc(100% + 6px); left:0; right:0; z-index:70;
    max-height:330px; overflow-y:auto; padding:6px;
    background:var(--surface); border:1px solid var(--line);
    border-radius:var(--radius-md); box-shadow:var(--shadow-pop);
    display:flex; flex-direction:column; gap:1px;
    scrollbar-width:thin; scrollbar-color:var(--line-strong) transparent;
    min-width:220px;
  }
#cnModal .cs-pop[hidden]{display:none;}
#cnModal .cs-pop::-webkit-scrollbar{width:8px;}
#cnModal .cs-pop::-webkit-scrollbar-thumb{background:var(--line-strong); border-radius:999px; border:2px solid transparent; background-clip:padding-box;}
#cnModal .cs-search{
    position:sticky; top:-6px; z-index:1;
    margin:-6px -6px 4px; padding:6px;
    background:var(--surface); border-bottom:1px solid var(--line);
  }
#cnModal .cs-search input{
    width:100%; padding:8px 10px; font:inherit; font-size:13.5px;
    border:1px solid var(--line-strong); border-radius:8px;
    background:var(--surface); color:var(--text);
  }
#cnModal .cs-search input:focus{outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent;}
#cnModal .cs-opt{
    appearance:none; width:100%; border:0; background:transparent;
    font-family:inherit; font-size:13.5px; color:var(--text);
    text-align:left; padding:8px 10px; border-radius:8px; cursor:pointer;
    display:flex; align-items:center; gap:8px;
  }
#cnModal .cs-opt:hover, #cnModal .cs-opt.is-active{background:var(--surface-2);}
#cnModal .cs-opt[aria-selected="true"]{background:var(--sage-tint); color:var(--brand); font-weight:600;}
#cnModal .cs-opt .cs-cost{margin-left:auto; font-size:11.5px; color:var(--muted); font-variant-numeric:tabular-nums;}
#cnModal .cs-opt[aria-selected="true"] .cs-cost{color:var(--brand);}
#cnModal .cs-empty{padding:10px 12px; font-size:13px; color:var(--muted);}
/* ── Cally 캘린더 팝오버 (비용 관리와 같은 구현) ── */
#cnModal .cal{position:relative;}
#cnModal .cal-trigger{
    appearance:none; width:100%; height:38px;
    display:inline-flex; align-items:center; gap:8px;
    padding:0 10px 0 12px;
    border:1px solid var(--line-strong); border-radius:10px;
    background:var(--surface); color:var(--text);
    font-family:inherit; font-size:14px; line-height:1.2; cursor:pointer; text-align:left;
  }
#cnModal .cal-trigger:hover{border-color:var(--sage); background:var(--surface-3);}
#cnModal .cal-trigger:focus-visible{outline:2px solid var(--brand); outline-offset:1px;}
#cnModal .cal-trigger[aria-expanded="true"]{border-color:var(--brand); box-shadow:0 0 0 3px var(--sage-tint);}
#cnModal .cal-trigger .cal-ico{width:16px; height:16px; flex:0 0 auto; color:var(--brand);}
#cnModal .cal-trigger .cal-ico svg{width:100%; height:100%; display:block;}
#cnModal .cal-trigger .cal-text{flex:1 1 auto; font-variant-numeric:tabular-nums;}
#cnModal .cal-caret{
    flex:0 0 auto; width:8px; height:8px; margin-right:3px; pointer-events:none;
    border-right:2px solid var(--muted); border-bottom:2px solid var(--muted);
    transform:translateY(-2px) rotate(45deg); transition:transform .16s ease;
  }
#cnModal .cal-trigger[aria-expanded="true"] .cal-caret{transform:translateY(1px) rotate(225deg); border-color:var(--brand);}
#cnModal .cal-pop{
    position:absolute; top:calc(100% + 8px); left:0; z-index:60;
    width:100%; min-width:280px;
    background:var(--surface); border:1px solid var(--line);
    border-radius:var(--radius-md); box-shadow:var(--shadow-pop); padding:12px;
  }
#cnModal .cal-pop[hidden]{display:none;}
#cnModal .cal-pop calendar-date{display:block; width:100%;}
#cnModal .cal-pop calendar-month{width:100%;}
#cnModal .cal-nav-ico{width:20px; height:20px;}
#cnModal .cal-pop-actions{display:flex; gap:8px; margin-top:10px; justify-content:flex-end;}
#cnModal .cal-pop-actions button{
    appearance:none; font-family:inherit; font-size:12.5px; font-weight:600;
    padding:7px 14px; border-radius:var(--radius-pill); cursor:pointer;
    border:1px solid var(--line-strong); background:var(--surface); color:var(--charcoal);
  }
#cnModal .cal-pop-actions .cal-pop-apply{background:var(--brand); border-color:var(--brand); color:#fff;}
/* Cally 자체 색 — 어드민 톤에 맞춤 */
#cnModal calendar-month{
    --color-accent:var(--brand);
    --color-text-on-accent:#fff;
  }
#cnModal .rowhead{display:grid; gap:8px; font-size:11px; font-weight:700; color:var(--muted); padding:0 2px 2px;}
#cnModal .add-line{margin-top:10px;}
#cnModal .off{opacity:.45;}
#cnModal .toggle-line{display:flex; align-items:center; gap:8px; margin-bottom:10px;}
#cnModal .toggle-line .lab{font-size:12px; font-weight:600; color:var(--text-2);}
/* 마진 요약 */
#cnModal .summary{background:var(--sage-tint); border-radius:var(--radius-md); padding:14px 16px; margin-top:4px;}
#cnModal .sum-row{display:flex; justify-content:space-between; font-size:13px; padding:4px 0; color:var(--text-2);}
#cnModal .sum-row .v{font-variant-numeric:tabular-nums; color:var(--text); font-weight:600;}
#cnModal .sum-row.total{border-top:1px solid var(--sage); margin-top:6px; padding-top:10px; font-size:15px;}
#cnModal .sum-row.total .k{font-weight:700; color:var(--brand-ink);}
#cnModal .sum-row.total .v{font-weight:800; color:var(--brand-ink);}
#cnModal .sum-row.minus .v{color:var(--neg);}
#cnModal .divider{height:1px; background:var(--line); margin:18px 0;}
#cnModal .backlink{font-size:12.5px; color:var(--muted); text-decoration:none; display:inline-flex; align-items:center; gap:5px; margin-bottom:12px;}
#cnModal .backlink:hover{color:var(--text);}
#cnModal .screen[hidden]{display:none;}
#cnModal .foot{color:var(--muted); font-size:12px; margin-top:26px; line-height:1.7;}
#cnModal .foot b{color:var(--text-2);}

/* 모달 안에서만 다른 두 가지 — 목업은 페이지 스크롤, 여기선 모달이 스크롤한다 */
#cnModal .cn-page { padding: 18px 20px 24px; background: transparent; }
#cnModal .wrap { max-width: 100%; }

/* 거래 줄 위의 날짜 머리 — 한 채널에 여러 날 거래가 같이 보이므로 날짜로 묶는다.
   ⛔ 줄 '안'에 배지로 넣으면 제품 칸만 그만큼 내려가 수량·단가 칸과 높이가 어긋난다
      (.row-txn 은 align-items:start). 반드시 줄 밖에 별도 줄로 둘 것. */
#cnModal .txn-daterow {
  font-size: 11px; font-weight: 700; color: var(--text-2);
  padding: 12px 2px 2px; font-variant-numeric: tabular-nums;
  display: flex; align-items: center; gap: 8px;
}
#cnModal .txn-daterow:first-child { padding-top: 2px; }
/* 날짜 머리의 '옮기기' 캘린더 — 위 날짜 칸과 같은 부품(makeCal)이되 줄 머리에 맞게 작게. */
#cnModal .txn-daterow .txn-date-cal { position: relative; display: inline-flex; }
#cnModal .txn-daterow .txn-date-cal .cal-trigger {
  padding: 3px 8px; font-size: 10.5px; font-weight: 600; gap: 4px; min-height: 0;
}
#cnModal .txn-daterow .txn-date-cal .cal-trigger .cal-ico svg { width: 12px; height: 12px; }
#cnModal .txn-daterow .txn-date-cal .cal-text { font-size: 10.5px; }
#cnModal .txn-daterow .txn-date-cal .cal-pop { top: calc(100% + 4px); left: 0; right: auto; }

/* 토스트가 모달(z-index 130) 뒤에 가려 저장돼도 아무 표시가 안 났다(2026-08-20). */
#toast, .toast { z-index: 140 !important; }

/* 저장 중 — 누른 즉시 잠그고 상태를 보여준다(끝나야 토스트가 떠서 먹혔는지 몰랐다). */
#cnModal .btn-primary.is-saving { opacity: .75; cursor: progress; }

/* 취소 버튼을 저장과 같은 규격으로 (사용자 지시 2026-08-20).
   목업이 .btn(8px 14px/13px)과 .btn-primary(11px 16px/14px)에 다른 값을 줬고,
   저장에만 인라인 min-width:120px 가 있어 취소만 폭 53px 로 쪼그라들어
   알약이 아니라 원처럼 보였다. 높이는 원래 둘 다 42px 로 같았다. */
#cnModal #cnCancel { padding: 11px 16px; font-size: 14px; min-width: 120px; }
