*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;background:#0f172a;color:#e2e8f0;min-height:100vh}.app{display:flex;flex-direction:column;min-height:100vh}.sidebar{position:fixed;top:24px;left:0;z-index:200;display:flex;align-items:flex-start;pointer-events:none}.sidebar-toggle{pointer-events:all;width:22px;height:56px;background:#1e293b;border:1px solid #334155;border-left:none;border-radius:0 8px 8px 0;color:#64748b;font-size:.7rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s;margin-top:8px}.sidebar-toggle:hover{background:#273448;color:#cbd5e1}.sidebar-body{pointer-events:all;background:#1e293b;border:1px solid #334155;border-radius:0 12px 12px 0;padding:14px;width:176px;display:flex;flex-direction:column;gap:14px;box-shadow:4px 0 24px #0006;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#1e293beb}.market-signal{padding:8px 10px;border-radius:8px;text-align:center}.market-signal.bullish{background:#450a0a}.market-signal.bearish{background:#14532d}.market-signal.neutral{background:#1c1917}.signal-text{display:block;font-weight:700;font-size:.9rem}.market-signal.bullish .signal-text{color:#ef4444}.market-signal.bearish .signal-text{color:#22c55e}.market-signal.neutral .signal-text{color:#f59e0b}.signal-score{font-size:.72rem;color:#94a3b8}.btn-crawl{width:100%;background:#3b82f6;color:#fff;border:none;padding:7px 0;border-radius:8px;cursor:pointer;font-size:.82rem;font-weight:500}.btn-crawl:hover{background:#2563eb}.sidebar-section{display:flex;flex-direction:column;gap:6px}.sidebar-label{font-size:.68rem;color:#475569;text-transform:uppercase;letter-spacing:.06em}.hours-group{display:flex;gap:4px}.btn-hours{flex:1;padding:5px 0;border-radius:6px;border:1px solid #334155;background:transparent;color:#94a3b8;cursor:pointer;font-size:.78rem}.btn-hours.active{background:#3b82f6;color:#fff;border-color:#3b82f6}.btn-hours:hover:not(.active){background:#1e3a5f;color:#93c5fd}.tab-group{display:flex;flex-direction:column;gap:3px}.tab-btn{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;border:none;background:transparent;color:#64748b;cursor:pointer;font-size:.83rem;text-align:left;transition:background .12s,color .12s}.tab-btn:hover{background:#0f172a;color:#cbd5e1}.tab-btn.active{background:#1e3a5f;color:#93c5fd;font-weight:600}.tab-icon{font-size:.9rem}.mini-stats{display:flex;gap:4px}.mini-stat{flex:1;text-align:center;padding:6px 4px;border-radius:6px;background:#0f172a}.mini-stat.buy{border-top:2px solid #ef4444}.mini-stat.sell{border-top:2px solid #22c55e}.mini-stat.hold{border-top:2px solid #f59e0b}.ms-num{display:block;font-size:1.05rem;font-weight:800}.mini-stat.buy .ms-num{color:#ef4444}.mini-stat.sell .ms-num{color:#22c55e}.mini-stat.hold .ms-num{color:#f59e0b}.ms-label{font-size:.62rem;color:#64748b}.main{flex:1;padding:20px 24px 40px;transition:padding-left .25s ease;display:flex;flex-direction:column;align-items:center}.main.with-sidebar{padding-left:210px}.main.full{padding-left:36px}.main>.timeline,.main>.opportunities,.main>.crawl-status,.main>.loading,.main>.empty{width:100%;max-width:860px}.loading{text-align:center;padding:80px;color:#64748b}.empty{text-align:center;padding:60px;color:#64748b;font-size:1rem}.timeline{display:flex;flex-direction:column;gap:10px;width:100%}.timeline-slot{background:#1e293b;border:1px solid #334155;border-radius:10px;overflow:hidden}.timeline-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;cursor:pointer;-webkit-user-select:none;user-select:none}.timeline-header:hover{background:#263348}.timeline-time{display:flex;align-items:center;gap:10px}.time-label{font-weight:600;font-size:.9rem;color:#cbd5e1}.item-count{font-size:.75rem;color:#64748b;background:#0f172a;padding:2px 8px;border-radius:10px}.timeline-meta{display:flex;align-items:center;gap:12px}.expand-icon{color:#64748b;font-size:.75rem}.sentiment-bar-wrap{display:flex;align-items:center;gap:8px}.sentiment-bar-track{width:100px;height:6px;background:#334155;border-radius:3px;position:relative;overflow:hidden}.sentiment-bar-fill{height:100%;position:absolute;left:0;border-radius:3px;transition:all .3s}.sentiment-bar-center{position:absolute;left:50%;top:0;width:1px;height:100%;background:#64748b}.sentiment-value{font-size:.78rem;font-weight:600;min-width:30px}.timeline-items{padding:0 12px 12px;display:flex;flex-direction:column;gap:8px}.news-card{background:#0f172a;border-radius:8px;padding:12px;border-left:3px solid #334155}.news-card.buy{border-left-color:#ef4444}.news-card.sell{border-left-color:#22c55e}.news-card.hold{border-left-color:#f59e0b}.news-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.news-tags{display:flex;flex-wrap:wrap;gap:4px}.news-time{font-size:.72rem;color:#64748b;white-space:nowrap}.news-title{display:block;font-size:.88rem;font-weight:600;color:#cbd5e1;text-decoration:none;line-height:1.4;margin-bottom:6px}.news-title:hover{color:#93c5fd}.news-analysis{font-size:.8rem;color:#94a3b8;line-height:1.5;margin-bottom:6px}.tag-action{padding:2px 8px;border-radius:10px;font-size:.72rem;font-weight:700}.tag-action.buy{background:#450a0a;color:#ef4444}.tag-action.sell{background:#14532d;color:#22c55e}.tag-action.hold{background:#292524;color:#f59e0b}.tag-source,.tag-cat,.tag-sector,.tag-conf{padding:2px 7px;border-radius:10px;font-size:.7rem;background:#1e293b;color:#94a3b8}.tag-cat.china{background:#1e3a5f;color:#60a5fa}.tag-cat.international{background:#1a3a2a;color:#34d399}.tag-conf.high{background:#1a3a1a;color:#4ade80}.tag-conf.medium{background:#2a2a1a;color:#facc15}.tag-conf.low{background:#2a1a1a;color:#f87171}.affected-stocks{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}.stock-tag{display:flex;align-items:center;gap:4px;padding:3px 8px;border-radius:6px;font-size:.72rem}.stock-tag.long{background:#450a0a;color:#f87171}.stock-tag.short{background:#14532d;color:#4ade80}.stock-market{opacity:.7}.stock-dir{font-weight:700}.stock-reason{opacity:.7;font-size:.68rem}.opportunities{display:flex;flex-direction:column;gap:20px;width:100%}.stats-row{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}.stat-card{background:#1e293b;border-radius:10px;padding:16px;text-align:center;border:1px solid #334155;transition:border-color .15s;grid-column:span 1}.stat-card.clickable{cursor:pointer}.stat-card.clickable:hover{border-color:#475569;background:#263348}.stat-card.buy{border-color:#450a0a}.stat-card.sell{border-color:#14532d}.stat-card.hold{border-color:#713f12}.stat-value{font-size:2rem;font-weight:800;margin-bottom:4px}.stat-card.buy .stat-value{color:#ef4444}.stat-card.sell .stat-value{color:#22c55e}.stat-card.hold .stat-value{color:#f59e0b}.stat-card.neutral .stat-value{color:#94a3b8}.stat-label{font-size:.8rem;color:#64748b}.stat-hint{font-size:.7rem;color:#475569;margin-top:6px}.stat-card.clickable:hover .stat-hint{color:#94a3b8}.stat-card:has(.signal-detail){grid-column:1 / -1}.signal-detail{margin-top:14px;border-top:1px solid #334155;padding-top:12px;display:flex;flex-direction:column;gap:8px;text-align:left;max-height:520px;overflow-y:auto}.signal-loading{color:#64748b;font-size:.82rem;padding:8px 0}.signal-news-item{background:#0f172a;border-radius:8px;padding:10px 12px;border-left:3px solid #334155;cursor:pointer;transition:background .12s}.signal-news-item:hover{background:#131f35}.signal-news-item.buy{border-left-color:#ef4444}.signal-news-item.sell{border-left-color:#22c55e}.signal-news-item.hold{border-left-color:#f59e0b}.sni-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.sni-tags{display:flex;flex-wrap:wrap;gap:4px}.sni-score{font-size:.8rem;font-weight:700;flex-shrink:0;margin-left:8px}.sni-score.pos{color:#ef4444}.sni-score.neg{color:#22c55e}.sni-title{display:block;font-size:.85rem;font-weight:600;color:#cbd5e1;text-decoration:none;line-height:1.4;margin-bottom:2px}.sni-title:hover{color:#93c5fd}.sni-detail{margin-top:8px;display:flex;flex-direction:column;gap:6px}.sni-analysis{font-size:.78rem;color:#94a3b8;line-height:1.5;background:#1e293b;padding:6px 10px;border-radius:6px}.sni-stocks{display:flex;flex-wrap:wrap;gap:5px}.sni-summary{font-size:.75rem;color:#64748b;line-height:1.5}.sector-sentiment{background:#1e293b;border:1px solid #334155;border-radius:10px;padding:16px}.sector-sentiment h3{margin-bottom:10px;font-size:.95rem}.sector-subtitle{font-size:.7rem;color:#475569;font-weight:400}.sector-list{display:flex;flex-direction:column;gap:7px}.sector-row{display:flex;align-items:center;gap:10px}.sector-name{width:110px;font-size:.82rem;color:#cbd5e1;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sector-bar-wrap{flex:1;height:8px;background:#0f172a;border-radius:4px;position:relative;overflow:hidden}.sector-bar{position:absolute;height:100%;border-radius:2px;transition:width .4s ease}.sector-score{width:38px;text-align:right;font-size:.78rem;font-weight:600;flex-shrink:0}.sector-score.pos{color:#22c55e}.sector-score.neg{color:#ef4444}.opp-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.opp-section{background:#1e293b;border-radius:10px;padding:16px;border:1px solid #334155}.opp-section.buy{border-color:#14532d}.opp-section.sell{border-color:#450a0a}.opp-section h3{margin-bottom:12px;font-size:.9rem}.empty-sm{color:#64748b;font-size:.8rem}.opp-item{padding:10px;border-radius:8px;margin-bottom:8px;border-left:3px solid transparent}.opp-item.buy{background:#0f172a;border-left-color:#ef4444}.opp-item.sell{background:#0f172a;border-left-color:#22c55e}.opp-title{font-size:.82rem;font-weight:600;color:#cbd5e1;margin-bottom:4px;line-height:1.4}.opp-summary{font-size:.75rem;color:#94a3b8;margin-bottom:6px}.opp-sectors{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:6px}.crawl-status{background:#1e293b;border-radius:10px;padding:20px;border:1px solid #334155;width:100%}.status-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.btn-refresh{background:#334155;color:#cbd5e1;border:none;padding:6px 14px;border-radius:6px;cursor:pointer;font-size:.82rem}.btn-refresh:hover{background:#3d5068}.next-crawl{font-size:.82rem;color:#60a5fa;margin-bottom:16px}.sources-section{margin-bottom:20px}.sources-section h4{font-size:.85rem;margin-bottom:10px;color:#94a3b8;display:flex;align-items:center;gap:10px}.source-summary{display:flex;gap:8px;font-size:.78rem;font-weight:400}.src-ok{color:#22c55e}.src-empty{color:#94a3b8}.src-error{color:#ef4444}.source-list{display:flex;flex-direction:column;gap:6px;margin-bottom:20px}.source-row{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:8px;background:#0f172a;border-left:3px solid #334155}.source-row.ok{border-left-color:#22c55e}.source-row.error{border-left-color:#ef4444}.source-row.empty{border-left-color:#475569}.source-row.pending{border-left-color:#334155}.src-icon{font-size:.85rem;flex-shrink:0}.src-info{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}.src-name{font-size:.85rem;font-weight:600;color:#cbd5e1}.src-url{font-size:.7rem;color:#475569;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.src-url:hover{color:#60a5fa}.src-err-msg{font-size:.7rem;color:#f87171;margin-top:2px}.src-meta{display:flex;align-items:center;gap:6px;flex-shrink:0}.src-cat{padding:2px 7px;border-radius:10px;font-size:.7rem}.src-cat.china{background:#1e3a5f;color:#60a5fa}.src-cat.international{background:#1a3a2a;color:#34d399}.src-count{font-size:.75rem;color:#64748b}.src-time{font-size:.72rem;color:#475569}.crawl-logs h4{font-size:.85rem;margin-bottom:8px;color:#94a3b8}.log-row{display:flex;align-items:center;gap:12px;padding:8px;border-radius:6px;background:#0f172a;margin-bottom:6px;flex-wrap:wrap}.log-status{font-size:.8rem;font-weight:600}.log-time{font-size:.78rem;color:#64748b}.log-stats{font-size:.78rem;color:#94a3b8}.log-errors{font-size:.72rem;color:#f87171}.footer{text-align:center;padding:10px;font-size:.72rem;color:#334155}@media(max-width:768px){.sidebar{top:16px}.main.with-sidebar{padding-left:200px}.opp-grid{grid-template-columns:1fr}.stats-row{grid-template-columns:repeat(2,1fr)}.source-row{flex-wrap:wrap}.src-meta{width:100%;justify-content:flex-end}}
