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:
BIN
backend/public/images/copertina-canale.png
Normal file
BIN
backend/public/images/copertina-canale.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user