# TROPO — Biblia Projektu

> Kompletny dokument referencyjny projektu TROPO — strony marketingowej i backendu gry mobilnej dla dzieci 6–9 lat.

**Wersja:** 2.0 · **Data:** 14.03.2026 · **Stack:** PHP 8.4 + Symfony 8.0 + Tailwind CSS v4

---

## 1. Czym jest TROPO

TROPO to aplikacja mobilna, w której dzieci (6–9 lat) wybierają jednego z czterech przewodników, otrzymują misję na smartfonie (≈3 min ekranu) i ruszają na przygodę w realnym świecie — w domu lub na zewnątrz (≈12 min zabawy). Telefon pełni rolę kompasu, nie celu.

Strona marketingowa (`tropo.city`) prezentuje grę, postacie, bajki (odcinki fabularne), cennik, manifest, blog i formularz zapisu na listę oczekujących. Panel administracyjny umożliwia zarządzanie misjami, blogiem, komentarzami, opiniami i użytkownikami. Backend udostępnia też API synchronizacji dla aplikacji mobilnej (PWA).

---

## 2. Świat Tropo

### 2.1 Miasteczko

Tropo — małe fikcyjne miasteczko, w którym każdy dzień jest przygodą. Nazwa „Tropo" to nazwa własna (jak miasto), nie akronim.

### 2.2 Kluczowe miejsca

| Miejsce | Opis | Rola fabularna |
|---------|------|----------------|
| **Wielki Dąb** | Najstarsze drzewo w parku. Pamięta wszystko, co wydarzyło się w Tropo. | Pod korzeniami: drewniane pudełko z kamieniami i zagadką. W dziupli: dzienniki Vedy. Miejsce Mocy (zielone). |
| **Stara Biblioteka** | Ceglany budynek pokryty bluszczem, zamknięty od lat. Pod nią podziemna baza Pierwszej Drużyny. | Camo mieszka tu na stałe. Miejsce Mocy (niebieskie). |
| **Stara Fontanna** | Kamienna fontanna na rynku, sucha i porośnięta mchem. Ukryta szuflada z mosiężnym kluczem. | Nova naprawia ją w Sezonie 1. Miejsce Mocy (fioletowe). |
| **Latarnia** | Na wzgórzu nad zatoką, ciemna od lat. 4 dźwignie w 4 rogach. | Blitz zapala ją w Sezonie 1. Miejsce Mocy (pomarańczowe). |
| **Jaskinia za Wodospadem** | „Serce Tropo" — najważniejsze miejsce. Strumień prowadzi do niej przez las. | Budzi się w finale sezonu, gdy drużyna pisze w starej księdze. |
| **Kamienny Most** | W centrum miasteczka. Pod nim zakopane bransoletki i stara mapa. | Pierwsze odkrycie drużyny w odcinku 1. |

### 2.3 Miejsca Mocy

Cztery Miejsca Mocy (Biblioteka, Latarnia, Fontanna, Wielki Dąb) muszą zostać ponownie przebudzone, by odblokować Serce Tropo (jaskinię). Sezon 1 kończy ten łuk fabularny.

### 2.4 Symbol czterech splecionych kół

Wynaleziony przez Camo po rozpadzie Pierwszej Drużyny — przypomnienie, by nigdy nie porzucać swoich ludzi. Pojawia się na: drewnianym pudełku pod dębem, starej mapie, fontannie, ścianie biblioteki (świeża kreda), w podziemnej bazie.

---

## 3. Postacie

### 3.1 Grywalne postacie

| # | Imię | Gatunek | Kolor | Emoji | Motto |
|---|------|---------|-------|-------|-------|
| 1 | **Scout** | Pies Tropiciel | `#3578E5` (niebieski) | 🐕 | „Każdy ślad opowiada historię." |
| 2 | **Blitz** | Królik Sprinter | `#E8612A` (pomarańczowy) | 🐇 | „Szybciej! Wyżej! Dalej!" |
| 3 | **Nova** | Szop Wynalazca | `#7C3AED` (fioletowy) | 🦝 | „A co jeśli spróbujemy TEGO?" |
| 4 | **Echo** | Żółw Mędrzec | `#16A34A` (zielony) | 🐢 | „Każde słowo ma swoją historię." |

**Scout** — Spokojny, analityczny, cierpliwy. Fenomenalny węch i oko do detali. Jak najlepszy przyjaciel, który zawsze słucha. Nigdy nie podaje odpowiedzi — pomaga ją znaleźć. Rozpoznaje 300 zapachów; ulubiony: mokra trawa po deszczu.
- Umiejętności: Zagadki tekstowe · Szukanie i obserwacja · Rebusy i łamigłówki
- Misje: Dochodzenia detektywistyczne — szukanie symboli, łączenie tropów, rozwiązywanie zagadek
- Magiczny przedmiot: Lupa — po próbie świeci niebieskim światłem i ujawnia ukryty tekst na powierzchniach
- Wygląd: Golden retriever, ZŁOTO-BRĄZOWE futro (NIE niebieskie), jasnoniebieski kamizelka, niebieska bandana z łapkami, brązowe buty, lupa

**Blitz** — Hiperaktywny, entuzjastyczny, głośny. Mówi CAPS-em, nie stoi w miejscu. Jak trener, który wierzy w Ciebie bardziej niż Ty sam. Odkrył, że szybkość to nie wszystko. Buty z błyskawicą dają mu +10 do prędkości (jego zdaniem). Przebiegł całe osiedle w 47 sekund — nikt nie zdążył zmierzyć.
- Umiejętności: Wyzwania ruchowe · Szukanie na czas · Tory przeszkód
- Misje: Sprinty, skoki, tory przeszkód, rzuty. Krzyczy „BIEGNIJ!" i liczy do 15
- Magiczny przedmiot: Buty z błyskawicą — po próbie pozwalają skakać wyżej i biegać szybciej, złote błyskawice na butach
- Wygląd: Królik, biało-pomarańczowe futro, POMARAŃCZOWA OPASKA, pomarańczowy T-shirt z ŻÓŁTĄ BŁYSKAWICĄ, niebiesko-pomarańczowe opaski na nadgarstki, buty z błyskawicami

