/* 列车轨迹：统一线路按里程分段，上下行独立轨道。 */
.tt-page{display:grid;gap:14px;min-width:0}.tt-panel{background:white;border:1px solid var(--border);border-radius:7px;padding:16px;min-width:0}.tt-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.tt-section-head h2{font-size:16px;font-weight:600}.tt-actions{display:flex;gap:12px;align-items:center;flex-wrap:wrap}.tt-actions select{height:32px;border:1px solid var(--border);border-radius:4px;background:white;padding:0 10px;color:var(--text-primary);font-size:14px}.tt-muted{font-size:12px;color:var(--text-muted)}.tt-line-scroll{overflow-x:auto;margin-top:12px}.tt-folded{min-width:670px}.tt-segment{position:relative;border-bottom:1px solid var(--border);padding:8px 0 2px}.tt-segment:first-child{border-top:1px solid var(--border)}.tt-segment-head{display:flex;justify-content:space-between;color:var(--text-secondary);font-size:12px;line-height:22px;padding-right:8px}.tt-segment-head b{color:var(--primary);font-size:13px;margin-right:8px}.tt-join-arrow{margin:0 8px;color:var(--primary)}.tt-track{position:relative;height:76px;--rail-y:66px}.tt-track-name{position:absolute;left:0;top:calc(var(--rail-y) - 12px);font-size:13px;font-weight:600;width:60px}.tt-track-name.up{color:#4389cc}.tt-track-name.down{color:var(--primary)}.tt-rail-bed{position:absolute;left:66px;right:24px;top:calc(var(--rail-y) - 5px);height:12px;background:#eef2f4}.tt-rail-sleepers{position:absolute;left:66px;right:24px;top:calc(var(--rail-y) - 4px);height:11px;background:repeating-linear-gradient(90deg,transparent 0,transparent 13px,#b8c7cd 13px,#b8c7cd 16px,transparent 16px,transparent 25px)}.tt-rail{position:absolute;left:66px;right:24px;height:2px;background:#8ba0a8}.tt-rail-upper{top:calc(var(--rail-y) - 2px)}.tt-rail-lower{top:calc(var(--rail-y) + 4px)}.tt-track-trains{position:absolute;inset:0}.tt-moving-train{position:absolute;top:0;width:0}.tt-train-info{position:absolute;width:184px;height:28px;transform:translateX(-50%);border:1px solid #dbe5e9;border-left:3px solid var(--train-color);border-radius:4px;background:#fff;padding:0 8px;display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap;font-size:13px;line-height:24px;color:var(--text-primary);cursor:pointer;z-index:3}.tt-train-info strong{font-weight:600;color:var(--train-color)}.tt-train-info b{color:var(--train-color)}.tt-train-info [data-mileage]{font-family:Consolas,monospace}.tt-moving-train.selected .tt-train-info{background:var(--primary-bg);border-color:var(--train-color)}.tt-train-body{position:absolute;width:30px;height:26px;transform:translateX(-50%);display:flex;align-items:center;justify-content:center;z-index:2}.tt-train-body span{font-size:27px;line-height:26px}.tt-true-position{position:absolute;width:5px;height:5px;border-radius:50%;background:var(--train-color);transform:translateX(-50%);z-index:3}.tt-leader{position:absolute;left:0;top:0;overflow:visible;pointer-events:none;z-index:1;opacity:.7}.tt-segment-ruler{position:relative;height:28px;margin-left:66px;margin-right:24px;font-size:12px;color:var(--text-muted)}.tt-ruler-start{position:absolute;left:0}.tt-ruler-end{position:absolute;right:0}.tt-waypoint{position:absolute;top:0;transform:translateX(-50%);white-space:nowrap;color:var(--text-secondary);max-width:240px;overflow:hidden;text-overflow:ellipsis}.tt-waypoint i{display:inline-block;width:5px;height:5px;border-radius:50%;border:1px solid #8ba0a8;margin:0 5px 2px 0}.tt-waypoint small{font-size:12px;color:var(--text-muted);margin-left:4px}.tt-scene-footer{display:flex;justify-content:space-between;gap:8px 16px;flex-wrap:wrap;padding-top:12px;color:var(--text-muted);font-size:12px}.tt-table-wrap{overflow:auto;margin:12px -16px -16px}.tt-table{width:100%;border-collapse:collapse;white-space:nowrap;font-size:13px}.tt-table th{height:42px;background:#f6f8fa;text-align:left;color:var(--text-secondary);font-size:12px;font-weight:500}.tt-table td{height:46px;border-top:1px solid var(--border)}.tt-table td,.tt-table th{padding:0 16px}.tt-table tr.selected td{background:var(--primary-bg)}.tt-table td:last-child,.tt-table th:last-child{position:sticky;right:0;background:white}.tt-table tr.selected td:last-child{background:var(--primary-bg)}.tt-line-button{border:0;background:none;color:var(--primary);cursor:pointer;font:inherit}.tt-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px}.tt-state{font-size:12px;background:var(--success-bg);color:var(--primary);padding:4px 8px;border-radius:4px}.tt-page button:focus-visible,.tt-page select:focus-visible{outline:2px solid var(--primary);outline-offset:2px}@media(max-width:1100px){.tt-table{min-width:700px}}
/* 紧凑全线视图：分段说明并入原里程行，保留完整内容和正常滚动能力。 */
.content-area.page-train-trajectory{padding-top:8px;padding-bottom:8px}.tt-route-panel{padding:12px}.tt-line-scroll{margin-top:4px}.tt-segment{padding:2px 0 0}.tt-segment-ruler{height:20px;line-height:20px}.tt-ruler-start b{color:var(--primary);font-size:12px;margin-right:6px}.tt-ruler-start,.tt-ruler-end{white-space:nowrap}.tt-track{height:48px;--rail-y:44px}.tt-train-body{height:20px}.tt-train-body span{font-size:21px;line-height:20px}.tt-track-name{top:calc(var(--rail-y) - 10px);line-height:20px}.tt-actions{gap:8px}.tt-list-button{height:32px;border:1px solid var(--border);border-radius:4px;background:white;color:var(--text-primary);padding:0 10px;font:inherit;cursor:pointer;white-space:nowrap}.tt-list-button:hover{border-color:var(--primary);color:var(--primary)}.tt-popup-table .tt-table-wrap{margin:0}.tt-popup-table{min-width:0}.tt-waypoint{max-width:220px}
.tt-segment-number{position:absolute;left:0;top:2px;color:var(--primary);font-size:12px;font-weight:600;line-height:16px}
.tt-section-head h2{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tt-route-panel>.tt-section-head{position:sticky;top:-8px;z-index:10;background:white}


/* 加强相邻分段之间的视觉边界。 */
.tt-segment:not(:last-child){border-bottom:2px solid #adc9c4}
/* 正常运行统一绿色，选中时仍保留既有强调边框。 */
.tt-moving-train.running .tt-train-info{background:var(--primary-bg);border-color:var(--train-color)}
/* 停留与目标信号丢失使用独立状态，保留 184px 信息条。 */
.tt-moving-train.stopped .tt-train-info,.tt-moving-train.stopped.selected .tt-train-info{background:#eef2f4;border-color:#b3bfc6;color:#4c5b65}.tt-moving-train.lost .tt-train-info,.tt-moving-train.lost.selected .tt-train-info{background:#fff2d8;border:1px dashed #c39952;border-left:3px solid #c39952;color:#805516}.tt-moving-train.stopped .tt-train-info,.tt-moving-train.lost .tt-train-info{gap:2px;padding:0 4px}.tt-moving-train.stopped [data-train-summary],.tt-moving-train.lost [data-train-summary]{font-size:12px;font-variant-numeric:tabular-nums}.tt-moving-train.stopped .tt-train-body{filter:grayscale(.85)}.tt-moving-train.lost .tt-train-body{filter:grayscale(1);opacity:.5}.tt-moving-train.lost .tt-true-position{background:white;border:1px solid #9a6416}.tt-state.stopped{background:#eef2f4;color:#4c5b65}.tt-state.lost{background:#fff2d8;color:#805516}.tt-popup-table .tt-table{min-width:850px}

/* 状态入口与数据新鲜度归入标题区，保持全线的可用高度。 */
.tt-route-panel>.tt-section-head{gap:4px 12px;padding-bottom:4px}
.tt-title-group{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.tt-status-summary{display:flex;align-items:center;gap:4px}
.tt-status-button{height:28px;padding:0 8px;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--text-secondary);font:inherit;font-size:13px;white-space:nowrap;cursor:pointer}
.tt-status-button b{margin-left:3px;font-variant-numeric:tabular-nums}
.tt-status-button.running{color:#177d70}.tt-status-button.stopped{color:#65747d}.tt-status-button.lost{color:#9a6416;background:#fff2d8}
.tt-status-button[aria-pressed="true"]{border-color:currentColor;background:var(--primary-bg)}
.tt-status-button.lost[aria-pressed="true"]{background:#fff2d8}
.tt-status-button:hover{box-shadow:inset 0 0 0 1px currentColor}.tt-status-button:disabled{opacity:.5;cursor:default;box-shadow:none}
.tt-header-meta{flex:0 0 auto;margin-left:auto;display:flex;justify-content:space-between;gap:4px 12px;flex-wrap:wrap;font-size:12px;line-height:20px}
.tt-feed-status{color:#177d70;font-variant-numeric:tabular-nums}.tt-feed-status[data-feed-state="delayed"]{color:#9a6416}.tt-feed-status[data-feed-state="interrupted"]{color:#a43e3b}
.tt-moving-train.tt-dimmed{opacity:.35}
.tt-waypoint{color:var(--text-primary)}.tt-waypoint b{font-size:13px;font-weight:600}.tt-waypoint i{border-color:#177d70;background:#eaf5f3;width:6px;height:6px}
.tt-ruler-start{font-weight:500;color:var(--text-secondary)}
.tt-key-marker{position:absolute;width:0;border-left:1px dashed #88aaa4;pointer-events:none;z-index:0}
.tt-moving-train.lost .tt-train-info,.tt-moving-train.lost.selected .tt-train-info{border:2px solid #d38b23;border-left-width:4px;background:#fff2d8;animation:tt-lost-attention 1s ease-in-out 3}
.tt-moving-train.lost .tt-train-info strong:before{content:'⚠';font-size:12px;margin-right:3px}
.tt-moving-train.lost .tt-true-position{width:8px;height:8px;outline:3px solid #fff2d8}
@keyframes tt-lost-attention{50%{box-shadow:0 0 0 4px rgba(211,139,35,.22)}}
@media(prefers-reduced-motion:reduce){.tt-moving-train.lost .tt-train-info{animation:none}}
/* 轨道报警圆点：显式上下行归属，波纹仅用于状态提醒。 */
.tt-actions select{width:128px}
.tt-alarm-toggle{display:flex;align-items:center;gap:5px;height:32px;white-space:nowrap;font-size:13px;cursor:pointer;color:var(--text-primary)}
.tt-alarm-toggle input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer}.tt-alarm-toggle span{color:var(--text-muted);font-size:12px}
.tt-alarm-layer{position:absolute;inset:0;pointer-events:none;z-index:4}.tt-alarm-layer[hidden]{display:none}
.tt-alarm-layer{z-index:2}
.tt-alarm-marker{--alarm-color:#dc5b57;position:absolute;transform:translate(-50%,-50%);width:24px;height:24px;border:0;border-radius:50%;background:transparent;padding:0;color:var(--alarm-color);cursor:pointer;pointer-events:auto;overflow:visible}
.tt-alarm-marker.medium{--alarm-color:#d58b23}.tt-alarm-marker.low{--alarm-color:#b79b24}.tt-alarm-marker.settled{--alarm-color:#788791}
.tt-alarm-core{position:absolute;left:8px;top:8px;width:8px;height:8px;border-radius:50%;background:var(--alarm-color);box-shadow:0 0 0 2px white;pointer-events:none}
.tt-alarm-ring{position:absolute;left:7px;top:7px;width:10px;height:10px;border:1px solid var(--alarm-color);border-radius:50%;opacity:.55;pointer-events:none;animation:tt-alarm-ripple 2s linear infinite}
.tt-alarm-ring:nth-child(2){animation-delay:-.667s}.tt-alarm-ring:nth-child(3){animation-delay:-1.333s}
.tt-alarm-marker.settled .tt-alarm-ring{animation:none;transform:scale(1.45);opacity:.35}.tt-alarm-marker.settled .tt-alarm-ring:not(:first-child){display:none}
.tt-alarm-burst{position:absolute;left:7px;top:7px;width:10px;height:10px;border:2px solid var(--alarm-color);border-radius:50%;opacity:0;pointer-events:none;animation:tt-alarm-arrival 2.4s ease-out 1}
.tt-alarm-marker:hover,.tt-page .tt-alarm-marker:focus-visible,.tt-alarm-marker[aria-expanded="true"]{outline:2px solid var(--alarm-color);outline-offset:2px;background:transparent}
@keyframes tt-alarm-ripple{0%{transform:scale(.8);opacity:.55}100%{transform:scale(3.4);opacity:0}}
@keyframes tt-alarm-arrival{0%{transform:scale(.8);opacity:.8}100%{transform:scale(4.6);opacity:0}}
@media(prefers-reduced-motion:reduce){.tt-alarm-ring{animation:none;transform:scale(1.5);opacity:.4}.tt-alarm-ring:not(:first-child),.tt-alarm-burst{display:none}}
.tt-alarm-tooltip{position:fixed;z-index:1000;width:260px;max-width:calc(100vw - 16px);padding:10px 12px;background:white;border:1px solid #e4eaee;border-top:3px solid var(--alarm-tip-color,#dc5b57);border-radius:4px;box-shadow:0 4px 16px rgba(27,53,68,.16);font-size:13px;line-height:21px;pointer-events:auto;color:var(--text-primary)}
.tt-alarm-tooltip[hidden]{display:none}.tt-alarm-tooltip strong,.tt-alarm-tooltip span,.tt-alarm-tooltip small{display:block}.tt-alarm-tooltip strong{color:var(--alarm-tip-color,#a43e3b)}.tt-alarm-tooltip small{font-size:12px;color:var(--primary);margin-top:4px}

.tt-alarm-tooltip.pinned{pointer-events:auto}.tt-alarm-tip-actions{display:flex;justify-content:flex-end;gap:16px;margin-top:8px;padding-top:6px;border-top:1px solid var(--border)}.tt-alarm-tip-actions button{font-size:13px;line-height:26px}.tt-alarm-tip-actions button:focus-visible{outline:2px solid var(--primary);outline-offset:2px}

/* 悬浮圆点到气泡之间保留可穿过的透明区域，气泡始终可点击。 */
.tt-alarm-tooltip:before{content:'';position:absolute;inset:-10px;z-index:-1}
.tt-alarm-tip-row{display:grid;grid-template-columns:56px minmax(0,1fr);gap:8px;align-items:baseline;line-height:24px}
.tt-alarm-tip-row>span{color:var(--text-secondary);white-space:nowrap}.tt-alarm-tip-row>b{font-weight:400;white-space:nowrap}.tt-alarm-tip-row>strong{font-weight:600}

/* 近60秒信号瀑布图，固定图高并适配工作区。 */
.tt-waterfall-toolbar{display:flex;justify-content:flex-end;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0 4px;font-size:12px;color:var(--text-secondary)}
.tt-waterfall-toolbar [role=tablist]{display:flex;gap:4px}
.tt-channel{height:32px;padding:0 16px;border:1px solid var(--border);border-radius:4px;background:white;color:var(--text-primary);font:inherit;font-size:14px;cursor:pointer}
.tt-channel.active{border-color:var(--primary);background:var(--primary-bg);color:var(--primary)}
.tt-channel:hover{border-color:var(--primary)}
.tt-intensity{display:inline-block;width:90px;height:8px;margin:0 8px;background:linear-gradient(90deg,#f7faf9,#6dbaa7,#177d70,#e7a13b)}
#ttWaterfall{display:block;width:100%;height:clamp(420px,calc(100vh - 244px),760px)}
.tt-waterfall-hint{min-height:24px;line-height:24px;font-size:12px;color:var(--text-secondary);font-variant-numeric:tabular-nums}

/* 全线只占一行（上下行轨道），下方保留60秒瀑布图。 */
.tt-route-panel .tt-line-scroll{border-bottom:1px solid var(--border);padding-bottom:4px}
.tt-route-panel .tt-segment-ruler{height:44px}
.tt-route-panel .tt-waypoint{top:0;text-align:center}
.tt-route-panel .tt-ruler-end{text-align:right}
.tt-route-panel .tt-location-label small{display:block;margin:0;color:var(--text-muted);font-size:12px;font-weight:400;line-height:20px}
.tt-route-panel .tt-location-label b{display:block;margin:0;color:var(--text-primary);font-size:13px;font-weight:600;line-height:20px}
#ttWaterfall{height:clamp(320px,calc(100vh - 406px),610px)}
.tt-header-meta>.tt-feed-status{margin-left:auto}

/* 上下行留出24px间隔，避免列车标签紧贴相邻轨道。 */
.tt-route-panel .tt-track+.tt-track{margin-top:24px}
