/** * The fleet page: a banner, a map beside a gantt, and the gantt itself. */ .fleet-select { height: 32px; padding: 0 10px; border: 1px solid var(--color-border); border-radius: 7px; background: var(--color-surface); font: inherit; font-size: 13px; color: var(--color-ink-1); } .fleet-select:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 1px; } /* ── The recommendation banner ───────────────────────────────────────────── */ /* Severity is carried by the left rail and the icon, not by a wash of colour across the whole strip — a full red panel reads as an error the console has hit, rather than a finding about the fleet. */ .fleet-banner { display: flex; gap: 10px; align-items: flex-start; padding: 12px 14px; border: 1px solid var(--color-border); border-left-width: 3px; border-radius: 9px; background: var(--color-surface); } .fleet-banner > svg { flex: none; margin-top: 1px; } .fleet-banner div { display: flex; flex-direction: column; gap: 2px; } .fleet-banner strong { font-size: 13.5px; font-weight: 600; color: var(--color-ink-1); } .fleet-banner span { font-size: 12.5px; line-height: 1.5; color: var(--color-ink-3); } .fleet-banner[data-severity='good'] { border-left-color: #0f8a5f; color: #0f8a5f; } .fleet-banner[data-severity='watch'] { border-left-color: #b45309; color: #b45309; } .fleet-banner[data-severity='act'] { border-left-color: #b91c1c; color: #b91c1c; } /* ── Map beside gantt ────────────────────────────────────────────────────── */ .fleet-body { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 16px; align-items: start; } @media (max-width: 1100px) { .fleet-body { grid-template-columns: minmax(0, 1fr); } } /* ── The gantt ───────────────────────────────────────────────────────────── */ .gantt { display: flex; flex-direction: column; gap: 2px; } /* The track is the flexible column; the name and the three figures are fixed, so every row's bars start and end at the same x and the day lines up down the list. A shrink-to-fit name column would stagger them by rider. */ .gantt-row { display: grid; grid-template-columns: 132px minmax(0, 1fr) 62px 34px 54px; gap: 10px; align-items: center; width: 100%; padding: 6px 8px; border: 1px solid transparent; border-radius: 7px; background: none; font: inherit; text-align: left; cursor: pointer; } .gantt-row:hover { background: var(--color-surface-subtle); } .gantt-row[data-active='true'] { border-color: var(--color-brand); background: var(--color-brand-tint); } .gantt-row:focus-visible { outline: 2px solid var(--color-brand); outline-offset: 1px; } .gantt-name { display: flex; gap: 7px; align-items: center; overflow: hidden; font-size: 12.5px; color: var(--color-ink-1); text-overflow: ellipsis; white-space: nowrap; } /* The same colour as this rider's line on the map — the only thing tying the two panels together. */ .gantt-name i { flex: none; width: 8px; height: 8px; border-radius: 50%; } .gantt-track { position: relative; height: 16px; border-radius: 4px; background: var(--color-surface-sunken); } .gantt-bar { position: absolute; top: 3px; height: 10px; border-radius: 3px; } .gantt-figure { font-size: 12px; font-variant-numeric: tabular-nums; color: var(--color-ink-1); text-align: right; } .gantt-quiet { color: var(--color-ink-3); } .gantt-figure em { color: var(--color-ink-4); font-style: normal; } .gantt-axis { display: flex; justify-content: space-between; /* Aligned to the track column, so the two clock readings sit under the ends of the bars they label rather than under the whole row. */ padding: 4px 160px 0 150px; font-size: 11px; font-variant-numeric: tabular-nums; color: var(--color-ink-4); } .fleet-note-icon { display: inline-flex; color: var(--color-ink-4); } /* ── One rider's runs, opened from the gantt ─────────────────────────────── */ .shift-detail { display: flex; flex-direction: column; gap: 6px; padding: 10px 12px; border: 1px solid var(--color-border); border-radius: 8px; background: var(--color-surface-subtle); } .shift-detail strong { font-size: 12.5px; color: var(--color-ink-1); } .shift-detail > span { font-size: 12px; color: var(--color-ink-3); } .shift-detail ul { display: flex; flex-direction: column; gap: 3px; margin: 0; padding: 0; list-style: none; } .shift-detail li { display: flex; gap: 10px; align-items: baseline; font-size: 12px; font-variant-numeric: tabular-nums; color: var(--color-ink-2); } .shift-detail em { font-style: normal; font-weight: 600; color: var(--color-ink-1); } /* A long silence inside a run means the shift is stitched across it, so the total above is an upper bound. Said on the row rather than in a footnote. */ .shift-gap { color: #b45309; } .fleet-inline-note { display: flex; gap: 7px; align-items: flex-start; padding: 8px 10px; border-radius: 7px; background: var(--color-surface-subtle); font-size: 11.5px; line-height: 1.5; color: var(--color-ink-3); } .fleet-inline-note svg { flex: none; margin-top: 2px; }