/*
 * phonofilm.tv — the whole stylesheet.
 *
 * THE COMPATIBILITY FLOOR, AND WHY IT IS THIS LOW
 * ----------------------------------------------
 * The panels this site exists for are LG webOS 3.0 (Chromium 38, 2016) and
 * Samsung Tizen 2.4-3.0 (Chromium 47, 2015-2017). Everything newer — Tizen 4+,
 * webOS 4+, every Android TV box — is a superset. So the rules below hold:
 *
 *   - no custom properties (`var()`), Chromium 49
 *   - no CSS grid, Chromium 57
 *   - no flexbox `gap`, Chromium 84 — margins do the spacing
 *   - no `position: sticky`, Chromium 56 — `fixed` does the nav
 *   - no `min()` / `max()` / `clamp()`, Chromium 79 — media queries cap the ramp
 *   - no `:focus-visible`, Chromium 86 — a remote has no pointer, so plain
 *     `:focus` IS the visible state and there is nothing to disambiguate
 *   - no `filter: blur()` anywhere near a full-bleed image: it is the single
 *     most reliable way to drop a 2016 panel to five frames a second
 *
 * `vw`, `rem`, `calc`, flexbox, transforms, transitions, `box-shadow`,
 * `linear-gradient` and `object-fit` are all Chromium 32 or earlier, so they
 * are in — and a floor is not an excuse for a plain screen. Everything below is
 * spent on depth, rhythm and a focus state you can read from a sofa.
 *
 * THE SIZE RAMP
 * -------------
 * Designed at 1280x720 with a 16 px root, which is the Flutter TV app's own
 * 960x540 dp baseline (`lib/tv/widgets/tv_metrics.dart`) scaled by 1.333 — so
 * every number below traces to a measured one over there rather than to taste.
 *
 * The root is `vw`-based because TV browsers are desktop-class and most of them
 * IGNORE `<meta name="viewport">` outright: a 1080p panel hands us a 1920 CSS
 * px viewport, not the 1280 the meta tag asks for. Sizing the root off the
 * viewport makes both cases render identical proportions, and makes the meta
 * tag harmless where it IS honoured (Chrome on Android TV).
 *
 * THE PALETTE, in one place because there are no custom properties to keep it
 * in: background #0E0E0D · surface #161513 · raised #1E1C19 · hairline #2E2A26
 * · text #F5F2EA · muted #B8AFA4 · accent #E8A13A · bad #C4503A. These are the
 * website's own tokens, unchanged, so the two surfaces read as one product.
 */

/* ── Root ramp ─────────────────────────────────────────────────────────── */

html {
	/* Floor for anything that reports an unexpectedly narrow viewport (a
	   browser-in-a-window on a set-top box, a phone opening the .tv domain by
	   accident). Never smaller than 16 px. */
	font-size: 16px;
	background: #0e0e0d;
	color: #f5f2ea;
	/* A TV browser that overshoots its own viewport paints the overflow into
	   the bezel, where it cannot be scrolled back. */
	overflow-x: hidden;
}

@media (min-width: 900px) {
	html {
		font-size: 1.25vw;
	}
}

/* 4K panels report 3840 CSS px on some firmwares. 1.25vw there is a 48 px root
   and a card wider than a phone; cap it instead. */
@media (min-width: 2200px) {
	html {
		font-size: 27px;
	}
}

body {
	margin: 0;
	background: #0e0e0d;
	color: #f5f2ea;
	/*
	 * No webfonts. Two variable woff2 faces is what the main site pays for its
	 * type, and on a television it buys nothing: at three metres the difference
	 * between Urbanist and the panel's own UI sans is invisible, while the
	 * download is not. Samsung ships Tizen with its own sans, LG ships webOS
	 * with a Roboto-alike, and Android TV has Roboto.
	 */
	font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif;
	font-size: 1.33rem;
	line-height: 1.45;
	-webkit-font-smoothing: antialiased;
}

img {
	border: 0;
}

a {
	color: inherit;
	text-decoration: none;
}

button {
	font: inherit;
	color: inherit;
	background: none;
	border: 0;
	cursor: pointer;
}

/*
 * The one thing on the page that is genuinely fixed decoration: a soft wash at
 * the top, so the wordmark and the first heading sit on something rather than
 * floating on flat black. One gradient, painted once, no compositing cost.
 */
