/* ==========================================================================
   인비랩 페이지 전용 구성 v3 — 공통 컴포넌트(style.css)로 표현되지 않는 페이지 고유 배치만 둔다.
   규칙: tokens.css 변수만 사용, font-size 는 var(--text-*) 만, !important 금지, 색상 직접값 금지.
   구역은 "=== page: 파일이름 ===" 주석 줄로 나눈다. 두 페이지 이상이 쓰면 style.css 의 도메인 조합으로 올린다.
   ========================================================================== */

/* === page: index.html === */
/* CTA 문단: style.css 의 .cta p { opacity: .9 } 가 파랑 위 흰 글자 대비를 4.48:1 로 떨어뜨려 axe(color-contrast) 가 잡는다.
   이 페이지에서는 불투명하게 둔다 — style.css 쪽 수정(.cta p 의 opacity 제거)을 함께 요청함. 그쪽이 고쳐지면 이 규칙은 지운다. */
.cta p { opacity: 1; }
/* 질문 답변 안내(.talk, style.css 11b 레거시 구역): 좁은 폭에서는 아이콘을 위, 글을 아래로 */
@media (max-width: 480px) {
  .talk { flex-direction: column; align-items: flex-start; gap: var(--space-3); }
}

/* === 공통: 채널 순위 행 (.ch-list — today/rocket/favorites 가 같은 행 부품을 쓴다, 작업지시서 2군 "채널 리스트 컴포넌트 통일") ===
   행(.ch-row, style.css) 안: .rank-no · .rank-thumb · .rank-main(.ch-name + .ch-meta) · .rank-right.ch-stats · (화면별 띠) · .ch-actions · .admin-ctrl */
.ch-list .ch-row { flex-wrap: wrap; }
.ch-list .rank-no, .ch-list .list-head .h-rank { width: var(--space-10); }   /* 순위가 2,000위까지라 28px 로는 좁다 */
.ch-list .list-head .h-ch { flex: 1; min-width: 0; }
.ch-list .list-head .h-stats, .ch-list .ch-stats { min-width: calc(var(--space-20) + var(--space-8)); text-align: right; }
.ch-list .ch-name[onclick] { cursor: pointer; }
.ch-list .ch-name[onclick]:hover { color: var(--color-brand); }
.ch-list .ch-name .grade { margin-right: var(--space-1); }
.ch-list .ch-name .tag { margin-left: var(--space-1); }
/* 등급 배지: S 경고색 · A 브랜드색 · B 성공색 · C/D 기본 배지 (글자가 등급을 말하므로 색은 보조) */
.ch-list .grade.S { background: var(--color-warning-soft); color: var(--color-warning); }
.ch-list .grade.A { background: var(--color-brand-soft); color: var(--color-brand); }
.ch-list .grade.B { background: var(--color-success-soft); color: var(--color-success); }
.ch-list .ch-stats .money { font-weight: var(--weight-bold); color: var(--color-text); margin-top: var(--space-1); }
/* 행 아래 동작 줄(관심 채널·채널 분석·유튜브) · 관리자 제어 줄(카테고리·되돌리기·삭제) — 행 전체 폭으로 줄바꿈 */
.ch-list .ch-actions { flex-basis: 100%; display: flex; gap: var(--space-2); flex-wrap: wrap; padding-top: var(--space-2); border-top: var(--border-w) solid var(--color-border); }
.ch-list .fav.on { background: var(--color-warning-soft); border-color: var(--color-warning-line); color: var(--color-warning); }
.ch-list .admin-ctrl { flex-basis: 100%; display: flex; justify-content: flex-end; align-items: center; gap: var(--space-2); flex-wrap: wrap; padding-top: var(--space-2); border-top: var(--border-w) dashed var(--color-border); }
.ch-list .admin-ctrl .cat-sel { width: auto; }
.ch-list .pager .pinfo { align-self: center; margin-left: var(--space-2); font-size: var(--text-caption); color: var(--color-text-muted); font-weight: var(--weight-bold); }
/* 지표 띠(.ch-metrics — rocket): 로켓 영상·영상 수·숏폼/롱폼 평균 길이 같은 작은 숫자 4~5칸. 좁으면 자기 줄, 넓은 화면(≥1280)은 같은 줄 오른쪽 */
.ch-list .ch-metrics { flex-basis: 100%; display: flex; gap: var(--space-4); flex-wrap: wrap; padding-top: var(--space-2); border-top: var(--border-w) dashed var(--color-border); }
.ch-list .ch-metrics .m { display: flex; flex-direction: column; min-width: var(--space-16); }
.ch-list .ch-metrics .m b { font-size: var(--text-body); font-weight: var(--weight-bold); color: var(--color-text); font-variant-numeric: tabular-nums; }
.ch-list .ch-metrics .m b.is-hot { color: var(--color-danger); }
.ch-list .ch-metrics .m span { font-size: var(--text-caption); color: var(--color-text-muted); font-weight: var(--weight-bold); }
@media (min-width: 1280px) {
  .ch-list .ch-metrics { flex: 0 0 auto; padding-top: 0; border-top: 0; padding-left: var(--space-4); border-left: var(--border-w) dashed var(--color-border); }
}

/* === page: dashboard.html (홈) — 시안5B ===
   PC: 인사말+버튼 → 인비남 배너 → KPI → 지금 터진 소재 → 오늘 뜨는 채널 → 시작 안내.
   모바일(시안 모바일): 오늘 뜨는 채널 시상대가 맨 위, 그 다음 지금 터진 소재 — 컨테이너를 flex column 으로 두고 order 만 바꾼다 */
.home-page .container { display: flex; flex-direction: column; }
.home-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 18px; margin-bottom: 18px; flex-wrap: wrap; }
.home-head .page-desc { max-width: 760px; }
.home-coach { margin-bottom: 22px; }
.home-coach .face { font-size: var(--text-body-sm); }
.home-top3 .sd a { font-weight: 700; }
.home-howto { margin-top: var(--space-2); }
@media (max-width: 899px) {
  .home-top3 { order: -1; }
  .home-head { margin-bottom: 14px; }
  .home-head .btn { width: 100%; }
}

/* === page: today.html (오늘 뜨는 채널) — 시안5B pc-3 === */
/* 필터: 공통 .filter-panel 한 줄에 유형·정렬·구독자 (구분선) + 둘째 줄 카테고리. 모바일은 줄마다 가로 스크롤.
   JS 가 #filter-bar 의 display 를 block/none 으로 바꾸므로 id 는 바깥 래퍼(.today-filters)에 두고 패널은 안쪽에 둔다 */
.today-filters .label { white-space: nowrap; flex-shrink: 0; }
.today-filters .chips-inline { display: contents; }
.today-filters .chip.on { background: var(--color-brand); border-color: var(--color-brand); color: var(--color-text-inverse); }
.today-head { margin-bottom: var(--space-3); }

/* 시상대(1~3위): 공통 .podium 위에 영상 5개·동작 줄·관리자 줄을 얹는다 (시안 슬롯 + 이 화면의 기능) */
.today-podium { margin-bottom: 16px; }
.today-podium .value .lbl { display: block; font-size: var(--text-2xs); color: var(--color-text-muted); font-weight: 600; letter-spacing: 0; }
.today-podium .name .badge, .today-podium .name .gr { vertical-align: middle; }
/* 영상 5칸은 슬롯 폭에 맞춰 5등분 — 타일 자체는 공통 .ch-videos a (style.css) */
.today-podium .ch-videos { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--space-1); overflow: visible; margin: var(--space-3) auto 0;
  max-width: calc(5 * 92px + 4 * var(--space-1)); }
.today-podium .ch-videos a { width: auto; height: auto; aspect-ratio: 9 / 16; }
.today-podium .ch-actions { justify-content: center; margin-top: var(--space-2); }
.today-podium .admin-ctrl { justify-content: center; }
@media (max-width: 899px) {
  .today-podium .slot { grid-template-areas: "av rank val" "av body val" "vids vids vids" "acts acts acts" "adm adm adm"; }
  .today-podium .name { white-space: normal; overflow: visible; text-overflow: clip; }
  .today-podium .value { display: flex; flex-direction: column; align-items: flex-end; text-align: right; }
  .today-podium .ch-videos { grid-area: vids; margin: 0; }
  .today-podium .ch-actions { grid-area: acts; margin-top: 0; justify-content: flex-start; }
  .today-podium .admin-ctrl { grid-area: adm; }
}

/* "왜 떴나" 한 줄(2026-09-17): 어제 대비 조회수가 가장 많이 는 영상 제목 — 길면 말줄임. 오늘 뜨는 채널(시상대·목록)·관심 채널 공통 */
.today-list .ch-why, .today-podium .ch-why, .fav-list .ch-why { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: var(--space-1); }
.today-list .ch-why .lbl, .today-podium .ch-why .lbl, .fav-list .ch-why .lbl { font-weight: var(--weight-bold); color: var(--color-brand); margin-right: var(--space-1); }
.today-list .ch-why a, .today-podium .ch-why a, .fav-list .ch-why a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.today-list .ch-why a:hover, .today-podium .ch-why a:hover, .fav-list .ch-why a:hover { color: var(--color-brand); }

/* 4위 이하 목록 상자(.rank-list.today-list.ch-list): 행 안 영상 미리보기·동작 줄은 공통 .ch-list 규칙 */
.today-list .ch-videos .vrank { position: absolute; top: var(--space-1); left: var(--space-1); min-width: var(--icon-sm); height: var(--icon-sm); line-height: var(--icon-sm); padding: 0 var(--space-1); text-align: center; font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text-inverse); background: var(--color-text); border-radius: var(--radius-sm); }
.today-list .ch-videos .vrank.top { background: var(--color-warning); }
.today-list .ch-videos .v { position: absolute; left: 0; right: 0; bottom: 0; padding: var(--space-1); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); text-align: center; }
.today-list .ch-videos a.center { outline: var(--border-w-strong) solid var(--color-warning); outline-offset: calc(-1 * var(--border-w-strong)); }
/* 넓은 화면(≥1280): 미리보기 5칸을 같은 줄 오른쪽에 붙여 한 줄 컴팩트 배치. 그 아래 폭은 자기 줄로 내려가 가로 스크롤. */
@media (min-width: 1280px) {
  .today-list .ch-videos { flex: 0 0 auto; }
}

/* === page: hot.html (지금 뜨는 소재) — 시안5B pc-2 === */
/* 관리자 안내(#devnote): JS 가 style.display 를 block 으로 바꿔 보여주므로 바깥 래퍼를 숨기고, 안쪽 .alert 는 flex(아이콘+글) 를 유지한다 */
.hot-devnote { display: none; margin-bottom: var(--space-4); }
/* 머리: 제목(빨간 강조) + 설명 / 오른쪽 큰 편수 + "3시간마다 갱신 · HH:MM" */
.hot-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 18px; margin-bottom: 18px; flex-wrap: wrap; }
.hot-head .page-desc { max-width: 760px; }
.hot-count { text-align: right; flex-shrink: 0; }
.hot-count .n { font-size: var(--text-h1); font-weight: 900; letter-spacing: -0.04em; line-height: 1.1; }
.hot-count .n .u { font-size: var(--text-body-sm); color: var(--color-text-muted); margin-left: 2px; }
.hot-count .t { font-size: var(--text-2xs); color: var(--color-text-muted); font-weight: 700; }
/* 팁바 앞 옐로 알약 라벨("24시간 규칙") */
.hot-tip > .lbl { color: var(--color-accent); white-space: nowrap; background: var(--color-accent-dim); padding: 3px 10px; border-radius: 6px; font-weight: 900; }
/* 긴 안내문 접기(details): 나머지 7개 항목 */
.hot-page details.guide { margin: calc(-1 * var(--space-2)) 0 var(--space-4); }
.hot-page details.guide summary { cursor: pointer; padding: var(--space-2) var(--space-3); border: var(--border-w) dashed var(--color-border-strong); border-radius: var(--radius-md); font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text-secondary); }
.hot-page details.guide summary:hover { background: var(--color-surface); }
.hot-page details.guide[open] summary { margin-bottom: 0; border-radius: var(--radius-md) var(--radius-md) 0 0; }
.hot-page details.guide .bd { padding: var(--space-3) var(--space-4); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-top: none; border-radius: 0 0 var(--radius-md) var(--radius-md); font-size: var(--text-body-sm); color: var(--color-text-secondary); line-height: 1.7; }
/* 필터(공통 .filter-panel): 1줄 = 기간·난이도·분류·정렬 칩, 2줄 = 선택됨 알약 + 전체 초기화 */
.hot-filter .label { white-space: nowrap; flex-shrink: 0; }
.hot-filter #catchips, .hot-filter #picks { display: contents; }   /* 감싼 span 을 투명하게 — 칩들이 줄의 직접 자식처럼 한 줄(모바일 가로 스크롤)로 놓인다 */
.hot-filter .chip.on { background: var(--color-brand); border-color: var(--color-brand); color: var(--color-text-inverse); }
.hot-filter .picks-row.is-default { color: var(--color-text-muted); }
.hot-filter .filter-picked .chip.x { height: auto; min-height: 0; padding: 0 2px; border: 0; background: none; color: inherit; font-size: inherit; font-weight: 900; opacity: 0.7; }
.hot-filter .filter-picked .chip.x:hover { opacity: 1; }
.hot-filter .filter-reset { border-style: dashed; }
/* 카드 격자(.hot-grid): 한 줄에 6장. 2026-09-10 대표 지시로 '같은 원본' 묶음 상자(띠)를 없애고 카드를 그대로 나열한다 */
.hot-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 11px; }
/* 남은 글자가 셋뿐이라 '평소 → N배'를 크게 키워 눈에 띄게 한다 (2026-09-10 대표 지시). 홈 화면 카드는 그대로 두려고 .hot-grid 안에서만 */
.hot-grid .shorts-card .meta .base { font-size: var(--text-caption); color: var(--color-text-secondary); margin-top: 4px; }
.hot-grid .shorts-card .meta .base em { font-size: var(--text-h3); font-weight: 900; letter-spacing: -0.02em; }
.hot-grid .shorts-card .thumb .chan span { font-size: var(--text-micro); }
@media (max-width: 1279px) { .hot-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
@media (max-width: 1099px) { .hot-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (max-width: 899px) {
  .hot-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; }
  .hot-count { text-align: left; }
}

/* === page: similar.html === */
/* 관리자 안내(#devnote)·검수 탭줄(#bar): JS 가 style.display 를 block/flex 로 바꿔 보여주므로 기본은 숨김.
   #bar 는 공통 .tabs 자체에 두어 JS 의 display:flex 가 탭 배치와 같도록 한다 */
.sim-devnote { display: none; }
.sim-tabs { display: none; }
.sim-tabs .sim-count { align-self: center; }
/* 390 폭에서 탭 4개 + 묶음 수가 한 줄에 들어가도록 탭 안쪽 여백만 줄인다 (줄바꿈되면 활성 탭 밑줄이 경계선에서 떨어진다) */
@media (max-width: 480px) { .sim-tabs .tab { padding: 0 var(--space-2); } }
/* 내 카테고리 select: 공통 .select 의 100% 폭 대신 내용 폭 (필터 줄은 hot.html 과 같은 공통 .filter-panel) */
.sim-page .filter-panel .sim-sel { width: auto; }
/* 묶음 나열 — #list 는 JS 가 className 을 "pack"/"empty" 로 바꾼다.
   묶음 하나 = 공통 '같은 원본' 상자(.origin-group, style.css 4-4) + 그 안의 세로 소재 카드(.shorts-card, 4-3) — hot.html 과 같은 부품(작업지시서 6장).
   2026-09-10 대표 지시: 상자 안에 빈 칸이 남지 않게 — 격자를 6칸으로 두고 상자가 '보이는 카드 수'만큼 칸을 차지한다 (hot.html 과 같은 방식).
   묶음은 최소 2편이라 상자도 최소 2칸이다 (꼬리표·검수 버튼이 들어갈 폭). */
.sim-page .pack {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  align-items: start;
  gap: var(--space-3);
}
.sim-page .pack > .empty { grid-column: 1 / -1; }
.sim-group { width: 100%; margin-bottom: 0; min-width: 0; }
.sim-group.n2 { grid-column: span 2; }
.sim-group.n3 { grid-column: span 3; }
.sim-group.n4 { grid-column: span 4; }
.sim-group.n5 { grid-column: span 5; }
.sim-group.n6 { grid-column: span 6; }
/* 꼬리표 = 묶음 제목(원본 소재 이름). 길면 말줄임하고 오른쪽 '더보기' 자리는 비워 둔다 */
.sim-group > .tag { max-width: calc(100% - 128px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--text-caption); }
/* "+N개 더보기"/"접기" — 공통 .origin-group > .more 자리(오른쪽 위). 라벨 두 개를 넣어 두고 펼침 여부(.sim-group.expanded)에 따라 하나만 보인다 */
.sim-group > .more { height: auto; line-height: var(--leading-caption); }
.sim-group > .more .cl-less-label { display: none; }
.sim-group.expanded > .more .cl-more-label { display: none; }
.sim-group.expanded > .more .cl-less-label { display: inline; }
/* 상자 안 카드: 칸 수를 카드 수에 맞춰 빈 칸을 없앤다. 7장째부터(.extra)는 '더보기'를 눌러야 보인다 */
.sim-group .shorts-grid { gap: 11px; }
.sim-group.n2 .shorts-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.sim-group.n3 .shorts-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.sim-group.n4 .shorts-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.sim-group.n5 .shorts-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.sim-group.n6 .shorts-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.sim-group:not(.expanded) .shorts-card.extra { display: none; }
/* 카드는 썸네일 + 시차 배지(최초 관찰·+N일) + 조회수만 (대표 요청 2026-09-08: 제목·채널·증가량 글자 생략). 작은 카드라 조회수 글자는 한 단계 작게 */
.sim-group .shorts-card .meta { padding: var(--space-1) var(--space-2) var(--space-2); }
.sim-group .shorts-card .meta .row1 { justify-content: center; }
.sim-group .shorts-card .meta .views { font-size: var(--text-h3); }
/* 해외 채널 나라 코드 (JP·US…) — 조회수 옆 작은 칩. 한국 채널에는 안 붙는다 (2026-09-17) */
.sim-group .shorts-card .meta .cc { margin-left: 6px; font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text-muted); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-full); padding: 0 6px; line-height: 1.5; }
.sim-group .shorts-card .gap { top: 7px; }   /* 배율 배지가 없는 화면이라 시차 배지를 맨 위로 */
/* 관리자 검수 줄(공개·반려·공개 취소) — 상자 아래 오른쪽 (관리자에게만 그려진다) */
.sim-group .acts { display: flex; justify-content: flex-end; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-3); padding-top: var(--space-2); border-top: var(--border-w) dashed var(--color-group-line); }
/* 화면이 좁아지면 격자 칸을 줄이고, 칸보다 넓은 상자는 줄 폭까지만 차지하게 맞춘다 (hot.html 과 같은 단계) */
@media (max-width: 1279px) {
  .sim-page .pack { grid-template-columns: repeat(5, minmax(0, 1fr)); }
  .sim-group.n6 { grid-column: span 5; }
  .sim-group.n6 .shorts-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
@media (max-width: 1099px) {
  .sim-page .pack { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .sim-group.n5, .sim-group.n6 { grid-column: span 4; }
  .sim-group.n5 .shorts-grid, .sim-group.n6 .shorts-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 899px) {
  .sim-page .pack { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px; }
  .sim-group.n3, .sim-group.n4, .sim-group.n5, .sim-group.n6 { grid-column: span 2; }
  .sim-group.n3 .shorts-grid, .sim-group.n4 .shorts-grid,
  .sim-group.n5 .shorts-grid, .sim-group.n6 .shorts-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 480px) {
  .sim-page .pack { grid-template-columns: 1fr; }                            /* 폰: 한 줄에 한 묶음 */
  .sim-group.n2, .sim-group.n3, .sim-group.n4, .sim-group.n5, .sim-group.n6 { grid-column: span 1; }
  .sim-group .shorts-grid, .sim-group.n2 .shorts-grid, .sim-group.n3 .shorts-grid,
  .sim-group.n4 .shorts-grid, .sim-group.n5 .shorts-grid, .sim-group.n6 .shorts-grid {
    grid-template-columns: 1fr 1fr; gap: 9px;                                /* 폰: 카드 2열 (작업지시서 7장 ⑤) */
  }
}

/* === page: analyze.html === */
/* 상태 상자: 페이지 JS 가 className 을 "an-load"/"an-load show", "an-err"/"an-err show", "an-res"/"an-res show" 처럼
   통째로 덮어쓰므로(로직 불변) 그 이름을 그대로 두고 여기서 '보임/숨김'만 정한다. 겉모습은 안쪽의 공통 컴포넌트(.loading/.card/.alert)가 맡는다.
   같은 클래스를 assets/js/tools-addon.js(자막제거기 세션 소유, 이관 보류)가 주입하는 후킹 상자(#hk-box)도 쓰므로 이름을 바꾸지 않는다. */
.an-load { display: none; }
.an-load.show { display: block; }
/* tools-addon 호환: 그 상자는 .an-load 바로 아래에 .spin(빈 div)+글자만 넣는다 — 공통 .spinner 와 같은 모양을 준다 */
.an-load.show:has(> .spin) { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4) 0; color: var(--color-text-secondary); }
.an-load > .spin { display: inline-block; width: var(--icon-md); height: var(--icon-md); border: 2px solid var(--color-border); border-top-color: var(--color-brand); border-radius: var(--radius-full); animation: spin 0.7s linear infinite; flex-shrink: 0; }
.an-err { display: none; }
.an-err.show { display: block; color: var(--color-danger-text); }
/* 오류 알림: JS 가 #an-err(안쪽)에 textContent 를 쓰므로 .alert 는 바깥에 두고, 안쪽이 .show 일 때만 알림 상자를 보인다 */
.an-alert:not(:has(> .an-err.show)) { display: none; }
.an-res, .src-res, .tr-res, .sc-res { display: none; }
.an-res.show { display: flex; flex-direction: column; gap: var(--space-3); }
/* 결과가 나오면 JS 가 #an-res 로 스크롤한다 — 위에 고정된 티커(46px)+바로가기 줄에 결과 머리가 가려지지 않게 여백을 둔다 (폰은 상단바 56px) */
.an-res { scroll-margin-top: calc(var(--ticker-h) + var(--space-16)); }
@media (max-width: 899px) { .an-res { scroll-margin-top: calc(var(--header-h) + var(--space-2)); } }
.src-res.show, .tr-res.show, .sc-res.show { display: block; margin-top: var(--space-4); }
/* JS 가 style.display 를 block/flex 로 켜는 요소들의 초기 숨김 (#devnote 는 래퍼, #an-toc 는 flex 로 켜짐) */
.an-devnote, .an-recent, .an-toc, .src-box, .tr-box, .sc-box, .tr-on { display: none; }

/* 검색 카드(① 넣기): 공통 .tp-panel/.tp-field/.tp-actions(style.css 4-4d) 그대로 — 페이지 전용 규칙 없음 */

/* 안내 카드: 4단계 소개를 타일 격자로 (공통 .steps-list 의 번호 원 그대로) */
.an-guide .steps-list { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3); }
.an-guide .steps-list li { flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--color-surface-subtle); border-radius: var(--radius-md); color: var(--color-text); }
.an-guide .steps-list li::before { position: static; flex-shrink: 0; }   /* 번호 원을 흐름 안에(제목 위) — 절대 위치라 제목과 겹치던 것 */
.an-guide .steps-list li b { display: block; font-size: var(--text-title); font-weight: var(--weight-h3); }
/* 최근 분석한 영상: 썸네일+제목 버튼 (공통 .btn.btn-outline 의 높이를 풀어 40px 썸네일을 넣는다) */
.an-recent { margin-top: var(--space-4); padding-top: var(--space-3); border-top: var(--border-w) dashed var(--color-border); }
.an-recent-title { margin: 0; }
.an-recent-item { height: auto; max-width: 100%; padding: var(--space-1) var(--space-3) var(--space-1) var(--space-1); }
.an-recent-item img { width: var(--space-10); height: var(--space-10); object-fit: cover; border-radius: var(--radius-sm); background: var(--color-surface-hover); }
.an-recent-item .t { max-width: calc(var(--space-20) * 3); font-size: var(--text-body-sm); text-align: left; }

/* 결과 바로가기 줄: 결과가 나오면 JS 가 display:flex 로 켠다. 위에 붙어 따라오고, 모바일에서는 메뉴 버튼과 겹치지 않게 흐름에 둔다 */
.an-toc { position: sticky; top: var(--space-2); z-index: var(--z-header); align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-4); padding: var(--space-2) var(--space-3); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }
.an-toc .chip:hover { text-decoration: none; border-color: var(--color-brand); color: var(--color-brand); }