**Nova** — Ciekawska, wynalazcza, entuzjastyczna. Nie widzi problemów — widzi rzeczy do naprawienia. Mówi szybko, myśli szybciej, oczy świecą jak latarki gdy coś odkryje. Rozkładała zegarki, latarki, radia. Ma pudełko „na wszelki wypadek". Zbudowała katapultę z łyżki — 4 metry, rekord do dziś.
- Umiejętności: Eksperymenty naukowe · Zadania matematyczne · Budowanie i tworzenie
- Misje: Budowanie i naprawianie — wieże z klocków, mosty z książek. Misje zaprojektowane dla dwóch lub grupy. Idealne dla rodzeństwa
- Magiczny przedmiot: Gogle — po próbie świecą fioletowo i ujawniają niewidzialny tekst/grawerunki na powierzchniach
- Wygląd: Szop, SZARE futro, steampunkowe GOGLE, FIOLETOWY fartuch laboratoryjny z plamami farby, brązowy PAS Z NARZĘDZIAMI, brązowe RĘKAWICE

**Echo** — Mądry, cierpliwy, ciepły. Mówi wolno i z namysłem. Każde zdanie niesie wagę. Jak dziadek, który zawsze ma czas na opowieść. Podróżuje po Tropo od tak dawna, że nikt nie pamięta kiedy zaczął. Wzory konstelacji na pancerzu zmieniają się z porami roku (zima: Orion, lato: Wielki Wóz). Prowadzi dziennik słów, przysłów i opowieści.
- Umiejętności: Zadania ortograficzne · Zagadki językowe · Opowiadanie historii
- Misje: Przygody ze słowami — szukanie liter, rymy, przysłowia, układanie zdań. Echo nie pogania — daje czas do namysłu
- Magiczny przedmiot: Pióro — po próbie świeci na zielono i rysuje na pancerzu żywą mapę Tropo ze wszystkimi Miejscami Mocy
- Wygląd: Żółw, oliwkowo-zielona skóra, pancerz z konstelacjami, ZIELONA KAMIZELKA Z KAPTUREM, kremowy SZALIK, zegarek-kompas na bransoletce, skórzany DZIENNIK

### 3.2 NPC — Camo (Kameleon)

Stary, zmęczony, mądry kameleon-mentor. Dawno przestał zmieniać kolory (skóra wciąż lekko zmienia odcień w różnym oświetleniu). Szaro-zielona skóra, za duży brązowy płaszcz z kapturem, zielony sweter, stare okrągłe okulary na czubku głowy. Wisiorek z symbolem czterech splecionych kół. Stara skórzana książka „DZIEJE TROPO". Mieszka w podziemnej piwnicy biblioteki, w otoczeniu książek i hamaka. Czeka tam od dekad na nową drużynę.

Cierpliwy, łagodny, melancholijny ale ciepły. Mówi rzadko, ale gdy mówi — to ważne. Jego milczenia mają takie samo znaczenie jak słowa.

**Historia Camo:** Członek Pierwszej Drużyny Tropo. Był tropicielem, tak jak Scout. Ale tak bardzo pochłonęło go podążanie za nowymi śladami, że zapominał wracać. Stopniowo Zip, potem Zumi, potem Veda przestali przychodzić. Drużyna się rozpadła. Camo został, pełen poczucia winy i samotny. Utrzymywał podziemną bazę, zostawiał symbol, i przygotował wszystko (pudełko, kamienie, bransoletki, wskazówki) dla przyszłej drużyny. Czekał sam „dłużej, niż żyjecie."

Kolor dialogów w bajkach: `#8B7355`
Pliki: `var/characters/camo/camo_full.png`, `camo_ikona.png`

### 3.3 Pierwsza Drużyna Tropo

Postacie historyczne, nieaktywne. Ich imiona odkrywane są w Sezonie 1:

| Rola | Imię | Gatunek | Kolor notesu |
|------|------|---------|-------------|
| Tropiciel | **Camo** | Kameleon (ten sam, teraz NPC) | Niebieski |
| Sprinter | **Zip** | Lis | Pomarańczowy |
| Wynalazczyni | **Zumi** | Wydra | Fioletowy |
| Strażnik Wiedzy | **Veda** | Sowa | Zielony |

Ich stary ekwipunek (widoczny na zdjęciu w podziemnej bazie) odzwierciedla magiczne przedmioty obecnej drużyny — ale potężniejsze. Camo miał większą lupę ze świecącym niebieskim szkłem; Zip miał buty z błyskawicami, które naprawdę iskrzyły; Zumi miała gogle z fioletowymi soczewkami; Veda miała pióro, które samo świeciło.

### 3.4 Magiczne przedmioty i artefakty

**Bransoletki przyjaźni:** Niebieska, pomarańczowa, fioletowa, zielona. Dane czwórce w drewnianym pudełku pod dębem. Gdy ktoś z drużyny potrzebuje pomocy, bransoletki pozostałych świecą — tym jaśniej, im bliżej. „Jak latarnia — ale do przyjaciół."

**Kolorowe kamyki:** Cztery kamienie — niebieski, pomarańczowy, fioletowy, zielony. Znalezione w pudełku z bransoletkami. Każdy czeka na próbę swojej postaci. Po zdaniu próby kamień robi się ciepły, unosi się i łączy z magicznym przedmiotem postaci.

| Postać | Przedmiot | Efekt po przebudzeniu |
|--------|-----------|----------------------|
| Scout | Lupa | Świeci na niebiesko, ujawnia ukryty tekst/symbole |
| Blitz | Buty z błyskawicą | Skoki wyżej, bieg szybszy; złote błyskawice na butach |
| Nova | Gogle | Świecą fioletowo, ujawniają niewidziane grawerunki/tekst |
| Echo | Pióro | Świeci na zielono, rysuje żywą mapę Tropo na pancerzu |

---

## 4. Bajki — Sezon 1 (7 odcinków)

