diff --git a/docs/index.html b/docs/index.html index 0e47fdf..9ea9b64 100644 --- a/docs/index.html +++ b/docs/index.html @@ -85,5 +85,89 @@

Plán implementácie MVP. Kompletný zoznam očíslovaných krokov pre postupnú realizáciu celého projektu.

+ +

Implementation Prompts

+ diff --git a/docs/prompts/step01.md b/docs/prompts/step01.md new file mode 100644 index 0000000..8849c34 --- /dev/null +++ b/docs/prompts/step01.md @@ -0,0 +1,67 @@ +# Krok 01 - Inicializácia projektu a základná štruktúra + +## Kontext projektu +WebWizard je AI website concierge (MVP), ktorý umožňuje používateľom vytvoriť statický web prostredníctvom wizardu. Projekt využíva PHP 8.2, JSON súbory pre ukladanie dát, Vanilla JavaScript a lokálne DAIAPI pre generovanie obsahu. Celá architektúra je postavená na jednoduchosti bez externých frameworkov. + +## Pred implementáciou si preštuduj +- `docs/mvp.md` - Celkový rozsah a ciele MVP. +- `docs/architecture.md` - Definícia adresárovej štruktúry a technologického stacku. + +## Cieľ +Vytvoriť základnú adresárovú štruktúru projektu a zabezpečiť ochranu citlivých dát v priečinku `data/`. Nastaviť základný autoloading pre PHP triedy v `src/`. + +## Požadované zmeny +1. Vytvorenie adresárovej štruktúry podľa `architecture.md`. +2. Vytvorenie `composer.json` so základným nastavením PSR-4 autoloadingu pre menný priestor `App\\` v priečinku `src/`. +3. Vytvorenie `.htaccess` v koreňovom adresári (alebo konfigurácia servera), ktorá zakáže priamy prístup do priečinka `data/`. + +## Implementačné pravidlá +- Nepoužívaj žiadne externé knižnice v `composer.json` okrem vývojových nástrojov, ak sú potrebné. +- Adresárová štruktúra musí presne zodpovedať `architecture.md`. +- `data/` priečinok musí byť neverejný. + +## Súbory ktoré je potrebné vytvoriť +- `data/users/.gitkeep` (a podobné pre ostatné podadresáre v data/) +- `data/projects/` +- `data/consent/` +- `data/llm/` +- `data/admin/` +- `exports/` +- `src/` +- `public/` +- `composer.json` +- `.htaccess` (v koreni projektu) +- `data/.htaccess` (na zablokovanie prístupu) + +## Súbory ktoré je potrebné upraviť +Žiadne (inicializácia nového projektu). + +## API a dátové štruktúry +V tomto kroku sa nedefinujú API endpointy. + +## Frontend požiadavky +Nerelevantné pre tento krok. + +## Backend požiadavky +- PHP 8.2. +- PSR-4 autoloading. + +## Testovací scenár +1. Spusti `composer dump-autoload` a over, či nevznikli chyby. +2. Pokús sa v prehliadači pristúpiť na `http://localhost/data/` (alebo ekvivalent) a over, či dostaneš 403 Forbidden. +3. Over, či existujú všetky požadované adresáre. + +## Definition of Done +- Adresárová štruktúra je vytvorená. +- Autoloading z `src/` funguje. +- Priečinok `data/` je chránený pred priamym prístupom z webu. + +## Obmedzenia +- Nepridávaj žiadne frameworky (Laravel, Symfony, atď.). +- Nepridávaj databázu. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step02.md b/docs/prompts/step02.md new file mode 100644 index 0000000..eb05b4f --- /dev/null +++ b/docs/prompts/step02.md @@ -0,0 +1,63 @@ +# Krok 02 - Core Data Services (Úložisko) + +## Kontext projektu +WebWizard ukladá všetky dáta (používatelia, projekty, súhlasy) do JSON súborov v priečinku `data/`. Je potrebné mať jednotnú službu, ktorá bude tieto operácie bezpečne vykonávať. + +## Pred implementáciou si preštuduj +- `docs/architecture.md` - Sekcia 4 (Adresárová štruktúra) a 5 (Dátové súbory). +- `docs/prompts/step01.md` - Predpokladá sa vytvorená štruktúra. + +## Cieľ +Implementovať triedu `FileStorage` v PHP, ktorá bude slúžiť ako hlavné rozhranie pre prácu s JSON súbormi v rámci systému. + +## Požadované zmeny +1. Vytvorenie triedy `App\Services\FileStorage` v `src/Services/FileStorage.php`. +2. Implementácia metód pre: + - `put(string $path, array $data): bool` - Uloží pole ako JSON. + - `get(string $path): ?array` - Načíta JSON a vráti pole. + - `exists(string $path): bool` - Overí existenciu súboru. + - `delete(string $path): bool` - Vymaže súbor. +3. Pridanie ochrany proti "path traversal" (napr. použitie `realpath` alebo sanitizácia cesty, aby sa operácie obmedzili na priečinok `data/`). + +## Implementačné pravidlá +- Používaj `json_encode` s `JSON_PRETTY_PRINT` pre lepšiu čitateľnosť súborov. +- Zabezpeč ošetrenie chýb pri čítaní/zápise (napr. neexistujúci súbor, neplatný JSON). +- Trieda musí byť v namespace `App\Services`. + +## Súbory ktoré je potrebné vytvoriť +- `src/Services/FileStorage.php` + +## Súbory ktoré je potrebné upraviť +Žiadne. + +## API a dátové štruktúry +Metódy triedy `FileStorage` pracujú s asociatívnymi poľami PHP. + +## Frontend požiadavky +Nerelevantné. + +## Backend požiadavky +- PHP 8.2. +- Prístupové práva na zápis do `data/`. + +## Testovací scenár +1. Vytvor testovací skript, ktorý vytvorí inštanciu `FileStorage`. +2. Skús uložiť pole `['test' => 123]` do `users/test.json`. +3. Over, či súbor existuje a obsahuje správny JSON. +4. Skús načítať dáta zo súboru. +5. Skús zadať cestu s `../` a over, či služba vyhodí výnimku alebo chybu (path traversal protection). + +## Definition of Done +- Trieda `FileStorage` je funkčná a otestovaná. +- Ukladanie a načítavanie JSON dát funguje bezpečne. +- Path traversal ochrana je implementovaná. + +## Obmedzenia +- Nepoužívaj žiadnu externú DB knižnicu. +- Všetky cesty musia byť relatívne k base path projektu alebo striktne v `data/`. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step03.md b/docs/prompts/step03.md new file mode 100644 index 0000000..2523901 --- /dev/null +++ b/docs/prompts/step03.md @@ -0,0 +1,67 @@ +# Krok 03 - API vrstva a Error Handling + +## Kontext projektu +Frontend komunikuje s backendom výhradne cez jeden endpoint `ajax.php` pomocou POST požiadaviek s JSON payloadom. + +## Pred implementáciou si preštuduj +- `docs/architecture.md` - Sekcia 9 (AJAX API). + +## Cieľ +Vytvoriť základný API router `public/ajax.php` a implementovať jednotný systém pre spracovanie chýb a formátovanie odpovedí. + +## Požadované zmeny +1. Vytvorenie súboru `public/ajax.php`. +2. Implementácia logiky pre: + - Načítanie JSON vstupu z `php://input`. + - Overenie prítomnosti hlavičky `X-User-ID`. + - Základný router (switch podľa poľa `action`). + - Jednotný formát úspešnej odpovede: `{"success": true, "data": {...}}`. + - Jednotný formát chybovej odpovede: `{"success": false, "error": {"code": "...", "message": "..."}}`. +3. Globálny `try-catch` blok na zachytávanie výnimiek a ich transformáciu do JSON odpovede. +4. Nastavenie správnych HTTP hlavičiek (`Content-Type: application/json`). + +## Implementačné pravidlá +- Nepoužívaj frameworky pre routing. +- Každá odpoveď musí mať nastavený status kód (typicky 200 pre aplikačné chyby v JSONe, alebo 4xx/5xx pri systémových chybách). +- Zabezpeč, aby PHP warningy a errory neboli vypisované priamo do výstupu (použi `display_errors = 0` v produkčnom nastavení a vlastný error handler). + +## Súbory ktoré je potrebné vytvoriť +- `public/ajax.php` + +## Súbory ktoré je potrebné upraviť +Žiadne. + +## API a dátové štruktúry +Vstupné dáta (JSON): +```json +{ + "action": "string", + "project_id": "string", + "payload": {} +} +``` + +## Frontend požiadavky +Nerelevantné (v tomto kroku len backend). + +## Backend požiadavky +- PHP 8.2. + +## Testovací scenár +1. Pošli POST požiadavku na `ajax.php` s prázdnym telom. Mal by si dostať JSON chybu. +2. Pošli POST požiadavku s neexistujúcou akciou. Mal by si dostať JSON chybu `UNKNOWN_ACTION`. +3. Pošli validnú požiadavku (zatiaľ môžeš implementovať akciu `ping`) a over formát `success: true`. + +## Definition of Done +- `ajax.php` funguje ako centrálny router. +- Odpovede majú jednotnú štruktúru. +- Chybové stavy sú ošetrené a vracajú JSON. + +## Obmedzenia +- Žiadne HTML vo výstupe z `ajax.php`. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step04.md b/docs/prompts/step04.md new file mode 100644 index 0000000..0e2ed2b --- /dev/null +++ b/docs/prompts/step04.md @@ -0,0 +1,74 @@ +# Krok 04 - Správa používateľov a projektov (Session) + +## Kontext projektu +WebWizard potrebuje identifikovať používateľa (pomocou ID uloženého v prehliadači) a priradiť k nemu jeho projekty. MVP nepoužíva klasické prihlasovanie, ale `user_id` generované pri prvej návšteve. + +## Pred implementáciou si preštuduj +- `docs/architecture.md` - Sekcia 5 (Projekt) a 8 (Identifikácia používateľa). +- `docs/wizard.md` - Sekcia 10 (Wizard Data Schema). + +## Cieľ +Implementovať logiku pre inicializáciu session (vytvorenie `user_id`) a základnú správu projektov (vytvorenie, zoznam). + +## Požadované zmeny +1. Implementácia akcie `initSession` v `ajax.php`: + - Ak `user_id` chýba, vygeneruj unikátne ID (napr. `u_` + hash). + - Vytvor súbor `data/users/.json`. +2. Implementácia akcie `createProject` v `ajax.php`: + - Vygeneruj unikátne `project_id`. + - Vytvor základnú štruktúru projektu v `data/projects/.json` so stavom `draft`. + - Pridaj `project_id` do zoznamu projektov v používateľskom JSONe. +3. Implementácia akcie `listProjects` v `ajax.php`: + - Vráti zoznam projektov pre dané `user_id` so základnými metadátami (názov z identity, stav, dátum). +4. Implementácia akcie `getProjectStatus` v `ajax.php`: + - Vráti kompletné dáta projektu pre dané `project_id`. + +## Implementačné pravidlá +- Používaj `FileStorage` službu z Kroku 02. +- ID musia byť bezpečne generované. +- Overuj, či projekt patrí danému `user_id` pri každej operácii s projektom. + +## Súbory ktoré je potrebné vytvoriť +- `src/Actions/ProjectActions.php` (odporúčané pre logiku) + +## Súbory ktoré je potrebné upraviť +- `public/ajax.php` (pridanie nových akcií) + +## API a dátové štruktúry +Šruktúra projektu (`data/projects/.json`): +```json +{ + "project_id": "...", + "user_id": "...", + "status": "draft", + "current_step": 1, + "wizard_data": {}, + "created_at": "...", + "updated_at": "..." +} +``` + +## Frontend požiadavky +Nerelevantné (implementácia backend logic). + +## Backend požiadavky +- PHP 8.2. + +## Testovací scenár +1. Zavolaj `initSession` bez `X-User-ID`. Dostaneš nové ID. +2. Zavolaj `createProject` s novým ID. Dostaneš `project_id`. +3. Over, či vznikli súbory v `data/users/` a `data/projects/`. +4. Zavolaj `listProjects` a over, či obsahuje vytvorený projekt. + +## Definition of Done +- Používateľské relácie a projekty sú perzistentne uložené v JSON súboroch. +- API akcie pre správu projektov sú funkčné. + +## Obmedzenia +- Nepoužívaj PHP natívne sessions (`session_start()`), identifikácia je čiste cez `user_id` v hlavičke a perzistenciu v súboroch. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step05.md b/docs/prompts/step05.md new file mode 100644 index 0000000..909b598 --- /dev/null +++ b/docs/prompts/step05.md @@ -0,0 +1,67 @@ +# Krok 05 - Služba pre GDPR súhlas + +## Kontext projektu +Podľa právnych požiadaviek a špecifikácie MVP musí systém evidovať explicitný súhlas používateľa so spracovaním údajov pred tým, než povolí uloženie akýchkoľvek citlivých dát alebo generovanie webu. + +## Pred implementáciou si preštuduj +- `docs/mvp.md` - Sekcia 10 (GDPR). +- `docs/architecture.md` - Sekcia 7 (GDPR súhlas). + +## Cieľ +Vytvoriť službu na správu GDPR súhlasov a implementovať API akciu na uloženie súhlasu. + +## Požadované zmeny +1. Vytvorenie triedy `App\Services\ConsentService` v `src/Services/ConsentService.php`. +2. Implementácia metódy `saveConsent(string $projectId, string $userId, string $consentText): bool`. + - Uloží súbor `data/consent/.json`. + - Záznam musí obsahovať: `project_id`, `user_id`, `consent_text_version`, `consent_text`, `accepted: true`, `accepted_at` (v UTC). +3. Implementácia metódy `hasConsent(string $projectId): bool`. +4. Implementácia API akcie `saveConsent` v `ajax.php`. + +## Implementačné pravidlá +- Verzia textu súhlasu by mala byť konštanta v kóde (napr. `webwizard-mvp-2026-06-12`). +- Dátum musí byť v ISO 8601 formáte (UTC). +- Bez súhlasu nesmie systém povoliť krok generovania AI (bude validované v neskorších krokoch). + +## Súbory ktoré je potrebné vytvoriť +- `src/Services/ConsentService.php` + +## Súbory ktoré je potrebné upraviť +- `public/ajax.php` (pridanie akcie `saveConsent`) + +## API a dátové štruktúry +JSON súhlasu: +```json +{ + "project_id": "...", + "user_id": "...", + "consent_text_version": "...", + "consent_text": "...", + "accepted": true, + "accepted_at": "2026-06-12T10:00:00Z" +} +``` + +## Frontend požiadavky +Nerelevantné. + +## Backend požiadavky +- PHP 8.2. + +## Testovací scenár +1. Zavolaj akciu `saveConsent` s platným `project_id` a textom. +2. Over, či sa vytvoril súbor v `data/consent/`. +3. Over obsah súboru, najmä formát dátumu a prítomnosť všetkých polí. + +## Definition of Done +- Systém dokáže auditovateľne ukladať GDPR súhlasy. +- Existuje služba na overenie existencie súhlasu pre daný projekt. + +## Obmedzenia +- Súhlas je neprenosný medzi projektami (každý projekt musí mať vlastný záznam súhlasu, aj keď je to ten istý používateľ). + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step06.md b/docs/prompts/step06.md new file mode 100644 index 0000000..caee1d1 --- /dev/null +++ b/docs/prompts/step06.md @@ -0,0 +1,70 @@ +# Krok 06 - Kostra Wizardu (Frontend UI) + +## Kontext projektu +Používateľské rozhranie WebWizardu je postavené na Vanilla JavaScript bez použitia frontend frameworkov. Celá interakcia prebieha v rámci jednej stránky (`index.html`). + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 1 (Prehľad wizardu). +- `docs/architecture.md` - Sekcia 8 (Identifikácia používateľa). + +## Cieľ +Vytvoriť základnú HTML štruktúru, CSS štýly a JavaScriptovú logiku pre navigáciu v rámci wizardu a inicializáciu používateľskej relácie. + +## Požadované zmeny +1. Vytvorenie `public/index.html` s: + - Kontajnerom pre jednotlivé kroky wizardu. + - Navigačnými prvkami (Späť / Pokračovať). + - Indikátorom progresu. +2. Vytvorenie `public/css/wizard.css` pre základný layout a vizuálnu stránku wizardu. +3. Vytvorenie `public/js/wizard.js` s logikou: + - Kontrola `localStorage.getItem('ww_user_id')`. + - Volanie `initSession` cez AJAX, ak ID chýba. + - Správa stavu (aktuálny krok). + - Funkcie `nextStep()` a `prevStep()`. + - Funkcia `showStep(n)` pre zobrazenie správneho kontajnera v DOM. + +## Implementačné pravidlá +- Používaj moderný Vanilla JS (ES6+). +- AJAX volania realizuj pomocou `fetch`. +- Nepoužívaj žiadne externé knižnice (jQuery, Bootstrap, atď.). +- Layout musí byť responzívny. + +## Súbory ktoré je potrebné vytvoriť +- `public/index.html` +- `public/css/wizard.css` +- `public/js/wizard.js` + +## Súbory ktoré je potrebné upraviť +Žiadne. + +## API a dátové štruktúry +Používa API akciu `initSession` z Kroku 04. + +## Frontend požiadavky +- Čistý a moderný dizajn. +- Plynulé prechody medzi krokmi (môže byť jednoduchý show/hide). +- Ukladanie `ww_user_id` do `localStorage`. + +## Backend požiadavky +- API musí byť dostupné na `ajax.php`. + +## Testovací scenár +1. Otvor `public/index.html` v prehliadači. +2. Over v DevTools (Application -> Local Storage), či sa vygenerovalo `ww_user_id`. +3. Vyskúšaj klikanie na tlačidlá pre prechod medzi krokmi. +4. Over, či sa vizuálne mení obsah podľa aktuálneho kroku. + +## Definition of Done +- Kostra wizardu je funkčná. +- Používateľ je identifikovaný a relácia je inicializovaná. +- Prepínanie krokov funguje správne. + +## Obmedzenia +- Žiadny build proces (žiadne Webpack, Vite, atď.). +- Všetko v rámci priečinka `public/`. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step07.md b/docs/prompts/step07.md new file mode 100644 index 0000000..6e5869a --- /dev/null +++ b/docs/prompts/step07.md @@ -0,0 +1,78 @@ +# Krok 07 - Wizard - Segmentácia biznisu (Krok 1) + +## Kontext projektu +Prvým krokom wizardu je výber kategórie podnikania. Tento výber ovplyvňuje ďalšie otázky (Smart answers) a obsah, ktorý AI vygeneruje. + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 2 (Krok 1 - Segmentácia biznisu). + +## Cieľ +Implementovať UI pre výber kategórie a podkategórie podnikania a uloženie týchto dát na backend. + +## Požadované zmeny +1. Vytvorenie súboru `data/categories.json` s definíciou kategórií (Gastro, Krása, Remeslá, atď.) a ich podkategórií. +2. Na frontende (`wizard.js`): + - Načítanie kategórií (môže byť hardcoded v JS alebo načítané cez API). + - Zobrazenie kategórií ako "radio cards" (vizuálne boxy s ikonou/názvom). + - Po výbere kategórie zobrazenie podkategórií (napr. ako chips alebo dropdown). + - Pole pre vlastný popis, ak používateľ zvolí "Iné". + - Volanie `saveStep` pri prechode na ďalší krok. +3. Na backende (`ajax.php`): + - Implementácia akcie `saveStep`. + - Validácia, že vybraná kategória a podkategória sú platné. + - Uloženie do `wizard_data.business_category`. + +## Implementačné pravidlá +- Používaj moderné UI prvky (napr. CSS Grid pre radio cards). +- Zabezpeč plynulú interakciu pri zmene kategórie (reset podkategórií). + +## Súbory ktoré je potrebné vytvoriť +- `data/categories.json` + +## Súbory ktoré je potrebné upraviť +- `public/js/wizard.js` (logika pre Krok 1) +- `public/index.html` (DOM pre Krok 1) +- `public/ajax.php` (implementácia `saveStep`) + +## API a dátové štruktúry +Payload pre `saveStep`: +```json +{ + "step": 1, + "data": { + "business_category": { + "group": "gastro", + "subcategory": "restaurant", + "custom_description": null + } + } +} +``` + +## Frontend požiadavky +- Atraktívne zobrazenie kategórií. +- Intuitívny výber podkategórie. + +## Backend požiadavky +- Validácia vstupov. + +## Testovací scenár +1. Vyber kategóriu "Gastro". +2. Vyber podkategóriu "Reštaurácia". +3. Klikni na "Pokračovať". +4. Over v JSONe projektu v `data/projects/`, či sa dáta správne uložili. +5. Skús zvoliť "Iné" a napísať vlastný text. + +## Definition of Done +- Používateľ vie vybrať segment biznisu. +- Dáta sa správne ukladajú na server. +- UI reaguje na výbery používateľa. + +## Obmedzenia +- Nepoužívaj externé UI knižnice (napr. Vuetify, Material UI). + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step08.md b/docs/prompts/step08.md new file mode 100644 index 0000000..908c5fd --- /dev/null +++ b/docs/prompts/step08.md @@ -0,0 +1,74 @@ +# Krok 08 - Wizard - Identita a Kontakt (Krok 2) + +## Kontext projektu +Tento krok zbiera základné fakty o firme, ktoré AI nesmie meniť. Zároveň je tu vyžadovaný povinný súhlas s GDPR. + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 3 (Krok 2). +- `docs/prompts/step05.md` - Služba pre GDPR súhlas. + +## Cieľ +Implementovať formulár pre zadanie názvu firmy, kontaktov a povinný GDPR checkbox. + +## Požadované zmeny +1. Na frontende (`index.html` + `wizard.js`): + - Polia: Názov firmy (povinné), Slogan, Popis firmy. + - Kontaktné polia: Email, Telefón (povinný aspoň jeden), Adresa, Mesto, Sociálne siete. + - GDPR Checkbox s textom súhlasu. + - Validácia: Tlačidlo "Pokračovať" je neaktívne, kým nie je názov firmy a GDPR checkbox. + - Pri uložení: Najprv zavolaj `saveConsent`, potom `saveStep`. +2. Na backende (`ajax.php`): + - Rozšírenie validácie `saveStep` pre krok 2. + - Overenie prítomnosti súhlasu v `data/consent/` pred uložením dát. + - Uloženie do `wizard_data.identity` a `wizard_data.contact`. + +## Implementačné pravidlá +- Validácia na frontende aj backende. +- Správne ošetrenie chýb (napr. neplatný email). + +## Súbory ktoré je potrebné vytvoriť +Žiadne. + +## Súbory ktoré je potrebné upraviť +- `public/index.html` (DOM pre Krok 2) +- `public/js/wizard.js` (logika pre Krok 2) +- `public/ajax.php` (validácia kroku 2) + +## API a dátové štruktúry +Payload pre `saveStep`: +```json +{ + "step": 2, + "data": { + "identity": { ... }, + "contact": { ... } + } +} +``` + +## Frontend požiadavky +- Jasne označené povinné polia. +- Chybové hlášky pri neplatnom vstupe. + +## Backend požiadavky +- PHP validácia (email, povinné polia). + +## Testovací scenár +1. Vyplň názov firmy, ale nezaškrtni GDPR. Tlačidlo "Pokračovať" by malo byť blokované (alebo vrátiť chybu). +2. Vyplň všetko správne a zaškrtni GDPR. +3. Over, či sa vytvoril súbor v `data/consent/` a či sú dáta v `data/projects/`. +4. Skús zadať neplatný email a over správanie. + +## Definition of Done +- Identita a kontakty sú úspešne uložené. +- GDPR súhlas je riadne evidovaný a vyžadovaný. +- Validácia funguje na oboch stranách. + +## Obmedzenia +- Bez GDPR súhlasu nesmie prejsť uloženie kroku 2 na backende. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step09.md b/docs/prompts/step09.md new file mode 100644 index 0000000..a9ebd8a --- /dev/null +++ b/docs/prompts/step09.md @@ -0,0 +1,78 @@ +# Krok 09 - Wizard - Služby a Smart otázky (Krok 3) + +## Kontext projektu +Krok 3 zbiera konkrétne informácie o službách a odpovede na dynamické otázky, ktoré závisia od kategórie vybranej v Kroku 1. + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 4 (Krok 3 - Služby a smart otazky). +- `data/categories.json` - Definícia smart otázok pre jednotlivé kategórie. + +## Cieľ +Vytvoriť dynamické rozhranie pre zadávanie služieb a zodpovedanie segmentovo špecifických otázok. + +## Požadované zmeny +1. Na frontende (`wizard.js`): + - Rozhranie pre dynamické pridávanie/odoberanie služieb (Názov, Popis, Cena od). + - Logika pre načítanie "Smart questions" z `categories.json` na základe vybranej kategórie. + - Zobrazenie otázok (checkboxy pre Áno/Nie, textové polia pre detaily). + - Tlačidlo "Preskočiť" pre voliteľné polia. +2. Na backende (`ajax.php`): + - Validácia dát pre krok 3. + - Uloženie do `wizard_data.services` a `wizard_data.smart_answers`. + +## Implementačné pravidlá +- Minimálne 2 služby by mali byť odporúčané, ale nie striktne povinné pre MVP (AI vie zvyšok domyslieť). +- Smart otázky musia presne zodpovedať kategórii. + +## Súbory ktoré je potrebné vytvoriť +Žiadne (predpokladá sa, že `data/categories.json` už existuje). + +## Súbory ktoré je potrebné upraviť +- `public/index.html` (DOM pre Krok 3) +- `public/js/wizard.js` (logika pre Krok 3) +- `public/ajax.php` (validácia kroku 3) +- `data/categories.json` (doplnenie smart otázok, ak chýbajú) + +## API a dátové štruktúry +Payload pre `saveStep`: +```json +{ + "step": 3, + "data": { + "services": { + "items": [{ "name": "...", "description": "...", "price_from": "..." }], + "pricing_note": "..." + }, + "smart_answers": { + "question_id": "answer" + } + } +} +``` + +## Frontend požiadavky +- Jednoduché pridávanie položiek do zoznamu. +- Prehľadné zobrazenie dynamických otázok. + +## Backend požiadavky +- PHP validácia štruktúry poľa služieb. + +## Testovací scenár +1. Pridaj 3 služby a vyplň im názvy. +2. Odpovedz na smart otázky (napr. pre Gastro: donaska = true). +3. Klikni na "Pokračovať". +4. Over v JSONe projektu, či sú služby a odpovede správne uložené. + +## Definition of Done +- Používateľ vie zadať služby a odpovedať na segmentové otázky. +- Dáta sú perzistentne uložené. +- UI je dynamické podľa kategórie. + +## Obmedzenia +- Nepoužívaj zložité state management knižnice (Redux a pod.), zostaň pri Vanilla JS. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step10.md b/docs/prompts/step10.md new file mode 100644 index 0000000..463ca77 --- /dev/null +++ b/docs/prompts/step10.md @@ -0,0 +1,75 @@ +# Krok 10 - Wizard - Vizuál a Assety (Krok 4) + +## Kontext projektu +V tomto kroku si používateľ vyberá vizuálny štýl webu a nahráva svoje assety (logo, obrázky). MVP podporuje asynchrónny upload súborov. + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 5 (Krok 4 - Vizualny styl a assety). +- `docs/architecture.md` - Sekcia 13 (Bezpečnostné minimum). + +## Cieľ +Implementovať výber vizuálneho štýlu a bezpečný asynchrónny upload obrázkov. + +## Požadované zmeny +1. Na frontende (`index.html` + `wizard.js`): + - Výber štýlu (Minimal, Modern, Premium, atď.). + - Výber farebnej schémy (preddefinované palety). + - UI pre nahrávanie loga a obrázkov (file input). + - Asynchrónne odoslanie súboru na API akciu `uploadAsset`. + - Zobrazenie náhľadu nahraného obrázka. +2. Na backende (`ajax.php`): + - Implementácia akcie `uploadAsset`. + - Striktná validácia: + - MIME typ (JPG, PNG, WEBP, SVG). + - Prípona súboru. + - Maximálna veľkosť (napr. 2MB). + - Ochrana proti path traversal. + - Ukladanie do `exports//assets/images/`. + - Vrátenie cesty k súboru. +3. Uloženie vizuálnych nastavení cez `saveStep`. + +## Implementačné pravidlá +- Nahrané súbory nesmú byť spustiteľné. +- Každý projekt má vlastný podadresár v `exports/`. +- Používaj `FileStorage` pre správu ciest. + +## Súbory ktoré je potrebné vytvoriť +Žiadne. + +## Súbory ktoré je potrebné upraviť +- `public/index.html` (DOM pre Krok 4) +- `public/js/wizard.js` (logika pre Krok 4 + upload) +- `public/ajax.php` (akcia `uploadAsset` + validácia kroku 4) + +## API a dátové štruktúry +Akcia `uploadAsset`: +- Request: `FormData` (file, project_id). +- Response: `{"success": true, "data": {"path": "..."}}`. + +## Frontend požiadavky +- Progress bar alebo spinner počas uploadu. +- Možnosť zadať alt text k obrázku. + +## Backend požiadavky +- Bezpečné ukladanie súborov (unikátne názvy alebo bezpečné sanitizovanie). +- Kontrola `GD` alebo `finfo` pre MIME typ. + +## Testovací scenár +1. Vyber vizuálny štýl. +2. Nahraj JPG súbor ako logo. Over, či sa zobrazí náhľad. +3. Skús nahrať `.php` alebo `.exe` súbor a over, či ho backend odmietne. +4. Over, či sa súbor fyzicky nachádza v `exports//assets/images/`. + +## Definition of Done +- Vizuálne nastavenia sú uložené. +- Assety sú bezpečne nahrané a priradené k projektu. +- Validácia súborov funguje správne. + +## Obmedzenia +- Nepoužívaj externé knižnice na upload (napr. Dropzone.js). + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step11.md b/docs/prompts/step11.md new file mode 100644 index 0000000..4a60717 --- /dev/null +++ b/docs/prompts/step11.md @@ -0,0 +1,84 @@ +# Krok 11 - Wizard - Moduly a Formulár (Krok 5) + +## Kontext projektu +V poslednom kroku zberu dát si používateľ vyberá sekcie webu a konfiguruje kontaktný formulár (SMTP alebo lokálny mód). + +## Pred implementáciou si preštuduj +- `docs/wizard.md` - Sekcia 6 (Krok 5 - Moduly webu a kontaktny formular). +- `docs/mvp.md` - Sekcia 9 (Kontaktny formular). + +## Cieľ +Implementovať výber sekcií webu a konfiguráciu kontaktného formulára vrátane zabezpečeného uloženia hesla pre lokálny mód. + +## Požadované zmeny +1. Na frontende (`index.html` + `wizard.js`): + - Checkboxy pre výber sekcií (Hero, O nás, Služby, Cenník, Galéria, FAQ, Kontakt). + - Prepínač pre kontaktný formulár (Zapnutý/Vypnutý). + - Výber módu formulára: SMTP alebo Lokálny. + - Polia pre SMTP (Host, Port, User, Pass, atď.). + - Pole pre heslo k lokálnemu módu. +2. Na backende (`ajax.php`): + - Implementácia validácie pre krok 5. + - Pri lokálnom móde: Heshovanie hesla pomocou `password_hash()` pred uložením do `wizard_data`. + - Uloženie do `wizard_data.modules`. + +## Implementačné pravidlá +- Heslo pre lokálny mód sa nikdy neukladá v plain-texte. +- Sekcia "Hero" a "Kontakt" by mali byť predvolene vybrané. + +## Súbory ktoré je potrebné vytvoriť +Žiadne. + +## Súbory ktoré je potrebné upraviť +- `public/index.html` (DOM pre Krok 5) +- `public/js/wizard.js` (logika pre Krok 5) +- `public/ajax.php` (validácia a heshovanie hesla) + +## API a dátové štruktúry +Payload pre `saveStep`: +```json +{ + "step": 5, + "data": { + "modules": { + "pages": ["home"], + "sections": ["hero", "about", "services", "contact"], + "contact_form": { + "enabled": true, + "mode": "local", + "smtp": null, + "local_viewer": { + "password_hash": "..." + } + } + } + } +} +``` + +## Frontend požiadavky +- Podmienené zobrazenie polí pre SMTP vs Lokálny mód. +- Validácia sily hesla (voliteľne). + +## Backend požiadavky +- Použitie `PASSWORD_DEFAULT` pre `password_hash`. + +## Testovací scenár +1. Vyber sekcie "Hero", "O nás" a "Kontakt". +2. Zvoľ Lokálny mód formulára a zadaj heslo "mojeheslo123". +3. Klikni na "Pokračovať". +4. Over v JSONe projektu, či je v `contact_form.local_viewer.password_hash` uložený hash, nie plain-text. + +## Definition of Done +- Konfigurácia modulov a formulára je uložená. +- Heslo pre lokálny prehliadač správ je bezpečne zaheshované. +- UI správne prepína medzi módmi formulára. + +## Obmedzenia +- Žiadne odosielanie testovacích mailov v tomto kroku. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step12.md b/docs/prompts/step12.md new file mode 100644 index 0000000..c62973b --- /dev/null +++ b/docs/prompts/step12.md @@ -0,0 +1,75 @@ +# Krok 12 - Generovanie fronty úloh (AI Queue) + +## Kontext projektu +Po dokončení wizardu sa spustí proces generovania obsahu pomocou AI. Tento proces je asynchrónny a prebieha cez frontu úloh v `data/llm/`. + +## Pred implementáciou si preštuduj +- `docs/architecture.md` - Sekcia 10 (AI workflow). +- `docs/prompts/step04.md` - Správa projektov. + +## Cieľ +Implementovať API akciu `generateWebsite`, ktorá vytvorí AI úlohu a prepne stav projektu. + +## Požadované zmeny +1. Na backende (`ajax.php` alebo `TaskActions.php`): + - Implementácia akcie `generateWebsite`. + - Overenie, či projekt existuje a má všetky potrebné dáta (najmä GDPR súhlas). + - Zmena stavu projektu na `queued`. + - Vytvorenie JSON súboru úlohy v `data/llm/` s unikátnym `task_id`. + - Súbor úlohy obsahuje `project_id`, `wizard_data` a metadáta (pokusy, čas vytvorenia). +2. Na frontende (`wizard.js`): + - Volanie `generateWebsite` po poslednom kroku wizardu. + - Implementácia "polling" mechanizmu (volanie `getProjectStatus` každých pár sekúnd) na sledovanie progresu. + - Zobrazenie loaderu s aktuálnym stavom (`queued`, `generating`, `rendering`). + +## Implementačné pravidlá +- Úloha vo fronte musí obsahovať snapshot `wizard_data` v čase vytvorenia. +- Stav projektu `queued` blokuje ďalšie zmeny v `wizard_data`. + +## Súbory ktoré je potrebné vytvoriť +- `src/Actions/TaskActions.php` (voliteľné, pre čistotu kódu) + +## Súbory ktoré je potrebné upraviť +- `public/ajax.php` (pridanie akcie `generateWebsite`) +- `public/js/wizard.js` (logika pre spustenie generovania a polling) + +## API a dátové štruktúry +Štruktúra úlohy (`data/llm/t_.json`): +```json +{ + "task_id": "t_...", + "project_id": "p_...", + "status": "queued", + "attempt_count": 0, + "max_attempts": 3, + "created_at": "...", + "wizard_data": { ... } +} +``` + +## Frontend požiadavky +- Animovaný spinner alebo progress bar. +- Informovanie používateľa, že generovanie môže trvať niekoľko desiatok sekúnd. + +## Backend požiadavky +- Zabezpečenie, aby nevznikali duplicitné úlohy pre ten istý projekt, ak už jedna prebieha. + +## Testovací scenár +1. Prejdi celým wizardom a na konci klikni na "Generovať web". +2. Over, či sa v `data/llm/` vytvoril súbor úlohy. +3. Over, či sa stav projektu v `data/projects/` zmenil na `queued`. +4. Sleduj v konzole prehliadača, či polling (`getProjectStatus`) prebieha správne. + +## Definition of Done +- Systém úspešne zaraďuje projekty do AI fronty. +- Frontend korektne sleduje stav generovania. +- Dáta pre AI sú správne pripravené. + +## Obmedzenia +- V tomto kroku sa ešte nevykonáva samotné volanie AI (len zaradenie do fronty). + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step13.md b/docs/prompts/step13.md new file mode 100644 index 0000000..5535897 --- /dev/null +++ b/docs/prompts/step13.md @@ -0,0 +1,66 @@ +# Krok 13 - Architektúra promptov a DAIAPI klient + +## Kontext projektu +Systém využíva lokálne DAIAPI na generovanie textového obsahu (JSON content layer). AI nesmie generovať HTML, ale štruktúrované dáta podľa dodaného promptu. + +## Pred implementáciou si preštuduj +- `docs/mvp.md` - Sekcia 7 (AI workflow). +- `docs/architecture.md` - Sekcia 10 (AI workflow). + +## Cieľ +Implementovať klienta pre DAIAPI a vytvoriť generátor promptov, ktorý na základe `wizard_data` pripraví zadanie pre AI. + +## Požadované zmeny +1. Vytvorenie triedy `App\Services\DAIClient` v `src/Services/DAIClient.php`: + - Metóda `sendRequest(string $prompt): ?string` (použitie `curl` alebo `file_get_contents` pre POST na lokalne API). + - Spracovanie odpovede a ošetrenie timeoutov. +2. Vytvorenie triedy `App\Prompts\ContentPrompt` v `src/Prompts/ContentPrompt.php`: + - Metóda `generate(array $wizardData): string`. + - Prompt musí obsahovať: + - Kontext projektu. + - Inštrukcie pre "Content Layer" (SEO, Hero, Služby, atď.). + - Striktný zákaz HTML výstupu. + - Príklad požadovaného JSON formátu. + - Vstupné fakty z `wizard_data`. + +## Implementačné pravidlá +- Prompt musí byť v slovenskom jazyku (alebo podľa `wizard_data.language`). +- Klient musí logovať chyby komunikácie s API. +- Použi systémovú premennú alebo konfiguračný súbor pre URL DAIAPI. + +## Súbory ktoré je potrebné vytvoriť +- `src/Services/DAIClient.php` +- `src/Prompts/ContentPrompt.php` + +## Súbory ktoré je potrebné upraviť +Žiadne. + +## API a dátové štruktúry +DAIAPI typicky očakáva: +- URL: `http://localhost:port/v1/chat/completions` (podľa lokálneho nastavenia). +- Formát: JSON (messages, temperature, atď.). + +## Frontend požiadavky +Nerelevantné. + +## Backend požiadavky +- Povolené rozšírenie `curl` v PHP. + +## Testovací scenár +1. Vytvor testovací skript, ktorý vygeneruje prompt pre mock `wizard_data`. +2. Over, či prompt obsahuje všetky kľúčové informácie (názov firmy, služby). +3. Skús (ak máš prístup k API) poslať testovací dopyt a over, či vráti validný JSON bez HTML. + +## Definition of Done +- Klient pre AI je funkčný. +- Prompt je správne navrhnutý a generuje štruktúrované zadanie. +- Systém je pripravený na integráciu s workerom. + +## Obmedzenia +- AI nesmie v žiadnom prípade generovať tagy ako `
`, `