/* 1단계 묶음: JS 가 결론 카드를 만들 때 #ib-stage1 래퍼로 기본 분석 자료를 감싼다(클래스 없음) — 카드 사이 간격만 */
#ib-stage1 { display: flex; flex-direction: column; gap: var(--space-3); }
.an-stage-title { margin: var(--space-2) 0 0; }
.an-kicker { font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); color: var(--color-brand); margin: 0 0 var(--space-1); }
/* 영상 요약 카드: 세로 썸네일(9:16) + 분류 배지 + 주제 + 요약 */
.an-res-top { display: flex; gap: var(--space-4); align-items: flex-start; }
.an-res-thumb { width: calc(var(--space-20) + var(--space-10)); flex-shrink: 0; }
.an-topic { margin-bottom: var(--space-2); }
/* 이 페이지의 칩은 검색어·링크 글자라 길 수 있다 — 한 줄 높이는 그대로, 넘치면 줄바꿈 */
.analyze-page .chip { height: auto; min-height: var(--control-h-sm); padding-top: var(--space-1); padding-bottom: var(--space-1); white-space: normal; line-height: var(--leading-body-sm); text-align: left; max-width: 100%; }
.stars { color: var(--color-warning); letter-spacing: 2px; }
/* 제작 결론 카드 (JS 생성 #ib-verdict-card.an-verdict): 브랜드 연한 바닥 */
.an-verdict { background: var(--color-brand-soft); border-color: var(--color-brand-line); }
.an-verdict-label { font-size: var(--text-h3); line-height: var(--leading-h3); font-weight: var(--weight-h3); }
.an-reasons { margin: var(--space-2) 0 0 var(--space-5); font-size: var(--text-body-sm); color: var(--color-text-secondary); }
.an-plain-list { margin: var(--space-1) 0 0 var(--space-5); }
/* 기획안 카드 (JS 생성): 자리표시 로딩은 원본처럼 자리를 잡아 두고, 소제목은 title 역할 */
.an-plan-load { min-height: calc(var(--space-20) * 3); display: flex; flex-direction: column; justify-content: center; }
.an-plan-concept { margin-top: var(--space-1); }
.an-plan-h { font-size: var(--text-title); line-height: var(--leading-title); font-weight: var(--weight-h3); }

/* 원본 후보: 후보 행은 공통 .list-item + .rank-thumb.video, 가능성 배지는 글자 + 보조색 */
.src-card .sc-info { flex: 1 1 0; }   /* basis 0: 좁은 폭에서 줄바꿈될 때도 썸네일 옆에 남는다 */
.src-card .sc-link { color: inherit; text-decoration: none; }
.src-card .sc-link:hover { text-decoration: underline; }
.src-card .g-badge.g-높음 { background: var(--color-success-soft); color: var(--color-success); }
.src-card .g-badge.g-중간 { background: var(--color-warning-soft); color: var(--color-warning); }
.src-links .sl-t { flex-basis: 100%; }
.src-links:empty { display: none; }

/* 대본 따기: 시각(모노) + 대사 */
.tr-line { display: flex; gap: var(--space-3); padding: var(--space-2) 0; border-top: var(--border-w) solid var(--color-border); }
.tr-line .tm { flex: 0 0 var(--space-12); font-family: var(--font-mono); font-size: var(--text-caption); line-height: var(--leading-body); font-weight: var(--weight-bold); color: var(--color-brand); }
.tr-line .tx { flex: 1; min-width: 0; }
.tr-on { margin-top: var(--space-3); }

/* 벤치마킹 대본: 번호 원 + 대사 + 장면 + 재료 링크(칩) + 스톡 미리보기 격자 */
.sc-input { flex-wrap: wrap; }
.sc-line { display: flex; gap: var(--space-3); padding: var(--space-3) 0; border-top: var(--border-w) solid var(--color-border); }
.sc-line .no { flex-shrink: 0; min-width: var(--icon-lg); height: var(--icon-lg); padding: 0 var(--space-1); border-radius: var(--radius-full); background: var(--color-brand-soft); color: var(--color-brand); font-size: var(--text-caption); font-weight: var(--weight-bold); display: inline-flex; align-items: center; justify-content: center; }
.sc-line .lt { flex: 1; min-width: 0; }
.sc-line .tx { font-weight: var(--weight-bold); }
.sc-line .sc { font-size: var(--text-caption); line-height: var(--leading-caption); color: var(--color-text-muted); margin-top: var(--space-1); }
.sc-line .mat-links { margin-top: var(--space-2); }
/* 소스 영상 안내는 JS 가 .sc-title(card-section) 안에 끼워 넣으므로 흰 바닥+선으로 구분한다 */
.an-sc-source { display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; margin-bottom: var(--space-3); padding: var(--space-3); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); }
.an-sc-thumb { width: calc(var(--space-20) + var(--space-6)); border-radius: var(--radius-md); background: var(--color-surface-hover); }
.prev-grid { display: none; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-2); }
.prev-grid.show { display: grid; }
.prev-grid a { position: relative; display: block; border-radius: var(--radius-md); overflow: hidden; background: var(--color-surface-hover); }
.prev-grid img { display: block; width: 100%; aspect-ratio: 16 / 10; object-fit: cover; }
.prev-grid .pv-d { position: absolute; right: var(--space-1); bottom: var(--space-1); padding: 0 var(--space-1); border-radius: var(--radius-sm); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); font-weight: var(--weight-bold); }
.prev-grid .prev-msg, .prev-grid .prev-note { grid-column: 1 / -1; font-size: var(--text-caption); line-height: var(--leading-caption); color: var(--color-text-muted); }

@media (max-width: 768px) {
  .an-guide .steps-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .an-toc { position: static; }
  .an-toc .btn { margin-left: 0; flex: 1 1 100%; }
}
@media (max-width: 480px) {
  .an-guide .steps-list { grid-template-columns: 1fr; }
  .an-guide .steps-list li { flex-direction: row; align-items: flex-start; }
  .sc-input > .btn { flex: 1 1 100%; }
  .an-res-thumb { width: var(--space-20); }
  .src-card { flex-wrap: wrap; }
  .src-card .src-grade { flex-basis: 100%; padding-left: calc(96px + var(--space-3)); }   /* 96px = 공통 .rank-thumb.video 폭 */
  .prev-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* === page: yt-script.html === */
/* 관리자 안내(#devnote): JS 가 style.display 를 block 으로 바꿔 보여주므로 바깥 래퍼를 숨기고, 안쪽 .alert 는 flex(아이콘+글) 를 유지한다 */
.ys-devnote { display: none; }

/* 주소 입력 줄: 주소 상자(별표 단추 · 즐겨찾기 목록 포함) + 길이·개수 select + 불러오기 버튼 (좁으면 줄바꿈) */
.ys-row { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.ys-urlbox { position: relative; flex: 1 1 calc(var(--space-20) * 4); min-width: 0; }
.ys-urlbox .input { padding-right: var(--space-10); }          /* 오른쪽 끝 별표 단추 자리 */
.ys-row .select { width: auto; min-height: var(--control-h-lg); }   /* 공통 .select 의 100% 폭 대신 내용 폭 · 높이는 시안 입력칸(44px)에 맞춤 */
.ys-urlbox .input { border-width: 1.5px; border-radius: 9px; }   /* 시안 입력칸 */
/* 별표(즐겨찾기) 단추: 입력창 안 오른쪽. 켜짐(.on)은 경고색 + 채운 별 — JS 가 className 을 "btn … ys-fav (on)" 으로 다시 쓴다 */
.ys-fav { position: absolute; right: var(--space-1); top: 50%; transform: translateY(-50%); color: var(--color-text-muted); }
.ys-fav.on { color: var(--color-warning); }
.ys-fav.on .icon { fill: currentColor; }
/* 즐겨찾기 목록: 공통 .menu 를 주소 상자 폭으로 펼친다 (JS 가 .show 토글). 행은 .menu-item(div onclick) + 제목/주소/삭제 단추 */
.ys-drop { display: none; left: 0; max-height: calc(var(--space-20) * 3 + var(--space-5)); overflow: auto; }
.ys-drop.show { display: block; }
.ys-drop .it { cursor: pointer; }
.ys-drop .t { flex: 1; min-width: 0; font-weight: var(--weight-bold); }
.ys-drop .u { max-width: 45%; }
.ys-drop .x { flex-shrink: 0; }
.ys-drop .none { padding: var(--space-3); font-size: var(--text-body-sm); color: var(--color-text-muted); }

/* 상태 상자들은 처음에 숨김 — JS 가 .show(오류·완료·진행) 또는 style.display(요약·본문) 로 연다 */
.ys-msg { display: none; }
.ys-msg.show { display: block; }                               /* 완료 안내는 여러 줄(실패 목록·미완성 목록)이라 flex 가 아닌 block */
.ys-sum { display: none; margin-bottom: var(--space-4); }
.ys-sum > .stat-grid { width: 100%; }                          /* JS 가 래퍼를 flex 로 켜므로 격자 폭을 고정 */
.ys-body { display: none; }
.ys-prog { display: none; }
.ys-prog.show { display: block; }

/* 동작 줄: 선택/저장/복사 버튼 + 선택 개수(오른쪽), 아래 줄에 받아쓰기 방식 선택 */
.ys-actions { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.ys-cnt { font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text-secondary); white-space: nowrap; }
.ys-sep { width: var(--border-w); height: var(--space-5); background: var(--color-border); margin: 0 var(--space-1); }
.ys-eng { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; margin-top: var(--space-3); padding-top: var(--space-3); border-top: var(--border-w) solid var(--color-border); }
/* 받아쓰기 방식(정밀/빠름) 분절 단추: 공통 .btn 위에 두 줄 글(굵은 이름 + 작은 설명), 켜짐(.on)은 흰 바닥 + 브랜드색 */
.ys-seg { display: inline-flex; gap: var(--space-1); padding: var(--space-1); background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); }
.ys-seg .seg-b { height: auto; padding: var(--space-2) var(--space-3); background: transparent; color: var(--color-text-secondary); }
.ys-seg .seg-b:hover { background: var(--color-surface-hover); color: var(--color-text); }
.ys-seg .seg-b.on { background: var(--color-surface); color: var(--color-brand); border-color: var(--color-border-strong); box-shadow: var(--shadow-sm); }
.ys-seg .seg-b .tx { display: flex; flex-direction: column; align-items: flex-start; gap: calc(var(--space-1) / 2); line-height: var(--leading-caption); text-align: left; }
.ys-seg .seg-b .tx b { font-size: var(--text-body-sm); }
.ys-seg .seg-b .tx i { font-style: normal; font-size: var(--text-caption); font-weight: var(--weight-medium); color: var(--color-text-muted); }

/* 영상 표(.table.ys): 숫자 열 오른쪽 정렬·한 줄, 제목 열만 줄바꿈, 정렬 가능한 머리, 머리 안 제목 검색 상자 */
.ys th, .ys td { text-align: right; white-space: nowrap; }
.ys td { font-variant-numeric: tabular-nums; }
.ys .l { text-align: left; }
.ys td.l { white-space: normal; min-width: calc(var(--space-20) * 3); }
.ys .nos, .ys td:first-child { text-align: center; }
.ys .ys-chk { width: var(--space-8); }
.ys th[onclick] { cursor: pointer; user-select: none; }
.ys th[onclick]:hover { color: var(--color-brand); }
.ys th .ar { opacity: 0.4; vertical-align: middle; margin-left: calc(var(--space-1) / 2); }
.ys th.on .ar { opacity: 1; color: var(--color-brand); }
.ys th .qbox { display: inline-flex; align-items: center; gap: var(--space-1); margin-left: var(--space-3); vertical-align: middle; }
.ys th .qbox .input { width: calc(var(--space-20) * 2); font-weight: var(--weight-medium); }
.ys th .qbox .input::-webkit-search-cancel-button { -webkit-appearance: none; }   /* 지우기 버튼이 따로 있어 브라우저 기본 x 는 숨김 */
.ys th .qn { font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-brand); }
.ys .tt { font-weight: var(--weight-bold); cursor: pointer; }
.ys .tt:hover { color: var(--color-brand); }
.ys td.hot { color: var(--color-success); font-weight: var(--weight-bold); }   /* 채널 평균의 1.3배 이상 (머리 tip 이 설명) */
.ys .dsc { margin-top: var(--space-1); font-size: var(--text-caption); line-height: var(--leading-caption); color: var(--color-text-muted); white-space: normal; }
.ys .more { height: auto; padding: 0 var(--space-1); font-size: var(--text-caption); color: var(--color-brand); vertical-align: baseline; }
.ys input[type="checkbox"] { width: var(--icon-sm); height: var(--icon-sm); accent-color: var(--color-brand); cursor: pointer; }
.ys td > .empty { border: 0; background: transparent; }        /* 표 상자 안이라 점선 테두리는 뺀다 */

/* 저장 방식 창: 공통 .modal-backdrop/.modal, JS 가 .show 로 연다. 선택지(.opt)는 라디오처럼 보이는 카드(div onclick, JS 가 .sel 토글) */
.ys-modal { display: none; }
.ys-modal.show { display: flex; }
.ys-modal .opt { display: flex; gap: var(--space-3); align-items: flex-start; padding: var(--space-3) var(--space-4); border: var(--border-w) solid var(--color-border-strong); border-radius: var(--radius-md); margin-bottom: var(--space-2); cursor: pointer; font-weight: var(--weight-title); }
.ys-modal .opt::before { content: ""; flex-shrink: 0; width: var(--icon-sm); height: var(--icon-sm); margin-top: calc(var(--space-1) / 2); border-radius: var(--radius-full); border: var(--border-w) solid var(--color-border-strong); background: var(--color-surface); }
.ys-modal .opt:hover { border-color: var(--color-brand-line); }
.ys-modal .opt.sel { border-color: var(--color-brand); background: var(--color-brand-soft); }
.ys-modal .opt.sel::before { border: var(--space-1) solid var(--color-brand); }
.ys-modal .opt small { display: block; font-weight: var(--weight-regular); color: var(--color-text-secondary); margin-top: calc(var(--space-1) / 2); }
.ys-modal .warn { display: none; }
.ys-modal .warn.show { display: flex; }

@media (max-width: 768px) {
  .ys-sum > .stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }   /* 요약 7칸: 모바일은 한 줄 1칸(공통) 대신 2칸 */
}
@media (max-width: 480px) {
  .ys-row .btn-primary { flex: 1 1 100%; }                     /* 모바일: 불러오기 버튼을 한 줄 전체 폭으로 */
  .ys-sep { display: none; }                                   /* 버튼이 줄바꿈되면 구분선이 어색하므로 숨김 */
}

/* === page: shorts.html === */
/* JS 가 classList 로 .sc-hidden 을 붙였다 뗀다 (원본 클래스 보존). 공통 .alert/.empty(display:flex) 보다 뒤에 있어 숨김이 이긴다. */
.sc-hidden { display: none; }
/* 파일 드롭: JS 가 dragover 에 .on 을 붙인다 → 공통 .file-drop.is-over 와 같은 모양 */
.sc-page .file-drop.on { border-color: var(--color-brand); background: var(--color-brand-soft); }
/* 목적 선택: 버튼 3개 격자 · 두 줄(제목 + 설명) 버튼 · 선택은 .on (JS 가 classList.toggle) */
.sc-obj { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); }
.sc-obj .btn { height: auto; min-height: var(--control-h-lg); flex-direction: column; gap: var(--space-1); padding: var(--space-3) var(--space-2); white-space: normal; text-align: center; line-height: var(--leading-body-sm); }
.sc-obj .btn small { font-weight: var(--weight-regular); color: var(--color-text-secondary); }
.sc-obj .btn.on { border-color: var(--color-brand); background: var(--color-brand-soft); color: var(--color-brand); }
.sc-obj .btn.on small { color: var(--color-brand); }
/* 권리 확인: 노란 안내 상자(.alert-warning) 안의 체크박스(.check) — 본문 크기 */
.sc-agree { font-size: var(--text-body); }
.sc-agree input { flex-shrink: 0; }   /* ≤768 공통 input{min-width:0} 때문에 체크박스가 찌그러지지 않게 */
/* 업로드 진행 막대: 시작값 0 (JS 가 style.width 로 채운다) */
.sc-prog .progress-bar { width: 0; }
/* 후보 카드(.card-section.sc-cand) 안 점수 배지 줄 */
.sc-cand .chips { margin-top: var(--space-2); }
@media (max-width: 480px) {
  .sc-obj { grid-template-columns: 1fr; }
  /* 내 영상 목록 행: 제목 줄 아래로 상태 배지·날짜를 내린다 */
  .sc-list-item { flex-wrap: wrap; }
  .sc-list-item .main { flex-basis: 100%; }
}

/* === page: channel.html === */
/* 검색 결과 목록(.list): 결과가 채워졌을 때만 검색 줄과 간격을 둔다 */
.ch-results:not(:empty) { margin-top: var(--space-4); }
/* 상세 카드·AI 진단 상자: 처음엔 숨김 — JS 가 style.display 로 열고 닫는다 (원본 인라인 display:none 대체) */
.ch-detail { display: none; }
.ch-ai-box { display: none; background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); }
.ch-ai-text { white-space: pre-wrap; font-size: var(--text-body-lg); line-height: var(--leading-body-lg); }
.ch-ai-used:empty { display: none; }   /* 오류 응답 때 사용량 줄이 비면 빈 여백을 남기지 않는다 */
/* 관심 채널 버튼 켜짐 상태 (JS 가 data-on="1" 을 준다) */
.ch-fav[data-on="1"] { background: var(--color-warning-soft); border-color: var(--color-warning-line); color: var(--color-warning); }
/* 수치 카드 4개: 모바일에서도 2열 (공통 .stat-grid 는 ≤768 에서 1열 — 값이 짧아 2열이 읽기 좋다) */
@media (max-width: 768px) {
  .ch-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* === page: rocket.html === */
/* 필터: 공통 .filter-panel 에 검색 줄 + "라벨 + 칩" 줄 두 개 (today.html 과 같은 구성, 모바일은 가로 스크롤). 행은 공통 .ch-list */
.rocket-filters .label { white-space: nowrap; flex-shrink: 0; }
/* 준비중 기간 칩(주간·월간): disabled 표시 (공통 .chip 에는 disabled 모양이 없음) */
.rocket-filters .chip[disabled] { opacity: 0.5; cursor: not-allowed; }
/* 채널명 검색: 줄을 다 채우되 너무 넓어지지 않게 */
.rocket-filters .rocket-search { flex: 1 1 220px; max-width: 420px; }
.rocket-list .pager { margin-top: var(--space-3); }
/* 로켓 영상 띠(2026-09-17): 하루 10만 이상 급상승한 영상 최대 5개 — 사진 위 "+조회수" 띠는 today 의 .v 와 같은 모양. 지표 띠 아래 자기 줄 */
.rocket-list .ch-videos { padding-top: var(--space-2); }
.rocket-list .ch-videos .v { position: absolute; left: 0; right: 0; bottom: 0; padding: var(--space-1); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); text-align: center; }

/* === page: lab.html === */
/* 컨테이너에 남긴 .wrap(tools-addon.js 의 앵커) 은 style.css 레거시 규칙이 1200 폭을 주므로 좁은 컨테이너 폭으로 되돌린다 */
.lab-page .wrap { max-width: var(--container-narrow); }
/* 연결 테스트 결과(#ping-out): JS 가 className 을 "test-out" / "test-out ok" / "test-out bad" 로 통째로 바꾸므로(로직 불변)
   그 이름을 공통 .alert-success / .alert-danger 와 같은 모양으로 그린다. JS 의 className 3줄을 "alert alert-success" 등으로 바꿔도 되면 이 블록은 사라진다. */
.lab-page .test-out { display: none; }
.lab-page .test-out.ok, .lab-page .test-out.bad { display: block; margin-top: var(--space-3); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); border: var(--border-w) solid var(--color-border); font-size: var(--text-body-sm); line-height: var(--leading-body-sm); white-space: pre-wrap; }
.lab-page .test-out.ok { background: var(--color-success-soft); border-color: var(--color-success-line); color: var(--color-success); }
.lab-page .test-out.bad { background: var(--color-danger-soft); border-color: var(--color-danger-line); color: var(--color-danger-text); }
/* 하루 한도 입력칸: 행 안에서 숫자 3자리 폭만 차지한다 (공통 .input 은 100% 폭) */
.lab-page .lim { width: var(--space-20); flex-shrink: 0; text-align: center; }

/* === page: blueprint.html === */
/* JS 가 className 을 통째로 바꾸거나 style.display 로 켜고 끄는 상자들(로직 불변): 비공개 안내 #devnote · 진행 중 #bp-load(.an-load)
   · 오류 #bp-err(.an-err) · 결과 #bp-res(.bp-res) · 캐시 안내 #cachenote · 스톡 미리보기 격자(.prev-grid). 초기 숨김은 hidden 속성 대신
   클래스로 둔다 (공통 [hidden] 규칙이 JS 의 style.display 보다 우선해 켤 수 없기 때문). */
.bp-page .bp-devnote, .bp-page .an-load, .bp-page .an-err, .bp-page .bp-res, .bp-page .cachenote, .bp-page .prev-grid { display: none; }
.bp-page .an-load.show, .bp-page .bp-res.show, .bp-page .cachenote.show { display: block; }
.bp-page .an-load.show { margin-bottom: var(--space-4); }
/* 오류 상자: JS 가 #bp-err 에 textContent 를 직접 쓰므로 안쪽에 .alert 를 둘 수 없어, 그 이름을 공통 .alert-danger 와 같은 모양으로 그린다 */
.bp-page .an-err.show { display: block; margin-bottom: var(--space-4); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); border: var(--border-w) solid var(--color-danger-line); background: var(--color-danger-soft); color: var(--color-danger-text); font-size: var(--text-body-sm); line-height: var(--leading-body-sm); }
/* "새로 분석" 버튼(#btn-force): JS 가 style.display 를 "inline-block"/"none" 으로 켜고 끈다. inline-block 이 되면 .btn 의 inline-flex 가 풀리므로
   줄높이를 버튼 높이(sm)에 맞춰 글자를 세로 가운데에 둔다 — community/post 의 .btn-js-toggle 과 같은 규칙 (공통 유틸로 올리면 사라진다) */
.bp-page .btn-js-toggle { display: none; line-height: var(--control-h-sm); }

/* 요약 카드(.card.bp-top): 세로(9:16) 썸네일 + 판정·난이도 배지 + 조립 공식 + 병목 안내 */
.bp-page .bp-top { display: flex; gap: var(--space-5); align-items: flex-start; }
.bp-page .bp-top .thumb { width: calc(var(--space-20) + var(--space-5)); flex-shrink: 0; }
/* 판정(GO/주의/비추천)·난이도(쉬움/보통/어려움) 배지: JS 가 #b-go/#b-diff 의 className 을 "go-badge go-X" / "d-chip d-X" 로 통째로 바꾸므로
   .badge 와 같은 모양을 이 이름들에 준다 (className 두 줄을 "badge badge-success" 등으로 바꿔도 되면 첫 줄은 사라진다) */
.bp-page .go-badge, .bp-page .d-chip { display: inline-flex; align-items: center; gap: var(--space-1); height: 22px; padding: 0 var(--space-2); border-radius: var(--radius-full); font-size: var(--text-caption); font-weight: var(--weight-bold); background: var(--color-surface-hover); color: var(--color-text-secondary); white-space: nowrap; vertical-align: middle; }
.bp-page .go-GO, .bp-page .d-쉬움 { background: var(--color-success-soft); color: var(--color-success); }
.bp-page .go-주의, .bp-page .d-보통 { background: var(--color-warning-soft); color: var(--color-warning); }
.bp-page .go-비추천, .bp-page .d-어려움 { background: var(--color-danger-soft); color: var(--color-danger-text); }

/* 장면 목록(#b-scenes > .scene): 장면 사이 구분선 */
.bp-page .scene + .scene { margin-top: var(--space-3); padding-top: var(--space-3); border-top: var(--border-w) solid var(--color-border); }
/* 스톡 미리보기 격자(.prev-grid.show): 3열 썸네일(.thumb) + 오른쪽 아래 길이 표시(.pv-d). 로딩·안내·출처 줄은 전체 폭 */
.bp-page .prev-grid.show { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-2); }
.bp-page .prev-grid a { position: relative; display: block; }
.bp-page .prev-grid .pv-d { position: absolute; right: var(--space-1); bottom: var(--space-1); padding: 0 var(--space-1); border-radius: var(--radius-sm); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); }
.bp-page .prev-grid > .loading, .bp-page .prev-grid > .alert, .bp-page .prev-grid > .prev-note { grid-column: 1 / -1; margin: 0; }

