# Sport tracker

Interaktivní sportovní plakát z GPS aktivity jako digitální dvojče. Katalogová
stránka je `/experiments/sport-tracker/`, hotové varianty
`/experiments/sport-tracker/ukazky/`. Zpracování běží jen v prohlížeči.

## Stav

**PoC ve vývoji, snapshot `2026-09-20-twin`.** Jeden SVG plakát pro studio,
sdílený digitál i tisk. 13 reálných českých tratí, 12 šablon, 9 formátů,
GPX/TCX import, až 4 fotky, volitelná mapa, PNG 300 dpi, PDF, odkaz a embed.

## Účel

Ověřit, že jde bez backendu složit z aktivity plakát v profesionální kvalitě,
sdílet ho jako interaktivní stránku a vytisknout stejný dokument. Digitál a
tisk **musí** vznikat z jednoho zdroje.

## Rychlý start

```bash
npm install
npm run dev
```

Otevřete `/experiments/sport-tracker/`. Studio načte trať Karlštejn okruh.
Přetáhněte GPX/TCX nebo fotky kamkoli na studio.

```bash
node --test experiments/sport-tracker/tests/*.test.mjs
```

Obnovení tratí z routovacích služeb (vědomý krok, build ho nespouští):

```bash
node experiments/sport-tracker/scripts/build-routes.mjs [id ...]
```

## Rozhraní

| Prvek | Chování |
| --- | --- |
| Šablona | Linie, Noc, Vrstevnice, Reliéf, Fotka, Galerie, Číslo, Telemetrie, Klín, Osa, Pečeť, Soutisk; miniatury jsou živý render aktuální aktivity, tři na řádek |
| Aktivita | 13 presetů z `routes/*.json`; GPX/TCX nahradí preset, čas a splity bere z časových značek |
| Formát | A4, A3, A2, 30×40, 50×70, 70×100 cm; digitál 1:1, 4:5, 9:16 |
| Vrstvy | výškový profil, splity, kilometrové značky, mapový podklad |
| Barva | akcenty šablony nebo vlastní hex |
| Fotky | výchozí sada presetu (2–3 z Commons) nebo vlastní až 4; každá šablona je zpracuje po svém; vlastní zůstávají jen v paměti stránky |
| Texty | název, podtitul, atlet přepisují aktivitu |
| Srovnání a přehrání | myš nad trasou nebo profilem ukáže km, výšku a čas; mezerník přehraje trasu |
| Klávesy | ← → přepínají šablonu |
| PNG | 300 dpi, delší hrana nejvýše 10 000 px (70×100 cm je 200 dpi), fonty a mapa vložené |
| Tisk / PDF | okno s `@page` ve velikosti formátu, Uložit jako PDF dává vektor |
| SVG | samostatný soubor s vloženými fonty |
| Odkaz | hash nese aktivitu, šablonu, formát, vrstvy, barvu, texty; vlastní trasu jako polyline do 240 bodů s výškopisem |
| Embed | `<iframe>` na `/embed/`, klik přehraje trasu |
| Paměť | poslední stav v `localStorage` klíč `sport-tracker:v2` |

Fotka ani GPX **nesmí** opustit prohlížeč. Sdílený odkaz **nesmí** obsahovat
fotku. Cloudflare Pages build **nesmí** volat síť; tratě, fonty i ukázky jsou
v repozitáři. Mapa je jediná síťová závislost za běhu a zapíná se ručně.

## Fotky

Každý preset má 2 až 3 fotky skutečného místa z Wikimedia Commons
(`photos/<id>-<n>.jpg`, 1600 px, credit v `photos/manifest.json` a
`photos/NOTICE.md`). Studio je načte jako výchozí sadu, plakát tiskne credit
v patičce. Vlastní fotky se nahrávají dropzónou v pravém sloupci nebo
přetažením na plakát, nahradí sadu presetu a tlačítko Fotky tratě ji vrátí.
Sdílený odkaz nese jen počet fotek presetu (`i=`), vlastní fotky nikam nejdou.

```bash
node experiments/sport-tracker/scripts/find-photos.mjs [preset]   # kandidáti na Commons
node experiments/sport-tracker/scripts/fetch-photos.mjs [preset]  # stažení podle photo-sources.mjs
```

## Designový systém

Mřížka: vnější okraj 6,4 % šířky, 12 sloupců, mezera 2,4 %. Typografická
škála pro display 150 / 120 / 96 / 68 / 40, text 16, mono popisky 10,5
s prostrkáním 0,18 em, tiráž 8,5. Titul se zalamuje vyváženě na nejvýše dva
řádky bez osamoceného slova a zmenšuje se, dokud nejdelší řádek nesedí.
Bloky se skládají měřenou výškou od spodního okraje, takže žádný formát od
1:1 po 9:16 nepřekrývá.

Pravidla:

- Jeden hlavní motiv. Bez fotky vede trasa, profil nebo číslo. S fotkou vede
  fotoblok s tvrdou hranou na mřížce a trasa je „podpis“ ve 2 až 3 sloupcích.
