init
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
# Two-Stands Transfers — Broadcast Graphics Template
|
||||
|
||||
Soccer player transfer broadcast graphics — **transparent overlay** for **1920×1080** frames.
|
||||
|
||||
## Specifications
|
||||
|
||||
| Property | State 1 (Reveal) | State 2 (Compact) |
|
||||
|-------------------|------------------|------------------------|
|
||||
| Frame | 1920×1080 px (transparent) | 1920×1080 px (transparent) |
|
||||
| Graphics area | 1920×758 px | 641×758 px (centered) |
|
||||
| Duration | 5 seconds | holds until next |
|
||||
| Player photo | 641×758 PNG (1:1) | 230px crop from 641-wide source |
|
||||
|
||||
## Layout — State 1 (0–5 s)
|
||||
|
||||
Full-width 1920×758 bar:
|
||||
|
||||
```
|
||||
┌─────────────────── 1920×758 ──────────────────────────────┐
|
||||
│ │
|
||||
│ ┌──────────┐ ПЕРЕХОД │
|
||||
│ │ │ │
|
||||
│ │ PLAYER │ PLAYER NAME │
|
||||
│ │ PHOTO │ │
|
||||
│ │ │ │
|
||||
│ │ 641px │ [MLS] ЧЕЛСИ ┌──────────┐ │
|
||||
│ │ (1:1) │ │ 138 млн │ │
|
||||
│ │ │ └──────────┘ │
|
||||
│ └──────────┘ │
|
||||
└──────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Layout — State 2 (after 5 s)
|
||||
|
||||
Shrinks to centered 641×758:
|
||||
|
||||
```
|
||||
┌──────── 641×758 ────────┐
|
||||
│ │
|
||||
│ ┌────────┐ ПЕРЕХОД │
|
||||
│ │ PHOTO │ PLAYER NAME │
|
||||
│ │ 230px │ │
|
||||
│ │ │ ЧЕЛСИ │
|
||||
│ │ │ ┌────────┐ │
|
||||
│ └────────┘ │ 138 млн│ │
|
||||
│ └────────┘ │
|
||||
└─────────────────────────┘
|
||||
```
|
||||
|
||||
## Data — `data/transfers.json`
|
||||
|
||||
Generated from `assets/transfers-list.csv`. Each transfer object:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"playerName": "Морган Роджерс",
|
||||
"photo": "assets/players/player_01.png",
|
||||
"team": {
|
||||
"name": "Челси",
|
||||
"logo": "assets/teams/chelsea.svg",
|
||||
"color": "#034694",
|
||||
"accent": "#FFFFFF"
|
||||
},
|
||||
"price": "138 млн",
|
||||
"isFreeAgent": false
|
||||
}
|
||||
```
|
||||
|
||||
For free agents (`isFreeAgent: true`), the price badge turns green and the
|
||||
label shows "Статус" instead of "Сумма".
|
||||
|
||||
### Data source — `assets/transfers-list.csv`
|
||||
|
||||
```
|
||||
Player, Club, Sum
|
||||
Морган Роджерс, Челси, 138 млн
|
||||
Энтони Гордон, Барселона, 80 млн
|
||||
Ибрагим Конате, Реал, Свободный агент
|
||||
```
|
||||
|
||||
Edit the CSV, then re-run the generator to rebuild `transfers.json`
|
||||
and regenerate placeholder PNGs + team crests.
|
||||
|
||||
## Usage
|
||||
|
||||
### 1. Run a local server (needed for fetch)
|
||||
|
||||
```bash
|
||||
python3 -m http.server 8000
|
||||
```
|
||||
|
||||
### 2. Open in browser
|
||||
|
||||
```
|
||||
http://localhost:8000
|
||||
```
|
||||
|
||||
### 3. Controls
|
||||
|
||||
| Key | Action |
|
||||
|----------------|---------------------------|
|
||||
| → / Enter | Next transfer |
|
||||
| ← / Backspace | Previous transfer |
|
||||
| R | Replay current |
|
||||
| H | Hide / Show |
|
||||
| A | Toggle autoplay (8s loop) |
|
||||
|
||||
### External API (CasparCG / OBS)
|
||||
|
||||
```javascript
|
||||
window.transferGraphics.showAt(0); // show transfer #1 (starts State 1)
|
||||
window.transferGraphics.next(); // next transfer
|
||||
window.transferGraphics.prev(); // previous transfer
|
||||
window.transferGraphics.replay(); // replay current
|
||||
window.transferGraphics.hide(); // hide graphics
|
||||
window.transferGraphics.show(); // show graphics
|
||||
window.transferGraphics.autoplay(); // toggle autoplay
|
||||
```
|
||||
|
||||
## Generating Placeholder Assets
|
||||
|
||||
```bash
|
||||
python3 generate_placeholders.py
|
||||
```
|
||||
|
||||
This reads `assets/transfers-list.csv` and generates:
|
||||
- `assets/teams/*.svg` — team crest placeholders (colored shields)
|
||||
- `assets/players/player_*.png` — player PNG placeholders at **641×758**
|
||||
- `data/transfers.json` — the transfer data file
|
||||
|
||||
**Replace** the placeholder PNGs with real 641×758 player cutouts — just
|
||||
drop your files into `assets/players/` with the same names (`player_01.png`,
|
||||
`player_02.png`, …). No scaling needed — the source image is displayed 1:1
|
||||
in State 1, and CSS `object-fit: cover` crops it for the compact State 2.
|
||||
|
||||
## Timing
|
||||
|
||||
```
|
||||
0.0 s Card enters (slide + fade)
|
||||
0.15s Photo scales in
|
||||
0.35s "ПЕРЕХОД" label slides down
|
||||
0.55s Player name slides in
|
||||
1.0 s Team block appears
|
||||
1.35s Price badge pops in (bounce)
|
||||
5.0 s Container shrinks 1920 → 641 (0.85 s smooth transition)
|
||||
5.85s+ Compact state holds
|
||||
```
|
||||
Reference in New Issue
Block a user