/* TV canvas: row sizes depend on the screen, never on the amount of content. */
body.tv-view{--tv-height:100vh;--tv-unit:1px;height:var(--tv-height);margin:0}
body.tv-view:has(.crew-board){overflow:hidden}
.tv-view #app{height:100%;min-height:0}
.tv-view .crew-board,.tv-view .crew-board.all-at-once{
 --flags-height:0px;--status-height:0px;--banner-height:0px;
 height:var(--tv-height);min-height:0;max-height:var(--tv-height);width:100%;overflow:hidden;
 display:grid;grid-template-columns:minmax(0,1fr);
 grid-template-areas:"header" "flags" "status" "content" "footer";
 grid-template-rows:calc(65 * var(--tv-unit)) var(--flags-height) var(--status-height) minmax(0,1fr) calc(14 * var(--tv-unit));
 padding:calc(18 * var(--tv-unit)) calc(24 * var(--tv-unit)) calc(var(--banner-height) + 12 * var(--tv-unit));gap:calc(8 * var(--tv-unit));
}
.tv-view .crew-board.has-flags{--flags-height:calc(85 * var(--tv-unit))}
.tv-view .crew-board:has(.board-offline){--status-height:calc(30 * var(--tv-unit))}
.tv-view .crew-board.with-ticker{--banner-height:calc(54 * var(--tv-unit))}
.tv-view .crew-board:not(.with-ticker){padding-bottom:calc(12 * var(--tv-unit))!important}
.tv-view .crew-header{grid-area:header;min-height:0;padding:0 0 calc(8 * var(--tv-unit));margin:0;overflow:hidden}
.tv-view .nautical-strip{grid-area:flags;min-height:0;height:100%;padding:0 3px;overflow:hidden}
.tv-view .board-offline{grid-area:status;min-height:0;margin:0;padding:3px 8px}
.tv-view .crew-layout{grid-area:content;min-height:0;min-width:0;display:grid;grid-template-columns:minmax(0,1.7fr) minmax(0,1fr);grid-template-rows:minmax(0,1fr) minmax(0,.32fr);gap:calc(12 * var(--tv-unit));overflow:hidden}
.tv-view .crew-layout:not(:has(.ship-strip>section)){grid-template-rows:minmax(0,1fr)}
.tv-view .crew-footnote{grid-area:footer;min-height:0;overflow:hidden}
.tv-view .crew-side{min-width:0;min-height:0;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) minmax(0,1fr);gap:calc(10 * var(--tv-unit))}
.tv-view .crew-side:has(>section:only-child){grid-template-rows:minmax(0,1fr)}
.tv-view .crew-layout:has(.crew-side:empty),.tv-view .crew-board.hide-notices .crew-layout{grid-template-columns:minmax(0,1fr)}
.tv-view .crew-board.hide-notices .crew-side:has(>section+section){grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-rows:minmax(0,1fr)}
.tv-view .crew-board.hide-notices .crew-layout:has(.crew-side:empty){display:grid;grid-template-rows:minmax(0,1fr)}
.tv-view .crew-notice{min-height:0;min-width:0;padding:calc(16 * var(--tv-unit));gap:calc(12 * var(--tv-unit));overflow:hidden}
.tv-view .crew-message,.tv-view .all-notices{flex:1;min-height:0;min-width:0;margin:0;overflow:hidden}
.tv-view .notice-kicker,.tv-view .notice-bottom{flex-shrink:0;min-width:0;margin:0;font-size:calc(10 * var(--tv-unit))}
.tv-view .notice-kicker>span:last-child{display:block}
.tv-view .ship-strip{height:100%;min-height:0;max-height:none;display:grid;grid-template-columns:minmax(0,1.7fr) minmax(0,1fr);overflow:hidden}
.tv-view .ship-strip:has(>section:only-child){grid-template-columns:minmax(0,1fr)}
.tv-view .weather-panel,.tv-view .tide-panel,.tv-view .movement-panel,.tv-view .contractor-panel{min-height:0;min-width:0;padding:calc(10 * var(--tv-unit)) calc(14 * var(--tv-unit));overflow:hidden}
.tv-view .tv-fit-pane{position:relative}
.tv-view .tv-fit-content{position:absolute;transform-origin:top left;min-width:0;height:auto;max-height:none;box-sizing:border-box}
.tv-view .crew-header>.tv-fit-content{display:flex;align-items:center;justify-content:space-between;gap:18px}
.tv-view .crew-header .crew-port{order:initial;width:auto;display:block;flex:1;min-width:0;text-align:center}
.tv-view .crew-header .crew-clock{flex-shrink:0;white-space:nowrap}
.tv-view .crew-header .crew-board-label{display:block}
.tv-view .crew-wordmark{flex-shrink:0}
.tv-view .crew-wordmark .spirit-logo{width:200px;height:auto;max-width:none}
.tv-view .crew-header .desk-lighthouse{width:60px;height:64px;flex-shrink:0}
.tv-view .crew-footnote>.tv-fit-content{display:flex;justify-content:space-between;gap:12px}
.tv-view .all-notices>.tv-fit-content{display:flex;flex-direction:column;gap:16px}
.tv-view .all-notices.notice-columns>.tv-fit-content{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:18px}
.tv-view .all-notice{min-width:0;flex-shrink:0}
.tv-view .all-notice+.all-notice{padding-top:10px}
.tv-view .all-notice h1{margin-bottom:8px}
.tv-view .all-category{margin-bottom:6px}
.tv-view .weather-main{margin:5px 0;display:flex;align-items:center;justify-content:space-between}
.tv-view .weather-art{position:static;width:60px;height:45px;opacity:1}
.tv-view .weather-details{display:flex;justify-content:space-between;padding-top:5px}
.tv-view .weather-main strong{font-size:44px}
.tv-view .weather-details>span{margin:0}
.tv-view .tide-columns,.tv-view .tide-row{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) minmax(0,.7fr)}
.tv-view .tide-row>span:last-child{grid-column:auto}
.tv-view .tide-panel .panel-label{display:flex}
.tv-view .tide-columns{margin-top:8px}
.tv-view .movement-rows{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:calc(18 * var(--tv-unit))}
.tv-view .movement-rows:has(>.movement-leg:only-child){grid-template-columns:minmax(0,1fr)}
.tv-view .movement-leg{min-width:0;display:grid;align-content:start;gap:calc(5 * var(--tv-unit))}
.tv-view .movement-leg+.movement-leg{border-left:1px solid #ffffff40;padding-left:calc(18 * var(--tv-unit))}
.tv-view .movement-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:calc(10 * var(--tv-unit));padding:calc(6 * var(--tv-unit)) 0;min-height:0}
.tv-view .movement-heading{font-size:calc(10 * var(--tv-unit));letter-spacing:.7px;margin-bottom:calc(3 * var(--tv-unit))}
.tv-view .movement-heading>span:last-child{font-size:calc(8 * var(--tv-unit))}
.tv-view .movement-place strong{font-family:'Segoe UI',Arial,sans-serif;font-size:calc(20 * var(--tv-unit));font-weight:750;line-height:1.12;letter-spacing:.2px}
.tv-view .movement-place strong>span{display:block;font-size:calc(11 * var(--tv-unit));letter-spacing:1.2px;margin-top:calc(3 * var(--tv-unit));color:#d5e5fa}
.tv-view .movement-place small{font-size:calc(10 * var(--tv-unit));margin-top:calc(4 * var(--tv-unit));line-height:1.2}
.tv-view .movement-arrow{display:none}
.tv-view .flap-clock{height:calc(44 * var(--tv-unit));gap:calc(3 * var(--tv-unit))}
.tv-view .flap-tile{height:calc(44 * var(--tv-unit));width:calc(28 * var(--tv-unit))}
.tv-view .flap-tile.flap-colon{width:calc(9 * var(--tv-unit))}
.tv-view .flap-tile>span{font-size:calc(37 * var(--tv-unit))}
.tv-view .contractor-panel>.tv-fit-content{display:flex;align-items:center;gap:14px}
.tv-view .strip-icon{display:block;flex-shrink:0}
/* All three flag groups share the fixed flag row without wrapping. */
.tv-view .nautical-strip>.tv-fit-content{display:flex;align-items:center;gap:16px;flex-wrap:nowrap}
.tv-view .nautical-message{flex:2 1 0;min-width:0}
.tv-view .bravo-status,.tv-view .mast-status{flex:1 1 0;min-width:0;max-width:none;padding:8px 10px;margin:0}
.tv-view .bravo-status>.nautical-flag{width:44px;flex-shrink:0}
.tv-view .bravo-status{gap:10px}
.tv-view .bravo-status strong{font-size:16px}
.tv-view .bravo-status p{font-size:12px}
.tv-view .flag-string{height:74px;padding:0 6px}
.tv-view .flag-rope{height:34px}
.tv-view .hoisted-flag{max-width:44px}
.tv-view .flag-caption{font-size:8px;padding-top:2px}
.tv-view .flag-caption span{min-width:0;overflow-wrap:anywhere}
.tv-view .mast-flag{max-width:40px}
/* Reserve exactly the same space that the animated banner occupies. */
.tv-view #running-banner{height:calc(54 * var(--tv-unit));min-height:0;max-height:none}
.tv-view #running-banner .ticker-label{font-size:calc(11 * var(--tv-unit));padding:0 calc(20 * var(--tv-unit))}
.tv-view #running-banner .ticker-track{font-size:calc(21 * var(--tv-unit))}
.tv-view #running-banner .spirit-tow{height:calc(48 * var(--tv-unit));width:calc(246 * var(--tv-unit))}
.tv-view #running-banner .spirit-mini-ship{width:calc(192 * var(--tv-unit));height:calc(46 * var(--tv-unit))}
.tv-view #running-banner .banner-tow-rope{width:calc(54 * var(--tv-unit));height:calc(24 * var(--tv-unit))}
@media(prefers-reduced-motion:reduce){.tv-view #running-banner .ticker-track{font-size:calc(14 * var(--tv-unit))}}

.tv-view .clock-lighthouse{width:calc(44 * var(--tv-unit))!important;height:calc(60 * var(--tv-unit))!important}.tv-view .clock-lighthouse .lighthouse-art{overflow:hidden}.tv-view .clock-lighthouse .morse-lamp-caption{display:none}