@media (max-width: 480px) {
  /* 모바일: 주소 입력 아래로 버튼을 내리고, 캐시 안내의 "새로 분석" 버튼은 글 아래 전체 폭으로, 요약 카드는 썸네일을 위로 올린다 */
  .bp-page .input-group { flex-wrap: wrap; }
  .bp-page .input-group .btn { flex: 1 1 100%; }
  .bp-page .cachenote .alert { flex-wrap: wrap; }
  .bp-page .cachenote .flex-1 { flex-basis: 0; }          /* 글이 아이콘 옆 같은 줄에서 시작하도록 (basis auto 면 아이콘만 남고 줄바꿈됨) */
  .bp-page .cachenote .btn-js-toggle { flex: 0 0 100%; text-align: center; }
  .bp-page .bp-top { flex-direction: column; }
}

/* === page: sources.html === */
/* 관리자 안내(#devnote): JS 가 style.display 를 block 으로 바꿔 보여주므로 바깥 래퍼를 숨기고, 안쪽 .alert 는 flex(아이콘+글)를 유지한다 (hot/similar 와 같은 패턴) */
.sources-devnote { display: none; }
/* 등록 폼(.input-group 두 줄): 주소+종류 / 제목+설명. 좁은 폭에서는 줄바꿈, 종류 select 는 공통 .select 의 100% 폭 대신 내용 폭 */
.sources-add .input-group { flex-wrap: wrap; }
.sources-add .input-group > .input { flex-basis: calc(var(--space-20) * 2 + var(--space-10)); }
.sources-add .input-group > .select { width: auto; flex: 0 0 auto; }
/* 등록 결과 문구(id add-msg): JS 가 className 을 "add-msg" / "add-msg err" / "add-msg ok" 로 직접 바꾸므로 그 이름에 .alert 와 같은 모양을 준다 */
.add-msg { display: none; margin-top: var(--space-3); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); border: var(--border-w) solid var(--color-border); font-size: var(--text-body-sm); line-height: var(--leading-body-sm); }
.add-msg.err { display: block; background: var(--color-danger-soft); border-color: var(--color-danger-line); color: var(--color-danger-text); }
.add-msg.ok { display: block; background: var(--color-success-soft); border-color: var(--color-success-line); color: var(--color-success); }
/* 소스 행(.list-item.s-item): 종류 배지·본문·동작 버튼을 위쪽으로 정렬. 내가 추천한 소스의 하트 버튼은 .mine */
.s-item { align-items: flex-start; }
.s-item .like-btn.mine { background: var(--color-danger-soft); border-color: var(--color-danger-line); color: var(--color-danger-text); }
/* 좁은 폭: 첫 줄에 종류 배지 + 동작 버튼, 둘째 줄에 제목·설명을 전체 폭으로 (본문이 100px 로 눌리는 것 방지) */
@media (max-width: 640px) {
  .s-item { flex-wrap: wrap; }
  .s-item .s-main { flex: 1 1 100%; order: 1; }
  .s-item .s-actions { margin-left: auto; }
}

/* === page: sources-guide.html === */
/* 관리자 안내(#devnote): JS 가 style.display 를 block 으로 바꿔 보여주므로 바깥 래퍼를 숨기고, 안쪽 .alert 는 flex 를 유지한다 (hot/similar/sources 와 같은 패턴) */
.guide-devnote { display: none; }
/* 소스 항목(.guide-item): 카드(.card) 안에서 선으로 나눈다. 제목 h3 = 링크 + 신호등 배지(.badge) 한 줄, 아래 설명 p, 선택적 팁(.alert-info) */
.guide-item { padding: var(--space-3) 0; border-top: var(--border-w) solid var(--color-border); }
.guide-item h3 { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin: 0 0 var(--space-1); font-size: var(--text-title); line-height: var(--leading-title); }
.guide-item p { margin: 0; }
.guide-item .alert { margin: var(--space-2) 0 0; }
/* 마무리 카드(기억할 것 3가지): 브랜드색 테두리로 강조, 번호 목록은 .doc 의 ol 들여쓰기를 쓰지 않는다 */
.guide-summary { border-color: var(--color-brand-line); }
.guide-summary .steps-list { padding-left: 0; margin: 0; }
.guide-summary .steps-list li { margin: 0; }

/* === page: reference.html === */
/* 레퍼런스 카드(.card.ref-card): 왼쪽 세로(9:16) 썸네일 + 오른쪽 제목·출처·AI 분석(.card-section > dl.kv) */
.ref-card { display: flex; gap: var(--space-4); align-items: flex-start; margin-bottom: var(--space-4); }
.ref-thumb { position: relative; display: block; flex: 0 0 calc(var(--space-16) * 2); width: calc(var(--space-16) * 2); border-radius: var(--radius-md); overflow: hidden; }
/* 썸네일 아래 조회수 띠: 사진 위라 진한 바닥 + 흰 글자 (today 의 .ch-videos .v 와 같은 모양) */
.ref-thumb .vt { position: absolute; left: 0; right: 0; bottom: 0; padding: var(--space-1); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); text-align: center; }
.ref-body { flex: 1; min-width: 0; }
.ref-ai .kv dt { font-weight: var(--weight-bold); }
/* 새 소재 아이디어: 문장 길이의 배지가 줄바꿈되도록 높이 고정을 푼다 (style.css 의 .shorts-card .badge 와 같은 처리) */
.ref-ideas { display: flex; flex-wrap: wrap; gap: var(--space-1); }
.ref-ideas .badge { height: auto; padding: calc(var(--space-1) / 2) var(--space-2); white-space: normal; line-height: var(--leading-caption); }
/* 좁은 폭: 썸네일을 위, 본문을 아래로. AI 분석 표(.kv)는 라벨 아래 값이 오는 한 열로 (두 열이면 값 폭이 180px 로 눌린다) */
@media (max-width: 640px) {
  .ref-card { flex-direction: column; }
  .ref-ai .kv { grid-template-columns: 1fr; gap: 0; }
  .ref-ai .kv dd { margin-bottom: var(--space-2); }
}

/* === page: study.html === */
/* 자료 카드 리스트(.study-grid > .study-card): 아이콘 동그라미 + 분류 배지 + 제목(2줄) + 올린 사람·날짜·조회. 폰은 1열 */
.study-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--space-3); }
.study-grid > .empty, .study-grid > .loading { grid-column: 1 / -1; }
.study-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-4); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-top: 4px solid var(--color-brand); border-radius: var(--radius-lg); color: inherit; text-decoration: none; transition: border-color var(--motion-fast) var(--ease), box-shadow var(--motion-fast) var(--ease); }
.study-card:hover { border-color: var(--color-brand-line); box-shadow: var(--shadow-md); text-decoration: none; }
.study-card .top { display: flex; align-items: center; gap: var(--space-2); }
.study-card .ic { width: 34px; height: 34px; border-radius: 50%; background: var(--color-brand-soft); color: var(--color-brand); display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
.study-card .ic .icon { stroke: var(--color-brand); }
.study-card .t { font-size: var(--text-body); font-weight: var(--weight-bold); line-height: var(--leading-body); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.study-card .meta { margin-top: auto; font-size: var(--text-caption); color: var(--color-text-muted); }
@media (max-width: 480px) { .study-grid { grid-template-columns: 1fr; } }

/* === page: community.html === */
/* 이번 주 하이라이트(.week-hl — 시안5B board): 검정 가로 띠. [빨간 태그] · 큰 노란 글(수익 인증 1위) · 세로선 · 큰 노란 글(구독자 성장 1위) · 오른쪽 [내 성과 자랑하기].
   시안의 숫자(+31,400 / ₩842,000)는 예시 — 글에 금액 항목이 없어 그 자리에 이번 주 가장 많이 본 글 제목을 넣는다(비었으면 '아직 없음'). 폰은 세로로 쌓음 */
.week-hl { display: flex; align-items: center; gap: var(--space-5); flex-wrap: wrap; margin-bottom: var(--space-4); padding: var(--space-5) var(--space-5);
  background: var(--color-ink); color: var(--color-on-ink); border-radius: var(--radius-lg); border-left: 6px solid var(--color-brand); }
.week-hl .t2 { flex-shrink: 0; background: var(--color-brand); color: var(--color-text-inverse); font-size: var(--text-2xs); font-weight: 900; padding: 4px 11px; border-radius: 5px; white-space: nowrap; }
.week-hl .hl-cell { flex: 1 1 200px; min-width: 0; color: inherit; text-decoration: none; }
.week-hl .hl-cell:hover { text-decoration: none; }
.week-hl .hl-cell:hover .bg { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 3px; }
.week-hl .bg { font-size: var(--text-h2); font-weight: 900; color: var(--color-accent); letter-spacing: -0.04em; line-height: 1.15;
  overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.week-hl p { margin: 4px 0 0; font-size: var(--text-body-sm); color: var(--color-on-ink-muted); font-weight: 600; }
.week-hl .dv { width: 1px; align-self: stretch; background: var(--color-ink-soft); }
.week-hl .hl-cell.is-empty .bg { color: var(--color-on-ink-muted); }
.week-hl .hl-cell.is-empty p { color: var(--color-accent); }
.week-hl .hl-go { margin-left: auto; flex-shrink: 0; }
@media (max-width: 899px) {
  .week-hl { flex-direction: column; align-items: stretch; gap: var(--space-3); padding: var(--space-4); }
  .week-hl .t2 { align-self: flex-start; }
  .week-hl .hl-cell { flex-basis: auto; }
  .week-hl .bg { font-size: var(--text-h3); }
  .week-hl .dv { width: auto; height: 1px; }
  .week-hl .hl-go { margin-left: 0; }
}
/* 분류 칩(.comm-filter): 시안은 고른 칩을 빨강으로 채움 (today/hot 과 동일 규칙) */
.comm-filter .chip.on { background: var(--color-brand); border-color: var(--color-brand); color: var(--color-text-inverse); }
/* 글 목록(.post-list — 공통 .rank-list 상자): 한 줄 = [분류 배지] 제목/작성자·날짜·댓글 … 오른쪽 큰 빨간 숫자 + '조회'.
   배지 색: 수익 인증·구독자 성장 = 빨강, 후기 = 검정+노랑(.y), 자유 = 회색(.n) */
.post-list { list-style: none; margin: 0; padding: 0; }
.post-list .post { display: flex; align-items: center; gap: 13px; padding: 15px 18px; cursor: pointer; }
.post-list .pc { flex-shrink: 0; font-size: var(--text-2xs); font-weight: 900; padding: 4px 10px; border-radius: 5px; background: var(--color-brand); color: var(--color-text-inverse); white-space: nowrap; }
.post-list .pc.y { background: var(--color-ink); color: var(--color-accent); }
.post-list .pc.n { background: var(--color-border); color: var(--color-text-secondary); }
.post-list .pbody { flex: 1 1 auto; min-width: 0; }
.post-list .pt { font-size: var(--text-body); font-weight: 700; line-height: var(--leading-body-sm); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.post-list .pm { margin-top: 2px; font-size: var(--text-caption); color: var(--color-text-muted); font-weight: 600; }
.post-list .pv { margin-left: auto; flex-shrink: 0; text-align: right; white-space: nowrap; }
.post-list .pv b { display: block; font-size: var(--text-h3); font-weight: 900; color: var(--color-brand); letter-spacing: -0.03em; line-height: 1.2; }
.post-list .pv b.is-zero { color: var(--color-text-muted); }
.post-list .pv span { font-size: var(--text-2xs); color: var(--color-text-muted); font-weight: 600; }
.post-list > li > .empty, .post-list > li > .error { border: 0; }
@media (max-width: 480px) {
  .post-list .post { gap: 10px; padding: 13px 14px; }
  .post-list .pt { font-size: var(--text-body-sm); }
  .post-list .pv b { font-size: var(--text-title); }
}
/* "더 보기" 버튼(#btn-more): JS 가 style.display 를 "inline-block"/"none" 으로 켜고 끈다(로직 불변).
   hidden 속성은 공통 [hidden] 규칙이 최우선이라 JS 의 inline-block 이 못 이기므로 초기 숨김은 클래스로 두고,
   inline-block 으로 켜졌을 때(.btn 은 inline-flex 가 아니게 됨) 글자가 세로 가운데에 오도록 줄높이를 버튼 높이(sm)에 맞춘다.
   post.html 의 '글 삭제'(#btn-del) 버튼과 같은 규칙 — 공통 유틸로 올려 주면 두 fragment 가 사라진다. */
.btn-js-toggle { display: none; line-height: var(--control-h-sm); }

/* === page: post.html === */
/* '글 삭제' 버튼(#btn-del): JS 가 내 글일 때 style.display = "inline-block" 으로 켠다(로직 불변).
   hidden 속성은 공통 [hidden] 규칙이 최우선이라 JS 의 inline-block 이 못 이기므로 초기 숨김은 클래스로 두고,
   inline-block 으로 켜졌을 때(.btn 의 inline-flex 가 풀림) 글자가 세로 가운데에 오도록 줄높이를 버튼 높이(sm)에 맞춘다.
   community.html 의 '더 보기'(#btn-more) 와 같은 규칙 — 공통 유틸로 올려 주면 두 fragment 가 사라진다. */
.btn-js-toggle { display: none; line-height: var(--control-h-sm); }
/* 글 본문(.post-view .content)의 아래 여백(공통 32px)은 같은 카드 안에 댓글이 이어질 때를 위한 값 — 이 페이지는 댓글이 다음 카드라
   본문이 카드의 마지막 요소일 때는 여백을 없앤다 (공통 규칙을 :not(:last-child) 로 바꿔 주면 이 줄은 필요 없음). */
.post-view .content:last-child { margin-bottom: var(--space-0); }

/* === page: favorites.html === */
/* 관심 채널 행은 공통 .ch-list(.ch-row · .ch-name · .ch-stats · .ch-actions) 그대로 — 페이지 전용 규칙 없음 */

/* === page: admin.html === */
/* 출처 탭(.tabs.cat-tabs — JS 가 ".cat-tabs button" 으로 찾으므로 이름 보존): 두 줄(이름 + small "… · 대기 N").
   공통 .tab 의 한 줄 고정 높이를 풀고 설명은 small 로 아래 줄에 둔다 */
.cat-tabs .tab { height: auto; padding: var(--space-2) var(--space-3) var(--space-3); text-align: left; line-height: var(--leading-body); }
.cat-tabs .tab small { display: block; font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-regular); color: var(--color-text-muted); margin-top: calc(var(--space-1) / 2); }

/* 상태 수(검토 대기·승인됨·제외됨): 작은 .stat-card 를 한 줄에 나란히 (원본 "관리자용 · 작게") */
.admin-page .counts { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-4); }
.admin-page .counts .stat-card { flex: 0 1 auto; min-width: calc(var(--space-20) + var(--space-8)); padding: var(--space-2) var(--space-4); text-align: center; }

/* 필터: .filter-bar 한 상자 안에 "라벨 + 칩 묶음" 줄을 쌓는다 (today/rocket 의 .filter-row 와 같은 구성 — 공통화 후보) */
.admin-filters .filter-row { flex: 1 1 100%; display: flex; gap: var(--space-2); align-items: flex-start; }
.admin-filters .flabel { flex: 0 0 var(--space-16); min-height: var(--control-h-sm); display: inline-flex; align-items: center; }

/* 일괄 처리 줄(.bulkbar — JS 가 ".bulkbar .bk" 를 disabled 로 켜고 끔): 전체 선택 + 선택 수 + 오른쪽 버튼 3개. 긴 목록에서도 따라오게 sticky */
.admin-page .bulkbar { position: sticky; top: var(--space-2); z-index: var(--z-header); display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; padding: var(--space-3) var(--space-4); margin-bottom: var(--space-4); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); }

/* 채널 카드(.list-item.acard — JS 가 .acard / .chk / data-id 로 찾고 .sel 을 토글): 체크박스 · 썸네일 · 정보 · 영상 5칸 · 동작 열.
   줄바꿈 순서: 영상 띠(.ch-videos/.novids)는 order 로 맨 뒤에 두어 좁은 폭에서 자기 줄로 내려간다 */
.admin-page .acard { flex-wrap: wrap; }
.admin-page .acard.sel { background: var(--color-brand-soft); border-color: var(--color-brand-line); }
.admin-page .acard .chk { width: var(--icon-md); height: var(--icon-md); margin: 0; flex-shrink: 0; accent-color: var(--color-brand); cursor: pointer; }
.admin-page .acard .name .badge { margin-left: var(--space-1); }
.admin-page .acard .cat-sel { width: auto; }
/* 확신도(상·중·하)·처리 상태(승인·제외) 배지: 클래스 이름이 값에서 오므로(원본 b-상 / stat-line.승인 방식) 색만 여기서 준다 */
.admin-page .conf-상 { background: var(--color-success-soft); color: var(--color-success); }
.admin-page .conf-중 { background: var(--color-warning-soft); color: var(--color-warning); }
.admin-page .conf-하 { background: var(--color-danger-soft); color: var(--color-danger-text); }
.admin-page .stat-line.승인 { background: var(--color-success-soft); color: var(--color-success); }
.admin-page .stat-line.제외 { background: var(--color-danger-soft); color: var(--color-danger-text); }
/* 영상 미리보기(.ch-videos a 는 style.css 76×135): 조회수 띠 — 사진 위라 진한 바닥 + 흰 글자 (today 의 .v 와 같은 모양) */
.admin-page .acard .ch-videos, .admin-page .acard .novids { order: 10; }
.admin-page .acard .ch-videos .vt { position: absolute; left: 0; right: 0; bottom: 0; padding: var(--space-1); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); line-height: var(--leading-caption); font-weight: var(--weight-bold); text-align: center; }
.admin-page .acard .novids { flex-basis: 100%; }
/* 동작 열: 버튼을 세로로 쌓은 고정 폭 열, 상태 배지는 열 폭에 맞춰 가운데 */
.admin-page .acard .aactions { display: flex; flex-direction: column; gap: var(--space-1); flex: 0 0 auto; min-width: calc(var(--space-20) + var(--space-10)); }
.admin-page .acard .aactions .badge { justify-content: center; }

/* 넓은 화면(≥1280): 영상 5칸을 정보와 동작 열 사이 같은 줄에 (원본 배치). 영상이 없으면 같은 폭의 안내 글로 열을 맞춘다 */
@media (min-width: 1280px) {
  .admin-page .acard .ch-videos, .admin-page .acard .novids { order: 0; flex: 0 0 auto; }
  .admin-page .acard .novids { flex-basis: calc(76px * 5 + var(--space-2) * 4); text-align: center; }   /* = style.css 타일 76px × 5 + 간격 4개 */
}
/* 모바일(≤768): 고정 메뉴 단추(왼쪽 위)와 겹치지 않게 일괄 처리 줄은 흐름에 둔다 */
@media (max-width: 768px) {
  .admin-page .bulkbar { position: static; }
}
/* 좁은 폭(≤640): 출처 탭 두 개는 폭을 나눠 같은 줄에(설명이 안에서 줄바꿈) · 동작 열을 정보 아래 한 줄(가로 버튼)로 내려 정보 폭을 확보한다 */
@media (max-width: 640px) {
  .cat-tabs .tab { flex: 1 1 0; min-width: 0; padding-left: var(--space-2); padding-right: var(--space-2); }
  .admin-page .acard .aactions { flex-direction: row; flex-wrap: wrap; align-items: center; flex-basis: 100%; order: 5; }
}
/* 모바일(≤480): 일괄 처리 버튼 3개를 자기 줄 전체 폭으로 */
@media (max-width: 480px) {
  .admin-page .bulkbar .btns { flex: 1 1 100%; }
  .admin-page .bulkbar .btns .btn { flex: 1 1 auto; }
}

/* === page: baidu-admin.html === */
/* 수치 카드 줄(현재 상태 3칸 · 오늘 사용량 5칸): 공통 .stat-grid 는 4열(≤1024 는 2열)이라 5칸이면 마지막 한 칸이 홀로 남는다.
   칸 최소폭 104px 로 자동 채움 — 좁은 컨테이너(720, 카드 안 632px)에서 5칸 한 줄, 390 에서 2열. */
.bd-page .stat-grid { grid-template-columns: repeat(auto-fit, minmax(calc(var(--space-20) + var(--space-6)), 1fr)); }
/* 상태 값(켜짐/정상 + 상태 점)이 한 줄로 읽히도록 */
.bd-page .stat-value .status-dot { margin-right: var(--space-2); }
/* 한도·예산 입력 3칸(.grid-3): 라벨 길이가 달라 입력칸 높이가 어긋나지 않게 아래 끝을 맞춘다 */
.bd-page .bd-limits { align-items: end; }
.bd-page .bd-limits .field { margin-bottom: 0; }
/* 알림(#toast): 페이지 JS 가 textContent 를 쓰고 .show 를 붙였다 떼므로(로직 불변) 공통 .toast 를 .toast-stack 안에 두고
   여기서는 보임/숨김(투명도)만 정한다. JS 의 toast() 를 UI.toast() 로 바꿔도 되면 이 두 줄과 #toast 마크업은 사라진다. */
.bd-toast { opacity: 0; pointer-events: none; animation: none; transition: opacity var(--motion-base) var(--ease); }
.bd-toast.show { opacity: 1; }
@media (max-width: 480px) {
  /* 상태 3칸: 값이 글자("작동중(정지)"·날짜)라 반 칸에서 두 줄로 꺾인다 — 한 줄에 한 칸 */
  .bd-page .bd-status { grid-template-columns: 1fr; }
  /* 사용량 5칸(2열): 홀수 번째로 남는 마지막 칸을 한 줄 전체로 */
  .bd-page .stat-grid > .stat-card:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

/* === page: review.html === */
/* 조회 줄(.filter-bar.rv-bar): "최근 [7] 일" 은 label 하나가 입력을 감싼다(접근성 이름 "최근 일") — 한 줄 가운데 정렬, 입력은 공통 .input 의 100% 폭 대신 숫자 두 자리 폭 */
.rv-page .rv-range { display: inline-flex; align-items: center; gap: var(--space-2); }
.rv-page .rv-days { width: var(--space-20); }
/* 검수 카드(.card.rv) 머리: 제목(h2, title 역할) + 상태·내 작업 배지 + 오른쪽 끝 시각. 파일 이름은 띄어쓰기가 없어도 카드 안에서 줄바꿈되게 */
.rv-page .rv-h { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }
.rv-page .rv-title { min-width: 0; overflow-wrap: anywhere; }
/* 원본/결과 나란히(.grid-2): 비교가 목적이라 공통 .grid-2 의 768 대신 원본과 같은 640 까지 두 칸을 유지한다.
   영상은 칸 폭 전체, 세로 영상이 너무 길어지지 않게 높이 상한 420px, 여백은 진한 바닥(검정 토큰이 없어 본문색) */
.rv-page .rv-pair { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.rv-page .rv-pair video { display: block; width: 100%; max-height: calc(var(--space-20) * 5 + var(--space-5)); background: var(--color-text); border-radius: var(--radius-md); }
.rv-page .rv-pair .alert { margin: 0; }
@media (max-width: 640px) { .rv-page .rv-pair { grid-template-columns: 1fr; } }
/* 숫자 줄: 작은 보조 글자, 값만 진하게 (JS 가 " · " 로 이어 붙인 한 문단) */
.rv-page .rv-num { margin-top: var(--space-2); font-size: var(--text-body-sm); line-height: var(--leading-body-lg); color: var(--color-text-secondary); font-variant-numeric: tabular-nums; }
.rv-page .rv-num b { color: var(--color-text); }

/* === page: watermark-remover.html === */
/* 자막제거기 — 옛 page <style> 를 토큰으로 옮긴 것. 클래스 이름은 JS(querySelector/classList)가 쓰므로 그대로 둔다.
   숨김은 .wm-hide(기본 숨김) + JS 의 style.display 로 켠다 — [hidden] 은 우선순위가 최상이라 JS 가 못 켜서 쓰지 않는다. */
.wm-page { max-width: calc(var(--container-narrow) + var(--space-20) + var(--space-5)); }
.wm-page .page-header { justify-content: center; text-align: center; margin-bottom: var(--space-4); }
.wm-hide { display: none; }
.wm-page .quota { display: block; width: fit-content; margin: 0 auto var(--space-4); padding: var(--space-2) var(--space-5); border-radius: var(--radius-full); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); color: var(--color-brand-hover); font-weight: var(--weight-bold); text-align: center; }
.wm-page .quota.warn { background: var(--color-danger-soft); border-color: var(--color-danger-line); color: var(--color-danger-text); }

/* 모드 고르기 (기본 / 고화질) */
.wm-page .modes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); max-width: 620px; margin: var(--space-4) auto; }
.wm-page .mode { border: var(--border-w-strong) solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-4) var(--space-3); text-align: center; cursor: pointer; background: var(--color-surface); transition: border-color var(--motion-fast) var(--ease), background var(--motion-fast) var(--ease); }
.wm-page .mode:hover { border-color: var(--color-brand-line); }
.wm-page .mode.on { border-color: var(--color-brand); background: var(--color-brand-soft); box-shadow: 0 0 0 2px var(--color-brand-line); }
.wm-page .mode b { display: block; font-size: var(--text-body-lg); }
.wm-page .mode .m-desc { display: block; font-size: var(--text-body-sm); color: var(--color-text-secondary); line-height: var(--leading-body-sm); margin-top: var(--space-1); min-height: 38px; }
.wm-page .mode .m-eta { display: inline-block; font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-brand-hover); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-full); padding: var(--space-1) var(--space-3); margin-top: var(--space-2); }
@media (max-width: 640px) { .wm-page .modes { grid-template-columns: 1fr; } .wm-page .mode .m-desc { min-height: 0; } }

