/* ===== Design Tokens ===== */
:root{
  --font-sans:"Noto Sans KR","Malgun Gothic","Apple SD Gothic Neo","Segoe UI",-apple-system,BlinkMacSystemFont,sans-serif;
  --bg-app:#0f172a;
  --bg-surface:#1e293b;
  --bg-card:#1e293b;
  --bg-inset:#162032;
  --bg-elevated:#283a52;
  --border:#293548;
  --border-subtle:#1e293b;
  --text-1:#f1f5f9;
  --text-2:#94a3b8;
  --text-3:#64748b;
  --brand-primary:#f08000;
  --brand-hover:#e06000;
  --brand-strong:#d94c00;
  --brand-soft:rgba(240,128,0,.14);
  --brand-soft-border:rgba(240,128,0,.28);
  --brand-ink:#18120e;
  --brand-ring:rgba(240,128,0,.18);
  --brand-tint:#ffb15c;
  --brand-soft-hover:rgba(240,128,0,.16);
  --brand-press:rgba(240,128,0,.26);
  --brand-chip-bg:rgba(24,18,14,.28);
  --brand-chip-border:rgba(240,128,0,.16);
  --brand-gradient:linear-gradient(135deg, var(--brand-tint), var(--accent));
  --brand-gradient-strong:linear-gradient(90deg, var(--brand-tint), var(--accent), var(--brand-strong));
  --brand-surface-dark:linear-gradient(180deg, rgba(42,31,23,.92), rgba(15,23,42,.72));
  --brand-surface-light:linear-gradient(180deg, rgba(255,247,240,.98), rgba(248,250,252,.96));
  --brand-hero-surface:linear-gradient(135deg, rgba(240,128,0,.16), rgba(65,38,16,.28) 38%, rgba(15,23,42,.14));
  --brand-logo-shadow:0 8px 18px rgba(240,128,0,.16);
  --accent:var(--brand-primary);
  --accent-hover:var(--brand-hover);
  --success:#10b981;
  --success-soft:rgba(16,185,129,.12);
  --error:#ef4444;
  --error-soft:rgba(239,68,68,.10);
  --warning:#f59e0b;
  --shadow-sm:0 1px 3px rgba(0,0,0,.18);
  --shadow-md:0 2px 8px rgba(0,0,0,.18);
  --shadow-lg:0 8px 24px rgba(0,0,0,.22);
  --radius-sm:8px;
  --radius-md:12px;
  --radius-lg:16px;
}

/* ===== Reset ===== */
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html,body{
  width:100%;min-height:100vh;overflow-x:hidden;
  font-family:var(--font-sans);
  color:var(--text-1);font-size:13px;
  -webkit-user-select:none;user-select:none;
  touch-action:manipulation;
  -webkit-font-smoothing:antialiased;
  background:var(--bg-app);
}
/* Pi kiosk: exact 1280x720 */
@media (width:1280px) and (height:720px){
  html,body{width:1280px;height:720px;overflow:hidden}
}
.app{display:flex;flex-direction:column;height:100%}

/* ===== Top Bar ===== */
.topbar{
  display:flex;align-items:center;justify-content:space-between;
  height:48px;padding:0 24px;
  background:var(--bg-surface);
  border-bottom:1px solid var(--border);
  flex-shrink:0;
  backdrop-filter:blur(14px);
}
.topbar-left{display:flex;align-items:center;gap:14px}
.topbar-logo{
  width:26px;height:26px;border-radius:6px;
  border:1px solid var(--brand-soft-border);
  background:rgba(255,247,240,.04);
  box-shadow:var(--brand-logo-shadow), inset 0 1px 0 rgba(255,255,255,.06);
}
.topbar-title{font-size:14px;font-weight:750;color:var(--text-1);letter-spacing:-.03em}
.brand-name{color:var(--accent);font-weight:850;text-shadow:0 0 18px rgba(240,128,0,.16)}
.topbar-divider{width:1px;height:14px;background:var(--border)}
.topbar-clock{font-size:12px;font-weight:600;color:var(--text-3);font-variant-numeric:tabular-nums;margin-left:8px}
.topbar-right{display:flex;align-items:center;gap:10px}
.topbar .chip{
  border:1px solid transparent;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04);
}
.topbar .chip-green{
  border-color:rgba(16,185,129,.16);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.05), 0 8px 18px rgba(5,150,105,.08);
}

/* Chips */
.chip{
  padding:4px 12px;border-radius:6px;
  font-size:11px;font-weight:600;transition:all .3s;
}
.chip-muted{background:var(--bg-elevated);color:var(--text-3)}
.chip-green{background:var(--success-soft);color:var(--success);opacity:.85}
.chip-red{background:var(--error-soft);color:var(--error);opacity:.85}
.chip-blue{background:var(--brand-soft);color:var(--accent)}
.chip-yellow{background:rgba(251,191,35,.12);color:var(--warning)}
.chip-phone{
  background:var(--accent);color:var(--brand-ink);
  font-size:12px;font-weight:700;padding:5px 14px;
  letter-spacing:.3px;
}

/* 클릭 가능한 전화번호 */
.conn-val-phone{
  color:var(--accent);font-weight:700;cursor:pointer;
  display:inline-flex;align-items:center;gap:5px;
  padding:4px 10px;margin:-4px -10px;
  border-radius:6px;
  background:var(--brand-soft);
  transition:background .15s,color .15s;
}
.conn-val-phone::before{
  content:'';display:inline-block;
  width:13px;height:13px;flex-shrink:0;
  background:currentColor;
  -webkit-mask:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2A19.86 19.86 0 0 1 3.09 5.18 2 2 0 0 1 5.11 3h3a2 2 0 0 1 2 1.72c.13.81.36 1.6.68 2.34a2 2 0 0 1-.45 2.11L8.09 11.41a16 16 0 0 0 6.5 6.5l2.24-2.24a2 2 0 0 1 2.11-.45c.74.32 1.53.55 2.34.68A2 2 0 0 1 22 16.92z'/%3E%3C/svg%3E") center/contain no-repeat;
  mask:url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2.5' stroke-linecap='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M22 16.92v3a2 2 0 0 1-2.18 2A19.86 19.86 0 0 1 3.09 5.18 2 2 0 0 1 5.11 3h3a2 2 0 0 1 2 1.72c.13.81.36 1.6.68 2.34a2 2 0 0 1-.45 2.11L8.09 11.41a16 16 0 0 0 6.5 6.5l2.24-2.24a2 2 0 0 1 2.11-.45c.74.32 1.53.55 2.34.68A2 2 0 0 1 22 16.92z'/%3E%3C/svg%3E") center/contain no-repeat;
}
.conn-val-phone:hover{
  background:var(--brand-ring);
}
.conn-val-phone:active{
  background:var(--brand-press);
}
.light .conn-val-phone{color:var(--brand-strong);background:var(--brand-soft)}
.light .conn-val-phone:hover{background:var(--brand-soft-hover)}

/* Icon button */
.icon-btn{
  width:34px;height:34px;border:none;border-radius:var(--radius-sm);
  background:var(--bg-elevated);color:var(--text-2);
  display:flex;align-items:center;justify-content:center;
  cursor:pointer;transition:all .15s;
}
.icon-btn svg{width:18px;height:18px}
.icon-btn:hover{background:var(--border);color:var(--text-1)}
.icon-btn:active{transform:scale(.93)}
.icon-btn-light{background:var(--bg-elevated);color:var(--text-3)}
.icon-btn-light:hover{background:var(--border);color:var(--text-1)}

/* ===== Error Banner ===== */
.error-banner{
  display:flex;align-items:center;gap:8px;
  padding:6px 24px;
  background:var(--error-soft);
  color:var(--error);font-size:11px;font-weight:600;
  flex-shrink:0;border-bottom:1px solid rgba(239,68,68,.15);
  animation:bannerIn .3s ease;
}
.error-banner svg{flex-shrink:0;color:var(--error)}
@keyframes bannerIn{from{max-height:0;padding:0 24px;opacity:0}to{max-height:40px;opacity:1}}

/* ===== Dashboard ===== */
.dashboard{
  display:flex;flex-direction:column;
  justify-content:space-evenly;
  gap:0;
  padding:12px 28px;
  flex:1;min-height:0;
}

/* ===== Status Cards (side-panel reuse) ===== */
.status-row{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.status-card{
  position:relative;
  background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-md);
  padding:16px 18px;display:flex;align-items:center;gap:16px;box-shadow:var(--shadow-sm);
}
.sc-icon{
  width:40px;height:40px;border-radius:10px;
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
}
.sc-icon svg{width:20px;height:20px}
.sc-icon-green{background:var(--success-soft);color:var(--success)}
.sc-icon-orange{background:rgba(245,158,11,.10);color:var(--warning)}
.sc-icon-blue{background:var(--brand-soft);color:var(--accent)}
.sc-icon-purple{background:var(--brand-soft);color:var(--brand-tint)}

.sc-info{display:flex;flex-direction:column;gap:4px;min-width:0}
.sc-label{font-size:10px;font-weight:600;color:var(--text-2);text-transform:uppercase;letter-spacing:.5px}
.sc-value{font-size:18px;font-weight:700;color:var(--text-1);line-height:1.2;white-space:nowrap}
.sc-sub{font-size:10px;font-weight:500;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}

.sc-dot{
  position:absolute;top:14px;right:14px;
  width:8px;height:8px;border-radius:50%;
  background:var(--text-3);transition:all .4s;
}
.sc-dot.ok{background:var(--success);box-shadow:0 0 0 2px rgba(16,185,129,.10)}
.sc-dot.warn{background:var(--warning);box-shadow:0 0 0 2px rgba(245,158,11,.10)}
.sc-dot.err{background:var(--error);box-shadow:0 0 0 2px rgba(239,68,68,.12);animation:blink-err 1.5s ease-in-out infinite}
.sc-dot.dim{background:var(--border)}
@keyframes pulse-dot{
  0%,100%{box-shadow:0 0 0 3px rgba(16,185,129,.12)}
  50%{box-shadow:0 0 0 6px rgba(16,185,129,.04)}
}
@keyframes blink-err{
  0%,100%{opacity:1}
  50%{opacity:.35}
}

/* ===== Middle Section ===== */
.mid-section{display:flex;gap:0}

.glass-card{
  background:var(--bg-surface);
  border:1px solid var(--border);
  border-radius:var(--radius-md);
  padding:12px 14px;
  box-shadow:var(--shadow-sm);
}
.conn-section .glass-card{padding:10px 12px}

.gc-title{
  font-size:10px;font-weight:600;color:var(--text-3);
  text-transform:uppercase;letter-spacing:.8px;margin-bottom:8px;
}