body:before {
	content: '';
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	height: 16rem;
	z-index: 0;
	pointer-events: none;
	background: -webkit-linear-gradient(top, #17161300 0%, rgba(0, 0, 0, 0) 100%);
	background: linear-gradient(to bottom, rgba(40, 36, 30, 0.42) 0%, rgba(14, 14, 13, 0) 100%);
}

/* ── The one focus language ────────────────────────────────────────────── */

/*
 * `TvMetrics.focusRing` verbatim: stroke 0.2rem in the accent. A D-pad has no
 * hover, so this can never be subtle-on-demand — it is either visible or the
 * reader is lost.
 *
 * The border is always PRESENT and only changes colour, so gaining focus never
 * moves anything. The lift is scale plus a shadow: at three metres a 4% scale
 * alone is easy to miss on a busy poster wall, and the shadow is what separates
 * the focused card from its neighbours rather than just enlarging it.
 *
 * Every focusable in this app carries `.f`. It sets no `display` on purpose —
 * `.f` is worn ALONGSIDE `.card`, `.btn`, `.nav-item`, `.key` and `.ep`, each
 * of which owns its own box, and a display rule here would be decided by source
 * order between two single-class selectors.
 */
.f {
	border: 0.2rem solid transparent;
	border-radius: 0.9rem;
	outline: 0;
	-webkit-transition:
		-webkit-transform 130ms ease-out,
		border-color 130ms ease-out,
		background-color 130ms ease-out,
		box-shadow 130ms ease-out;
	transition:
		transform 130ms ease-out,
		border-color 130ms ease-out,
		background-color 130ms ease-out,
		box-shadow 130ms ease-out;
}

.f:focus {
	border-color: #e8a13a;
	box-shadow: 0 0.9rem 2.2rem rgba(0, 0, 0, 0.65);
	-webkit-transform: scale(1.04);
	transform: scale(1.04);
}

/* A stop with nothing left to do keeps its ring and dims its CONTENT — a
   control that has gone invisible is its own kind of lie (TvMetrics comment). */
.f[aria-disabled='true'] > * {
	opacity: 0.4;
}

.f[aria-disabled='true']:focus {
	-webkit-transform: none;
	transform: none;
}

@media (prefers-reduced-motion: reduce) {
	.f {
		-webkit-transition: border-color 130ms ease-out;
		transition: border-color 130ms ease-out;
	}
	.f:focus {
		-webkit-transform: none;
		transform: none;
	}
}

/* ── Shell: fixed left rail + pane ─────────────────────────────────────── */

.shell {
	padding-left: 11.5rem;
}

.nav {
	position: fixed;
	top: 0;
	left: 0;
	bottom: 0;
	width: 11.5rem;
	z-index: 3;
	/* A flat panel edge would read as a seam against the pane's artwork; a
	   two-stop wash reads as depth and costs one paint. */
	background: -webkit-linear-gradient(left, #131210 0%, rgba(14, 14, 13, 0.85) 100%);
	background: linear-gradient(to right, #131210 0%, rgba(14, 14, 13, 0.85) 100%);
	text-align: center;
}

.nav-mark {
	display: block;
	padding-top: 1.9rem;
	font-size: 1.1rem;
	font-weight: 400;
	letter-spacing: 0.01em;
	color: #b8afa4;
}

.nav-mark b {
	font-weight: 700;
	color: #f5f2ea;
}

.nav-mark small {
	display: block;
	margin-top: 0.15rem;
	font-size: 0.72rem;
	font-weight: 700;
	letter-spacing: 0.34em;
	text-indent: 0.34em;
	color: #e8a13a;
}

/* Vertically centred as a group. `top:50%` plus a negative margin of half the
   stack's height is the pre-flexbox-centring idiom, and it does not depend on
   the parent being a flex container. */
.nav-items {
	position: absolute;
	top: 50%;
	left: 0;
	right: 0;
	margin-top: -8.4rem;
}

/*
 * One stop. `display: block` matters more than it looks: `.f` sets no display,
 * and an `<a>` left inline would ignore width and height entirely and lay the
 * three items out in a ROW — which is exactly what this file did before, and
 * exactly what it looked like.
 */
.nav-item {
	display: block;
	width: 8.6rem;
	margin: 0 auto 0.9rem auto;
	padding: 0.9rem 0 0.75rem 0;
	border-radius: 1rem;
	color: #b8afa4;
}

.nav-item svg {
	display: block;
	width: 1.85rem;
	height: 1.85rem;
	margin: 0 auto 0.35rem auto;
}

.nav-label {
	display: block;
	font-size: 0.95rem;
	font-weight: 600;
	letter-spacing: 0.01em;
}

/* Where the reader currently is. R15 verbatim: active is the accent, the rest
   stay muted so the pane's artwork keeps the foreground. */
.nav-item.on {
	color: #e8a13a;
	background: rgba(232, 161, 58, 0.1);
}

.nav-item:focus {
	color: #f5f2ea;
	background: rgba(245, 242, 234, 0.09);
}

.pane {
	position: relative;
	z-index: 1;
	padding: 1.9rem 4rem 5rem 0.6rem;
}

/* Screens with no nav rail get the full overscan on both sides. */
.pane.wide {
	padding-left: 4rem;
}

/* ── Headings and prose ────────────────────────────────────────────────── */

h1 {
	margin: 0;
	font-size: 2.7rem;
	font-weight: 700;
	letter-spacing: -0.022em;
	line-height: 1.12;
}

h2 {
	margin: 0;
	font-size: 1.95rem;
	font-weight: 700;
	letter-spacing: -0.012em;
}

.quiet-head {
	margin-bottom: 1rem;
	font-size: 1.5rem;
	font-weight: 600;
	color: #b8afa4;
}

.dim {
	color: #b8afa4;
}

.bad {
	color: #c4503a;
}

.prose {
	margin: 0.7rem 0 0 0;
	max-width: 36rem;
	color: #b8afa4;
}

/* ── The universal filter bar ──────────────────────────────────────────── */

/*
 * Five stops above the first rail. The app's TV home drops this bar entirely —
 * on a remote it is four extra presses in front of the content on every visit —
 * but a browser has a back button and a URL, so here the cost is paid once and
 * the view is linkable. It sits ABOVE the first rail's heading so a press of UP
 * from the first card reaches it, and DOWN from it returns.
 */
.tabs {
	padding: 0 0 0.9rem 0.6rem;
	white-space: nowrap;
}

.tab {
	display: inline-block;
	height: 2.9rem;
	padding: 0 1.4rem;
	margin-right: 0.55rem;
	line-height: 2.6rem;
	font-size: 1.15rem;
	font-weight: 700;
	color: #b8afa4;
	background: #1a1815;
	border-radius: 999px;
	vertical-align: middle;
}

.tab.on {
	color: #161310;
	background: #e8a13a;
}

.tab:focus {
	color: #f5f2ea;
	background: #2e2a26;
}

/* The selected tab keeps reading as selected while focused — the ring is what
   says "here", and the fill is what says "this is the view you are in". */
.tab.on:focus {
	color: #161310;
	background: #ffb84d;
}

/* ── Rails ─────────────────────────────────────────────────────────────── */

.row {
	margin-bottom: 1.3rem;
}

/*
 * The heading line: title on the left, bucket picker inline to its right.
 * `float` clears predictably on every engine at the floor and the head has at
 * most two children.
 */
.rail-head {
	padding: 0 0 0.4rem 0.6rem;
	overflow: hidden;
}

.rail-head h2 {
	float: left;
	line-height: 2.5rem;
}

/*
 * THE BUCKET PILL — the app's `_BucketPill`, restated in HTML.
 *
 * A `<select>` styled as a rounded pill with the current bucket's name and an
 * amber down-chevron, sitting on the heading line. `-webkit-appearance:none`
 * hides the control's OWN arrow so the one caret shown is the app's amber one;
 * it does NOT change the OPEN list, which stays the platform's centred
 * full-screen picker — the whole reason a native select is right here.
 */
.pill {
	position: relative;
	float: left;
	margin-left: 0.9rem;
	margin-top: 0.15rem;
	display: inline-block;
	vertical-align: middle;
	border-radius: 999px;
	background: #1e1c19;
	box-shadow: inset 0 0 0 0.12rem #2e2a26;
}

.pill select {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	height: 2.3rem;
	max-width: 15rem;
	padding: 0 2.2rem 0 1.1rem;
	font: inherit;
	font-size: 1.1rem;
	font-weight: 600;
	color: #f5f2ea;
	background: transparent;
	border: 0;
	border-radius: 999px;
	outline: 0;
}

.pill-caret {
	position: absolute;
	top: 0;
	right: 0.9rem;
	height: 2.3rem;
	line-height: 2.3rem;
	font-size: 0.9rem;
	color: #e8a13a;
	pointer-events: none;
}

/* Focus lands on the select; the ring wraps its pill. */
.pill select:focus {
	box-shadow: 0 0 0 0.2rem #e8a13a;
}

/* No-JS submit for the picker. Hidden the moment tv.js is alive (it submits on
   change instead), so a working remote never sees a control it does not need. */
.rail-go {
	float: left;
	margin-left: 0.5rem;
	height: 2.3rem;
	padding: 0 1rem;
	line-height: 2rem;
	font-size: 1rem;
	font-weight: 700;
	color: #161310;
	background: #e8a13a;
	border-radius: 999px;
}

.js .rail-go {
	display: none;
}

.rail {
	/* `auto`, not `scroll`: a permanent scrollbar gutter on a TV is 15 px of
	   grey nobody can grab. The script scrolls it; the bar underneath is only a
	   fallback for a browser that ignored the script entirely. */
	overflow-x: auto;
	overflow-y: hidden;
	white-space: nowrap;
	/* Focus scale + shadow grows a card past its box. Without room the panel
	   clips both on the top and bottom edges of the row. */
	padding: 0.55rem 0 0.9rem 0.6rem;
}

.rail::-webkit-scrollbar,
.seasons::-webkit-scrollbar {
	display: none;
}

/* ── Cards ─────────────────────────────────────────────────────────────────
 *
 * Roughly half the app's 200 dp card, at the owner's request: smaller posters
 * put ~6 titles on a rail instead of ~4, so a glance takes in more. The CDN
 * rung stays width=320 — a TV is DPR 1, so a 320 px source painted at ~144 CSS
 * px is oversampled and sharp, and no new billing class is minted.
 */
.card {
	display: inline-block;
	width: 9rem;
	margin-right: 0.9rem;
	white-space: normal;
	vertical-align: top;
}

.card img,
.card .poster-blank {
	display: block;
	width: 100%;
	/* 210/308 poster crop → 9rem × 308/210 = 13.2rem. Same artwork, same CDN
	   variants the phone and web already warmed. */
	height: 13.2rem;
	border-radius: 0.55rem;
	background: #161513;
	/* A hairline stops a dark poster bleeding into a dark page — an edge, not a
	   frame. */
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.07);
	-o-object-fit: cover;
	object-fit: cover;
}

.card-title {
	display: block;
	margin-top: 0.4rem;
	font-size: 1.05rem;
	font-weight: 600;
	line-height: 1.22;
	letter-spacing: -0.003em;
	/* Two lines, then stop. */
	max-height: 2.6rem;
	overflow: hidden;
}

.card-meta {
	display: block;
	margin-top: 0.12rem;
	font-size: 0.92rem;
	color: #9c958a;
}

.card:focus .card-title {
	color: #ffffff;
}

/* The "All" tail — same footprint as a card so the row's rhythm holds. */
.card-all {
	display: inline-block;
	width: 9rem;
	margin-right: 0.9rem;
	white-space: normal;
	vertical-align: top;
}

.card-all span {
	display: block;
	height: 13.2rem;
	line-height: 13.2rem;
	border-radius: 0.55rem;
	background: #161513;
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.07);
	text-align: center;
	font-size: 1.1rem;
	font-weight: 600;
	color: #b8afa4;
}

.card-all:focus span {
	color: #e8a13a;
}

/* ── Continue watching ─────────────────────────────────────────────────────
 *
 * Wider than a poster card and 16:9, because these are backdrops: a place the
 * viewer already is rather than a title they are choosing between.
 */
.cw {
	display: inline-block;
	width: 15rem;
	margin-right: 0.9rem;
	white-space: normal;
	vertical-align: top;
}

.cw-art {
	position: relative;
	display: block;
	width: 100%;
	height: 8.44rem;
	overflow: hidden;
	border-radius: 0.55rem;
	background: #161513;
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.07);
}

