/* 直播牆: one large player and the live ranking beside it. */
.tv{--camp:var(--accent-fill);height:calc(100dvh / var(--zoom,1));min-height:420px;display:flex;flex-direction:column;background:var(--bg);padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}.tv[data-set=green]{--camp:#16a34a}.tv[data-set=blue]{--camp:#2563eb}
.tv-header{display:flex;align-items:center;gap:20px;padding:8px 20px;min-height:60px;border-bottom:1px solid var(--line);flex-shrink:0}.tv-header .brand{display:flex;align-items:baseline;gap:12px}.tv-header .wordmark{font-size:clamp(22px,calc(2.2 * var(--vw,1vw)),30px)}.tv-title{font-size:15px;font-weight:600;color:var(--camp)}
.tv-sets{display:flex;gap:4px;background:var(--subtle);border-radius:99px;padding:3px}.tv-sets button{border:0;background:transparent;border-radius:99px;padding:5px 14px;font-size:13px;color:var(--muted)}.tv-sets button[aria-pressed=true]{background:var(--panel);color:var(--ink);box-shadow:inset 0 -2px 0 var(--camp)}.tv-sets button[data-set=green][aria-pressed=true]{color:#4ade80}.tv-sets button[data-set=blue][aria-pressed=true]{color:#60a5fa}
.tv-controls{margin-left:auto;display:flex;align-items:center;gap:6px}.tv-controls>button:not(.icon-button){background:transparent;padding:4px 10px;font-size:15px}/* A fixed width: when the first click turns sound on, the shorter label must not shift the buttons under the pointer. */
#tv-sound{font-size:13px;border-color:var(--camp);min-width:7.5em}#tv-sound[aria-pressed=true]{border-color:var(--line)}
/* The player keeps exactly 16:9 at the largest size the screen allows; the ranking takes the rest. */
.tv-main{--side-min:clamp(300px,18cqw,480px);--chrome:224px;flex:1;min-height:0;display:flex;gap:0;padding:16px;container-type:size}
/* The divider stands in for the 16px gap; dragging it sets the ranking's share of the width. */
/* Once the divider has been moved, the ranking keeps exactly that width and the divider follows the
   pointer; a player already as tall as it can be leaves the extra width empty beside it. */
.tv-main[data-split] .tv-side{flex:0 0 var(--side-min)}.tv-main[data-split] .tv-stage{flex:1 1 0;width:auto;min-width:0}.tv-main[data-split] .tv-player{width:min(100%,calc((100cqh - var(--chrome)) * 16 / 9))}
.tv-split{flex:none;width:16px;position:relative;cursor:col-resize;touch-action:none}.tv-split::before{content:'';position:absolute;top:50%;left:6px;width:4px;height:56px;margin-top:-28px;border-radius:4px;background:var(--line);opacity:0;transition:opacity .2s}.tv-main:hover .tv-split::before,.tv-split:focus-visible::before,.tv-split.dragging::before{opacity:1}.tv-split:hover::before,.tv-split.dragging::before{background:var(--camp)}.tv[data-obs=true] .tv-split::before{display:none}
/* cqw/cqh measure .tv-main's content box, so its 16px padding is already left out. */
.tv-stage{flex:none;width:min(calc(100cqw - 16px - var(--side-min)),calc((100cqh - var(--chrome)) * 16 / 9));min-height:0;display:flex;flex-direction:column;justify-content:flex-start;gap:8px}/* The player and caption sit at the bottom: when 此刻焦點 is shorter than its reserved height, the space opens above the player. */
.tv-player{position:relative;flex:none;width:100%;aspect-ratio:16/9;background:#000;border-radius:18px;overflow:hidden;margin-top:auto}.tv-player iframe{position:absolute;inset:0;width:100%;height:100%;border:0}.tv-empty{height:100%;display:flex;align-items:center;justify-content:center;color:#a1a1aa;font-size:15px}
.tv-caption{display:flex;gap:12px;align-items:center;flex-shrink:0}.tv-stage.measuring .tv-player{margin-top:0}.tv-caption>img{width:40px;height:40px;border-radius:50%;flex-shrink:0;object-fit:cover}.tv-caption-text{min-width:0}.tv-caption h1{margin:0;font-size:clamp(16px,calc(1.5 * var(--vw,1vw)),22px);line-height:1.3;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tv-caption-meta,.tv-caption-channel{margin:0;font-size:12px;line-height:1.4;color:var(--muted);display:flex;gap:6px;align-items:center;flex-wrap:wrap}.tv-caption-meta b{color:var(--ink);font-size:15px;font-variant-numeric:tabular-nums}.tv-caption-channel>a{color:var(--ink);font-weight:500}.tv-live{background:#dc2626;color:#fff;font-size:10px;font-weight:700;padding:1px 6px;border-radius:4px;letter-spacing:.05em}.tv-tag{background:var(--subtle);border-radius:99px;padding:0 7px;font-size:11px;line-height:1.5}
/* The progress line sits right under the caption. */
#tv-progress{width:100%;height:3px;margin-top:-4px;border:0;background:var(--line);accent-color:var(--camp);flex-shrink:0}#tv-progress::-webkit-progress-value{background:var(--camp)}#tv-progress::-moz-progress-bar{background:var(--camp)}
/* The ranking sits straight on the page: no panel, border or padding, so the rows get all the room. */
.tv-side{flex:1;min-width:var(--side-min);min-height:0;container:tvside/size;display:flex;flex-direction:column}.tv-side-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 2px 8px}.tv-side-head h2{margin:0;font-size:14px;font-weight:600}.tv-side-head span{font-size:11px;color:var(--muted)}
/* The rotation list keeps its rows; 其他正在直播 takes the rest of the column and scrolls by itself. */
.tv-scroll{flex:1;min-height:0;display:flex;flex-direction:column}
/* Rotation rows share the column; with other streams below they take about two thirds of it. */
.tv-list{--share:1;flex:0 1 auto;min-height:0;overflow:auto;list-style:none;margin:0;padding:0;display:grid;grid-auto-rows:clamp(66px,calc((100cqh - 120px) * var(--share) / var(--rows,10)),170px);gap:4px;scrollbar-width:thin;scrollbar-color:var(--line) transparent}.tv-list li{--row-camp:var(--line);container:tvrow/size}.tv-list li[data-camp=green]{--row-camp:#16a34a}.tv-list li[data-camp=blue]{--row-camp:#2563eb}
.tv-list button{width:100%;height:100%;display:grid;grid-template-columns:18px auto minmax(0,1fr);gap:9px;align-items:center;text-align:left;border:0;border-left:3px solid var(--row-camp);border-radius:8px;background:transparent;padding:6px 8px 6px 6px}.tv-list button:hover{background:transparent;color:var(--ink)}.tv-list button:hover .tv-row-name,.tv-more button:hover strong{color:var(--camp)}.tv-list li[aria-current=true] button{background:transparent}/* The current row's frame is an inset shadow: inside the row, so the edge of the unpadded ranking cannot
   clip it, and inside the border, so the camp stripe on the left stays in view. */
.tv-list li[aria-current=true] button{box-shadow:inset 0 0 0 2px var(--camp)}.tv-list button{overflow:hidden}.tv-list li[data-unplayable=true] button{opacity:.45}
.tv-rank{font-size:12px;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums}.tv-thumb{position:relative;display:block;flex-shrink:0}/* Every row shows the stream's frame; the channel logo sits before its name. */
.tv-frame{display:block;height:calc(100cqh - 12px);width:auto;aspect-ratio:16/9;object-fit:cover;border-radius:6px;background:#000}.tv-thumb .tv-avatar{display:none}.tv-name-avatar{display:block;width:1.4em;height:1.4em;border-radius:50%;object-fit:cover;flex-shrink:0;background:var(--line)}.tv-avatar{display:block;width:34px;height:34px;border-radius:50%;object-fit:cover;background:var(--line)}
.tv-row-text{min-width:0;display:flex;flex-direction:column;gap:2px}.tv-row-text strong,.tv-row-text small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tv-row-text strong{font-size:13px;font-weight:550}.tv-row-text small{font-size:11px;color:var(--muted);white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.35}
/* A ranking row: logo, channel name and viewers on one line (the name takes whatever width is left),
   then the title beside the viewer trend. */
.tv-row-head{display:flex;align-items:center;gap:.4em;min-width:0;font-size:13px;font-weight:550}.tv-row-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tv-row-count{flex:none;font-variant-numeric:tabular-nums;font-weight:650}.tv-row-sub{display:flex;align-items:center;gap:8px;min-width:0;color:var(--camp)}.tv-row-sub small{flex:1;min-width:0}.tv-row-sub .tv-spark{flex:none}.tv-spark{width:52px;height:16px}.tv-list-empty{color:var(--muted);font-size:13px;padding:20px 6px}
@container tvrow (min-height:92px){.tv-list button{column-gap:12px;padding:8px 10px 8px 8px}.tv-frame{width:min(44cqw,calc((100cqh - 16px) * 16 / 9),356px);height:auto;border-radius:8px}.tv-name-avatar{width:1.5em;height:1.5em}.tv-row-text{gap:6px}.tv-row-head{font-size:clamp(13px,min(16cqh,4.5cqw),24px)}.tv-row-sub small{font-size:clamp(11px,min(11cqh,3.4cqw),17px);line-height:1.45}.tv-spark{width:min(84px,18cqw);height:22px}}
/* A ranking narrowed to its minimum drops the frames, so channel names, viewers and trends keep their room. */
@container tvrow (max-width:360px){.tv-thumb{display:none}.tv-list button{grid-template-columns:18px minmax(0,1fr)}}
.tv-top{display:flex;align-items:stretch;gap:20px;flex-shrink:0;min-width:0}.tv-top:not(:has(>:not([hidden]))){display:none}
/* 泛綠, 無偏 and 泛藍 as one compact bar; the numbers are in its tooltip. */
/* Two short lines in the space of one: viewers by camp above a thin bar. */
.tv-camps{display:flex;flex-direction:column;justify-content:center;gap:4px;flex:0 0 min(400px,34%);min-width:0;white-space:nowrap;container:tvcamps/inline-size}@container tvcamps (max-width:215px){.tv-camp-label{font-size:11px}.tv-camp-label b{margin-left:3px}}.tv-camp-row{display:flex;justify-content:space-between;gap:6px;min-width:0;overflow:hidden}.tv-camp-label{flex:none;font-weight:650;font-size:12px;line-height:1.2}.tv-camp-label b{margin-left:4px;color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}.tv-camp-label.other{color:var(--muted)}.tv-camp-label.green{color:#4ade80}.tv-camp-label.blue{color:#60a5fa}.tv-camp-bar{flex:none;width:100%;height:6px;border-radius:99px;overflow:hidden;display:flex;background:var(--line)}.tv-camp-bar i{display:block;height:100%;transition:width 1s ease}.tv-camp-bar .green{background:#16a34a}.tv-camp-bar .blue{background:#2563eb}.tv-camp-bar .other{background:#71717a}
.tv-ticker{flex:1;min-width:0;border-left:1px solid var(--line);padding-left:20px;display:flex;align-items:flex-start}/* 此刻焦點: the lead photo, then a meta line, the headline on up to two lines, and two more headlines. */
.tv-ticker-card{display:flex;align-items:flex-start;gap:14px;min-width:0;width:100%}/* The photo has one fixed slot at the right, kept even when an event has no photo, so headlines never shift. */.tv-ticker-image{flex:none;display:block;height:100px;aspect-ratio:16/9;border-radius:8px;overflow:hidden;margin-left:auto}.tv-ticker-image:has(img){background:var(--subtle)}.tv-ticker-image img{display:block;width:100%;height:100%;object-fit:cover}.tv-ticker-body{display:flex;flex-direction:column;justify-content:flex-start;gap:2px;min-width:0;flex:1}.tv-ticker-meta{color:var(--muted);font-size:13px}.tv-ticker-move{font-size:13px;font-variant-numeric:tabular-nums}.tv-ticker-move[data-direction=up]{color:#f87171}.tv-ticker-move[data-direction=down]{color:var(--muted)}.tv-ticker-logo{display:inline-block;width:1em;height:1em;margin-right:.35em;vertical-align:-.12em;border-radius:3px;object-fit:contain;background:#fff}/* More headlines on the event, one line each. */
.tv-ticker-also{color:var(--muted);font-size:14px;display:flex;flex-direction:column;gap:1px;min-width:0}.tv-ticker-also-item{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tv-ticker-head{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;min-width:0;font-size:14px}.tv-ticker-head>*{flex:none;white-space:nowrap}.tv-ticker-head>.tv-ticker-meta{flex:0 1 auto;white-space:normal}.tv-ticker-head>strong{color:#f87171;font-weight:650}.tv-ticker-count{color:var(--muted);font-variant-numeric:tabular-nums;font-size:13px}.tv-ticker-tag{color:#fca5a5}.tv-ticker-title{font-size:clamp(18px,calc(1.45 * var(--vw,1vw)),24px);font-weight:600;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
@media(prefers-reduced-motion:no-preference){.tv-ticker-card{animation:tv-ticker-in .5s ease-out}}@keyframes tv-ticker-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.tv-side:has(#tv-more:not([hidden])) .tv-list{--share:.68}
.tv-more{flex:1 1 0;min-height:150px;display:flex;flex-direction:column;margin-top:12px;padding:10px 6px 0;border-top:1px solid var(--line)}.tv-more h3{margin:0 0 6px;font-size:13px;font-weight:600;color:var(--muted)}.tv-more ul{flex:1;min-height:0;overflow:auto;scrollbar-width:none;list-style:none;margin:0;padding:0}.tv-more li{--row-camp:var(--line)}.tv-more li[data-camp=green]{--row-camp:#16a34a}.tv-more li[data-camp=blue]{--row-camp:#2563eb}
/* 其他正在直播 rows stay short, one line of title, so more of them fit. */
/* 其他正在直播: channel name, then its start time on the right of the same line. */
.tv-more-head{display:flex;align-items:baseline;gap:8px;min-width:0}.tv-more-head strong{flex:1;min-width:0}.tv-more-head time{flex:none;font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}
.tv-more button{width:100%;display:grid;grid-template-columns:24px minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left;border:0;border-left:3px solid var(--row-camp);border-radius:6px;background:transparent;padding:3px 8px 3px 6px;margin:1px 0}.tv-more button:hover{background:transparent;color:var(--ink)}.tv-more li[aria-current=true] button{background:transparent;box-shadow:inset 0 0 0 1px var(--camp)}.tv-more img,.tv-more .tv-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;background:var(--line)}.tv-more .tv-row-text strong{font-size:13px}.tv-more .tv-row-text small{font-size:11px;-webkit-line-clamp:1;line-height:1.35}.tv-more button>b{font-size:13px;font-variant-numeric:tabular-nums}
/* Only the logo hides the pointer, so it can be parked there out of the picture. */
.tv-brand,.tv-header .brand{cursor:none}
/* YouTube shows its own title and buttons for the first seconds of each video; a card with the
   stream's current frame covers the player until they have gone. */
/* The cover fills only the time before the stream's picture arrives. */
.tv-cover{position:absolute;inset:0;z-index:1;display:flex;align-items:flex-end;background:#000;opacity:1}.tv-cover>img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}.tv-cover-text{position:relative;width:100%;display:flex;flex-direction:column;gap:6px;padding:48px 24px 22px;background:linear-gradient(transparent,#000d);color:#fff}.tv-cover-text b{display:flex;align-items:center;gap:10px;font-size:clamp(18px,calc(1.6 * var(--vw,1vw)),26px)}.tv-cover-text span{font-size:clamp(14px,calc(1.1 * var(--vw,1vw)),18px);opacity:.85;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tv-cover.leaving{opacity:0;transition:opacity .3s ease}@media(prefers-reduced-motion:reduce){.tv-cover.leaving{transition:none}}
/* Playback starts muted; until sound is on, this sits on the player. */
.tv-player{position:relative}.tv-sound-hint{position:absolute;left:16px;bottom:16px;z-index:2;margin:0;padding:8px 14px;border-radius:99px;background:#000c;color:#fff;font-size:15px;pointer-events:none}
.tv-more-value{display:flex;flex-direction:column;align-items:flex-end;gap:2px;color:var(--camp)}.tv-more-value b{font-size:13px;color:var(--ink);font-variant-numeric:tabular-nums}.tv-more .tv-spark{width:48px;height:12px}
/* Fullscreen hides the header, so the brand moves into the stage above the camp bar. */
/* Fullscreen and OBS: brand on the left, 泛綠/泛藍 in the middle, the clock on the right. */
.tv-brand-row{display:none;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:16px;height:40px;flex-shrink:0;min-width:0;container:tvbrand/inline-size}.tv-brand{display:flex;align-items:baseline;gap:12px;white-space:nowrap}.tv-brand-row>.tv-camps{justify-self:center;width:100%;max-width:300px}
/* The logo, 直播牆 and live.observe.tw always show in full; the camp bar takes what is left. */
.tv-brand>img{width:26px;height:26px;align-self:center}.tv-brand-row .wordmark{font-size:26px}.tv-brand-site{color:var(--muted);font-size:13px;letter-spacing:.02em}.tv-brand-row>time{text-align:right;font:600 22px/1 ui-monospace,"SFMono-Regular",monospace;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
/* Once the divider is moved the player fills the width it is given, and 此刻焦點 makes the height for it, one step
   at a time: 1 no photo or extra headlines, 2 a single line, 3 gone. The caption and its channel line always stay. */
.tv-stage:is([data-fit="1"],[data-fit="2"],[data-fit="3"]) :is(.tv-ticker-image,.tv-ticker-also){display:none}.tv-stage:is([data-fit="2"],[data-fit="3"]) .tv-ticker-meta{display:none}
/* Room left over above the player brings back that many more headlines (data-also = 1–3). */
.tv-stage:is([data-fit="1"],[data-fit="2"])[data-also] .tv-ticker-also{display:flex}.tv-stage[data-fit="1"][data-image] .tv-ticker-image{display:block}.tv-stage[data-also="1"] .tv-ticker-also-item:nth-child(n+2),.tv-stage[data-also="2"] .tv-ticker-also-item:nth-child(n+3){display:none}.tv-stage[data-fit="2"][data-also] .tv-ticker-body{flex-wrap:wrap;row-gap:2px}.tv-stage[data-fit="2"][data-also] .tv-ticker-also{flex-basis:100%}
/* Two lines: the meta follows the tags on the first line and ends in … rather than wrapping. */
.tv-stage[data-fit="1"] .tv-ticker-head{flex-wrap:nowrap;overflow:hidden}.tv-stage[data-fit="1"] .tv-ticker-meta{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tv-stage:is([data-fit="1"],[data-fit="2"]) .tv-ticker-title{-webkit-line-clamp:1}
.tv-stage[data-fit="2"] .tv-ticker-body{flex-direction:row;align-items:baseline;gap:12px}.tv-stage[data-fit="2"] .tv-ticker-head{flex:none;flex-wrap:nowrap}.tv-stage[data-fit="2"] :is(.tv-ticker-tag,.tv-ticker-move){display:none}.tv-stage[data-fit="2"] .tv-ticker-title{flex:1;min-width:0;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tv-stage[data-fit="3"] .tv-ticker{display:none}:is(.tv:fullscreen,.tv[data-obs=true]) .tv-stage[data-fit="3"] .tv-top{display:none}
/* The OBS page is captured as-is, so it always takes the fullscreen layout. */
:is(.tv:fullscreen,.tv[data-obs=true]) .tv-header{display:none}:is(.tv:fullscreen,.tv[data-obs=true]) .tv-brand-row{display:grid}:is(.tv:fullscreen,.tv[data-obs=true]) .tv-main{--chrome:292px}:is(.tv:fullscreen,.tv[data-obs=true]) .tv-top>.tv-camps{display:none}:is(.tv:fullscreen,.tv[data-obs=true]) .tv-ticker{border-left:0;padding-left:0}
@media(max-width:900px){.tv{height:auto;min-height:100dvh}.tv-ticker-image{height:64px}.tv-split{display:none}.tv-frame{height:54px}.tv-scroll{display:block}.tv-list,.tv-more ul{overflow:visible}.tv-more{min-height:0}.tv-side{container-type:normal}.tv-scroll{overflow:visible}.tv-main{grid-template-columns:minmax(0,1fr)}.tv-stage{min-width:0}.tv-top{flex-wrap:wrap;height:auto;gap:8px}.tv-camps{flex-basis:100%}.tv-ticker{border-left:0;padding-left:0;flex-basis:100%}.tv-main{display:grid;container-type:normal}.tv-stage{width:auto}.tv-side{min-width:0}.tv-list{grid-auto-rows:auto}.tv-list li{container-type:normal}.tv-header{flex-wrap:wrap;gap:10px;padding:8px 12px}.tv-controls{margin-left:0}.tv-main{grid-template-columns:1fr;padding:10px;gap:10px}.tv-player{flex:none;aspect-ratio:16/9}.tv-caption h1{white-space:normal}.tv-side{max-height:none}.tv-list{overflow:visible}}
/* One turn of the rotation (帶狀節目 or 非帶狀直播, five each) shares the top of the column; 藍綠比 sits under it and every other stream scrolls below. */
.tv-side[data-grouped] .tv-side-head{display:none}.tv-side[data-grouped] .tv-list{flex:0 0 64%;display:flex;flex-direction:column;gap:0;overflow:hidden}.tv-side[data-grouped] .tv-more{margin-top:0;padding-top:4px;border-top:0;min-height:0}.tv-more-kind{flex:none;font-size:10px;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:0 4px}.tv-side[data-grouped] .tv-list>li:not(.tv-group,.tv-history){flex:1 1 0;min-height:0}.tv-slot{pointer-events:none}.tv-side[data-grouped] .tv-list button{padding:1px 8px 1px 6px}.tv-side[data-grouped] .tv-row-head,.tv-side[data-grouped] .tv-row-sub small{line-height:1.3}.tv-side[data-grouped] .tv-row-sub small{-webkit-line-clamp:1}.tv-side[data-grouped] .tv-row-text{gap:1px}
.tv-list>li:is(.tv-group,.tv-history){container-type:normal}.tv-group{flex:none;display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 2px 2px 4px}.tv-group h3{margin:0;font-size:14px;font-weight:600}.tv-group span{font-size:11px;color:var(--muted)}
.tv-history{flex:none;margin:4px 0;padding:4px 4px 2px;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.tv-history:empty{display:none}.tv-history-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:2px}.tv-history-head h3{margin:0;font-size:14px;font-weight:600}.tv-history-head span{font-size:11px;color:var(--muted);white-space:nowrap}.tv-history-head b{color:var(--ink);font-variant-numeric:tabular-nums}.tv-history-head b.green{color:#4ade80}.tv-history-head b.blue{color:#60a5fa}
.tv-history svg{display:block;width:100%;height:32px;border-radius:4px;overflow:hidden;background:var(--subtle)}.tv-history .green{fill:#16a34a}.tv-history .other{fill:#52525b}.tv-history .blue{fill:#2563eb}.tv-history-axis{display:flex;justify-content:space-between;margin-top:1px;font-size:10px;line-height:1.2;color:var(--muted);font-variant-numeric:tabular-nums}
/* The next stream loads in a second player under the current one; it is shown by swapping which is on top. */
.tv-player iframe{z-index:1}.tv-player iframe.tv-spare{z-index:0;pointer-events:none}.tv-cover{z-index:2}.tv-sound-hint{z-index:3}
