:root{
  --bg:#f5f7fa; --panel:#ffffff; --panel-2:#f7f9fc; --line:#e3e8ef;
  --text:#1f2933; --muted:#6b7a8d; --accent:#1a7f5a; --accent-2:#166a4a;
  --accent-soft:#e8f4ef;
  --up:#d64541; --down:#1a7f5a;
  --row-hover:#f2f7f5;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--bg);color:var(--text);
  font-family:"PingFang SC","Microsoft YaHei","Hiragino Sans GB",system-ui,-apple-system,sans-serif;
  font-size:14px;-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
.topbar{display:flex;justify-content:space-between;align-items:center;gap:16px;
  padding:14px 22px;background:#fff;
  border-bottom:1px solid var(--line);box-shadow:0 1px 2px rgba(16,24,40,.04);
  flex-wrap:wrap;position:sticky;top:0;z-index:20}
.brand{display:flex;align-items:center;gap:12px}
.logo{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;font-weight:800;
  background:linear-gradient(135deg,var(--accent),#0f5c42);color:#fff;letter-spacing:.5px}
.topbar h1{margin:0;font-size:16px}
.sub{margin:2px 0 0;color:var(--muted);font-size:12px}
.source-actions{display:flex;align-items:center;gap:10px}
.state{color:var(--muted);font-size:12px}
.state.err{color:var(--up)}
main{padding:18px 22px 40px;max-width:1560px;margin:0 auto;display:flex;flex-direction:column;gap:16px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;
  box-shadow:0 1px 2px rgba(16,24,40,.04)}
.filters{padding:16px;display:flex;flex-direction:column;gap:14px}
.filter-row{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end}
.field{display:flex;flex-direction:column;gap:6px;min-width:150px}
.field.grow{flex:1;min-width:220px}
.field label{font-size:12px;color:var(--muted);line-height:16px}

/* 控件高度统一，保证同一行内的 label + 控件上下对齐 */
.field > input,
.field > select,
.field > .segmented,
.field > button,
.field > .csv-file-row{min-height:38px}
.field > input[type=file]{min-height:0}
.field-hint{font-size:12px;color:var(--muted);white-space:nowrap}

/* 「CSV 地址」：只在使用自定义数据源时出现，
   高度与同一行的其它控件严格一致（38px），不会把整行撑高 */
.field.csv-field{min-width:300px;flex:1 1 340px}
.field.csv-field[hidden]{display:none}
.csv-input-row{display:flex;align-items:center;gap:8px}
.csv-input-row input[type=text]{flex:1 1 auto;min-width:0}
button.mini{flex:0 0 auto;height:38px;padding:0 14px;font-size:13px;background:var(--accent);color:#fff}
button.mini:hover{background:var(--accent-2)}
.csv-file-row{display:flex;align-items:center;gap:8px;min-height:26px}
.csv-file-row input[type=file]{flex:0 0 auto;max-width:220px;min-height:0;height:26px;
  font-size:12px;color:var(--muted);background:#fff;border:1px solid var(--line);
  border-radius:8px;padding:0 8px;line-height:1}
.csv-file-row input[type=file]::file-selector-button{margin-right:8px;cursor:pointer;
  font-family:inherit;font-size:12px;color:var(--text);background:var(--panel-2);
  border:1px solid var(--line);border-radius:6px;padding:2px 8px}
.csv-file-row input[type=file]::file-selector-button:hover{background:var(--accent-soft)}
input,select,button{font-family:inherit;font-size:13px}
input[type=text],input[type=search],input[type=date],input[type=month],select{
  background:#fff;border:1px solid var(--line);color:var(--text);line-height:20px;
  border-radius:9px;padding:8px 10px;outline:none;height:38px}
input::placeholder{color:#9aa8b8}
input:focus,select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
button{cursor:pointer;border:none;border-radius:9px;padding:9px 14px;background:var(--accent);color:#fff}
button:hover{background:var(--accent-2)}
button.ghost{background:#fff;border:1px solid var(--line);color:var(--text)}
button.ghost:hover{background:var(--panel-2)}
button:disabled{opacity:.45;cursor:not-allowed}
.segmented{display:flex;align-items:center;background:var(--panel-2);border:1px solid var(--line);border-radius:10px;padding:3px;gap:3px}
.segmented button{background:transparent;color:var(--muted);padding:7px 14px;border-radius:8px;height:30px}
.segmented button:hover{background:var(--accent-soft);color:var(--accent)}
.segmented button.active{background:var(--accent);color:#fff}
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px}
.stat{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:14px 16px;
  box-shadow:0 1px 2px rgba(16,24,40,.04)}
.stat .k{color:var(--muted);font-size:12px;margin-bottom:6px}
.stat .v{font-size:21px;font-weight:700;letter-spacing:.3px}
.stat .v small{font-size:12px;color:var(--muted);font-weight:400;margin-left:4px}
.table-card{padding:0;overflow:hidden}
.table-head{display:flex;justify-content:space-between;align-items:baseline;
  padding:14px 16px;border-bottom:1px solid var(--line);gap:12px;flex-wrap:wrap}
.table-head h2{margin:0;font-size:15px}
.hint{color:var(--muted);font-size:12px}
.table-scroll{overflow:auto;max-height:62vh}
table{width:100%;border-collapse:collapse;font-size:13px;white-space:nowrap}
thead th{position:sticky;top:0;background:var(--panel-2);color:var(--muted);
  font-weight:600;text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);z-index:2;
  cursor:pointer;user-select:none}
thead th:hover{color:var(--text)}
thead th.sort-asc::after{content:" ▲";font-size:10px}
thead th.sort-desc::after{content:" ▼";font-size:10px}
tbody td{padding:9px 12px;border-bottom:1px solid var(--line)}
tbody tr:hover{background:var(--row-hover)}
td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
td.code{font-variant-numeric:tabular-nums;font-weight:600}
td.name{max-width:260px;overflow:hidden;text-overflow:ellipsis}
a.code-link{color:var(--accent);font-weight:600}
a.stock-link{color:var(--text);border-bottom:1px dashed var(--accent);cursor:pointer}
td.name a.stock-link:hover{cursor:pointer}
a.stock-link:hover{color:var(--accent);text-decoration:none}
.tag{display:inline-block;padding:1px 7px;border-radius:20px;font-size:11px;
  background:var(--accent-soft);color:var(--accent);border:1px solid rgba(26,127,90,.25)}
.tag.gem{background:#fdf3e3;color:#b3750f;border-color:#f0d9ac}
.pager{display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--line);
  color:var(--muted);font-size:12px;flex-wrap:wrap}
.pager select{min-height:30px;padding:4px 8px}
.empty{padding:46px 16px;text-align:center;color:var(--muted)}
footer{padding:18px 22px 34px;text-align:center;color:var(--muted);font-size:12px}
@media (max-width:720px){
  main{padding:12px}
  .table-scroll{max-height:none}
  .field{min-width:120px}
}

/* 「按股票」维度下的提示条 */
.stock-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin:0;
  background:var(--accent-soft);border:1px solid rgba(26,127,90,.22);border-radius:12px;
  color:var(--accent);font-size:13px}
.stock-banner button{padding:5px 10px;font-size:12px;background:#fff;color:var(--accent);
  border:1px solid rgba(26,127,90,.3)}
.stock-banner button:hover{background:#fff;color:var(--accent-2)}
.head-right{display:flex;align-items:center;gap:10px}
.segmented.small{padding:2px;border-radius:8px}
.segmented.small button{padding:4px 10px;font-size:12px;border-radius:6px}