.wm-page .upnote { font-size: var(--text-body-sm); color: var(--color-text-secondary); line-height: var(--leading-body); text-align: center; margin: 0 0 var(--space-3); background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); }
.wm-page .eta-line { display: none; font-weight: var(--weight-bold); color: var(--color-brand-hover); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); margin: var(--space-3) 0; line-height: var(--leading-body); }
.wm-page .eta-line.show { display: block; }

/* 자동탐지 미리보기 / 평가 상자 */
.wm-page .autopanel { display: none; border: var(--border-w) solid var(--color-brand-line); background: var(--color-surface-subtle); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-4); margin: var(--space-3) 0 var(--space-1); font-size: var(--text-body-sm); line-height: var(--leading-body); }
.wm-page .autopanel.show { display: block; }
.wm-page .autopanel h4 { margin: 0 0 var(--space-2); font-size: var(--text-title); }
.wm-page .autopanel .ap-list { margin: var(--space-2) 0; }
.wm-page .ap-row { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-1) 0; border-top: var(--border-w) dashed var(--color-brand-line); }
.wm-page .ap-row:first-child { border-top: 0; }
.wm-page .ap-row-wrap { flex-wrap: wrap; }
.wm-page .ap-badge { background: var(--color-brand-line); color: var(--color-brand-active); border-radius: var(--radius-full); padding: 0 var(--space-2); font-size: var(--text-caption); font-weight: var(--weight-bold); white-space: nowrap; }
.wm-page .ap-dim { color: var(--color-text-muted); font-size: var(--text-caption); }
.wm-page .ap-act { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-3); justify-content: center; }
.wm-page .ap-btn { min-height: var(--control-h-lg); height: auto; white-space: normal; }
.wm-page .ap-btn.warn { border-color: var(--color-danger-line); color: var(--color-danger-text); }
.wm-page .ap-btn.warn:hover { background: var(--color-danger-soft); }

/* 지울 자리 정하기 — 직접 지정 / 자동 지정 (두 버튼은 같은 크기) */
.wm-page .pick-lead { text-align: center; font-size: var(--text-body-sm); color: var(--color-text-secondary); margin: 0 0 var(--space-2); }
.wm-page .man-tiers { display: flex; gap: var(--space-3); align-items: stretch; margin: 0 auto var(--space-4); max-width: 620px; }
.wm-page .mt-btn { flex: 1 1 0; min-width: 0; height: auto; min-height: var(--control-h-lg); padding: var(--space-3) var(--space-3); flex-direction: column; white-space: normal; line-height: var(--leading-body-sm); border-width: var(--border-w-strong); border-radius: var(--radius-lg); }
.wm-page .mt-btn small { display: block; font-weight: var(--weight-regular); font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-1); }
.wm-page .mt-btn.on { border-color: var(--color-brand); background: var(--color-brand-soft); color: var(--color-brand); }
@media (max-width: 480px) { .wm-page .man-tiers { flex-direction: column; } .wm-page .mt-btn { flex: 0 0 auto; } }

.wm-page .askc { max-width: 620px; margin: 0 auto var(--space-4); padding: var(--space-3) var(--space-4); border: var(--border-w) solid var(--color-brand-line); background: var(--color-brand-soft); border-radius: var(--radius-md); font-size: var(--text-body-sm); color: var(--color-brand-active); text-align: center; line-height: var(--leading-body); }
.wm-page .askc label { display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer; font-weight: var(--weight-title); }
.wm-page .askc input { width: 18px; height: 18px; cursor: pointer; }
.wm-page .askc .askc-sub { display: block; font-weight: var(--weight-regular); color: var(--color-text-secondary); font-size: var(--text-caption); margin-top: var(--space-1); }

/* 영상 고르기 */
.wm-page .drop { max-width: 620px; margin: 0 auto var(--space-3); }
.wm-page .drop b { display: block; color: var(--color-brand); font-size: var(--text-body-lg); }
.wm-page .drop .sub { font-size: var(--text-body-sm); color: var(--color-text-muted); margin-top: var(--space-1); }
.wm-page .wm-privacy { margin: var(--space-3) 0 0; font-size: var(--text-caption); color: var(--color-text-secondary); line-height: var(--leading-body); text-align: center; }
.wm-page .wm-privacy a { color: inherit; text-decoration: underline; }

/* 네모 그리기 편집기 */
.wm-page .editor { display: none; margin: var(--space-3) 0; }
.wm-page .editor.show { display: block; }
.wm-page .ed-hint { font-size: var(--text-body-sm); color: var(--color-text-secondary); margin: 0 0 var(--space-3); line-height: var(--leading-body); text-align: center; }
.wm-page .ed-wrap { position: relative; display: block; max-width: 100%; width: fit-content; margin: 0 auto; border-radius: var(--radius-lg); overflow: hidden; border: var(--border-w) solid var(--color-border); box-shadow: var(--shadow-sm); }
.wm-page #ed-canvas { display: block; max-width: 100%; touch-action: none; cursor: crosshair; }
.wm-page .ed-split { margin-top: var(--space-3); padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); background: var(--color-success-soft); border: var(--border-w) solid var(--color-success-line); color: var(--color-success); font-size: var(--text-body-sm); line-height: var(--leading-body); text-align: center; }
.wm-page .ed-scrub { margin-top: var(--space-3); }
.wm-page .ed-scrub input[type="range"] { width: 100%; height: 30px; cursor: pointer; display: block; }
.wm-page .ed-scrub2, .wm-page .ed-seg, .wm-page .ed-act { display: flex; gap: var(--space-2); align-items: center; margin-top: var(--space-3); flex-wrap: wrap; justify-content: center; }
.wm-page .ed-time { font-size: var(--text-body-lg); font-weight: var(--weight-display); color: var(--color-text); min-width: 132px; text-align: center; background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); font-variant-numeric: tabular-nums; }
.wm-page .ed-btn { min-height: var(--touch-min); height: auto; }
.wm-page .seg-chip { display: inline-flex; align-items: center; min-height: var(--control-h-sm); font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text-secondary); background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-full); padding: 0 var(--space-3); cursor: pointer; }
.wm-page .seg-chip.on { color: var(--color-brand-hover); background: var(--color-brand-soft); border-color: var(--color-brand); }
.wm-page .ed-seglist { display: flex; gap: var(--space-2); flex-wrap: wrap; align-items: center; }
.wm-page .ed-cnt { font-size: var(--text-body-sm); color: var(--color-text-secondary); text-align: center; width: 100%; margin-top: var(--space-1); }
.wm-page .ed-cnt.warn { color: var(--color-warning); }

/* 시작 */
.wm-page .consent { color: var(--color-text-secondary); margin: var(--space-4) 0 0; line-height: var(--leading-body); text-align: center; }
.wm-page .consent label { display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer; }
.wm-page .consent input { width: 18px; height: 18px; }
.wm-page .go-btn { display: flex; width: 100%; max-width: 460px; margin: var(--space-4) auto 0; }
.wm-page .prog-wrap { display: none; margin: var(--space-4) 0; }
.wm-page .prog-wrap.show { display: block; }
.wm-page .prog-bar { height: var(--space-3); }
.wm-page .prog-txt { color: var(--color-text-secondary); margin-top: var(--space-2); text-align: center; }
.wm-page .vs-err { display: none; }
.wm-page .vs-err.show { display: flex; }
.wm-page .started { display: none; font-weight: var(--weight-bold); }
.wm-page .started.show { display: flex; }

/* 안내 팝업 (넓은 네모 / 고화질 불가) — JS 가 .show 로 켠다 */
.wm-page .mdl-bg { display: none; }
.wm-page .mdl-bg.show { display: flex; }
.wm-page .mdl { max-width: 460px; }
.wm-page .mdl h3 { margin: 0 0 var(--space-3); line-height: var(--leading-h3); }
.wm-page .mdl p { margin: 0 0 var(--space-3); line-height: var(--leading-body); color: var(--color-text-secondary); }
.wm-page .mdl-row { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-4); }
.wm-page .mdl-row .btn { width: 100%; }

/* 관리자 설정 */
.wm-page .adm { display: none; margin: var(--space-5) 0; }
.wm-page .adm-row { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; margin: var(--space-2) 0; }
.wm-page .adm-row .input { width: 86px; }
.wm-page .fbrep { margin-top: var(--space-3); border-top: var(--border-w) dashed var(--color-border); padding-top: var(--space-3); font-size: var(--text-body-sm); line-height: var(--leading-body); }
/* 손님 의견 표는 의견함으로 옮겼다 (대표 지시 2026-09-16). 같은 글이 두 곳에 나뉘어 있으면 한쪽을 놓친다.
   숫자 요약(자막 지워짐 비율·배경 점수·많이 나온 문제)은 품질을 재는 지표라 이 화면에 그대로 둔다.
   watermark-remover.html 은 이 세션이 고치지 않기로 한 파일이라, 화면에서 표만 걷어낸다. */
.wm-page .fbrep .table-wrap { display: none; }
.wm-page .fbrep::after { content: "손님이 적은 의견은 [운영 → 의견함]에서 모두 봅니다."; display: block; margin-top: var(--space-2);
  font-size: var(--text-caption); color: var(--color-brand); font-weight: var(--weight-bold); }
.wm-page .wm-list-title { margin: var(--space-6) 0 var(--space-2); }

/* 내 작업 카드 */
.wm-page .wl-item { margin: var(--space-3) 0; padding: var(--space-4); }
.wm-page .wl-title { font-weight: var(--weight-bold); word-break: keep-all; }
.wm-page .wl-video { width: 100%; max-height: 420px; border-radius: var(--radius-md); background: var(--color-text); margin: var(--space-2) 0; }
/* 세로 영상은 칸을 세로로 (가로 칸에 4.57배 축소되어 흐리다는 오해를 샀던 것) */
.wm-page .wl-video.is-portrait { width: auto; max-width: 100%; display: block; margin: var(--space-2) auto; }
.wm-page .wl-scale { font-size: var(--text-caption); color: var(--color-text-muted); text-align: center; margin: 0 0 var(--space-2); }
.wm-page .wl-note { margin: var(--space-2) 0; display: block; }
.wm-page .wl-msg { font-size: var(--text-body-sm); color: var(--color-text-secondary); text-align: center; margin: var(--space-2) 0; }
.wm-page .wl-eta { font-size: var(--text-caption); color: var(--color-brand-active); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); margin-top: var(--space-2); line-height: var(--leading-body); }
.wm-page .wl-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; justify-content: center; align-items: center; margin-top: var(--space-3); }
.wm-page .steps { margin: var(--space-3) 0 var(--space-2); }
.wm-page .steps .stp { flex: 1; text-align: center; font-size: var(--text-caption); color: var(--color-text-muted); padding: var(--space-1); border-radius: var(--radius-md); background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); line-height: var(--leading-caption); }
.wm-page .steps .stp.on { background: var(--color-brand-soft); border-color: var(--color-brand); color: var(--color-brand); font-weight: var(--weight-bold); }
.wm-page .steps .stp.done { background: var(--color-success-soft); border-color: var(--color-success-line); color: var(--color-success); }
/* 실시간 진행 (몇 % · 몇 초째 · 몇 분 남았는지) */
.wm-page .pg-wrap { margin: var(--space-3) 0 var(--space-1); }
.wm-page .pg-bar { height: var(--space-3); }
.wm-page .pg-fill { transition: width 0.9s linear; }
.wm-page .pg-fill.over { background: var(--color-warning); }
.wm-page .pg-line { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3); margin-top: var(--space-2); color: var(--color-text); flex-wrap: wrap; }
.wm-page .pg-pct { font-weight: var(--weight-display); font-size: var(--text-h2); color: var(--color-brand); font-variant-numeric: tabular-nums; }
.wm-page .pg-pct.over { color: var(--color-warning); }
.wm-page .pg-el { font-variant-numeric: tabular-nums; font-weight: var(--weight-bold); }
.wm-page .pg-left { font-variant-numeric: tabular-nums; color: var(--color-text-secondary); }
.wm-page .pg-note { font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-1); }

/* 요금 안내 · 기본화질 재동의 · 지울 곳 확인 카드 */
.wm-page .pricebox { border: var(--border-w) solid var(--color-brand-line); background: var(--color-brand-soft); border-radius: var(--radius-md); padding: var(--space-3); margin: var(--space-2) 0 var(--space-1); font-size: var(--text-body-sm); color: var(--color-brand-active); line-height: var(--leading-body); text-align: center; }
.wm-page .pricebox b { font-size: var(--text-h2); font-variant-numeric: tabular-nums; }
.wm-page .ab, .wm-page .cf { border: var(--border-w-strong) solid var(--color-brand-line); background: var(--color-brand-soft); border-radius: var(--radius-lg); padding: var(--space-3); margin-top: var(--space-3); }
.wm-page .cf { border-color: var(--color-warning-line); background: var(--color-warning-soft); }
.wm-page .ab h4, .wm-page .cf h4 { margin: 0 0 var(--space-2); font-size: var(--text-title); }
.wm-page .ab h4 { color: var(--color-brand-active); }
.wm-page .cf h4, .wm-page .cf .cf-sub, .wm-page .cf .cf-left { color: var(--color-warning); }
.wm-page .ab .ab-sub, .wm-page .cf .cf-sub { font-size: var(--text-body-sm); line-height: var(--leading-body); }
.wm-page .ab .ab-sub { color: var(--color-brand-active); }
.wm-page .cf .cf-sub { margin-bottom: var(--space-2); }
.wm-page .cf canvas { width: 100%; max-width: 420px; display: block; margin: 0 auto; border-radius: var(--radius-md); background: var(--color-text); }
.wm-page .ab-act, .wm-page .cf-act { display: flex; gap: var(--space-2); justify-content: center; flex-wrap: wrap; margin-top: var(--space-3); }
.wm-page .ab-btn, .wm-page .cf-btn { height: auto; min-height: var(--control-h-lg); white-space: normal; }
.wm-page .cf .cf-left { font-size: var(--text-caption); text-align: center; margin-top: var(--space-2); }
.wm-page .invcode { width: 180px; }

/* === page: video-silence.html === */
/* 영상 무음 제거 — 옛 page <style> 를 토큰으로 옮긴 것. 클래스 이름은 JS(querySelector/classList)가 쓰므로 그대로 둔다.
   showErr() 가 className 을 통째로 "vs-err show" 로 바꾸므로 오류 상자는 공통 .alert 대신 여기서 직접 그린다. */
.vs-page { max-width: calc(var(--container-narrow) + var(--space-20) + var(--space-5)); }
.vs-page .page-header { margin-bottom: var(--space-3); }
.vs-page .vs-hide { display: none; }
.vs-page .an-hint { font-size: var(--text-body-lg); color: var(--color-text-secondary); margin-bottom: var(--space-4); line-height: var(--leading-body); }
.vs-page .sens-row { margin: 0 0 var(--space-3); line-height: 1.9; }
.vs-page .sens-row .sens-q { color: var(--color-text-secondary); }
.vs-page .sens-row label { margin-right: var(--space-3); cursor: pointer; }
.vs-page .drop { margin-bottom: var(--space-4); transition: padding var(--motion-base) var(--ease); }
.vs-page .drop b { color: var(--color-brand); }
.vs-page .drop .sub { font-size: var(--text-body-sm); color: var(--color-text-muted); margin-top: var(--space-1); }
/* 결과 카드가 있을 때는 위쪽을 접어, 영상과 편집 도구가 한 화면에 들어오게 한다 */
body.has-work .vs-page .an-hint { display: none; }
body.has-work .vs-page .drop { padding: var(--space-2) var(--space-4); margin-bottom: var(--space-2); }
body.has-work .vs-page .drop .sub { display: none; }
body.has-work .vs-page .drop b { font-size: var(--text-body); }
body.has-work .vs-page .sens-row { font-size: var(--text-caption); line-height: var(--leading-body-sm); margin-bottom: var(--space-1); }
body.has-work .vs-page .sens-row br { display: none; }
body.has-work .vs-page .sens-row label { margin-right: var(--space-2); }
body.has-work .vs-page .tip .ic { padding: 0 var(--space-2); }
body.has-work .vs-page .page-title { font-size: var(--text-h2); }
body.has-work .vs-page .page-header { margin-bottom: var(--space-1); }
body.has-work .vs-page .wl-item { padding: var(--space-3); margin: var(--space-2) 0; }
body.has-work .vs-page .adm-panel { padding: var(--space-1) var(--space-3); font-size: var(--text-caption); margin: var(--space-1) 0; }
body.has-work .page { padding-top: var(--space-3); }

.vs-page .prog-wrap { display: none; margin: var(--space-4) 0; }
.vs-page .prog-wrap.show { display: block; }
.vs-page .prog-bar { height: var(--space-3); }
.vs-page .prog-txt { color: var(--color-text-secondary); margin-top: var(--space-2); text-align: center; }
.vs-page .vs-err { display: none; background: var(--color-danger-soft); border: var(--border-w) solid var(--color-danger-line); color: var(--color-danger-text); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); margin: var(--space-3) 0; }
.vs-page .vs-err.show { display: block; }
.vs-page .adm-panel { background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-4); font-size: var(--text-body-sm); color: var(--color-brand-active); margin: var(--space-3) 0; }
.vs-page #wl-empty { border: var(--border-w) dashed var(--color-border); border-radius: var(--radius-lg); padding: var(--space-5) var(--space-4); margin: var(--space-3) 0; background: var(--color-surface-subtle); text-align: center; font-weight: var(--weight-bold); color: var(--color-text-muted); line-height: 1.9; }
.vs-page #wl-empty span { font-size: var(--text-caption); font-weight: var(--weight-medium); color: var(--color-text-muted); }

/* 작업 카드 */
.vs-page .wl-item { margin: var(--space-3) 0; padding: var(--space-4); }
.vs-page .wl-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--space-2); margin-bottom: var(--space-2); }
.vs-page .wl-title { font-weight: var(--weight-display); word-break: break-all; }
.vs-page .wl-item.folded { padding: var(--space-2) var(--space-4); }
.vs-page .wl-item.folded .wl-head { margin-bottom: 0; }
.vs-page .fold-btn { flex: 0 0 auto; }
.vs-page .wl-prog, .vs-page .wl-done { max-width: 620px; margin: 0 auto; }
.vs-page .steps { margin: 0 0 var(--space-2); }
.vs-page .steps .stp { flex: 1; text-align: center; font-size: var(--text-caption); color: var(--color-text-muted); padding: var(--space-1); border-radius: var(--radius-md); background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); line-height: var(--leading-caption); }
.vs-page .steps .stp.on { background: var(--color-brand-soft); border-color: var(--color-brand); color: var(--color-brand); font-weight: var(--weight-bold); }
.vs-page .steps .stp.done { background: var(--color-success-soft); border-color: var(--color-success-line); color: var(--color-success); }
.vs-page .wl-elapsed { font-size: var(--text-caption); color: var(--color-text-secondary); text-align: center; margin-top: var(--space-1); }
.vs-page .wl-eta { font-size: var(--text-caption); color: var(--color-brand-active); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); margin-top: var(--space-2); line-height: var(--leading-body); text-align: center; }
.vs-page .done-h { margin: 0; font-size: var(--text-caption); text-align: center; line-height: var(--leading-caption); color: var(--color-text-secondary); font-weight: var(--weight-bold); }
/* 영상은 화면 높이에 맞춰 작게 — 세로 영상도 한 화면에 들어오도록 */
.vs-page .vwrap { display: flex; justify-content: center; align-items: center; background: var(--color-text); border-radius: var(--radius-lg); padding: var(--space-1); margin: var(--space-2) auto; width: fit-content; max-width: 100%; }
.vs-page .wl-video { display: block; max-height: clamp(140px, calc(100vh - 685px), 340px); max-width: 100%; width: auto; height: auto; border-radius: var(--radius-md); background: var(--color-text); }
.vs-page .wl-note { background: var(--color-warning-soft); border: var(--border-w) solid var(--color-warning-line); color: var(--color-warning); border-radius: var(--radius-md); padding: var(--space-1) var(--space-3); font-size: var(--text-caption); text-align: center; line-height: var(--leading-body-sm); }
.vs-page .wl-act { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; justify-content: center; max-width: 620px; margin: var(--space-2) auto 0; }
.vs-page .recut-box { font-size: var(--text-body-sm); color: var(--color-text-secondary); display: inline-flex; align-items: center; gap: var(--space-1); flex-wrap: wrap; }
.vs-page .wl-sens { width: auto; }
@media (max-width: 860px) { .vs-page .wl-act { flex-direction: column; align-items: stretch; } .vs-page .wl-act .btn { width: 100%; } }

/* 원본/처리본 비교 듣기 */
.vs-page .ab { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; justify-content: center; margin: var(--space-1) 0 var(--space-3); }
.vs-page .ab .btn.on { background: var(--color-brand); border-color: var(--color-brand); color: var(--color-text-inverse); }
.vs-page .ab .ab-msg { font-size: var(--text-caption); color: var(--color-text-secondary); }
@media (max-width: 860px) { .vs-page .ab .btn { flex: 1 1 42%; } }

/* 작업 전 / 작업 후 한눈 비교 */
.vs-page .vcmp { display: none; margin: var(--space-2) 0 0; }
.vs-page .vc-row { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-1); }
.vs-page .vc-tag { width: 52px; flex-shrink: 0; font-size: var(--text-caption); font-weight: var(--weight-display); color: var(--color-text-muted); text-align: right; white-space: nowrap; }
.vs-page .vc-tag.aft { color: var(--color-success); }
.vs-page .vc-hold { flex: 1; min-width: 0; }
.vs-page .vc-box { width: 100%; border-radius: var(--radius-md); overflow: hidden; border: var(--border-w) solid var(--color-border); background: var(--color-surface-subtle); height: 26px; transition: width 0.4s var(--ease); }
.vs-page .vc-box.aft { border-color: var(--color-success-line); background: var(--color-success-soft); }
.vs-page .vc-box canvas { display: block; width: 100%; height: 26px; }
.vs-page .vc-time { width: 86px; flex-shrink: 0; font-weight: var(--weight-display); text-align: left; color: var(--color-text-secondary); font-variant-numeric: tabular-nums; }
.vs-page .vc-time.aft { color: var(--color-success); }
.vs-page .vc-lg { display: flex; gap: var(--space-3); font-size: var(--text-caption); color: var(--color-text-muted); flex-wrap: wrap; align-items: center; justify-content: center; margin: var(--space-1) 0 0; }
.vs-page .vc-lg i { display: inline-block; width: 10px; height: 10px; border-radius: var(--radius-sm); vertical-align: -1px; margin-right: var(--space-1); }
.vs-page .vc-lg .lg-keep { background: var(--color-success); }
.vs-page .vc-lg .lg-cut { background: var(--color-danger-line); }
@media (max-width: 640px) {
  .vs-page .wl-video { max-height: clamp(180px, 42vh, 340px); }
  .vs-page .vc-row { flex-wrap: wrap; gap: var(--space-1) var(--space-2); margin-bottom: var(--space-3); }
  .vs-page .vc-tag { width: auto; order: 1; text-align: left; }
  .vs-page .vc-time { width: auto; order: 2; margin-left: auto; font-size: var(--text-body-sm); }
  .vs-page .vc-hold { order: 3; flex: 0 0 100%; }
}

