# apps – aplikacje do nauki dla dziecka

Statyczne aplikacje (jeden `index.html` na aplikację) hostowane na OVH pod https://apps.michalhans.pl/.
Każdy push do `main` wdraża się automatycznie (integracja Git w OVH + webhook GitHuba).

| Folder | Aplikacja | Klucz zapisu postępów |
|---|---|---|
| `liczydlo/` | Liczydło – szybkie liczenie | `liczydlo.v1` |
| `parki-narodowe/` | Parki Narodowe – logo i położenie parków | `parki.v1` |
| `common/store.js` | wspólny zapis postępów (AppStore) | – |

## Postępy dziecka muszą przetrwać każde wdrożenie

Postępy są w `localStorage` przeglądarki na telefonie dziecka. Wdrożenie ich nie kasuje, ale zła zmiana w kodzie może je zgubić. Zasady:

1. **Nigdy nie zmieniaj klucza zapisu** (`STORE` w aplikacji). Sufiks `.v1` to historyczna nazwa, nie wersja danych.
2. **Nie zmieniaj identyfikatorów**, które są kluczami w zapisie: id parków (np. `tatrzanski`), klucze działań (np. `7x8`, `3+5`, `4|7`), id odznak, nazwy trybów (`digits`, `add100`, `sub100`, `mult`, `div`, `divr`), klucze odejmowania (np. `2|8` w `sub100`), dzielenia (np. `56/7` w `div`) i dzielenia z resztą (`dzielnik:wynik`, np. `5:4` w `divr`). Pole `skipped` w Liczydle zapisuje przeskoczone etapy (`{tryb: numer_etapu}`); numeracji etapów w `STAGES` nie zmieniaj, najwyżej dopisuj nowe na końcu. W Parkach pole `unlocked` (`{id_parku: liczba}`) zapisuje odblokowane ciekawostki; kolejność 3 ciekawostek w `FACTS` to kolejność odblokowania, więc poprawiaj ich treść, ale nie przestawiaj kolejności.
3. **Nowe pole** = dopisz je w `fresh()` aplikacji. AppStore sam uzupełni je w starych zapisach.
4. **Zmiana kształtu danych** (zmiana nazwy pola, przeniesienie, nowy format) = podbij `version` w `AppStore.create(...)` i dopisz migrację `migrations: {2: d => { ...; return d; }}`. Migracje działają po kolei od wersji zapisanej do bieżącej; przed migracją AppStore robi kopię `<klucz>.backup`.
5. Nie usuwaj danych w migracji, jeśli nie trzeba – AppStore zachowuje nieznane pola, żeby cofnięcie wersji aplikacji nic nie kasowało.
6. Każda aplikacja ładuje `<script src="../common/store.js">` przed własnym skryptem. Zmiana w `common/store.js` dotyczy wszystkich aplikacji.
7. Po zmianach uruchom testy zapisu: `node tests/store.test.js`. Przy zmianie danych dopisz test migracji ze starym zapisem.

## Kopia postępów

Na ekranie postępów każdej aplikacji jest sekcja „Kopia postępów”: zapis do pliku JSON, kod do skopiowania i wczytanie kopii (z kopią zapasową obecnych danych). Aplikacje mają manifest i ikony, żeby dało się je dodać do ekranu głównego (na iOS chroni to dane przed czyszczeniem przez Safari).

## Styl

Wygląd w stylu ROIROI: tło #FCFCF7, zielony #58974B, pomarańczowy #F44921 tylko do wyróżnień, Source Serif 4 + Inter, ikony Lucide. Teksty proste, dla 9-latka, neutralne płciowo.
