Zakladne ukony
komunikacia a generovanie kodu
- Vzdy komunikujk somnou v slovenskom jazyku.
- Kod, a komentare k nemu pis vyhradne v anglickom jazyku
- Vsetky funkcionality vyvyjaj metodou TDD, rozhodni ci stacia unit testy, alebo treba integracne
- Pouzivame php 8.5 a preto vyuzivaj vsetky jeho features
- Pouzivame najnovisie symfony verziu a preto vyuzivaj vsetky jeho features
- Vzdycky ked zapracujes niejaky zasadnu vec to systemu, poznac si do suboru .junie/guidelines.md velmi strucne co za funkcionalitu si spravil. aby o nej vedel pri dalsej praci. ale pis tam len podstatne architektonicke zmeny, nie bezne veci.
CSS & Twig Component Štandard 2026
Tento dokument definuje pravidlá pre organizáciu súborov a písanie kódu pre Symfony Twig komponenty. AI musí pri generovaní komponentov striktne dodržiavať túto adresárovú štruktúru a metodiku kódovania.
1. Adresárová štruktúra komponentov
Všetky Twig komponenty sa nachádzajú v priečinku src_component/. Každý komponent má vlastný podpričinok rozdelený podľa kategórie (napr. Layout, UI, Form).
Na generovanie tejto štruktúry používaj command php bin/console make:sdc-component Layout:Hero a pridaj parameter --stimulus pokiaľ potrebujeme stimulus controller.
Vzorová štruktúra (príklad Hero):
src_component/
Layout/
Hero/
Hero.php # Logika komponentu (Twig Component class)
Hero.html.twig # Šablóna (Template)
Hero_controller.js # Stimulus kontrolér (ak je potrebný)
Hero.css # Štýly špecifické pre tento komponent
namespace App\Component\Layout\Hero;
use Tito10047\UX\TwigComponentSdc\Attribute\AsSdcComponent;
#[AsSdcComponent('Layout:Hero')]
final class Hero {
}
2. Pravidlá pre písanie CSS v komponente
Pri písaní štýlov v súbore Hero.css (alebo akomkoľvek inom komponentovom CSS) musí AI dodržiavať tieto pravidlá:
A. Zapuzdrenie (Scoping)
Všetky štýly v súbore komponentu musia byť obalené v hlavnej triede komponentu (Block v metodike CUBE), aby sa zabránilo úniku štýlov do globálneho priestoru.
- Pravidlo: Používaj názov komponentu ako hlavný selektor.
- Technológia: Používaj natívny CSS Nesting.
B. Vrstvy kaskády (@layer)
Všetky komponentové štýly musia patriť do vrstvy components. Tým sa zabezpečí, že utility triedy (vrstva utilities) ich môžu v prípade potreby prebiť.
C. CUBE CSS Metodika v rámci súboru
- Block (B): Definuj vizuál komponentu (farby, border, fonty).
- Exception (E): Stavy (napr.
[data-state="active"]) definuj vo vnútri bloku. - Composition (C): Ak komponent vyžaduje špecifický vnútorný layout, rieš ho tu.
Príklad správne napísaného Hero.css:
D. Dark mode
pre vsetky komponenty musi byt spravena aj dark verzia. pouzi uz existujuce premenne
@layer components {
/* Hlavný blok komponentu */
.hero {
position: relative;
padding-block: var(--space-xl);
background: var(--color-surface);
/* Vnútorné elementy pomocou nestingu */
& .hero__title {
font-size: var(--size-step-3);
line-height: 1.1;
}
/* Výnimky/Stavy pomocou data-atribútov */
&[data-variant="dark"] {
background: var(--color-dark);
color: var(--color-white);
}
}
}
Stimulus controller
Nazov stimulus controllera ziskas tak ze pouzijes trait App\Component\Trait\Stimulus a jeho twig premennu {{ controller }}
pouzivaj stimulus ctargety takto data-{{ controller }}-target="content" a data-action="click->{{ controller }}#expand"
4. Turbo Štandard
Symfony UX Turbo je integrované a aktívne (Turbo Drive).
A. Turbo Frames
- Používaj pre nezávislé časti stránky, ktoré sa majú aktualizovať samostatne.
- ID rámu musí byť unikátne:
<turbo-frame id="frame_{{ component_id }}">. - Ak odkaz/formulár nemá meniť rám, použi
data-turbo-frame="_top".
B. Turbo Streams
- Používaj pre komplexnejšie zmeny (napr. pridanie položky do zoznamu, zobrazenie notifikácie).
- Šablóny streamov pomenuj s príponou
.stream.twig. - Podporované akcie:
append,prepend,replace,update,remove,before,after.
C. Turbo Drive
- Pre vypnutie Turba na špecifickom odkaze/formulári použi
data-turbo="false". - Pri inicializácii JS knižníc tretích strán použi event
turbo:loadnamiestoDOMContentLoaded.
5. Implementácia v Twig & PHP
- HeroComponent.php: Musí odkazovať na správnu šablónu
HeroHtml.twig. - HeroHtml.twig: - Hlavný element musí mať triedu zhodnú s názvom CSS bloku (napr.
class="hero"). - moze obsahovať atribút pre Stimulus kontrolér:
{{ attributes.defaults({ 'data-controller': controller }) }}. - Triedy zapisuj v CUBE formáte:
<div class="[ hero ] [ l-stack ] {{ classes|default('') }}">.
Inštrukcia pre AI: 1. Pri vytváraní nového komponentu vygeneruj všetky 3 súbory (PHP, Twig, CSS) podľa vyššie uvedenej štruktúry. JS generuj len ak je potrebne.
2. Vždy používaj @layer components a natívny nesting.
3. CSS píš tak, aby bolo nezávislé a znovupoužiteľné, pričom sa spoliehaj na globálne CSS premenné (variables).
4. Design Tokens Metodika: V projekte rozlišujeme dva typy premenných:
- Tokeny (Primitíva): Prefix --clr- (napr. --clr-bureau-blue). Definujú fixné surové hodnoty. Nepoužívaj ich priamo v komponentoch, ak existuje sémantický ekvivalent.
- Sémantika (Systém): Prefix --color- (napr. --color-primary, --color-surface). Tieto sa menia podľa témy (light/dark). Komponenty by mali primárne používať tieto premenné.
Obrazky
Obrazky pridavame pomocou komponenty tito10047/progressive-image-bundle tymto stylom:
<twig:pgi:Image
src="images/hero.jpg"
sizes="sm:12 md:6@landscape lg:[100%]@square xl:[500x600]"
alt="Responsive hero image"
:preload="false"
/>
pricom ratia si definujeme v
progressive_image:
responsive_strategy:
ratios:
landscape: "16/9"
portrait: "3/4"
square: "1/1"
breakpointy pozname xs,sm,md:,lg,
Názvoslovie (Hierarchia)
- Ministerstvo (Ministry) (Celý web – Ministerstvo Satiry)
- Odbor (Department) (Tých tvojich 5 hlavných kategórií, napr. Odbor domáceho chaosu)
- Referát (Section) (Konkrétna téma, napr. Referát stratených lyžičiek)
- Konanie (Proceeding) (Konkrétny typ listu/priestupku, ktorý si človek vyberie)
- Podnet / Prípad (Case) (Konkrétna objednávka od zákazníka)
Databáza
- mygrácie psúštame pomocou príkazu
php bin/console doctrine:migrations:migrate --backup --no-interaction. ak migracia padne, treba zmazat vsetky tabulky v databazy a nahrat ich spat zo zalohy. nikdy sa nesnaz opravovat poskodenu databazu z padnutej migracie - entity generuj prikazom
php bin/console make:entity <NazovEntity> --no-interaction - sql na databazu musis pustat tymto commandom
php bin/console doctrine:query:dql
Spomienky
- implementovaná podpora pre
generate_promt: truev konfigurácii generovania obrázkov. Ak je voľba aktívna, pôvodný prompt sa najprv spracuje pomocouAiServiceInterface::generateText()a výsledok sa použije na generovanie obrázka. - implementované flash správy (
FlashMessagekomponent) s automatickým skrývaním a CUBE CSS štýlovaním, vložené globálne do layoutu. - implementované rozhranie
AiServiceInterfacepre generovanie textu a obrázkov. Predvolený poskytovateľ zmenený z OpenAI na Google Nano Banana (GeminiAiServices modelomgemini-2.5-flash-image).GeminiAiServiceautomaticky určuje optimálneaspectRatioaimageSize(1K, 2K, 4K) na základe požadovaných rozmerov podľa špecifikácie Google API.
- v subore TwigComponentCssListener.php sa do hlavicky requesty vkladaju styly
- implementovany VichUploaderBundle pre logo oddelenia
- ProceedingsComponent: implementovany algoritmus pre dynamicky layout gridu (colspan/rowspan) pomocou striedajucich sa patternov tak, aby bol posledny riadok vzdy vyplneny. Vyčlenený do samostatnej služby ProceedingsLayoutCalculator.
- ProceedingComponent: implementovaná detekcia pretečenia obsahu cez Stimulus a dynamické zvyšovanie
rowspan/colspans animáciou cez View Transitions API. - HeaderComponent: implementované hamburger menu pre mobilné zobrazenie pomocou Stimulus kontroléra a natívneho CSS nestingu.
- ButtonComponent: univerzálny komponent pre tlačidlá s podporou pre ikony (vrátane animovanej pečiatky), veľkosti, farby a click animácie.
- View Transitions API: implementované plynulé prechody pri navigácii z homepage na detail oddelenia pre názov a popis (sect-title-{id}, sect-desc-{id}). Keďže používame Turbo 7, integrácia je riešená manuálne cez event
turbo:before-rendervassets/app.js. - OpenAiService: implementovaná služba na generovanie textu (GPT-4o mini) a obrázkov (DALL-E 3) pomocou
openai-php/clients konfiguráciou cez autowiring environmentálnych premenných. - AudioHelper: vyčlenená spoločná logika pre prácu so zvukom (fade, random start, duration, speed) do
assets/utils/audio_helper.js. Implementovaná metódastop()na bezpečné zastavenie zvuku a vyčistenie intervalov. - implementovaná entita
SiteSettinga službaAppSettingspre globálne nastavenia webu.SiteSettingpoužíva objektový prístup (jeden riadok v DB) s fixnými poliami (napr.homepageHeroImage) a variabilným JSON poľomsettings.- Služba
AppSettingspodporuje caching a transparentný prístup k nastaveniam cezget($key).
- pridaný univerzálny command
app:generate:imagesna generovanie hero obrázkov pre oddelenia (section) and fotiek vedúcich pre odbory (department) pomocou AI (DALL-E 3 a GPT-4o mini). Prerobený na CQRS (odosielaGenerateEntityImagesCommand, ktorý následne odosielaGenerateImageCommand). - implementovaný vlastný LiipImagine filter
transparent, ktorý nahradí farbu na pozícii 1x1 (pixel [0,0]) transparentnosťou s nastaviteľným tresholdom. Používa natívnuimagickknižnicu pre maximálnu efektivitu. Registruje sa cezApp\Imagine\Filter\Loader\TransparentFilterLoader. - SectionCrudController: pridané tlačidlo "View Proceedings", ktoré presmeruje na zoznam konaní vyfiltrovaných pre danú sekciu.
- Implementované AI generovanie údajov pre konanie (Proceeding):
- Pridaný
GenerateProceedingDataCommanda jeho handler pre asynchrónne spracovanie cez Messenger. - AI generuje kompletné dáta vrátane požiadaviek (ProceedingRequirement) na základe zadanej témy a sekcie.
- Pole
intendedForv entiteProceedingzmenené naJSONpole, upravená administrácia a šablóna pre zobrazenie zoznamu. - Integrované do administrácie sekcií cez vlastnú akciu a formulár na zadanie témy.
- Pridaný
- Implementované hromadné navrhovanie konaní (Bulk Proceeding Suggestion):
- V
SectionCrudControllerpribudla akcia AI Bulk Suggest Proceedings (ikona žiarovky). - AI synchrónne navrhne témy konaní na základe kontextu sekcie.
- Výsledok sa nezapisuje priamo, ale vloží sa do formulára
generate_proceeding_form, kde ho môže administrátor upraviť pred odoslaním na finálne vygenerovanie dát (cez Messenger).
- V
- Pole
typev entiteProceedingTagbolo zmenené na enumProceedingTagType(perpetrator, location, intensity). - Implementovaná administrácia pre
ProceedingTaga jej prepojenie vProceedingCrudControllercezAssociationFields podporou autocomplete a filtrovania.