Aggiunge overlay server-side burn-in e stabilizza diretta live.

Tabellone, badge e brand sono ricodificati nel flusso _air via OverlayRelay;
sync punteggio HTTP, volume condiviso rails/sidekiq, qualità 720p migliorata
e badge CONNECTING in ripresa da pausa.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-03 23:55:17 +02:00
parent fd225fbadd
commit ab9cb02083
58 changed files with 2423 additions and 242 deletions

View File

@@ -5,11 +5,285 @@
padding: 24px 20px 48px;
}
.live-main video {
.live-main .live-player-wrap {
position: relative;
width: 100%;
max-height: 70vh;
background: #000;
aspect-ratio: 16 / 9;
max-height: min(70vh, calc(100vw * 9 / 16));
min-height: 200px;
border-radius: 12px;
overflow: hidden;
background: #000;
contain: layout style;
}
.live-main video {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
max-height: none;
object-fit: contain;
background: #000;
border-radius: 0;
display: block;
}
/* Sovraimpressioni chiare sul video (copertina scura). */
.live-main .live-player-overlays {
position: absolute;
inset: 0;
z-index: 3;
pointer-events: none;
}
.live-main .live-ovl-badge {
position: absolute;
top: 12px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.65);
}
.live-main .live-ovl-badge--right {
right: 12px;
left: auto;
}
/* Tabellone broadcast: tabella per colonne allineate (set / punteggi). */
.live-main .live-scorebug {
position: absolute;
top: 12px;
left: 12px;
width: max-content;
max-width: min(92%, 320px);
padding: 6px 8px 5px;
border-radius: 6px;
background: rgba(255, 255, 255, 0.94);
color: #111;
box-shadow: 0 2px 14px rgba(0, 0, 0, 0.45);
font-size: 0.8rem;
line-height: 1.2;
}
.live-main .live-scorebug__table {
border-collapse: collapse;
table-layout: fixed;
width: auto;
}
.live-main .live-scorebug__col-team {
width: 7.25rem;
}
.live-main .live-scorebug__col-set {
width: 1.85rem;
}
.live-main .live-scorebug__corner {
width: 7.25rem;
padding: 0;
border: none;
font-size: 0;
line-height: 0;
visibility: hidden;
}
.live-main .live-scorebug thead th {
padding: 0 0 4px;
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
font-size: 0.68rem;
font-weight: 700;
color: #666;
text-align: center;
vertical-align: bottom;
}
.live-main .live-scorebug__col-h {
letter-spacing: 0.02em;
}
.live-main .live-scorebug tbody th,
.live-main .live-scorebug tbody td {
padding: 3px 0;
vertical-align: middle;
}
.live-main .live-scorebug tbody tr + tr th,
.live-main .live-scorebug tbody tr + tr td {
padding-top: 2px;
}
.live-main .live-scorebug__team {
font-weight: 700;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 7.25rem;
padding-right: 8px;
}
.live-main .live-scorebug__row--home .live-scorebug__team {
color: var(--sb-home-primary, #111);
}
.live-main .live-scorebug__row--away .live-scorebug__team {
color: var(--sb-away-primary, #1565c0);
}
.live-main .live-scorebug__pts {
text-align: center;
font-weight: 800;
font-variant-numeric: tabular-nums;
color: #111;
padding-left: 0;
padding-right: 0;
}
.live-main .live-scorebug__pts--live-home {
background: color-mix(in srgb, var(--sb-home-primary, #e53935) 16%, #fff);
border-radius: 3px;
color: var(--sb-home-primary, #111);
font-weight: 900;
}
.live-main .live-scorebug__pts--live-away {
background: color-mix(in srgb, var(--sb-away-primary, #1565c0) 16%, #fff);
border-radius: 3px;
color: var(--sb-away-primary, #111);
font-weight: 900;
}
.live-main .live-scorebug__brand {
margin-top: 5px;
padding: 4px 10px;
border-radius: 4px;
background: linear-gradient(135deg, #14141c 0%, #2a1214 55%, #1a1a24 100%);
border: 1px solid rgba(229, 57, 53, 0.35);
text-align: center;
line-height: 1.1;
}
.live-main .live-scorebug__brand-text {
font-size: 0.7rem;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #fff;
}
.live-main .live-scorebug__brand-accent {
color: #e53935;
}
.live-main .live-scorebug .visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
@media (max-width: 520px) {
.live-main .live-scorebug {
font-size: 0.72rem;
max-width: 88%;
padding: 5px 6px 4px;
}
.live-main .live-scorebug__col-team,
.live-main .live-scorebug__corner {
width: 5.75rem;
}
.live-main .live-scorebug__team {
max-width: 5.75rem;
}
.live-main .live-scorebug__col-set {
width: 1.55rem;
}
}
.live-main .live-status-msg {
margin: 12px 0 0;
color: #f5f5f5;
font-size: 0.95rem;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
}
.live-main .live-status-msg[hidden] {
display: none !important;
}
.live-main .live-play-hint {
position: absolute;
left: 50%;
top: 50%;
z-index: 5;
transform: translate(-50%, -50%);
padding: 12px 22px;
border: none;
border-radius: 999px;
background: rgba(229, 57, 53, 0.92);
color: #fff;
font-size: 1rem;
font-weight: 700;
cursor: pointer;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
pointer-events: auto;
}
.live-main .live-play-hint[hidden] {
display: none;
}
.live-main .live-cover-veil {
z-index: 4;
}
.live-main .live-cover-veil__hint {
color: #ffffff;
background: rgba(0, 0, 0, 0.72);
border: 1px solid rgba(255, 255, 255, 0.25);
}
/* Messaggio pausa sopra il video: la copertina brand è nello stream HLS (MediaMTX). */
.live-main .live-cover-veil {
position: absolute;
inset: 0;
z-index: 2;
pointer-events: none;
display: flex;
align-items: flex-end;
justify-content: center;
padding: 0 16px 14%;
background: linear-gradient(180deg, transparent 55%, rgba(0, 0, 0, 0.55) 100%);
opacity: 0;
transition: opacity 0.4s ease;
}
.live-main .live-cover-veil[hidden] {
display: none !important;
}
.live-main .live-cover-veil.is-active {
opacity: 1;
}
.live-main .live-cover-veil__hint {
margin: 0;
padding: 10px 18px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.65);
color: #fff;
font-size: clamp(0.9rem, 2.5vw, 1.1rem);
font-weight: 600;
text-align: center;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.8);
}
.live-main .badge {
@@ -24,17 +298,24 @@
.live-main .badge-live { background: #e53935; color: #fff; }
.live-main .badge-on-air { background: #2e7d32; color: #fff; }
.live-main .badge-wait { background: #444; color: #ddd; }
.live-main .badge-wait { background: rgba(0, 0, 0, 0.65); color: #fff; border: 1px solid rgba(255, 255, 255, 0.35); }
.live-main .badge-connecting { background: #f57c00; color: #fff; }
.live-main .badge-ended { background: #374151; color: #ddd; }
.live-main .stream-ended {
position: absolute;
inset: 0;
z-index: 4;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 48px 24px;
margin: 16px 0;
padding: 24px;
margin: 0;
background: linear-gradient(160deg, #14141c 0%, #0a0a0e 100%);
border: 1px dashed #2a2a36;
border-radius: 16px;
border: none;
border-radius: 0;
}
.live-main .stream-ended-icon {