.cw-art img {
	display: block;
	width: 100%;
	height: 100%;
	-o-object-fit: cover;
	object-fit: cover;
}

/* The one thing a poster cannot carry: how far in they are. */
.cw-bar {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 0.3rem;
	background: rgba(0, 0, 0, 0.55);
}

.cw-fill {
	display: block;
	height: 100%;
	background: #e8a13a;
}

.cw-title {
	display: block;
	margin-top: 0.4rem;
	font-size: 1.05rem;
	font-weight: 600;
	line-height: 1.22;
	max-height: 2.6rem;
	overflow: hidden;
}

.cw-sub {
	display: block;
	margin-top: 0.12rem;
	font-size: 0.92rem;
	color: #9c958a;
}

.cw:focus .cw-title {
	color: #ffffff;
}

/* ── Grid (search results, see-all) ────────────────────────────────────── */

.grid {
	margin: 0;
	padding: 0.7rem 0 0 0.6rem;
	list-style: none;
	/* Flex wrap, not grid: Chromium 38. The per-item margin is the pre-`gap`
	   idiom. */
	display: -webkit-box;
	display: -ms-flexbox;
	display: -webkit-flex;
	display: flex;
	-webkit-flex-wrap: wrap;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
}

.grid .card {
	margin-bottom: 1.7rem;
}

