/* Timeline v2 visual system — loaded by styles.css import */
.timeline-hero{display:flex;justify-content:space-between;align-items:flex-end;gap:24px;margin:4px 0 18px;padding:4px 2px}.timeline-hero h1{margin:5px 0 4px;font-size:28px;letter-spacing:-.04em}.timeline-hero p{margin:0;color:var(--muted);font-size:12px}.eyebrow{color:var(--orange);font:700 9px Montserrat;letter-spacing:.14em}.timeline-kpis{display:flex;gap:1px;border:1px solid var(--line);background:var(--line);border-radius:12px;overflow:hidden}.timeline-kpis span{min-width:92px;padding:13px 16px;background:#fff}.timeline-kpis b,.timeline-kpis small{display:block}.timeline-kpis b{font:700 20px Montserrat;color:#172033}.timeline-kpis small{margin-top:3px;color:var(--muted);font-size:9px}.timeline-kpis .risk b{color:#d34b2c}.timeline-toolbar{align-items:flex-end;gap:14px;padding:13px 15px;margin-bottom:14px}.timeline-toolbar label{min-width:170px}.timeline-toolbar .live-state{margin-left:auto}.timeline-range{display:flex;gap:3px;padding:3px;background:#f1f3f5;border-radius:8px}.timeline-range button{border:0;background:transparent;border-radius:6px;color:var(--muted);padding:7px 11px;font-size:10px;font-weight:700;cursor:pointer}.timeline-range button.active{background:#172033;color:#fff}.gantt-card{padding:0;min-height:420px;border-radius:12px}.gantt-scroll{padding:13px 14px 4px}.gantt-v2{background:#fff}.gantt-label-head{fill:#f7f8fa}.gantt-scale-head{fill:#f7f8fa}.gantt-head-text{fill:#6f7b8d;font-size:9px;font-weight:700;letter-spacing:.06em}.gantt-month{fill:#7d8796;font-size:9px;font-weight:700}.gantt-grid{stroke:#e8edf1;stroke-width:1}.month-grid{stroke:#d9dfe5}.gantt-row-bg{fill:#fff}.gantt-row-group:hover .gantt-row-bg{fill:#fff8f4}.gantt-row-line{stroke:#eef1f4}.gantt-name{font-size:12px;font-weight:700}.gantt-sub{font-size:9px}.gantt-stage{fill:#9aa4b2;font-size:8px}.gantt-live{fill:#ef5a24;filter:drop-shadow(0 3px 4px rgba(239,90,36,.18))}.gantt-content{fill:#f8b79e}.gantt-ad{fill:#fff;stroke:#e85b25;stroke-width:2;stroke-dasharray:4 3}.gantt-today{stroke:#172033;stroke-width:1.5}.gantt-today-pill{fill:#172033}.gantt-today-label{fill:#fff;font-size:8px;font-weight:700}.gantt-legend{display:flex;align-items:center;gap:17px;flex-wrap:wrap;border-top:1px solid var(--line);padding:11px 17px;color:#657184;font-size:10px}.gantt-legend span{display:inline-flex;align-items:center;gap:6px}.gantt-legend i{display:inline-block;width:18px;height:7px;border-radius:5px}.gantt-legend i.live{background:#ef5a24}.gantt-legend i.content{background:#f8b79e}.gantt-legend i.ad{height:6px;background:#fff;border:2px solid #e85b25}.legend-note{margin-left:auto;color:#a0a8b4}.expiry-panel{padding:17px;overflow:hidden}.expiry-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px}.expiry-head h3{margin:5px 0 0;font-size:14px}.expiry-count{display:grid;place-items:center;width:27px;height:27px;border-radius:9px;background:#fff2ec;color:var(--orange);font:700 11px Montserrat}.expiry-row{display:grid;grid-template-columns:46px minmax(0,1fr) 16px;gap:8px;align-items:center;padding:11px 0;border-top:1px solid #edf0f3}.expiry-row>b{color:#15936d;font:700 16px Montserrat}.expiry-row>b small{margin-left:2px;font-size:8px}.expiry-row span,.expiry-row span small,.expiry-row span strong{display:block}.expiry-row span strong{font-size:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.expiry-row span small{margin-top:3px;color:var(--muted);font-size:8px}.expiry-row>i{color:#aab3be;font-style:normal}.expiry-row.soon>b{color:#dc8a13}.expiry-row.urgent{margin:0 -7px;padding:11px 7px;background:#fff5f1;border-color:#ffd9cc}.expiry-row.urgent>b{color:#d64a2b}.timeline-empty{display:grid;gap:5px;padding:58px 20px}.timeline-empty span{color:var(--muted);font-size:11px}@media(max-width:900px){.timeline-hero{align-items:flex-start;flex-direction:column}.timeline-kpis{width:100%}.timeline-kpis span{flex:1}.timeline-toolbar .live-state{margin-left:0}.timeline-layout{grid-template-columns:1fr}}@media(max-width:560px){.timeline-toolbar{align-items:stretch;flex-direction:column}.timeline-toolbar label{min-width:0}.timeline-range button{flex:1}.gantt-legend{gap:10px}.legend-note{width:100%;margin-left:0}.timeline-hero h1{font-size:23px}}

/* Interactive schedule timeline · vis-timeline 8.5 */
.timeline-chart-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 17px;border-bottom:1px solid var(--line);background:#fbfcfd}.timeline-chart-head b{font-size:11px}.timeline-chart-head span{color:var(--muted);font-size:9px}.gantt-card{padding:0;overflow:hidden}.gantt-card .gantt-legend{margin:0}.timeline-range{flex-wrap:wrap}.timeline-range button{white-space:nowrap}.timeline-range button[data-timeline-action="today"]{color:#172033}.timeline-range button[data-timeline-action="today"]::before{content:"●";margin-right:5px;color:var(--orange);font-size:7px}
#timelineCanvas{min-height:390px;background:#fff}.vis-timeline{border:0;font-family:"Noto Sans TC",sans-serif;color:#172033}.vis-panel.vis-left{border-right:1px solid #dde3ea;background:#fff;box-shadow:7px 0 18px rgba(25,39,62,.035);z-index:3}.vis-panel.vis-center,.vis-panel.vis-top{border-color:#e4e9ef}.vis-labelset .vis-label{border-bottom:1px solid #edf0f3}.vis-labelset .vis-label:hover,.vis-foreground .vis-group:hover{background:#fff8f4}.vis-label .vis-inner{padding:9px 14px}.vis-label.timeline-contract-group .vis-inner>div{position:relative;width:270px;padding-right:48px;box-sizing:border-box}.vis-label.timeline-contract-group b,.vis-label.timeline-contract-group span,.vis-label.timeline-contract-group small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vis-label.timeline-contract-group b{font-size:11px}.vis-label.timeline-contract-group span{margin-top:3px;color:#7a8595;font-size:8px}.vis-label.timeline-contract-group small{position:absolute;top:1px;right:0;max-width:48px;color:#9aa4b2;font-size:7px}.vis-time-axis .vis-text{color:#707c8d;font:600 9px Montserrat,"Noto Sans TC",sans-serif}.vis-time-axis .vis-grid.vis-minor{border-color:#eef1f4}.vis-time-axis .vis-grid.vis-major{border-color:#dce2e8}.vis-current-time{width:2px!important;background-color:#172033!important}.vis-item.timeline-item{min-width:8px;height:18px;border:0;border-radius:7px;box-shadow:none;color:#fff;font-size:8px;font-weight:700;line-height:16px;overflow:hidden}.vis-item.timeline-item .vis-item-content{padding:1px 7px;white-space:nowrap}.vis-item.timeline-item-live{background:#ef5a24;box-shadow:0 3px 6px rgba(239,90,36,.17)}.vis-item.timeline-item-content{background:#f8b79e;color:#7c3219}.vis-item.timeline-item-ad{border:2px solid #e85b25;background:#fff;color:#b54118;line-height:12px}.vis-item.timeline-item.vis-selected{border-color:#172033;box-shadow:0 0 0 3px rgba(23,32,51,.16)}.vis-item.vis-point.timeline-item{width:11px;height:11px;margin-top:4px;padding:0;border-radius:50%}.vis-item.vis-point.timeline-item .vis-item-content{display:none}.vis-tooltip{padding:10px 12px!important;border:1px solid #dfe4ea!important;border-radius:9px!important;background:#172033!important;color:#fff!important;font:500 10px/1.65 "Noto Sans TC",sans-serif!important;box-shadow:0 9px 24px rgba(23,32,51,.18)!important}.vis-tooltip b{font-size:11px}.expiry-panel{max-height:745px}.expiry-panel>#expiryRows{max-height:660px;overflow:auto;scrollbar-width:thin}.expiry-row{width:100%;margin:0;border-right:0;border-bottom:0;border-left:0;background:transparent;text-align:left;font:inherit;cursor:pointer}.expiry-row:hover,.expiry-row:focus-visible,.expiry-row.selected{background:#fff8f4;outline:0}.expiry-row.selected{margin-right:-7px;margin-left:-7px;padding-right:7px;padding-left:7px;box-shadow:inset 3px 0 var(--orange)}
@media(max-width:900px){.timeline-chart-head{align-items:flex-start;flex-direction:column}.expiry-panel{max-height:none}.expiry-panel>#expiryRows{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(250px,75vw);max-height:none;overflow-x:auto}.expiry-row{border-top:1px solid #edf0f3}.vis-panel.vis-left{max-width:250px}.vis-label.timeline-contract-group .vis-inner>div{width:215px}}
@media(max-width:560px){.timeline-range{display:grid;grid-template-columns:repeat(3,1fr)}.timeline-range button:last-child{grid-column:span 2}.timeline-chart-head span{display:none}.vis-panel.vis-left{max-width:190px}.vis-label.timeline-contract-group .vis-inner>div{width:158px;padding-right:0}.vis-label.timeline-contract-group small{position:static;margin-top:3px}.vis-label .vis-inner{padding:8px 10px}}
