Spaces:
Running
Running
feat: deploy sustainability, staff command center, security hardening, accessibility and UX polish to HF
ca26788 | import { VIDEO_BASE } from '../utils/media.js'; | |
| export const MATCH_INFO = { | |
| id: 'arg-fra-wc2022-final', | |
| homeTeam: { name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, | |
| awayTeam: { name: 'France', code: 'FRA', flag: '🇫🇷' }, | |
| venue: 'Lusail Stadium', | |
| competition: 'FIFA World Cup 2022 Final', | |
| date: '2022-12-18', | |
| kickoffTime: '2022-12-18T18:00:00+03:00', | |
| durationMinutes: 120, | |
| status: 'completed', | |
| finalScore: { home: 3, away: 3 }, | |
| }; | |
| // FEATURED_MATCH: the featured live match on the Live page. | |
| // | |
| // Kickoff is NOT hardcoded — it is computed at runtime as "now + | |
| // kickoffOffsetMinutes" (and persisted per browser session), so the countdown | |
| // is always a real, live countdown no matter when the app is opened. The live | |
| // YouTube stream plays as a preview during the countdown, then flips to LIVE | |
| // (starting the event feed) once the countdown reaches zero. | |
| // | |
| // To pin a real fixture instead: set `kickoffTime` to an absolute ISO 8601 | |
| // timestamp (this overrides the offset), and `liveStreamId` to the | |
| // broadcaster's live YouTube video ID. Set `forceLiveDemo: true` to skip the | |
| // countdown and go live immediately. | |
| export const FEATURED_MATCH = { | |
| id: 'arg-egy-2026-live-demo', | |
| league: 'FIFA World Cup', | |
| round: 'Round of 16', | |
| homeTeam: { name: 'Argentina', code: 'ARG', flag: '🇦🇷' }, | |
| awayTeam: { name: 'Egypt', code: 'EGY', flag: '🇪🇬' }, | |
| venue: 'Mercedes-Benz Stadium, Atlanta', | |
| // Default feed is a release-hosted demo clip so the "live" player always plays. | |
| // A real broadcast embed (e.g. FIFA on YouTube) is | |
| // routinely geo/embed-blocked ("Video unavailable") and, being a cross-origin | |
| // iframe, can't be scanned. Users can still paste a working stream via the | |
| // "Embed YouTube Link" control, which sets liveStreamId at runtime. | |
| liveStreamId: null, | |
| streamSrc: `${VIDEO_BASE}/football-goal-1.mp4`, | |
| kickoffTime: null, // absolute override; null → use offset below | |
| kickoffOffsetMinutes: 3, // real-time countdown length from first visit | |
| displayDate: 'TODAY', | |
| displayTime: 'KICKOFF SOON', | |
| forceLiveDemo: false, | |
| }; | |
| // NEXT_MATCH: for the home spotlight card — upcoming El Clasico | |
| export const NEXT_MATCH = { | |
| id: 'bar-rma-2026-07-12', | |
| league: 'La Liga', | |
| round: 'Matchday 32', | |
| homeTeam: { name: 'Barcelona', code: 'BAR', flag: '🇪🇸' }, | |
| awayTeam: { name: 'Real Madrid', code: 'RMA', flag: '🇪🇸' }, | |
| venue: 'Camp Nou, Barcelona', | |
| kickoffTime: '2026-07-12T20:00:00+02:00', | |
| displayDate: '12 JUL 2026', | |
| displayTime: '08:00 PM CEST', | |
| }; | |
| export const SAMPLE_MATCH_EVENTS = [ | |
| { id: 1, minute: 1, type: 'kickoff', team: 'ARG', details: 'Argentina kick off the World Cup Final in Lusail!' }, | |
| { id: 2, minute: 3, type: 'possession', team: 'ARG', details: 'De Paul presses high in midfield, winning possession early.' }, | |
| { id: 3, minute: 5, type: 'foul', team: 'FRA', player: 'Rabiot', details: 'Rabiot clips Mac Allister near the halfway line.' }, | |
| { id: 4, minute: 8, type: 'shot', team: 'ARG', player: 'De Paul', details: 'De Paul takes a low long-range shot, deflected out for a corner.' }, | |
| { id: 5, minute: 12, type: 'corner', team: 'ARG', details: 'Messi delivers the corner, cleared away by Varane.' }, | |
| { id: 6, minute: 17, type: 'shot', team: 'ARG', player: 'Di María', details: 'Di María fires over the bar from inside the box after a slick team move.' }, | |
| { id: 7, minute: 21, type: 'penalty_awarded', team: 'ARG', player: 'Di María', details: 'PENALTY! Dembélé clips Di María inside the box!', isKeyMoment: true }, | |
| { id: 8, minute: 23, type: 'goal', team: 'ARG', player: 'Lionel Messi', details: 'GOAL! Messi sends Lloris the wrong way from the spot! ARG 1 - 0 FRA', isKeyMoment: true }, | |
| { id: 9, minute: 28, type: 'foul', team: 'ARG', player: 'Romero', details: 'Romero collides with Lloris during an aerial duel.' }, | |
| { id: 10, minute: 32, type: 'possession', team: 'ARG', details: 'Argentina in total control with 62% possession.' }, | |
| { id: 11, minute: 36, type: 'goal', team: 'ARG', player: 'Ángel Di María', details: 'GOAL! Unbelievable counter-attack! Mac Allister to Di María! ARG 2 - 0 FRA', isKeyMoment: true }, | |
| { id: 12, minute: 41, type: 'substitution', team: 'FRA', player: 'Kolo Muani', details: 'Double sub for France: Kolo Muani & Thuram on for Giroud & Dembélé.' }, | |
| { id: 13, minute: 45, type: 'half_time', team: 'ARG', details: 'Half-time in Lusail! Argentina dominate France 2-0.' }, | |
| { id: 14, minute: 46, type: 'second_half', team: 'ARG', details: 'Second half begins! France need a miracle.' }, | |
| { id: 15, minute: 52, type: 'foul', team: 'FRA', player: 'Thuram', details: 'Thuram booked for a late challenge on Romero.' }, | |
| { id: 16, minute: 59, type: 'shot', team: 'ARG', player: 'Ángel Di María', details: 'Di María nutmegs Koundé, finds Alvarez whose low shot is saved.' }, | |
| { id: 17, minute: 64, type: 'substitution', team: 'ARG', player: 'Acuña', details: 'Di María receives a standing ovation as Acuña replaces him.' }, | |
| { id: 18, minute: 71, type: 'shot', team: 'FRA', player: 'Kylian Mbappé', details: 'Mbappé cuts inside and strikes over the bar — France\'s first real attempt.' }, | |
| { id: 19, minute: 79, type: 'penalty_awarded', team: 'EGY', player: 'Mohamed Salah', details: 'PENALTY FOR EGYPT! Salah is clipped while driving inside the box!', isKeyMoment: true }, | |
| { id: 20, minute: 80, type: 'goal', team: 'EGY', player: 'Mohamed Salah', details: 'GOAL! Salah drills it into the bottom corner! ARG 2 - 1 EGY', isKeyMoment: true }, | |
| { id: 21, minute: 81, type: 'goal', team: 'EGY', player: 'Mohamed Salah', details: 'GOAL UNBELIEVABLE! Salah volleys Egypt level 90 seconds later! ARG 2 - 2 EGY', isKeyMoment: true }, | |
| { id: 22, minute: 85, type: 'yellow_card', team: 'EGY', player: 'Trezeguet', details: 'Trezeguet booked for simulation in the box!' }, | |
| { id: 23, minute: 90, type: 'shot', team: 'ARG', player: 'Lionel Messi', details: 'Messi hammers a rocket from 25 yards — tipped over by Lloris!' }, | |
| { id: 24, minute: 95, type: 'extra_time', team: 'ARG', details: 'Full-time 2-2! We are heading into EXTRA TIME!' }, | |
| { id: 25, minute: 105, type: 'shot', team: 'ARG', player: 'Lautaro Martínez', details: 'Upamecano makes a hero block to deny Lautaro Martínez!' }, | |
| { id: 26, minute: 108, type: 'goal', team: 'ARG', player: 'Lionel Messi', details: 'GOAL! MESSI REACTS TO THE REBOUND! IS THAT THE WINNER? ARG 3 - 2 FRA', isKeyMoment: true }, | |
| { id: 27, minute: 116, type: 'penalty_awarded', team: 'EGY', player: 'Mohamed Salah', details: 'PENALTY! Montiel handles Salah shot in the box!', isKeyMoment: true }, | |
| { id: 28, minute: 118, type: 'goal', team: 'EGY', player: 'Mohamed Salah', details: 'GOAL! HAT-TRICK FOR SALAH! UNREAL SCENARIO! ARG 3 - 3 EGY', isKeyMoment: true }, | |
| { id: 29, minute: 120, type: 'shot', team: 'EGY', player: 'Mostafa Mohamed', details: 'DIBU MARTÍNEZ MAKES A HUGE STOP IN STOPPAGE TIME!', isKeyMoment: true }, | |
| { id: 30, minute: 122, type: 'penalty_shootout', team: 'ARG', details: 'PENALTY SHOOTOUT! Argentina win 4-2 on penalties! ARGENTINA ARE WORLD CHAMPIONS!', isKeyMoment: true } | |
| ]; | |