/* 강도 즉시 바꿔보기 */
.vs-page .tune { display: none; margin-top: var(--space-2); background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-4); }
.vs-page .tune-h { display: flex; align-items: center; justify-content: center; gap: var(--space-2); flex-wrap: wrap; font-size: var(--text-body-sm); font-weight: var(--weight-display); color: var(--color-text); }
.vs-page .tune-row { display: flex; align-items: center; gap: var(--space-3); margin-top: var(--space-2); flex-wrap: wrap; }
.vs-page .tune-row .lab { font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text-secondary); flex: 0 0 auto; }
.vs-page .tune-rng { -webkit-appearance: none; appearance: none; flex: 1; min-width: 150px; background: transparent; height: 24px; cursor: pointer; }
.vs-page .tune-rng::-webkit-slider-runnable-track { height: 7px; border-radius: var(--radius-full); background: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand) var(--pct, 50%), var(--color-border) var(--pct, 50%), var(--color-border) 100%); }
.vs-page .tune-rng::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: var(--radius-full); background: var(--color-surface); border: 3px solid var(--color-brand); margin-top: -6.5px; box-shadow: var(--shadow-md); }
.vs-page .tune-rng::-moz-range-track { height: 7px; border-radius: var(--radius-full); background: var(--color-border); }
.vs-page .tune-rng::-moz-range-progress { height: 7px; border-radius: var(--radius-full); background: var(--color-brand); }
.vs-page .tune-rng::-moz-range-thumb { width: 15px; height: 15px; border-radius: var(--radius-full); background: var(--color-surface); border: 3px solid var(--color-brand); }
.vs-page .tune-val { flex: 0 0 auto; min-width: 64px; text-align: right; font-size: var(--text-body-lg); font-weight: var(--weight-display); color: var(--color-brand); font-variant-numeric: tabular-nums; }
.vs-page .tune-tip, .vs-page .seg-note { display: none; }
.vs-page .tune-act { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-2); align-items: center; justify-content: center; }
.vs-page .tune-note { font-size: var(--text-caption); color: var(--color-text-muted); }

/* 숫자 요약 4칸 */
.vs-page .vkpi { display: none; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-2); }
.vs-page .vkpi > div { background: var(--color-surface-subtle); border-radius: var(--radius-md); padding: var(--space-2) var(--space-1); text-align: center; }
.vs-page .vkpi b { display: block; font-size: var(--text-body-lg); font-weight: var(--weight-display); color: var(--color-text); font-variant-numeric: tabular-nums; line-height: var(--leading-caption); }
.vs-page .vkpi span { display: block; font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-1); font-weight: var(--weight-title); }
.vs-page .vkpi .k-cut b { color: var(--color-danger-text); }
.vs-page .vkpi .k-save { background: var(--color-success-soft); } .vs-page .vkpi .k-save b { color: var(--color-success); }
.vs-page .vkpi .k-pct { background: var(--color-brand-soft); } .vs-page .vkpi .k-pct b { color: var(--color-brand); }
@media (max-width: 640px) { .vs-page .vkpi { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* 설명 툴팁 */
.vs-page .tip { position: relative; display: inline-block; margin-left: var(--space-2); vertical-align: middle; }
.vs-page .tip .ic { display: inline-flex; align-items: center; gap: var(--space-1); padding: 0 var(--space-3); min-height: var(--control-h-sm); border-radius: var(--radius-full); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand); color: var(--color-brand); font-size: var(--text-caption); font-weight: var(--weight-bold); cursor: pointer; user-select: none; white-space: nowrap; }
.vs-page .tip .ic:hover { background: var(--color-brand); color: var(--color-text-inverse); }
.vs-page .tip .pop { display: none; visibility: hidden; opacity: 0; position: absolute; left: 0; top: calc(var(--control-h-sm) + var(--space-1)); z-index: var(--z-drawer); width: min(360px, 88vw); background: var(--color-text); color: var(--color-text-inverse); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); font-size: var(--text-caption); line-height: var(--leading-body); font-weight: var(--weight-regular); box-shadow: var(--shadow-md); transition: opacity var(--motion-fast) var(--ease); text-align: left; }
.vs-page .tip .pop b { color: var(--color-warning-line); }
.vs-page .tip:hover .pop, .vs-page .tip.open .pop { display: block; visibility: visible; opacity: 1; }
/* 좁은 화면: 설명 풍선이 화면 밖으로 나가지 않게 줄 전체 폭으로 */
@media (max-width: 640px) { .vs-page .sens-row { position: relative; } .vs-page .tip { position: static; } .vs-page .tip .pop { left: 0; right: 0; width: auto; top: auto; margin-top: var(--space-1); } }

/* 강도 비교 */
.vs-page .cmp-str { margin: var(--space-3) 0 0; font-size: var(--text-caption); }
.vs-page .cmp-str .cs-t { color: var(--color-text-secondary); }
.vs-page .cmp-str .cs-row { display: flex; gap: var(--space-2); margin-top: var(--space-1); }
.vs-page .cmp-str .cs-c { flex: 1; text-align: center; border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2) var(--space-1); background: var(--color-surface); }
.vs-page .cmp-str .cs-c b { display: block; font-size: var(--text-body-sm); color: var(--color-text); }
.vs-page .cmp-str .cs-c.cur { border-color: var(--color-brand); background: var(--color-brand-soft); }
.vs-page .cmp-str .cs-c span { font-size: var(--text-caption); color: var(--color-text-secondary); }
@media (max-width: 860px) { .vs-page .steps .stp { padding: var(--space-1) 2px; } }

/* === page: silence.html === */
/* 음성 무음 제거기 — 옛 page <style> 를 토큰으로 옮긴 것. JS 가 className 을 통째로 바꾸는 요소(.drop, .seg-b, .badge, .sil-err)는
   공통 클래스에 기대지 않고 여기서 직접 그린다. */
.si-page { max-width: calc(var(--container-narrow) + var(--space-20) + var(--space-16)); }
.si-page .page-header { margin-bottom: var(--space-3); }
.si-page .si-hide { display: none; }
.si-page .lead { font-size: var(--text-body-lg); color: var(--color-text-secondary); line-height: var(--leading-body); margin: 0 0 var(--space-5); }
.si-page .lead b { color: var(--color-text); }

/* 파일 넣는 곳 (JS 가 className 을 "drop" / "drop over" 로 바꾼다) */
.si-page .drop { position: relative; border: var(--border-w-strong) dashed var(--color-border-strong); border-radius: var(--radius-lg); padding: var(--space-8) var(--space-5); text-align: center; background: var(--color-surface); cursor: pointer; margin-bottom: var(--space-4); transition: border-color var(--motion-fast) var(--ease), background var(--motion-fast) var(--ease); }
.si-page .drop:hover, .si-page .drop.over { border-color: var(--color-brand); background: var(--color-brand-soft); }
.si-page .drop .ic { display: block; margin-bottom: var(--space-2); color: var(--color-brand); }
.si-page .drop .big { font-size: var(--text-h3); font-weight: var(--weight-display); color: var(--color-text); }
.si-page .drop .big em { font-style: normal; color: var(--color-brand); }
.si-page .drop .big .dim { font-weight: var(--weight-title); color: var(--color-text-muted); font-size: var(--text-body-sm); }
.si-page .drop .sub { font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-2); }
@media (max-width: 600px) { .si-page .drop .big .dim { display: block; margin-top: var(--space-1); } }
.si-page .sil-err { display: none; background: var(--color-danger-soft); border: var(--border-w) solid var(--color-danger-line); color: var(--color-danger-text); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); margin: var(--space-3) 0; font-weight: var(--weight-title); }
.si-page .sil-err.show { display: block; }

/* 설정 카드 */
.si-page .sp { margin-bottom: var(--space-4); }
.si-page .sp-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; padding-bottom: var(--space-3); border-bottom: var(--border-w) solid var(--color-border); }
.si-page .sp-title { font-size: var(--text-h3); font-weight: var(--weight-display); margin: 0; }
.si-page .seg { display: inline-flex; background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: 2px; gap: 2px; }
.si-page .seg .seg-b { height: var(--control-h-sm); padding: 0 var(--space-4); border-radius: var(--radius-sm); font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text-muted); }
.si-page .seg .seg-b:hover { background: transparent; color: var(--color-text); }
.si-page .seg .seg-b.on { background: var(--color-surface); color: var(--color-brand); box-shadow: var(--shadow-sm); }
.si-page .sp-row { display: flex; align-items: center; gap: var(--space-3); margin-top: var(--space-4); flex-wrap: wrap; }
.si-page .sp-lab { min-width: 128px; font-weight: var(--weight-bold); color: var(--color-text); }
.si-page .sp-out { min-width: 78px; text-align: right; font-size: var(--text-h3); font-weight: var(--weight-display); color: var(--color-brand); font-variant-numeric: tabular-nums; }
.si-page .sp-tip { font-size: var(--text-caption); color: var(--color-text-muted); margin: var(--space-2) 0 0 calc(128px + var(--space-3)); line-height: var(--leading-body-sm); }
.si-page .sp-tip b { color: var(--color-text-secondary); }
@media (max-width: 600px) { .si-page .sp-lab { min-width: 100%; } .si-page .sp-tip { margin-left: 0; } }
/* 게이지 바 */
.si-page .sp-rng { -webkit-appearance: none; appearance: none; flex: 1; min-width: 150px; background: transparent; height: 24px; cursor: pointer; }
.si-page .sp-rng:disabled { opacity: 0.5; cursor: not-allowed; }
.si-page .sp-rng::-webkit-slider-runnable-track { height: 7px; border-radius: var(--radius-full); background: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand) var(--pct, 50%), var(--color-border) var(--pct, 50%), var(--color-border) 100%); }
.si-page .sp-rng::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: var(--radius-full); background: var(--color-surface); border: 3px solid var(--color-brand); margin-top: -6.5px; box-shadow: var(--shadow-md); }
.si-page .sp-rng::-moz-range-track { height: 7px; border-radius: var(--radius-full); background: var(--color-border); }
.si-page .sp-rng::-moz-range-progress { height: 7px; border-radius: var(--radius-full); background: var(--color-brand); }
.si-page .sp-rng::-moz-range-thumb { width: 15px; height: 15px; border-radius: var(--radius-full); background: var(--color-surface); border: 3px solid var(--color-brand); }
.si-page .sp-note { margin-top: var(--space-4); background: var(--color-surface-subtle); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); font-size: var(--text-body-sm); color: var(--color-text-secondary); line-height: var(--leading-body); }
.si-page .sp-act { display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; margin-top: var(--space-4); padding-top: var(--space-4); border-top: var(--border-w) solid var(--color-border); }
.si-page .sp-sum { font-size: var(--text-body-sm); color: var(--color-text-secondary); }
.si-page .sp-sum b { color: var(--color-success); font-weight: var(--weight-display); font-size: var(--text-body-lg); }

/* 파일 카드 */
.si-page .frow { margin-bottom: var(--space-3); padding: var(--space-4); }
.si-page .fr-top { display: flex; justify-content: space-between; gap: var(--space-3); align-items: center; }
.si-page .fr-name { font-weight: var(--weight-display); font-size: var(--text-body-lg); word-break: break-all; display: flex; align-items: center; gap: var(--space-2); }
.si-page .badge.ready { background: var(--color-brand-soft); color: var(--color-brand); }
.si-page .badge.done { background: var(--color-success-soft); color: var(--color-success); }
.si-page .badge.err { background: var(--color-danger-soft); color: var(--color-danger-text); }
.si-page .badge.work { background: var(--color-warning-soft); color: var(--color-warning); }
/* 작업 전/후 비교 */
.si-page .cmp { display: none; margin: var(--space-4) 0 0; }
.si-page .cmp-row { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-2); }
.si-page .cmp-tag { width: 52px; flex-shrink: 0; font-size: var(--text-caption); font-weight: var(--weight-display); color: var(--color-text-muted); text-align: right; white-space: nowrap; }
.si-page .cmp-tag.aft { color: var(--color-success); }
.si-page .cmp-hold { flex: 1; min-width: 0; }
.si-page .cmp-box { width: 100%; border-radius: var(--radius-md); overflow: hidden; border: var(--border-w) solid var(--color-border); background: var(--color-surface-subtle); height: 62px; transition: width 0.4s var(--ease); cursor: pointer; }
.si-page .cmp-box.aft { border-color: var(--color-success-line); background: var(--color-success-soft); cursor: default; }
.si-page .cmp-box.aft.pred { border-style: dashed; }
.si-page .cmp-box canvas { display: block; width: 100%; height: 62px; }
.si-page .cmp-time { width: 86px; flex-shrink: 0; font-weight: var(--weight-display); text-align: left; font-variant-numeric: tabular-nums; color: var(--color-text-secondary); }
.si-page .cmp-time.aft { color: var(--color-success); }
.si-page .pred-t { font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text-muted); background: var(--color-surface-hover); padding: 0 var(--space-1); border-radius: var(--radius-sm); margin-left: var(--space-1); vertical-align: 1px; }
.si-page .cmp-lg { display: flex; gap: var(--space-3); font-size: var(--text-caption); color: var(--color-text-muted); flex-wrap: wrap; align-items: center; margin: var(--space-1) 0 0 calc(52px + var(--space-3)); }
.si-page .cmp-lg i { display: inline-block; width: 10px; height: 10px; border-radius: var(--radius-sm); vertical-align: -1px; margin-right: var(--space-1); }
.si-page .cmp-lg .lg-voice { background: var(--color-brand); }
.si-page .cmp-lg .lg-cut { background: var(--color-danger); opacity: 0.55; }
.si-page .cmp-lg .lg-quiet { background: var(--color-danger-line); }
@media (max-width: 600px) {
  .si-page .cmp-row { flex-wrap: wrap; gap: var(--space-1) var(--space-2); margin-bottom: var(--space-3); }
  .si-page .cmp-tag { width: auto; order: 1; text-align: left; }
  .si-page .cmp-time { width: auto; order: 2; margin-left: auto; font-size: var(--text-body-sm); }
  .si-page .cmp-hold { order: 3; flex: 0 0 100%; }
  .si-page .cmp-lg { margin-left: 0; }
}
/* 숫자 요약 */
.si-page .kpi { display: none; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-3); }
.si-page .kpi > div { background: var(--color-surface-subtle); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-2); text-align: center; }
.si-page .kpi b { display: block; font-size: var(--text-h2); font-weight: var(--weight-display); color: var(--color-text); font-variant-numeric: tabular-nums; line-height: var(--leading-caption); }
.si-page .kpi span { display: block; font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-1); font-weight: var(--weight-title); }
.si-page .kpi .k-cut b { color: var(--color-danger-text); }
.si-page .kpi .k-save { background: var(--color-success-soft); } .si-page .kpi .k-save b { color: var(--color-success); }
.si-page .kpi .k-pct { background: var(--color-brand-soft); } .si-page .kpi .k-pct b { color: var(--color-brand); }
@media (max-width: 600px) { .si-page .kpi { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.si-page .fr-bar { display: none; height: var(--space-2); background: var(--color-surface-hover); border-radius: var(--radius-full); overflow: hidden; margin: var(--space-3) 0 var(--space-1); }
.si-page .fr-fill { height: 100%; width: 0; background: var(--color-brand); transition: width var(--motion-base) var(--ease); }
.si-page .fr-stat { font-size: var(--text-body-sm); color: var(--color-text-secondary); line-height: var(--leading-body); margin-top: var(--space-3); }
.si-page .fr-err { color: var(--color-danger-text); }
.si-page .fr-act { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; margin-top: var(--space-3); }
.si-page .fr-play, .si-page .fr-run, .si-page .fr-dl { display: none; }
/* JS 가 받기 링크를 inline-block 으로 켜므로 글자를 세로 가운데에 */
.si-page .fr-dl { line-height: calc(var(--control-h-md) - 2 * var(--border-w)); }
.si-page .fr-stale { display: none; font-size: var(--text-caption); color: var(--color-warning); background: var(--color-warning-soft); border: var(--border-w) solid var(--color-warning-line); border-radius: var(--radius-md); padding: var(--space-1) var(--space-3); font-weight: var(--weight-title); }

/* 전체 결과 */
.si-page .total { display: none; margin-top: var(--space-4); padding: var(--space-4) var(--space-5); background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-lg); }
.si-page .total-h { font-size: var(--text-body-sm); font-weight: var(--weight-display); color: var(--color-text-secondary); margin-bottom: var(--space-3); }
.si-page .total-n { display: flex; align-items: baseline; gap: var(--space-3); flex-wrap: wrap; margin-bottom: var(--space-3); }
.si-page .total-n .a { font-size: var(--text-h2); font-weight: var(--weight-display); color: var(--color-text-muted); text-decoration: line-through; }
.si-page .total-n .arr { font-size: var(--text-body-lg); color: var(--color-text-muted); }
.si-page .total-n .b { font-size: var(--text-display); font-weight: var(--weight-display); color: var(--color-success); }
.si-page .total-n .p { font-size: var(--text-body-sm); font-weight: var(--weight-display); color: var(--color-text-inverse); background: var(--color-success); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); }
.si-page .total-act { display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap; }
.si-page .total-sub { font-size: var(--text-body-sm); color: var(--color-text-secondary); }

/* === page: tools-addon.js === */
/* assets/js/tools-addon.js 가 analyze.html·lab.html 에 끼워 넣는 상자들(후킹 분석 · 원본 찾기 · 새 유형 후보).
   예전에는 JS 가 <style> 을 주입했다 — 2026-09-07 이관으로 전부 여기로 옮기고 토큰만 쓴다. 클래스 이름은 JS 가 쓰므로 그대로. */
.ib-hide { display: none; }
.ib-dim { color: var(--color-text-muted); }
.ib-span2 { grid-column: 1 / -1; }

/* 후킹 분석 상자 */
.hk-box { margin-top: var(--space-4); background: var(--color-surface); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-lg); padding: var(--space-5); box-shadow: var(--shadow-sm); }
.hk-box h3 { font-size: var(--text-h3); font-weight: var(--weight-h3); margin: 0 0 var(--space-1); }
.hk-box .ib-hk-toggle { float: right; }
.hk-box .hk-desc { font-size: var(--text-body-sm); color: var(--color-text-secondary); margin-bottom: var(--space-3); line-height: var(--leading-body-sm); }
.hk-box.ib-folded > *:not(h3) { display: none; }
.hk-res { display: none; margin-top: var(--space-3); }
.hk-res.show { display: block; }
.hk-sec { border-top: var(--border-w) solid var(--color-border); padding: var(--space-3) 0; }
.hk-sec.hk-sec-first { border-top: none; }
.hk-sec .hs-t { font-size: var(--text-body-sm); font-weight: var(--weight-display); color: var(--color-brand-active); margin-bottom: var(--space-2); }
.hk-sec .hs-sub { font-weight: var(--weight-title); color: var(--color-text-muted); font-size: var(--text-caption); }
.hk-facts { background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); line-height: var(--leading-body); }
.hk-facts .fl { display: flex; gap: var(--space-2); }
.hk-facts .fl .fk { flex-shrink: 0; font-weight: var(--weight-display); color: var(--color-brand-active); font-size: var(--text-caption); padding-top: 2px; width: 58px; }
.hk-strat-box { background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-3); font-weight: var(--weight-bold); color: var(--color-text); line-height: var(--leading-body); }
.hk-strat-main { display: inline-block; background: var(--color-brand); color: var(--color-text-inverse); font-weight: var(--weight-display); padding: var(--space-1) var(--space-4); border-radius: var(--radius-full); margin-right: var(--space-2); }
.hk-strat-new { background: var(--color-brand-active); }
.hk-strat-sub { display: inline-block; background: var(--color-brand-soft); color: var(--color-brand-active); border: var(--border-w) solid var(--color-brand-line); font-size: var(--text-caption); font-weight: var(--weight-bold); padding: var(--space-1) var(--space-3); border-radius: var(--radius-full); margin-right: var(--space-2); }
.hk-conf { display: inline-block; font-size: var(--text-caption); font-weight: var(--weight-display); padding: 0 var(--space-2); border-radius: var(--radius-full); vertical-align: middle; }
.hc-높음 { background: var(--color-success-soft); color: var(--color-success); }
.hc-중간 { background: var(--color-warning-soft); color: var(--color-warning); }
.hc-낮음 { background: var(--color-danger-soft); color: var(--color-danger-text); }
.hk-lowwarn { margin-top: var(--space-2); background: var(--color-warning-soft); border: var(--border-w) solid var(--color-warning-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); font-size: var(--text-caption); color: var(--color-warning); line-height: var(--leading-body-sm); }
.hk-txt { line-height: var(--leading-body); color: var(--color-text); }
.hk-var { background: var(--color-surface-hover); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); margin-bottom: var(--space-2); }
.hk-var .hv-k { display: inline-block; background: var(--color-brand); color: var(--color-text-inverse); font-size: var(--text-body-sm); font-weight: var(--weight-display); padding: var(--space-1) var(--space-4); border-radius: var(--radius-full); margin-bottom: var(--space-2); }
.hk-var .hv-cap { background: var(--color-text); border-radius: var(--radius-md); padding: var(--space-3) var(--space-2); text-align: center; line-height: var(--leading-caption); }
.hk-var .hv-cap span { display: block; font-size: var(--text-h3); font-weight: var(--weight-display); color: var(--color-text-inverse); }
.hk-var .hv-cap span.y { color: var(--color-warning-line); }
.hk-var .hv-cnt { font-size: var(--text-caption); color: var(--color-text-muted); font-weight: var(--weight-title); margin: var(--space-1) 0 var(--space-2); text-align: center; }
.hk-var .hv-nar { font-size: var(--text-body-sm); font-weight: var(--weight-title); line-height: var(--leading-body-sm); color: var(--color-text); margin-top: 2px; }
.hk-var .hv-l { font-weight: var(--weight-bold); line-height: var(--leading-body-sm); }
.hk-var .hv-s { font-size: var(--text-caption); color: var(--color-text-secondary); margin-top: var(--space-1); }
.hk-var .hv-plan { margin-top: var(--space-2); }
.hk-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
.hk-chip.done { opacity: 0.65; cursor: default; }
.hk-more-note { font-size: var(--text-caption); color: var(--color-brand-active); font-weight: var(--weight-bold); padding: var(--space-2) 0; }
.hk-note { font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-2); line-height: var(--leading-body-sm); }
.hk-dl { display: flex; gap: var(--space-2); margin-top: var(--space-3); flex-wrap: wrap; }
.hk-model { margin-top: var(--space-2); font-size: var(--text-caption); color: var(--color-text-muted); font-weight: var(--weight-title); }

/* 원본 후보 카드 배지 · 긴 원본 접기 */
.ib-badges { margin-top: var(--space-2); display: flex; flex-wrap: wrap; gap: var(--space-1); }
.ib-b { font-size: var(--text-caption); padding: 0 var(--space-2); border-radius: var(--radius-full); background: var(--color-surface-hover); color: var(--color-text-secondary); white-space: nowrap; line-height: 20px; }
.ib-short { background: var(--color-warning-soft); color: var(--color-warning); }
.ib-long { background: var(--color-brand-soft); color: var(--color-brand); }
.ib-embed { background: var(--color-success-soft); color: var(--color-success); }
.ib-match { background: var(--color-brand-soft); color: var(--color-brand-active); }
.ib-sum { font-size: var(--text-body-sm); color: var(--color-text-secondary); margin: 2px 0 var(--space-2); cursor: pointer; }
.ib-long-tg { margin: var(--space-2) 0 2px; }
.ib-toast { position: fixed; left: 50%; bottom: 30px; transform: translateX(-50%); background: var(--color-text); color: var(--color-text-inverse); padding: var(--space-3) var(--space-4); border-radius: var(--radius-md); font-size: var(--text-body-sm); z-index: var(--z-toast); opacity: 0; transition: opacity var(--motion-base) var(--ease); max-width: 90%; text-align: center; box-shadow: var(--shadow-md); }
.ib-toast.is-on { opacity: 1; }
/* 재생 팝업 */
.ib-pm { position: fixed; inset: 0; background: var(--color-overlay); z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; padding: var(--space-4); }
.ib-pm-box { background: var(--color-text); border-radius: var(--radius-lg); overflow: hidden; width: min(860px, 94vw); }
.ib-pm-box.is-short { width: min(380px, 90vw); }
.ib-pm-frame { position: relative; padding-top: 56.25%; }
.ib-pm-box.is-short .ib-pm-frame { padding-top: 177.78%; }
.ib-pm-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.ib-pm-bar { display: flex; gap: var(--space-2); justify-content: space-between; align-items: center; padding: var(--space-2) var(--space-3); background: var(--color-text); }
.ib-pm-bar a { color: var(--color-text-inverse); font-size: var(--text-body-sm); text-decoration: none; }

