/* ── CSS Variables ── */
:root {
  --bg: #f0f4f8; --bg-gradient: linear-gradient(135deg, #f0f4f8 0%, #e2e8f0 100%);
  --card-bg: #ffffff; --card-bg-2: #f8fafc;
  --text: #1e293b; --text2: #64748b; --text3: #94a3b8; --text4: #cbd5e1;
  --border: #e2e8f0; --border2: #cbd5e1;
  --accent: #4f6ef7; --accent2: #3b56d4; --accent-light: #eef1ff;
  --red: #e53e3e; --red-light: #fef2f2;
  --green: #16a34a; --green-light: #f0fdf4;
  --orange: #ea580c; --orange-light: #fff7ed;
  --yellow: #ca8a04; --yellow-light: #fefce8;
  --blue: #2563eb; --blue-light: #eff6ff;
  --purple: #7c3aed; --purple-light: #f5f3ff;
  --teal: #0d9488; --teal-light: #f0fdfa;
  --gray: #6b7280;
  --toggle-off: #ccc; --toggle-disabled: #d0d0d0; --toggle-disabled-knob: #e8e8e8;
  --saved-ok: #22c55e;
  --src1-bg: linear-gradient(135deg, #eff6ff, #dbeafe); --src1-color: #1e40af; --src1-border: #bfdbfe; --src1-icon-bg: #bfdbfe; --src1-icon-color: #1e40af;
  --src2-bg: linear-gradient(135deg, #fef3c7, #fde68a); --src2-color: #92400e; --src2-border: #fcd34d; --src2-icon-bg: #fcd34d; --src2-icon-color: #92400e;
  --radius: 12px; --radius-sm: 8px;
  --shadow-sm: 0 1px 2px rgba(0,0,0,.04);
  --shadow: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
  --shadow-md: 0 4px 12px rgba(0,0,0,.07), 0 1px 3px rgba(0,0,0,.05);
  --shadow-lg: 0 10px 25px rgba(0,0,0,.08), 0 3px 6px rgba(0,0,0,.04);
  --transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0b1120; --bg-gradient: linear-gradient(135deg, #0b1120 0%, #131e33 100%);
    --card-bg: #1a2236; --card-bg-2: #151d30;
    --text: #e2e8f0; --text2: #94a3b8; --text3: #64748b; --text4: #475569;
    --border: #2d3748; --border2: #3d4f6b;
    --accent: #6d8afb; --accent2: #5b78e4; --accent-light: #1a2340;
    --red-light: #2d1111; --green-light: #0d2616; --orange-light: #2d1a0a; --yellow-light: #2d2508;
    --blue-light: #0f1d35; --purple-light: #1c1235; --teal-light: #042f2e;
    --toggle-off: #3d4f6b; --toggle-disabled: #2d3748; --toggle-disabled-knob: #475569;
    --saved-ok: #4ade80;
    --src1-bg: linear-gradient(135deg, #1e3a5f, #1a3352); --src1-color: #93c5fd; --src1-border: #1e3a5f; --src1-icon-bg: #93c5fd; --src1-icon-color: #1e3a5f;
    --src2-bg: linear-gradient(135deg, #5a3e1b, #4d3516); --src2-color: #fcd34d; --src2-border: #5a3e1b; --src2-icon-bg: #fcd34d; --src2-icon-color: #5a3e1b;
    --shadow-sm: 0 1px 2px rgba(0,0,0,.2);
    --shadow: 0 1px 3px rgba(0,0,0,.25);
    --shadow-md: 0 4px 12px rgba(0,0,0,.35);
    --shadow-lg: 0 10px 25px rgba(0,0,0,.4);
  }
}

/* ── Reset & Base ── */
* { margin:0; padding:0; box-sizing:border-box; }
body {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
  background: var(--bg); color: var(--text); min-height:100vh; line-height:1.6;
  -webkit-font-smoothing: antialiased;
}

/* ── Header ── */
.header {
  background: var(--card-bg); border-bottom:1px solid var(--border);
  padding:0 28px; height:58px; display:flex; align-items:center;
  justify-content:space-between; position:sticky; top:0; z-index:100;
  box-shadow: var(--shadow-sm); backdrop-filter: blur(8px);
}
.header-brand { display:flex; align-items:center; gap:10px; }
.header-logo {
  width:28px; height:28px; border-radius:8px;
  background: linear-gradient(135deg, var(--accent), var(--accent2));
  display:flex; align-items:center; justify-content:center;
  color:#fff; font-size:14px; font-weight:700; line-height:1;
}
.header h1 { font-size:1.1rem; font-weight:700; letter-spacing:-0.3px; color:var(--text); }
.header-refresh-btn {
  width:26px; height:26px; border-radius:6px; border:1px solid var(--border);
  background:var(--card-bg-2); color:var(--text3); font-size:18px; line-height:1;
  display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; transition:all .2s; flex-shrink:0; padding:0;
}
.header-refresh-btn:hover {
  color:var(--accent); border-color:var(--accent);
  background:rgba(79,110,247,.08);
}
.header-right { display:flex; align-items:center; gap:10px; }
#authArea { display:flex; align-items:center; gap:6px; }
/* 页面初始化期间强制隐藏，防止登录表单闪烁。JS 在 checkAuthStatus 完成后添加 .ready 类解除 */
#authArea:not(.ready) { display: none !important; }
#authArea input { font-size:.78rem; padding:3px 8px; border:1px solid var(--border); border-radius:4px; background:var(--card-bg-2); color:var(--text); width:90px; }
#authArea input::placeholder { color:var(--text3); }
.health-dot {
  width:10px; height:10px; border-radius:50%; transition: background .4s, box-shadow .4s;
}
.health-dot.ok { background: var(--green); box-shadow: 0 0 8px var(--green); }
.health-dot.err { background: var(--red); box-shadow: 0 0 8px var(--red); }
.health-dot.loading { background: var(--gray); animation: pulse 1.5s infinite; }
@keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:.4; } }
.latency-display { font-size:.8rem; font-weight:600; font-family:monospace; }
.latency-display.fast { color: var(--green); }
.latency-display.medium { color: #f0a020; }
.latency-display.slow { color: var(--red); }

/* ── Tabs ── */
.tabs-wrapper { margin:0 28px; padding-top:18px; }
.tabs {
  display:flex; gap:0; background:var(--card-bg); padding:5px;
  border-radius:var(--radius); border:1px solid var(--border);
  overflow-x:auto; flex-wrap:nowrap; box-shadow: var(--shadow-sm);
  position:relative;
}
.tab-btn {
  flex-shrink:0; padding:9px 18px; border:none; background:transparent;
  color:var(--text2); cursor:pointer; border-radius:8px;
  font-size:.84rem; font-weight:500; white-space:nowrap;
  transition:color var(--transition), background var(--transition);
  position:relative; z-index:1;
}
.tab-btn:hover { color:var(--text); background:var(--card-bg-2); }
.tab-btn.active {
  color:var(--accent); font-weight:600;
  background: var(--accent-light);
}
.tab-indicator {
  display:none;
}
/* 移动端：6 个 Tab 等分铺满 + 短标签，避免要横向滚动才看得到后面几个 */
.tab-label-short { display:none; }
@media (max-width: 600px) {
  .tabs-wrapper { margin:0 12px; padding-top:12px; }
  .tabs {
    display:grid; grid-template-columns:repeat(6, 1fr);
    padding:4px; overflow-x:visible;
  }
  .tab-btn { padding:9px 2px; font-size:.78rem; text-align:center; }
  .tab-label-full { display:none; }
  .tab-label-short { display:inline; }
}

/* ── Content ── */
.content { margin:0 28px 40px; padding-top:18px; }
.panel { display:none; animation: fadeSlideIn .3s ease; }
.panel.active { display:block; }
@keyframes fadeSlideIn {
  from { opacity:0; transform:translateY(8px); }
  to { opacity:1; transform:translateY(0); }
}
@keyframes fadeIn {
  from { opacity:0; }
  to { opacity:1; }
}

/* ── Cards ── */
.card {
  background:var(--card-bg); border-radius:var(--radius);
  border:1px solid var(--border); padding:24px; margin-bottom:18px;
  box-shadow: var(--shadow); transition: box-shadow var(--transition);
  position:relative;
}
.card:hover { box-shadow: var(--shadow-md); }
.card-title {
  font-size:1rem; font-weight:700; margin-bottom:18px;
  padding-bottom:12px; border-bottom:2px solid var(--border);
  display:flex; align-items:center; gap:8px;
}
.card-title .title-icon {
  width:22px; height:22px; border-radius:6px; display:inline-flex;
  align-items:center; justify-content:center; font-size:12px;
  flex-shrink:0;
}
.title-icon.blue { background:var(--blue-light); color:var(--blue); }

/* Drag handle (logged-in only) */
.drag-handle {
  position:absolute; top:8px; right:8px;
  font-size:15px; line-height:1; color:var(--text3);
  cursor:grab; opacity:0; transition:opacity .2s;
  user-select:none; padding:2px 4px; z-index:5;
}
.card:hover .drag-handle { opacity:.5; }
.drag-handle:hover { opacity:1 !important; color:var(--accent); }
.card.is-dragging { cursor:grabbing; }
.card.is-dragging .drag-handle { opacity:0 !important; }
.card.drag-over {
  outline:2px dashed var(--accent); outline-offset:-2px;
}
.title-icon.green { background:var(--green-light); color:var(--green); }
.title-icon.orange { background:var(--orange-light); color:var(--orange); }
.title-icon.purple { background:var(--purple-light); color:var(--purple); }
.title-icon.teal { background:var(--teal-light); color:var(--teal); }

.result-card { animation: fadeSlideIn .35s ease; }

/* ── IP Hero Display ── */
.ip-hero {
  display:flex; align-items:center; gap:16px; margin-bottom:20px;
  padding:16px 20px; background: linear-gradient(135deg, var(--accent-light), var(--card-bg-2));
  border-radius:var(--radius); border:1px solid var(--border);
  flex-wrap:wrap;
}
.ip-hero-addr {
  font-size:1.5rem; font-weight:800; font-family:'SF Mono','Consolas','Monaco','JetBrains Mono',monospace;
  color:var(--accent); letter-spacing:-0.5px;
  background:var(--card-bg); padding:8px 18px; border-radius:10px;
  box-shadow: var(--shadow-sm); border:1px solid var(--border);
  white-space:nowrap;
}
.ip-hero-meta { display:flex; gap:10px; flex-wrap:wrap; align-items:center; }
.ip-hero-location { font-size:.92rem; font-weight:600; color:var(--text); }
.ip-hero-time { font-size:.78rem; color:var(--text3); }

/* ── 本机 IP 卡片（轻量：IP + 归属地一行 + 查看详情）── */
.myip-summary {
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:14px 18px; border-radius:var(--radius);
  background:linear-gradient(135deg, var(--accent-light), var(--card-bg-2));
  border:1px solid var(--border);
}
.myip-main { display:flex; flex-direction:column; gap:3px; min-width:0; }
.myip-addr {
  font-size:1.25rem; font-weight:800; color:var(--accent); letter-spacing:-0.3px;
  font-family:'SF Mono','Consolas','Monaco','JetBrains Mono',monospace;
}
.myip-place { font-size:.86rem; color:var(--text2); font-weight:500; }
.myip-actions { display:flex; gap:8px; }
.myip-meta { font-size:.76rem; color:var(--text3); margin-left:auto; text-align:right; }
@media (max-width:600px) {
  .myip-summary { padding:12px 14px; gap:10px; }
  .myip-meta { margin-left:0; text-align:left; width:100%; }
}

/* ── Breadcrumb ── */
.breadcrumb {
  display:flex; align-items:center; gap:0; flex-wrap:wrap;
  font-size:.88rem; margin-bottom:14px;
}
.breadcrumb-item {
  padding:4px 10px; background:var(--card-bg-2); border-radius:6px;
  font-weight:500; color:var(--text);
}
.breadcrumb-sep {
  color:var(--text3); margin:0 6px; font-weight:300; user-select:none;
}
.breadcrumb-item.highlight {
  background:var(--accent-light); color:var(--accent); font-weight:600;
}

/* ── Info Grid (替代旧的 info-row) ── */
.info-grid {
  display:grid; grid-template-columns:repeat(auto-fill, minmax(160px, 1fr));
  gap:10px;
}
.info-grid-item {
  padding:12px 14px; background:var(--card-bg-2); border-radius:8px;
  border:1px solid transparent; transition:border var(--transition);
}
.info-grid-item:hover { border-color:var(--border2); }
.info-grid-item .ig-label {
  font-size:.7rem; color:var(--text3); text-transform:uppercase;
  letter-spacing:.5px; margin-bottom:4px; font-weight:600;
}
.info-grid-item .ig-value { font-size:.9rem; font-weight:600; color:var(--text); word-break:break-all; }

/* ── Badges ── */
.badge {
  display:inline-flex; align-items:center; gap:5px;
  padding:4px 12px; border-radius:20px; font-size:.78rem; font-weight:600;
  line-height:1.5; white-space:nowrap;
}
.badge-accent { background:var(--accent-light); color:var(--accent); }
.badge-blue { background:var(--blue-light); color:var(--blue); }
.badge-green { background:var(--green-light); color:var(--green); }
.badge-orange { background:var(--orange-light); color:var(--orange); }
.badge-purple { background:var(--purple-light); color:var(--purple); }
.badge-gray { background:var(--card-bg-2); color:var(--gray); }
.badge-dot { width:6px; height:6px; border-radius:50%; display:inline-block; flex-shrink:0; }
.badge-dot.blue { background:var(--blue); }
.badge-dot.green { background:var(--green); }
.badge-dot.orange { background:var(--orange); }
.badge-dot.purple { background:var(--purple); }

/* ── Dual Column ── */
.dual-col {
  display:flex; gap:16px; margin-bottom:18px;
}
.dual-col > .col {
  flex:1; min-width:0; background:var(--card-bg);
  border-radius:var(--radius); border:1px solid var(--border);
  overflow:hidden; box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition);
}
.dual-col > .col:hover { box-shadow: var(--shadow-md); }
.col-header {
  padding:12px 18px; font-weight:600; font-size:.85rem;
  display:flex; align-items:center; gap:8px;
}
.col-header .col-icon {
  width:20px; height:20px; border-radius:50%; display:inline-flex;
  align-items:center; justify-content:center; font-size:10px;
  flex-shrink:0; font-weight:700;
}
.col-header.src1 {
  background: var(--src1-bg); color: var(--src1-color); border-bottom: 1px solid var(--src1-border);
}
.col-header.src1 .col-icon { background: var(--src1-icon-bg); color: var(--src1-icon-color); }
.col-header.src2 {
  background: var(--src2-bg); color: var(--src2-color); border-bottom: 1px solid var(--src2-border);
}
.col-header.src2 .col-icon { background: var(--src2-icon-bg); color: var(--src2-icon-color); }
.col-body { padding:12px 18px 16px; }
.col-body .info-row {
  display:flex; justify-content:space-between; align-items:center;
  padding:8px 0; border-bottom:1px solid var(--border); font-size:.85rem;
}
.col-body .info-row:last-child { border-bottom:none; }
.col-body .info-label { color:var(--text3); font-size:.78rem; flex-shrink:0; margin-right:12px; }
.col-body .info-value { font-weight:600; text-align:right; word-break:break-all; }

@media (max-width: 860px) { .dual-col { flex-direction:column; } }

/* ── Map Container ── */
.map-container {
  margin-top:12px; border-radius:8px; overflow:hidden;
  border:1px solid var(--border); position:relative;
}
.map-container img { width:100%; display:block; }
.map-overlay {
  position:absolute; bottom:8px; right:8px;
  background:rgba(0,0,0,.6); color:#fff; padding:4px 10px;
  border-radius:6px; font-size:.75rem;
}

/* ── Threat List ── */
.threat-list { display:flex; flex-direction:column; gap:8px; }
.threat-item {
  display:flex; align-items:flex-start; gap:12px;
  padding:14px 16px; border-radius:var(--radius-sm); border:1px solid var(--border);
  background:var(--card-bg); transition: box-shadow var(--transition);
}
.threat-item:hover { box-shadow: var(--shadow-sm); }
.threat-item .threat-icon {
  width:36px; height:36px; border-radius:50%; display:flex;
  align-items:center; justify-content:center; font-size:14px; flex-shrink:0;
  font-weight:700;
}
.threat-icon.low { background:var(--green-light); color:var(--green); }
.threat-icon.medium { background:var(--yellow-light); color:var(--yellow); }
.threat-icon.high { background:var(--orange-light); color:var(--orange); }
.threat-icon.critical { background:var(--red); color:#fff; }
.threat-body { flex:1; min-width:0; }
.threat-body .threat-type { font-weight:700; font-size:.88rem; margin-bottom:2px; }
.threat-body .threat-desc { font-size:.8rem; color:var(--text2); line-height:1.4; }
.threat-body .threat-source { font-size:.75rem; color:var(--text3); margin-top:4px; }
.threat-tag {
  display:inline-block; padding:3px 10px; border-radius:12px;
  font-size:.72rem; font-weight:700; text-transform:uppercase;
  white-space:nowrap;
}
.threat-tag.low { background:var(--green-light); color:var(--green); }
.threat-tag.medium { background:var(--yellow-light); color:var(--yellow); }
.threat-tag.high { background:var(--orange-light); color:var(--orange); }
.threat-tag.critical { background:var(--red); color:#fff; }

/* ── Tags (legacy severity) ── */
.tag { display:inline-block; padding:3px 10px; border-radius:12px; font-size:.72rem; font-weight:700; text-transform:uppercase; }
.tag-low { background:var(--green-light); color:var(--green); }
.tag-medium { background:var(--yellow-light); color:var(--yellow); }
.tag-high { background:var(--orange-light); color:var(--orange); }
.tag-critical { background:var(--red); color:#fff; }

/* ── ASN Card ── */
.asn-card { display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:12px; }
.asn-item { background:var(--card-bg-2); padding:14px 16px; border-radius:var(--radius-sm); border:1px solid transparent; transition:border var(--transition); }
.asn-item:hover { border-color:var(--border2); }
.asn-item .label { font-size:.7rem; color:var(--text3); text-transform:uppercase; margin-bottom:4px; letter-spacing:.5px; font-weight:600; }
.asn-item .value { font-size:.95rem; font-weight:600; word-break:break-all; }

/* ── Section Divider ── */
.section-divider {
  display:flex; align-items:center; gap:12px; margin:20px 0 14px;
  font-size:.78rem; font-weight:700; color:var(--text3); text-transform:uppercase;
  letter-spacing:1px;
}
.section-divider::before, .section-divider::after {
  content:''; flex:1; height:1px; background:var(--border);
}

/* ── Form ── */
.row { display:flex; gap:10px; flex-wrap:wrap; align-items:center; margin-bottom:12px; }
input, textarea, select {
  padding:10px 14px; border:1.5px solid var(--border); border-radius:var(--radius-sm);
  font-size:.88rem; background:var(--card-bg); color:var(--text); outline:none;
  transition:border var(--transition), box-shadow var(--transition); font-family:inherit;
}
input:focus, textarea:focus, select:focus {
  border-color:var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12);
}
textarea { width:100%; min-height:120px; resize:vertical; }

/* ── Buttons ── */
.btn {
  padding:10px 22px; border:none; border-radius:var(--radius-sm); font-size:.88rem;
  font-weight:600; cursor:pointer; transition:all var(--transition);
  background:var(--accent); color:#fff; position:relative; overflow:hidden;
  display:inline-flex; align-items:center; gap:6px;
}
.btn:hover { background:var(--accent2); box-shadow: 0 2px 8px rgba(79,110,247,.3); transform:translateY(-1px); }
.btn:active { transform:translateY(0); }
.btn:disabled { opacity:.5; cursor:not-allowed; transform:none; box-shadow:none; }
.btn-sm { padding:6px 14px; font-size:.8rem; border-radius:6px; }
.range-btn {
  padding:5px 14px; font-size:.78rem; border-radius:6px;
  background:transparent; border:1.5px solid var(--border);
  color:var(--text2); font-weight:500;
}
.range-btn:hover { border-color:var(--accent); color:var(--accent); }
.range-btn.active {
  background:var(--accent); color:#fff; border-color:var(--accent);
  font-weight:600;
}
.btn-outline {
  background:transparent; border:1.5px solid var(--accent); color:var(--accent);
}
.btn-outline:hover { background:var(--accent); color:#fff; }
.btn-loading { pointer-events:none; }
.btn-loading::after {
  content:''; width:16px; height:16px; border:2px solid transparent;
  border-top-color:currentColor; border-radius:50%;
  animation:spin .6s linear infinite; display:inline-block; margin-left:4px;
}
.quick-ips { display:flex; gap:8px; flex-wrap:wrap; margin-bottom:12px; }
.quick-ips .btn { padding:6px 14px; font-size:.8rem; border-radius:20px; }

/* ── Table ── */
table { width:100%; border-collapse:collapse; font-size:.86rem; }
th {
  text-align:left; padding:11px 14px; background:var(--card-bg-2);
  font-weight:700; font-size:.76rem; color:var(--text3); text-transform:uppercase;
  letter-spacing:.5px; border-bottom:2px solid var(--border);
}
td { padding:11px 14px; border-bottom:1px solid var(--border); vertical-align:middle; }
tr:last-child td { border-bottom:none; }
tr:hover td { background:var(--card-bg-2); }
.table-wrap { overflow-x:auto; border-radius:var(--radius-sm); border:1px solid var(--border); -webkit-overflow-scrolling:touch; overscroll-behavior-x:contain; }
.table-wrap th { white-space:nowrap; }
.mono { font-family:'SF Mono','Consolas','Monaco','JetBrains Mono',monospace; font-size:.84rem; }

/* ── Spinner ── */
.spinner {
  display:none; width:22px; height:22px; border:2.5px solid var(--border);
  border-top-color:var(--accent); border-radius:50%; animation:spin .7s linear infinite;
  margin:8px 0;
}
.spinner.show { display:inline-block; }
@keyframes spin { to { transform:rotate(360deg); } }

/* ── Toast ── */
.toast {
  position:fixed; top:20px; left:50%; transform:translateX(-50%) translateY(-12px);
  padding:12px 28px; border-radius:10px; font-size:.86rem; font-weight:600; color:#fff;
  z-index:999; opacity:0; transition:all .3s ease; pointer-events:none;
  box-shadow: var(--shadow-lg);
}
.toast.show { opacity:1; transform:translateX(-50%) translateY(0); }
.toast-err { background:var(--red); }
.toast-ok { background:var(--green); }

/* ── Stats Bar ── */
.stats { display:flex; gap:14px; margin-bottom:16px; flex-wrap:wrap; }
.stats .stat-item {
  display:flex; align-items:center; gap:8px; padding:8px 16px;
  background:var(--card-bg-2); border-radius:20px; font-size:.8rem;
  border:1px solid var(--border);
}
.stat-item .stat-val { font-weight:700; color:var(--accent); }

/* ── Sort & Pagination ── */
th.sortable { cursor:pointer; user-select:none; white-space:nowrap; }
th.sortable:hover { color:var(--accent); }
th.sortable .sort-arrow { margin-left:4px; font-size:.7rem; opacity:.4; }
th.sortable.sorted .sort-arrow { opacity:1; color:var(--accent); }
.pagination { display:flex; align-items:center; justify-content:center; gap:4px; margin-top:14px; }
.pagination button {
  border:1px solid var(--border); background:var(--card-bg); color:var(--text);
  padding:7px 13px; border-radius:6px; cursor:pointer; font-size:.82rem;
  transition:all var(--transition);
}
.pagination button:hover:not(:disabled) { background:var(--accent); color:#fff; border-color:var(--accent); }
.pagination button:disabled { opacity:.4; cursor:default; }
.pagination .page-info { padding:7px 13px; font-size:.82rem; color:var(--text2); font-weight:500; }
.pagination select { border:1px solid var(--border); border-radius:6px; padding:7px 8px; font-size:.82rem; background:var(--card-bg); color:var(--text); cursor:pointer; }

/* ── Empty / Error State ── */
.empty-state {
  text-align:center; padding:40px 20px; color:var(--text3);
}
.empty-state .empty-icon {
  font-size:2.8rem; margin-bottom:12px; opacity:.6;
}
.empty-state .empty-title { font-size:.95rem; font-weight:600; color:var(--text2); margin-bottom:6px; }
.empty-state .empty-desc { font-size:.82rem; color:var(--text3); }
.error-state {
  text-align:center; padding:36px 20px; color:var(--text3);
}
.error-state .error-icon {
  font-size:2.4rem; margin-bottom:10px;
}

/* ── Footer ── */
.footer {
  text-align:center; padding:24px 20px; background:var(--card-bg);
  border-top:1px solid var(--border); margin-top:20px;
}
.footer-content { max-width:700px; margin:0 auto; }
.footer-title { font-size:.82rem; font-weight:700; color:var(--text); margin-bottom:10px; }
.footer-cmds { display:flex; gap:14px; justify-content:center; flex-wrap:wrap; margin-bottom:6px; }
.footer-cmd {
  background:var(--card-bg-2); padding:8px 16px; border-radius:8px;
  border:1px solid var(--border); font-size:.76rem; font-family:'SF Mono','Consolas','Monaco',monospace;
  color:var(--text2); word-break:break-all; text-align:left;
}
.footer-cmd code { color:var(--accent); font-family:inherit; }
.footer-icp { margin-top:10px; font-size:.72rem; color:var(--text2); }
.footer-icp a { color:var(--text2); text-decoration:none; }
.footer-icp a:hover { color:var(--accent); }
.footer-gongan { margin-top:6px; font-size:.72rem; color:var(--text2); }
.footer-gongan a { color:var(--text2); text-decoration:none; display:inline-flex; align-items:center; gap:4px; }
.footer-gongan a:hover { color:var(--accent); }
.gongan-icon { width:14px; height:14px; flex-shrink:0; }

/* ── Responsive ── */
/* 平板断点：中等屏幕适度收紧间距与卡片内边距 */
@media (max-width: 900px) {
  .header { padding:0 20px; }
  .content { margin:0 20px 36px; }
  .tabs-wrapper { margin:0 20px; }
  .card { padding:18px; }
}
@media (max-width:600px) {
  .header { padding:0 12px; height:52px; }
  .header h1 { font-size:.95rem; }
  .tabs-wrapper { margin:0 12px; padding-top:14px; }
  .tabs { padding:4px; }
  .tab-btn { padding:7px 12px; font-size:.76rem; }
  .content { margin:0 12px 30px; padding-top:14px; }
  .card { padding:14px; }
  .ip-hero { flex-direction:column; align-items:flex-start; gap:10px; padding:14px; }
  .ip-hero-addr { font-size:1.25rem; padding:6px 14px; }
  .info-grid { grid-template-columns:repeat(auto-fill, minmax(130px, 1fr)); }
  .asn-card { grid-template-columns:1fr; }
  .footer-cmds { flex-direction:column; align-items:stretch; }

  /* ── 高阶功能移动端适配 ── */
  /* 卡片收紧 */
  #healthCard, #managementCards .card { padding: 14px; }
  #healthCard .card-title, #managementCards .card-title { font-size: .98rem; }

  /* 健康网格：2列紧凑 */
  .health-grid { grid-template-columns: repeat(2, 1fr); }
  .health-card { padding: 10px 12px; gap: 8px; }
  .health-card-label { font-size: .66rem; }
  .health-card-value { font-size: .82rem; }
  .health-card-sub { font-size: .64rem; }

  /* actions-bar：垂直排列 */
  .mgmt-actions-bar { flex-direction: column; align-items: stretch; gap: 6px; padding: 6px 0 8px; }
  /* 隐藏弹簧（垂直布局下会撑出空白） */
  .mgmt-actions-bar .mgmt-actions-spacer { display: none; }
  /* range 按钮换行铺满 */
  .mgmt-actions-bar #ipStatsRangeBtns { display: flex; flex-wrap: wrap; gap: 4px; }
  .mgmt-actions-bar .range-btn { padding: 5px 10px; font-size: .74rem; flex: 1; min-width: 52px; text-align: center; }
  /* 自定义日期输入框：垂直堆叠全宽 */
  .mgmt-actions-bar #ipStatsCustomInputs { font-size: .72rem; display: flex; flex-direction: column; gap: 4px; }
  .mgmt-actions-bar #ipStatsCustomInputs input[type="date"] { width: 100% !important; box-sizing: border-box; }
  .mgmt-actions-bar #ipStatsCustomInputs span { display: none; }
  .mgmt-actions-bar #ipStatsCustomInputs button { width: 100%; margin-left: 0; margin-top: 2px; }
  /* 尾部按钮组（日期范围 + 刷新 + 导出）：保持一行，右对齐 */
  .mgmt-actions-bar .mgmt-actions-tail { justify-content: space-between; }
  .mgmt-actions-bar .mgmt-actions-tail .refresh-btn { width: 30px; height: 30px; margin-left: 0; }
  .mgmt-actions-bar .mgmt-actions-tail .btn { width: auto; }

  /* 统计摘要行 */
  #ipStatsSummary .stats { gap: 6px; margin-bottom: 0; }
  #ipStatsSummary .stat-item { padding: 5px 10px; font-size: .74rem; }
  #ipStatsSummary select { padding: 5px 4px; font-size: .74rem; }

  /* tab 导航栏：允许换行，action 链接换到下一行 */
  .mgmt-tab-bar { flex-wrap: wrap; gap: 0; margin-bottom: 8px; padding-bottom: 6px; }
  .mgmt-tab-bar .mgmt-tab { padding: 5px 10px; font-size: .76rem; }
  .mgmt-tab-bar .mgmt-tab.active::after { left: 10px; right: 10px; bottom: -8px; }
  .mgmt-tab-bar .mgmt-tab-spacer { flex-basis: 100%; height: 0; }
  .mgmt-tab-bar .mgmt-tab-action { padding: 4px 10px; font-size: .74rem; }

  /* 内容容器 */
  .mgmt-content-box { font-size: .8rem; }

  /* 行：移动端垂直排列（功能开关 & 参数配置 共用） */
  .toggle-row, .config-row {
    flex-direction: column; align-items: stretch; gap: 6px; padding: 10px 12px;
  }
  .toggle-row .toggle-info, .config-row .config-info { gap: 2px; }
  .toggle-row .toggle-desc, .config-row .config-desc { font-size: .84rem; }
  .toggle-row .toggle-key, .config-row .config-key { font-size: .64rem; }
  .toggle-row .toggle-control, .config-row .config-control { justify-content: flex-end; }
  .config-input { width: 100%; }
  .toggle-row .toggle-saved, .config-row .config-saved {
    width: auto; align-self: flex-end;
  }

  /* inline-add-form：垂直排列 */
  .inline-add-form { padding: 8px 10px; }
  .inline-add-row { flex-direction: column; align-items: stretch; gap: 6px; }
  .inline-add-row input { min-width: 0; width: 100%; }
  .inline-add-row .btn { width: 100%; text-align: center; }

  /* 表格收紧 */
  .blwl-table { font-size: .76rem; }
  .blwl-table th, .blwl-table td { padding: 4px 6px; }
  .btn-edit, .btn-delete { padding: 3px 8px; font-size: .72rem; }

  /* 搜索框 */
  .blwl-search { font-size: .82rem; padding: 7px 10px; }

  /* 分页 */
  .pagination { gap: 2px; margin-top: 10px; }
  .pagination button { padding: 6px 10px; font-size: .76rem; }
  .pagination .page-info { padding: 6px 8px; font-size: .76rem; }
  /* 每页条数选择器（在摘要行内，不在 pagination 内） */
  #ipStatsPerPage { padding: 5px 4px; font-size: .74rem; }

  /* ── 通用表单/按钮移动端适配 ── */
  /* 表单行内输入框撑满，查询按钮跟随 */
  .row input[type="text"], .row input[type="password"] { flex:1 1 100% !important; min-width:0 !important; max-width:none !important; }
  .row .btn { flex:1 1 auto; }
  /* 触控友好：按钮最小高度 */
  .btn { min-height: 40px; }
  .btn-sm { min-height: 32px; }
  /* 表格容器在窄屏下保留横向滚动，同时不溢出 */
  .table-wrap { -webkit-overflow-scrolling: touch; }
  /* 弹窗：移动端近全屏 */
  .mgmt-modal { width: calc(100% - 16px); max-height: 90vh; border-radius: 12px; }
}

/* ── Refresh Button ── */
.refresh-btn {
  background: transparent; border: 1.5px solid var(--border); color: var(--text2);
  width: 30px; height: 30px; border-radius: 50%; cursor: pointer;
  font-size: 1rem; display: inline-flex; align-items: center; justify-content: center;
  transition: all var(--transition); flex-shrink: 0; line-height: 1;
  user-select: none; padding: 0; margin-left: auto;
}
.refresh-btn:hover { border-color: var(--accent); color: var(--accent); }
.refresh-btn.spinning {
  pointer-events: none;
  animation: refreshSpin .7s ease-in-out;
}
@keyframes refreshSpin { 100% { transform: rotate(360deg); } }

/* ── Health Card Centered Items ── */
#healthCard .asn-item { text-align: center; }
#healthCard .asn-item .label { text-align: center; }
#healthCard .asn-item .value { text-align: center; }

/* ── Dimension Table ── */
.dim-table { width: 100%; border-collapse: collapse; margin-bottom: 14px; }
.dim-table th, .dim-table td { padding: 8px 14px; font-size: .84rem; text-align: center; }
.dim-table th { background: var(--card-bg-2); color: var(--text3); font-weight: 700; font-size: .76rem; text-transform: uppercase; }
.dim-table td { border-bottom: 1px solid var(--border); }
.dim-table td.dim-value {
  font-family: 'SF Mono','Consolas','Monaco',monospace;
  font-weight: 600; color: var(--accent);
}
.dim-edit-input { width: 100px; text-align: center; padding: 4px 8px; font-size: .82rem; }
.dim-edit-row { background: var(--accent-light); }

/* ── Toggle Switch ── */
.toggle-switch { position: relative; display: inline-block; width: 40px; height: 22px; cursor: pointer; }
.toggle-switch input { opacity: 0; width: 0; height: 0; }
.toggle-slider { position: absolute; inset: 0; background: var(--toggle-off); border-radius: 22px; transition: .25s; }
.toggle-slider::before { content: ''; position: absolute; height: 16px; width: 16px; left: 3px; bottom: 3px; background: white; border-radius: 50%; transition: .25s; }
.toggle-switch input:checked + .toggle-slider { background: var(--accent); }
.toggle-switch input:checked + .toggle-slider::before { transform: translateX(18px); }
.toggle-switch input:disabled + .toggle-slider { background: var(--toggle-disabled); cursor: not-allowed; }
.toggle-switch input:disabled + .toggle-slider::before { background: var(--toggle-disabled-knob); }

/* ── Management Cards (compact) — 统一高阶功能所有卡片 ── */
#healthCard, #managementCards .card { padding: 14px 18px; }
#healthCard { margin-bottom: 16px; }
#managementCards .card { margin-bottom: 0; }
#healthCard .card-title, #managementCards .card-title { margin-bottom: 2px; padding-bottom: 0; border-bottom: none; justify-content: center; font-size: 1.05rem; }
#healthCard .card-title .title-icon { width: 22px; height: 22px; }
#healthCard .card-title { position: relative; }
#healthCard .card-title .refresh-btn { position: absolute; right: 0; top: 50%; transform: translateY(-50%); }

/* ── Management Section Grouping (工具 / 数据 / 配置) ── */
.mgmt-intro {
  font-size:.8rem; color:var(--text2); background:var(--card-bg-2);
  border:1px solid var(--border); border-radius:var(--radius-sm);
  padding:10px 14px; margin-bottom:18px; line-height:1.6;
}
.mgmt-group { display:flex; flex-direction:column; gap:10px; margin-bottom:12px; }
.mgmt-group:last-child { margin-bottom:0; }
.mgmt-section-label {
  font-size:.72rem; font-weight:600; color:var(--text2);
  padding:0 0 4px 0; border-bottom:1px solid var(--border);
  margin:0 0 4px 0; letter-spacing:.5px;
}
/* 复用字段样式（替代 emailReport / singleQuery 内联 style） */
.mgmt-desc { font-size:.8rem; color:var(--text2); margin-bottom:12px; line-height:1.5; }
.mgmt-field { display:block; font-size:.78rem; color:var(--text2); margin-bottom:4px; }
.mgmt-input {
  width:100%; padding:7px 9px; border:1px solid var(--border); border-radius:6px;
  background:var(--card-bg); color:var(--text); font-size:.85rem;
  font-family:inherit; outline:none; box-sizing:border-box;
}
.mgmt-input:focus { border-color:var(--accent); box-shadow:0 0 0 3px rgba(79,110,247,.12); }

/* ── Management Content Box (统一样式的内容容器) ── */
.mgmt-content-box {
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  overflow: hidden; font-size: .84rem; background: var(--card-bg);
}
.mgmt-content-box > :first-child { border-top: none; }

/* ── Management Actions Bar (按钮工具栏) ── */
.mgmt-actions-bar {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 0 10px;
  margin-bottom: 10px;
  border-bottom: 1px solid var(--border2);
}

/* ── Management Tab Bar ── */
.mgmt-tab-bar {
  display: flex; align-items: center; gap: 0;
  margin-bottom: 12px; padding-bottom: 8px;
  border-bottom: 2px solid var(--border);
}
.mgmt-tab-bar .mgmt-tab {
  padding: 5px 16px; border: none; background: transparent;
  color: var(--text3); font-size: .82rem; font-weight: 600;
  cursor: pointer; transition: all .2s ease;
  font-family: inherit; position: relative;
  border-radius: 6px 6px 0 0;
}
.mgmt-tab-bar .mgmt-tab:hover:not(.active) {
  color: var(--text); background: var(--card-bg-2);
}
.mgmt-tab-bar .mgmt-tab.active {
  color: var(--accent);
}
.mgmt-tab-bar .mgmt-tab.active::after {
  content: ''; position: absolute; bottom: -10px; left: 16px; right: 16px;
  height: 3px; background: var(--accent); border-radius: 3px 3px 0 0;
}
.mgmt-tab-bar .mgmt-tab-spacer { flex: 1; }
.mgmt-tab-bar .mgmt-tab-action {
  font-size: .8rem; font-weight: 600; text-decoration: none;
  padding: 4px 12px; border-radius: 6px;
  transition: all .2s ease; white-space: nowrap;
  flex-shrink: 0;
}

/* ── Management Modal (替代 prompt/confirm) ── */
.mgmt-modal-overlay {
  position: fixed; inset: 0; z-index: 9999;
  background: rgba(0,0,0,.45);
  display: flex; align-items: center; justify-content: center;
  opacity: 0; pointer-events: none;
  transition: opacity .2s ease;
}
.mgmt-modal-overlay.show { opacity: 1; pointer-events: auto; }
.mgmt-modal {
  background: var(--card-bg); border-radius: 12px;
  box-shadow: 0 20px 60px rgba(0,0,0,.3);
  max-width: 460px; width: calc(100% - 32px); max-height: 85vh;
  overflow-y: auto; transform: scale(.95) translateY(8px);
  transition: transform .2s ease;
}
.mgmt-modal-overlay.show .mgmt-modal { transform: scale(1) translateY(0); }
.mgmt-modal-header {
  display: flex; align-items: center; gap: 8px;
  padding: 16px 20px 12px;
  border-bottom: 1px solid var(--border);
}
.mgmt-modal-header .modal-icon { font-size: 1.2rem; flex-shrink: 0; }
.mgmt-modal-header .modal-title {
  font-size: 1rem; font-weight: 700; color: var(--text); flex: 1;
}
.mgmt-modal-body { padding: 16px 20px; }
.mgmt-modal-body .modal-message {
  font-size: .88rem; color: var(--text2); line-height: 1.6; margin-bottom: 12px;
}
.mgmt-modal-body .modal-field { margin-bottom: 12px; }
.mgmt-modal-body .modal-field label {
  display: block; font-size: .78rem; color: var(--text2);
  margin-bottom: 4px; font-weight: 600;
}
.mgmt-modal-body .modal-field input {
  width: 100%; padding: 8px 10px; border: 1px solid var(--border);
  border-radius: 6px; font-size: .85rem; color: var(--text);
  background: var(--card-bg); outline: none; box-sizing: border-box;
  font-family: inherit; transition: border var(--transition);
}
.mgmt-modal-body .modal-field input:focus {
  border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12);
}
.mgmt-modal-footer {
  display: flex; gap: 8px; justify-content: flex-end;
  padding: 12px 20px 16px; border-top: 1px solid var(--border);
}
.mgmt-modal-footer .btn { min-width: 80px; }

/* ── Email Report Form ── */
.er-subsection-label {
  font-size:.72rem; font-weight:600; color:var(--text2);
  letter-spacing:.5px; margin:14px 0 8px; padding-bottom:4px;
  border-bottom:1px solid var(--border);
}
.er-subsection-label:first-child { margin-top:0; }
.er-smtp-summary {
  display:flex; align-items:center; justify-content:space-between;
  padding:8px 12px; background:var(--card-bg-2); border-radius:6px;
}
.er-smtp-summary .smtp-info {
  font-family:'SF Mono','Consolas','Monaco',monospace; font-size:.8rem; color:var(--text2);
}
.er-smtp-form.hidden { display:none; }
.er-grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:10px; margin-bottom:8px; }
.er-full-row { margin-bottom:8px; }
/* ── Recipient Chip Input ── */
.er-chip-input {
  display:flex; flex-wrap:wrap; align-items:center; gap:5px;
  min-height:38px; padding:5px 7px; cursor:text;
  border:1px solid var(--border); border-radius:6px;
  background:var(--card-bg); transition:border-color .2s;
}
.er-chip-input:focus-within { border-color:var(--blue); }
.er-chip-input.invalid { border-color:var(--orange); }
.er-chip {
  display:inline-flex; align-items:center; gap:4px;
  padding:2px 4px 2px 9px; border-radius:4px;
  font-size:.78rem; font-family:'SF Mono','Consolas','Monaco',monospace;
  background:var(--accent-light); color:var(--text);
  animation:chipPop .18s ease;
}
.er-chip.invalid { background:rgba(255,140,0,.18); color:var(--orange); }
.er-chip .chip-x {
  cursor:pointer; font-size:1rem; line-height:1; color:var(--text3);
  padding:0 2px; border:none; background:none;
}
.er-chip .chip-x:hover { color:var(--orange); }
.er-chip-input input {
  flex:1; min-width:120px; border:none; outline:none; background:none;
  font-size:.82rem; color:var(--text); padding:3px 0;
}
.er-chip-input input::placeholder { color:var(--text3); }
.er-chip-hint {
  font-size:.7rem; color:var(--text3); margin-top:4px;
}
.er-chip-hint .chip-count { color:var(--text2); font-weight:600; }
@keyframes chipPop {
  from { opacity:0; transform:scale(.8); }
  to { opacity:1; transform:scale(1); }
}
.er-checkbox-row {
  display:flex; align-items:center; gap:6px;
  font-size:.85rem; margin-bottom:8px;
}
.er-schedule-item {
  display:flex; align-items:center; gap:10px; padding:5px 0; font-size:.82rem;
}
.er-schedule-item .schedule-label {
  width:50px; flex-shrink:0; color:var(--text2); font-weight:500;
}
.er-schedule-item select { flex:1; }
.er-schedule-area.disabled { opacity:.4; pointer-events:none; }
.er-actions-primary { margin:12px 0 8px; }
.er-actions-test {
  display:flex; gap:6px; flex-wrap:wrap;
  padding-top:8px; border-top:1px dashed var(--border);
}
.er-actions-test .btn { font-size:.76rem; padding:4px 10px; }
.er-status { margin-top:8px; font-size:.82rem; color:var(--text2); }

/* ── Collapsible Card (配置区折叠) ── */
.card.card-collapsible .card-title { cursor: pointer; user-select: none; }
.card.card-collapsible .card-title .collapse-arrow {
  margin-left: auto; font-size: .7rem; color: var(--text3);
  transition: transform .25s ease; flex-shrink: 0;
}
.card.card-collapsible.collapsed .collapse-arrow { transform: rotate(-90deg); }
.card.card-collapsible .card-body-wrap {
  overflow: hidden; transition: max-height .3s ease, opacity .2s ease;
  max-height: 5000px; opacity: 1;
}
.card.card-collapsible.collapsed .card-body-wrap {
  max-height: 0; opacity: 0;
}

/* ── Health Card Grid ── */
.health-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 1px;
  background: var(--border);
}
.health-card {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 16px;
  background: var(--card-bg);
  transition: background var(--transition);
}
.health-card:hover { background: var(--card-bg-2); }
.health-card-body { min-width: 0; flex: 1; }
.health-card-label { font-size: .72rem; color: var(--text3); margin-bottom: 2px; }
.health-card-value { font-size: .88rem; font-weight: 600; color: var(--text); }
.health-card-sub { font-size: .7rem; color: var(--text2); margin-top: 1px; }
.health-ok { }
.health-err { background: rgba(255,107,107,0.05); }
.health-warn { }

/* ── Management Toolbar ── */
.mgmt-toolbar { margin-bottom: 8px; }
.mgmt-toolbar .blwl-search { margin-bottom: 0; }

/* ── Inline Add Form ── */
.inline-add-form {
  margin-bottom: 8px; padding: 10px 12px;
  background: var(--card-bg-2); border: 1px solid var(--border2);
  border-radius: var(--radius-sm);
}
.inline-add-row {
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
}
.inline-add-row input {
  flex: 1; min-width: 160px;
  padding: 6px 10px; border: 1px solid var(--border);
  border-radius: 6px; font-size: .84rem; color: var(--text);
  background: var(--card-bg); outline: none;
  font-family: inherit;
  transition: border var(--transition);
}
.inline-add-row input:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12); }
.inline-add-row .btn { flex-shrink: 0; white-space: nowrap; }

/* ── Blacklist & Whitelist Table ── */
.blwl-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.blwl-table {
  width: 100%; table-layout: auto; border-collapse: collapse; font-size: .86rem;
  border-radius: var(--radius-sm); overflow: hidden;
  border: 1px solid var(--border); box-shadow: var(--shadow);
}
.blwl-table th {
  text-align: left; padding: 5px 8px; background: var(--card-bg-2);
  font-weight: 700; font-size: .76rem; color: var(--text2);
  border-bottom: 2px solid var(--border); white-space: nowrap;
  line-height: 1.3;
}
.blwl-table td {
  padding: 5px 8px; border-bottom: 1px solid var(--border);
  vertical-align: middle; line-height: 1.3;
}
.blwl-table tbody tr:nth-child(even) td { background: var(--card-bg); }
.blwl-table tbody tr:nth-child(odd) td { background: var(--card-bg-2); }
.blwl-table tbody tr:hover td { background: var(--accent-light); }
.blwl-table tbody tr:last-child td { border-bottom: none; }
.blwl-table .col-id { text-align: center; }
.blwl-table .col-ip { text-align: left; font-family: 'SF Mono','Consolas','Monaco',monospace; font-size: .84rem; }
.blwl-table .col-desc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.blwl-table .col-time { text-align: right; white-space: nowrap; }
.blwl-table .col-actions { text-align: right; white-space: nowrap; }

/* ── Action Buttons (Edit / Delete) ── */
.btn-edit, .btn-delete {
  padding: 4px 12px; border: none; border-radius: 6px;
  font-size: .78rem; font-weight: 600; cursor: pointer;
  transition: all .2s ease; display: inline-block; line-height: 1.5;
}
.btn-edit { background: var(--blue); color: #fff; }
.btn-edit:hover { transform: scale(1.05); box-shadow: 0 2px 8px rgba(37,99,235,.4); }
.btn-delete { background: var(--red); color: #fff; }
.btn-delete:hover { transform: scale(1.05); box-shadow: 0 2px 8px rgba(229,62,62,.4); }

/* ── Search Bar ── */
.blwl-search {
  width: 100%; padding: 6px 10px; border: 1.5px solid var(--border);
  border-radius: var(--radius-sm); font-size: .86rem;
  background: var(--card-bg); color: var(--text); outline: none;
  margin-bottom: 6px; transition: border var(--transition), box-shadow var(--transition);
  font-family: inherit;
}
.blwl-search:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12); }

/* ── Empty State (Whitelist / Blacklist) ── */
.blwl-empty {
  text-align: center; padding: 48px 20px; color: var(--text3);
}
.blwl-empty .empty-icon { font-size: 2.8rem; margin-bottom: 12px; opacity: .5; }
.blwl-empty .empty-text { font-size: 1rem; font-weight: 500; color: var(--text2); margin-bottom: 8px; }
.blwl-empty .empty-hint { font-size: .82rem; color: var(--text3); }


/* ── Blacklist / Whitelist Tabs ── */
.blwl-tabs {
  display: inline-flex; gap: 0; margin: 0 16px;
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  overflow: hidden; vertical-align: middle;
}
.blwl-tab {
  padding: 3px 14px; border: none; background: transparent;
  color: var(--text3); font-size: .8rem; font-weight: 600;
  cursor: pointer; transition: all .2s ease;
  font-family: inherit;
}
.blwl-tab + .blwl-tab { border-left: 1px solid var(--border); }
.blwl-tab.active { background: var(--accent); color: #fff; }
.blwl-tab:hover:not(.active) { background: var(--card-bg-2); color: var(--text); }
.blwl-noresult {
  text-align: center; padding: 32px 20px; color: var(--text3);
  font-size: .9rem;
}

/* ── Responsive ── */
@media (max-width: 768px) {
  .blwl-table { font-size: .8rem; }
  .blwl-table th, .blwl-table td { padding: 4px 6px; }
}

/* ── 功能开关 & 参数配置：基础行样式 ── */
.toggle-row, .config-row {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--border);
  min-height: 42px;
  transition: background 0.15s ease;
}
.mgmt-content-box .toggle-row:last-child,
.mgmt-content-box .config-row:last-child { border-bottom: none; }
.toggle-row:hover, .config-row:hover { background: var(--card-bg-2); }

/* 左侧信息区（描述 + key 标签） */
.toggle-info, .config-info {
  flex: 1; min-width: 0;
  display: flex; flex-direction: column; gap: 2px;
}
/* 描述文字 */
.toggle-desc, .config-desc {
  font-weight: 600; color: var(--text); font-size: .86rem;
}
/* 次级描述（功能开关子节点用） */
.toggle-desc-sub { color: var(--text2); }
/* key 标签 */
.toggle-key, .config-key {
  display: inline-block;
  font-family: 'SF Mono', Consolas, Monaco, monospace;
  font-size: .7rem; color: var(--text3);
  letter-spacing: .2px;
}
/* 右侧控件区 */
.toggle-control, .config-control {
  display: flex; align-items: center; flex-shrink: 0;
  position: relative;
}
.toggle-control > * + *, .config-control > * + * {
  margin-left: 10px;
}
/* 行容器（用于保存提示 absolute 定位参照） */
.toggle-row, .config-row {
  position: relative;
}
/* 保存提示（浮动，不占布局空间） */
.toggle-saved, .config-saved {
  position: absolute;
  right: 14px; top: 50%;
  transform: translateY(-50%);
  color: var(--saved-ok); font-size: .76rem; font-weight: 600;
  opacity: 0; pointer-events: none;
  transition: opacity .25s ease; white-space: nowrap;
  background: var(--card-bg); padding: 3px 8px; border-radius: 4px;
  box-shadow: 0 1px 4px rgba(0,0,0,.1);
  z-index: 2;
}
.toggle-saved.show, .config-saved.show {
  opacity: 1;
}

/* ── 功能开关特有样式 ── */
.toggle-arrow {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px;
  font-size: 10px; color: var(--text3);
  transition: transform 0.25s ease; user-select: none;
  flex-shrink: 0; line-height: 1;
}
.toggle-arrow.collapsed { transform: rotate(-90deg); }
.toggle-arrow.placeholder { visibility: hidden; }
.toggle-row-parent {
  cursor: pointer; user-select: none;
}
.toggle-children-wrap {
  overflow: hidden;
  max-height: 5000px; opacity: 1;
  transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.35s ease;
}
.toggle-children-wrap.collapsed { max-height: 0; opacity: 0; }

/* ── 参数配置特有样式 ── */
.config-row .config-control {
  width: 180px; justify-content: center;
}
.config-row .config-saved {
  width: 0; overflow: hidden;
  margin-left: 0;
  color: var(--saved-ok); font-size: .76rem; font-weight: 600;
  opacity: 0; white-space: nowrap;
  transition: width .25s ease, margin-left .25s ease, opacity .2s ease;
  flex-shrink: 0;
}
.config-row .config-saved.show {
  width: 64px;
  margin-left: 8px;
  opacity: 1;
}
.config-input {
  width: 110px; padding: 4px 10px;
  border: 1px solid var(--border); border-radius: 6px;
  font-size: .82rem; font-weight: 500;
  background: var(--card-bg); outline: none;
  text-align: center;
  transition: all .2s ease;
  font-family: 'SF Mono', Consolas, Monaco, monospace;
  height: 28px; box-sizing: border-box;
  flex-shrink: 0;
}
.config-input:focus {
  border-color: var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12);
}


