4.7 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Projekt áttekintés
Ez egy Discourse fórum téma komponens a Nyíltvilág magyar technológiai közösség számára. Egy egyedi üdvözlő bannert hoz létre, amely csak a főoldalon jelenik meg, és tartalmaz egy hero szekciót keresési funkcióval és kategória navigációs kártyákkal.
Architektúra
Komponens felépítés
A téma komponens három fő fájlból áll:
- index.html - HTML sablon az üdvözlő bannerhez (statikus tartalom)
- script.js - Discourse API inicializáló, amely kezeli:
- Az oldal láthatóságának váltását (csak a főoldalon jeleníti meg a bannert)
- Az egyedi keresőmező renderelését és integrációját a Discourse SearchMenu-jével
- Mobil detektálást és feltételes renderelést
- style.css - Reszponzív stílusok CSS változókkal
Kulcsfontosságú technikai minták
Discourse Plugin API integráció
- Az
apiInitializer-t használja adiscourse/lib/api-ból (modern megközelítés) - Az
api.onPageChange()hookra csatlakozik, hogy URL alapján mutassa/rejtse a bannert - Integrálódik a Discourse natív
SearchMenukomponensével azapi.openSearchMenu()segítségével
Keresési integráció mintája Az egyedi keresőmező a hero szekcióban így működik:
- Egyedi input mező renderelése a
.search-containerkonténerbe - Fókuszáláskor/bevitelkor a Discourse natív SearchMenu megnyitása
- Értékek szinkronizálása az egyedi input és a natív
.search-menu input.search-queryközött - Űrlap beküldés delegálása a Discourse keresési űrlapjához
Idempotens renderelés
A renderSearchInput() függvény ellenőrzi, hogy a keresőmező már létezik-e, mielőtt létrehozná, így megakadályozza a duplikált elemeket, amikor az API többször is alkalmazza az inicializálót.
Mobil kezelés
A keresési funkció le van tiltva mobilon (az isMobileView() függvényen keresztül), hogy elkerülje az ütközéseket a Discourse mobil felületével.
Kód minőség és best practice-ek
- Következetes arrow function használat
- Angol osztálynevek és kommentek a nemzetközi standardok szerint
- Optimalizált renderelés egyetlen
requestAnimationFramehívással - Accessibility támogatás (
role="search",aria-labelattribútumok)
Fontos implementációs részletek
Oldal láthatósági logika (script.js:4-13)
- A banner csak akkor jelenik meg, ha
url === "/" - Minden más oldalon a banner rejtve van
display: nonesegítségével
Keresés szinkronizáció (script.js:54-60)
- Az egyedi input értéke szinkronizálva van a Discourse SearchMenu inputjával
- A Discourse natív keresési funkcióját
inputesemény kiváltásával aktiválja - Egyesített event handler (
handleSearchInteraction) a duplikált kód elkerülésére
Optimalizált renderelés (script.js:90-99)
- Egyetlen
requestAnimationFramehívás a többszörös kísérlet helyett - Biztosítja, hogy az elem létezzen akkor is, ha a DOM nem teljesen készen áll
CSS architektúra
Reszponzív töréspontok
- Asztal: 1100px+
- Tablet: 900-1099px
- Mobil: <900px
Grid elrendezés
- A hero CSS Grid-et használ névvel ellátott területekkel:
"content"és"search" - A CTA (Call-To-Action) kártyák reszponzív gridet használnak: 1 oszlop (mobil), 2 oszlop (500px+), 4 oszlop (1510px+)
- Optimalizált grid oszlopok
1fregységekkel a feleslegescalc()helyett
Kulcsfontosságú CSS változók
--primary-color: #e81f2d
--page-bg: #14191f
--card-bg: #1b2028
--text-color: #ddd
Fejlesztési megjegyzések
Komponens tesztelése:
- A módosítások megtekintése a fórum főoldalára navigálva (/)
- Oldal láthatóság tesztelése más URL-ekre navigálva
- Keresés tesztelése az egyedi keresőmezőbe való fókuszálással/gépelés (csak asztalon)
Gyakori módosítások:
- Üdvözlő szöveg frissítése: index.html 6-20. sor szerkesztése
- CTA kártyák hozzáadása/eltávolítása: index.html 27-102. sor módosítása
- Stílusok módosítása: style.css változók vagy szelektorok módosítása
- Keresési viselkedés módosítása: script.js
renderSearchInput()függvény (18-88. sor)
Osztálynevek konvenciói:
.search-container- Fő kereső konténer.search-wrapper- Keresőmező wrapper elem.search-input- Keresőmező input elem.cta-*- Call-To-Action kategória kártyák.hero-*- Hero szekció elemei- Angol osztálynevek következetesen használva
Discourse API verzió:
Ez a komponens a modern apiInitializer mintát használja. Régebbi Discourse verziókkal való munka esetén szükség lehet a withPluginApi használatára helyette.