/* ── 장비 상태 그리드 ── */
.conn-section{margin-bottom:2px}
.conn-grid{
  display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:8px;
}
.device-strip{
  display:grid;
  grid-template-columns:minmax(0,1.45fr) auto minmax(220px,.8fr);
  gap:12px;
  align-items:center;
  margin-bottom:6px;
  padding:15px 18px;
  border-radius:16px;
  border:1px solid var(--brand-soft-border);
  background:
    var(--brand-hero-surface),
    rgba(25,24,23,.68);
  box-shadow:0 14px 30px rgba(14,10,7,.18), inset 0 1px 0 rgba(255,177,92,.04);
}
.device-strip-copy{
  display:flex;
  flex-direction:column;
  gap:7px;
  min-width:0;
}
.device-strip-kicker{
  font-size:10px;
  font-weight:800;
  letter-spacing:.15em;
  text-transform:uppercase;
  color:var(--brand-tint);
}
.device-strip-number{
  display:block;
  min-width:0;
  color:var(--text-1);
  font-size:27px;
  font-weight:820;
  line-height:1;
  letter-spacing:-.045em;
  text-shadow:0 8px 18px rgba(0,0,0,.18);
  overflow-wrap:anywhere;
  word-break:break-all;
}
.device-strip-meta{
  display:flex;
  flex-wrap:wrap;
  gap:6px;
}
.device-meta-chip{
  display:inline-flex;
  align-items:center;
  gap:7px;
  min-width:0;
  padding:5px 10px;
  border-radius:999px;
  background:var(--brand-chip-bg);
  border:1px solid var(--brand-chip-border);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.04);
}
.device-meta-label{
  color:var(--text-3);
  font-size:9px;
  font-weight:700;
  letter-spacing:.08em;
  text-transform:uppercase;
}
.device-meta-value{
  min-width:0;
  color:var(--text-1);
  font-size:11px;
  font-weight:780;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.device-strip-actions{
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  gap:5px;
}
.device-action-btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:6px;
  min-height:36px;
  padding:0 13px;
  border:1px solid rgba(240,128,0,.22);
  border-radius:12px;
  background:rgba(240,128,0,.12);
  color:var(--brand-tint);
  font-size:12px;
  font-weight:780;
  cursor:pointer;
  transition:transform .12s, box-shadow .15s, opacity .15s;
  box-shadow:0 8px 18px rgba(240,128,0,.10), inset 0 1px 0 rgba(255,255,255,.05);
}
.device-action-btn svg{
  width:15px;
  height:15px;
}
.device-action-btn:hover:not(:disabled){
  transform:translateY(-1px);
  background:rgba(240,128,0,.18);
  color:#ffd2a2;
  box-shadow:0 12px 22px rgba(240,128,0,.14);
}
.device-action-btn:disabled{
  opacity:.45;
  cursor:not-allowed;
  box-shadow:none;
}
.device-action-note{
  color:var(--text-3);
  font-size:9px;
  font-weight:650;
  letter-spacing:.04em;
}
.device-signal-panel{
  display:flex;
  flex-direction:column;
  gap:9px;
  min-width:0;
  padding-left:16px;
  border-left:1px solid rgba(240,128,0,.10);
}
.device-signal-head{
  display:flex;
  align-items:center;
  gap:8px;
}
.device-signal-title{
  color:var(--text-2);
  font-size:9px;
  font-weight:700;
  letter-spacing:.12em;
  text-transform:uppercase;
}
.device-signal-head .sc-dot{
  position:static;
  margin-left:auto;
}
.device-signal-body{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  min-width:0;
}
.conn-card{
  background:rgba(22,32,50,.4);border:none;border-radius:var(--radius-sm);
  padding:8px 10px;transition:all .25s;
}
.conn-card .sparkline{display:none}
.conn-card-head{
  display:flex;align-items:center;gap:5px;margin-bottom:4px;
  font-size:10px;font-weight:600;color:var(--text-2);text-transform:uppercase;letter-spacing:.4px;
}
.conn-card-head svg{opacity:.7;width:13px;height:13px}
.conn-card-head .sc-dot{margin-left:auto;width:7px;height:7px}
.conn-card-body{display:flex;flex-direction:column;gap:2px}
.conn-row{display:flex;justify-content:space-between;align-items:center;gap:8px;min-width:0;font-size:11px}
.conn-row.conn-row-sparkline{display:none}
.conn-label{min-width:0;color:var(--text-3);font-weight:500;font-size:10px}
.conn-val{min-width:0;color:var(--text-1);font-weight:600;font-variant-numeric:tabular-nums;font-size:11px;text-align:right;overflow-wrap:anywhere;word-break:break-all}
.conn-card .rssi-bar-wrap{margin-top:1px}
.device-signal-copy{
  display:flex;
  align-items:center;
  gap:8px;
  flex-wrap:wrap;
  min-width:0;
}
.device-signal-pill{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-height:26px;
  padding:0 10px;
  border-radius:999px;
  font-size:11px;
  font-weight:700;
  letter-spacing:.03em;
  border:1px solid transparent;
}
.device-signal-pill.is-ok{
  color:#34d399;
  background:rgba(16,185,129,.12);
  border-color:rgba(16,185,129,.24);
}
.device-signal-pill.is-warn{
  color:#fbbf24;
  background:rgba(245,158,11,.12);
  border-color:rgba(245,158,11,.2);
}
.device-signal-pill.is-err{
  color:#fda4af;
  background:rgba(239,68,68,.12);
  border-color:rgba(239,68,68,.22);
}
.device-signal-pill.is-dim{
  color:var(--text-2);
  background:rgba(100,116,139,.12);
  border-color:rgba(100,116,139,.18);
}
.device-id-rssi{
  font-size:13px;
  font-weight:780;
  color:var(--text-1);
  font-variant-numeric:tabular-nums;
}
.device-signal-bars{
  display:flex;
  align-items:flex-end;
  gap:4px;
  height:22px;
  min-width:40px;
}
.device-signal-bars span{
  display:block;
  width:5px;
  border-radius:999px;
  background:rgba(148,163,184,.22);
  transition:background .2s ease, opacity .2s ease;
}
.device-signal-bars span:nth-child(1){height:7px}
.device-signal-bars span:nth-child(2){height:11px}
.device-signal-bars span:nth-child(3){height:15px}
.device-signal-bars span:nth-child(4){height:19px}
.device-signal-bars.is-ok span.is-on{background:#10b981}
.device-signal-bars.is-warn span.is-on{background:#f59e0b}
.device-signal-bars.is-err span.is-on{background:#ef4444}
.device-signal-bars.is-dim span.is-on{background:rgba(148,163,184,.48)}

@media(max-width:1100px){
  .device-strip{
    grid-template-columns:minmax(0,1fr);
    gap:10px;
  }
  .device-strip-actions{
    align-items:flex-start;
  }
  .device-signal-panel{
    padding-left:0;
    border-left:none;
    padding-top:10px;
    border-top:1px solid rgba(148,163,184,.14);
  }
}
@media(max-width:900px){
  .conn-grid{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:640px){
  .conn-grid{grid-template-columns:1fr}
}

/* 방송 운용 요약 라인 */
.bc-summary{
  display:flex;gap:14px;margin-bottom:10px;padding:6px 10px;
  background:rgba(22,32,50,.4);border-radius:var(--radius-sm);border:none;
}
.bc-summary-item{
  display:flex;align-items:center;gap:6px;font-size:12px;font-weight:500;color:var(--text-3);
}
.bc-summary-item .ch-led{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.bc-summary-val{font-weight:700;color:var(--text-1)}

/* Channels (legacy — kept for ch-item reuse) */
.channels-card{flex:0 0 480px;margin-right:18px}
.ch-list{display:flex;gap:14px;align-items:center}
.ch-item{
  flex:1;display:flex;align-items:center;justify-content:center;gap:10px;
  padding:26px 8px;border-radius:12px;
  font-size:13px;font-weight:600;transition:all .35s;
}
.ch-led{
  width:8px;height:8px;border-radius:50%;flex-shrink:0;
  transition:all .35s;
}
.ch-on{background:rgba(16,185,129,.1);color:#34d399;border:1px solid rgba(16,185,129,.25)}
.ch-on .ch-led{background:#10b981;box-shadow:0 0 6px rgba(16,185,129,.5)}
.ch-off{background:var(--bg-inset);color:var(--text-3);border:1px solid var(--border)}
.ch-off .ch-led{background:var(--text-3)}
/* 미사용 상태 (정상적 비활성) — 방송활성 채널 등 */
.ch-unused{background:#1e2d42;color:#4a5a6e;border:1px solid #2d3f55}
.ch-unused .ch-led{background:#3a4a5e}
.ch-unused .ch-sub{color:#4a5a6e;font-size:9px}
/* 오류 상태 (연결 실패) */
.ch-err{background:rgba(239,68,68,.08);color:#f87171;border:1px solid rgba(239,68,68,.25)}
.ch-err .ch-led{background:#ef4444;animation:blink-err 1s infinite}
.ch-err .ch-sub{color:#f87171;font-size:9px}

/* Broadcast Groups */
.broadcast-card{flex:1}
.bc-grid{display:flex;gap:8px;align-items:stretch}
.bc-item{
  flex:1;text-align:center;padding:12px 8px;
  border-radius:var(--radius-sm);background:rgba(22,32,50,.4);
  border:none;min-height:90px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  transition:all .3s;position:relative;
}
.bc-item.bc-air{
  background:rgba(239,68,68,.08);border-color:rgba(239,68,68,.25);
  animation:breathe 2.5s ease-in-out infinite;
}
@keyframes breathe{
  0%,100%{box-shadow:inset 0 0 0 0 rgba(239,68,68,.05)}
  50%{box-shadow:inset 0 0 20px 0 rgba(239,68,68,.08)}
}

.bc-indicator{
  width:20px;height:20px;border-radius:50%;
  margin:0 auto 6px;
  border:2px solid var(--text-3);
  display:flex;align-items:center;justify-content:center;
  transition:all .3s;
}
.bc-indicator-inner{
  width:6px;height:6px;border-radius:50%;
  background:var(--text-3);transition:all .3s;
}
.bc-item.bc-ready .bc-indicator{border-color:var(--success)}
.bc-item.bc-ready .bc-indicator-inner{background:var(--success)}
.bc-item.bc-air .bc-indicator{border-color:#ef4444}
.bc-item.bc-air .bc-indicator-inner{background:#ef4444;animation:inner-pulse 1.5s ease infinite}
.bc-item.bc-stopping .bc-indicator{border-color:#f59e0b}
.bc-item.bc-stopping .bc-indicator-inner{background:#f59e0b}
@keyframes inner-pulse{
  0%,100%{transform:scale(1);opacity:1}
  50%{transform:scale(.6);opacity:.5}
}

.bc-name{display:block;font-size:10px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}
.bc-tag{
  display:inline-block;padding:3px 14px;border-radius:6px;
  font-size:10px;font-weight:600;transition:all .3s;
}
.bc-ready-tag{background:var(--success-soft);color:var(--success)}
.bc-air-tag{background:var(--error);color:#fff}
.bc-stopping-tag{background:var(--warning);color:#78350f}
.bc-dur{
  display:block;margin-top:4px;
  font-size:12px;font-weight:800;color:#f87171;
  font-variant-numeric:tabular-nums;letter-spacing:.5px;
  line-height:1.2;
}

/* ===== Control Section ===== */
.ctrl-section{flex-shrink:0}
.ctrl-card{display:flex;flex-direction:column;gap:10px;padding:12px 14px}
.ctrl-left{display:flex;gap:12px;align-items:center;flex:1;flex-wrap:wrap}
.ctrl-right{display:flex;gap:8px;justify-content:flex-end;padding-top:6px;border-top:1px solid var(--border)}

.ctrl-group{display:flex;align-items:center;gap:8px}
.ctrl-label{font-size:10px;font-weight:600;color:var(--text-3);min-width:28px;text-transform:uppercase;letter-spacing:.3px}

.seg-bar{
  display:flex;position:relative;
  background:var(--bg-inset);border-radius:var(--radius-sm);padding:3px;gap:2px;
}
.seg{
  padding:6px 14px;border:none;border-radius:6px;
  background:transparent;color:var(--text-3);
  font-size:11px;font-weight:600;cursor:pointer;
  transition:color .2s;position:relative;z-index:1;
  min-height:34px;display:inline-flex;align-items:center;gap:4px;
}
.seg-on{color:var(--text-1)}
.seg-slider{
  position:absolute;top:3px;left:3px;
  height:calc(100% - 6px);border-radius:6px;
  background:var(--bg-elevated);
  box-shadow:var(--shadow-sm);
  transition:all .3s cubic-bezier(.4,0,.2,1);
  z-index:0;
}

select{
  background:var(--bg-inset);color:var(--text-1);
  border:1px solid var(--border);border-radius:6px;
  padding:6px 10px;font-size:11px;font-weight:600;
  outline:none;min-height:34px;cursor:pointer;
  transition:border-color .2s;
}
select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--brand-ring)}

.big-btn{
  display:flex;flex-direction:row;align-items:center;justify-content:center;
  padding:0 16px;height:36px;border:none;border-radius:6px;
  font-size:11px;font-weight:700;cursor:pointer;
  transition:box-shadow .15s,opacity .15s,transform .1s;gap:5px;touch-action:manipulation;
  white-space:nowrap;
}
.big-btn svg{width:14px;height:14px;flex-shrink:0}
.big-btn:active{transform:scale(.96)}
.big-btn:disabled{opacity:.25;cursor:not-allowed;box-shadow:none;filter:grayscale(.4)}
.big-btn.loading{pointer-events:none;opacity:.7;position:relative}
.big-btn.loading::after{
  content:'';position:absolute;right:10px;top:50%;
  width:14px;height:14px;margin-top:-7px;
  border:2px solid rgba(255,255,255,.3);border-top-color:#fff;
  border-radius:50%;animation:btn-spin .6s linear infinite;
}
@keyframes btn-spin{to{transform:rotate(360deg)}}
.big-start{background:var(--success);color:#fff;box-shadow:0 1px 4px rgba(16,185,129,.15)}
.big-start:hover:not(:disabled){box-shadow:0 2px 10px rgba(16,185,129,.22);background:#059669}
.big-stop{background:#dc2626;color:#fff;box-shadow:0 1px 4px rgba(239,68,68,.15)}
.big-stop:hover:not(:disabled){box-shadow:0 2px 10px rgba(239,68,68,.22);background:#b91c1c}
.big-stop.stop-confirm{background:var(--warning);box-shadow:0 2px 8px rgba(245,158,11,.3);animation:stop-pulse .6s ease-in-out infinite}
@keyframes stop-pulse{0%,100%{transform:scale(1)}50%{transform:scale(1.04)}}

/* ===== Broadcast Lock Overlay ===== */
.ctrl-card{position:relative}
.bc-lock-overlay{
  display:none;position:absolute;inset:0;z-index:10;
  background:rgba(15,23,42,.65);border-radius:inherit;
  justify-content:center;align-items:center;gap:8px;
  color:var(--warning);font-size:12px;font-weight:600;
  backdrop-filter:blur(2px);
}
.bc-lock-overlay svg{flex-shrink:0}
.bc-locked .bc-lock-overlay{display:flex}
.light .bc-lock-overlay{background:rgba(241,245,249,.75);color:var(--warning)}

/* ===== Enhanced Broadcast Banner (아래 기존 정의와 통합) ===== */
.bc-banner-info{display:flex;align-items:center;gap:10px;flex:1;flex-wrap:wrap;min-width:0}
.bc-banner-type{max-width:100%;min-width:0;font-weight:800;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bc-banner-detail{min-width:0;font-size:12px;font-weight:600;opacity:.85;white-space:normal;overflow-wrap:anywhere;word-break:break-word}
.bc-banner-timer{font-size:15px;font-weight:800;font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0}

/* ===== Slider Common System (소스별 기본 음량 기준 통일) ===== */
.slider-common{
  -webkit-appearance:none;appearance:none;
  width:100%;height:4px;border-radius:2px;outline:none;cursor:pointer;
  background:rgba(148,163,184,.18);
  transition:background .15s;
}
.slider-common::-webkit-slider-thumb{
  -webkit-appearance:none;
  width:14px;height:14px;border-radius:50%;
  background:var(--text-2);
  border:none;cursor:pointer;
  box-shadow:0 1px 3px rgba(0,0,0,.2);
  transition:transform .12s,box-shadow .12s;
}
.slider-common::-webkit-slider-thumb:hover{
  transform:scale(1.15);
  box-shadow:0 1px 5px rgba(0,0,0,.28);
}
.slider-common:focus-visible{
  outline:2px solid var(--accent);outline-offset:3px;
}

/* Light overrides */
.light .slider-common{background:rgba(100,116,139,.12)}
.light .slider-common::-webkit-slider-thumb{background:var(--text-3);box-shadow:0 1px 3px rgba(0,0,0,.12)}
.light .slider-common::-webkit-slider-thumb:hover{box-shadow:0 1px 5px rgba(0,0,0,.18)}

/* ===== Control Field Group (송출 음량 등 세로형 필드) ===== */
.ctrl-field{
  display:flex;flex-direction:column;gap:4px;
  width:160px;flex-shrink:0;
}
.ctrl-field-head{
  display:flex;justify-content:space-between;align-items:baseline;
}
.ctrl-field-val{
  font-size:11px;font-weight:600;color:var(--text-2);
  font-variant-numeric:tabular-nums;
}
.slider-track-wrap{display:flex;align-items:center}
.ctrl-field-caption{
  font-size:9px;color:var(--text-3);font-weight:400;
  letter-spacing:.1px;opacity:.8;
}
.light .ctrl-field-val{color:var(--text-2)}
.light .ctrl-field-caption{color:var(--text-3);opacity:.9}

/* ===== Ment Preview Button ===== */
.ment-sel-row{display:flex;align-items:center;gap:6px;flex:1}
.ment-sel-row select{flex:1}
.ment-preview{
  width:32px;height:32px;border:1px solid var(--border);border-radius:6px;
  background:var(--bg-inset);color:var(--text-3);cursor:pointer;
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
  transition:all .15s;
}
.ment-preview:hover{background:var(--brand-soft);color:var(--accent);border-color:var(--brand-soft-border)}
.ment-preview.playing{background:var(--error-soft);color:var(--error);border-color:var(--error)}
.ment-preview svg{width:14px;height:14px}
.light .ment-preview{background:var(--bg-inset);border-color:var(--border);color:var(--text-3)}
.light .ment-preview:hover{background:var(--brand-soft);color:var(--brand-strong);border-color:var(--brand-soft-border)}

/* ===== RSSI Signal Bar ===== */
.rssi-bar-wrap{display:flex;align-items:center;gap:5px;margin-top:1px}
.rssi-bar{width:50px;height:3px;background:var(--border);border-radius:2px;overflow:hidden}
.rssi-bar-fill{height:100%;border-radius:2px;transition:width .5s,background .5s}
.rssi-label{font-size:10px;color:var(--text-3);white-space:nowrap}
.light .rssi-bar{background:#e2e8f0}
.light .rssi-label{color:#94a3b8}

/* ===== Broadcast Timer Duration ===== */
.bc-dur{font-size:13px;font-weight:700;color:#ef4444;margin-top:2px;font-variant-numeric:tabular-nums;animation:bcTimerBlink 1s ease-in-out infinite}
@keyframes bcTimerBlink{0%,100%{opacity:1}50%{opacity:.6}}

/* ===== Seg Button Icons ===== */
.seg svg{vertical-align:-2px;margin-right:2px}

/* ===== Broadcast Active Banner ===== */
.bc-active-banner{
  display:flex;align-items:center;gap:10px;
  padding:10px 16px;margin:0 12px 6px;border-radius:var(--radius-sm);
  position:sticky;top:50px;z-index:50;
  background:var(--error);
  color:#fff;font-size:14px;font-weight:700;
  box-shadow:0 2px 12px rgba(239,68,68,.25);
}
.bc-active-banner svg{stroke:#fff;flex-shrink:0}
.bc-active-banner.hidden{display:none}

/* ===== Card Entrance ===== */
.anim-card{
  opacity:0;transform:translateY(16px);
  animation:cardIn .4s ease forwards;
  animation-delay:calc(var(--i) * .06s);
}
@keyframes cardIn{to{opacity:1;transform:translateY(0)}}

/* ===== Side Panel ===== */
.panel-dim{
  position:fixed;inset:0;background:rgba(0,0,0,.35);
  z-index:800;opacity:0;transition:opacity .3s;
}
.panel-dim.show{opacity:1}

.side-panel{
  position:fixed;top:0;right:0;
  width:480px;height:100%;
  background:var(--bg-surface);
  border-left:1px solid var(--border);
  box-shadow:-4px 0 24px rgba(0,0,0,.15);
  z-index:900;display:flex;flex-direction:column;
  transform:translateX(100%);
  transition:transform .25s cubic-bezier(.4,0,.2,1);
}
.side-panel.open{transform:translateX(0)}

.sp-head{
  display:flex;flex-direction:column;gap:10px;
  padding:14px 20px;border-bottom:1px solid var(--border);flex-shrink:0;
}
.sp-head-top{
  display:flex;align-items:center;justify-content:space-between;
  gap:12px;
}
.sp-head h2{font-size:15px;font-weight:700;color:var(--text-1);display:flex;align-items:center;gap:8px}
.sp-logo{
  width:22px;height:22px;border-radius:5px;flex-shrink:0;
  border:1px solid var(--brand-soft-border);
  box-shadow:var(--brand-logo-shadow);
}
.sp-head .theme-row{
  margin:0;
}

.sp-tabs{
  display:flex;padding:3px;margin:12px 16px 0;
  background:var(--bg-inset);border-radius:var(--radius-sm);flex-shrink:0;
}
.sp-tab{
  flex:1;padding:7px 6px;border:none;border-radius:6px;
  background:transparent;color:var(--text-3);
  font-size:11px;font-weight:600;cursor:pointer;
  text-align:center;transition:all .2s;min-width:0;overflow:hidden;
}
.sp-tab:hover{color:var(--text-2)}
.sp-tab-on{
  background:var(--brand-soft);
  color:var(--accent);
  box-shadow:inset 0 0 0 1px var(--brand-soft-border), var(--shadow-sm);
}
.sp-tab-copy{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:1px;
  min-width:0;
  text-align:left;
  overflow:hidden;
}
.sp-tab-copy strong{
  display:block;
  font-size:11px;
  line-height:1.2;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.sp-tab-copy small{
  display:block;
  font-size:9px;
  line-height:1.2;
  color:var(--text-3);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}

.sp-body{flex:1;overflow:hidden;padding:14px 16px 16px}
.tab-content{height:100%;overflow-y:auto;padding-right:4px}
.tab-content::-webkit-scrollbar{width:4px}
.tab-content::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}
.hidden{display:none!important}

.panel-intro{
  min-width:0;
  margin-bottom:14px;
  padding:16px 18px;
  border:1px solid var(--border);
  border-radius:16px;
  background:var(--brand-surface-dark);
  box-shadow:var(--shadow-sm);
}
.panel-intro-kicker{
  display:inline-flex;
  align-items:center;
  font-size:10px;
  font-weight:800;
  letter-spacing:.12em;
  color:var(--brand-tint);
  text-transform:uppercase;
}
.panel-intro-title{
  margin:6px 0 6px;
  font-size:22px;
  line-height:1.15;
  color:var(--text-1);
  overflow-wrap:anywhere;
  word-break:break-word;
}
.panel-intro-desc{
  margin:0;
  color:var(--text-3);
  font-size:12px;
  line-height:1.6;
  overflow-wrap:anywhere;
  word-break:break-word;
}
.status-brief-grid,
.status-summary-grid{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:10px;
  margin-bottom:14px;
}
.status-brief-card,
.status-summary-card,
.status-control-card{
  min-width:0;
  padding:14px 16px;
  border:1px solid var(--border);
  border-radius:16px;
  background:var(--brand-surface-dark);
  box-shadow:var(--shadow-sm);
}
.status-summary-card,
.status-control-card{
  margin-bottom:14px;
}
.status-brief-card-wide,
.status-summary-card{
  grid-column:1 / -1;
}
.status-brief-kicker,
.status-summary-kicker{
  display:inline-flex;
  align-items:center;
  font-size:10px;
  font-weight:800;
  letter-spacing:.12em;
  color:var(--brand-tint);
  text-transform:uppercase;
}
.status-brief-title,
.status-summary-title{
  margin:6px 0 6px;
  font-size:18px;
  line-height:1.2;
  color:var(--text-1);
  overflow-wrap:anywhere;
  word-break:break-word;
}
.status-brief-desc{
  margin:0 0 10px;
  color:var(--text-3);
  font-size:12px;
  line-height:1.55;
  overflow-wrap:anywhere;
  word-break:break-word;
}
.status-brief-label,
.status-summary-label{
  display:block;
  font-size:10px;
  font-weight:800;
  letter-spacing:.08em;
  color:var(--text-3);
  text-transform:uppercase;
  overflow-wrap:anywhere;
  word-break:break-word;
}
.status-brief-value,
.status-summary-value{
  display:block;
  margin-top:6px;
  font-size:20px;
  line-height:1.15;
  color:var(--text-1);
  overflow-wrap:anywhere;
  word-break:break-all;
}
.status-brief-meta,
.status-summary-meta{
  display:block;
  margin-top:6px;
  color:var(--text-3);
  font-size:11px;
  line-height:1.5;
  overflow-wrap:anywhere;
  word-break:break-word;
}
.status-control-head{
  margin-bottom:12px;
}
.status-summary-head{
  min-width:0;
  margin-bottom:12px;
}
.status-summary-item{
  min-width:0;
  padding:12px;
  border-radius:12px;
  background:rgba(15,23,42,.46);
  border:1px solid rgba(148,163,184,.12);
}

/* INI (카드형) */
.ini-table{margin-bottom:10px;border:1px solid var(--border);border-radius:var(--radius-sm);overflow:hidden}
.ini-table h4{
  font-size:11px;font-weight:600;color:var(--text-2);
  padding:9px 14px;background:var(--bg-inset);
  display:flex;align-items:center;gap:8px;
  text-transform:uppercase;letter-spacing:.4px;
}
.ini-row{
  display:flex;align-items:center;gap:10px;min-width:0;padding:6px 14px;font-size:12px;
  border-top:1px solid var(--border);
}
.ini-row:nth-child(odd){background:var(--bg-surface)}
.ini-row:nth-child(even){background:var(--bg-inset)}
.ini-key{flex:0 0 140px;min-width:0;color:var(--text-3);font-weight:500;font-size:11px}
.ini-val{flex:1;min-width:0;color:var(--text-1);font-weight:600;overflow-wrap:anywhere;word-break:break-all}

/* Edit */
.edit-bar{display:flex;gap:8px;margin-bottom:12px}
.edit-bar select{flex:1}
.edit-section-header{
  font-size:11px;font-weight:600;color:var(--text-2);
  padding:8px 12px;background:var(--bg-inset);
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;border:1px solid var(--border);border-bottom:none;
  text-transform:uppercase;letter-spacing:.4px;
}
.edit-row{
  display:flex;align-items:center;min-width:0;padding:5px 12px;gap:10px;
  border-left:1px solid var(--border);border-right:1px solid var(--border);
  border-bottom:1px solid var(--border);
}
.edit-row:last-child{border-bottom:1px solid var(--border);border-radius:0 0 var(--radius-sm) var(--radius-sm)}
.edit-row:nth-child(odd){background:var(--bg-surface)}
.edit-row:nth-child(even){background:var(--bg-inset)}
.edit-key{flex:0 0 150px;font-size:11px;color:var(--text-3);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.edit-input{
  flex:1;min-width:0;background:var(--bg-inset);border:1.5px solid var(--border);
  border-radius:6px;padding:6px 10px;color:var(--text-1);font-size:12px;font-weight:600;
  outline:none;transition:all .2s;
}
.edit-input:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--brand-ring)}
.edit-input.changed{border-color:var(--warning);background:rgba(245,158,11,.04)}
.edit-input.saved{border-color:var(--success);background:rgba(16,185,129,.04)}
.btn-save-row{
  padding:5px 12px;border:none;border-radius:6px;
  background:var(--accent);color:var(--brand-ink);font-size:11px;font-weight:700;
  cursor:pointer;opacity:0;pointer-events:none;transition:all .2s;
}
.btn-save-row.visible{opacity:1;pointer-events:auto}
.btn-save-row:hover{background:var(--accent-hover)}
.btn-save-row:active{transform:scale(.95)}
.btn-save-row.saving{background:var(--warning)}
.btn-save-row.done{background:var(--success);opacity:1;pointer-events:none}

/* Tooltip */
.tip-anchor{cursor:help;border-bottom:1px dotted var(--text-3)}
#floating-tip{
  position:fixed;
  width:max-content;max-width:280px;
  padding:10px 14px;border-radius:10px;
  background:#1f1914;border:1px solid var(--accent);
  box-shadow:0 8px 32px rgba(0,0,0,.5),0 0 0 1px var(--brand-ring);
  color:#e2e8f0;font-size:11px;font-weight:500;line-height:1.6;
  white-space:normal;text-align:left;
  opacity:0;visibility:hidden;
  transition:opacity .15s,visibility .15s;
  z-index:1200;pointer-events:none;
}
#floating-tip.show{opacity:1;visibility:visible}
#floating-tip .tip-title{font-size:12px;font-weight:700;color:var(--brand-tint);margin-bottom:4px}
#floating-tip .tip-desc{color:#cbd5e1}

/* Focus */
button:focus-visible,input:focus-visible,select:focus-visible{
  outline:2px solid var(--accent);outline-offset:2px;
}

/* Stale Warning */
.stale-warn{
  position:fixed;top:56px;left:50%;transform:translateX(-50%);
  padding:8px 20px;border-radius:10px;
  background:linear-gradient(135deg,#78350f,#92400e);color:#fbbf24;border:1px solid #b45309;
  font-size:12px;font-weight:700;z-index:700;
  box-shadow:0 4px 16px rgba(245,158,11,.2);
  animation:fadeIn .3s ease;
}
@keyframes fadeIn{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}

/* Phone Action Popup */
.phone-popup-overlay{
  position:fixed;inset:0;background:rgba(0,0,0,.5);
  display:flex;align-items:center;justify-content:center;
  z-index:1200;animation:fadeIn .2s ease;
}
.phone-popup{
  background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-lg);
  padding:24px;min-width:260px;max-width:320px;text-align:center;
  box-shadow:0 16px 48px rgba(0,0,0,.4);
}
.phone-popup-num{
  font-size:18px;font-weight:700;color:var(--text-1);margin-bottom:20px;
  letter-spacing:1px;
}
.phone-popup-actions{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}
.phone-popup-btn{
  display:flex;align-items:center;justify-content:center;gap:10px;
  padding:14px 16px;border-radius:12px;border:none;
  font-size:14px;font-weight:700;cursor:pointer;
  text-decoration:none;transition:all .15s;
}
.phone-popup-call{background:var(--success);color:#fff}
.phone-popup-call:hover{background:#059669}
.phone-popup-sms{background:var(--accent);color:var(--brand-ink)}
.phone-popup-sms:hover{background:var(--accent-hover)}
.phone-popup-copy{background:var(--bg-elevated);color:var(--text-1)}
.phone-popup-copy:hover{background:var(--border)}
.phone-popup-close{
  background:none;border:none;color:var(--text-3);font-size:13px;font-weight:600;
  cursor:pointer;padding:8px 16px;
}
.phone-popup-close:hover{color:var(--text-2)}
.light .phone-popup{background:#fff;border-color:#e2e8f0}
.light .phone-popup-num{color:#0f172a}
.light .phone-popup-copy{background:#e2e8f0;color:#334155}
.light .phone-popup-close{color:#94a3b8}

/* Toast */
.toast{
  position:fixed;top:60px;left:50%;transform:translateX(-50%);
  padding:10px 24px;border-radius:14px;font-size:13px;font-weight:700;
  box-shadow:0 8px 32px rgba(0,0,0,.25);z-index:1100;
}
.toast.ok{background:#065f46;color:#34d399;border:1px solid #047857}
.toast.fail{background:#7f1d1d;color:#fca5a5;border:1px solid #991b1b}

/* Reconnect */
.recon-overlay{
  position:fixed;inset:0;
  background:rgba(27,34,48,.75);
  display:flex;align-items:center;justify-content:center;z-index:1000;
}
.recon-box{text-align:center;color:var(--text-2);font-size:14px;font-weight:600}
.recon-logo{width:36px;height:36px;border-radius:8px;margin-bottom:12px;opacity:.7}

/* Splash (init overlay) branding */
.splash-box{
  display:flex;flex-direction:column;align-items:center;
  padding:30px 34px;
  border:1px solid var(--brand-soft-border);
  border-radius:28px;
  background:
    radial-gradient(circle at top, rgba(240,128,0,.16), transparent 52%),
    linear-gradient(180deg, rgba(24,18,14,.92), rgba(15,23,42,.88));
  box-shadow:0 24px 48px rgba(0,0,0,.28);
}
.splash-logo{
  width:64px;height:64px;border-radius:14px;margin-bottom:16px;animation:splashPulse 2s ease-in-out infinite;
  border:1px solid var(--brand-soft-border);
  box-shadow:var(--brand-logo-shadow);
}
.splash-brand{font-size:20px;font-weight:900;color:var(--text-1);margin-bottom:20px;letter-spacing:-.3px}
.splash-j1{color:var(--brand-primary);font-weight:900}
@keyframes splashPulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.85}}
.recon-sub{margin-top:8px;font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
.recon-spinner{
  width:42px;height:42px;margin:0 auto 16px;
  border:3px solid var(--border);border-top-color:var(--accent);
  border-radius:50%;animation:spin .75s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}

/* ===== Broadcasting State ===== */
.app.broadcasting .topbar{
  background:#1a1520;
  border-bottom-color:#3d2020;
}
/* ON AIR 배지는 conn-badge를 JS에서 직접 교체 — ::after 겹침 제거 */
@keyframes onair-pulse{0%,100%{opacity:1}50%{opacity:.5}}
.chip-onair{
  background:var(--error);color:#fff;
  font-size:10px;font-weight:700;letter-spacing:1px;
  animation:onair-pulse 1.5s ease-in-out infinite;
}
.light .chip-onair{background:var(--error);color:#fff}
.app.broadcasting .dashboard{
  border-top:2px solid rgba(239,68,68,.2);
}

/* ===== Disabled controls (broadcast lock) ===== */
.ctrl-card select:disabled,.ctrl-card input:disabled{
  opacity:.35;cursor:not-allowed;background:#1a2438;
}

/* ===== Value Flash ===== */
@keyframes valFlash{0%{background:var(--brand-ring)}100%{background:transparent}}
.sc-value.flash{animation:valFlash .5s ease}

/* ===== Sparkline ===== */
.sparkline{display:block;margin-top:3px;opacity:.6}
.sparkline polyline{fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}

/* ===== Event Timeline ===== */
.timeline{margin-bottom:16px}
.timeline h4{
  font-size:11px;font-weight:600;color:var(--text-2);
  padding:8px 12px;background:var(--bg-inset);
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;border:1px solid var(--border);border-bottom:none;
  text-transform:uppercase;letter-spacing:.4px;
}
.tl-list{max-height:200px;overflow-y:auto;border:1px solid var(--border);border-top:none;border-radius:0 0 var(--radius-sm) var(--radius-sm)}
.tl-list::-webkit-scrollbar{width:3px}
.tl-list::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
.tl-item{
  display:flex;align-items:center;gap:8px;
  padding:6px 12px;font-size:11px;
}
.tl-item:nth-child(odd){background:var(--bg-surface)}
.tl-item:nth-child(even){background:var(--bg-inset)}
.tl-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}
.tl-dot.ok{background:var(--success)}.tl-dot.err{background:var(--error)}.tl-dot.warn{background:var(--warning)}.tl-dot.info{background:var(--accent)}
.tl-time{color:var(--text-3);font-weight:600;font-variant-numeric:tabular-nums;min-width:55px}
.tl-msg{color:var(--text-2);flex:1}
.tl-empty{padding:16px;text-align:center;color:var(--text-3);font-size:11px;background:var(--bg-inset);border-radius:0 0 var(--radius-sm) var(--radius-sm);border:1px solid var(--border);border-top:none}

/* ===== Channel Sub-info ===== */
.ch-sub{font-size:9px;color:var(--text-3);margin-top:2px;font-variant-numeric:tabular-nums}
.ch-on .ch-sub{color:rgba(52,211,153,.5)}

/* ===== Empty State ===== */
.empty-state{
  padding:28px 16px;text-align:center;
  border:1px solid var(--border);border-top:none;border-radius:0 0 var(--radius-sm) var(--radius-sm);
  background:var(--bg-inset);
}
.empty-state svg{width:32px;height:32px;color:var(--border);margin-bottom:8px}
.empty-state p{font-size:12px;color:var(--text-3);font-weight:600}
.light .empty-state{background:#f8fafc;border-color:#e2e8f0}
.light .empty-state svg{color:#cbd5e1}
.light .empty-state p{color:#94a3b8}

/* ===== App Footer ===== */
.app-footer{
  text-align:center;padding:12px;
  font-size:10px;font-weight:500;color:var(--border);
  letter-spacing:.3px;
}
.light .app-footer{color:#cbd5e1}
@media print{.app-footer{color:#64748b;font-size:9px;border-top:1px solid #e2e8f0;margin-top:16px}}

/* ===== Mobile Bottom Nav ===== */
.bottom-nav{display:none}
@media (max-width:768px){
  .bottom-nav{
    display:flex;position:fixed;bottom:0;left:0;right:0;
    background:var(--bg-surface);border-top:1px solid var(--border);
    z-index:750;padding:4px 0;
    padding-bottom:env(safe-area-inset-bottom,4px);
  }
  .bnav-btn{
    flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;
    border:none;background:none;color:var(--text-3);font-size:8.5px;font-weight:700;
    padding:6px 0;cursor:pointer;transition:color .2s;
  }
  .bnav-btn svg{width:18px;height:18px}
  .bnav-btn.active{color:var(--accent)}
  .bnav-btn:active{color:var(--accent-hover)}
  .dashboard{padding-bottom:72px}
  .sp-body{padding-bottom:72px}
}

/* ===== Tab Icons ===== */
.sp-tab{display:flex;align-items:center;justify-content:flex-start;gap:8px}
.sp-tab svg{width:14px;height:14px;flex-shrink:0}

/* ===== Collapse/Expand Groups ===== */
.edit-group{margin-bottom:0}
.edit-group-header{
  display:flex;align-items:center;gap:8px;
  padding:9px 12px;cursor:pointer;
  background:var(--bg-inset);border:1px solid var(--border);border-bottom:none;
  font-size:11px;font-weight:600;color:var(--text-2);
  text-transform:uppercase;letter-spacing:.4px;
  transition:background .15s;user-select:none;
}
.edit-group:first-child .edit-group-header{border-radius:var(--radius-sm) var(--radius-sm) 0 0}
.edit-group:last-child .edit-group-header{border-bottom:1px solid var(--border);border-radius:0 0 var(--radius-sm) var(--radius-sm)}
.edit-group:last-child.open .edit-group-header{border-radius:0;border-bottom:none}
.edit-group-header:hover{background:var(--bg-elevated)}
.edit-group-header .arrow{
  display:inline-block;transition:transform .2s;font-size:9px;color:var(--text-3);
}
.edit-group.open .arrow{transform:rotate(90deg)}
.edit-group-header .grp-count{
  margin-left:auto;font-size:10px;color:var(--text-3);font-weight:500;
}
.edit-group-body{display:none}
.edit-group.open .edit-group-body{display:block}
.edit-group.open+.edit-group .edit-group-header{border-top:none}
.edit-group-body .edit-row:last-child{border-bottom:1px solid var(--border)}
.edit-group:last-child .edit-group-body .edit-row:last-child{border-radius:0 0 10px 10px}

/* ===== Toggle Switch ===== */
.toggle-section{margin-bottom:16px}
.toggle-section h4{
  font-size:11px;font-weight:600;color:var(--text-2);
  padding:8px 12px;background:var(--bg-inset);
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;border:1px solid var(--border);border-bottom:none;
  text-transform:uppercase;letter-spacing:.4px;
}
.toggle-row{
  display:flex;align-items:center;justify-content:space-between;
  padding:8px 12px;
  border-left:1px solid var(--border);border-right:1px solid var(--border);border-bottom:1px solid var(--border);
}
.toggle-row:nth-child(odd){background:var(--bg-surface)}
.toggle-row:nth-child(even){background:var(--bg-inset)}
.toggle-row:last-child{border-radius:0 0 10px 10px}
.toggle-info{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.toggle-name{min-width:0;font-size:12px;font-weight:600;color:var(--text-1);overflow-wrap:anywhere;word-break:break-word}
.toggle-desc{font-size:10px;color:var(--text-3);white-space:normal;overflow-wrap:anywhere;word-break:break-word}
.toggle-switch{position:relative;width:52px;height:28px;flex-shrink:0}
.toggle-switch input{opacity:0;width:0;height:0;position:absolute}
.toggle-slider{
  position:absolute;inset:0;cursor:pointer;
  background:#dc2626;border-radius:14px;transition:all .25s;
  box-shadow:inset 0 2px 4px rgba(0,0,0,.3);
}
.toggle-slider::before{
  content:'';position:absolute;
  left:3px;top:3px;width:22px;height:22px;
  background:#fff;border-radius:50%;transition:all .25s;
  box-shadow:0 1px 3px rgba(0,0,0,.3);
}
.toggle-slider::after{
  content:'OFF';position:absolute;right:6px;top:50%;transform:translateY(-50%);
  font-size:9px;font-weight:800;color:#fff;letter-spacing:.5px;
}
.toggle-switch input:checked+.toggle-slider{background:#10b981}
.toggle-switch input:checked+.toggle-slider::before{transform:translateX(24px)}
.toggle-switch input:checked+.toggle-slider::after{content:'ON';right:auto;left:7px}
.toggle-switch.saving .toggle-slider{background:#f59e0b!important}

/* ===== Schedule Preview ===== */
.sch-preview{margin-bottom:16px}
.sch-preview h4{
  font-size:11px;font-weight:600;color:var(--text-2);
  padding:8px 12px;background:var(--bg-inset);
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;border:1px solid var(--border);border-bottom:none;
  text-transform:uppercase;letter-spacing:.4px;
}
.sch-item{
  display:flex;align-items:center;gap:10px;
  padding:8px 12px;font-size:12px;
  border-left:1px solid var(--border);border-right:1px solid var(--border);border-bottom:1px solid var(--border);
}
.sch-item:nth-child(odd){background:var(--bg-surface)}
.sch-item:nth-child(even){background:var(--bg-inset)}
.sch-item:last-child{border-radius:0 0 10px 10px}
.sch-time{font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums;min-width:90px}
.sch-file{color:var(--text-3);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sch-badge{padding:2px 8px;border-radius:6px;font-size:10px;font-weight:700;background:var(--brand-soft);color:var(--accent)}
.sch-empty{
  padding:20px;text-align:center;color:var(--text-3);font-size:12px;font-weight:500;
  border:1px solid var(--border);border-top:none;border-radius:0 0 var(--radius-sm) var(--radius-sm);background:var(--bg-inset);
}

/* ===== Today Stats ===== */
.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:16px}
.stat-box{
  background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius-sm);
  padding:12px;text-align:center;
}
.stat-num{font-size:20px;font-weight:700;color:var(--text-1);line-height:1.2}
.stat-label{font-size:10px;font-weight:500;color:var(--text-3);margin-top:4px;text-transform:uppercase;letter-spacing:.3px}

/* ===== Light Theme ===== */
.light{
  --bg-app:#f6f1ea;
  --bg-surface:#fffdf9;
  --bg-card:#fffdf9;
  --bg-inset:#f3ece3;
  --bg-elevated:#ede2d6;
  --border:#e1d3c1;
  --border-subtle:#f7efe6;
  --text-1:#0f172a;
  --text-2:#5d5248;
  --text-3:#7a6d60;
  --brand-primary:#f08000;
  --brand-hover:#e06000;
  --brand-strong:#d94c00;
  --brand-soft:#fff0e1;
  --brand-soft-border:#edc9a2;
  --brand-ink:#18120e;
  --brand-ring:rgba(240,128,0,.16);
  --brand-tint:#c35a00;
  --brand-soft-hover:rgba(240,128,0,.16);
  --brand-press:rgba(240,128,0,.2);
  --brand-chip-bg:rgba(255,248,240,.92);
  --brand-chip-border:#edc9a2;
  --brand-gradient:linear-gradient(135deg, #ffb96e, var(--accent));
  --brand-gradient-strong:linear-gradient(90deg, #ffb96e, var(--accent), var(--brand-strong));
  --brand-surface-dark:linear-gradient(180deg, rgba(255,250,244,.98), rgba(247,239,230,.97));
  --brand-surface-light:linear-gradient(180deg, rgba(255,249,242,.98), rgba(249,241,231,.97));
  --brand-hero-surface:linear-gradient(135deg, rgba(240,128,0,.11), rgba(255,252,248,.98) 42%, rgba(249,241,231,.96));
  --brand-logo-shadow:0 8px 18px rgba(240,128,0,.12);
  --accent:var(--brand-primary);
  --accent-hover:var(--brand-hover);
  --success:#059669;
  --success-soft:rgba(5,150,105,.10);
  --error:#dc2626;
  --error-soft:rgba(220,38,38,.08);
  --warning:#d97706;
  --shadow-sm:0 1px 3px rgba(49,33,16,.07);
  --shadow-md:0 2px 8px rgba(49,33,16,.08);
  --shadow-lg:0 8px 24px rgba(49,33,16,.10);
  background:var(--bg-app);color:var(--text-1);
}
.light .topbar{background:var(--bg-surface);border-bottom:1px solid var(--border);box-shadow:0 1px 3px rgba(0,0,0,.06)}
.light .topbar-title{color:var(--text-1)}
.light .brand-name{color:var(--brand-strong)}
.light .topbar-clock{color:var(--text-3)}
.light .topbar-divider{background:var(--border)}
.light .chip-phone{background:var(--accent);color:var(--brand-ink)}
.light .topbar .chip-green{
  border-color:rgba(5,150,105,.14);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.55), 0 8px 16px rgba(5,150,105,.06);
}
.light .icon-btn{background:var(--bg-inset);color:var(--text-3)}
.light .icon-btn:hover{background:var(--bg-elevated);color:var(--text-1)}
.light .status-card{background:var(--bg-surface);border-color:var(--border);box-shadow:0 1px 4px rgba(0,0,0,.06)}
.light .sc-label{color:var(--text-3)}
.light .sc-icon-green{background:rgba(5,150,105,.08);color:var(--success)}
.light .sc-icon-orange{background:rgba(217,119,6,.08);color:var(--warning)}
.light .sc-icon-blue{background:var(--brand-soft);color:var(--brand-strong)}
.light .sc-icon-purple{background:var(--brand-soft);color:var(--brand-strong)}
.light .sc-value{color:var(--text-1)}
.light .sc-sub{color:var(--text-3)}
.light .sc-dot.dim{background:var(--border)}
.light .sc-dot.ok{background:var(--success);box-shadow:0 0 0 2px rgba(5,150,105,.08)}
.light .glass-card{background:var(--bg-surface);border-color:var(--border);box-shadow:var(--shadow-sm)}
.light .conn-card{background:rgba(248,242,235,.66);border:1px solid rgba(225,211,193,.42)}
.light .conn-card-head{color:var(--text-2)}
.light .conn-label{color:var(--text-3)}
.light .conn-val{color:var(--text-1)}
.light .device-strip{
  background:
    var(--brand-hero-surface),
    rgba(255,255,255,.92);
  border-color:var(--brand-soft-border);
  box-shadow:0 14px 26px rgba(49,33,16,.08), inset 0 1px 0 rgba(255,255,255,.6);
}
.light .device-strip-number{
  color:#0f172a;
  text-shadow:none;
}
.light .device-meta-chip{
  background:var(--brand-chip-bg);
  border-color:var(--brand-chip-border);
}
.light .device-action-btn{
  background:var(--brand-soft);
  border-color:var(--brand-soft-border);
  color:var(--brand-strong);
  box-shadow:0 10px 20px rgba(240,128,0,.08), inset 0 1px 0 rgba(255,255,255,.55);
}
.light .device-action-note{
  color:var(--text-2);
}
.light .device-signal-panel{
  border-left-color:rgba(225,211,193,.62);
}
.light .device-id-rssi{
  color:#334155;
}
.light .bc-summary{background:rgba(241,245,249,.5);border:none}
.light .bc-summary-item{color:var(--text-3)}
.light .bc-summary-val{color:var(--text-1)}
.light .gc-title{color:var(--text-3)}
.light .ch-on{background:rgba(5,150,105,.06);color:var(--success);border-color:rgba(5,150,105,.15)}
.light .ch-off{background:var(--bg-inset);color:var(--text-3);border-color:var(--border)}
.light .ch-off .ch-led{background:var(--border)}
.light .ch-unused{background:var(--bg-inset);color:#94a3b8;border-color:var(--bg-elevated)}
.light .ch-unused .ch-led{background:#cbd5e1}
.light .ch-unused .ch-sub{color:#94a3b8}
.light .ch-err{background:rgba(220,38,38,.04);color:var(--error);border-color:rgba(220,38,38,.15)}
.light .ch-err .ch-led{background:var(--error)}
.light .ch-err .ch-sub{color:var(--error)}
.light .ch-sub{color:var(--text-3)}
.light .ch-on .ch-sub{color:rgba(5,150,105,.6)}
.light .bc-item{background:rgba(241,245,249,.5);border:none}
.light .bc-name{color:var(--text-3)}
.light .bc-ready-tag{background:rgba(5,150,105,.08);color:var(--success)}
.light .bc-indicator{border-color:var(--border)}
.light .bc-indicator-inner{background:var(--border)}
.light .bc-item.bc-ready .bc-indicator{border-color:var(--success)}
.light .bc-item.bc-ready .bc-indicator-inner{background:var(--success)}
.light .ctrl-card{background:var(--bg-surface);border-color:var(--border)}
.light .ctrl-right{border-top-color:var(--border)}
.light .ctrl-label{color:var(--text-3)}
.light .seg-bar{background:var(--bg-inset)}
.light .seg{color:var(--text-3)}
.light .seg-on{color:var(--text-1)}
.light .seg-slider{background:var(--bg-surface);box-shadow:0 1px 3px rgba(0,0,0,.08)}
.light select{background:var(--bg-surface);color:var(--text-1);border-color:var(--border)}
.light .side-panel{background:var(--bg-surface);border-left-color:var(--border)}
.light .sp-head{border-bottom-color:var(--border)}
.light .sp-head h2{color:var(--text-1)}
.light .sp-tabs{background:var(--bg-inset)}
.light .sp-tab{color:var(--text-3)}
.light .sp-tab-copy small{color:var(--text-3)}
.light .sp-tab-on{
  background:var(--brand-soft);
  color:var(--brand-strong);
  box-shadow:inset 0 0 0 1px var(--brand-soft-border), 0 1px 3px rgba(0,0,0,.06);
}
.light .panel-dim{background:rgba(0,0,0,.15)}
.light .panel-intro,
.light .status-brief-card,
.light .status-summary-card,
.light .status-control-card{
  background:var(--brand-surface-light);
  border-color:var(--border);
}
.light .panel-intro-kicker,
.light .status-brief-kicker,
.light .status-summary-kicker{color:var(--brand-strong)}
.light .panel-intro-desc,
.light .status-brief-desc,
.light .status-brief-meta,
.light .status-summary-meta{color:var(--text-3)}
.light .status-summary-item{
  background:rgba(255,250,245,.95);
  border-color:rgba(225,211,193,.52);
}
.light .ini-table{border-color:var(--border)}
.light .ini-table h4,.light .edit-section-header,.light .edit-group-header,.light .toggle-section h4,.light .sch-preview h4,.light .timeline h4{background:var(--bg-inset);color:var(--text-2);border-color:var(--border)}
.light .ini-row{border-top-color:var(--border)}
.light .ini-row:nth-child(odd){background:var(--bg-inset)}
.light .ini-row:nth-child(even){background:var(--bg-surface)}
.light .ini-key,.light .edit-key{color:var(--text-2)}
.light .ini-val{color:var(--text-1)}
.light .edit-row{border-color:var(--border)}
.light .edit-row:nth-child(odd){background:var(--bg-inset)}
.light .edit-row:nth-child(even){background:var(--bg-surface)}
.light .edit-input{background:var(--bg-surface);border-color:var(--border);color:var(--text-1)}
.light .edit-group-header{background:var(--bg-inset);border-color:var(--border)}
.light .edit-group-header:hover{background:var(--bg-elevated)}
.light .edit-group-header .arrow,.light .edit-group-header .grp-count{color:var(--text-3)}
.light .toggle-row{border-color:var(--border)}
.light .toggle-row:nth-child(odd){background:var(--bg-inset)}
.light .toggle-row:nth-child(even){background:var(--bg-surface)}
.light .toggle-name{color:var(--text-1)}
.light .toggle-desc{color:var(--text-3)}
.light .toggle-slider{background:#f87171}
.light .toggle-slider::before{background:#fff}
.light .stat-box{background:var(--bg-surface);border-color:var(--border)}
.light .stat-num{color:var(--text-1)}
.light .stat-label{color:var(--text-2)}
.light .tl-item:nth-child(odd){background:var(--bg-inset)}
.light .tl-item:nth-child(even){background:var(--bg-surface)}
.light .tl-list{border-color:var(--border)}
.light .tl-time{color:var(--text-3)}
.light .tl-msg{color:var(--text-2)}
.light .tl-empty{background:var(--bg-inset);border-color:var(--border);color:var(--text-3)}
.light .sch-item{border-color:var(--border)}
.light .sch-item:nth-child(odd){background:var(--bg-inset)}
.light .sch-item:nth-child(even){background:var(--bg-surface)}
.light .sch-time{color:var(--brand-strong)}
.light .sch-file{color:var(--text-2)}
.light .sch-empty{background:var(--bg-inset);border-color:var(--border);color:var(--text-3)}
.light .edit-group-body .edit-row:last-child{border-color:var(--border)}
.light #floating-tip{background:var(--bg-surface);border-color:var(--brand-soft-border);box-shadow:var(--shadow-lg)}
.light #floating-tip .tip-title{color:var(--brand-strong)}
.light #floating-tip .tip-desc{color:var(--text-2)}
.light .toast.ok{background:#ecfdf5;color:var(--success);border-color:#a7f3d0}
.light .toast.fail{background:#fef2f2;color:var(--error);border-color:#fecaca}
.light .stale-warn{background:#fffbeb;color:var(--warning);border-color:#fde68a}
.light .recon-overlay{background:rgba(246,241,234,.86)}
.light .recon-box{color:var(--text-2)}
.light .recon-spinner{border-color:var(--border);border-top-color:var(--brand-strong)}
.light .bottom-nav{background:var(--bg-surface);border-top-color:var(--border)}
.light .bnav-btn{color:var(--text-3)}
.light .bnav-btn.active{color:var(--brand-strong)}
.light .error-banner{background:rgba(220,38,38,.08);color:var(--error);border-bottom:1px solid rgba(220,38,38,.15)}
.light .error-banner svg{color:var(--error)}
.light .app.broadcasting .topbar{background:#fef8f8;border-bottom-color:rgba(220,38,38,.15)}

/* ===== Volume Slider (설정 에디터용 — 소스별 기본 음량 기준 통일) ===== */
.vol-slider-row{display:flex;align-items:center;gap:8px}
.vol-slider-row input[type="range"]{
  flex:1;height:4px;-webkit-appearance:none;appearance:none;
  background:rgba(148,163,184,.18);border-radius:2px;outline:none;cursor:pointer;
}
.vol-slider-row input[type="range"]::-webkit-slider-thumb{
  -webkit-appearance:none;width:14px;height:14px;border-radius:50%;
  background:var(--text-2);border:none;cursor:pointer;
  box-shadow:0 1px 3px rgba(0,0,0,.2);
  transition:transform .12s,box-shadow .12s;
}
.vol-slider-row input[type="range"]::-webkit-slider-thumb:hover{
  transform:scale(1.15);box-shadow:0 1px 5px rgba(0,0,0,.28);
}
.vol-slider-row .vol-val{
  min-width:28px;text-align:center;font-size:11px;font-weight:600;color:var(--text-2);
  font-variant-numeric:tabular-nums;
}
.light .vol-slider-row input[type="range"]{background:rgba(100,116,139,.12)}
.light .vol-slider-row input[type="range"]::-webkit-slider-thumb{background:var(--text-3);border:none;box-shadow:0 1px 3px rgba(0,0,0,.12)}
.light .vol-slider-row .vol-val{color:var(--text-1)}
.light .ctrl-card select:disabled,.light .ctrl-card input:disabled{background:var(--bg-inset);opacity:.35}

/* ===== Ment Preview ===== */
.ment-play-btn{
  padding:3px 8px;border:none;border-radius:6px;
  background:var(--accent);color:var(--brand-ink);font-size:10px;font-weight:700;
  cursor:pointer;transition:all .15s;display:inline-flex;align-items:center;gap:3px;
}
.ment-play-btn:hover{background:var(--accent-hover)}
.ment-play-btn:active{transform:scale(.95)}
.ment-play-btn.playing{background:var(--error)}
.ment-play-btn svg{width:10px;height:10px}

/* ===== Edit Search ===== */
.edit-search{
  flex:1;min-width:0;padding:6px 10px;border:1px solid var(--border);border-radius:6px;
  background:var(--bg-surface);color:var(--text-1);font-size:12px;outline:none;
}
.edit-search::placeholder{color:var(--text-3)}
.edit-search:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--brand-ring)}
.light .edit-search{background:var(--bg-surface);border-color:var(--border);color:var(--text-1)}
.light .edit-search::placeholder{color:var(--text-3)}
.edit-row.search-hidden{display:none}
.edit-group.search-empty{display:none}

/* ===== 공통 컴포넌트: 2차 서브탭 ===== */
/* 모든 하위 탭(관리, 로그, 음원 등)에 동일 스타일 적용 */
.sub-tabs,.tel-tabs,.log-tabs,.music-tabs,.manage-tabs{
  display:flex;gap:2px;margin-bottom:14px;flex-wrap:wrap;
  background:var(--bg-inset);border-radius:var(--radius-sm);padding:3px;
}
.sub-tab,.tel-tab,.log-tab,.music-tab,.manage-tab{
  flex:1 1 96px;min-width:0;padding:7px 10px;border:none;border-radius:6px;
  background:transparent;color:var(--text-3);
  font-size:11px;font-weight:600;cursor:pointer;
  text-align:center;line-height:1.35;white-space:normal;overflow-wrap:anywhere;word-break:keep-all;transition:all .15s;
}
.sub-tab:hover,.tel-tab:hover,.log-tab:hover,.music-tab:hover,.manage-tab:hover{color:var(--text-2)}
.sub-tab-on,.tel-tab-on,.log-tab-on,.music-tab-on,.manage-tab-on{
  background:var(--brand-soft);
  color:var(--accent);
  box-shadow:inset 0 0 0 1px var(--brand-soft-border), var(--shadow-sm);
}
.light .sub-tab,.light .tel-tab,.light .log-tab,.light .music-tab,.light .manage-tab{color:var(--text-3)}
.light .sub-tab-on,.light .tel-tab-on,.light .log-tab-on,.light .music-tab-on,.light .manage-tab-on{
  background:var(--brand-soft);
  color:var(--brand-strong);
  box-shadow:inset 0 0 0 1px var(--brand-soft-border), 0 1px 3px rgba(0,0,0,.06);
}

/* ===== 공통 컴포넌트: 섹션 제목 ===== */
.sec-title{
  font-size:10px;font-weight:600;color:var(--text-3);
  text-transform:uppercase;letter-spacing:.5px;
  margin:0 0 12px;padding:0;
}

/* ===== 공통 컴포넌트: 필터 바 ===== */
.filter-bar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:10px 14px;margin-bottom:12px;
  background:var(--bg-inset);border-radius:var(--radius-sm);
}
.filter-bar label{font-size:11px;font-weight:600;color:var(--text-3)}
.filter-bar input,.filter-bar select{
  padding:6px 10px;border:1px solid var(--border);border-radius:6px;
  background:var(--bg-surface);color:var(--text-1);font-size:12px;font-family:inherit;
}
.filter-bar input:focus,.filter-bar select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--brand-ring)}
.filter-bar .filter-btn{
  padding:6px 16px;border:none;border-radius:6px;
  background:var(--accent);color:var(--brand-ink);font-size:11px;font-weight:700;cursor:pointer;
}
.filter-bar .filter-btn:hover{opacity:.9}
.filter-bar .filter-btn-outline{
  padding:5px 14px;border:1px solid var(--border);border-radius:6px;
  background:transparent;color:var(--text-2);font-size:11px;font-weight:600;cursor:pointer;
}
.filter-bar .filter-btn-outline:hover{background:var(--brand-soft);color:var(--accent);border-color:var(--brand-soft-border)}
.light .filter-bar{background:var(--bg-inset)}
.light .filter-bar input,.light .filter-bar select{background:var(--bg-surface);border-color:var(--border)}

/* ===== 공통 컴포넌트: 데이터 테이블 ===== */
.data-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--radius-sm);border:1px solid var(--border)}
.data-table{width:100%;border-collapse:collapse;font-size:11.5px;white-space:nowrap}
.data-table thead{position:sticky;top:0;z-index:2}
.data-table th{
  background:var(--bg-inset);color:var(--text-3);font-weight:600;
  text-transform:uppercase;letter-spacing:.3px;
  padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);font-size:10px;
}
.data-table td{padding:7px 10px;border-bottom:1px solid rgba(225,211,193,.14);color:var(--text-2)}
.data-table tbody tr:hover{background:var(--brand-soft)}
.data-table tbody tr:nth-child(even){background:var(--bg-inset)}
.data-table tbody tr:nth-child(even):hover{background:var(--brand-soft)}
.light .data-table-wrap{border-color:var(--border)}
.light .data-table th{background:var(--bg-inset);color:var(--text-3);border-bottom-color:var(--border)}
.light .data-table td{color:var(--text-2);border-bottom-color:rgba(0,0,0,.04)}
.light .data-table tbody tr:nth-child(even){background:rgba(249,242,235,.78)}

/* ===== 공통 컴포넌트: 폼 카드 ===== */
.form-card{
  margin-top:14px;padding:14px;
  border:1px solid var(--border);border-radius:var(--radius-sm);
  background:var(--bg-inset);
}
.form-card-title{margin:0 0 10px;font-size:11px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.3px}
.form-row{display:flex;align-items:center;gap:8px;min-width:0;margin-bottom:8px}
.form-row label{min-width:40px;flex-shrink:0;font-size:11px;font-weight:600;color:var(--text-3)}
.form-row input,.form-row select{
  flex:1;min-width:0;padding:7px 10px;border:1px solid var(--border);border-radius:6px;
  background:var(--bg-surface);color:var(--text-1);font-size:12px;font-family:inherit;outline:none;
}
.form-row input:focus,.form-row select:focus{border-color:var(--accent);box-shadow:0 0 0 2px var(--brand-ring)}
.form-row input::placeholder{color:var(--text-3)}
.form-actions{display:flex;gap:8px;margin-top:10px}
.light .form-card{background:var(--bg-inset);border-color:var(--border)}
.light .form-row input,.light .form-row select{background:var(--bg-surface);border-color:var(--border);color:var(--text-1)}

/* ===== 공통 컴포넌트: 버튼 체계 ===== */
.btn-primary{
  padding:7px 18px;border:none;border-radius:6px;
  background:var(--accent);color:var(--brand-ink);font-size:12px;font-weight:700;cursor:pointer;
}
.btn-primary:hover{background:var(--accent-hover)}
.btn-secondary{
  padding:7px 18px;border:1px solid var(--border);border-radius:6px;
  background:transparent;color:var(--text-2);font-size:12px;font-weight:600;cursor:pointer;
}
.btn-secondary:hover{background:var(--bg-elevated);color:var(--text-1)}
.btn-destructive{
  padding:7px 18px;border:none;border-radius:6px;
  background:var(--error);color:#fff;font-size:12px;font-weight:600;cursor:pointer;
}
.btn-destructive:hover{background:#b91c1c}

/* ===== 공통 컴포넌트: 상태 배지 ===== */
.badge{
  display:inline-block;padding:2px 8px;border-radius:10px;
  font-size:10px;font-weight:600;white-space:nowrap;
}
.badge-success{background:var(--success-soft);color:var(--success)}
.badge-error{background:var(--error-soft);color:var(--error)}
.badge-warning{background:rgba(245,158,11,.12);color:var(--warning)}
.badge-muted{background:var(--bg-elevated);color:var(--text-3)}

/* ===== 공통 컴포넌트: 빈 상태 ===== */
.empty-panel{
  padding:32px 16px;text-align:center;
  color:var(--text-3);font-size:12px;font-weight:500;
}

/* ===== 레거시 호환: Tel/Log/Music Sub-tabs ===== */
/* 위 공통 서브탭 규칙을 상속하되 기존 클래스명 유지 */

/* Tel Table (공통 data-table 확장) */
.tel-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--radius-sm);border:1px solid var(--border)}
.tel-table{width:100%;border-collapse:collapse;font-size:11px;white-space:nowrap}
.tel-table th{text-align:left;padding:8px 10px;color:var(--text-3);font-weight:600;font-size:10px;text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--border);background:var(--bg-inset)}
.tel-table td{padding:7px 10px;border-bottom:1px solid rgba(225,211,193,.14);color:var(--text-2)}
.tel-table tbody tr:hover{background:var(--brand-soft)}
.tel-table tbody tr:nth-child(even){background:var(--bg-inset)}
.tel-num{font-weight:700;color:var(--accent);font-variant-numeric:tabular-nums}
.tel-ban{padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600;white-space:nowrap}
.tel-ban.banned{background:var(--error-soft);color:var(--error)}
.tel-ban:not(.banned){background:var(--success-soft);color:var(--success)}
.light .tel-table th{border-color:var(--border);background:var(--bg-inset)}
.light .tel-table td{border-color:rgba(0,0,0,.04);color:var(--text-2)}
.light .tel-table tbody tr:nth-child(even){background:rgba(249,242,235,.78)}

/* Log Container */
.log-container{min-height:100px}
.log-empty{padding:32px;text-align:center;color:var(--text-3);font-size:12px}

/* Music List */
.music-list{display:flex;flex-direction:column;gap:2px}
.music-item{
  display:flex;align-items:center;justify-content:space-between;
  gap:10px;min-width:0;padding:8px 12px;border-radius:6px;background:var(--bg-inset);
}
.music-item:nth-child(even){background:var(--bg-surface)}
.music-name{font-size:11px;font-weight:600;color:var(--text-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.light .music-item{background:var(--bg-inset)}
.light .music-item:nth-child(even){background:var(--bg-surface)}
.light .music-name{color:var(--text-1)}

/* ===== Batch Save Button ===== */
#btn-save-all{background:var(--success);border-radius:6px;color:#fff;padding:4px 8px;position:relative}
#btn-save-all::after{
  content:attr(data-count);position:absolute;top:-6px;right:-6px;
  background:var(--error);color:#fff;font-size:9px;font-weight:700;
  min-width:16px;height:16px;border-radius:8px;display:flex;align-items:center;justify-content:center;
}
#btn-save-all[data-count="0"]::after,#btn-save-all:not([data-count])::after{display:none}

/* ===== Change History Panel ===== */
.history-panel{
  position:absolute;top:0;left:0;right:0;bottom:0;z-index:20;
  background:var(--bg-app);overflow-y:auto;border-radius:var(--radius-md);
}
.history-panel.hidden{display:none}
.history-header{
  display:flex;justify-content:space-between;align-items:center;
  padding:12px 16px;border-bottom:1px solid var(--border);font-weight:700;font-size:14px;
  position:sticky;top:0;background:var(--bg-app);z-index:1;
}
.history-list{padding:8px 12px}
.history-item{
  padding:8px 10px;border-bottom:1px solid var(--border);font-size:11px;
  display:flex;flex-direction:column;gap:2px;
}
.history-item .h-time{color:var(--text-3);font-size:10px}
.history-item .h-key{color:var(--accent);font-weight:600}
.history-item .h-val{color:var(--text-2)}
.history-item .h-val b{color:var(--text-1);font-weight:600}
.history-empty{padding:32px;text-align:center;color:var(--text-3);font-size:13px}
.light .history-panel{background:#fff}
.light .history-header{background:#fff;border-color:#e2e8f0;color:#0f172a}
.light .history-item{border-color:#e2e8f0}
.light .history-item .h-time{color:#94a3b8}
.light .history-item .h-key{color:var(--brand-strong)}
.light .history-item .h-val{color:#64748b}
.light .history-item .h-val b{color:#1e293b}
.light .history-empty{color:#94a3b8}

/* ===== Responsive — Large screens ===== */
@media (min-width:1281px){
  .dashboard{padding:12px 48px}
  .conn-grid{gap:12px}
  .channels-card{flex:0 0 auto;min-width:480px;margin-right:24px}
  .mid-section{gap:0}
  .side-panel{width:540px}
  .ctrl-card{padding:24px 28px}
}
@media (min-width:1600px){
  .dashboard{padding:16px 80px}
  .conn-grid{gap:14px}
  .sc-value{font-size:22px}
  .ch-item{padding:28px 10px;font-size:14px}
  .bc-item{padding:24px 16px}
  .ctrl-card{padding:28px 36px}
}
@media (min-width:1920px){
  .dashboard{padding:24px 140px}
  .channels-card{min-width:560px}
  .sc-icon{width:52px;height:52px}
  .side-panel{width:600px}
}

/* ===== Responsive — Mobile (≤768px) ===== */
@media (max-width:768px){
  html,body{overflow-y:auto;overflow-x:hidden}
  .app{height:auto;min-height:100vh}

  /* Topbar */
  .topbar{height:48px;padding:0 14px}
  .topbar-left{gap:8px}
  .topbar-logo{width:24px;height:24px}
  .topbar-title{font-size:14px}
  .topbar-divider{display:none}
  .topbar-clock{font-size:11px;margin-left:4px}
  .topbar-right{gap:6px}
  .chip{padding:4px 10px;font-size:10px}
  .chip-phone{font-size:11px;padding:5px 12px}
  #conn-badge{font-size:10px;padding:4px 8px}
  .icon-btn{width:32px;height:32px}
  .icon-btn svg{width:16px;height:16px}

  /* Error banner */
  .error-banner{padding:5px 14px;font-size:11px}

  /* Dashboard */
  .dashboard{padding:10px 12px;gap:10px;justify-content:flex-start}

  /* Conn grid: 2-col on tablet, 1-col on phone */
  .conn-grid{grid-template-columns:repeat(2,1fr);gap:8px}
  .conn-card{padding:12px 14px}
  .device-strip{padding:12px 14px}
  .device-strip-number{font-size:24px}
  .device-strip-meta{gap:6px}
  .device-meta-chip{max-width:100%}
  .device-strip-actions{align-items:flex-start}
  .device-action-btn{width:100%;justify-content:center}
  .device-signal-panel{padding-top:8px}

  /* Mid section: vertical stack */
  .mid-section{flex-direction:column;gap:10px}
  .channels-card{flex:none;margin-right:0}
  .glass-card{padding:14px 12px;border-radius:12px}
  .gc-title{font-size:10px;margin-bottom:10px}

  /* Channels: horizontal scroll or wrap */
  .ch-list{gap:6px;flex-wrap:wrap}
  .ch-item{padding:12px 6px;border-radius:8px;font-size:11px;gap:6px;min-width:0;flex:1 1 28%}

  /* Broadcast groups */
  .bc-grid{gap:8px}
  .bc-item{padding:14px 8px;border-radius:10px;min-height:95px}
  .bc-indicator{width:24px;height:24px;margin-bottom:6px}
  .bc-indicator-inner{width:8px;height:8px}
  .bc-name{font-size:9px;margin-bottom:4px}
  .bc-tag{padding:3px 12px;font-size:10px}
  .bc-dur{font-size:11px;margin-top:4px}

  /* Controls: stack vertically */
  .ctrl-card{flex-direction:column;gap:14px;padding:14px 12px}
  .ctrl-left{flex-direction:column;gap:10px;width:100%}
  .ctrl-group{width:100%;justify-content:space-between}
  .ctrl-label{min-width:36px;font-size:11px}
  .seg{padding:10px 16px;font-size:11px;min-height:40px}
  .seg-bar{border-radius:10px;padding:3px}
  select{min-height:36px;font-size:12px;flex:1}
  .ctrl-field{width:min(200px,60%);flex-shrink:0}
  .ctrl-field-head{gap:8px}
  .ctrl-right{width:100%;justify-content:center;gap:12px;border-top:1px solid var(--border);padding-top:8px}
  .big-btn{width:100%;height:48px;flex-direction:row;border-radius:10px;gap:8px;flex:1;font-size:13px}
  .big-btn svg{width:18px;height:18px}
  .bc-active-banner{padding:10px 12px;gap:8px;margin:0 8px 6px;border-radius:10px;top:48px;flex-wrap:wrap}
  .bc-active-banner svg{width:18px;height:18px}
  .bc-banner-type{font-size:12px}
  .bc-banner-detail{font-size:11px}
  .bc-banner-timer{font-size:13px}

  /* Side panel: full width */
  .side-panel{width:100%}
  .sp-head{padding:12px 14px}
  .sp-head h2{font-size:15px}
  .sp-tabs{margin:10px 12px 0}
  .sp-tab{font-size:11px;padding:9px 8px;align-items:flex-start}
  .sp-tab-copy strong{font-size:10px}
  .sp-tab-copy small{display:none}
  .sp-body{padding:10px 12px 14px}

  /* INI tables */
  .ini-key{flex:0 0 110px;font-size:10px}
  .ini-val{font-size:11px}
  .ini-row{padding:6px 10px}
  .ini-table h4{font-size:11px;padding:8px 10px}
  .panel-intro,
  .status-brief-card,
  .status-summary-card,
  .status-control-card{padding:12px}
  .panel-intro-title{font-size:19px}
  .status-brief-grid,
  .status-summary-grid{grid-template-columns:1fr}

  /* Edit */
  .edit-key{flex:0 0 100px;font-size:10px}
  .edit-input{font-size:11px;padding:5px 8px}
  .btn-save-row{padding:4px 10px;font-size:10px}
  .edit-row{padding:4px 10px;gap:6px}

  /* Toggle */
  .toggle-name{font-size:11px}
  .toggle-desc{font-size:9px}

  /* Stats */
  .stats-grid{grid-template-columns:repeat(3,1fr);gap:6px}
  .stat-num{font-size:16px}
  .stat-label{font-size:9px}

  /* Toast / Stale */
  .toast{top:52px;font-size:12px;padding:8px 16px}
  .stale-warn{top:52px;right:12px;font-size:10px;padding:4px 10px}

  /* Tooltip: wider on mobile */
  #floating-tip{max-width:240px;font-size:10px}
}

/* ===== Responsive — Small phones (≤400px) ===== */
@media (max-width:400px){
  .dashboard{padding:8px 8px;gap:8px}
  .conn-grid{grid-template-columns:1fr;gap:6px}
  .conn-card{padding:10px 12px}
  .device-strip-number{font-size:21px}
  .ch-item{padding:10px 4px;font-size:10px;flex:1 1 40%}
  .bc-item{padding:10px 6px}
  .seg{padding:7px 10px;font-size:10px}
  .topbar-title{font-size:13px}
  .topbar-clock{display:none}
  .chip-phone{font-size:10px;padding:4px 10px}
  #conn-badge{font-size:10px;padding:4px 8px}
}