/* 원본 찾기: 해외 플랫폼 · CC · 렌즈 */
.ib-cachenote { background: var(--color-brand-soft); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); font-size: var(--text-body-sm); color: var(--color-brand-active); margin-bottom: var(--space-3); display: none; align-items: center; gap: var(--space-3); flex-wrap: wrap; line-height: var(--leading-body-sm); }
.ib-lang-bar { margin: var(--space-1) 0 var(--space-2); font-size: var(--text-caption); color: var(--color-warning); display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ib-lang-lab { font-weight: var(--weight-bold); }
.ib-lang-chip { height: 24px; padding: 0 var(--space-2); font-size: var(--text-caption); }
.intl-box, .cc-box, .lens-box { margin-top: var(--space-3); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); border: var(--border-w) solid var(--color-border); background: var(--color-surface-subtle); }
.intl-box { background: var(--color-warning-soft); border-color: var(--color-warning-line); }
.cc-box { background: var(--color-success-soft); border-color: var(--color-success-line); }
.lens-box { background: var(--color-brand-soft); border-color: var(--color-brand-line); }
.intl-box .ib-t, .cc-box .ib-t, .lens-box .ib-t { font-size: var(--text-body-sm); font-weight: var(--weight-display); margin-bottom: var(--space-2); }
.intl-box .ib-t { color: var(--color-warning); }
.cc-box .ib-t { color: var(--color-success); }
.lens-box .ib-t { color: var(--color-brand-active); }
.ib-t .ib-t-sub { font-weight: var(--weight-title); color: var(--color-text-muted); }
.intl-row, .cc-row { margin-bottom: var(--space-2); font-size: var(--text-body-sm); }
.intl-row .iq, .cc-row .iq { font-weight: var(--weight-bold); color: var(--color-text); margin-right: var(--space-2); }
.intl-row .ib-rep { margin-right: var(--space-2); }
.intl-row .ib-qtype, .intl-row .ib-qko { margin-left: var(--space-2); }
.intl-row a { display: inline-block; background: var(--color-surface); border: var(--border-w) solid var(--color-warning-line); border-radius: var(--radius-full); padding: 2px var(--space-3); font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-warning); text-decoration: none; margin: 2px var(--space-1) 2px 0; }
.intl-row a:hover { border-color: var(--color-warning); }
.intl-warn { font-size: var(--text-caption); color: var(--color-warning); line-height: var(--leading-body-sm); margin-top: var(--space-2); }
.cc-row > a, .cc-row > .chip { display: inline-flex; background: var(--color-surface); border: var(--border-w) solid var(--color-success-line); border-radius: var(--radius-full); padding: 0 var(--space-3); height: var(--control-h-sm); align-items: center; font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-success); text-decoration: none; margin: 2px var(--space-1) 2px 0; }
.cc-row > a:hover, .cc-row > .chip:hover { border-color: var(--color-success); }
.cc-results { margin-top: var(--space-1); }
.cc-msg { font-size: var(--text-caption); color: var(--color-success); padding: var(--space-1) 0; }
.cc-msg-err { color: var(--color-danger-text); }
.cc-card { display: flex; gap: var(--space-3); align-items: center; padding: var(--space-2) 0; border-top: var(--border-w) solid var(--color-success-line); text-decoration: none; }
.cc-card img { width: 86px; height: 48px; object-fit: cover; border-radius: var(--radius-sm); background: var(--color-text); flex-shrink: 0; }
.cc-card .cc-t { font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text); line-height: var(--leading-body-sm); }
.cc-card .cc-m { font-size: var(--text-caption); color: var(--color-text-muted); }
.cc-note { font-size: var(--text-caption); color: var(--color-success); line-height: var(--leading-body-sm); margin-top: var(--space-2); }
.lens-box .lens-btn { margin: 2px var(--space-1) 2px 0; }
.lens-tip { font-size: var(--text-caption); color: var(--color-text-secondary); line-height: var(--leading-body-sm); margin-top: var(--space-2); }
#lens-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.lens-labels { font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-brand-active); }
.lens-h { font-size: var(--text-caption); font-weight: var(--weight-display); color: var(--color-text-muted); margin-top: var(--space-1); }
.prev-grid .lens-page { display: flex; gap: var(--space-2); align-items: center; background: var(--color-surface); border: var(--border-w) solid var(--color-brand-line); border-radius: var(--radius-md); padding: var(--space-2); text-decoration: none; }
.prev-grid .lens-page img { width: 64px; height: 40px; aspect-ratio: auto; object-fit: cover; border-radius: var(--radius-sm); background: var(--color-text); flex-shrink: 0; }
.lens-page-t { font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text); line-height: var(--leading-body-sm); overflow: hidden; }
.lens-page-h { color: var(--color-text-muted); font-weight: var(--weight-title); }

/* lab.html 새 유형 후보 */
.ib-lab-card { margin-top: var(--space-4); }
.ib-lab-row { padding: var(--space-2) 0; border-top: var(--border-w) solid var(--color-border); font-size: var(--text-body-sm); line-height: var(--leading-body); }
.ib-lab-empty { padding: var(--space-3) 0; color: var(--color-text-muted); font-size: var(--text-body-sm); }

/* 인비남 AI 이미지 검색 (장면 사진 → 바이두·구글) */
.ib-total-box { margin-top: var(--space-3); border: var(--border-w) solid var(--color-brand-line); background: var(--color-surface-subtle); border-radius: var(--radius-lg); padding: var(--space-3); }
.ib-total-t { font-weight: var(--weight-display); color: var(--color-brand-active); margin-bottom: 2px; text-align: center; }
.ib-total-sub, .ib-total-info { font-size: var(--text-caption); color: var(--color-text-muted); text-align: center; }
.ib-total-sub { margin-bottom: var(--space-2); }
.ib-total-info { margin-top: var(--space-1); text-align: left; }
.ib-total-btn { display: block; width: 100%; margin-top: var(--space-3); padding: var(--space-2) 0; text-align: center; font-size: var(--text-h3); font-weight: var(--weight-display); color: var(--color-brand-active); cursor: pointer; }
.ib-total-out { margin-top: var(--space-3); }
.ib-frames { display: flex; gap: var(--space-3); justify-content: center; flex-wrap: wrap; padding: var(--space-2) 0; }
.ib-frame { flex: none; width: 96px; text-align: center; position: relative; }
.ib-frame-im { width: 96px; height: 170px; object-fit: cover; border-radius: var(--radius-lg); background: var(--color-surface-hover); border: 3px solid transparent; cursor: pointer; box-shadow: var(--shadow-sm); transition: transform var(--motion-fast) var(--ease), box-shadow var(--motion-fast) var(--ease); }
.ib-frame-im:hover { transform: translateY(-2px) scale(1.04); box-shadow: var(--shadow-md); }
.ib-frame-im.on { border-color: var(--color-brand); }
.ib-frame-lb { position: absolute; top: var(--space-2); left: var(--space-2); background: var(--color-overlay); color: var(--color-text-inverse); font-size: var(--text-caption); font-weight: var(--weight-bold); padding: 0 var(--space-2); border-radius: var(--radius-full); pointer-events: none; }
.ib-frame-btns { display: flex; gap: var(--space-1); margin-top: var(--space-2); }
.ib-frame-btns .btn { flex: 1; padding: 0; }
.ib-guide-tg { margin-top: var(--space-3); text-align: center; font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text-muted); cursor: pointer; }
.ib-guide-body { margin: var(--space-2) auto 0; max-width: 520px; background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); font-size: var(--text-body-sm); color: var(--color-text); line-height: 1.8; text-align: left; }
.ib-note { padding: var(--space-2) 0; font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-1); }
.ib-note-warn { color: var(--color-warning); }
.ib-note-err { color: var(--color-danger-text); }
.ib-note-ok { color: var(--color-success); }
.ib-empty { padding: var(--space-3); color: var(--color-text-muted); font-size: var(--text-body-sm); background: var(--color-surface-subtle); border-radius: var(--radius-md); }
.ib-prog { padding: var(--space-3) var(--space-2) var(--space-2); }
.ib-prog .progress-bar { transition: width 0.4s var(--ease); }
.ib-prog-t { font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-2); text-align: center; }
.ib-grid { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-bottom: var(--space-2); }
.ib-grid-sm { gap: var(--space-2); }
.ib-grid-listing { opacity: 0.85; }
.ib-grid-h { font-size: var(--text-body-sm); font-weight: var(--weight-display); color: var(--color-text-muted); margin: var(--space-3) 0 var(--space-2); }
.ib-grid-h-west { color: var(--color-brand); }
.ib-grid-h-east { color: var(--color-warning); }
.ib-card { display: block; width: 82px; text-decoration: none; color: inherit; flex: none; }
.ib-card.is-big { width: 110px; }
.ib-card-th { width: 82px; height: 146px; border-radius: var(--radius-md); background: var(--color-surface-hover); overflow: hidden; border: var(--border-w) solid var(--color-border); }
.ib-card.is-big .ib-card-th { width: 110px; height: 195px; }
.ib-card-th img { width: 100%; height: 100%; object-fit: cover; display: block; }
.ib-card-plat { font-size: var(--text-caption); font-weight: var(--weight-title); color: var(--color-brand-active); margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ib-card-scene { font-size: var(--text-caption); color: var(--color-text-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ib-card-fb { width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-1); background: var(--color-brand-soft); color: var(--color-brand-active); font-weight: var(--weight-display); font-size: var(--text-caption); text-align: center; }
.ib-card-fb-sub { font-weight: var(--weight-title); color: var(--color-brand); }

/* === page: script-check.html · video-check.html (올리기 전 검수) ===
   두 화면이 같은 부품을 쓴다 — 신호등 칸(.ck-grid) · 짚어낸 곳(.ck-item) · 고친 대본 상자(.ck-final).
   상태 상자는 analyze.html 과 같은 방식: JS 가 className 을 "ck-load" / "ck-load show" 로 바꾼다. */
.ck-load, .ck-err, .ck-res { display: none; }
.ck-load.show, .ck-err.show, .ck-res.show { display: block; }
.ck-err.show { color: var(--color-danger-text); }
.ck-res { scroll-margin-top: calc(var(--ticker-h) + var(--space-16)); }

/* 판정 색: 초록(문제 없음) · 노랑(주의) · 빨강(수정 권장). 글자가 판정을 말하므로 색은 보조 */
.ck-lv { --ck-fg: var(--color-text-secondary); --ck-bg: var(--color-surface-subtle); --ck-line: var(--color-border); }
.ck-lv.is-ok { --ck-fg: var(--color-success); --ck-bg: var(--color-success-soft); --ck-line: var(--color-success-line); }
.ck-lv.is-warn { --ck-fg: var(--color-warning); --ck-bg: var(--color-warning-soft); --ck-line: var(--color-warning-line); }
.ck-lv.is-fix { --ck-fg: var(--color-danger-text); --ck-bg: var(--color-danger-soft); --ck-line: var(--color-danger-line); }

/* ③ 결과 머리의 총평 배지 — 판정 색을 그대로 쓴다 */
.ck-overall { display: inline-flex; align-items: center; gap: var(--space-1); height: 26px; padding: 0 var(--space-3); border-radius: var(--radius-full);
  background: var(--ck-bg); color: var(--ck-fg); border: var(--border-w) solid var(--ck-line); font-size: var(--text-caption); font-weight: var(--weight-bold); white-space: nowrap; }

/* 한눈에 신호등 */
.ck-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-2); }
.ck-cell { background: var(--ck-bg); border: var(--border-w) solid var(--ck-line); border-radius: var(--radius-md); padding: var(--space-3); }
.ck-cell .k { font-size: var(--text-caption); font-weight: var(--weight-bold); color: var(--color-text-secondary); }
.ck-cell .v { font-size: var(--text-body-sm); font-weight: var(--weight-h3); color: var(--ck-fg); margin-top: 2px; }
.ck-cell .w { font-size: var(--text-caption); color: var(--color-text-muted); line-height: var(--leading-caption); margin-top: var(--space-1); }

/* 짚어낸 곳 한 건 */
.ck-item { border: var(--border-w) solid var(--ck-line); border-left: 3px solid var(--ck-fg); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); margin-bottom: var(--space-2); background: var(--color-surface); }
.ck-item .hd { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.ck-item .tag { display: inline-flex; align-items: center; height: 22px; padding: 0 var(--space-2); border-radius: var(--radius-full); background: var(--ck-bg); color: var(--ck-fg); font-size: var(--text-caption); font-weight: var(--weight-bold); white-space: nowrap; }
.ck-item .at { font-variant-numeric: tabular-nums; font-size: var(--text-body-sm); font-weight: var(--weight-h3); color: var(--color-text); }
.ck-item .q { color: var(--color-text); font-weight: var(--weight-medium); line-height: var(--leading-body); }
.ck-item .why { font-size: var(--text-body-sm); color: var(--color-text-secondary); margin-top: var(--space-1); }
.ck-item .fix { font-size: var(--text-body-sm); color: var(--color-text); background: var(--color-surface-subtle); border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); margin-top: var(--space-2); }
.ck-item .fix b { color: var(--color-brand); }

/* 고친 대본 — 그대로 복사해 녹음할 수 있는 상태 */
.ck-final { white-space: pre-wrap; line-height: var(--leading-body); background: var(--color-surface-subtle); border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-4); max-height: 420px; overflow: auto; }

@media (max-width: 899px) {
  .ck-grid { grid-template-columns: 1fr 1fr; }
}

/* 가운데 정렬 (2026-09-16 대표 지시): 두 검수 화면은 화면 안 요소를 모두 가운데로 맞춘다.
   예외는 '고친 대본'·'들린 말'·입력칸처럼 길게 읽고 쓰는 글 — 가운데로 두면 읽기가 어렵다. */
.ck-center, .ck-center .card, .ck-center .page-header, .ck-center .page-desc,
.ck-center .tp-field, .ck-center .tp-field > label, .ck-center .tp-field .hint,
.ck-center .card-title, .ck-center .ck-cell, .ck-center .ck-item,
.ck-center .table th, .ck-center .table td, .ck-center .alert { text-align: center; }
.ck-center .page-header, .ck-center .tool-steps, .ck-center .tp-optrow, .ck-center .tp-actions,
.ck-center .row, .ck-center .row-between, .ck-center .tp-result-head,
.ck-center .btn-group, .ck-center .btns, .ck-center .alert, .ck-center .ck-item .hd { justify-content: center; }
.ck-center .tool-back { display: flex; justify-content: center; }
.ck-center .tp-result-head .sp { flex: 0 0 auto; }
.ck-center .tp-result-head > div { flex: 0 1 auto; }
.ck-center .alert > span { flex: 0 1 auto; }
/* 읽고 쓰는 긴 글만 왼쪽 정렬 */
.ck-center .ck-final, .ck-center .textarea { text-align: left; }

/* 작업 중(.ck-busy): 넣는 칸 전체를 잠가서 같은 작업을 두 번 돌리지 못하게 한다.
   두 번 돌면 하루 한도만 깎이고 결과는 하나뿐이라 손님만 손해다. */
body.ck-busy .tp-panel .file-drop,
body.ck-busy .tp-panel .tp-optrow,
body.ck-busy .tp-panel .tp-actions,
body.ck-busy .tp-panel .btns,
body.ck-busy .tp-panel .textarea { pointer-events: none; opacity: 0.5; }
/* ★ 진행 상자의 [취소하기] 까지 잠겨 버려 누를 수가 없었다 (2026-09-22).
   잠그는 것은 '넣는 칸' 이지 '멈추는 단추' 가 아니다. */
body.ck-busy .tp-panel.tp-progress .btns { pointer-events: auto; opacity: 1; }
/* 경과 시간 줄은 절대 흐려지지 않는다 — 이게 보이는 유일한 "살아 있다"는 신호다 */
body.ck-busy .tp-progress .pct { opacity: 1; color: var(--color-brand); }

/* === 의견·오류 신고함 (app.js 의 Feedback 위젯 · feedback-admin.html) === */
/* 오른쪽 아래 단추 — 모바일에서는 하단 탭바 위로 올린다 */
.fb-fab { position: fixed; right: var(--space-4); bottom: var(--space-4); z-index: var(--z-header);
  box-shadow: var(--shadow-md); border-radius: var(--radius-full); padding: 0 var(--space-4); }
@media (max-width: 899px) {
  .fb-fab { bottom: calc(var(--m-tabbar-h) + var(--space-3)); right: var(--space-3); }
}
/* 의견 창 안 */
.fb-kinds { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.fb-mine { border-top: var(--border-w) dashed var(--color-border); padding-top: var(--space-3); }
.fb-mine-t { font-size: var(--text-label); font-weight: var(--weight-bold); color: var(--color-text-secondary); margin-bottom: var(--space-2); }
.fb-item { border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-3); margin-bottom: var(--space-2); }
.fb-item .fb-msg { font-size: var(--text-body-sm); color: var(--color-text); margin-top: var(--space-2); white-space: pre-wrap; }
.fb-item .fb-reply { font-size: var(--text-body-sm); background: var(--color-brand-soft); border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); margin-top: var(--space-2); }
.fb-item .fb-reply b { color: var(--color-brand); }
/* 의견함 화면 */
.fa-item .fa-msg { white-space: pre-wrap; line-height: var(--leading-body); }
.fa-item .fa-ua { margin-top: var(--space-2); }
.fa-item .fa-ua summary { cursor: pointer; }
/* 도구 화면 안 의견 칸 — 도구 결과 아래에 조용히 붙는다 */
.fb-tool { border-top: 3px solid var(--color-border); }
.fb-tool .card-title { margin-bottom: var(--space-1); }
/* 도구 화면의 의견 칸은 전부 가운데 정렬 (대표 지시 2026-09-17): 제목·설명·종류 칩·보내기·내 의견 목록 */
.fb-tool, .fb-tool .card-title, .fb-tool .text-secondary, .fb-tool .fb-mine, .fb-tool .fb-mine-t { text-align: center; }
.fb-tool .fb-kinds, .fb-tool .tp-actions { justify-content: center; }
.fb-tool .textarea { text-align: center; }

/* === page: usage-admin.html (비용·사용량 장부, 관리자 전용) — 2026-09-16 ===
   기간 칩·탭·통계 칸·하루 원가 막대 그래프·표 안 작은 입력칸. 색은 전부 토큰, 막대는 브랜드 단색(고정비는 회색). */
.ua-page .ua-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin-bottom: var(--space-4); }
.ua-page .ua-filters .field { margin: 0; }
.ua-page .ua-filters .field input[type="date"] { min-height: var(--control-h-sm); font-size: var(--text-body-sm); width: auto; }
.ua-page .ua-toggle { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-body-sm); color: var(--color-text-secondary); margin-left: auto; }
.ua-page .ua-toggle input { width: auto; min-height: 0; }
.ua-page .stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (min-width: 720px) { .ua-page .stat-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1100px) { .ua-page .stat-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); } }
.ua-page .ua-chart { position: relative; margin-top: var(--space-3); }
.ua-page .ua-chart svg { width: 100%; height: auto; display: block; }
.ua-page .ua-chart .bar { fill: var(--color-brand); }
.ua-page .ua-chart .bar.on { fill: var(--color-brand-line); }
.ua-page .ua-chart .bar-fixed { fill: var(--color-border-strong); }
.ua-page .ua-chart .grid { stroke: var(--color-border); stroke-width: 1; }
.ua-page .ua-chart .axis { fill: var(--color-text-muted); font-size: var(--text-caption); }
.ua-page .ua-chart .hit { fill: transparent; cursor: pointer; }
.ua-page .ua-tip { position: absolute; pointer-events: none; background: var(--color-ink); color: var(--color-surface); padding: var(--space-1) var(--space-2); border-radius: var(--radius-md); font-size: var(--text-caption); white-space: nowrap; transform: translate(-50%, calc(-100% - 8px)); z-index: 2; }
.ua-page .ua-legend { display: flex; gap: var(--space-3); font-size: var(--text-caption); color: var(--color-text-muted); margin-top: var(--space-2); }
.ua-page .ua-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 3px; background: var(--color-brand); margin-right: 4px; vertical-align: -1px; }
.ua-page .ua-legend i.fixed { background: var(--color-border-strong); }
.ua-page .ua-bar { display: flex; align-items: center; gap: var(--space-2); min-width: 160px; }
.ua-page .ua-bar i { display: block; height: 10px; border-radius: 4px; background: var(--color-brand); min-width: 2px; flex: 0 0 auto; }
.ua-page .ua-bar span { font-variant-numeric: tabular-nums; }
.ua-page .table .ua-mini input, .ua-page .table .ua-mini select { min-height: var(--control-h-sm); font-size: var(--text-body-sm); width: 7.5em; padding: 0 var(--space-2); }
.ua-page .table .ua-mini select { width: auto; padding-right: var(--space-6); }
.ua-page .table .ua-mini input[type="date"] { width: 10em; }
.ua-page .ua-row-click { cursor: pointer; }
.ua-page .ua-est { color: var(--color-warning); }
.ua-page .ua-form { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-2); align-items: end; margin-top: var(--space-3); }
.ua-page .ua-form .field { margin: 0; }
.ua-page .ua-note { font-size: var(--text-body-sm); color: var(--color-text-secondary); margin-top: var(--space-2); }
.ua-page .ua-sub { font-size: var(--text-caption); color: var(--color-text-muted); }
.ua-page .ua-detail .table-wrap { margin-top: var(--space-3); }
/* usage-admin: 공급사 이름에 마우스를 올리면 설명(title). 점선 밑줄 + 작은 ? 동그라미로 '설명 있음'을 알린다. 휴대폰용 펼침 목록(details) */
.ua-page .ua-help { text-decoration: underline dotted; text-underline-offset: 3px; cursor: help; }
.ua-page .ua-q { display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; margin-left: 4px; border-radius: var(--radius-full); border: var(--border-w) solid var(--color-border-strong); color: var(--color-text-muted); font-size: var(--text-caption); font-style: normal; line-height: 1; vertical-align: 1px; }
.ua-page .ua-desc { margin-top: var(--space-3); font-size: var(--text-body-sm); }
.ua-page .ua-desc summary { cursor: pointer; color: var(--color-text-secondary); font-weight: var(--weight-medium); }
.ua-page .ua-desc dl { display: grid; grid-template-columns: max-content 1fr; gap: var(--space-2) var(--space-4); margin: var(--space-3) 0 0; }
.ua-page .ua-desc dt { font-weight: var(--weight-bold); }
.ua-page .ua-desc dd { margin: 0; color: var(--color-text-secondary); max-width: 70ch; }
@media (max-width: 640px) { .ua-page .ua-desc dl { grid-template-columns: 1fr; } .ua-page .ua-desc dd { margin-bottom: var(--space-2); } }

/* 감동 대본 (gamdong.html, 2026-09-19) — 제목 두 줄 크게, 대본은 한 줄=자막 한 장 */
.gd-title { font-size: var(--text-h3); font-weight: var(--weight-h3); line-height: var(--leading-h3); }
.gd-lines { margin: 0; padding-left: 1.4rem; }
.gd-lines li { margin-bottom: 0.35rem; line-height: 1.6; }
.gd-ending li { color: var(--color-brand); font-weight: 700; }

/* 자동 편집 결과 영상 (autoedit.html, 2026-09-19) — 9:16 미리보기 */
.ae-video { width: 100%; max-width: 340px; aspect-ratio: 9 / 16; border-radius: var(--radius-md); display: block; margin: 0 auto; }

/* 중드 대본 제목 10개 (cnscript.html, 2026-09-19) */
.cn-titles { display: flex; flex-wrap: wrap; gap: var(--space-2); }

/* 쇼츠 편집실 (touch.html, 2026-09-20) */
.tc-row { display: flex; align-items: center; gap: var(--space-2); }
.tc-row .input-sm { max-width: 120px; }
.tc-range { width: 100%; }

/* 파일 끌어다 놓기(드래그&드롭) 하이라이트 (2026-09-20) */
.drop-over { outline: 2px dashed var(--color-brand); outline-offset: 4px; background: var(--color-brand-soft); }

/* 중드 대본 '다시 만들기' 프리셋 칩 (cnscript.html, 2026-09-20) */
.cn-redo { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-2) 0; }