/*
 * The search grid, which shares its screen with the keyboard.
 *
 * A rail card is sized to be one of four across a whole panel. In the ~40rem
 * left after the keyboard column that is two, with a third clipped — a results
 * page that shows two answers is not a results page. These are two thirds the
 * width, which puts three on a row and a fourth peeking, and they are still
 * larger than anything the phone site draws.
 */
.grid.compact .card,
.grid.compact .card-all {
	width: 11.5rem;
	margin-right: 0.9rem;
	margin-bottom: 1.3rem;
}

/* 11.5 x (308/210). Kept as the product rather than a rounded literal so the
   poster crop stays exactly the site's when either number moves. */
.grid.compact .card img,
.grid.compact .card .poster-blank {
	height: 16.87rem;
}

.grid.compact .card-title {
	font-size: 1.18rem;
	max-height: 2.95rem;
}

.grid.compact .card-meta {
	font-size: 1rem;
}

/* ── Two-column screens (search) ───────────────────────────────────────── */

.split {
	display: -webkit-box;
	display: -ms-flexbox;
	display: -webkit-flex;
	display: flex;
}

.split-left {
	/* The keyboard's own measure: six keys at 3.9rem plus five 0.55rem gaps is
	   26.15rem, so 27rem is the column with a little air and nothing spare. Every
	   rem taken off here is a rem the results column gets, and the results are
	   what the reader came for. */
	width: 27rem;
	margin-right: 2.2rem;
	-webkit-flex: 0 0 27rem;
	-ms-flex: 0 0 27rem;
	flex: 0 0 27rem;
}