Format: „bajka na dobranoc" — proza literacka, ciepła, lekko magiczna. Dialogi w kolorach postaci, prosty ale emocjonalny styl. Każdy odcinek kończy się „Misją dla Ciebie" — prawdziwą aktywnością w świecie realnym.

| # | Slug | Tytuł | Postać | Czas |
|---|------|-------|--------|------|
| 1 | `tajemnica-znikajacych-sladow` | Tajemnica Znikających Śladów | Scout | 8 min |
| 2 | `tajemnica-trzech-palcow` | Tajemnica Trzech Palców | Scout | 12 min |
| 3 | `straznik-tropow` | Strażnik Tropów | Scout | 10 min |
| 4 | `swiatlo-latarni` | Światło Latarni | Blitz | 10 min |
| 5 | `zepsuta-fontanna` | Zepsuta Fontanna | Nova | 10 min |
| 6 | `glos-wielkiego-debu` | Głos Wielkiego Dębu | Echo | 10 min |
| 7 | `serce-tropo` | Serce Tropo | Scout | 10 min |

### Szczegółowe streszczenia

**1. Tajemnica Znikających Śladów** — Scout znajduje tajemnicze trójpalczaste ślady przed swoim domem. Śledzi je do parku, gdzie spotyka Blitza i Echo — wszyscy mieli te same ślady. Nova przychodzi z lampą UV i odkrywa, że ślady świecą niewidzialnie. Pod Wielkim Dębem znajdują drewniane pudełko z symbolem czterech kół, czterema kolorowymi kamieniami, zagadką i czterema bransoletkami przyjaźni. Zagadka prowadzi ich do zachodu słońca, gdy cień dębu wskazuje stary kamienny most. Pod mostem: skórzane opakowanie z bransoletkami i starą mapą z napisem: „Ci, którzy szukają razem, zawsze znajdą więcej niż ci, którzy szukają sami. — Pierwsza Drużyna Tropo." Lupa Scouta po raz pierwszy migocze.

> Misja: Znajdź największe drzewo w swoim miasteczku lub parku. Zmierz, ile osób potrzeba, żeby je objąć.

**2. Tajemnica Trzech Palców** — Scout nie może spać, studiuje mapę. Odkrywa symbol czterech kół w rogu — lupa migocze i ujawnia ukryty tekst: „Szukaj tam, gdzie kamienie mówią." Babcia mu opowiadała o fontannie, której kamienie „opowiadały historię Tropo." Scout znajduje tajny kamień na fontannie, naciska go, otwiera się szuflada z mosiężnym kluczem i karteczką: „Ten klucz otwiera drzwi, których nie widać. Szukaj tam, gdzie śpią książki." Drużyna odgaduje: stara biblioteka. Klucz otwiera ukrytą część ściany — schody w dół. Scout prawie wpada w szczelinę; bransoletki świecą i prowadzą resztę do niego. W piwnicy: zakurzony stół, cztery kolorowe notesy, tablica korkowa ze zdjęciami. Zdjęcie: cztery stare zwierzęta z magicznymi przedmiotami — Camo, Zip, Zumi, Veda. Świeża kreda z symbolem na ścianie. Idąc za zapachem, znajdują korytarz prowadzący do małego, przytulnego pokoju — i Camo siedzącego na dywaniku. „Czekałem na was."

> Misja: Czy wiesz, gdzie jest biblioteka w Twoim mieście? Byłeś tam kiedyś? Idź z kimś bliskim i zobacz, ile jest tam książek.

**3. Strażnik Tropów** — Spotkanie z Camo. To on zostawiał trójpalczaste ślady drewnianym stemplem — czekał na kogoś, kto podąży tropem dalej niż inni. Wyjaśnia bransoletki przyjaźni: gdy ktoś potrzebuje pomocy, bransoletki pozostałych świecą, jaśniej im bliżej. „Jak latarnia — ale do przyjaciół." Camo ujawnia Cztery Miejsca Mocy: biblioteka, latarnia, fontanna, wielki dąb. Trzeba je ponownie przebudzić. Ale najpierw każdy członek musi przejść próbę. Scout już swoją przeszedł: podążył za zapachem ciemnym korytarzem, ufając nosowi, nie oczom. Niebieski kamyk robi się gorący, unosi z kieszeni i łączy się z lupą. Lupa rozbłyska pełnym niebieskim światłem. Scout kieruje ją na ścianę i widzi ukryte inskrypcje. Tylko on je widzi. Camo: „Teraz widzisz to, co było ukryte. Prawdziwy Tropiciel z prawdziwą lupą widzi więcej niż inni." Camo daje też drużynie motto: „Szukaj. Myśl. Działaj. Razem." — i mówi, że ostatnie, „Razem", jest najważniejsze.

> Misja: Zamknij oczy i powąchaj. Czy potrafisz powiedzieć, skąd pochodzi zapach? Spróbuj przejść przez dom z zamkniętymi oczami — używając tylko nosa.

**4. Światło Latarni** — Próba Blitza: dotrzeć do latarni przed zachodem słońca i zapalić ją. Blitz upiera się, że pójdzie sam (szybciej), ale Camo wysyła wszystkich. Blitz traci czas biegnąc sam złymi ścieżkami — szybkość bez kierunku to bieganie w kółko. Nova proponuje rozdzielenie się na ścieżki — 5 minut pracy zespołowej vs 30 zmarnowanych solo. Na klifowej ścieżce Echo (żółw z ciężkim pancerzem) ślizga się i chwyta korzenia. Blitz staje przed wyborem: biec dalej do latarni czy wrócić. Wraca. Niesie Echo na plecach pod górę. Na szczycie latarni: cztery dźwignie w czterech rogach, zbyt daleko dla jednego. Blitz rozumie — dlatego Camo powiedział „idźcie wszyscy." Wszyscy naciskają jednocześnie przy ostatnim promieniu słońca. Latarnia rozbłyska ciepłym pomarańczowym światłem. Tabliczka: „Zip zapalał latarnię każdego wieczoru, żeby rybacy trafili do domu. Nigdy się nie spóźnił. Bo wiedział, że ktoś na niego liczy." Pomarańczowy kamień łączy się z butami Blitza — złote błyskawice. Camo: „Zip był tak szybki, że mógł biegać między dźwigniami zanim pierwsza się zresetowała." Blitz: „Ale dziś zrobiłem coś lepszego. Wróciłem po przyjaciela."