/* 백업(되돌리기) 화면 — 2026-09-21. 날짜를 접었다 폈다 하고, 한 줄에 시각·설명·되돌리기 버튼 */
.bk-day .bk-head { width: 100%; justify-content: flex-start; gap: var(--space-2); }
.bk-items { margin-top: var(--space-2); }
.bk-row { padding: var(--space-2) 0; border-top: 1px solid var(--color-border); }
.bk-row:first-child { border-top: 0; }
.bk-time { min-width: 3.4rem; color: var(--color-text-secondary); }
.bk-msg { flex: 1 1 14rem; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bk-logrow { padding: var(--space-1) 0; border-top: 1px solid var(--color-border); }
.bk-logrow:first-child { border-top: 0; }

/* ═══════════════════════════════════════════════════════════════
   중드 소재 찾기 (cdrama.html) — 2026-09-21
   회사 PC 안에서만 돌던 화면을 인비랩 안으로 옮긴 것.
   색은 토큰만 쓴다. 글씨·단추는 사이트 기본 크기를 넘지 않는다.
   ═══════════════════════════════════════════════════════════════ */

/* ── 검색줄 ── */
.cd-search { display: flex; gap: var(--space-2); align-items: center; margin-bottom: var(--space-3); }
.cd-search .input { flex: 1; min-width: 0; }

/* ── 추천 검색어 ── */
.cd-kw { display: flex; flex-wrap: wrap; gap: var(--space-1); margin-bottom: var(--space-3); align-items: center; }
.cd-kw .chip { cursor: pointer; }
.cd-kw .chip .n { color: var(--color-text-muted); margin-left: var(--space-1); font-size: var(--text-2xs); }

/* ── 필터줄 ── */
.cd-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin-bottom: var(--space-4); }
.cd-ms { position: relative; }
.cd-ms > .btn { min-width: 104px; justify-content: space-between; }
.cd-ms-pop {
  position: absolute; z-index: 40; top: calc(100% + 4px); left: 0; min-width: 220px; max-height: 320px;
  overflow: auto; background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-md); box-shadow: var(--shadow-md); padding: var(--space-1);
}
.cd-ms-pop .cd-ms-item {
  display: flex; width: 100%; gap: var(--space-2); align-items: center; justify-content: flex-start;
  text-align: left; border-radius: var(--radius-sm);
}
.cd-ms-pop .cd-ms-item[aria-pressed="true"] { color: var(--color-brand); font-weight: var(--weight-medium); }
.cd-ms-pop .k { flex: 1; }
.cd-ms-pop .n { color: var(--color-text-muted); font-size: var(--text-2xs); }

/* ── 구역 머리 ── */
.cd-sec { display: flex; align-items: baseline; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-3); }
.cd-sec h2 { font-size: var(--text-title); font-weight: var(--weight-title); margin: 0; }
.cd-sec .sub { color: var(--color-text-muted); font-size: var(--text-body-sm); }
.cd-sec .cnt { margin-left: auto; color: var(--color-text-muted); font-size: var(--text-body-sm); }

/* ── 카드 격자 ── */
.cd-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(216px, 1fr)); gap: var(--space-4); }
.cd-card {
  display: flex; flex-direction: column; gap: var(--space-2);
  background: var(--color-surface); border: 1px solid var(--color-border);
  border-radius: var(--radius-lg); overflow: hidden; padding-bottom: var(--space-2);
}
.cd-card.is-mine { border-color: var(--color-brand-line); }
.cd-card.is-ai { opacity: 0.7; }

.cd-thumb {
  position: relative; aspect-ratio: 9 / 16; background: var(--color-surface-subtle);
  overflow: hidden; cursor: pointer;
}
.cd-thumb img, .cd-thumb video { width: 100%; height: 100%; object-fit: cover; display: block; }
/* 미리보기 영상이 돌고 있어도 눌리는 것은 아래의 썸네일이어야 한다
   (영상이 클릭을 먹으면 '크게 보기' 가 안 열린다) */
.cd-thumb video { position: absolute; inset: 0; pointer-events: none; }
/* 움직이는 사진은 커버 위에 얹는다 — 받는 동안 커버가 그대로 보여 빈칸이 안 생긴다 */
.cd-thumb .anim { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; pointer-events: none; }
.cd-thumb .ov {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  color: var(--color-on-scrim); background: var(--color-scrim); opacity: 0; transition: opacity .15s;
}
.cd-thumb:hover .ov { opacity: 1; }
.cd-thumb .noimg {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
  color: var(--color-text-muted); font-size: var(--text-caption);
}
/* 미리보기 진행 막대
   평소에도 보이게 두껍게 두고, 마우스를 카드에 올리면 더 커진다.
   막대 위에 손이 가면 한 번 더 커지고 동그란 손잡이가 나온다. */
.cd-thumb .cd-hbar {
  position: absolute; left: 0; right: 0; bottom: 0;
  height: 14px; padding: 4px 0; cursor: pointer;
  background: var(--color-scrim-strong);
  transition: height .12s, padding .12s;
}
.cd-thumb .cd-hbar i {
  position: relative; display: block; height: 6px; width: 0;
  background: var(--color-brand); border-radius: var(--radius-full);
  transition: height .12s;
}
.cd-thumb:hover .cd-hbar { height: 22px; padding: 7px 0; }
.cd-thumb .cd-hbar:hover { height: 28px; padding: 8px 0; }
.cd-thumb .cd-hbar:hover i { height: 12px; }
/* 끝에 동그란 손잡이 — 어디를 잡으면 되는지 바로 보이게 */
.cd-thumb .cd-hbar:hover i::after {
  content: ""; position: absolute; right: -7px; top: 50%;
  width: 14px; height: 14px; margin-top: -7px;
  background: var(--color-surface); border: 2px solid var(--color-brand);
  border-radius: var(--radius-full);
}
.cd-thumb .cd-unmute { position: absolute; right: var(--space-1); bottom: var(--space-3); }

.cd-thumb .ep {
  position: absolute; left: var(--space-1); top: var(--space-1);
  background: var(--color-scrim-chip); color: var(--color-on-scrim);
  border-radius: var(--radius-sm); padding: 0 var(--space-1); font-size: var(--text-2xs);
}

.cd-body { padding: 0 var(--space-2); display: flex; flex-direction: column; gap: var(--space-1); }
.cd-title {
  font-size: var(--text-body-sm); font-weight: var(--weight-medium); line-height: 1.35;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.cd-sub {
  color: var(--color-text-muted); font-size: var(--text-2xs);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cd-stat {
  display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center;
  color: var(--color-text-secondary); font-size: var(--text-2xs);
}
.cd-stat span { display: inline-flex; align-items: center; gap: 2px; }
.cd-chips, .cd-warn { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
/* 단추 세 줄: 찜·원본 / 신고 3종 / 다운로드.
   한 줄 안에서 너비를 똑같이 나눠 크기가 들쭉날쭉하지 않게 한다 */
.cd-btns { margin-top: auto; padding: 0 var(--space-2); display: flex; flex-direction: column; gap: 4px; }
.cd-acts { display: flex; gap: 4px; }
.cd-acts .btn { flex: 1 1 0; min-width: 0; padding-left: var(--space-1); padding-right: var(--space-1); }
.cd-score { color: var(--color-text-muted); font-size: var(--text-2xs); }
.cd-score.hot { color: var(--color-brand); font-weight: var(--weight-medium); }

/* ── 재생 창 ── */
.cd-player { width: 100%; max-height: 72vh; background: var(--color-ink); border-radius: var(--radius-md); }
.cd-player video { width: 100%; max-height: 72vh; display: block; border-radius: var(--radius-md); }
/* 통째로 받는 동안 보여주는 줄 — 다 받으면 사라진다 */
.cd-load { position: relative; margin-top: var(--space-1); }
.cd-load i { display: block; height: 4px; width: 0; background: var(--color-brand); border-radius: var(--radius-full); }
.cd-load b { display: block; margin-top: 2px; font-size: var(--text-2xs); font-weight: var(--weight-regular); color: var(--color-text-muted); }

/* ── 등장인물(저작권 창) ── */
.cd-persons { display: grid; grid-template-columns: repeat(auto-fill, minmax(92px, 1fr)); gap: var(--space-2); }
.cd-person {
  /* height:auto 가 없으면 .btn 의 고정 높이(40px)에 눌려서 얼굴 사진이 아래 칸을 덮는다 */
  display: block; height: auto; white-space: normal;
  border: 1px solid var(--color-border); border-radius: var(--radius-md);
  padding: var(--space-1); text-align: center;
}
.cd-person[aria-pressed="true"] { border-color: var(--color-brand); background: var(--color-brand-soft); }
.cd-person img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: var(--radius-sm); display: block; }
.cd-person .no { aspect-ratio: 1; display: flex; align-items: center; justify-content: center; color: var(--color-text-muted); font-size: var(--text-2xs); }
.cd-person .t { font-size: var(--text-2xs); margin-top: 2px; }

/* ── 받기 진행 막대 (화면 아래 고정) ── */
.cd-dl {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
  background: var(--color-surface); border-top: 1px solid var(--color-border);
  box-shadow: var(--shadow-md); padding: var(--space-2) var(--space-4);
}
.cd-dl-head { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-body-sm); }
.cd-dl-list { max-height: 148px; overflow: auto; margin-top: var(--space-1); }
.cd-dl-row {
  display: flex; gap: var(--space-2); align-items: center;
  font-size: var(--text-2xs); color: var(--color-text-secondary); padding: 2px 0;
}
.cd-dl-row .t { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

@media (max-width: 640px) {
  .cd-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--space-3); }
  .cd-ms > .btn { min-width: 84px; }
}

/* ── 중드 소재 찾기: 입장 코드 화면 ── */
.cd-gate {
  display: flex; flex-direction: column; align-items: center; gap: var(--space-3);
  padding: var(--space-10) var(--space-4); text-align: center;
  color: var(--color-text-secondary);
}
.cd-gate-row { display: flex; gap: var(--space-2); align-items: center; }
.cd-gate-row .input { width: 220px; }

/* ── 중드 소재 찾기: 사용법 창 ── */
.cd-help h4 { margin: var(--space-5) 0 var(--space-2); font-size: var(--text-body); color: var(--color-text); }
.cd-help h4:first-child { margin-top: 0; }
.cd-help p { margin: 0 0 var(--space-2); color: var(--color-text-secondary); line-height: 1.7; }
.cd-help ul { margin: 0 0 var(--space-2); padding-left: var(--space-5); color: var(--color-text-secondary); line-height: 1.8; }
.cd-help b { color: var(--color-text); font-weight: var(--weight-title); }

/* ── 중드 자동화 도구 (cnauto.html, 2026-09-22) ─────────────────────────
   탭 네 칸(자동 / 내 대본 / 완성본 / 내 열쇠). 세부 설정은 접어 두고, 펼쳐도
   글이 빽빽하지 않게 제목 한 줄 + 칸 세 개씩만 놓는다. (대표 지시: 글씨가 많으면 정신없다) */
.ca-page .ca-panel[hidden] { display: none; }
.ca-page .ca-nokey { margin-bottom: var(--space-4); }

.ca-page .ca-more { border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); margin: var(--space-4) 0; }
.ca-page .ca-more > summary { padding: var(--space-3) var(--space-4); cursor: pointer; font-weight: var(--weight-label); }
.ca-page .ca-more-body { padding: 0 var(--space-4) var(--space-3); }
.ca-page .ca-h { font-size: var(--text-label); font-weight: var(--weight-label); color: var(--color-text-secondary); margin: var(--space-4) 0 var(--space-2); }
.ca-page .ca-more-body .ca-h:first-child { margin-top: 0; }
.ca-page .ca-notes { margin: 0; padding-left: var(--space-5); color: var(--color-text-secondary); }
.ca-page .ca-notes li { margin: var(--space-1) 0; line-height: var(--leading-body); }
.ca-page .ca-script { min-height: 16em; font-family: var(--font-body); line-height: var(--leading-body); }
.ca-page .ca-video { width: 100%; max-width: 320px; border-radius: var(--radius-md); background: var(--color-surface-inverse); display: block; }

/* 내 열쇠 */
.ca-page .ca-key { border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-4); margin-top: var(--space-4); }
.ca-page .ca-key-head { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-1); }
.ca-page .ca-key-head .sp { flex: 1 1 auto; }