.split-right {
	-webkit-box-flex: 1;
	-webkit-flex: 1 1 auto;
	-ms-flex: 1 1 auto;
	flex: 1 1 auto;
	/* Without this a long result title can force the flex item wider than its
	   share and push the keyboard off the panel. */
	min-width: 0;
}

/* ── Buttons ───────────────────────────────────────────────────────────── */

.btn {
	display: inline-block;
	height: 4.3rem;
	line-height: 4.3rem;
	padding: 0 2.1rem;
	margin: 0 1rem 1rem 0;
	border-radius: 999px;
	font-size: 1.3rem;
	font-weight: 700;
	letter-spacing: 0.005em;
	text-align: center;
	background: #e8a13a;
	color: #161310;
	white-space: nowrap;
}

.btn:focus {
	background: #ffb84d;
}

/* A quiet button is a real control that the screen is not asking for. */
.btn.quiet {
	background: #1e1c19;
	color: #f5f2ea;
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.08);
}

.btn.quiet:focus {
	background: #2e2a26;
}

.btn.wide {
	display: block;
	width: 100%;
	margin-right: 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

/* ── Forms ─────────────────────────────────────────────────────────────── */

.field {
	display: block;
	width: 100%;
	height: 4.3rem;
	padding: 0 1.3rem;
	margin: 0 0 1rem 0;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	font: inherit;
	font-size: 1.45rem;
	font-weight: 600;
	color: #f5f2ea;
	background: #161513;
	border: 0.2rem solid #2e2a26;
	border-radius: 0.8rem;
	outline: 0;
}

.field:focus {
	border-color: #e8a13a;
	background: #1e1c19;
}

.form {
	max-width: 34rem;
}

/* ── The on-screen keyboard ────────────────────────────────────────────── */

.kb {
	margin-top: 0.2rem;
}

.kb-row {
	white-space: nowrap;
	margin-bottom: 0.55rem;
}

.key {
	display: inline-block;
	width: 3.9rem;
	height: 3.4rem;
	margin-right: 0.55rem;
	line-height: 3rem;
	text-align: center;
	font-size: 1.4rem;
	font-weight: 600;
	color: #f5f2ea;
	background: #1e1c19;
	border-radius: 0.7rem;
	vertical-align: top;
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
}

.key:focus {
	background: #e8a13a;
	color: #161310;
	/* Keys sit 0.55rem apart; the card lift would have them overlap. */
	-webkit-transform: scale(1.06);
	transform: scale(1.06);
	box-shadow: 0 0.5rem 1.4rem rgba(0, 0, 0, 0.6);
}

.key.wide {
	width: 8.35rem;
	font-size: 1.1rem;
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: #b8afa4;
}

.key.wide:focus {
	color: #161310;
}

.key.go {
	background: #e8a13a;
	color: #161310;
}

.key.go:focus {
	background: #ffb84d;
}

/* ── Detail ────────────────────────────────────────────────────────────── */

.detail {
	position: relative;
	min-height: 42rem;
}

/* The backdrop, dimmed. No blur filter: see the header. */
.backdrop {
	position: absolute;
	top: 0;
	right: 0;
	width: 66%;
	height: 34rem;
	overflow: hidden;
	z-index: 0;
}

.backdrop img {
	display: block;
	width: 100%;
	height: 100%;
	-o-object-fit: cover;
	object-fit: cover;
	opacity: 0.5;
}

/* Two flat gradients over the seam — one horizontal into the text column, one
   vertical into the page below. Both are two-stop, so the paint stays cheap. */
.backdrop-fade,
.backdrop-fade-b {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
}

.backdrop-fade {
	background: -webkit-linear-gradient(left, #0e0e0d 8%, rgba(14, 14, 13, 0) 78%);
	background: linear-gradient(to right, #0e0e0d 8%, rgba(14, 14, 13, 0) 78%);
}

.backdrop-fade-b {
	background: -webkit-linear-gradient(top, rgba(14, 14, 13, 0) 45%, #0e0e0d 100%);
	background: linear-gradient(to bottom, rgba(14, 14, 13, 0) 45%, #0e0e0d 100%);
}

.detail-col {
	position: relative;
	z-index: 1;
	max-width: 44rem;
}

.detail-meta {
	margin: 0.8rem 0 0 0;
	font-size: 1.25rem;
	font-weight: 600;
	color: #f5f2ea;
	letter-spacing: 0.01em;
}

.detail-genres {
	margin: 0.35rem 0 0 0;
	font-size: 1.1rem;
	font-weight: 600;
	color: #e8a13a;
	letter-spacing: 0.01em;
}

.detail-plot {
	margin: 1rem 0 1.6rem 0;
	max-width: 41rem;
	font-size: 1.2rem;
	color: #cdc5b9;
	/* Four lines. The app's own detail column caps at the same place. */
	max-height: 7.5rem;
	overflow: hidden;
}

.actions {
	margin-top: 0.4rem;
}

/* The one line under Play that says what is about to play. */
.play-line {
	display: inline-block;
	margin-left: 0.2rem;
	font-size: 1.05rem;
	font-weight: 600;
	color: #9c958a;
	vertical-align: middle;
}

/* ── Season guide ──────────────────────────────────────────────────────────
 *
 * Full width below the detail column, so episode cards get the whole panel
 * rather than the 44rem text measure.
 */
.guide {
	position: relative;
	z-index: 1;
	margin-top: 1.6rem;
}

.seasons {
	margin-bottom: 1.2rem;
	overflow-x: auto;
	overflow-y: hidden;
	white-space: nowrap;
	padding: 0.4rem 0 0.5rem 0.2rem;
}

/* A season chip: quiet by default, amber when it is the season on screen. */
.chip {
	display: inline-block;
	height: 3.1rem;
	padding: 0 1.5rem;
	margin-right: 0.6rem;
	line-height: 3.1rem;
	font-size: 1.15rem;
	font-weight: 700;
	color: #f5f2ea;
	background: #1e1c19;
	border-radius: 999px;
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.08);
}

.chip.on {
	color: #161310;
	background: #e8a13a;
	box-shadow: none;
}

.chip:focus {
	background: #2e2a26;
}

.chip.on:focus {
	color: #161310;
	background: #ffb84d;
}

/* ── Episode cards ─────────────────────────────────────────────────────────
 *
 * The website's content-page card, restated for a remote: a 16:9 still on the
 * left, then E{n} · title, duration, and two lines of plot. Two per row on a
 * 1280 panel, so a season is a few DOWN presses rather than a scroll of names.
 */
.eplist {
	display: -webkit-box;
	display: -ms-flexbox;
	display: -webkit-flex;
	display: flex;
	-webkit-flex-wrap: wrap;
	-ms-flex-wrap: wrap;
	flex-wrap: wrap;
	padding-left: 0.2rem;
}

.epcard {
	display: -webkit-box;
	display: -ms-flexbox;
	display: -webkit-flex;
	display: flex;
	width: 33rem;
	margin: 0 1rem 1rem 0;
	padding: 0.6rem;
	background: #161513;
	border-radius: 0.8rem;
	box-shadow: inset 0 0 0 1px rgba(245, 242, 234, 0.05);
	-webkit-box-sizing: border-box;
	box-sizing: border-box;
	text-align: left;
}

.epcard:focus {
	background: #1e1c19;
}

.epcard-still {
	position: relative;
	-webkit-flex: 0 0 12rem;
	-ms-flex: 0 0 12rem;
	flex: 0 0 12rem;
	width: 12rem;
	height: 6.75rem;
	margin-right: 0.9rem;
	overflow: hidden;
	border-radius: 0.5rem;
	background: #0e0e0d;
}

.epcard-still img {
	display: block;
	width: 100%;
	height: 100%;
	-o-object-fit: cover;
	object-fit: cover;
}

/* When the guide has no still: the episode number, centred, so the card still
   reads as a specific episode rather than a blank tile. */
.epcard-num {
	display: block;
	width: 100%;
	height: 6.75rem;
	line-height: 6.75rem;
	text-align: center;
	font-size: 2rem;
	font-weight: 700;
	color: #6f685e;
}

.epcard-body {
	-webkit-box-flex: 1;
	-webkit-flex: 1 1 auto;
	-ms-flex: 1 1 auto;
	flex: 1 1 auto;
	min-width: 0;
	padding-top: 0.15rem;
}

.epcard-title {
	display: block;
	font-size: 1.2rem;
	font-weight: 600;
	line-height: 1.25;
	/* Two lines then stop; a long episode title must not push the card taller. */
	max-height: 3rem;
	overflow: hidden;
}

.epcard-title b {
	color: #e8a13a;
	font-weight: 700;
	margin-right: 0.3rem;
}

.epcard-sub {
	display: block;
	margin-top: 0.2rem;
	font-size: 1rem;
	font-weight: 600;
	color: #9c958a;
}

.epcard-plot {
	display: block;
	margin-top: 0.25rem;
	font-size: 1rem;
	line-height: 1.3;
	color: #9c958a;
	/* Two lines. `-webkit-line-clamp` is Chromium 6+ (WebKit forever), so it is
	   safe below the floor; the max-height caps it where the clamp is ignored. */
	display: -webkit-box;
	-webkit-line-clamp: 2;
	-webkit-box-orient: vertical;
	max-height: 2.6rem;
	overflow: hidden;
}

/* ── Pairing ───────────────────────────────────────────────────────────── */

/* Centred hero: the code is the whole screen, so it sits in the middle where a
   reader's eye and a phone camera both find it fastest. */
.pair {
	max-width: 44rem;
	margin: 2.5rem auto 0 auto;
	text-align: center;
}

.pair-lead {
	margin: 0.8rem 0 0 0;
	font-size: 1.5rem;
	color: #cdc5b9;
}

.pair-lead strong {
	color: #f5f2ea;
}

.code {
	display: inline-block;
	margin: 1.8rem 0 1.2rem 0;
	padding: 1.4rem 2.6rem;
	background: #161513;
	border: 0.2rem solid #3a3229;
	border-radius: 1.2rem;
	box-shadow: 0 1.2rem 3rem rgba(0, 0, 0, 0.55);
	font-family: 'Courier New', Courier, monospace;
	font-size: 5rem;
	font-weight: 700;
	letter-spacing: 0.28em;
	/* `letter-spacing` pads the RIGHT of the last glyph too, which off-centres a
	   short string in a box. */
	text-indent: 0.28em;
	color: #e8a13a;
}

.pair-wait {
	margin: 0.4rem 0 1.8rem 0;
	font-size: 1.15rem;
	color: #9c958a;
}

/* A soft amber pulse that says "live" without a spinner. `@keyframes` +
   `opacity` are Chromium 26; a panel that ignores it just shows a steady dot. */
.dot {
	display: inline-block;
	width: 0.7rem;
	height: 0.7rem;
	margin-right: 0.5rem;
	border-radius: 999px;
	background: #e8a13a;
	vertical-align: middle;
	-webkit-animation: pulse 1.4s ease-in-out infinite;
	animation: pulse 1.4s ease-in-out infinite;
}

@-webkit-keyframes pulse {
	0%, 100% { opacity: 0.3; }
	50% { opacity: 1; }
}

@keyframes pulse {
	0%, 100% { opacity: 0.3; }
	50% { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
	.dot {
		-webkit-animation: none;
		animation: none;
		opacity: 0.85;
	}
}

.pair .actions {
	margin-top: 0.4rem;
}

.pair-foot {
	margin-top: 1.6rem;
	font-size: 1.05rem;
	color: #6f685e;
}

/* "Premium active" — a quiet green affirmation on the account pane. */
.badge-on {
	color: #6fbf73;
	font-weight: 700;
}

/* ── Player ────────────────────────────────────────────────────────────── */

.player {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	background: #000;
}

.player video {
	display: block;
	width: 100%;
	height: 100%;
	background: #000;
}

/* "Loading…" — centred over the black frame while the stream starts or stalls,
   so a reader can tell "fetching" from "frozen". */
.player-load {
	display: none;
	position: absolute;
	top: 50%;
	left: 0;
	right: 0;
	margin-top: -1.2rem;
	text-align: center;
	font-size: 1.3rem;
	font-weight: 600;
	color: #d8d2c8;
	text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9);
}

.player-load.on {
	display: block;
}

/* The centre play button. Big enough to read and aim at from three metres, and
   the one control that is always reachable however the remote is mapped. */
.player-play {
	display: none;
	position: absolute;
	top: 50%;
	left: 50%;
	width: 7rem;
	height: 7rem;
	margin: -3.5rem 0 0 -3.5rem;
	padding: 0;
	border-radius: 999px;
	font-size: 2.6rem;
	line-height: 7rem;
	text-align: center;
	color: #161310;
	background: #e8a13a;
	box-shadow: 0 1rem 2.6rem rgba(0, 0, 0, 0.6);
	outline: 0;
}

.player-play.on {
	display: block;
}

.player-play:focus {
	background: #ffb84d;
	-webkit-transform: scale(1.06);
	transform: scale(1.06);
}

/* Only while an autoplay policy forced a muted start. */
.player-mute {
	display: none;
	position: absolute;
	top: 3rem;
	left: 0;
	right: 0;
	text-align: center;
	font-size: 1.2rem;
	font-weight: 600;
	color: #f5f2ea;
	text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9);
}

.player-mute.on {
	display: block;
}

/*
 * "No picture?" — the human path for panels whose decoder counters never
 * report. Amber-edged so it reads as guidance rather than an error, and placed
 * under the muted note so the two never collide.
 */
.player-nopic {
	display: none;
	position: absolute;
	top: 6rem;
	left: 0;
	right: 0;
	text-align: center;
	font-size: 1.2rem;
	font-weight: 600;
	color: #e8a13a;
	text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9);
}

.player-nopic.on {
	display: block;
}

.player-bar {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	padding: 3rem 4rem 2.6rem 4rem;
	background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.88) 55%);
	background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.88) 55%);
}

