/* =================================================================== TEMA: estadio nocturno. El césped es el protagonista; los acentos de color se derivan de los colores de cada equipo (meta.colors) desde JS. Tipografía con carácter: pila condensada tipo "broadcast" para marcadores/títulos (Bahnschrift en Windows, DIN/Avenir en macOS) y una pila humanista limpia para el texto. Se evitan Inter/Roboto/Arial. =================================================================== */ :root { color-scheme: dark; --home: #4da3ff; --away: #ff7043; --home-soft: rgba(77,163,255,.18); --away-soft: rgba(255,112,67,.18); --bg-0: #05070c; --bg-1: #0a1018; --panel: rgba(16,22,32,.72); --panel-brd: rgba(255,255,255,.08); --ink: #eef3fb; --ink-dim: #9fb0c6; --ink-faint: #6a7a92; --grass: #1f8a3e; --shadow: 0 18px 50px rgba(0,0,0,.55); --r: 16px; --disp: "Bahnschrift", "DIN Alternate", "DIN Condensed", "Avenir Next Condensed", "Roboto Condensed", ui-sans-serif, system-ui, sans-serif; --body: "Segoe UI Variable", "Segoe UI", "SF Pro Text", ui-sans-serif, system-ui, sans-serif; } * { box-sizing: border-box; } html, body { height: 100%; } body { margin: 0; font-family: var(--body); color: var(--ink); background: radial-gradient(1200px 700px at 50% -10%, #16233a 0%, transparent 60%), radial-gradient(900px 600px at 90% 110%, rgba(30,45,70,.5) 0%, transparent 55%), linear-gradient(180deg, var(--bg-1), var(--bg-0)); background-attachment: fixed; -webkit-font-smoothing: antialiased; display: flex; justify-content: center; padding: clamp(10px, 2vw, 26px); } .stage { width: 100%; max-width: 1240px; display: flex; flex-direction: column; gap: 14px; } /* ---------- Barra superior / marcador estilo TV ---------- */ .brandline { display: flex; align-items: center; gap: 10px; font-family: var(--disp); letter-spacing: .14em; text-transform: uppercase; font-size: 12px; color: var(--ink-faint); } .brandline .ball { font-size: 15px; filter: saturate(0); opacity: .8; } .brandline .live { margin-left: auto; display: inline-flex; align-items: center; gap: 7px; color: #ff5d5d; font-weight: 700; letter-spacing: .18em; } .brandline .live .dot { width: 8px; height: 8px; border-radius: 50%; background: #ff3b3b; box-shadow: 0 0 0 0 rgba(255,59,59,.7); animation: livePulse 1.6s infinite; } @keyframes livePulse { 0% { box-shadow: 0 0 0 0 rgba(255,59,59,.6); } 70% { box-shadow: 0 0 0 9px rgba(255,59,59,0); } 100% { box-shadow: 0 0 0 0 rgba(255,59,59,0); } } .scoreboard { display: grid; grid-template-columns: 1fr auto 1fr; align-items: stretch; gap: 0; background: linear-gradient(180deg, rgba(22,30,44,.92), rgba(11,16,26,.92)); border: 1px solid var(--panel-brd); border-radius: var(--r); box-shadow: var(--shadow); overflow: hidden; /* marcador fijo: queda siempre visible arriba mientras se juega */ position: sticky; top: 8px; z-index: 30; } /* franja de color de equipo a cada lado del marcador */ .scoreboard::before, .scoreboard::after { content: ""; position: absolute; top: 0; bottom: 0; width: 6px; } .scoreboard::before { left: 0; background: var(--home); } .scoreboard::after { right: 0; background: var(--away); } .team { display: flex; align-items: center; gap: 14px; padding: 16px 26px; min-width: 0; } .team.away { justify-content: flex-end; } .team .chip { width: 16px; height: 34px; border-radius: 5px; flex: none; box-shadow: 0 0 16px currentColor, inset 0 0 0 1px rgba(255,255,255,.25); } .team.home .chip { color: var(--home); background: var(--home); } .team.away .chip { color: var(--away); background: var(--away); } .team .name { font-family: var(--disp); font-size: clamp(15px, 2.4vw, 26px); font-weight: 700; letter-spacing: .02em; text-transform: uppercase; line-height: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .team.home .name { color: color-mix(in srgb, var(--home) 85%, white); } .team.away .name { color: color-mix(in srgb, var(--away) 85%, white); } .center { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 10px 22px; background: rgba(0,0,0,.28); border-left: 1px solid var(--panel-brd); border-right: 1px solid var(--panel-brd); } .scores { display: flex; align-items: baseline; gap: 12px; font-family: var(--disp); font-size: clamp(34px, 6vw, 58px); font-weight: 700; line-height: .9; font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; } .scores .num { min-width: .9em; text-align: center; display: inline-block; } .scores #hs { color: color-mix(in srgb, var(--home) 80%, white); } .scores #as { color: color-mix(in srgb, var(--away) 80%, white); } .scores .dash { color: var(--ink-faint); font-size: .5em; transform: translateY(-.35em); } .scores .num.bump { animation: scoreBump .55s cubic-bezier(.2,1.4,.35,1); } @keyframes scoreBump { 0% { transform: scale(1); } 35% { transform: scale(1.55); filter: brightness(1.6); } 100% { transform: scale(1); } } .clock { font-family: var(--disp); font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; font-size: 14px; letter-spacing: .16em; color: var(--ink-dim); display: inline-flex; align-items: center; gap: 8px; } .clock .pill { font-size: 10px; letter-spacing: .12em; text-transform: uppercase; padding: 2px 7px; border-radius: 999px; background: rgba(255,255,255,.07); color: var(--ink-dim); } /* ---------- Zona principal: campo + panel de comentarios ---------- */ .main { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 14px; align-items: stretch; } .pitchwrap { position: relative; border-radius: var(--r); overflow: hidden; box-shadow: var(--shadow); background: #0a1410; isolation: isolate; } canvas#cv { display: block; width: 100%; height: auto; } /* destello de gol sobre el campo */ .flash { position: absolute; inset: 0; pointer-events: none; opacity: 0; background: radial-gradient(circle at 50% 45%, var(--flash-col, #fff) 0%, transparent 60%); mix-blend-mode: screen; } .flash.go { animation: flashFx .9s ease-out; } @keyframes flashFx { 0% { opacity: 0; } 12% { opacity: .85; } 100% { opacity: 0; } } /* banner GOL */ .golbanner { position: absolute; left: 50%; top: 42%; transform: translate(-50%,-50%) scale(.6); font-family: var(--disp); font-weight: 700; letter-spacing: .06em; font-size: clamp(46px, 11vw, 128px); line-height: .9; text-transform: uppercase; pointer-events: none; opacity: 0; color: #fff; text-shadow: 0 6px 30px rgba(0,0,0,.6); -webkit-text-stroke: 2px var(--gol-col, #fff); } .golbanner .who { display: block; font-size: .26em; letter-spacing: .18em; text-align: center; -webkit-text-stroke: 0; color: var(--gol-col, #fff); margin-top: .2em; } .golbanner.go { animation: golPop 2.1s cubic-bezier(.2,1.2,.3,1); } @keyframes golPop { 0% { opacity: 0; transform: translate(-50%,-50%) scale(.4) rotate(-6deg); } 14% { opacity: 1; transform: translate(-50%,-50%) scale(1.08) rotate(-2deg); } 22% { transform: translate(-50%,-50%) scale(1) rotate(0); } 78% { opacity: 1; transform: translate(-50%,-50%) scale(1); } 100% { opacity: 0; transform: translate(-50%,-50%) scale(1.05); } } /* tarjeta de resultado final */ .finalcard { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 18px; background: radial-gradient(circle at 50% 40%, rgba(6,10,16,.72), rgba(4,6,11,.92)); backdrop-filter: blur(3px); opacity: 0; visibility: hidden; transition: opacity .5s ease; text-align: center; padding: 24px; } .finalcard.show { opacity: 1; visibility: visible; } .finalcard .kicker { font-family: var(--disp); letter-spacing: .3em; text-transform: uppercase; font-size: 13px; color: var(--ink-dim); } .finalcard .fscore { font-family: var(--disp); font-weight: 700; font-size: clamp(56px, 12vw, 118px); line-height: .9; display: flex; gap: 20px; align-items: baseline; font-variant-numeric: tabular-nums; } .finalcard .fscore .h { color: color-mix(in srgb, var(--home) 82%, white); } .finalcard .fscore .a { color: color-mix(in srgb, var(--away) 82%, white); } .finalcard .fscore .x { color: var(--ink-faint); font-size: .45em; } .finalcard .winner { font-family: var(--disp); font-size: clamp(18px, 3vw, 30px); text-transform: uppercase; letter-spacing: .05em; } .finalcard .teams { color: var(--ink-dim); font-size: 14px; letter-spacing: .04em; } /* ---------- Panel de comentarios de la IA ---------- */ .commentary { display: flex; flex-direction: column; min-height: 0; background: var(--panel); border: 1px solid var(--panel-brd); border-radius: var(--r); box-shadow: var(--shadow); overflow: hidden; } .commentary h2 { margin: 0; padding: 14px 16px 12px; font-family: var(--disp); font-size: 14px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase; color: var(--ink-dim); border-bottom: 1px solid var(--panel-brd); display: flex; align-items: center; gap: 9px; } .commentary h2 .spark { width: 7px; height: 7px; border-radius: 50%; background: linear-gradient(var(--home), var(--away)); box-shadow: 0 0 10px var(--home); } #feed { list-style: none; margin: 0; padding: 10px; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; scroll-behavior: smooth; /* la altura la fija el grid; scroll interno para textos largos */ max-height: 560px; } #feed::-webkit-scrollbar { width: 8px; } #feed::-webkit-scrollbar-thumb { background: rgba(255,255,255,.14); border-radius: 8px; } #feed li { display: grid; grid-template-columns: 26px 1fr; gap: 10px; padding: 9px 10px; border-radius: 11px; background: rgba(255,255,255,.03); border: 1px solid rgba(255,255,255,.05); border-left: 3px solid var(--ev-col, var(--ink-faint)); animation: feedIn .45s ease both; } @keyframes feedIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } #feed li.fresh { box-shadow: 0 0 0 1px var(--ev-col, transparent), 0 6px 18px rgba(0,0,0,.35); } #feed li.goal { background: linear-gradient(90deg, rgba(255,255,255,.09), rgba(255,255,255,.02)); } #feed .ico { font-size: 17px; line-height: 1.4; text-align: center; } #feed .body { min-width: 0; } #feed .meta { display: flex; align-items: center; gap: 7px; margin-bottom: 3px; font-family: var(--disp); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--ink-faint); } #feed .meta .team { color: var(--ev-col); font-weight: 700; } #feed .meta .t { margin-left: auto; font-variant-numeric: tabular-nums; } #feed .note { font-size: 13px; color: var(--ink); line-height: 1.4; word-break: break-word; } #feed .empty { color: var(--ink-faint); font-size: 13px; text-align: center; padding: 20px 8px; } /* ---------- Controles ---------- */ .controls { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; background: var(--panel); border: 1px solid var(--panel-brd); border-radius: var(--r); box-shadow: var(--shadow); padding: 12px 16px; } .btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; font-family: var(--body); font-size: 14px; font-weight: 650; color: var(--ink); cursor: pointer; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.10); border-radius: 11px; padding: 9px 15px; transition: background .16s ease, transform .06s ease, border-color .16s ease; -webkit-tap-highlight-color: transparent; } .btn:hover { background: rgba(255,255,255,.12); border-color: rgba(255,255,255,.2); } .btn:active { transform: translateY(1px) scale(.98); } .btn.primary { background: linear-gradient(180deg, color-mix(in srgb, var(--grass) 88%, white 6%), var(--grass)); border-color: rgba(255,255,255,.18); color: #f2fff4; } .btn.primary:hover { filter: brightness(1.08); background: linear-gradient(180deg, color-mix(in srgb, var(--grass) 80%, white 10%), var(--grass)); } .btn .glyph { font-size: 13px; } .btn:focus-visible, .seg button:focus-visible, .timeline input:focus-visible { outline: 2px solid #7cc0ff; outline-offset: 2px; } /* control segmentado de velocidad */ .seg { display: inline-flex; padding: 3px; gap: 2px; background: rgba(0,0,0,.28); border: 1px solid rgba(255,255,255,.08); border-radius: 11px; } .seg button { font-family: var(--disp); font-size: 13px; letter-spacing: .02em; color: var(--ink-dim); background: transparent; border: 0; cursor: pointer; padding: 6px 11px; border-radius: 8px; transition: all .16s ease; font-variant-numeric: tabular-nums; } .seg button:hover { color: var(--ink); } .seg button.on { color: #06121a; background: linear-gradient(180deg, #cfe9ff, #8fc6ff); box-shadow: 0 2px 8px rgba(0,0,0,.35); } .seg .lbl { align-self: center; padding: 0 8px 0 4px; color: var(--ink-faint); font-family: var(--disp); font-size: 11px; letter-spacing: .12em; text-transform: uppercase; } /* línea de tiempo con marcadores de gol */ .timeline { flex: 1 1 260px; min-width: 200px; position: relative; } .timeline input[type=range] { -webkit-appearance: none; appearance: none; width: 100%; height: 22px; background: transparent; cursor: pointer; margin: 0; display: block; } .track { position: absolute; left: 0; right: 0; top: 50%; height: 6px; transform: translateY(-50%); border-radius: 999px; background: rgba(255,255,255,.12); pointer-events: none; overflow: hidden; } .track .fill { position: absolute; left: 0; top: 0; bottom: 0; width: 0%; background: linear-gradient(90deg, var(--home), color-mix(in srgb, var(--home) 40%, var(--away))); border-radius: 999px; } .markers { position: absolute; left: 0; right: 0; top: 50%; height: 0; pointer-events: none; } .markers .m { position: absolute; top: 0; width: 3px; height: 14px; transform: translate(-50%,-50%); border-radius: 2px; box-shadow: 0 0 6px currentColor; } .timeline input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; border-radius: 50%; background: #fff; border: 3px solid #0b1220; box-shadow: 0 2px 8px rgba(0,0,0,.5); margin-top: 0; position: relative; z-index: 3; } .timeline input[type=range]::-moz-range-thumb { width: 16px; height: 16px; border-radius: 50%; background: #fff; border: 3px solid #0b1220; box-shadow: 0 2px 8px rgba(0,0,0,.5); } .timeline input[type=range]::-moz-range-track { background: transparent; } .kbd-hint { font-size: 11px; color: var(--ink-faint); letter-spacing: .02em; } .kbd-hint kbd { font-family: var(--disp); font-size: 10px; padding: 1px 5px; border-radius: 5px; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.12); } /* ---------- Panel de estadísticas del partido ---------- */ .statspanel { background: var(--panel); border: 1px solid var(--panel-brd); border-radius: var(--r); box-shadow: var(--shadow); padding: 16px 20px 20px; } .statspanel h2 { margin: 0 0 14px; font-family: var(--disp); font-size: 14px; font-weight: 700; letter-spacing: .18em; text-transform: uppercase; color: var(--ink-dim); display: flex; align-items: center; gap: 9px; } .statspanel h2 .spark { width: 7px; height: 7px; border-radius: 50%; background: linear-gradient(var(--home), var(--away)); box-shadow: 0 0 10px var(--home); } .statrows { display: flex; flex-direction: column; gap: 12px; } .statrow { display: grid; grid-template-columns: 62px 1fr 62px; align-items: center; column-gap: 12px; row-gap: 4px; } .statrow .lbl { grid-column: 1 / -1; text-align: center; font-family: var(--disp); font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--ink-faint); } .statrow .vh, .statrow .va { font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; font-weight: 700; font-size: 15px; } .statrow .vh { text-align: right; color: color-mix(in srgb, var(--home) 78%, white); } .statrow .va { text-align: left; color: color-mix(in srgb, var(--away) 78%, white); } .statrow .bars { display: flex; align-items: center; height: 9px; gap: 3px; } .statrow .bars .bh, .statrow .bars .ba { height: 100%; min-width: 2px; transition: width .7s cubic-bezier(.2,.8,.3,1); } .statrow .bars .bh { margin-left: auto; background: var(--home); border-radius: 999px 0 0 999px; } .statrow .bars .ba { margin-right: auto; background: var(--away); border-radius: 0 999px 999px 0; } /* ---------- Responsive ---------- */ @media (max-width: 860px) { .main { grid-template-columns: 1fr; } #feed { max-height: 240px; } .team { padding: 12px 16px; gap: 10px; } } @media (prefers-reduced-motion: reduce) { * { animation-duration: .001ms !important; scroll-behavior: auto !important; } }