638 lines
65 KiB
CSS
638 lines
65 KiB
CSS
:root { font-family: 'Manrope Variable', Arial, sans-serif; background: #000; font-synthesis: none; color-scheme: dark; }
|
|
* { box-sizing: border-box; }
|
|
html, body, #root { margin: 0; width: 100%; height: 100%; }
|
|
button, input, select, textarea { font: inherit; }
|
|
button { cursor: pointer; color: inherit; }
|
|
button, a { touch-action: manipulation; -webkit-tap-highlight-color: transparent; }
|
|
button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
|
|
svg { display: block; flex-shrink: 0; }
|
|
.vkuiIcon { display: inline-flex; flex-shrink: 0; }
|
|
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
|
|
|
|
.board { --background: #000000; --foreground: #f5f5f5; --muted: #b7b7b7; --secondary: #c3c3c3; --line: #303030; --outline: #595959; --surface: #0a0a0a; --input: #141414; --warning: #ffd479; --accent-ink: #000; --hero-height: clamp(110px, 18vh, 230px); --hero-gap: clamp(18px, 2.6vh, 32px); --control-size: 40px; --control-gap: 6px; color-scheme: dark; color: var(--foreground); background: var(--background); height: 100dvh; width: 100%; display: flex; flex-direction: column; overflow: hidden; padding: clamp(14px, 2vh, 28px) clamp(18px, 3vw, 64px) 0; }
|
|
.board[data-theme='light'] { --background: #FFFFFF; --foreground: #171b23; --muted: #535b68; --secondary: #535b68; --line: #d7dbe2; --outline: #939ba8; --surface: #fff; --input: #f2f4f7; --warning: #8a4300; --accent-ink: #fff; color-scheme: light; }
|
|
.board[data-row-count='5'], .board[data-row-count='6'] { --hero-height: clamp(100px, 15vh, 180px); }
|
|
.board-header { display: flex; align-items: center; justify-content: space-between; gap: 24px; flex: 0 0 auto; border-bottom: 1px solid var(--line); padding-bottom: clamp(12px, 1.8vh, 24px); view-transition-name: board-header; }
|
|
.stop-heading { min-width: 0; }
|
|
h1 { font-size: clamp(30px, 3.8vw, 76px); letter-spacing: -.05em; line-height: 1.08; margin: 0; font-weight: 650; overflow-wrap: anywhere; }
|
|
.stop-meta { display: flex; align-items: center; gap: 10px 24px; flex-wrap: wrap; }
|
|
.stop-direction { color: var(--muted); display: flex; align-items: center; gap: 10px; font-size: clamp(18px, 1.6vw, 32px); margin-top: 10px; line-height: 1.2; }
|
|
.stop-direction svg { color: var(--accent); }
|
|
.weather-summary { display: flex; align-items: center; gap: 9px; margin-top: 10px; color: var(--muted); font-size: clamp(16px, 1.3vw, 26px); line-height: 1.2; }
|
|
.weather-summary svg, .weather-summary strong { color: var(--accent); }
|
|
.weather-summary strong { font-size: 1.25em; font-weight: 600; }
|
|
.weather-summary small { font-size: .7em; }
|
|
.header-right { display: grid; grid-template-columns: auto auto; column-gap: clamp(20px, 3vw, 64px); align-items: center; flex-shrink: 0; }
|
|
.brand { grid-row: 1 / 3; display: flex; align-items: center; gap: 12px; font-size: clamp(24px, 2.3vw, 44px); font-weight: 800; letter-spacing: -.07em; white-space: nowrap; }
|
|
.official-mark { display: block; width: clamp(40px, 3.5vw, 70px); height: auto; flex-shrink: 0; }
|
|
.official-mark svg { width: 100%; height: auto; }
|
|
.clock { display: flex; gap: 10px; align-items: flex-end; font-size: clamp(38px, 4.6vw, 90px); font-weight: 550; line-height: 1; font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
.clock small { font-size: .42em; color: var(--secondary); font-weight: 500; }
|
|
.today { grid-column: 2; color: var(--secondary); text-align: right; font-size: clamp(13px, 1.15vw, 22px); margin-top: 8px; white-space: nowrap; }
|
|
.scene-container { flex: 1 1 0; min-height: 0; min-width: 0; overflow: hidden; }
|
|
.scene { width: 100%; height: 100%; min-height: 0; animation: scene-in 400ms ease-out both; }
|
|
.departure-layout { display: flex; flex-direction: column; height: 100%; min-height: 0; padding: clamp(12px, 1.8vh, 24px) 0; }
|
|
.departure-content { flex: 1 1 0; min-height: 0; min-width: 0; display: grid; grid-template-rows: auto calc(var(--hero-height) + var(--hero-gap)) auto minmax(0, 1fr); }
|
|
/* The last-trip notice is an extra child; give it its own row so the table keeps the flexible one. */
|
|
.departure-content[data-last-trip='true'] { grid-template-rows: auto calc(var(--hero-height) + var(--hero-gap)) auto auto minmax(0, 1fr); }
|
|
.section-heading, .next-heading { display: flex; align-items: center; justify-content: space-between; gap: 15px; min-width: 0; }
|
|
.eyebrow { font-size: clamp(12px, 1.05vw, 21px); font-weight: 650; letter-spacing: .12em; color: var(--muted); }
|
|
.source-label { display: flex; align-items: center; gap: 8px; color: var(--secondary); font-size: clamp(13px, 1.15vw, 23px); white-space: nowrap; }
|
|
.source-label svg { width: 1.2em; height: 1.2em; }
|
|
.hero-departure { height: var(--hero-height); display: grid; grid-template-columns: auto minmax(0, 1fr) auto; grid-template-rows: minmax(0, 1fr); align-items: center; gap: clamp(18px, 2.4vw, 50px); min-height: 0; padding: 10px 0 0; }
|
|
.route-badge { display: inline-flex; justify-content: center; align-items: center; flex-shrink: 0; border: 1.5px solid var(--outline); border-radius: 14px; width: clamp(64px, 8vw, 150px); height: min(82px, calc(var(--row-height, 96px) * .74)); padding: 0 clamp(10px, 1vw, 18px); font-size: min(50px, calc(var(--row-height, 96px) * .48)); font-weight: 650; line-height: 1; font-variant-numeric: tabular-nums; overflow: hidden; }
|
|
.route-badge-label { display: flex; align-items: center; flex-shrink: 0; white-space: nowrap; transform-origin: center; }
|
|
.route-badge-large { width: calc(var(--hero-height) * 1.05); height: calc(var(--hero-height) - 10px); border: 0; background: var(--accent); color: var(--accent-ink); border-radius: calc(var(--hero-height) * .27); padding: 0 clamp(16px, 1.4vw, 28px); font-size: min(130px, calc(var(--hero-height) * .68)); }
|
|
.route-badge-filled { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
|
|
.hero-destination { min-width: 0; height: 100%; display: flex; flex-direction: column; justify-content: center; }
|
|
.transport-kind { display: flex; align-items: center; gap: 9px; color: var(--accent); font-size: min(30px, calc(var(--hero-height) * .16)); line-height: 1.2; margin-bottom: 7px; }
|
|
.hero-destination h2 { flex-shrink: 0; font-size: min(4.7vw, calc(var(--hero-height) * .34)); line-height: 1.08; letter-spacing: -.035em; font-weight: 650; margin: 0; overflow-wrap: anywhere; }
|
|
.hero-details { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; font-size: min(27px, calc(var(--hero-height) * .12)); color: var(--secondary); margin-top: 8px; line-height: 1.25; }
|
|
.hero-details > span { min-width: 0; }
|
|
.schedule-time { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--outline); border-radius: 6px; padding: 4px 6px; white-space: nowrap; }
|
|
.departure-day { font-size: .6em; color: var(--muted); white-space: nowrap; }
|
|
.countdown { display: flex; align-items: flex-end; justify-content: flex-end; min-width: 0; font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
.countdown-value { display: inline-flex; align-items: flex-end; gap: .22em; font-size: min(68px, calc(var(--row-height, 92px) * .64)); font-weight: 550; line-height: 1; }
|
|
.countdown-part { display: inline-flex; align-items: flex-end; gap: .12em; }
|
|
.countdown-part small { color: var(--secondary); font-size: max(18px, .42em); font-weight: 500; display: flex; align-items: flex-end; line-height: 1; }
|
|
.countdown[data-long='true'] .countdown-value { font-size: min(54px, calc(var(--row-height, 92px) * .48)); }
|
|
.countdown-large .countdown-value { color: var(--accent); font-size: min(150px, calc(var(--hero-height) * .9)); }
|
|
.countdown-large[data-long='true'] .countdown-value { font-size: min(105px, calc(var(--hero-height) * .66)); }
|
|
.countdown-now { font-size: min(40px, calc(var(--row-height, 92px) * .4)); font-weight: 550; }
|
|
.countdown-large .countdown-now { color: var(--accent); font-size: min(72px, calc(var(--hero-height) * .44)); }
|
|
.next-heading { border-top: 1px solid var(--line); padding: clamp(10px, 1.4vh, 18px) 0; }
|
|
.next-heading svg { color: var(--muted); }
|
|
.page-indicator { color: var(--accent); font-size: 15px; }
|
|
.departure-table { min-height: 0; display: grid; grid-template-rows: repeat(var(--rows), minmax(0, 1fr)); overflow: hidden; }
|
|
.departure-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center; gap: clamp(16px, 2.2vw, 44px); min-height: 0; padding: 5px 0; border-bottom: 1px solid var(--line); }
|
|
.departure-row:last-child { border-bottom: 0; }
|
|
.row-destination { min-width: 0; min-height: 0; height: 100%; display: flex; flex-direction: column; justify-content: center; }
|
|
.row-destination h3 { flex-shrink: 0; font-size: min(54px, 3.5vw, calc(var(--row-height) * .4)); font-weight: 600; line-height: 1.1; letter-spacing: -.025em; margin: 0; overflow-wrap: anywhere; }
|
|
.row-destination p { margin: 6px 0 0; font-size: min(24px, 1.35vw, calc(var(--row-height) * .2)); line-height: 1.2; color: var(--secondary); }
|
|
.departure-table[data-rows='5'] .row-destination p, .departure-table[data-rows='6'] .row-destination p { display: none; }
|
|
.row-time { display: flex; flex-direction: column; align-items: flex-end; gap: 7px; color: var(--secondary); font-size: min(42px, calc(var(--row-height) * .36)); font-variant-numeric: tabular-nums; }
|
|
.row-time-compact { display: none; }
|
|
.transport-notice { display: flex; align-items: center; gap: 10px; color: var(--warning); padding-top: 10px; font-size: clamp(15px, 1.4vw, 26px); flex: 0 0 auto; }
|
|
.empty-departures { display: flex; flex-direction: column; justify-content: center; min-height: 0; }
|
|
.empty-departures > svg { color: var(--accent); }
|
|
.empty-departures h2 { font-size: clamp(24px, 3vw, 54px); font-weight: 550; margin: 10px 0; letter-spacing: -.04em; }
|
|
.empty-departures p, .empty-following { color: var(--secondary); font-size: clamp(14px, 1.5vw, 28px); margin: 0; line-height: 1.4; }
|
|
.quiet-placeholder { display: none; }
|
|
.offline-banner { display: flex; align-items: center; gap: 9px; color: var(--warning); font-size: clamp(13px, 1.2vw, 22px); padding-top: 9px; flex: 0 0 auto; }
|
|
.offline-banner button { color: inherit; border: 0; background: none; display: flex; padding: 3px; margin-left: auto; }
|
|
.offline-banner[data-state='loading'] { color: var(--secondary); }
|
|
|
|
/* Cards switch to one panel when the actual available area is too small. */
|
|
.info-screen { height: 100%; min-height: 0; display: flex; flex-direction: column; padding: 16px 0; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--outline) var(--background); }
|
|
.info-intro { flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; gap: 16px; margin-bottom: 16px; }
|
|
.info-intro[data-tabs-only=true] { display: none; }
|
|
.info-screen[data-compact=true] .info-intro[data-tabs-only=true] { display: flex; flex-direction: row; align-items: center; justify-content: flex-end; }
|
|
.info-intro h2 { margin: 0; font-size: clamp(28px, 3vw, 56px); letter-spacing: -.045em; font-weight: 550; }
|
|
.information-tabs { display: none; gap: 8px; }
|
|
.information-tabs button { font-size: 14px; border: 1px solid var(--outline); background: transparent; padding: 8px 12px; border-radius: 10px; color: var(--secondary); }
|
|
.information-tabs button[aria-current='page'] { color: var(--accent-ink); border-color: var(--accent); background: var(--accent); }
|
|
.info-grid { flex: 1 1 0; min-height: 0; display: grid; grid-template-columns: repeat(var(--info-columns, 3), minmax(0, 1fr)); gap: 24px; }
|
|
.info-card { min-width: 0; min-height: 0; border: 1px solid var(--line); border-radius: 24px; padding: clamp(18px, 1.7vw, 32px); display: flex; flex-direction: column; overflow: auto; container-type: size; }
|
|
.info-card > * { flex-shrink: 0; }
|
|
.info-card h3 { font-size: clamp(23px, 2vw, 38px); line-height: 1.15; font-weight: 600; letter-spacing: -.03em; margin: 0 0 18px; }
|
|
.card-icon { color: var(--accent); margin-bottom: 16px; }
|
|
.card-icon svg { width: 32px; height: 32px; }
|
|
.info-card p { color: var(--secondary); font-size: clamp(18px, 1.75vw, 32px); line-height: 1.4; margin: 0 0 16px; }
|
|
.info-caption { display: flex; align-items: center; gap: 9px; font-size: clamp(14px, 1.3vw, 23px); color: var(--secondary); margin-top: auto; line-height: 1.4; }
|
|
.route-cloud { flex: 1 1 0; min-height: 0; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }
|
|
.route-list { flex: 1 1 0; min-height: 0; display: grid; grid-template-columns: repeat(var(--route-columns), minmax(0, 1fr)); grid-template-rows: repeat(var(--route-rows), minmax(0, 1fr)); gap: 8px 24px; }
|
|
.route-tile { min-width: 0; min-height: 0; display: flex; align-items: center; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--line); }
|
|
.route-list .route-badge { width: 72px; height: 60px; font-size: 35px; border-radius: 16px; margin: 0; padding: 0 8px; }
|
|
.route-card-name { flex: 1 1 0; min-width: 0; height: 100%; display: flex; flex-direction: column; justify-content: center; }
|
|
.route-list .destination-heading { width: 100%; font-size: clamp(22px, 3cqw, 30px); line-height: 1.2; margin: 0; font-weight: 550; letter-spacing: -.025em; overflow-wrap: anywhere; }
|
|
.route-list-pages { display: flex; justify-content: flex-end; color: var(--muted); font-size: 16px; padding-top: 10px; }
|
|
/* A moving line and one large stop, inspired by over-door transit displays. */
|
|
.service-info { container-name: journey-card; overflow: hidden; }
|
|
.service-info .journey-empty { margin-block: auto; padding: 20px 0; text-align: center; font-size: 22px; }
|
|
.journey-metro { --station-width: clamp(180px, 22cqw, 260px); --focused-width: min(clamp(300px, 60cqw, 560px), calc(100cqw - 48px)); flex: 1 1 0; min-height: 0; min-width: 0; display: flex; flex-direction: column; padding-top: clamp(16px, 4cqh, 32px); }
|
|
.journey-tour-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; color: var(--secondary); font-size: clamp(17px, 3.3cqw, 24px); line-height: 1.3; }
|
|
.journey-order { color: var(--accent); font-size: .85em; white-space: nowrap; }
|
|
.journey-map-space { flex: 1 1 0; min-height: 0; display: flex; align-items: center; margin: 18px -8px 0; }
|
|
.journey-rail-window { width: 100%; height: min(100%, 320px); position: relative; overflow: hidden; }
|
|
.journey-rail-window::after { content: ''; position: absolute; inset: 0 0 0 auto; width: 36px; z-index: 3; background: linear-gradient(90deg, transparent, var(--background)); pointer-events: none; }
|
|
.journey-rail { position: relative; display: flex; height: 100%; margin: 0; padding: 0 0 0 24px; list-style: none; }
|
|
.journey-line { position: absolute; left: 24px; bottom: 17.5px; width: calc(100% - 24px); height: 5px; background: var(--accent); transform-origin: left center; transition: transform 900ms cubic-bezier(.22,.72,.18,1); }
|
|
.journey-station, .journey-continuation { --journey-space: 0px; transform: translate3d(calc(-1 * var(--journey-focus) * var(--station-width) + var(--journey-space)), 0, 0); transition: transform 900ms cubic-bezier(.22,.72,.18,1); }
|
|
.journey-station { flex: 0 0 var(--station-width); min-width: 0; position: relative; display: grid; grid-template-rows: auto minmax(0, 1fr) 40px; gap: 10px; }
|
|
.journey-station[data-after=true], .journey-continuation { --journey-space: calc(var(--focused-width) - var(--station-width)); }
|
|
.journey-metro[data-active=true] .journey-station, .journey-metro[data-active=true] .journey-continuation, .journey-metro[data-active=true] .journey-line { will-change: transform; }
|
|
.journey-station-name { min-width: 0; min-height: 0; position: relative; }
|
|
.journey-name-layer { position: absolute; inset: 0 auto 0 0; display: flex; flex-direction: column; justify-content: flex-end; padding: 0 28px 8px 0; opacity: 0; transition: opacity 300ms ease-out, transform 900ms cubic-bezier(.22,.72,.18,1); }
|
|
.journey-name-context { width: var(--station-width); }
|
|
.journey-name-focus { width: var(--focused-width); transform: translate3d(0, 0, 0) scale(var(--journey-name-scale, .4)); transform-origin: left bottom; }
|
|
.journey-station[data-focused=true] .journey-name-focus { opacity: 1; transform: translate3d(0, 0, 0) scale(1); }
|
|
.journey-station[data-focused=false][data-before=false] .journey-name-context { opacity: 1; }
|
|
.journey-station[data-before=true] .journey-duration { opacity: 0; }
|
|
.service-info .journey-station-name .destination-heading { flex-shrink: 0; margin: 0; font-size: calc(clamp(22px, 4cqw, 32px) * var(--reading-scale, 1)); line-height: 1.13; font-weight: 600; letter-spacing: -.035em; overflow-wrap: anywhere; transition: color 600ms ease; }
|
|
.service-info .journey-name-focus .destination-heading { font-size: calc(clamp(48px, 11cqw, 96px) * var(--reading-scale, 1)); font-weight: 650; letter-spacing: -.055em; color: var(--foreground); }
|
|
.journey-transliteration { flex-shrink: 0; color: var(--muted); font-size: calc(clamp(14px, 2.2cqw, 20px) * var(--reading-scale, 1)); font-weight: 500; line-height: 1.2; letter-spacing: -.01em; overflow-wrap: anywhere; margin-bottom: 6px; }
|
|
.journey-name-focus .journey-transliteration { font-size: calc(clamp(17px, 3.1cqw, 28px) * var(--reading-scale, 1)); }
|
|
.journey-duration { align-self: start; display: flex; align-items: baseline; gap: 8px; color: var(--muted); font-size: clamp(24px, 4.5cqw, 36px); font-weight: 550; line-height: 1; white-space: nowrap; transition: opacity 300ms ease-out; }
|
|
.journey-duration > span { display: inline-flex; align-items: baseline; gap: 5px; }
|
|
.journey-duration small { font-size: .72em; font-weight: 500; }
|
|
.journey-station[data-focused=true] .journey-duration { color: var(--accent); }
|
|
.journey-node { align-self: center; display: block; width: 24px; height: 24px; border: 4px solid var(--accent); border-radius: 50%; background: var(--background); margin-left: -12px; z-index: 1; }
|
|
.journey-station[data-focused=true] .journey-node { background: var(--accent); box-shadow: 0 0 0 6px color-mix(in srgb, var(--accent) 18%, transparent); }
|
|
.journey-station[data-before=true] .journey-node { border-color: var(--outline); }
|
|
.journey-continuation { flex: 0 0 var(--station-width); min-width: 0; display: flex; align-items: center; position: relative; padding: 34px 20px 40px 0; }
|
|
.journey-continuation-label { color: var(--muted); font-size: clamp(20px, 4cqw, 28px); line-height: 1.2; max-width: 180px; }
|
|
.journey-continuation-line { position: absolute; bottom: 17.5px; left: 0; right: 24px; border-top: 5px dashed var(--accent); opacity: .5; }
|
|
.journey-caption { display: flex; flex-wrap: wrap; gap: 4px 14px; justify-content: space-between; color: var(--muted); font-size: 16px; line-height: 1.3; padding-top: 16px; }
|
|
.journey-caption-compact { display: none; }
|
|
.journey-page { color: var(--accent); margin-left: auto; }
|
|
.journey-metro[data-calm=true] .journey-station, .journey-metro[data-calm=true] .journey-continuation, .journey-metro[data-calm=true] .journey-line { transition: transform 300ms ease-out; }
|
|
.journey-metro[data-calm=true] .journey-name-layer { transition: opacity 180ms ease-out, transform 300ms ease-out; }
|
|
.journey-metro[data-loop=true] .journey-rail-window { animation: journey-overview-reset 600ms ease-out both; }
|
|
.journey-metro[data-calm=true][data-loop=true] .journey-rail-window { animation-duration: 180ms; }
|
|
.journey-metro[data-loop=true] .journey-station, .journey-metro[data-loop=true] .journey-continuation, .journey-metro[data-loop=true] .journey-line, .journey-metro[data-loop=true] .journey-name-layer { transition: none; }
|
|
@keyframes journey-overview-reset { from { opacity: 0; } to { opacity: 1; } }
|
|
@container journey-card (max-width: 380px) {
|
|
.journey-metro { --station-width: 140px; }
|
|
.service-info .journey-name-focus .destination-heading { font-size: calc(clamp(34px, 11cqw, 46px) * var(--reading-scale, 1)); }
|
|
.journey-name-layer { padding-right: 22px; }
|
|
.journey-tour-heading { font-size: 17px; }
|
|
.journey-caption { font-size: 14px; gap: 4px 10px; }
|
|
}
|
|
@container journey-card (max-height: 380px) {
|
|
.journey-metro { padding-top: 12px; }
|
|
.journey-map-space { margin-top: 10px; }
|
|
.journey-station { grid-template-rows: auto minmax(0, 1fr) 32px; gap: 6px; }
|
|
.journey-name-layer { padding-bottom: 4px; }
|
|
.journey-duration { font-size: 26px; }
|
|
.journey-line { bottom: 14px; height: 4px; }
|
|
.journey-node { width: 22px; height: 22px; margin-left: -11px; border-width: 3px; }
|
|
.journey-continuation { padding-top: 26px; padding-bottom: 32px; }
|
|
.journey-continuation-line { bottom: 14px; border-top-width: 4px; }
|
|
.journey-caption { font-size: 14px; padding-top: 10px; }
|
|
}
|
|
/* Keep the station name readable when the header and next trip use most of the height. */
|
|
@container journey-card (max-height: 300px) {
|
|
.journey-tour-heading { display: none; }
|
|
.journey-metro { padding-top: 10px; }
|
|
.journey-map-space { margin-top: 0; }
|
|
.journey-caption-full { display: none; }
|
|
.journey-caption-compact { display: inline; }
|
|
}
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.journey-station, .journey-continuation, .journey-line, .journey-name-layer, .journey-duration, .service-info .journey-station .destination-heading { transition: none !important; will-change: auto !important; }
|
|
.journey-metro .destination-current, .journey-metro[data-loop=true] .journey-rail-window { animation: none; }
|
|
}
|
|
.weather-info { container-name: weather-card; }
|
|
.weather-body { flex: 1 1 0; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr); align-content: center; align-items: center; justify-items: center; gap: 24px; }
|
|
.weather-now { min-width: 0; display: flex; flex-direction: column; align-items: center; }
|
|
.weather-current { display: flex; align-items: center; gap: .18em; color: var(--accent); font-size: clamp(64px, min(22cqw, 32cqh), 144px); }
|
|
.weather-current strong { font-size: 1em; font-weight: 550; line-height: 1; }
|
|
.weather-current svg { width: .8em !important; height: .8em !important; }
|
|
.weather-info .weather-description { margin: 12px 0 0; font-size: clamp(22px, 3cqw, 34px); line-height: 1.2; text-align: center; }
|
|
.weather-hours { width: 100%; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; border-top: 1px solid var(--line); padding-top: 20px; }
|
|
.weather-hours > div { min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 10px; }
|
|
.weather-hours time { color: var(--secondary); font-size: clamp(16px, 3cqw, 22px); }
|
|
.weather-hours svg { color: var(--accent); width: clamp(40px, min(12cqw, 16cqh), 64px) !important; height: clamp(40px, min(12cqw, 16cqh), 64px) !important; }
|
|
.weather-hours strong { font-size: clamp(24px, 6cqw, 40px); font-weight: 550; }
|
|
.weather-attribution { flex-shrink: 0; padding-top: 16px; display: flex; flex-wrap: wrap; justify-content: center; gap: 5px 12px; font-size: 12px; color: var(--muted); }
|
|
.weather-attribution a { color: inherit; text-underline-offset: 3px; }
|
|
.weather-info .weather-empty { margin-block: auto; text-align: center; }
|
|
@container weather-card (min-width: 600px) {
|
|
.weather-body[data-forecast='true'] { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 32px; }
|
|
.weather-hours { border: 0; padding: 0; }
|
|
}
|
|
@container weather-card (max-height: 300px) {
|
|
.weather-body { gap: 12px; }
|
|
.weather-current { font-size: clamp(44px, min(18cqw, 20cqh), 84px); }
|
|
.weather-info .weather-description { font-size: 20px; margin-top: 8px; }
|
|
.weather-hours { gap: 8px; padding-top: 12px; }
|
|
.weather-hours > div { display: grid; grid-template-columns: auto auto; align-items: center; justify-content: center; gap: 6px; }
|
|
.weather-hours time { grid-column: 1 / -1; text-align: center; }
|
|
.weather-hours svg { width: 40px !important; height: 40px !important; }
|
|
.weather-hours strong { font-size: 24px; }
|
|
.weather-attribution { padding-top: 10px; }
|
|
}
|
|
@container weather-card (max-width: 599px) and (max-height: 380px) {
|
|
.weather-body { gap: 16px; }
|
|
.weather-hours { padding-top: 14px; gap: 8px; }
|
|
.weather-hours > div { display: grid; grid-template-columns: auto auto; align-items: center; justify-content: center; gap: 6px; }
|
|
.weather-hours time { grid-column: 1 / -1; text-align: center; }
|
|
.weather-hours svg { width: 40px !important; height: 40px !important; }
|
|
.weather-hours strong { font-size: 24px; }
|
|
}
|
|
.qr-info { container-name: qr-card; }
|
|
.qr-content { flex: 1 1 0; min-height: 0; min-width: 0; display: grid; grid-template-rows: minmax(0, 1fr) auto; gap: 16px; }
|
|
.qr-stage { min-width: 0; min-height: 0; display: grid; place-items: center; padding: 4px; container-type: size; }
|
|
.qr-paper { display: block; width: min(100cqw, 100cqh, 440px); aspect-ratio: 1; padding: 6px; border-radius: 20px; background: #fff; border: 1px solid var(--outline); }
|
|
.passenger-qr { width: 100%; height: 100%; aspect-ratio: 1; }
|
|
.qr-description { min-width: 0; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 12px; text-align: center; }
|
|
.qr-info .qr-description p { font-size: clamp(18px, 3cqw, 40px); line-height: 1.25; margin: 0; }
|
|
.passenger-link { display: inline-flex; align-items: center; gap: 8px; color: var(--accent); text-decoration: none; font-size: clamp(18px, 2.5cqw, 30px); font-weight: 550; }
|
|
.passenger-link span { min-width: 0; overflow-wrap: anywhere; }
|
|
@container qr-card (min-width: 601px) {
|
|
.qr-content { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); gap: 32px; }
|
|
.qr-description { align-items: flex-start; text-align: left; }
|
|
}
|
|
@container qr-card (max-width: 600px) and (max-height: 300px) {
|
|
.qr-description { gap: 6px; }
|
|
.qr-info .qr-description p, .passenger-link { font-size: 16px; }
|
|
.passenger-link svg { width: 18px; height: 18px; }
|
|
}
|
|
.info-screen[data-compact='true'] .info-grid { grid-template-columns: minmax(0, 1fr); }
|
|
.info-screen[data-compact='true'] .information-tabs { display: flex; }
|
|
.info-screen[data-compact='true'] .info-card:not([data-active='true']) { display: none; }
|
|
.info-screen[data-compact='true'] .card-icon { display: none; }
|
|
.last-trip-notice { display: flex; align-items: center; gap: 9px; flex-shrink: 0; padding: 9px 12px; border-radius: 12px; color: var(--warning); background: color-mix(in srgb, var(--warning) 10%, var(--background)); font-size: clamp(14px, 1.4vw, 24px); line-height: 1.3; }
|
|
.last-trip-notice svg { flex-shrink: 0; }
|
|
.last-trip-notice small { font-size: .85em; color: var(--secondary); }
|
|
.last-trip-compact { background: transparent; padding: 3px 0 0; font-size: 13px; }
|
|
.last-trip-compact svg, .last-trip-compact small { display: none; }
|
|
.places-info { container-name: places-card; }
|
|
.places-body { flex: 1 1 0; min-height: 0; display: grid; grid-template-rows: repeat(var(--place-rows, 1), minmax(0, 1fr)); gap: 12px; }
|
|
.place-trip { min-height: 0; min-width: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 24px; border-bottom: 1px solid var(--line); padding: 10px 0; }
|
|
.place-trip:last-child { border-bottom: none; }
|
|
.place-copy { min-height: 0; min-width: 0; display: flex; flex-direction: column; justify-content: center; }
|
|
.places-info .place-copy .destination-heading { font-size: calc(clamp(24px, 5cqw, 52px) * var(--reading-scale, 1)); font-weight: 600; line-height: 1.13; letter-spacing: -.04em; margin: 0; overflow-wrap: anywhere; }
|
|
.place-details { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin-top: 10px; color: var(--secondary); font-size: clamp(18px, 3.2cqw, 30px); }
|
|
.place-details .route-badge { width: auto; min-width: 48px; height: 36px; border-radius: 10px; padding: 0 9px; font-size: 24px; }
|
|
.place-details time { display: inline-flex; align-items: baseline; gap: 8px; color: var(--accent); font-weight: 600; }
|
|
.place-details small, .place-arrival small { font-size: .6em; color: var(--secondary); font-weight: 400; }
|
|
.place-duration { display: flex; align-items: center; gap: 6px; font-size: .8em; }
|
|
.place-arrival { display: flex; flex-direction: column; align-items: flex-end; justify-content: center; gap: 8px; color: var(--secondary); font-size: clamp(14px, 2cqw, 20px); }
|
|
.place-arrival time { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: flex-end; gap: 8px; color: var(--foreground); font-weight: 600; font-size: calc(clamp(30px, 5.2cqw, 54px) * var(--reading-scale, 1)); }
|
|
.place-trip .place-unavailable { font-size: 16px; margin: 8px 0 0; }
|
|
.passenger-caption { flex-shrink: 0; display: flex; justify-content: space-between; gap: 12px; color: var(--muted); font-size: clamp(13px, 1.2vw, 20px); padding-top: 12px; line-height: 1.3; }
|
|
.fare-info { container-name: fare-card; }
|
|
.fare-body { flex: 1 1 0; min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1.8fr) minmax(0, .8fr); align-items: stretch; gap: 8px; text-align: center; padding: 6px 0; }
|
|
.fare-label { font-size: clamp(16px, 2cqw, 24px); color: var(--secondary); }
|
|
.fare-price, .fare-payment { min-height: 0; display: flex; align-items: center; justify-content: center; }
|
|
.fare-price .destination-heading { color: var(--accent); margin: 0; font-size: clamp(40px, 15cqw, 130px); line-height: 1.08; font-weight: 650; letter-spacing: -.06em; overflow-wrap: anywhere; }
|
|
.fare-info .fare-payment .destination-heading { color: var(--secondary); margin: 0; font-size: clamp(22px, 4cqw, 40px); font-weight: 500; line-height: 1.3; overflow-wrap: anywhere; }
|
|
@container fare-card (max-height: 300px) {
|
|
.fare-label { display: none; }
|
|
.fare-body { grid-template-rows: minmax(0, 1.8fr) minmax(0, .8fr); padding: 0; }
|
|
}
|
|
.weather-hint { display: flex; align-items: center; justify-content: center; gap: 10px; padding-top: 10px; color: var(--secondary); font-size: clamp(15px, 2.6cqw, 24px); line-height: 1.3; }
|
|
.weather-hint svg { flex-shrink: 0; color: var(--accent); }
|
|
.weather-hint strong { color: var(--accent); white-space: nowrap; font-size: 1.2em; font-weight: 600; }
|
|
.passenger-editor { min-width: 0; border: 1px solid var(--outline); border-radius: 14px; padding: 16px; margin: 12px 0; }
|
|
.passenger-editor legend { color: var(--secondary); padding: 0 6px; font-size: 14px; }
|
|
.passenger-editor .text-button { font-size: 14px; padding: 8px 0; }
|
|
@container places-card (max-width: 440px) {
|
|
.place-trip { gap: 14px; }
|
|
.place-details { gap: 6px 10px; font-size: 21px; }
|
|
.place-details .route-badge { height: 30px; font-size: 20px; min-width: 40px; }
|
|
.place-duration { flex-basis: 100%; }
|
|
.place-arrival { font-size: 12px; }
|
|
.place-arrival time { font-size: 30px; }
|
|
}
|
|
.info-status { display: flex; align-items: center; gap: 10px; flex-shrink: 0; color: var(--secondary); font-size: clamp(14px, 1.2vw, 22px); padding-top: 14px; line-height: 1.3; }
|
|
.info-status svg { color: var(--accent); }
|
|
.info-notices { display: grid; gap: 18px; }
|
|
.notice { --notice-color: var(--accent); display: grid; grid-template-columns: 48px minmax(0, 1fr); gap: 20px; padding: clamp(20px, 2vw, 32px); border: 1px solid var(--line); border-radius: 24px; background: var(--background); overflow: hidden; }
|
|
.notice[data-kind='cancellation'], .notice[data-kind='delay'] { --notice-color: var(--warning); }
|
|
.notice-graphic { display: flex; flex-direction: column; align-items: center; color: var(--notice-color); padding: 2px 0; }
|
|
.notice-signal { display: grid; place-items: center; width: 48px; height: 48px; border-radius: 14px; background: color-mix(in srgb, var(--notice-color) 10%, var(--background)); }
|
|
.notice-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 9px 18px; margin-bottom: 16px; }
|
|
.notice-type { color: var(--notice-color); font-size: clamp(14px, 1.2vw, 22px); font-weight: 650; }
|
|
.notice-period { color: var(--secondary); font-size: clamp(13px, 1vw, 18px); }
|
|
.notice-routes { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
|
|
.notice-routes .route-badge { width: auto; min-width: 54px; height: 42px; padding: 0 14px; font-size: 26px; border-radius: 12px; background: var(--notice-color); border-color: var(--notice-color); }
|
|
.notice h3 { font-size: clamp(25px, 2.6vw, 46px); font-weight: 600; line-height: 1.12; margin: 0 0 14px; letter-spacing: -.035em; overflow-wrap: anywhere; }
|
|
.notice p { font-size: clamp(18px, 1.65vw, 30px); line-height: 1.45; color: var(--secondary); margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
.persistent-next { display: flex; align-items: center; gap: 18px; border-top: 1px solid var(--line); padding: 14px 0; flex: 0 0 auto; --row-height: 72px; }
|
|
.persistent-next .route-badge { width: 78px; height: 50px; font-size: 31px; padding: 0 10px; border-radius: 14px; }
|
|
.persistent-destination { min-width: 0; display: flex; flex-direction: column; gap: 7px; }
|
|
.persistent-destination strong { font-weight: 600; font-size: clamp(21px, 2.2vw, 40px); line-height: 1.1; }
|
|
.persistent-destination time { display: flex; align-items: center; gap: 8px; font-size: clamp(14px, 1.2vw, 23px); color: var(--secondary); }
|
|
.persistent-next .countdown { margin-left: auto; }
|
|
.persistent-next .countdown-value { font-size: 40px; }
|
|
.persistent-next .countdown[data-long='true'] .countdown-value { font-size: 34px; }
|
|
.ad-screen { padding: 4vh 0; height: 100%; overflow-y: auto; }
|
|
.ad-screen h2 { font-size: clamp(44px, 7vw, 135px); color: var(--accent); line-height: 1.06; letter-spacing: -.055em; font-weight: 550; margin: 4vh 0 3vh; overflow-wrap: anywhere; }
|
|
.ad-screen p { font-size: clamp(22px, 2.7vw, 50px); color: var(--secondary); line-height: 1.4; margin: 0; }
|
|
.ad-signature { display: flex; align-items: center; gap: 15px; color: var(--muted); margin-top: 4vh; font-size: 22px; }
|
|
|
|
.board-footer { flex: 0 0 auto; position: relative; border-top: 1px solid var(--line); view-transition-name: board-footer; }
|
|
.cycle-progress { position: absolute; top: -1px; width: 100%; height: 1px; }
|
|
.cycle-progress > span { display: block; width: 100%; height: 1px; background: var(--accent); transform-origin: left; transition: transform 1s linear; }
|
|
.footer-main { display: flex; align-items: center; min-height: 60px; padding: 8px 0; }
|
|
.scene-navigation { display: flex; align-items: center; gap: 22px; flex-shrink: 0; }
|
|
.scene-navigation button { border: 0; padding: 4px 0; background: none; color: var(--secondary); display: flex; align-items: center; gap: 9px; font-size: clamp(13px, 1.05vw, 20px); white-space: nowrap; }
|
|
.scene-navigation button.active { color: var(--foreground); }
|
|
.scene-index { display: grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--outline); border-radius: 50%; font-size: 13px; }
|
|
.active .scene-index { color: var(--accent-ink); background: var(--accent); border-color: var(--accent); }
|
|
.footer-status { display: flex; align-items: center; justify-content: flex-end; gap: 8px; color: var(--muted); margin-left: auto; padding-left: 16px; text-align: right; font-size: clamp(12px, .95vw, 18px); min-width: 0; }
|
|
.board-controls { display: flex; gap: var(--control-gap); width: calc(4 * var(--control-size) + 3 * var(--control-gap)); margin-left: 14px; flex-shrink: 0; min-width: 0; overflow: hidden; opacity: 1; transition: width 280ms ease, margin-left 280ms ease, opacity 200ms ease; }
|
|
.controls-idle, .controls-idle * { cursor: none; }
|
|
.controls-idle .board-controls { width: 0; margin-left: 0; opacity: 0; pointer-events: none; }
|
|
.icon-button { display: inline-flex; justify-content: center; align-items: center; flex-shrink: 0; width: var(--control-size, 40px); height: var(--control-size, 40px); color: var(--secondary); border: 1px solid transparent; border-radius: 9px; background: none; }
|
|
.icon-button:hover { color: var(--foreground); border-color: var(--outline); }
|
|
.toast { position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%); max-width: 90vw; z-index: 20; padding: 15px 22px; background: var(--surface); color: var(--foreground); border: 1px solid var(--outline); border-radius: 12px; font-size: 15px; }
|
|
|
|
/* Measured ink bounds remove font leading from digits and share one baseline with units. */
|
|
.numeric-text { display: inline-flex; vertical-align: baseline; height: var(--numeric-height, .8em); line-height: 1; letter-spacing: 0; }
|
|
.numeric-track { display: inline-flex; align-items: flex-start; height: 100%; overflow: hidden; white-space: nowrap; }
|
|
.numeric-glyph { position: relative; display: inline-block; width: .62em; height: 100%; overflow: hidden; text-align: center; flex-shrink: 0; }
|
|
.numeric-symbol { display: block; position: relative; top: var(--numeric-offset, -.13em); line-height: 1em; }
|
|
.numeric-current { display: block; position: relative; top: var(--numeric-offset, -.13em); height: 1em; line-height: 1em; }
|
|
.numeric-old { position: absolute; left: 0; top: var(--numeric-offset, -.13em); width: 100%; height: 1em; line-height: 1em; }
|
|
.numeric-glyph[data-rolling='true'] .numeric-current { animation: digit-up-in 380ms cubic-bezier(.22,.8,.22,1) both; }
|
|
.numeric-glyph[data-rolling='true'] .numeric-old { animation: digit-up-out 380ms cubic-bezier(.22,.8,.22,1) both; }
|
|
.numeric-glyph[data-direction='down'][data-rolling='true'] .numeric-current { animation-name: digit-down-in; }
|
|
.numeric-glyph[data-direction='down'][data-rolling='true'] .numeric-old { animation-name: digit-down-out; }
|
|
.numeric-vanish { width: 0; animation: digit-collapse 380ms ease both; }
|
|
@keyframes digit-up-in { from { transform: translateY(105%); } to { transform: translateY(0); } }
|
|
@keyframes digit-up-out { from { transform: translateY(0); } to { transform: translateY(-105%); } }
|
|
@keyframes digit-down-in { from { transform: translateY(-105%); } to { transform: translateY(0); } }
|
|
@keyframes digit-down-out { from { transform: translateY(0); } to { transform: translateY(105%); } }
|
|
@keyframes digit-collapse { from { width: .62em; } to { width: 0; } }
|
|
@keyframes scene-in { from { opacity: 0; } to { opacity: 1; } }
|
|
.destination-heading { position: relative; overflow: hidden; }
|
|
.destination-current { display: block; }
|
|
.destination-current[data-changing='true'] { animation: destination-up-in 380ms cubic-bezier(.22,.8,.22,1) both; }
|
|
.destination-old { position: absolute; inset: 0 0 auto; display: block; animation: destination-up-out 380ms cubic-bezier(.22,.8,.22,1) both; }
|
|
@keyframes destination-up-in { from { transform: translateY(105%); } to { transform: translateY(0); } }
|
|
@keyframes destination-up-out { from { transform: translateY(0); } to { transform: translateY(-105%); } }
|
|
|
|
.settings-dialog { width: min(640px, calc(100vw - 28px)); height: min(660px, calc(100vh - 32px)); height: min(660px, calc(100dvh - 32px)); max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px); padding: 0; color: var(--foreground); background: var(--surface); border: 1px solid var(--outline); border-radius: 20px; overflow: hidden; box-shadow: 0 25px 90px #0006; }
|
|
.settings-dialog::backdrop { background: #0009; backdrop-filter: blur(8px); }
|
|
.settings-dialog form { height: 100%; min-height: 0; display: flex; flex-direction: column; }
|
|
.settings-navigation-hint { flex: 1; margin: 0; color: var(--secondary); font-size: 12px; line-height: 1.4; }
|
|
.settings-dialog[data-remote-navigation='true'] [data-tv-focus] { outline: 2px solid var(--accent); outline-offset: 4px; border-radius: 8px; }
|
|
.settings-dialog[data-remote-editing='true'] :focus { outline: 3px solid var(--accent); outline-offset: 3px; background: color-mix(in srgb, var(--accent) 12%, var(--input)); }
|
|
.settings-heading { flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 20px 28px; border-bottom: 1px solid var(--line); }
|
|
.settings-heading-actions { display: flex; gap: 8px; }
|
|
.settings-heading-actions .icon-button { width: 44px; height: 44px; }
|
|
.settings-heading h2 { margin: 8px 0 0; font-size: 27px; font-weight: 600; letter-spacing: -.04em; }
|
|
.settings-heading .eyebrow { font-size: 11px; }
|
|
.settings-sections { flex-shrink: 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; padding: 14px 28px; border-bottom: 1px solid var(--line); }
|
|
.settings-sections button { min-height: 46px; padding: 8px 4px; border: 1px solid var(--outline); border-radius: 10px; background: var(--input); color: var(--secondary); font-size: 14px; }
|
|
.settings-sections button[aria-current='page'] { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
|
|
.settings-body { flex: 1 1 0; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scroll-padding: 14px; padding: 0 28px 16px; scrollbar-width: thin; scrollbar-color: var(--outline) var(--surface); }
|
|
.settings-body section { padding: 21px 0 0; }
|
|
.settings-body .settings-validation { color: var(--warning); margin: 16px 0 0; }
|
|
.settings-body h3 { margin: 0 0 17px; font-size: 18px; font-weight: 650; }
|
|
.settings-body h4 { margin: 20px 0 14px; font-size: 14px; font-weight: 600; }
|
|
.settings-note { color: var(--secondary); font-size: 13px; margin-bottom: 18px; }
|
|
.settings-body label { display: flex; flex-direction: column; gap: 9px; font-size: 14px; color: var(--secondary); margin: 17px 0; }
|
|
.settings-body select, .settings-body input:not([type='checkbox']):not([type='radio']), .settings-body textarea { width: 100%; color: var(--foreground); background: var(--input); border: 1px solid var(--outline); border-radius: 8px; padding: 12px; font-size: 15px; }
|
|
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
|
|
.settings-body .switch-row { flex-direction: row; align-items: center; justify-content: space-between; gap: 15px; color: var(--foreground); }
|
|
.switch-row small { display: block; color: var(--muted); margin-top: 5px; font-size: 12px; line-height: 1.5; }
|
|
.switch-row input { appearance: none; position: relative; flex-shrink: 0; margin: 0; width: 40px; height: 24px; background: var(--line); border: 1px solid var(--outline); border-radius: 20px; transition: background 180ms; cursor: pointer; }
|
|
.switch-row input::after { content: ''; position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: var(--secondary); transition: transform 180ms; }
|
|
.switch-row input:checked { background: var(--accent); border-color: var(--accent); }
|
|
.switch-row input:checked::after { transform: translateX(16px); background: var(--accent-ink); }
|
|
.theme-picker { border: 0; padding: 0; margin: 0; display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
|
|
.settings-body .theme-option { flex-direction: row; align-items: center; gap: 10px; padding: 12px; margin: 0; border: 1px solid var(--outline); border-radius: 9px; cursor: pointer; }
|
|
.theme-option:has(input:checked) { border-color: var(--accent); color: var(--foreground); }
|
|
.theme-option input { accent-color: var(--accent); margin: 0; width: 16px; height: 16px; }
|
|
.theme-swatch { width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0; }
|
|
.tiny-tag { font-size: 9px; color: var(--accent); border: 1px solid var(--outline); border-radius: 4px; padding: 3px 5px; margin-left: 7px; letter-spacing: .07em; }
|
|
.text-button { display: inline-flex; align-items: center; gap: 9px; border: 0; background: none; color: var(--secondary); font-size: 14px; padding: 10px 0; }
|
|
.settings-body > .text-button { margin-top: 15px; }
|
|
.form-hint { font-size: 12px; color: var(--muted); line-height: 1.6; }
|
|
.settings-scroll-controls { flex-shrink: 0; display: flex; align-items: center; gap: 8px; padding: 10px 28px; border-top: 1px solid var(--line); }
|
|
.settings-scroll-button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-width: 92px; min-height: 44px; padding: 10px 12px; border: 1px solid var(--outline); border-radius: 10px; background: var(--input); color: var(--foreground); font-size: 14px; }
|
|
.settings-scroll-button:disabled { opacity: .35; cursor: default; }
|
|
.settings-actions { flex-shrink: 0; display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 14px 28px; border-top: 1px solid var(--line); }
|
|
.primary-button { display: inline-flex; align-items: center; gap: 8px; background: var(--accent); color: var(--accent-ink); border: 0; border-radius: 9px; padding: 13px 22px; font-size: 15px; font-weight: 650; }
|
|
@media (max-width: 480px), (max-height: 540px) {
|
|
.settings-heading { padding: 12px 18px; }
|
|
.settings-heading h2 { font-size: 23px; }
|
|
.settings-sections { padding: 10px 18px; gap: 6px; }
|
|
.settings-sections button { font-size: 12px; }
|
|
.settings-body { padding-inline: 18px; }
|
|
.settings-scroll-controls, .settings-actions { padding-inline: 18px; }
|
|
.settings-navigation-hint { font-size: 11px; }
|
|
.settings-scroll-button { min-width: 78px; padding-inline: 8px; }
|
|
}
|
|
|
|
@media (max-width: 1100px) {
|
|
.brand-word { display: none; }
|
|
.header-right { column-gap: 18px; }
|
|
.scene-navigation button > span:last-child { display: none; }
|
|
.hero-details > span { display: none; }
|
|
.hero-departure { gap: 20px; }
|
|
.hero-destination h2 { font-size: min(4.5vw, calc(var(--hero-height) * .34)); }
|
|
}
|
|
@media (max-width: 1000px) {
|
|
.departure-row { grid-template-columns: auto minmax(0, 1fr) auto; gap: 16px; }
|
|
.row-time, .row-destination p { display: none; }
|
|
.row-time-compact { display: flex; align-items: center; gap: 6px; margin-top: 8px; color: var(--secondary); font-size: min(20px, calc(var(--row-height) * .21)); flex-shrink: 0; }
|
|
.row-time-compact .departure-day { font-size: .8em; }
|
|
.row-destination h3 { font-size: min(36px, 4vw, calc(var(--row-height) * .36)); }
|
|
.countdown[data-long='true'] .countdown-value { font-size: min(40px, calc(var(--row-height) * .42)); }
|
|
.countdown-large[data-long='true'] .countdown-value { font-size: calc(var(--hero-height) * .62); }
|
|
}
|
|
@media (max-height: 750px) {
|
|
.info-screen { padding: 12px 0; }
|
|
.info-intro { margin-bottom: 12px; }
|
|
.info-intro h2 { font-size: 30px; }
|
|
.info-card { padding: 18px; }
|
|
.card-icon { display: none; }
|
|
.info-card h3 { font-size: 26px; margin-bottom: 14px; }
|
|
.info-status { font-size: 14px; padding-top: 12px; }
|
|
.persistent-next { padding: 11px 0; }
|
|
.weather-attribution { font-size: 11px; }
|
|
}
|
|
@media (orientation: portrait), (max-width: 700px) {
|
|
.board { padding: 16px 20px 0; }
|
|
h1 { font-size: clamp(28px, 5.7vw, 62px); }
|
|
.stop-direction { font-size: clamp(15px, 3vw, 28px); }
|
|
.clock { font-size: clamp(32px, 6.2vw, 68px); }
|
|
.today { font-size: clamp(12px, 2vw, 20px); }
|
|
.brand-word { display: none; }
|
|
.info-intro { flex-direction: column; align-items: flex-start; gap: 10px; }
|
|
.info-grid { grid-template-columns: minmax(0, 1fr); }
|
|
.info-card:not([data-active='true']) { display: none; }
|
|
.information-tabs { display: flex; }
|
|
.persistent-next > .eyebrow { display: none; }
|
|
}
|
|
@media (max-width: 700px) {
|
|
.board { --control-size: 32px; --control-gap: 3px; --hero-height: clamp(100px, 16vh, 150px); --hero-gap: 18px; padding: 12px 16px 0; }
|
|
.board[data-row-count='5'], .board[data-row-count='6'] { --hero-height: 95px; }
|
|
.board-header { gap: 12px; padding-bottom: 12px; }
|
|
.header-right { column-gap: 9px; }
|
|
.official-mark { width: 30px; }
|
|
.clock { font-size: clamp(27px, 6.8vw, 44px); gap: 4px; }
|
|
h1 { font-size: clamp(25px, 6.5vw, 42px); }
|
|
.today { font-size: 10px; }
|
|
.stop-meta { gap: 5px 12px; }
|
|
.stop-direction { font-size: 14px; margin-top: 7px; gap: 7px; }
|
|
.weather-summary { font-size: 13px; gap: 6px; margin-top: 7px; }
|
|
.weather-summary svg { width: 20px; height: 20px; }
|
|
.weather-summary > span { display: none; }
|
|
.source-label { font-size: 12px; gap: 5px; }
|
|
.eyebrow { font-size: 10px; }
|
|
.hero-departure { gap: 12px; }
|
|
.transport-kind { font-size: 11px; gap: 5px; margin-bottom: 5px; }
|
|
.transport-kind svg { width: 16px; height: 16px; }
|
|
.hero-details { margin-top: 7px; font-size: 12px; }
|
|
.hero-destination h2 { font-size: min(6vw, calc(var(--hero-height) * .30)); }
|
|
.route-badge-large { width: calc(var(--hero-height) * .70); padding: 0 10px; font-size: calc(var(--hero-height) * .54); }
|
|
.countdown-large .countdown-value { font-size: calc(var(--hero-height) * .62); }
|
|
.countdown-large[data-long='true'] .countdown-value { font-size: min(34px, calc(var(--hero-height) * .36)); }
|
|
.countdown-large .countdown-now { font-size: 5vw; }
|
|
.departure-row { gap: 10px; }
|
|
.departure-row .route-badge { width: 60px; padding: 0 8px; }
|
|
.row-destination h3 { font-size: min(5.7vw, calc(var(--row-height) * .36)); }
|
|
.row-time-compact { font-size: min(15px, calc(var(--row-height) * .19)); margin-top: 6px; }
|
|
.countdown .countdown-value { font-size: min(40px, calc(var(--row-height) * .6)); }
|
|
.countdown[data-long='true'] .countdown-value { font-size: min(27px, calc(var(--row-height) * .38)); }
|
|
.countdown-part small { font-size: max(14px, .42em); }
|
|
.countdown-large .countdown-value { font-size: calc(var(--hero-height) * .62); }
|
|
.countdown-large[data-long='true'] .countdown-value { font-size: 32px; }
|
|
.scene-navigation { gap: 12px; }
|
|
.footer-main { min-height: 50px; padding: 6px 0; }
|
|
.footer-status { font-size: 10px; padding-left: 10px; }
|
|
.board-controls { margin-left: 8px; }
|
|
.board-controls svg { width: 21px; height: 21px; }
|
|
.persistent-next { --row-height: 54px; gap: 10px; padding: 10px 0; }
|
|
.persistent-next .route-badge { height: 42px; width: 60px; font-size: 27px; }
|
|
.persistent-destination strong { font-size: 17px; }
|
|
.persistent-destination time { font-size: 13px; }
|
|
.persistent-next .countdown-value { font-size: 29px; }
|
|
.persistent-next .countdown[data-long='true'] .countdown-value { font-size: 25px; }
|
|
.persistent-next .countdown-now { font-size: 19px; }
|
|
.info-intro h2 { font-size: 28px; }
|
|
.information-tabs { gap: 7px; }
|
|
.information-tabs button { font-size: 12px; padding: 7px 10px; }
|
|
.info-card { padding: 18px; }
|
|
.info-card h3 { font-size: 24px; margin-bottom: 12px; }
|
|
.weather-attribution { padding-top: 12px; }
|
|
.info-status { font-size: 12px; padding-top: 10px; }
|
|
.notice { grid-template-columns: 44px minmax(0, 1fr); gap: 14px; padding: 18px 14px; border-radius: 20px; }
|
|
.notice-signal { width: 44px; height: 44px; border-radius: 14px; }
|
|
.notice-signal svg { width: 28px; height: 28px; }
|
|
.notice-meta { margin-bottom: 12px; }
|
|
.notice-routes { margin-bottom: 12px; }
|
|
.notice-routes .route-badge { height: 35px; min-width: 42px; padding: 0 10px; font-size: 23px; }
|
|
.notice h3 { font-size: 25px; }
|
|
.notice p { font-size: 17px; }
|
|
.transport-notice, .offline-banner { font-size: 12px; }
|
|
.settings-heading, .settings-body, .settings-actions { padding-left: 20px; padding-right: 20px; }
|
|
}
|
|
@media (max-height: 620px) and (min-width: 701px) {
|
|
.board { --hero-height: 110px; --hero-gap: 18px; padding-top: 10px; }
|
|
.board[data-row-count='5'], .board[data-row-count='6'] { --hero-height: 95px; }
|
|
.board-header { padding-bottom: 10px; }
|
|
.clock { font-size: 40px; }
|
|
h1 { font-size: 32px; }
|
|
.official-mark { width: 35px; }
|
|
.today { font-size: 12px; }
|
|
.info-screen { padding: 10px 0; }
|
|
.info-intro h2 { font-size: 28px; }
|
|
.info-card { padding: 16px 20px; }
|
|
.info-card h3 { font-size: 25px; margin-bottom: 10px; }
|
|
.info-screen[data-compact='true'][data-cards='true'] { position: relative; }
|
|
.info-screen[data-compact='true'][data-cards='true'] .info-intro { position: absolute; top: 27px; right: 20px; z-index: 1; margin: 0; }
|
|
.info-screen[data-compact='true'][data-cards='true'] .info-intro h2 { display: none; }
|
|
.info-screen[data-compact='true'][data-cards='true'] .info-card > h3 { padding-right: var(--info-tabs-width, 290px); min-height: 36px; text-align: left; display: flex; align-items: center; }
|
|
.info-status { font-size: 13px; padding-top: 10px; }
|
|
.persistent-next > .eyebrow { display: none; }
|
|
.persistent-next { padding: 10px 0; }
|
|
}
|
|
@media (max-width: 700px) and (max-height: 740px) {
|
|
.info-intro h2 { font-size: 25px; }
|
|
.info-intro { gap: 8px; }
|
|
.weather-attribution { padding-top: 8px; font-size: 10px; }
|
|
.weather-info { padding: 16px; }
|
|
}
|
|
/* Viewing distance raises type sizes; pagination preserves the available height. */
|
|
/* More cards rotate one at a time. Keep their controls above the title so the
|
|
additional tabs never consume the name's width on a short TV viewport. */
|
|
.info-screen[data-compact=true][data-many-blocks=true][data-cards=true] .info-intro { position: static; margin: 0 0 10px; flex-shrink: 0; }
|
|
.info-screen[data-compact=true][data-many-blocks=true][data-cards=true] .info-card > h3 { padding-right: 0; min-height: 0; display: block; }
|
|
.info-screen[data-many-blocks=true] .information-tabs { flex-wrap: wrap; justify-content: flex-end; gap: 6px; }
|
|
.info-screen[data-many-blocks=true] .information-tabs button { padding: 7px 10px; font-size: 13px; }
|
|
@media (max-width: 440px) {
|
|
.info-screen[data-many-blocks=true] .information-tabs button { font-size: 12px; padding: 6px 8px; }
|
|
.weather-hint { font-size: 14px; gap: 7px; }
|
|
}
|
|
.board { --reading-scale: 1; }
|
|
.board[data-profile='street'], .board[data-distance='medium'], .board[data-distance='far'] { --hero-height: clamp(125px, calc(18vh * var(--reading-scale)), 270px); }
|
|
.board h1 { font-size: clamp(30px, calc(3.8vw * var(--reading-scale)), 90px); }
|
|
.board .clock { font-size: clamp(38px, calc(4.6vw * var(--reading-scale)), 108px); }
|
|
.board .eyebrow { font-size: clamp(12px, calc(1.05vw * var(--reading-scale)), 26px); }
|
|
.board .source-label { font-size: clamp(13px, calc(1.15vw * var(--reading-scale)), 28px); }
|
|
.board .hero-destination h2 { font-size: min(calc(4.7vw * var(--reading-scale)), calc(var(--hero-height) * .34)); }
|
|
.board .row-destination h3 { font-size: min(calc(54px * var(--reading-scale)), calc(3.5vw * var(--reading-scale)), calc(var(--row-height) * .4)); }
|
|
.board .row-time { font-size: min(calc(42px * var(--reading-scale)), calc(var(--row-height) * .36)); }
|
|
.board .info-card h3 { font-size: clamp(23px, calc(2vw * var(--reading-scale)), 44px); }
|
|
.departure-content[data-next='true']:not([data-long-wait='true']) { --hero-height: clamp(134px, calc(18vh * var(--reading-scale) + 24px), 260px); }
|
|
.board[data-row-count='5'] .departure-content[data-next='true']:not([data-long-wait='true']), .board[data-row-count='6'] .departure-content[data-next='true']:not([data-long-wait='true']) { --hero-height: clamp(118px, calc(15vh * var(--reading-scale) + 24px), 224px); }
|
|
.hero-next { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin-top: 8px; color: var(--secondary); font-size: min(calc(22px * var(--reading-scale)), max(15px, calc(var(--hero-height) * .13))); line-height: 1.2; }
|
|
.hero-next time { color: var(--accent); display: inline-flex; align-items: baseline; gap: 6px; font-weight: 650; }
|
|
.departure-status { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; justify-content: center; gap: 6px; }
|
|
.departure-change { color: var(--warning); font-size: clamp(12px, calc(1.1vw * var(--reading-scale)), 20px); line-height: 1.2; }
|
|
.countdown-meta { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: baseline; gap: 2px .7em; text-align: right; font-size: clamp(14px, calc(var(--hero-height) * .12), calc(24px * var(--reading-scale))); line-height: 1.2; }
|
|
.countdown-meta .departure-change { font-size: 1em; }
|
|
.countdown-source { color: var(--secondary); font-weight: 500; white-space: nowrap; }
|
|
.cancelled-label { display: inline-flex; align-items: center; gap: 8px; color: var(--warning); font-size: min(calc(26px * var(--reading-scale)), calc(var(--row-height, 96px) * .31), 5.5vw); font-weight: 650; white-space: nowrap; }
|
|
.cancelled-label svg { width: .9em; height: .9em; }
|
|
.departure-row[data-status='cancelled'] .route-badge { color: var(--warning); border-color: var(--warning); }
|
|
.departure-row[data-status='cancelled'] h3 { color: var(--secondary); }
|
|
.empty-departures[data-cancelled='true'] > svg { display: none; }
|
|
.empty-departures[data-cancelled='true'] h2 { color: var(--warning); font-size: clamp(22px, calc(2.8vw * var(--reading-scale)), 44px); }
|
|
.departure-content[data-long-wait='true'] { --hero-height: clamp(142px, calc(24vh * var(--reading-scale)), 300px); }
|
|
.long-wait-time { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; justify-content: center; gap: 8px; }
|
|
.long-wait-time > span:first-child { color: var(--secondary); font-size: clamp(17px, calc(2vw * var(--reading-scale)), 34px); }
|
|
.long-wait-time > time { color: var(--accent); font-size: min(calc(144px * var(--reading-scale)), calc(9vw * var(--reading-scale)), calc(var(--hero-height) * .7)); line-height: 1; font-weight: 600; white-space: nowrap; }
|
|
.board[data-motion='calm'] .numeric-old, .board[data-motion='calm'] .destination-old { display: none; }
|
|
.board[data-motion='calm'] .numeric-current, .board[data-motion='calm'] .destination-current { transform: none !important; }
|
|
.board[data-motion='calm'] .numeric-glyph[data-rolling] .numeric-current, .board[data-motion='calm'] .destination-current[data-changing='true'], .board[data-motion='calm'] .scene { animation: calm-in 180ms ease-out both; }
|
|
@keyframes calm-in { from { opacity: .35; } to { opacity: 1; } }
|
|
@media (max-width: 1000px) {
|
|
.board .row-destination h3 { font-size: min(calc(42px * var(--reading-scale)), calc(4vw * var(--reading-scale)), calc(var(--row-height) * .36)); }
|
|
.board .row-time-compact { font-size: min(calc(20px * var(--reading-scale)), calc(var(--row-height) * .21)); }
|
|
}
|
|
@media (max-height: 620px) and (min-width: 701px) {
|
|
.board h1 { font-size: calc(32px * var(--reading-scale)); }
|
|
.board .clock { font-size: calc(40px * var(--reading-scale)); }
|
|
}
|
|
@media (max-width: 700px) {
|
|
.board h1 { font-size: clamp(25px, calc(6.5vw * var(--reading-scale)), 54px); }
|
|
.board .clock { font-size: clamp(27px, calc(6.8vw * var(--reading-scale)), 56px); }
|
|
.board .eyebrow { font-size: calc(10px * var(--reading-scale)); }
|
|
.board .source-label { font-size: calc(12px * var(--reading-scale)); }
|
|
.board .hero-destination h2 { font-size: min(calc(6vw * var(--reading-scale)), calc(var(--hero-height) * .3)); }
|
|
.board .row-destination h3 { font-size: min(calc(42px * var(--reading-scale)), calc(5.7vw * var(--reading-scale)), calc(var(--row-height) * .36)); }
|
|
.board .info-card h3 { font-size: min(calc(24px * var(--reading-scale)), 7vw); }
|
|
.hero-next { font-size: 15px; gap: 4px 7px; margin-top: 6px; }
|
|
.departure-status { gap: 4px; }
|
|
.departure-change { font-size: 12px; }
|
|
/* Wrap within the countdown's width rather than squeezing the destination. */
|
|
.countdown-meta { font-size: 13px; width: min-content; min-width: 100%; }
|
|
.countdown-source { white-space: normal; }
|
|
.hero-departure[data-long-wait='true'] { grid-template-columns: auto minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto; gap: 8px 12px; }
|
|
.hero-departure[data-long-wait='true'] > .route-badge { grid-row: 1 / 3; width: min(calc(var(--hero-height) * .7), 110px); height: min(calc(var(--hero-height) - 10px), 160px); }
|
|
.hero-departure[data-long-wait='true'] .transport-kind { display: none; }
|
|
.long-wait-time { grid-column: 2; align-items: flex-start; gap: 4px; }
|
|
.long-wait-time > span:first-child { font-size: 16px; }
|
|
.long-wait-time > time { font-size: min(56px, 14vw); }
|
|
.board[data-distance='far'] .hero-departure:not([data-long-wait='true']) { grid-template-columns: auto minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto; gap: 8px 12px; }
|
|
.board[data-distance='far'] .departure-content:not([data-long-wait='true']) { --hero-height: clamp(142px, calc(19vh * var(--reading-scale)), 220px); }
|
|
.board[data-distance='far'] .hero-departure:not([data-long-wait='true']) > .route-badge { grid-row: 1 / 3; width: 110px; height: min(calc(var(--hero-height) - 10px), 160px); }
|
|
.board[data-distance='far'] .hero-departure:not([data-long-wait='true']) .transport-kind { display: none; }
|
|
.board[data-distance='far'] .hero-departure > .departure-status { grid-column: 2; align-items: flex-start; }
|
|
.board[data-distance='far'] .hero-departure .countdown-meta { justify-content: flex-start; text-align: left; }
|
|
.board[data-distance='far'] .hero-departure .countdown-large .countdown-value { font-size: 64px; }
|
|
}
|
|
::view-transition { pointer-events: none; }
|
|
::view-transition-old(root), ::view-transition-new(root) { animation-duration: 320ms; }
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*, *::before, *::after { animation-duration: .01ms !important; animation-delay: 0ms !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
|
|
.numeric-old { visibility: hidden; }
|
|
.numeric-current { transform: none !important; }
|
|
.destination-old { visibility: hidden; }
|
|
.destination-current { transform: none !important; }
|
|
}
|
|
|
|
/* Device onboarding keeps the same black/lime typography as the board. */
|
|
.device-setup{min-height:100dvh;background:#000;color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:clamp(24px,4vw,64px);text-align:center;gap:clamp(22px,4vh,48px);--accent:#d5ff70}.device-setup-brand{display:flex;align-items:center;gap:12px;font-size:32px;font-weight:800;letter-spacing:-.07em}.device-setup-brand>span{display:block;width:48px;color:var(--accent)}.device-setup-brand svg{width:100%;height:auto}.device-setup-card{width:min(850px,100%);border:1px solid #38402a;border-radius:32px;padding:clamp(22px,4vw,52px);background:radial-gradient(ellipse at top,#d5ff7011,transparent 65%)}.device-setup-card h1{font-size:clamp(30px,4.4vw,62px);margin:12px 0 18px;letter-spacing:-.055em}.device-setup-card p{font-size:clamp(18px,2vw,26px);color:#b3b9aa;max-width:640px;margin:0 auto;line-height:1.4}.device-pair-code{display:flex;justify-content:center;font-weight:750;font-size:clamp(64px,min(14vw,18vh),150px);letter-spacing:.08em;margin:22px 0;color:var(--accent)}.device-pair-expiry{display:flex;justify-content:center;align-items:center;gap:10px;font-size:clamp(18px,2vw,24px);color:#b3b9aa}.device-pair-expiry .numeric-text{color:var(--accent)}.device-setup button,.managed-panel button{display:inline-flex;align-items:center;justify-content:center;gap:10px;padding:14px 20px;font-size:18px;border:1px solid #555;border-radius:14px;color:#fff;background:#161616;min-height:50px}.device-setup-card button{margin-top:24px}.device-setup-card a{display:block;margin-top:20px;color:var(--accent);font-size:20px}.device-setup-status{color:#ffd479;margin-top:20px;font-size:18px}.managed-panel{color:var(--text);background:var(--background,#000);border:1px solid var(--border,#555);border-radius:26px;padding:32px;width:min(600px,calc(100% - 32px));max-height:calc(100dvh - 32px);overflow:auto}.managed-panel::backdrop{background:#000a;backdrop-filter:blur(8px)}.managed-panel>svg{color:var(--accent)}.managed-panel h2{font-size:28px;margin:16px 0}.managed-panel strong{font-size:22px;color:var(--accent)}.managed-panel p{font-size:18px;line-height:1.5;margin:16px 0;color:var(--muted,#aaa)}.managed-panel dl{display:grid;grid-template-columns:1fr 1fr;gap:12px;font-size:16px;margin:20px 0}.managed-panel>div{display:flex;gap:12px;flex-wrap:wrap}.managed-offline{color:var(--warning);font-size:14px;position:fixed;top:8px;left:50%;transform:translateX(-50%);background:var(--background,#000);padding:6px 12px;border-radius:10px;z-index:3;max-width:90vw;text-align:center}@media(max-height:650px){.device-setup{gap:16px;padding:20px}.device-setup-card{padding:24px}.device-pair-code{margin:14px 0}.device-setup-brand{font-size:26px}.device-setup-brand>span{width:36px}}
|
|
|
|
/* Quiet schedule-based night screen. The saved daytime theme remains intact. */
|
|
.board[data-night=true] .cycle-progress{opacity:0}.night-screen{height:100%;min-height:0;display:flex;flex-direction:column;gap:clamp(14px,2.4vh,30px);padding:clamp(14px,2.2vh,28px) 0;container-type:size}.night-intro{flex-shrink:0}.night-intro .eyebrow{display:flex;align-items:center;gap:10px;color:var(--accent)}.night-intro h2{font-size:clamp(26px,3.3vw,54px);letter-spacing:-.05em;font-weight:650;margin:12px 0 0;line-height:1.15;max-width:1000px}.night-content{flex:1;min-height:0;display:grid;grid-template-columns:minmax(0,1fr);align-items:center}.night-service{min-width:0;display:flex;flex-direction:column;gap:clamp(10px,2cqh,20px)}.night-service-label{font-size:clamp(20px,2vw,32px);color:var(--muted)}.night-service-time{font-size:clamp(64px,min(13vw,28cqh),180px);font-weight:650;line-height:1;color:var(--accent);letter-spacing:-.055em;display:block}.night-route{display:flex;align-items:center;gap:clamp(14px,2vw,26px);min-width:0}.night-route .route-badge{width:clamp(72px,8vw,130px);height:clamp(58px,10cqh,100px);border-radius:22px;flex-shrink:0;font-size:clamp(28px,4vw,60px)}.night-route h3{font-size:clamp(24px,3vw,46px);font-weight:600;line-height:1.2;letter-spacing:-.045em;overflow-wrap:anywhere;margin:0}.night-alerts{flex:0 1 30%;min-height:100px;max-height:200px;overflow:auto;position:relative;scrollbar-width:none}.night-alerts .notice{grid-template-columns:minmax(0,1fr);margin:0;padding:16px 20px;border-radius:18px}.night-alerts .notice h3{font-size:clamp(20px,1.8vw,28px)}.night-alerts .notice p{font-size:clamp(18px,1.5vw,24px);line-height:1.35}.night-alerts .notice-routes{display:flex;gap:8px;margin:8px 0}.night-alerts .notice-routes .route-badge{width:62px;height:38px;border-radius:10px;font-size:22px}.night-alerts .notice-graphic{display:none}.night-alert-page{display:block;text-align:right;color:var(--muted);font-size:14px;padding:6px}.board[data-night=true] .numeric-old,.board[data-night=true] .numeric-next,.board[data-night=true] .numeric-previous{animation:none!important}.board[data-night=true] .numeric-current{animation:none!important}@media(max-width:700px){.night-screen{gap:16px;padding:18px 0}.night-intro h2{font-size:clamp(26px,6.7vw,36px)}.night-content{grid-template-columns:1fr;gap:18px;align-content:center}.night-service{gap:12px}.night-service-time{font-size:clamp(68px,min(22vw,24cqh),115px)}.night-route h3{font-size:clamp(23px,5.7vw,32px)}.night-alerts{max-height:150px;flex-basis:28%}.night-alerts .notice{padding:14px}.night-alerts .notice-meta{flex-wrap:wrap}.night-alerts .notice-period{font-size:13px}.night-alerts .notice p{font-size:18px}}@media(max-height:620px) and (min-width:701px){.night-screen{gap:12px;padding:12px 0}.night-intro h2{font-size:clamp(25px,3vw,36px);margin-top:8px}.night-service-time{font-size:clamp(64px,28cqh,120px)}.night-route h3{font-size:clamp(23px,3vw,36px)}.night-route .route-badge{height:56px;width:80px}.night-alerts{min-height:90px;max-height:110px;flex-basis:28%}.night-service-label{font-size:22px}}
|