.player-bar.hidden {
	display: none;
}

.player-title {
	font-size: 1.8rem;
	font-weight: 700;
	margin-bottom: 0.9rem;
	text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
}

.player-ep {
	margin-left: 0.7rem;
	font-size: 1.3rem;
	font-weight: 600;
	color: #b8afa4;
}

.track {
	position: relative;
	height: 0.5rem;
	border-radius: 999px;
	background: rgba(245, 242, 234, 0.24);
	overflow: hidden;
}

.track-fill {
	position: absolute;
	top: 0;
	left: 0;
	bottom: 0;
	width: 0;
	background: #e8a13a;
}

.player-times {
	margin-top: 0.55rem;
	font-size: 1.15rem;
	font-weight: 600;
	color: #d8d2c8;
}

.player-times .right {
	float: right;
}

/* The control row: hidden until UP, then a row of pill buttons the D-pad walks. */
.player-controls {
	display: none;
	margin-top: 1.1rem;
}

.player-controls.open {
	display: block;
}

.pbtn {
	display: inline-block;
	height: 3.4rem;
	padding: 0 1.5rem;
	margin: 0 0.7rem 0.3rem 0;
	line-height: 3.4rem;
	font-size: 1.15rem;
	font-weight: 700;
	color: #f5f2ea;
	background: rgba(245, 242, 234, 0.12);
	border-radius: 999px;
	vertical-align: middle;
}

/* The quality currently playing. */
.pbtn.on {
	color: #161310;
	background: #e8a13a;
}

.pbtn:focus {
	color: #161310;
	background: #f5f2ea;
	-webkit-transform: scale(1.05);
	transform: scale(1.05);
}

.pbtn.on:focus {
	background: #ffb84d;
}


/* ── Notices ───────────────────────────────────────────────────────────── */

.notice {
	max-width: 46rem;
	padding: 3rem 0 0 0;
}

.notice h1 {
	font-size: 2.3rem;
}

/* ── Utility ───────────────────────────────────────────────────────────── */

.mt {
	margin-top: 1.5rem;
}

.hide {
	display: none;
}

/* Reachable by a screen reader, invisible to everyone else. TVs ship
   VoiceGuide / TalkBack and several controls here are glyph-only. */
.sr {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}