- Data nejsou dashboard. Buď jeden prostrkaný mono řádek
  (`67,6 KM · 2:43:49 · 514 M · 24,7 KM/H`), nebo svislý sloupec hodnot,
  nebo vlasová tabulka (Vrstevnice). Hero číslo má jen šablona Číslo.
- Trasa bez UI: start plný bod, cíl prázdný kroužek, žádné bílé obruby;
  kilometrové značky jen ve Vrstevnicích.
- Výškový profil jako vlasová linka, v Reliéfu jako plochá silueta v barvě
  akcentu.
- Tiráž (atlet · zařízení, datum) v mikropísmu na spodním okraji, credit fotky
  svisle na pravé hraně jako v časopise. Poznámka o modelovaném čase je jen
  v rozhraní, ne na plakátu.
- Akcent: paleta šablony, vlastní hex, nebo „Z fotky“: dominantní sytý odstín
  hlavní fotky (`photo-color.mjs`), upravený na kontrast ≥ 2,2 vůči papíru.

Fotky: ohnisko ořezu (klik do náhledu) drží zvolený bod ve výřezu; ★ přesune
fotku na první místo. Pořadí, počet a ohniska fotek presetu jdou do odkazu
(`o=`, `i=`, `fp=`), vlastní fotky zůstávají v paměti stránky.

## Fotky podle šablony

| Šablona | Fotka |
| --- | --- |
| Linie | fotoblok 8 sloupců v horní části, trasa jako podpis vpravo, profil vlasovou linkou |
| Noc | ztmavený fotoblok 8 sloupců, stopa svítí vedle, data ve sloupci |
| Vrstevnice | bez fotky |
| Reliéf | fotka v horní části nad plochou siluetou profilu, země v barvě akcentu |
| Fotka | celá plocha jako obálka, titul do tří řádků, data ve sloupci |
| Galerie | 1 až 4 fotky na tvrdé mřížce, bez přechodů |
| Číslo | fotoblok pod velkým číslem, když je místo |
| Telemetrie | černobílý proužek s kontrastem 1,9 jako tisk z termotiskárny |
| Klín | pravoúhlá fotka nad diagonálním barevným polem, světlý nebo tmavý podpis trasy podle kontrastu |
| Osa | vysoký fotoblok vedle titulku otočeného o 90°, podpis trasy a profil pod fotkou |
| Pečeť | izolovaná fotka na osmi sloupcích, malá kruhová pečeť trasy pod výřezem |
| Soutisk | duotónová fotka a menší dvoubarevný soutisk profilu pod ní |

Konceptový list `docs/concepts.md` v repozitáři obsahuje osm návrhů,
výběr čtyř kompozic, chování podle formátu a odkazy na kontrolní výstupy.

## Data tratí

`routes/<id>.json` má `points: [[lon, lat, ele], …]`, nejvýše 420 bodů po
RDP zjednodušení. Silniční a cyklo tratě jsou z OSRM demo serveru, horské
z BRouter `hiking-mountain`, vodní jsou ruční waypointy. Výškopis EU-DEM 25 m
z Open Topo Data. Atribuce je v `routes/manifest.json`. Čas presetů je
modelovaný z profilu (Tobler pro chůzi, sklonový model pro kolo); tuto
informaci uvádí rozhraní studia, nikoli plakát.

## Výstupy

- studio `/experiments/sport-tracker/`,
- digitál `/experiments/sport-tracker/share/#…`,
- embed `/experiments/sport-tracker/embed/#…`,
- ukázky `/experiments/sport-tracker/ukazky/` (26 plakátů vykreslených při buildu, 17 s fotkami; čtyři PNG exporty ve 150 dpi),
- PNG, PDF, SVG,
- jádro v `src/` bez Astro: `track`, `gpx`, `polyline`, `state`, `poster-svg`, `twin`.

## Testy

Node testy pokrývají geometrii (haversine, Mercator, RDP, výškový zisk,
splity, modelovaný čas), GPX/TCX parser, polyline a hash round-trip, render
všech šablon ve třech formátech, čtyř kompozic Klín/Osa/Pečeť/Soutisk ve
všech devíti formátech s fotkou i bez, vrstvy, kontrast, fotky podle šablony, fixture tratí
včetně dosažení vrcholu Sněžky a render ukázek. WebGL mapa a canvas export se
v Node nespouští.

## Licence

Kód MIT. Fonty Barlow Condensed, Inter a JetBrains Mono SIL OFL 1.1
(`fonts/NOTICE.md`). Fotky presetů CC0, CC BY, CC BY-SA a public domain
podle `photos/NOTICE.md`; plakát s fotkou CC BY-SA přebírá licenci fotky. Geometrie tratí © OpenStreetMap contributors, ODbL.
Výškopis EU-DEM v1.1 © European Union, Copernicus. Mapa OpenFreeMap,
OpenMapTiles, OpenStreetMap; plakát s mapou nese atribuci.

## Hranice

Mimo rozsah: Strava/Garmin API, FIT soubory, HEIC dekodér pro fotky, ořez a
posun fotky v okně, tepová
frekvence a výkon, objednávka tisku, serverové ukládání sdílených plakátů.
Sdílený odkaz s vlastní trasou má 240 bodů, ne celý záznam. Mapa v exportu
je rastr 2600 px na šířku boxu.