> Misja: Zbuduj tor przeszkód z poduszek, czapek, butów. Przetestuj sam z zamkniętymi oczami, potem z kimś kto Ci mówi dokąd, potem z kimś kto idzie z Tobą. Kiedy było najszybciej? Kiedy było najfajniej?

**5. Zepsuta Fontanna** — Próba Novy: naprawić starą fontannę. Nova pracuje sama 3 godziny wewnątrz mechanizmu — koła zębate, rury, zawory, zakurzone i zardzewiałe. Nie może odczytać wyblakłego schematu technicznego. Echo cicho podchodzi, otwiera fioletowy notes „Wynalazca" z podziemnej bazy i pokazuje stronę 43 — oryginalny schemat Zumi, rysowany dekady temu. „Zawór tu jest odwrócony. A ta rura jest zgięta." W 15 minut z drużyną (Blitz przynosi części, Scout świeci lupą na pękniętą rurę, Echo czyta schemat) fontanna rusza. Nova ma brudne ręce i łzy w oczach: „Działa." Fioletowy kamień łączy się z goglami — świecą fioletowo. Nova widzi niewidzialny grawerunek na wewnętrznym kamieniu fontanny: „Najlepsze rzeczy buduje się dla kogoś." (Napis Zumi.) Camo: „Próba nie polegała na naprawieniu fontanny. Polegała na poproszeniu o pomoc." Nova: „Ale poprosiłam Blitza o części. I Scouta, żeby poświecił lupą." Camo uśmiecha się. „Właśnie."

> Misja: Zbuduj coś z domowych rzeczy. Ale nie sam! Poproś kogoś o pomoc. Co wymyślił, czego Ty nie wymyśliłeś?

**6. Głos Wielkiego Dębu** — Camo opowiada o Wielkim Dębie — najstarszej rzeczy w Tropo, starszej niż biblioteka, latarnia, fontanna. Echo idzie sam. Znajduje małe drewniane drzwiczki z rzeźbioną sową wysoko na pniu, pod mchem. W dziupli: dziesiątki dzienników pisanych ręką Vedy przez wiele lat. Czyta całą historię Tropo — pory roku, fontannę gdy jeszcze działała, latarnię, życie w miasteczku. Ostatni dziennik (zielona okładka): wpisy o Zip, Zumi, Camo. Potem coraz krótsze i smutniejsze: Dzień 81 — „Camo nie przyszedł na spotkanie." Dzień 97 — „Zip nie przyszedł. Pierwszy raz." Dzień 100 — „Zumi mówi, że ma inne sprawy." Dzień 103 — „Camo nie przyszedł. Czekałam. Nie przyszedł. Nie przyjdzie." Puste kartki. Echo traci poczucie czasu czytając — podnosi wzrok i widzi gwiazdy. Siedzi tam od południa. Uświadamia sobie: „Zrobiłem to samo." Trzy bransoletki w trzech domach świecą jednocześnie. Scout, Blitz, Nova biegną do parku i ściągają Echo z drzewa. Echo idzie sam do Camo. „Przeczytałem dziennik Vedy. Wiem, co się stało. Ale to Twoja historia — opowiesz im, kiedy będziesz gotowy." Camo ma mokre oczy. „Dziękuję." Potem: „Wiesz, czego nie ma w dzienniku Vedy? Jak wyglądali, kiedy czekali. Nigdy tego nie widziałem. Wracałem do pustych krzeseł. Ale Ty widziałeś. Widziałeś ich twarze, gdy biegli pod dąb."

> Misja: Poproś rodziców o zeszyt. To Twój dziennik — jak dziennik Echo. Napisz lub narysuj, co było dziś ważne. Jedno zdanie lub jeden rysunek. Potem pokaż rodzicom — bo najlepsze historie są po to, żeby się nimi dzielić.

**7. Serce Tropo (finał sezonu)** — Rano. Echo odwraca się plecami i pokazuje świecącą mapę: wszystkie cztery Miejsca Mocy zapalone (niebieska biblioteka, pomarańczowa latarnia, fioletowa fontanna, zielony dąb). Ciemny piąty punkt w centrum — jaskinia. Camo: „Chodźcie ze mną. Chcę wam coś pokazać." Pierwszy raz sam chce gdzieś iść. Przez las wzdłuż prawie wyschniętego strumienia do wodospadu — cienka strużka na skałach. Za nią: wąska szczelina. Wewnątrz: wielka jaskinia z malowidłami na ścianach — zwierzęta, ścieżki, drzewa, gwiazdy. Jedno malowidło: cztery postacie razem — kameleon, lis, wydra, sowa. Kamienny stół z drewnianą księgą. Zamknięta. Camo: „Mieliśmy tu dokończyć naszą misję. Razem. We czwórkę." „Ale nie dokończyliście." „Nie." Camo opowiada — powoli, ciężko — jak podążał za śladami i zapominał wracać. „Myślałem, że im powiem jutro. Ale jutro szedłem za kolejnym śladem. Czekali. Zip przestał przychodzić. Potem Zumi. Potem Veda. Wracałem do pustych krzeseł." Blitz cicho (bez krzyku) przyznaje, że prawie zostawił Echo na górze. Nova: trzy godziny sama przy fontannie. Echo: „Zagubiłem się w dzienniku Vedy. Zapomniałem o świecie. Dokładnie tak, jak Ty zapomniałeś o swojej drużynie." Scout otwiera księgę — strony puste, białe, czekające. Podaje każdemu: Scout: „Drużyna TROPO. Scout, Blitz, Nova, Echo. I Camo — który na nas czekał." Blitz (powoli, starannie): „Lepiej razem niż osobno." Nova: „Nie bój się prosić o pomoc." Echo: „Dobrze mieć kogoś obok." Scout podaje pióro Camo. Camo, z drżącymi rękami, pisze: „Zawsze wracaj do swoich." Jaskinia odpowiada: ciepłe złote światło ze skały, stare malowidła świecą, cztery postacie na muralu zapalają się i „machają z przeszłości." Na pancerzu Echo piąty ciemny punkt zapala się na złoto. Cały pancerz rozbłyska — potem stara mapa znika. Pojawia się nowa, linia po linii: inne ścieżki, inne miejsca. Większa niż wcześniej. Nie Tropo. Coś, czego jeszcze nie znają. Strużka na zewnątrz staje się rykiem: wodospad wraca pełną mocą, wyschły strumień biegnie ponownie przez miasteczko. Tropo budzi się. Latarnia świeci, fontanna śpiewa, strumień biegnie przez miasteczko po raz pierwszy od lat.