/* ── Location Panel ── */
.location-status-bar {
  display:flex; align-items:center; justify-content:space-between;
  padding:12px 18px; font-size:.88rem; flex-wrap:wrap; gap:8px;
}
.location-status-left { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.location-status-right { display:flex; align-items:center; gap:8px; }
.location-status-dot {
  display:inline-block; width:10px; height:10px; border-radius:50%;
  background:var(--text3); transition:background 0.3s; vertical-align:middle;
}
.location-status-dot.active { background:var(--accent); box-shadow:0 0 8px var(--accent); }
.location-status-dot.error  { background:var(--red); }
.location-status-dot.recording { animation:locationPulse 1.5s infinite; }
@keyframes locationPulse {
  0%, 100% { opacity:1; }
  50% { opacity:0.4; }
}
.location-conn-badge {
  display:inline-block; padding:2px 8px; border-radius:6px;
  font-size:.72rem; font-weight:600; letter-spacing:.5px;
  background:var(--accent-light); color:var(--accent2);
}


/* Coordinate card — single card, two columns */
.location-coord-card {
  display:grid; grid-template-columns:1fr 1fr; gap:0;
  padding:22px 28px; border-radius:var(--radius);
  background:var(--card-bg); border:1px solid var(--accent);
  border-left:4px solid var(--accent);
  margin-bottom:18px;
}
.location-coord-half {
  text-align:center; position:relative;
}
.location-coord-half:first-child::after {
  content:''; position:absolute; right:-1px; top:15%; bottom:15%;
  width:1px; background:var(--border);
}
.location-coord-half .coord-label {
  font-size:.72rem; color:var(--accent2); letter-spacing:1px;
  margin-bottom:8px; text-transform:uppercase; font-weight:500;
}
.location-coord-half .coord-value {
  font-size:1.5rem; font-weight:700; color:var(--text); line-height:1.2;
  font-family:'SF Mono','Consolas','Menlo',monospace;
  font-variant-numeric:tabular-nums;
}

/* Data grid — 4 equal cards */
.location-info-grid {
  display:grid; grid-template-columns:repeat(4, 1fr); gap:14px; margin-bottom:18px;
}
.location-info-item {
  text-align:center; padding:18px 12px; border-radius:var(--radius);
  background:var(--card-bg); border:1px solid var(--border);
  position:relative; transition:border-color .2s, transform .2s;
}
.location-info-item:hover { border-color:var(--border2); transform:translateY(-1px); }
.location-info-item .info-label {
  font-size:.7rem; color:var(--text3); letter-spacing:1px; margin-bottom:10px;
}
.location-info-item .info-value {
  font-size:1.35rem; font-weight:700; color:var(--text); line-height:1;
  font-variant-numeric:tabular-nums;
}
.location-info-item .info-unit {
  font-size:.75rem; color:var(--text3); font-weight:400; margin-left:2px;
}
.location-info-item .info-sub {
  font-size:.68rem; color:var(--text3); margin-top:6px; min-height:14px;
}
/* Speed fullscreen button — sits in card corner */
.location-info-item.speed-card .speed-fs-btn {
  position:absolute; top:8px; right:8px; z-index:2;
}
.location-info-item.speed-card .info-value { color:var(--accent); }
.speed-fs-btn {
  display:inline-flex; align-items:center; justify-content:center;
  width:32px; height:32px; border-radius:8px; border:1px solid var(--border);
  background:var(--card-bg-2); color:var(--text3); cursor:pointer;
  transition:all .2s; padding:0;
}
.speed-fs-btn:hover, .speed-fs-btn:active {
  color:var(--accent); border-color:var(--accent);
  background:var(--accent-light);
}
@media (max-width: 760px) {
  .location-info-grid { grid-template-columns:repeat(2, 1fr); }
  .speed-fs-btn { width:36px; height:36px; }
}
@media (max-width: 420px) {
  .location-coord-card { grid-template-columns:1fr; gap:14px; padding:18px 20px; }
  .location-coord-half:first-child::after { display:none; }
  .location-info-grid { grid-template-columns:1fr; }
  .speed-fs-btn { width:40px; height:40px; }
}

/* ── Speed Fullscreen Overlay ── */
.speed-fs-overlay {
  position:fixed; inset:0; z-index:10000;
  background:linear-gradient(160deg, #0a0f1e 0%, #131b30 40%, #0f1729 100%);
  display:none; flex-direction:column; color:#e2e8f0;
}
.speed-fs-overlay.show {
  display:flex; animation:speedFsFadeIn .35s ease;
}
@keyframes speedFsFadeIn {
  from { opacity:0; transform:scale(.97); }
  to { opacity:1; transform:scale(1); }
}
.speed-fs-overlay * { box-sizing:border-box; }

.speed-fs-header {
  display:flex; align-items:center; justify-content:space-between;
  padding:20px 32px; flex-shrink:0;
  border-bottom:1px solid rgba(255,255,255,.08);
}
.speed-fs-title {
  font-size:1.1rem; font-weight:700; color:#e2e8f0;
  letter-spacing:2px; display:flex; align-items:center; gap:10px;
}
.speed-fs-title::before {
  content:''; width:4px; height:20px; border-radius:2px;
  background:linear-gradient(180deg, var(--accent), var(--accent2));
}
.speed-fs-close {
  width:40px; height:40px; border-radius:10px;
  border:1px solid rgba(255,255,255,.1); background:rgba(255,255,255,.05);
  color:#94a3b8; cursor:pointer; display:flex; align-items:center; justify-content:center;
  transition:all .2s; padding:0;
}
.speed-fs-close:hover {
  color:#fff; background:rgba(239,68,68,.2); border-color:rgba(239,68,68,.4);
}

.speed-fs-body {
  flex:1; display:flex; flex-direction:column; align-items:center; justify-content:center;
  padding:40px 32px; gap:36px;
}

/* Hero speed display */
.speed-fs-hero {
  text-align:center; position:relative;
}
.speed-fs-hero-label {
  font-size:.85rem; color:#64748b; letter-spacing:3px; text-transform:uppercase;
  margin-bottom:16px;
}
.speed-fs-hero-value {
  display:flex; align-items:baseline; justify-content:center; gap:12px;
}
.speed-fs-hero-value > span:first-child {
  font-size:7rem; font-weight:800; line-height:1;
  font-family:'SF Mono','Consolas','JetBrains Mono',monospace;
  color:#fff; font-variant-numeric:tabular-nums;
  text-shadow:0 0 60px rgba(79,110,247,.3);
}
.speed-fs-hero-unit {
  font-size:2rem; font-weight:300; color:#64748b;
}

/* Speed progress bar */
.speed-fs-bar {
  width:min(500px, 80vw); height:6px; border-radius:3px;
  background:rgba(255,255,255,.08); margin-top:28px; overflow:hidden;
}
.speed-fs-bar-fill {
  height:100%; border-radius:3px; width:0%;
  background:linear-gradient(90deg, var(--accent), var(--accent2));
  transition:width .5s ease;
  box-shadow:0 0 12px rgba(79,110,247,.5);
}

/* 3 conversion cards */
.speed-fs-grid {
  display:grid; grid-template-columns:repeat(3, 1fr); gap:16px;
  width:min(600px, 90vw);
}
.speed-fs-card {
  text-align:center; padding:24px 16px; border-radius:16px;
  background:rgba(255,255,255,.04); border:1px solid rgba(255,255,255,.06);
  transition:all .2s;
}
.speed-fs-card:hover {
  background:rgba(255,255,255,.07); border-color:rgba(79,110,247,.3);
}
.speed-fs-card-value {
  font-size:2rem; font-weight:700; color:#e2e8f0;
  font-family:'SF Mono','Consolas','JetBrains Mono',monospace;
  font-variant-numeric:tabular-nums; margin-bottom:6px;
}
.speed-fs-card-unit {
  font-size:.8rem; color:#64748b; letter-spacing:1px;
}

/* Footer status */
.speed-fs-footer {
  display:flex; align-items:center; justify-content:center; gap:12px;
  padding:20px; flex-shrink:0;
  border-top:1px solid rgba(255,255,255,.06);
  font-size:.82rem; color:#64748b;
}
.speed-fs-status-dot {
  display:inline-block; width:8px; height:8px; border-radius:50%;
  background:#64748b; transition:all .3s;
}
.speed-fs-status-dot.active { background:var(--accent); box-shadow:0 0 8px var(--accent); }
.speed-fs-status-dot.error { background:var(--red); }
.speed-fs-status-dot.recording { animation:locationPulse 1.5s infinite; }
.speed-fs-conn {
  padding:3px 10px; border-radius:6px; font-size:.72rem; font-weight:600;
  background:rgba(79,110,247,.15); color:var(--accent); letter-spacing:1px;
}

/* Responsive: mobile */
@media (max-width: 600px) {
  .speed-fs-header { padding:16px 20px; }
  .speed-fs-body { padding:24px 20px; gap:24px; }
  .speed-fs-hero-value > span:first-child { font-size:4.5rem; }
  .speed-fs-hero-unit { font-size:1.4rem; }
  .speed-fs-grid { grid-template-columns:1fr; gap:10px; width:100%; }
  .speed-fs-card { padding:14px 18px; display:flex; align-items:center; justify-content:space-between; }
  .speed-fs-card-value { font-size:1.5rem; margin-bottom:0; }
  .speed-fs-card-unit { font-size:.75rem; }
}

.location-map-container {
  border-radius:var(--radius); overflow:hidden; border:1px solid var(--border);
  height:320px; position:relative; margin-top:0;
  box-shadow:var(--shadow-md);
}
.location-map-inner { width:100%; height:100%; }
.location-map-placeholder {
  position:absolute; top:0; left:0; width:100%; height:100%;
  display:flex; align-items:center; justify-content:center;
  color:var(--text3); font-size:.85rem; pointer-events:none; z-index:1000;
}
.location-map-container .leaflet-container {
  width:100%; height:100%; background:var(--card-bg-2); border:0;
}
/* 暗色模式下将高德瓦片去饱和降亮，融入主题；亮色模式保持原样 */
@media (prefers-color-scheme: dark) {
  .location-map-container .leaflet-tile {
    filter: grayscale(40%) brightness(0.65) saturate(0.4);
  }
}
.location-recenter-btn {
  position:absolute; top:12px; right:12px; z-index:1000;
  width:36px; height:36px; border-radius:50%; background:var(--card-bg);
  border:1px solid var(--border); color:var(--text2); cursor:pointer;
  display:none; align-items:center; justify-content:center;
  font-size:1.2rem; transition:all 0.2s; box-shadow:0 2px 8px rgba(0,0,0,0.1);
}
.location-recenter-btn:hover {
  background:var(--accent); color:#fff; border-color:var(--accent);
  transform:scale(1.05); box-shadow:0 4px 12px rgba(79,110,247,0.3);
}
.location-recenter-btn:active { transform:scale(0.95); }
.location-error-msg {
  background:var(--red-light); border:1px solid rgba(229,62,62,.3);
  border-radius:var(--radius); padding:14px 18px; font-size:.88rem;
  color:var(--red); display:none;
}
.location-error-msg.show { display:block; }
.location-marker-dot {
  width:16px; height:16px; background:var(--accent);
  border:3px solid #fff; border-radius:50%;
  box-shadow:0 0 12px var(--accent), 0 2px 8px rgba(0,0,0,0.5);
  animation:locationMarkerPulse 2s infinite;
}
@keyframes locationMarkerPulse {
  0%, 100% { box-shadow:0 0 12px var(--accent), 0 2px 8px rgba(0,0,0,0.5); }
  50% { box-shadow:0 0 24px var(--accent), 0 2px 16px rgba(79,110,247,0.4); }
}
.leaflet-control-zoom a {
  background:var(--card-bg)!important; color:var(--text2)!important; border-color:var(--border)!important;
}
.leaflet-control-attribution {
  background:rgba(26,34,54,.85)!important; color:var(--text3)!important; font-size:10px!important;
}
.leaflet-control-attribution a { color:var(--accent)!important; }

/* ── Login Prompt (替代内联 style) ── */
.login-prompt-card { text-align:center; padding:40px 24px; }
.login-prompt-icon { font-size:36px; color:var(--text3); margin-bottom:12px; }
.login-prompt-title { font-size:15px; font-weight:600; color:var(--text); margin-bottom:4px; }
.login-prompt-desc { font-size:13px; color:var(--text2); margin-bottom:20px; }
.login-prompt-form { display:flex; gap:8px; justify-content:center; align-items:center; flex-wrap:wrap; }
.login-prompt-form input { width:160px; }
.login-prompt-err { color:var(--red); font-size:.72rem; display:block; min-height:18px; margin-top:8px; }

/* ── Reverse Panel ── */
/* 筛选区：5 个级联下拉，桌面端一行自适应，移动端换行 */
.rev-filters {
  display:grid; grid-template-columns:repeat(5, minmax(0, 1fr));
  gap:10px; margin-bottom:12px;
}
.rev-combo { position:relative; min-width:0; }
.rev-combo-trigger {
  width:100%; display:flex; align-items:center; gap:8px;
  padding:10px 12px; border:1.5px solid var(--border); border-radius:var(--radius-sm);
  font-size:.88rem; background:var(--card-bg); color:var(--text);
  cursor:pointer; transition:border var(--transition), box-shadow var(--transition), background var(--transition);
  font-family:inherit; text-align:left;
}
.rev-combo-trigger:hover { border-color:var(--border2); background:var(--card-bg-2); }
.rev-combo.open .rev-combo-trigger { border-color:var(--accent); box-shadow: 0 0 0 3px rgba(79,110,247,.12); }
.rev-combo-value { flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rev-combo-value.placeholder { color:var(--text3); }
.rev-combo-caret { color:var(--text3); font-size:.7rem; transition:transform var(--transition); flex-shrink:0; }
.rev-combo.open .rev-combo-caret { transform:rotate(180deg); color:var(--accent); }
.rev-combo.disabled .rev-combo-trigger { opacity:.5; cursor:not-allowed; background:var(--card-bg-2); }
.rev-combo.disabled .rev-combo-trigger:hover { border-color:var(--border); background:var(--card-bg-2); }

/* 下拉面板：宽度自适应（不小于 trigger，不超出视口），带滚动 */
.rev-combo-panel {
  position:absolute; top:calc(100% + 6px); left:0; min-width:100%; width:max-content; max-width:min(280px, calc(100vw - 24px));
  z-index:1200; background:var(--card-bg); border:1px solid var(--border); border-radius:var(--radius-sm);
  box-shadow:var(--shadow-lg); display:none; overflow:hidden;
}
.rev-combo.open .rev-combo-panel { display:block; animation:fadeIn .15s ease; }
.rev-combo-panel.align-right { left:auto; right:0; }
.rev-combo-search {
  width:100%; box-sizing:border-box; padding:9px 12px;
  border:none; border-bottom:1px solid var(--border); border-radius:0;
  font-size:.85rem; background:var(--card-bg-2); color:var(--text);
}
.rev-combo-search:focus { box-shadow:none; border-bottom-color:var(--accent); background:var(--card-bg); }
.rev-combo-search::placeholder { color:var(--text3); }
.rev-combo-list { list-style:none; margin:0; padding:5px; max-height:280px; overflow-y:auto; }
.rev-combo-list li {
  padding:8px 12px; border-radius:6px; cursor:pointer; font-size:.86rem; color:var(--text);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; transition:background var(--transition), color var(--transition);
  display:flex; align-items:center; gap:8px;
}
.rev-combo-list li:hover { background:var(--card-bg-2); }
.rev-combo-list li.active { background:var(--accent-light); }
.rev-combo-list li.selected { color:var(--accent); }
/* 多选复选框标记 */
.rev-checkbox {
  width:16px; height:16px; border-radius:4px; flex-shrink:0;
  border:1.5px solid var(--border2); background:var(--card-bg);
  display:inline-flex; align-items:center; justify-content:center;
  font-size:11px; line-height:1; color:#fff; transition:all var(--transition);
}
.rev-combo-list li.selected .rev-checkbox {
  background:var(--accent); border-color:var(--accent);
}
.rev-combo-list li.selected .rev-checkbox::after { content:'✓'; }
.rev-combo-list li.rev-combo-empty { color:var(--text3); cursor:default; text-align:center; display:block; }
.rev-combo-list li.rev-combo-empty:hover { background:transparent; }
/* 面板底部操作栏 */
.rev-combo-foot {
  display:flex; gap:8px; padding:8px; border-top:1px solid var(--border);
  background:var(--card-bg-2);
}
.rev-combo-clear, .rev-combo-ok {
  flex:1; padding:6px 12px; border-radius:6px; font-size:.82rem; font-weight:600;
  cursor:pointer; transition:all var(--transition); font-family:inherit;
}
.rev-combo-clear { background:transparent; border:1.5px solid var(--border); color:var(--text2); }
.rev-combo-clear:hover { border-color:var(--border2); color:var(--text); }
.rev-combo-ok { background:var(--accent); border:1.5px solid var(--accent); color:#fff; }
.rev-combo-ok:hover { background:var(--accent2); border-color:var(--accent2); }

/* 操作区：按钮组 + 结果统计在左，分页工具栏在右 */
.rev-actions { display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:14px; }
.rev-actions-left { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.rev-export-btn { display:none; }
.rev-total-count { font-size:.82rem; color:var(--text2); display:none; }
.rev-toolbar { margin-left:auto; display:none; align-items:center; gap:6px; }
.rev-page-btn { padding:6px 10px; }
.rev-per-page { width:72px; font-size:.82rem; padding:6px 8px; }
.rev-page-info { font-size:.82rem; white-space:nowrap; }

/* 响应式：平板及以下，筛选区改为更少的列 */
@media (max-width: 1024px) {
  .rev-filters { grid-template-columns:repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 600px) {
  .rev-filters { grid-template-columns:repeat(2, minmax(0, 1fr)); }
  .rev-actions { gap:8px; }
  .rev-toolbar { margin-left:0; }
}

/* ── IP Stats Summary (替代内联 style) ── */
.ipstats-summary-bar { display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:8px; }
.ipstats-per-page { border:1px solid var(--border); border-radius:6px; padding:5px 6px; font-size:.8rem; background:var(--card-bg); color:var(--text); cursor:pointer; }

/* ── Inline Edit Inputs (替代内联 style) ── */
.edit-input { width:100%; padding:4px 6px; border:1px solid var(--accent); border-radius:4px; font-size:.82rem; background:var(--card-bg); color:var(--text); outline:none; font-family:inherit; }
.edit-input.mono { font-family:'SF Mono',Consolas,Monaco,monospace; }

/* ── Feature Toggle Indent (替代内联 style) ── */
.toggle-indented { padding-left:16px; border-left:2px solid var(--border2); }
.toggle-row-ancestor-disabled { opacity:0.45; }

/* ── Batch Query Counter ── */
.batch-counter { font-size:.76rem; color:var(--text3); margin-left:8px; white-space:nowrap; }
.batch-counter.over-limit { color:var(--red); font-weight:600; }

/* ── IP Stats Range Btns (替代内联 style) ── */
.ipstats-range-btns { display:flex; gap:4px; }
.ipstats-custom-inputs { font-size:.74rem; }
.ipstats-custom-inputs input[type="date"] { width:130px; padding:3px 6px; border:1px solid var(--border); border-radius:4px; font-size:.74rem; background:var(--card-bg); color:var(--text); }
.ipstats-custom-inputs .ipstats-custom-sep { margin:0 4px; }
.ipstats-actions-tail { display:flex; align-items:center; gap:6px; flex-shrink:0; }
.ipstats-date-range { font-size:.74rem; color:var(--text3); }

/* ── Config Group Headers ── */
.config-group-label {
  font-size:.72rem; font-weight:600; color:var(--text2);
  padding:8px 14px 4px; border-bottom:1px solid var(--border);
  letter-spacing:.5px; background:var(--card-bg-2);
}

