# BRIEF_FrontendDesign — publiczny serwis FDMTech
## 1. Cel
Publiczny serwis FDMTech prezentuje firmę i produkt BlackBox Sensory.
FDMTech to marka firmy. BlackBox Sensory to nazwa produktu.
Serwis nie ujawnia telemetrii ani adresu panelu Sensory.
Tryb `APP_DEMO=true` służy wyłącznie odbiorowi wizualnemu.
## 2. Logotypy
Dwa warianty, każdy w wersji kolorowej i monochromatycznej.
Pliki: `public/assets/img/logo-pulse.svg`, `logo-pulse-mono.svg`,
`logo-counter.svg`, `logo-counter-mono.svg`.
Nagłówek używa wariantu impulsowego jako inline SVG.
### Wariant A — impuls / puls (główny)
Znak nawiązuje do liczenia pomiarów. Ciemne pole `#102C32`,
linia sygnału w kolorze limonki `#D7F171` z trzema pikami
rysowanymi jednym pociągnięciem. Obok napis FDMTech.
Wersja mono: jeden kolor `currentColor`, bez tła.
### Wariant B — geometryczny monogram „F" / licznik
Litera F zbudowana z modułów licznika. Poprzeczka F to rząd
trzech pól, w tym jedno w kolorze limonki. Koło licznika
w dolnym ramieniu. Wersja mono: sam obrys, `currentColor`.
Zasady: nie zmieniamy proporcji, nie dodajemy cieni,
nie umieszczamy znaku na zdjęciach bez kontrastu.
Minimalna wysokość 24 px.
## 3. Layout (`templates/layout.php`)
Pełny dokument HTML `lang="pl"`. Renderer przekazuje `$content`
jako `…`, layout dodaje nagłówek,
`= $content ?>`, stopkę i lokalny JS.
- SEO: `$meta` title, description, canonical, robots przez `$e`.
- Style CMS: `$cmsStyleTag` w head bez zmian.
- Arkusz projektanta: `/assets/css/site.css`.
- Skrypt: `/assets/js/site.js` z `defer`, bez inline handlerów.
- Nagłówek: logo inline SVG, nazwa z `$site['name']`,
nawigacja z `$site['navigation']` (etykieta i URL przez `$e`),
przycisk mobilny `aria-expanded` + `aria-controls`.
- Tryb demo: oznaczenie dokłada renderer jako `aside[role=note]`;
layout dokłada atrybut `data-demo` na `body` i nie dubluje paska.
- Stan HTTP: `$statusCode` różnicuje tytuł błędu, layout działa
też dla 404/503 i formularza `/kontakt`.
- Stopka: dane firmy FDMTech Bartosz Pulchny, Krakowska 67/1,
71-017 Szczecin, NIP 852-251-80-36, tel. 533 873 555.
Adres e-mail pomijamy w całości, bo dostarczalność
kontakt@fdmtech.pl nie została potwierdzona. Kontakt
z `$site` renderujemy tylko gdy CMS poda niepusty e-mail
lub telefon. Zero adresów panelu Sensory w całym serwisie.
- Dostępność: skip-link, widoczny focus, nawigacja klawiaturą,
`aria-current="page"` dla aktywnej pozycji.
## 4. Strona główna (`templates/home.php`)
Fragment bez własnego `` i bez ID `cms-content`.
Używana wyłącznie jako jawne demo `/` przy `APP_DEMO=true`.
Produkcyjna strona główna pochodzi z publikacji slug `home`.
Sekcje:
1. Hero: nagłówek o wsparciu firm produkcyjnych, krótki opis,
dwa CTA (`/kontakt`, kotwica do pomiarów), panel licznika
z trzema liczbami oznaczonymi „demonstracyjne".
2. Co mierzy BlackBox: lista pomiarów środowiskowych i
produkcyjnych, bez obietnic wyników.
3. Drukarnia i powtarzalna produkcja książek: stabilność
parametrów między nakładami, zapis odczytów, rozmowa
o audycie zamiast gwarancji.
4. Bezpłatny audyt: CTA prowadzi wyłącznie na `/kontakt`
jako źródło zapytania (`source=home`, potem `source=audit`
na stronie formularza). Brak cen i gwarancji.
5. Formularz kontaktowy home: POST `$formAction`, hidden
`_csrf=$csrfToken` i `source=home`, pola name, email,
company, phone, message, checkbox `consent=1`, honeypot
`website` ukryty. Błędy z `$formErrors`, wartości
z `$formValues`, stan z `$formStatus`, w demo przycisk
zablokowany i komunikat 503 bez fikcyjnego sukcesu.
6. Podsumowanie kontaktu: adres, NIP, telefon, link `/kontakt`.
Bez adresu e-mail.
Copy uczciwe: liczby demonstracyjne oznaczone, brak
wyników, gwarancji i cen. Bezpłatny audyt opisany jako
rozmowa i zapytanie, nie usługa z ceną.
## 5. Zasoby
- `public/assets/css/site.css`: tokeny, typografia, layout,
responsywność 390 px / 1440 px, `prefers-reduced-motion`,
kontrast AA (tekst na teal i mist sprawdzony).
- `public/assets/js/site.js`: szuflada nawigacji mobilnej,
`aria-expanded`, zamykanie na Escape, drobne usprawnienia
progresywne (aktywna pozycja nav, rok w stopce).
Bez inline handlerów, ładowany z `defer`.
- Czcionki: stosy `"Bricolage Grotesque"` i `"DM Sans", Inter`,
fallback systemowy. Bez zewnętrznych dostawców fontów,
bo CSP dopuszcza tylko `font-src 'self'`; pliki woff2
można dołożyć później do `/assets/fonts/`.
Paleta z portalu firmowego Sensory:
teal `#102C32`, limonka `#D7F171`, mgła `#EEF2EF`,
koral `#F47F5F`. Tło jasne (scena: czytanie oferty w dzień),
teal na nagłówek, stopkę i powierzchnie decyzyjne.
## 6. Treści demo
Wszystkie liczby na home oznaczone „demonstracyjne".
Formularz w demo nie zapisuje. SEO w demo: `noindex, nofollow`.
Zakaz: adresy panelu Sensory, adresy e-mail poza danymi
z `$site`, wyniki, gwarancje, ceny.
## 7. Zużycie zmiennych kontraktu
- layout: `$site`, `$meta`, `$content`, `$cmsStyleTag`,
`$isDemo`, `$statusCode`, `$nonce`, `$e`.
- home: `$site`, `$page`, `$isDemo`, `$formAction`,
`$csrfToken`, `$formValues`, `$formErrors`, `$formNotice`,
`$formStatus`, `$e`.
- `$cmsHtml` zużywa renderer przy składaniu `$content`.
- `$smtpStatus` (`disabled`) opisany w briefie i stopce
formularza: brak obietnicy wysyłki e-mail.
## 8. Weryfikacja
1. `php -l` dla `templates/layout.php` i `templates/home.php`.
2. Smoke test: `APP_DEMO=true php -S 127.0.0.1:8099 -t public`
oraz GET `/` i `/kontakt`, sprawdzenie 200 i fraz.
3. `grep -Rni sensory\|cms-media\|panel public templates`
poza `DOCS` i `app`: brak wycieków URL panelu.
4. Zrzuty desktop + mobile, jeśli dostępne narzędzia przeglądarki.
5. Kontrola kontrastu i nawigacji klawiaturą.
## 9. Decyzja projektowa (th frontend-design / impeccable)
Teza: strona miernika, nie agencji. Pierwszy widok pokazuje
licznik, nie kartę z metryką. Świat: ciemny teal warsztatu,
limonka sygnału, papierowa mgła treści. Ryzyko: mocny teal
hero zamiast jasnego szablonu SaaS.