` a pod. v rámci content layer. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step14.md b/docs/prompts/step14.md new file mode 100644 index 0000000..e16494e --- /dev/null +++ b/docs/prompts/step14.md @@ -0,0 +1,79 @@ +# Krok 14 - Služba LLMpool a Validácia AI výstupu + +## Kontext projektu +`LLMpool.php` je "worker", ktorý konzumuje frontu úloh, komunikuje s AI a ukladá výsledný obsah do projektu. + +## Pred implementáciou si preštuduj +- `docs/architecture.md` - Sekcia 10 (AI workflow). +- `docs/prompts/step13.md` - DAIClient a Prompt. + +## Cieľ +Implementovať logiku pre spracovanie AI fronty, validáciu JSON výstupu a aktualizáciu stavu projektu. + +## Požadované zmeny +1. Vytvorenie skriptu `src/Services/LLMpool.php` (alebo CLI skriptu): + - Vyhľadanie úloh v stave `queued` v `data/llm/`. + - Uzamknutie úlohy (zmena stavu na `generating`). + - Volanie `ContentPrompt` na vygenerovanie zadania. + - Volanie `DAIClient` na získanie odpovede od AI. + - Validácia odpovede: + - Musí to byť validný JSON. + - Nesmie obsahovať HTML tagy. + - Musí obsahovať povinné sekcie (napr. `seo`, `hero`, `sections`). + - Pri úspechu: + - Uloženie obsahu do projektu (`data/projects/.json` pod kľúč `content.generated`). + - Zmena stavu projektu na `content_ready`. + - Vymazanie alebo archivácia úlohy z `data/llm/`. + - Pri chybe: + - Inkrementácia `attempt_count`. + - Ak prekročený limit (3), stav projektu `failed`. + - Uloženie chyby do projektu. + +## Implementačné pravidlá +- Zabezpeč ochranu proti súbežnému spusteniu viacerých workerov na tej istej úlohe (atomic file operations). +- Loguj všetky dôležité udalosti (začiatok, koniec, chybu AI). + +## Súbory ktoré je potrebné vytvoriť +- `src/Services/LLMpool.php` + +## Súbory ktoré je potrebné upraviť +- `public/ajax.php` (môže spúšťať LLMpool synchrónne pre MVP ak nie je cron). + +## API a dátové štruktúry +Štruktúra `content.generated`: +```json +{ + "seo": { "title": "...", "description": "..." }, + "hero": { "headline": "...", "subheadline": "..." }, + "sections": { + "about": { "title": "...", "text": "..." }, + "services": [ { "title": "...", "description": "..." } ] + } +} +``` + +## Frontend požiadavky +Nerelevantné (worker beží na pozadí). + +## Backend požiadavky +- PHP 8.2. + +## Testovací scenár +1. Vlož manuálne úlohu do `data/llm/`. +2. Spusti `php src/Services/LLMpool.php`. +3. Sleduj logy a over, či sa projekt v `data/projects/` aktualizoval o vygenerovaný obsah. +4. Skús simulovať neplatný JSON od AI a over, či worker správne inkrementuje pokusy. + +## Definition of Done +- Worker spoľahlivo spracováva AI frontu. +- Výstup od AI je zvalidovaný a bezpečne uložený. +- Stavy projektu sa menia podľa priebehu generovania. + +## Obmedzenia +- Worker sa v MVP môže volať aj na konci `generateWebsite` requestu pre jednoduchosť, ak je DAIAPI rýchle. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step15.md b/docs/prompts/step15.md new file mode 100644 index 0000000..3894e11 --- /dev/null +++ b/docs/prompts/step15.md @@ -0,0 +1,67 @@ +# Krok 15 - Rendering Vrstva (Jadro a Baseline šablóna) + +## Kontext projektu +Renderer je PHP služba, ktorá z `wizard_data` a AI vygenerovaného obsahu vytvorí statický HTML web. Rendering layer je oddelená od content layer. + +## Pred implementáciou si preštuduj +- `docs/mvp.md` - Sekcia 4 (Rendering layer). +- `docs/architecture.md` - Sekcia 12 (Website Quality Requirements). + +## Cieľ +Vytvoriť základnú triedu `Renderer` a baseline HTML šablónu, ktorá bude slúžiť ako kostra pre generovaný web. + +## Požadované zmeny +1. Vytvorenie triedy `App\Services\Renderer` v `src/Services/Renderer.php`: + - Metóda `render(string $projectId): bool`. + - Načítanie dát projektu. + - Implementácia "tvrdého" HTML escapovania pre všetky texty z JSONu (`htmlspecialchars`). +2. Vytvorenie základnej šablóny `src/Templates/base.php`: + - Kompletná HTML5 štruktúra. + - Dynamické vkladanie SEO meta tagov (`title`, `description`, OpenGraph). + - Inklúzia CSS a JS súborov (relatívne cesty). + - Kontajner `
`, do ktorého sa budú vkladať sekcie. +3. Vytvorenie statických assetov pre export: + - `src/Templates/css/site.css` (základný reset a štruktúra). + - `src/Templates/js/site.js` (voliteľné pre interaktivitu). + +## Implementačné pravidlá +- Všetky URL v exporte musia byť relatívne. +- Renderer nesmie generovať žiadne inline štýly, ak to nie je nevyhnutné (napr. farby v :root). +- Striktné dodržanie sémantiky HTML5. + +## Súbory ktoré je potrebné vytvoriť +- `src/Services/Renderer.php` +- `src/Templates/base.php` +- `src/Templates/css/site.css` + +## Súbory ktoré je potrebné upraviť +Žiadne. + +## API a dátové štruktúry +Metóda `render` zapisuje výsledok do `exports//index.html`. + +## Frontend požiadavky +Nerelevantné (generovanie výstupu). + +## Backend požiadavky +- PHP 8.2 (použitie `ob_start()` / `ob_get_clean()` pre buffering šablón). + +## Testovací scenár +1. Spusti `Renderer::render()` pre projekt, ktorý má v `content.generated` základné SEO dáta. +2. Over, či vznikol súbor `exports//index.html`. +3. Over v prehliadači, či má stránka správny titulok a meta tagy. +4. Over, či je HTML kód čistý a správne escapovaný. + +## Definition of Done +- Renderer dokáže vytvoriť základnú HTML kostru webu. +- SEO metadáta sú správne namapované. +- Escapovanie je implementované na úrovni jadra. + +## Obmedzenia +- Žiadne externé template engine (ako Twig/Blade), použi čisté PHP šablóny. + +## Výstup +- zoznam vytvorených súborov +- zoznam upravených súborov +- stručné zhrnutie vykonaných zmien +- prípadné otvorené problémy diff --git a/docs/prompts/step16.md b/docs/prompts/step16.md new file mode 100644 index 0000000..5878a27 --- /dev/null +++ b/docs/prompts/step16.md @@ -0,0 +1,75 @@ +# Krok 16 - Rendering Vrstva (Obsahové Sekcie) + +## Kontext projektu +Po vytvorení HTML kostry je potrebné implementovať vykresľovanie jednotlivých sekcií webu (Hero, O nás, Služby, atď.) na základe AI dát. + +## Pred implementáciou si preštuduj +- `docs/mvp.md` - Sekcia 4 (Rendering layer). +- `docs/wizard.md` - Sekcia 11 (Website Quality Requirements). +- `docs/prompts/step15.md` - Core Renderer. + +## Cieľ +Implementovať šablóny pre jednotlivé sekcie webu a zabezpečiť ich dynamické vkladanie do výsledného HTML. + +## Požadované zmeny +1. Vytvorenie adresára `src/Templates/sections/`. +2. Implementácia PHP šablón pre sekcie: + - `hero.php` - Headline, subheadline, CTA tlačidlo. + - `about.php` - Titulok a text O nás. + - `services.php` - Zoznam služieb (karty). + - `pricing.php` - Cenník alebo balíky. + - `gallery.php` - Zobrazenie nahraných obrázkov. + - `faq.php` - Harmonika s otázkami a odpoveďami. + - `contact.php` - Kontaktné údaje a formulár. +3. Úprava `Renderer.php`: + - Logika pre iteráciu cez `wizard_data.modules.sections`. + - Inklúzia príslušných šablón sekcií. + - Odovzdávanie dát z `content.generated` do šablón. + +## Implementačné pravidlá +- Používaj sémantické HTML tagy (`
`, `
`, `
`, `