> Misja: Porozmawiaj z kimś bliskim. Zapytaj: „Hej, jak się masz?" Posłuchaj. Nie musisz nic doradzać — po prostu bądź. Czasem najważniejsze nie jest gonienie za tropami. Najważniejsze jest wracanie.

### Główne tematy fabularne

- Indywidualne talenty działające w drużynie są potężniejsze niż solo
- Wracanie do swoich ludzi jest ważniejsze niż podążanie za kolejnym tropem
- Proszenie o pomoc to nie słabość — to klucz do tego, czego sam nie zrobisz
- Każdy członek drużyny widzi świat inaczej (nos, szybkość, ręce, słowa)
- Historia niesie lekcje; przeszłość prowadzi, ale nie więzi

**Próby postaci:**
- Scout: Zaufanie intuicji (nosowi) w ciemności — most między wiedzą a działaniem
- Blitz: Wybór ludzi zamiast szybkości — najszybciej biegniesz razem
- Nova: Proszenie o pomoc — duma to ściana; drużyna to drzwi
- Echo: Nie gubienie się w historiach — pamiętanie, że żywi Cię potrzebują

### Struktura szablonów bajek

Pliki: `templates/story/episodes/<slug>.html.twig`

Elementy HTML:
- **Dialog postaci:** `<div class="story-dialogue" style="--dialogue-color: #3578E5">` z `<strong>` na imię
- **Separator scen:** `<div class="story-separator">` z ikoną (`✦`, `🐾`, `⚡` itp.)
- **Placeholder ilustracji:** `<div class="story-illustration ...">` z opisem sceny w `<p>`
- **Cytat / myśl:** `<blockquote>` z wyróżnionym tekstem
- **Wpis z dziennika:** `<div class="bg-amber-50 border border-amber-200 rounded-xl p-6">` z nagłówkiem `📓 Dziennik Tropiciela`
- **Misja dla czytelnika:** `<div class="bg-cream border-2 rounded-xl p-6">` na końcu

### Eksport PDF

DomPDF via `StoryController::pdf()`. Template: `templates/story/pdf.html.twig`. Kompaktowy layout: 9.5pt font, interlinia 1.4, marginesy 1.5cm/2cm. Placeholdery ilustracji ukryte. Nagłówek z „TROPO" + tytuł odcinka.

---

## 5. Misje

### 5.1 Struktura

101 pre-generowanych misji. Klucz naturalny jako PK (`scout_home_easy_001`).

| Pole | Opis |
|------|------|
| `id` | Klucz naturalny (VARCHAR 100) |
| `character` | Scout / Blitz / Nova / Echo |
| `location` | Dom / Teren |
| `difficulty` | Łatwy / Średni |
| `category` | Budowanie · Eksperymenty · Matematyka · Ruch (nullable) |
| `title` | Tytuł misji |
| `players_min/max` | Zakres graczy |
| `estimated_minutes` | Szacowany czas |
| `tags` | JSON — tagi |
| `intro_dialog` | Briefing postaci |
| `preparation` | JSON — lista materiałów |
| `steps` | JSON — kroki misji |
| `completion_dialog` | Podsumowanie postaci |
| `badge_id` | FK do Badge |

### 5.2 Kategorie misji

- **Budowanie** — konstruowanie z dostępnych materiałów
- **Eksperymenty** — doświadczenia naukowe, odkrycia
- **Matematyka** — zagadki liczbowe, logika
- **Ruch** — aktywność fizyczna, ćwiczenia

### 5.3 Import misji

`MissionService::importMissions(array $data, bool $fresh = false)` — upsert z JSON. Flaga `--fresh` czyści bazę przed importem.

---

## 6. Odznaki (Badges)

Klucz naturalny jako PK (`badge_scout_home_easy`). Każda odznaka może mieć wiele powiązanych misji. Postać, lokalizacja i trudność odznaki wynikają z pierwszej powiązanej misji.

Przykłady: Tropiciel (Scout, Teren) · Domowy Olimpijczyk (Blitz, Dom) · Budowniczy (Nova, Dom) · Poeta Przyrody (Echo, Teren)

---

## 7. Cennik

### Plan Darmowy — 0 zł (na zawsze)
- 2 misje dziennie
- 4 postacie, wszystkie lokalizacje
- Podstawowe odznaki
- Zero reklam — na zawsze
- Nieograniczone profile dzieci (rodzeństwo dzieli jedno konto)

### TROPO+ — 19,99 zł/mies. lub 149,99 zł/rok (−37%)
Wszystko z planu darmowego, plus:
- Nieograniczone misje
- Misje sezonowe (Halloween, Święta)
- Tryb drużynowy
- Dziennik przygód (eksport PDF)
- Ekskluzywne odznaki
- Priorytetowe wsparcie
- 7 dni bezpłatnego okresu próbnego

Porównanie: „Za cenę jednego wejścia na salę zabaw, Twoje dziecko ma przygody na cały miesiąc."

Przełącznik monetyzacji (`SiteSettings.monetizationEnabled`) kontroluje widoczność sekcji cennika i sklepów z aplikacjami.

---

## 8. Manifest — 5 zasad TROPO