/* 완성본 목록 */
.ca-page .ca-lib { margin-top: var(--space-3); }
.ca-page .ca-lib-row { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) 0; border-top: var(--border-w) solid var(--color-border); }
.ca-page .ca-lib-row:first-child { border-top: 0; }
.ca-page .ca-lib-main { flex: 1 1 auto; min-width: 0; }
.ca-page .ca-lib-top { display: flex; align-items: center; gap: var(--space-2); }
.ca-page .ca-lib-sub { color: var(--color-text-secondary); font-size: var(--text-body-sm); margin-top: var(--space-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ca-page .ca-lib-err { color: var(--color-danger-text); font-size: var(--text-body-sm); margin-top: var(--space-1); }
.ca-page .ca-lib-act { flex: 0 0 auto; }

@media (max-width: 640px) {
  .ca-page .grid-3 { grid-template-columns: 1fr; }
}

/* ── 중드 자막 미리보기 (2026-09-22) ─────────────────────────────────────
   자막 글씨체를 화면에서도 그대로 보여 주려고 웹용으로 줄인 글꼴을 담았다
   (한글 음절 전체 + 영숫자만 남겨 144~445KB. 고른 글씨체 하나만 받는다).
   미리보기 상자는 완성본과 같은 9:16 이고, 값은 1080 기준을 상자 폭에 맞춰 줄인 것이다. */

@font-face { font-family: "IBN Hakgyoansim"; src: url("../fonts/HakgyoansimBareondotum.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN BlackHanSans"; src: url("../fonts/BlackHanSans-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN NotoSansKR"; src: url("../fonts/NotoSansKR-Black.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN NanumGothicEB"; src: url("../fonts/NanumGothic-ExtraBold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN GothicA1"; src: url("../fonts/GothicA1-Black.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN PlexSansKR"; src: url("../fonts/IBMPlexSansKR-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN GmarketSans"; src: url("../fonts/GmarketSansTTFMedium.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN DoHyeon"; src: url("../fonts/DoHyeon-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Jua"; src: url("../fonts/Jua-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN GowunDodum"; src: url("../fonts/GowunDodum-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Sunflower"; src: url("../fonts/Sunflower-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN NanumMyeongjoEB"; src: url("../fonts/NanumMyeongjo-ExtraBold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN SongMyung"; src: url("../fonts/SongMyung-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN GowunBatang"; src: url("../fonts/GowunBatang-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Hahmlet"; src: url("../fonts/Hahmlet-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Gugi"; src: url("../fonts/Gugi-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN BagelFatOne"; src: url("../fonts/BagelFatOne-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN MoiraiOne"; src: url("../fonts/MoiraiOne-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Diphylleia"; src: url("../fonts/Diphylleia-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Orbit"; src: url("../fonts/Orbit-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Grandiflora"; src: url("../fonts/GrandifloraOne-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Stylish"; src: url("../fonts/Stylish-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN BlackWhitePic"; src: url("../fonts/BlackAndWhitePicture-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Dongle"; src: url("../fonts/Dongle-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN NanumPen"; src: url("../fonts/NanumPenScript-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN NanumBrush"; src: url("../fonts/NanumBrushScript-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Gaegu"; src: url("../fonts/Gaegu-Bold.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN GamjaFlower"; src: url("../fonts/GamjaFlower-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN HiMelody"; src: url("../fonts/HiMelody-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN KirangHaerang"; src: url("../fonts/KirangHaerang-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN PoorStory"; src: url("../fonts/PoorStory-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN CuteFont"; src: url("../fonts/CuteFont-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN Dokdo"; src: url("../fonts/Dokdo-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN EastSeaDokdo"; src: url("../fonts/EastSeaDokdo-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN SingleDay"; src: url("../fonts/SingleDay-Regular.woff2") format("woff2"); font-display: swap; }
@font-face { font-family: "IBN YeonSung"; src: url("../fonts/YeonSung-Regular.woff2") format("woff2"); font-display: swap; }

.ca-page .ca-subwrap { display: flex; gap: var(--space-5); align-items: flex-start; flex-wrap: wrap; }
.ca-page .ca-subopts { flex: 1 1 22em; min-width: 0; }
.ca-page .ca-prev {
  flex: 0 0 auto; position: relative; width: 240px; aspect-ratio: 9 / 16;
  background: var(--color-surface-inverse); border-radius: var(--radius-md);
  border: var(--border-w) solid var(--color-border-strong); overflow: hidden;
}
.ca-page .ca-prev-sub {
  position: absolute; left: var(--space-2); right: var(--space-2);
  bottom: var(--ca-sub-bottom, 25%);
  text-align: center; line-height: 1.25; word-break: keep-all;
  font-family: var(--ca-sub-font, inherit);
  font-size: var(--ca-sub-size, 20px);
  color: var(--ca-sub-color);
  -webkit-text-stroke: var(--ca-sub-stroke) var(--ca-sub-outline);
  paint-order: stroke fill;
}
.ca-page .ca-prev-sub span { display: block; }

.ca-page .ca-field { margin-bottom: var(--space-4); }
.ca-page .ca-field > label { display: block; font-size: var(--text-label); font-weight: var(--weight-label); margin-bottom: var(--space-1); }
.ca-page .ca-val { color: var(--color-text-secondary); font-weight: var(--weight-body); }
.ca-page .ca-range { width: 100%; accent-color: var(--color-brand); min-height: 0; padding: 0; background: none; border: 0; }
.ca-page .ca-colorrow { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ca-page .ca-swatch { display: flex; gap: var(--space-1); flex-wrap: wrap; }
.ca-page .ca-swatch .chip { width: 26px; height: 26px; padding: 0; min-height: 0; border-radius: var(--radius-sm); background: var(--c); border: var(--border-w) solid var(--color-border-strong); }
.ca-page .ca-swatch .chip[aria-pressed="true"] { box-shadow: 0 0 0 2px var(--color-focus-ring); }
.ca-page .ca-swatch-sm .chip { width: 16px; height: 16px; }
.ca-page .ca-swatch-sm .ca-color { width: 30px; height: 22px; }
.ca-page .ca-book { display: grid; grid-template-columns: repeat(auto-fill, minmax(212px, 1fr)); align-items: start; gap: var(--space-3); }
.ca-page .ca-bk { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2); }
.ca-page .ca-bk-head { display: flex; align-items: center; gap: var(--space-1); }
.ca-page .ca-bk-head .nm { flex: 1 1 auto; min-width: 0; }
.ca-page .ca-bk-x { flex: 0 0 auto; padding-inline: var(--space-1); }
.ca-page .ca-bk-shots { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-1); margin-top: var(--space-2); }
.ca-page .ca-bk-shot { display: block; height: auto; min-height: 0; padding: 0; border: 0; background: none; line-height: 0; border-radius: var(--radius-sm); overflow: hidden; }
.ca-page .ca-bk-shot img { width: 100%; aspect-ratio: 9 / 16; object-fit: cover; background: var(--color-bg-page); display: block; }
.ca-page .ca-bk-shot:hover img, .ca-page .ca-bk-shot:focus-visible img { opacity: .72; }
/* 여러 사람이 함께 잡힌 사진 (투샷) — 테두리로 알려 준다 */
.ca-page .ca-bk-shot.is-shared { outline: 2px solid var(--color-brand); outline-offset: -2px; }
.ca-page .ca-bk .lk { color: var(--color-ink-soft); margin-top: var(--space-1); }
.ca-page .ca-wshot { text-align: center; margin-bottom: var(--space-3); }
.ca-page .ca-wshot img { width: 168px; aspect-ratio: 9 / 16; object-fit: cover; border-radius: var(--radius-md); background: var(--color-bg-page); }
.ca-page .ca-wlist { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.ca-page .ca-hex { width: 7.2em; font-family: var(--font-mono, monospace); }
.ca-page .ca-swatch-sm .ca-hex { width: 6.4em; }
.ca-page .ca-prev-sub { cursor: grab; }
.ca-page .ca-prev-sub:active { cursor: grabbing; }
.ca-page .ca-prev-grip {
  position: absolute; right: 8px; bottom: var(--ca-grip-bottom, 24px);
  width: 16px; height: 16px; min-height: 0; padding: 0; border-radius: var(--radius-sm);
  background: var(--color-brand); border: var(--border-w) solid var(--color-on-scrim-line);
  cursor: ns-resize;
}
.ca-page .ca-color { width: 44px; height: 30px; padding: 0; border-radius: var(--radius-sm); border: var(--border-w) solid var(--color-border-strong); background: none; min-height: 0; }

/* 중드 자동화 — 여러 편 예약 목록 (2026-09-22) */
.ca-page .ca-queue { margin-top: var(--space-3); }
.ca-page .ca-qrow { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) 0; border-top: var(--border-w) solid var(--color-border); }
.ca-page .ca-qrow:first-child { border-top: 0; }
.ca-page .ca-qname { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ca-page .ca-qstate { flex: 0 0 auto; color: var(--color-text-secondary); font-size: var(--text-body-sm); }

/* 중드 자동화 — 성우 만들기 단계 (2026-09-22) */
.ca-page .ca-half { max-width: 22em; }
.ca-page .ca-audio { width: 100%; margin-top: var(--space-3); }
.ca-page .ca-vsearch { width: 12em; }
.ca-page .ca-vpick { min-width: 14em; }
.ca-page .ca-vfilter { display: flex; gap: var(--space-2); flex-wrap: wrap; align-items: center; margin: var(--space-3) 0 var(--space-2); }
.ca-page .ca-vsel { width: auto; min-width: 6em; }
.ca-page .ca-vnum { width: 4.6em; }
.ca-page .ca-vbtn { min-width: 6em; max-width: 9em; justify-content: flex-start; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ca-page .ca-vacts { display: flex; gap: var(--space-2); align-items: center; }
.ca-page .ca-vcol { width: 3.2em; padding: 0; }
.ca-page .ca-ltd { width: 100%; }
.ca-page .ca-ltx { width: 100%; min-width: 18em; }
.ca-page .ca-lsp { width: 5.5em; }
.ca-page .table th, .ca-page .table td { white-space: nowrap; }
.ca-page .ca-ltd, .ca-page .ca-ltd input { white-space: normal; }
.ca-page .ca-bulk { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }
.ca-vlist { max-height: 52vh; overflow: auto; border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); }
.ca-vrow { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border-bottom: var(--border-w) solid var(--color-border); }
.ca-vrow:last-child { border-bottom: 0; }
.ca-vrow.is-cur { background: var(--color-brand-soft); }
.ca-vrow .nm { flex: 1 1 auto; min-width: 0; }
.ca-vrow .tag { color: var(--color-ink-soft); }
.ca-page .ca-vname { width: 9em; }
.ca-page tr.is-now > td { background: var(--color-brand-soft); font-weight: 600; }

/* ── 게시물 생성기 — 대표님 원본 이식 (postgen.html, 2026-09-26) ─────────────────
   원본(IBN 올인원 편집기 postgen/templates/index.html)의 배치 그대로: 글 고르기 | 고치기 | 미리보기.
   사이트 화면의 색·크기는 토큰만 쓴다. 카드 그림(결과물) 자체의 색·글꼴은 cardkit/ 가 가진다.
   설명 글은 줄이고(마우스를 올리면 보임) 글씨·단추는 작게 둔다 (대표 지시). */
.pg-page .container { max-width: 1560px; }
.pg-page .pg-top { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; padding: var(--space-2) var(--space-3); margin-bottom: var(--space-3); }
.pg-page .pg-top .sp { flex: 1 1 auto; }
.pg-page .pg-modes { display: flex; gap: var(--space-1); }
.pg-page .pg-modes .tab { height: var(--control-h-sm); margin-bottom: 0; font-size: var(--text-body-sm); }
.pg-page .pg-seg { gap: var(--space-1); }
.pg-page .pg-main { display: grid; grid-template-columns: 270px minmax(0, 1fr) minmax(300px, 380px); grid-template-areas: "list edit right"; gap: var(--space-3); align-items: start; }
.pg-page .pg-listwrap { grid-area: list; padding: 0; overflow: hidden; display: flex; flex-direction: column; position: sticky; top: calc(var(--ticker-h) + var(--space-3)); max-height: calc(100vh - var(--ticker-h) - var(--space-6)); }
.pg-page .pg-edit { grid-area: edit; min-width: 0; }
.pg-page .pg-right { grid-area: right; min-width: 0; position: sticky; top: calc(var(--ticker-h) + var(--space-3)); }

/* 왼쪽: 글 고르기 */
.pg-page .pg-find { display: flex; gap: var(--space-2); align-items: center; padding: var(--space-2); border-bottom: var(--border-w) solid var(--color-border); }
.pg-page .pg-find[hidden] { display: none; }
.pg-page .pg-find .select { flex: 1 1 auto; min-width: 0; min-height: var(--control-h-sm); font-size: var(--text-body-sm); padding-left: var(--space-2); }
.pg-page .pg-find-col { flex-direction: column; align-items: stretch; }
.pg-page .pg-find-row { display: flex; gap: var(--space-2); align-items: center; }
.pg-page .pg-find-col .pg-seg { flex-wrap: nowrap; }
.pg-page .pg-find-col .pg-seg .chip { flex: 1 1 0; max-width: 160px; justify-content: center; height: 28px; }
.pg-page .pg-free { flex-direction: column; align-items: stretch; }
.pg-page .pg-free .textarea { min-height: 0; font-size: var(--text-body-sm); line-height: var(--leading-body-sm); }
.pg-page .pg-label { font-size: var(--text-label); font-weight: var(--weight-label); }
.pg-page .pg-cats { display: flex; flex-wrap: wrap; gap: var(--space-1); padding: var(--space-2); border-bottom: var(--border-w) solid var(--color-border); }
.pg-page .pg-cats[hidden] { display: none; }
.pg-page .pg-cats .chip { height: 24px; padding: 0 var(--space-2); font-size: var(--text-caption); }
.pg-page .pg-items { overflow-y: auto; flex: 1 1 auto; min-height: 120px; }
.pg-page .btn.pg-item { display: flex; gap: var(--space-2); align-items: flex-start; justify-content: flex-start; width: 100%; height: auto; padding: var(--space-2) var(--space-3); border: 0; border-bottom: var(--border-w) solid var(--color-border); border-radius: 0; background: var(--color-surface); color: var(--color-text); text-align: left; white-space: normal; line-height: var(--leading-body-sm); font-size: var(--text-body-sm); font-weight: var(--weight-regular); }
.pg-page .btn.pg-item:hover { background: var(--color-surface-hover); }
.pg-page .btn.pg-item.is-active { background: var(--color-brand-soft); }
.pg-page .btn.pg-item.is-used { opacity: 0.45; }
.pg-page .pg-item-in { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 auto; }
.pg-page .pg-item-t { font-weight: var(--weight-medium); overflow-wrap: anywhere; }
.pg-page .pg-used { color: var(--color-text-muted); font-weight: var(--weight-regular); }
.pg-page .pg-item-m { display: flex; flex-wrap: wrap; gap: var(--space-1); align-items: center; color: var(--color-text-muted); font-size: var(--text-caption); }
.pg-page .pg-pill { display: inline-block; border-radius: var(--radius-sm); padding: 0 6px; font-size: var(--text-2xs); font-weight: var(--weight-bold); background: var(--color-surface-subtle); color: var(--color-text-secondary); }
.pg-page .pg-pill.is-match { background: var(--color-success-soft); color: var(--color-success); }
.pg-page .pg-pill.is-politics { background: var(--color-danger-soft); color: var(--color-danger-text); }
.pg-page .pg-nthumb { width: 72px; height: 52px; object-fit: cover; border-radius: var(--radius-sm); background: var(--color-surface-subtle); flex: none; }
.pg-page .pg-empty { padding: var(--space-5) var(--space-3); color: var(--color-text-muted); text-align: center; font-size: var(--text-body-sm); grid-column: 1 / -1; }
.pg-page .pg-empty.is-err { color: var(--color-danger-text); }

/* 가운데: 고치기 */
.pg-page .pg-sec { padding: var(--space-3); margin-bottom: var(--space-3); }
.pg-page .pg-sec[hidden], .pg-page .pg-edit > div[hidden] { display: none; }
.pg-page .pg-sec-h { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); font-size: var(--text-body-sm); font-weight: var(--weight-bold); }
.pg-page .pg-sec-h .sp { flex: 1 1 auto; }
.pg-page .pg-hint { color: var(--color-text-muted); font-size: var(--text-caption); font-weight: var(--weight-regular); }
.pg-page .pg-origin { font-size: var(--text-caption); font-weight: var(--weight-medium); }
.pg-page .pg-headline { font-weight: var(--weight-bold); }
.pg-page .pg-tchips { gap: var(--space-1); margin-top: var(--space-2); }
.pg-page .pg-tchips .chip { height: auto; min-height: 28px; padding: 3px var(--space-3); white-space: normal; text-align: left; line-height: var(--leading-body-sm); }
.pg-page .pg-tchips .chip.is-ai { border-color: var(--color-info-line); background: var(--color-info-soft); color: var(--color-info); }
.pg-page .pg-tchips .chip.pg-tmore { min-height: 28px; padding: 3px var(--space-2); color: var(--color-text-muted); font-variant-numeric: tabular-nums; }
.pg-page .pg-actbar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; position: sticky; top: var(--ticker-h); z-index: 3; background: var(--color-bg); padding: var(--space-2) 0; margin-bottom: var(--space-1); }
.pg-page .pg-actbar .btn { min-width: 88px; }
.pg-page .pg-actbar .btn[hidden] { display: none; }
.pg-page .pg-prog { margin-bottom: var(--space-2); }
.pg-page .pg-prog-t { display: flex; justify-content: space-between; gap: var(--space-2); margin-top: var(--space-1); font-size: var(--text-caption); color: var(--color-text-secondary); font-variant-numeric: tabular-nums; }
.pg-page .pg-status { min-height: 1.5em; margin-bottom: var(--space-2); font-size: var(--text-body-sm); color: var(--color-text-secondary); white-space: pre-wrap; }
.pg-page .pg-status.is-err { color: var(--color-danger-text); }

/* 카드뉴스 고치기 — 탭 하나씩 (장 구성 · 템플릿 · 내 스타일) */
.pg-page .pg-cnbox { container-type: inline-size; padding: var(--space-1) var(--space-3) var(--space-3); margin-bottom: var(--space-3); }
/* 넘침 스크롤(overflow)을 두면 윈도 크롬에서 탭 줄 오른쪽에 작은 위아래 화살표가 생긴다 — 좁으면 템플릿 이름만 숨긴다 */
.pg-page .tabs.pg-cntabs { margin-bottom: var(--space-3); flex-wrap: nowrap; }
.pg-page .pg-cntabs .tab { height: var(--control-h-sm); font-size: var(--text-body-sm); white-space: nowrap; flex: none; }
.pg-page .pg-tabval { margin-left: var(--space-1); color: var(--color-text-muted); font-size: var(--text-caption); font-weight: var(--weight-regular); }
@container (max-width: 400px) { .pg-page .pg-tabval { display: none; } }
.pg-page .pg-tabpane[hidden] { display: none; }
.pg-page .pg-pane-hint { margin: 0 0 var(--space-2); font-size: var(--text-caption); color: var(--color-text-muted); }
.pg-page .pg-plan-info { margin-bottom: var(--space-2); font-size: var(--text-caption); color: var(--color-text-muted); }
.pg-page .pg-plan-info:empty { display: none; }

/* 템플릿 16 (원본 .tplgrid) — 칸 색은 그 템플릿 색 (--tpl-*) */
.pg-page .pg-tplgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: var(--space-2); }
.pg-page .btn.pg-tpl { position: relative; display: flex; flex-direction: column; justify-content: flex-end; align-items: stretch; gap: 2px; aspect-ratio: 1 / 1; height: auto; padding: var(--space-2); border: 2px solid transparent; border-radius: var(--radius-md); background: var(--tpl-bg); color: var(--tpl-fg); text-align: left; white-space: normal; line-height: 1.2; box-shadow: var(--shadow-sm); overflow: hidden; }
.pg-page .btn.pg-tpl.on { border-color: var(--color-brand); box-shadow: 0 0 0 3px var(--color-focus-ring); }
.pg-page .pg-tpl-acc { position: absolute; left: var(--space-2); top: var(--space-2); width: 28px; height: 6px; border-radius: 3px; background: var(--tpl-acc); }
.pg-page .pg-tpl .pg-tpl-chk { position: absolute; right: 6px; top: 6px; display: none; padding: 2px; border-radius: var(--radius-full); background: var(--color-surface); color: var(--color-brand); }
.pg-page .pg-tpl.on .pg-tpl-chk { display: block; }
.pg-page .pg-tpl-n { font-family: var(--tpl-ff), var(--font-sans); font-size: var(--text-body); font-weight: var(--weight-display); font-synthesis: none; letter-spacing: -0.02em; }
.pg-page .pg-tpl-u { font-size: var(--text-micro); font-weight: var(--weight-regular); opacity: 0.75; }

/* 접었다 펴는 칸 (내 스타일 · 원글 본문) */
.pg-page .pg-fold { padding: 0; margin-bottom: var(--space-3); }
.pg-page .pg-fold > summary { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); cursor: pointer; list-style: none; font-size: var(--text-body-sm); font-weight: var(--weight-bold); }
.pg-page .pg-fold > summary::-webkit-details-marker { display: none; }
.pg-page .pg-fold > summary::before { content: ""; width: 6px; height: 6px; border-right: 2px solid var(--color-text-muted); border-bottom: 2px solid var(--color-text-muted); transform: rotate(-45deg); transition: transform var(--motion-fast) var(--ease); }
.pg-page .pg-fold[open] > summary::before { transform: rotate(45deg); }
.pg-page .pg-fold > :not(summary) { margin: 0 var(--space-3) var(--space-3); }

/* 내 스타일 (원본 .stygrid) */
.pg-page .pg-stygrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: var(--space-2); align-items: end; }
.pg-page .pg-f { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pg-page .pg-f[hidden] { display: none; }
.pg-page .pg-f > label, .pg-page .pg-mini-lab { font-size: var(--text-caption); color: var(--color-text-secondary); }
.pg-page .pg-mini-lab { white-space: nowrap; }
.pg-page .pg-f.pg-span2 { grid-column: span 2; }
.pg-page .pg-f.pg-wide { grid-column: 1 / -1; }
.pg-page .pg-f.pg-chk { flex-direction: row; align-items: center; flex-wrap: wrap; gap: var(--space-1) var(--space-2); min-height: var(--control-h-sm); }
.pg-page .pg-f.pg-chk .check { font-size: var(--text-body-sm); min-height: 0; }
.pg-page .pg-fsel { display: flex; gap: var(--space-1); align-items: center; min-width: 0; }
.pg-page .pg-fsel > .select, .pg-page .pg-fsel > input { flex: 1 1 auto; min-width: 0; }
.pg-page .pg-sel-sm { min-height: var(--control-h-sm); font-size: var(--text-body-sm); padding-left: var(--space-2); }
.pg-page input[type="color"] { width: 100%; height: var(--control-h-sm); padding: 2px; border: var(--border-w) solid var(--color-border-strong); border-radius: var(--radius-sm); background: var(--color-surface); cursor: pointer; }
.pg-page .btn.pg-xs { height: 22px; padding: 0 var(--space-2); font-size: var(--text-2xs); border-radius: var(--radius-sm); flex: none; }
.pg-page .pg-logo-img { width: 26px; height: 26px; border-radius: var(--radius-full); object-fit: cover; border: var(--border-w) solid var(--color-border); }
.pg-page .pg-sty-foot { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-2); }

/* 장 구성 (원본 .cn-plan · .cn-card · .cn-more) — 한 장 = 왼쪽 사진 칸 + 오른쪽 글 칸 */
.pg-page .pg-cn-tools { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; margin-bottom: var(--space-2); }
.pg-page .pg-cn-tools .pg-sel-sm { width: auto; }
.pg-page .pg-cn-note { flex: 1 1 180px; min-width: 0; min-height: var(--control-h-sm); font-size: var(--text-body-sm); }
.pg-page .pg-plan { display: flex; flex-direction: column; gap: var(--space-2); }
.pg-page .pg-card { border: var(--border-w) solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3) var(--space-3); background: var(--color-surface-subtle); transition: background var(--motion-fast) var(--ease), border-color var(--motion-fast) var(--ease); }
.pg-page .pg-card:focus-within { border-color: var(--color-brand-line); background: var(--color-surface); }
.pg-page .pg-card.is-cover { border-color: var(--color-info-line); background: var(--color-info-soft); }
.pg-page .pg-card.drop-over { border-color: var(--color-brand); background: var(--color-brand-soft); }
.pg-page .pg-card.is-new { border-color: var(--color-brand); box-shadow: 0 0 0 3px var(--color-focus-ring); }
.pg-page .pg-card-h { display: flex; align-items: center; gap: var(--space-1); min-height: 26px; margin-bottom: var(--space-2); }
.pg-page .pg-card-t { font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text); white-space: nowrap; }
.pg-page .pg-no { display: inline-flex; align-items: center; justify-content: center; min-width: 22px; height: 22px; padding: 0 6px; border-radius: var(--radius-full); background: var(--color-text); color: var(--color-text-inverse); font-size: var(--text-caption); font-weight: var(--weight-bold); font-variant-numeric: tabular-nums; flex: none; }
.pg-page .pg-card-role { margin-left: var(--space-1); font-size: var(--text-caption); color: var(--color-text-muted); }
.pg-page .pg-card-h .pg-hint { margin-left: var(--space-2); }
.pg-page .pg-card-h .sp { flex: 1 1 auto; }
.pg-page .pg-card-h .btn-sm { height: 26px; }
.pg-page .pg-card-h .btn-icon.btn-sm { width: 26px; }
.pg-page .pg-card-b { display: flex; gap: var(--space-3); align-items: flex-start; }
.pg-page .pg-card-b > .pg-fg { flex: 1 1 auto; }
.pg-page .pg-slot { flex: none; width: 84px; display: flex; flex-direction: column; gap: var(--space-1); }
.pg-page .btn.pg-slot-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-1); width: 84px; height: 84px; padding: 0; border: 2px dashed var(--color-border-strong); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text-secondary); font-size: var(--text-caption); font-weight: var(--weight-medium); white-space: normal; overflow: hidden; }
.pg-page .btn.pg-slot-btn:hover { border-color: var(--color-brand); color: var(--color-brand); background: var(--color-brand-soft); }
.pg-page .btn.pg-slot-btn.has { border-style: solid; border-color: var(--color-border); background: var(--color-surface-subtle); }
.pg-page .btn.pg-slot-btn.has:hover { border-color: var(--color-brand); }
.pg-page .btn.pg-slot-btn img { display: block; width: 100%; height: 100%; object-fit: cover; }
.pg-page .select.pg-sel-xs { width: 100%; min-height: 26px; height: 26px; padding: 0 var(--space-6) 0 var(--space-2); background-position: right var(--space-1) center; font-size: var(--text-caption); }
.pg-page .pg-slot .btn.pg-xs { width: 100%; }
.pg-page .pg-psize { display: flex; align-items: center; gap: var(--space-1); font-size: var(--text-2xs); color: var(--color-text-muted); }
.pg-page .pg-psize input[type="range"] { flex: 1 1 auto; width: 100%; min-width: 0; margin: 0; accent-color: var(--color-brand); }
.pg-page .pg-fg { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-2); min-width: 0; }
.pg-page .pg-fg .w { grid-column: 1 / -1; }
.pg-page .pg-fl { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pg-page .pg-lab { font-size: var(--text-caption); color: var(--color-text-secondary); }
.pg-page .pg-fg .input { min-height: var(--control-h-sm); font-size: var(--text-body-sm); padding: 0 var(--space-2); }
.pg-page .pg-fg .textarea { min-height: 0; font-size: var(--text-body-sm); padding: var(--space-1) var(--space-2); line-height: var(--leading-body-sm); }
.pg-page .pg-fg .textarea, .pg-page .pg-row .textarea { overflow-y: hidden; }
.pg-page .pg-fg .textarea.is-long, .pg-page .pg-row .textarea.is-long { overflow-y: auto; }
.pg-page .pg-card.is-caption { background: var(--color-surface); }
.pg-page .pg-empty-plan { padding: var(--space-4) var(--space-2); text-align: center; color: var(--color-text-muted); font-size: var(--text-body-sm); }
.pg-page .pg-empty-plan p { margin: 0 0 var(--space-2); }
.pg-page .pg-empty-tpl { display: flex; align-items: center; justify-content: center; gap: var(--space-2); flex-wrap: wrap; }
.pg-page .pg-empty-act { margin-top: var(--space-3); }
.pg-page .pg-cn-warn { margin: var(--space-2) 0 0; }
.pg-page .pg-cn-warn[hidden] { display: none; }
.pg-page .pg-more { margin-top: var(--space-2); }
.pg-page .pg-more > summary { display: inline-block; cursor: pointer; padding: 2px 0; font-size: var(--text-caption); color: var(--color-text-muted); }
.pg-page .pg-more > summary:hover, .pg-page .pg-more[open] > summary { color: var(--color-text-link); }
.pg-page .pg-psty { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-1); padding-top: var(--space-2); border-top: 1px dashed var(--color-border); }
.pg-page .pg-psty > label { display: flex; flex-direction: column; gap: 2px; min-width: 0; font-size: var(--text-caption); color: var(--color-text-secondary); }
.pg-page .pg-psty > label.pg-span2 { grid-column: span 2; }
.pg-page .pg-psty-lab { display: flex; align-items: center; justify-content: space-between; gap: 2px; }
.pg-page .pg-psty .input-sm { min-height: var(--control-h-sm); padding: 0 var(--space-2); }

/* 캡처식 옵션 · 본문 고치기 */
.pg-page .pg-capopts { display: grid; grid-template-columns: repeat(auto-fill, minmax(96px, 1fr)); gap: var(--space-2); align-items: end; }
.pg-page .pg-ta-sm { min-height: 0; font-size: var(--text-body-sm); line-height: var(--leading-body-sm); }
.pg-page .pg-rows { display: flex; flex-direction: column; gap: var(--space-1); margin-bottom: var(--space-2); }
.pg-page .pg-row { display: flex; gap: var(--space-2); align-items: flex-start; }
.pg-page .pg-row .textarea { flex: 1 1 auto; min-height: 0; padding: var(--space-1) var(--space-2); font-size: var(--text-body-sm); line-height: var(--leading-body-sm); }
.pg-page .pg-row-img { flex: 1 1 auto; display: flex; align-items: center; gap: var(--space-2); min-width: 0; font-size: var(--text-caption); color: var(--color-text-muted); overflow-wrap: anywhere; }
.pg-page .pg-row-img img { width: 44px; height: 44px; object-fit: cover; border-radius: var(--radius-sm); flex: none; }
.pg-page .pg-bodybox { max-height: 180px; overflow: auto; white-space: pre-wrap; font-size: var(--text-body-sm); line-height: var(--leading-body-sm); color: var(--color-text-secondary); }

/* 오른쪽: 미리보기 */
.pg-page .pg-pv { padding: var(--space-2); }
.pg-page .pg-pv-bar { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); font-size: var(--text-body-sm); }
.pg-page .pg-pv-bar .sp { flex: 1 1 auto; }
.pg-page .pg-pv-bar .btn[hidden] { display: none; }
.pg-page .pg-frame { display: block; width: 100%; aspect-ratio: 1 / 1.12; border: 0; border-radius: var(--radius-md); background: var(--color-surface-subtle); }
.pg-page .pg-frame.is-r45 { aspect-ratio: 1 / 1.36; }
.pg-page .pg-frame.is-r34 { aspect-ratio: 1 / 1.44; }
.pg-page .pg-frame[hidden], .pg-page .pg-saved[hidden] { display: none; }
.pg-page .pg-saved-btns { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.pg-page .pg-saved-imgs { display: flex; flex-direction: column; gap: var(--space-2); max-height: 72vh; overflow-y: auto; }
.pg-page .btn.pg-simg { display: block; width: 100%; height: auto; padding: 0; border: var(--border-w) solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-surface); overflow: hidden; cursor: zoom-in; }
.pg-page .btn.pg-simg img { display: block; width: 100%; }

/* 사진 고르기 · 글꼴 고르기 창 (UI.modal 안) */
.pg-page .pg-modal .modal-body { padding: var(--space-4); }
.pg-page .pg-modal.drop-over .modal { box-shadow: 0 0 0 3px var(--color-brand); }
.pg-page .pg-pick-up { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.pg-page .pg-pick-tip { font-size: var(--text-caption); color: var(--color-text-muted); }
.pg-page p.pg-pick-tip { margin: 0; }
.pg-page .pg-pick-none { padding: var(--space-2) 0; font-size: var(--text-caption); color: var(--color-text-muted); grid-column: 1 / -1; }
.pg-page .pg-pick-srch { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.pg-page .pg-pick-srch .input { flex: 1 1 220px; min-width: 0; }
.pg-page .pg-pick-lab { margin: var(--space-4) 0 var(--space-2); font-size: var(--text-body-sm); font-weight: var(--weight-bold); color: var(--color-text); }
.pg-page .pg-pgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(104px, 1fr)); gap: var(--space-2); }
.pg-page .btn.pg-ptile { display: block; height: auto; aspect-ratio: 1 / 1; padding: 0; border: 2px solid transparent; border-radius: var(--radius-md); background: var(--color-surface-subtle); overflow: hidden; }
.pg-page .btn.pg-ptile:hover { border-color: var(--color-brand); }
.pg-page .btn.pg-ptile[hidden] { display: none; }
.pg-page .btn.pg-ptile img { display: block; width: 100%; height: 100%; object-fit: cover; }
.pg-page .pg-fp-top { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }
.pg-page .pg-fp-top .input { flex: 1 1 auto; min-width: 0; }
.pg-page .pg-fgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: var(--space-2); }
.pg-page .btn.pg-ftile { display: flex; flex-direction: column; align-items: stretch; height: auto; padding: var(--space-2) var(--space-3); border: 2px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text); text-align: left; white-space: nowrap; overflow: hidden; }
.pg-page .btn.pg-ftile:hover, .pg-page .btn.pg-ftile.on { border-color: var(--color-brand); background: var(--color-surface-hover); }
.pg-page .pg-ftile-smp { overflow: hidden; text-overflow: ellipsis; font-family: var(--ff), var(--font-sans); font-size: var(--text-h3); font-weight: var(--weight-regular); line-height: 1.3; }
.pg-page .pg-ftile-nm { margin-top: 2px; font-size: var(--text-2xs); font-weight: var(--weight-regular); color: var(--color-text-muted); }

/* 크게 보기 (원본 #viewer) */
.pg-page .pg-viewer { position: fixed; inset: 0; z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; background: var(--color-scrim-strong); }
.pg-page .pg-viewer[hidden] { display: none; }
.pg-page .pg-viewer-img { max-width: 88vw; max-height: 86vh; border-radius: var(--radius-md); background: var(--color-surface); }
.pg-page .btn.pg-v-btn { position: absolute; background: var(--color-scrim-chip); color: var(--color-on-scrim); border-color: var(--color-on-scrim-line); }
.pg-page .btn.pg-v-btn:hover { background: var(--color-scrim); }
.pg-page .btn.pg-v-btn[hidden] { display: none; }
.pg-page .pg-v-x { top: var(--space-4); right: var(--space-4); width: var(--control-h-sm); padding: 0; }
.pg-page .pg-v-dl { top: var(--space-4); right: calc(var(--space-4) + var(--control-h-sm) + var(--space-2)); }
.pg-page .btn.pg-v-nav { top: 50%; transform: translateY(-50%); width: 48px; height: 72px; padding: 0; }
.pg-page .pg-v-prev { left: var(--space-4); }
.pg-page .pg-v-next { right: var(--space-4); }
.pg-page .pg-v-cnt { position: absolute; bottom: var(--space-4); left: 50%; transform: translateX(-50%); padding: 2px var(--space-3); border-radius: var(--radius-full); background: var(--color-scrim-chip); color: var(--color-on-scrim); font-size: var(--text-body-sm); font-weight: var(--weight-bold); font-variant-numeric: tabular-nums; }

/* 그림 파일로 찍는 숨은 틀 (1080 폭 그대로 그려야 해서 화면 밖이 아니라 뒤에 투명하게 둔다) */
.pg-page .pg-shoot { position: fixed; left: 0; top: 0; width: 1200px; height: 1600px; border: 0; opacity: 0; pointer-events: none; z-index: -1; }

@media (max-width: 1279px) {
  .pg-page .pg-main { grid-template-columns: minmax(0, 1fr) minmax(280px, 340px); grid-template-areas: "list list" "edit right"; }
  .pg-page .pg-listwrap { position: static; max-height: 380px; }
}
@media (max-width: 899px) {
  .pg-page .pg-right, .pg-page .pg-actbar { top: calc(var(--header-h) + var(--space-2)); }
}
@media (max-width: 760px) {
  .pg-page .pg-main { grid-template-columns: minmax(0, 1fr); grid-template-areas: "list" "right" "edit"; }
  .pg-page .pg-right { position: static; }
  .pg-page .pg-actbar { top: var(--header-h); }
  .pg-page .pg-psty { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pg-page .pg-card-b { gap: var(--space-2); }
  .pg-page .pg-slot, .pg-page .btn.pg-slot-btn { width: 68px; }
  .pg-page .btn.pg-slot-btn { height: 68px; }
  .pg-page .pg-fg { grid-template-columns: minmax(0, 1fr); }
  .pg-page .pg-viewer-img { max-width: 96vw; }
  .pg-page .btn.pg-v-nav { width: 36px; height: 56px; }
}