1. **Ekran to początek, nie cel** — 3 min ekranu uruchamia 12 min prawdziwej zabawy. Aplikacja to kompas, nie cel.
2. **Zero reklam. Nigdy. Serio.** — Żadnych banerów, video ads, „obejrzyj, żeby odblokować." Dzieci nie są produktem. Zarabiamy na subskrypcji, nie na uwadze dziecka.
3. **Razem, nie osobno** — Tropo jest lepsze z rodzicem, rodzeństwem, przyjacielem. Misje zachęcają do współpracy, rozmowy, wspólnego odkrywania. Telefon łączy, nie izoluje.
4. **Każde dziecko jest inne** — 4 postacie, 4 style misji — bo jedno dziecko kocha zagadki, inne musi biegać. Tropo dostosowuje się do dziecka, nie odwrotnie.
5. **Transparentność zawsze** — Wiemy dokładnie, ile czasu dziecko spędza na ekranie (średnio 3 min). Zbieramy minimum danych. Nie śledzimy, nie profilujemy, nie sprzedajemy.

Motto: *„Telefon to kompas, nie cel."*

### Wersje manifestu

**Pełna:** „Stworzyliśmy TROPO, bo wierzymy, że technologia może wyciągać dzieci z domu — nie przyklejać je do ekranu. Nasz telefon to kompas: daje kierunek, a potem idzie do kieszeni. 3 minuty ekranu uruchamiają 12 minut prawdziwej przygody. Zero reklam — nigdy, serio. Zarabiamy na subskrypcji, nie na uwadze Twojego dziecka. Misje TROPO zachęcają do współpracy: z rodzicem, rodzeństwem, przyjacielem. Bo najlepsze przygody to te, które przeżywamy razem. Zbieramy minimum danych, nie śledzimy, nie profilujemy. Wiemy, że zaufanie rodziców to nasz najcenniejszy zasób."

**Krótka (onboarding):** „TROPO zamienia telefon w kompas do prawdziwych przygód. 3 minuty ekranu, 12 minut zabawy. Zero reklam, minimum danych, maksimum przygody."

**Prasowa:** „TROPO to aplikacja dla dzieci 6-9 lat, która zamienia dom i okolicę w teren przygody. Kierując się Manifestem Zdrowej Zabawy — zero reklam, 3 minuty ekranu na misję, transparentność danych — TROPO udowadnia, że technologia dziecięca może być etyczna, angażująca i zdrowa."

**Bio (jedno zdanie):** „TROPO — telefon to kompas, nie cel. Przygody dla dzieci 6-9 lat, zero reklam, 3 min ekranu / 12 min zabawy."

### Liczby transparentności
- 3 min ekranu → 12 min zabawy bez telefonu
- 0 reklam. Nigdy. Serio.
- Minimum danych — tylko to, co potrzebne
- 100% offline content — zero trackingu

---

## 9. Głos marki

- **Język:** polski
- **Nazewnictwo:** „Tropo" jako nazwa własna miasta w narracji; „TROPO" jako marka na stronie/logo
- **Odbiorcy:** dzieci 6–9 (zabawnie, energicznie, bezpośrednio — „Ty") i ich rodzice (godnie zaufania, etycznie, spokojnie)
- **Ton:** ciepły, przygodowy, godny zaufania, zabawny, bezpośredni, lekko zuchwały („Zero reklam. NIGDY. Serio.")

**Kluczowe przekazy (hierarchia):**
1. „Przygoda jest bliżej niż myślisz" — core tagline
2. „Telefon to kompas, nie cel" — tagline manifestu
3. „3 min ekranu / 12 min przygody" — oferta
4. „Zero reklam. Nigdy." — etyczne zobowiązanie
5. „Razem, nie osobno" — przesłanie rodzinne/drużynowe

**Zasady tonu:**
- Używaj „Ty" i bezpośredniego zwrotu
- Używaj języka akcji („Ruszamy!", „Biegnijmy!")
- Używaj kontrastów skali (duży nagłówek / mały detal)
- Dawaj konkretne liczby (3 min, 12 min, 37%, 47 sekund)
- Nie używaj: akademickiego/korporacyjnego języka, nadmiaru emoji w tekście, strony biernej

**Ton bajek:** Literacki, ciepły, lekko magiczny. Proza prosta ale emocjonalnie rezonująca — dużo dialogów, każda postać ma wyraźny głos.

---

## 10. Strony publiczne

| URL | Opis |
|-----|------|
| `/` | Landing page (hero, jak to działa, drużyna, odznaki, manifest, cennik, opinie, CTA) |
| `/postacie` | Lista postaci (4 karty z animacją hover crossfade) |
| `/postacie/{slug}` | Szczegóły postaci |
| `/bajki` | Lista odcinków |
| `/bajki/{slug}` | Odcinek bajki |
| `/bajki/{slug}/pdf` | Eksport PDF bajki |
| `/cennik` | Plany cenowe + FAQ (7 pytań) |
| `/manifest` | 5 zasad + wersje (pełna, krótka, prasowa, bio) |
| `/pobierz` | Waitlist + mockupy |
| `/kontakt` | Formularz kontaktowy |
| `/oznaki` | Wszystkie odznaki |
| `/blog` | Lista wpisów |
| `/blog/{slug}` | Wpis blogowy + komentarze |
| `/wkrotce` | Strona „wkrótce startujemy" (maintenance mode) |
| `/sitemap.xml` | Mapa strony XML |

### Formularze chronione Cloudflare Turnstile
- Kontakt (`/kontakt`)
- Waitlist (`/pobierz`, AJAX → `/api/waitlist`)
- Komentarz do bloga (`/blog/{slug}`)
- Waitlist na stronie wkrótce (`/wkrotce`)

---

## 11. Panel administracyjny (`/admin`)

| Sekcja | Funkcje |
|--------|---------|
| Dashboard | Przegląd aktywności |
| Misje | Lista 101 misji z filtrami (postać, lokalizacja, trudność, kategoria, szukaj) |
| Blog | CRUD wpisów, toggle publikacji, tagi, śledzenie autorów (Blameable) |
| Komentarze | Moderacja — zatwierdzanie/odrzucanie |
| Opinie | Dodawanie/edycja, ocena 1–5, aktywacja/dezaktywacja |
| Użytkownicy | Zarządzanie kontami i rolami |
| Ustawienia | Tryb maintenance (wł/wył) · Przełącznik monetyzacji |
| Tracking | Analityka wizyt (cookie), heatmapa stron, parametry UTM |

### Tryb maintenance

`SiteSettings.maintenanceMode` (boolean) — gdy włączony, `MaintenanceSubscriber` (priorytet 30, przed firewallem) przekierowuje niezalogowanych użytkowników na `/wkrotce`. Strona „wkrótce" jest standalone (nie rozszerza base.html.twig), zawiera formularz waitlist z Turnstile.

---

## 12. PWA Sync API

API synchronizacji danych z aplikacji mobilnej.

| Endpoint | Metoda | Opis |
|----------|--------|------|
| `/api/pwa/sync` | POST | Sync dzieci, ukończonych misji i odznak z urządzenia (po deviceId) |
| `/api/pwa/sync/{deviceId}` | GET | Przywrócenie danych dla urządzenia |
| `/api/subscription/activate` | POST | Aktywacja subskrypcji kodem (status → „plus", 1 rok) |

### Encje PWA (`src/Entity/Pwa/`)

| Encja | Opis | Unikalność |
|-------|------|------------|
| `PwaChild` | Profil dziecka (device_id, local_id, name, difficulty) | (device_id, local_id) |
| `PwaCompletedMission` | Ukończona misja (device_id, local_id, child_id, mission_id) | (device_id, local_id) |
| `PwaBadge` | Zdobyta odznaka (device_id, local_id, child_id, badge_id) | (device_id, local_id) |
| `PwaSubscription` | Subskrypcja (device_id, activation_code, status, expires_at) | device_id, activation_code |

CORS: `config/packages/nelmio_cors.yaml` — zezwala na `tropo.app`, `localhost:5173`, `tropo.local`.

---

## 13. Email

- **Provider:** Resend (`symfony/resend-mailer`), synchroniczna wysyłka (brak Messenger workera na OVH)
- **Nadawca:** `Tropo <kontakt@tropo.city>` (env: `MAILER_FROM`)
- **Admin inbox:** `kontakt@tropo.city` → Cloudflare Email Routing → Gmail (env: `ADMIN_EMAIL`)
- **DMARC:** `_dmarc.tropo.city` TXT record skonfigurowany
- **Maile wysyłane:** potwierdzenie kontaktu, potwierdzenie zapisu na waitlist, notyfikacja admina

---

## 14. Stack technologiczny

| Warstwa | Technologia |
|---------|-------------|
| Backend | PHP 8.4, Symfony 8.0, Doctrine ORM |
| Frontend | Twig, Tailwind CSS v4 (via `symfonycasts/tailwind-bundle` v0.12) |
| JS | Stimulus (`@hotwired/stimulus` + `@symfony/stimulus-bundle`) |
| Bundling | Asset Mapper (bez Webpack/Vite) |
| Obrazy | LiipImagineBundle v2.17 (GD, WebP + resize, 8 filter sets) |
| PDF | DomPDF |
| CAPTCHA | Cloudflare Turnstile |
| CORS | NelmioCorsBundle |
| Email | Resend (via `symfony/resend-mailer`) |
| Baza danych | SQLite (dev) / MySQL (prod) |
| Deploy | Capistrano (Ruby) |
| Hosting | OVH shared (`ssh.cluster127.hosting.ovh.net`, user `gladits-tropo`) |
| Repo | `git@github.com:kubagladki/tropo.git` (branch `main`) |
| Konteneryzacja | Docker Compose (lokalne dev) |

---

## 15. Kolory i design system

### Paleta (CSS custom properties w `assets/styles/app.css`)

```
--color-scout:  #3578E5   (niebieski)
--color-blitz:  #E8612A   (pomarańczowy)
--color-nova:   #7C3AED   (fioletowy)
--color-echo:   #16A34A   (zielony)
--color-cream:  #FFFDF7   (tło)
--color-dark:   #1A1D1F   (tekst)
```

Font: Inter (system-ui fallback)

### Klasy CSS

- `.char-card` — karta postaci z `--char-color` (border-color na hover)
- `.text-gradient-brand` — gradient tekstu (blue → indigo → purple)
- `.story-dialogue` — dialog postaci w bajce (border-left + `--dialogue-color`)
- `.story-separator` — separator scen (linie + ikona)

**Uwaga Tailwind v4:** Dynamiczne klasy Twig (`border-{{ color }}`) nie są skanowane. Używaj inline `style` z CSS custom properties.

---

## 16. Kluczowe ścieżki

```
src/
├── Controller/
│   ├── Admin/           # Panel admin (Dashboard, Mission, Blog, Comment, Testimonial, User, Settings, Tracking)
│   ├── Api/             # API (PwaSyncController)
│   ├── HomeController
│   ├── CharacterController
│   ├── StoryController  # Bajki + PDF
│   ├── BlogController   # Blog + komentarze
│   ├── ContactController
│   ├── DownloadController  # Waitlist
│   ├── ComingSoonController  # Strona wkrótce
│   ├── PricingController
│   ├── BadgeController
│   ├── ManifestController
│   └── SitemapController
├── Entity/
│   ├── Pwa/             # PwaChild, PwaCompletedMission, PwaBadge, PwaSubscription
│   ├── Trait/           # BlameableTrait (createdBy/updatedBy)
│   └── ...              # User, BlogPost, Comment, Contact, Waitlist, Mission, Badge, MissionReview, SiteSettings, Visitor, PageView
├── EventListener/       # BlameableListener, TrackingSubscriber, MaintenanceSubscriber
├── Service/             # CharacterService, StoryService, MissionService, TurnstileService, SiteSettingsService, TrackingService
└── Repository/

templates/
├── base.html.twig
├── _macros/image.html.twig
├── home/
├── character/
├── story/
│   ├── episodes/        # 7 szablonów odcinków
│   └── pdf.html.twig
├── blog/
├── pricing/
├── manifest/
├── download/
├── contact/
├── badge/
├── coming_soon/
├── admin/
└── bundles/             # Nadpisania (error404)

assets/
├── styles/app.css       # Tailwind v4 theme + custom CSS
└── controllers/         # Stimulus controllers

public/images/           # Obrazy (postacie, hero, logo, OG)
config/deploy.rb         # Capistrano config
translations/messages.pl.yaml  # Tłumaczenia PL
migrations/              # Migracje Doctrine
```

---

## 17. Encje (model danych)

| Encja | PK | Opis | Blameable |
|-------|-----|------|-----------|
| User | INT auto | Admin auth (email, roles, password) | — |
| BlogPost | INT auto | Wpisy blogowe (title, slug, content, excerpt, tags, is_published) | ✓ |
| Comment | INT auto | Komentarze bloga (author_name, email, content, is_approved) | ✓ |
| Testimonial | INT auto | Opinie (author_name, content, rating 1–5, is_active) | ✓ |
| Contact | INT auto | Zgłoszenia kontaktowe (name, email, subject, message) | — |
| Waitlist | INT auto | Zapisy na listę (name, email unique) | — |
| Mission | VARCHAR(100) | Misje (natural key, 101 rekordów) | — |
| Badge | VARCHAR(100) | Odznaki (natural key) | — |
| MissionReview | INT auto | QA misji (status, notes, reviewed_by) | — |
| SiteSettings | INT (singleton, id=1) | Ustawienia (monetization_enabled, maintenance_mode) | — |
| Visitor | INT auto | Analityka (cookie_id, user_agent) | — |
| PageView | INT auto | Widoki stron (path, referrer, UTM) | — |
| PwaChild | INT auto | Profil dziecka z PWA (device_id, local_id, name, difficulty) | — |
| PwaCompletedMission | INT auto | Ukończona misja PWA (device_id, child_id, mission_id) | — |
| PwaBadge | INT auto | Odznaka PWA (device_id, child_id, badge_id) | — |
| PwaSubscription | INT auto | Subskrypcja PWA (device_id, activation_code, status, expires_at) | — |

---

## 18. Serwisy

| Serwis | Typ | Metody |
|--------|-----|--------|
| `CharacterService` | In-memory | `getAll()`, `getBySlug(slug)` |
| `StoryService` | In-memory | `getAll()`, `getBySlug(slug)`, `getByCharacter(slug)` |
| `MissionService` | Doctrine | `getAll(filters)`, `getById(id)`, `importMissions(data, fresh)` |
| `TurnstileService` | HTTP | `verifyToken(token): bool` |
| `SiteSettingsService` | Doctrine | `getSettings()`, `isMaintenanceMode()`, Twig global |
| `TrackingService` | Doctrine | Analityka wizyt i stron |

---

## 19. Obrazy (LiipImagineBundle)

8 filter sets: `char_icon`, `char_icon_webp`, `char_full`, `char_full_webp`, `logo`, `logo_webp`, `og_image`, `og_image_webp`

Macro Twig: `picture(path, filter, alt, class, loading, width, height)` → generuje `<picture>` z WebP + JPG fallback, 2x dla Retina.

Cache: `public/media/cache/` (gitignored, auto-generated).

Warianty postaci (w `var/characters/`):
- `{slug}.png` — base „PRZED" (przed przebudzeniem, bez efektów magicznych)
- `{slug}_with_armband.png` — base + bransoletka przyjaźni
- `{slug}_with_gem.png` — po przebudzeniu + bransoletka (efekty magiczne aktywne)

---

## 20. Deploy (Capistrano)

```bash
bundle exec cap production deploy   # ZAWSZE ręcznie!
```

- Serwer: OVH `ssh.cluster127.hosting.ovh.net`, user `gladits-tropo`
- Ścieżka: `/homez.1951/gladits/tropo`
- Composer: `/home/gladits-tropo/composer.phar`
- Pipeline post-deploy:
  1. `importmap:install`
  2. `tailwind:build`
  3. `asset-map:compile`
  4. `doctrine:migrations:migrate`
  5. `cache:clear --env=prod`
- Linked: `var/log`, `vendor`, `.env.local`
- Uwaga OVH: `/tmp` ma noexec — Capistrano używa custom `tmp_dir`

---

## 21. Rozwój lokalny

```bash
# Serwer
symfony serve                        # lub docker-compose up

# CSS (po zmianach w szablonach/stylach)
php bin/console tailwind:build

# Baza danych
php bin/console doctrine:database:create
php bin/console doctrine:migrations:migrate

# Admin
php bin/console app:create-admin
```

---

## 22. TROPO Studio (generowanie odcinków)

Osobny projekt: `/Users/gladki/projects/tropo-studio/`

Pipeline: keyframes (Gemini/Nano Banana) → klipy wideo (Veo/Seedance) → TTS (polski, głosy postaci) → FFmpeg → MP4

Zasady generowania:
- Zawsze backup klatek przed regenerowaniem
- Wymuszanie liczby postaci: „EXACTLY N characters... Do NOT duplicate"
- Polski tekst: podawaj dokładne polskie słowa + „ONLY POLISH, NO English"
- Każda klatka używa poprzedniej jako referencji stylu dla spójności wizualnej

---

## 23. Statystyki

- 4 grywalne postacie + 1 NPC (Camo) + 3 historyczne (Zip, Zumi, Veda)
- 7 odcinków bajki (Sezon 1 kompletny)
- 101 misji (z importu JSON)
- 4 kategorie misji · 2 lokalizacje · 2 poziomy trudności
- 15+ stron publicznych · 10+ stron admina
- 3 endpointy API (PWA sync)
- 6 kolorów tematycznych
- 2 plany cenowe (darmowy + 19,99 zł/mies.)
- 5 Miejsc Mocy (4 + Serce Tropo)
- 4 magiczne przedmioty + 4 bransoletki przyjaźni
