Markowe fonty lokalnie, wersjonowanie assetow, seed strony zgodny z dialektem CMS

This commit is contained in:
FDMTech
2026-10-11 15:02:42 +02:00
parent 193a55319a
commit e25691324a
11 changed files with 70 additions and 5 deletions
+23
View File
@@ -0,0 +1,23 @@
-- Seed v3 strony `home`: WYŁĄCZNIE elementy dozwolone dialektem CMS
-- (div/p/span/h1-h6/a/img/ul/ol/li/strong/em/table... — BEZ section/article/figure;
-- renderer Content::html usuwa niedozwolone elementy WRAZ Z ZAWARTOŚCIĄ).
UPDATE cms_pages SET
title = 'Strona główna',
draft_json = '{}',
draft_html = '',
draft_css = '',
draft_seo_title = 'FDMTech — monitoring produkcji | BlackBox Sensory, OEE',
draft_seo_description = 'Monitoring produkcji: rzeczywisty odczyt nakładu, czas pracy i przestoje maszyn, OEE i raporty. Urządzenie BlackBox Sensory.',
published_html = '<div class="hero" aria-labelledby="hero-title"><div class="hero-inner"><div><h1 id="hero-title">Porządek w pomiarach Twojej produkcji</h1><p class="hero-lede">FDMTech buduje <strong>BlackBox Sensory</strong>, licznik produkcji przy maszynie. Zlicza sztuki z czujników, zapisuje je z czasem i pokazuje, kiedy maszyna pracuje, a kiedy stoi.</p><p class="hero-actions"><a class="btn btn-primary" href="/kontakt">Zapytaj o bezpłatny audyt</a><a class="btn btn-ghost" href="#pomiary">Zobacz, co mierzy BlackBox</a></p></div></div></div><div class="wrap"><div class="section" id="pomiary" aria-labelledby="pomiary-title"><h2 id="pomiary-title">Co mierzy BlackBox</h2><p>BlackBox Sensory zlicza impulsy z czujników przy maszynie i zamienia je na sztuki. Z pomiaru powstają liczba produkcji, tempo, czas pracy i przestoje.</p><ul class="measure-list"><li><h3>Liczba sztuk</h3><p>Impulsy z czujnika optycznego lub enkodera, przeliczone na sztuki. Licznik całkowity i licznik sesji.</p></li><li><h3>Takt i tempo</h3><p>Odstępy między impulsami dają takt maszyny i tempo w sztukach na godzinę, do porównania z normą.</p></li><li><h3>Praca i przestoje</h3><p>Strumień impulsów rozróżnia pracę od postoju. Przerwy w sygnale trafiają do rejestru z czasem trwania.</p></li><li><h3>Znacznik czasu</h3><p>Każdy odczyt niesie czas, więc wracasz do konkretnej zmiany, godziny i nakładu.</p></li></ul></div><div class="section" aria-labelledby="druk-title"><div class="print-grid"><div><h2 id="druk-title">Drukarnie i powtarzalna produkcja książek</h2><p>Ten sam tytuł wraca po miesiącach — porównaj tempo i przestoje z poprzednim nakładem zamiast zgadywać.</p><ul><li>Ten sam zestaw pomiarów dla pierwszego nakładu i dodruku.</li><li>Liczba sztuk i tempo z czasem, do własnej dokumentacji partii.</li><li>Audyt zaczyna się od Twoich potrzeb, nie od cennika.</li></ul></div><div><h2>Od czego zacząć</h2><p>Opowiedz, co produkujesz i co chcesz sprawdzać. Oddzwaniamy z propozycją rozmowy.</p><p><a href="/kontakt">Umów bezpłatny audyt</a></p></div></div></div><div class="audit-band" aria-labelledby="audyt-title"><div><h2 id="audyt-title">Bezpłatny audyt</h2><p>Zapytanie trafia do zespołu FDMTech. Odpowiadamy zwykle w ciągu jednego dnia roboczego.</p></div><a class="btn btn-primary" href="/kontakt">Przejdź do formularza</a></div><div class="section" aria-labelledby="kontakt-title"><h2 id="kontakt-title">Kontakt</h2><p>FDMTech Bartosz Pulchny, Krakowska 67/1, 71-017 Szczecin, NIP 852-251-80-36, tel. <a href="tel:+48533873555">533 873 555</a>. Pełny formularz na stronie <a href="/kontakt">Kontakt</a>.</p></div></div>',
published_css = '.hero-inner{grid-template-columns:1fr;max-width:56rem}',
published_title = 'FDMTech — monitoring produkcji',
seo_title = 'FDMTech — monitoring produkcji | BlackBox Sensory, OEE',
seo_description = 'Monitoring produkcji: rzeczywisty odczyt nakładu, czas pracy i przestoje maszyn, OEE i raporty. Urządzenie BlackBox Sensory.',
status = 'published',
published_at = UTC_TIMESTAMP(),
version = 3,
updated_by = 1,
updated_at = UTC_TIMESTAMP()
WHERE slug = 'home';
INSERT INTO cms_revisions (page_id, version, snapshot_json, created_by, created_at)
SELECT id, 3, '{}', 1, UTC_TIMESTAMP() FROM cms_pages WHERE slug = 'home';
+1 -1
View File
@@ -25,4 +25,4 @@ Formularz aplikacji dostępny pod `/kontakt` (trasa zarezerwowana, zawsze dział
`APP_DEMO=true` w środowisku/.env uruchamia dane demonstracyjne bez łączenia z DB. Domyślnie false. Demo otrzymuje `noindex, nofollow`. Awaria DB w produkcyjnym trybie zawsze zwraca 503. Brak home.php: semantyczna strona demo aplikacji. Brak layout.php: techniczny dokument HTML z globalną nawigacją i stopką z `app/View.php`, bez prac nad stylistyką.
Zasoby lokalne `/assets/...`. CSP blokuje skrypty publikacji, inline event handlers, zewnętrzne skrypty, iframes i obiekty. Obrazy HTTPS są dopuszczone (media CMS muszą być publicznie dostępne). Nie używać inline style w home; CSS projektanta pozostaje w site.css.
Zasoby lokalne `/assets/...` (wersjonowane query `?v=N`, bo serwer wysyła długi cache). CSP blokuje skrypty publikacji, inline event handlers, zewnętrzne skrypty, iframes i obiekty. Obrazy HTTPS są dopuszczone (media CMS muszą być publicznie dostępne). Nie używać inline style w home; CSS projektanta pozostaje w site.css. Fonty marki wyłącznie lokalnie w `/assets/fonts/` (latin-ext obowiązkowo); brak ładowania z Google Fonts.
+2 -2
View File
@@ -54,12 +54,12 @@ final class View
. '<title>' . $e($meta['title']) . '</title><meta name="description" content="' . $e($meta['description']) . '">'
. '<meta name="robots" content="' . $e($meta['robots']) . '">'
. ($meta['canonical'] !== '' ? '<link rel="canonical" href="' . $e($meta['canonical']) . '">' : '')
. '<link rel="stylesheet" href="/assets/css/site.css">' . $cmsStyleTag . '</head><body>'
. '<link rel="stylesheet" href="/assets/css/site.css?v=2">' . $cmsStyleTag . '</head><body>'
. '<header><a href="/">' . $e($site['name']) . '</a><nav aria-label="Nawigacja główna">' . $navigation . '</nav></header>'
. $content . '<footer><p>' . $e($site['name']) . '</p>'
. ($site['contact_email'] !== '' ? '<a href="mailto:' . $e($site['contact_email']) . '">' . $e($site['contact_email']) . '</a>' : '')
. ($site['contact_phone'] !== '' ? '<p>' . $e($site['contact_phone']) . '</p>' : '')
. '</footer><script src="/assets/js/site.js" defer></script></body></html>';
. '</footer><script src="/assets/js/site.js?v=2" defer></script></body></html>';
}
public static function form(array $data): string
+42
View File
@@ -1,4 +1,46 @@
/* FDMTech — warstwa projektanta. Jasne tło robocze, decyzyjny teal, sygnał limonki. */
@font-face {
font-family: "Bricolage Grotesque";
src: url("../fonts/bricolage-800.woff2") format("woff2");
font-weight: 800;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bricolage Grotesque";
src: url("../fonts/bricolage-700.woff2") format("woff2");
font-weight: 700;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "Bricolage Grotesque";
src: url("../fonts/bricolage-500.woff2") format("woff2");
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "DM Sans";
src: url("../fonts/dmsans-400.woff2") format("woff2");
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "DM Sans";
src: url("../fonts/dmsans-500.woff2") format("woff2");
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: "DM Sans";
src: url("../fonts/dmsans-700.woff2") format("woff2");
font-weight: 700;
font-style: normal;
font-display: swap;
}
:root {
--teal: #102c32;
--teal-deep: #0b2025;
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -16,7 +16,7 @@ $isError = ($statusCode ?? 200) >= 400;
<?php if (($meta['canonical'] ?? '') !== '') : ?>
<link rel="canonical" href="<?= $e($meta['canonical']) ?>">
<?php endif; ?>
<link rel="stylesheet" href="/assets/css/site.css">
<link rel="stylesheet" href="/assets/css/site.css?v=2">
<?= $cmsStyleTag ?>
<link rel="icon" type="image/svg+xml" href="/assets/img/logo-pulse.svg">
</head>
@@ -81,6 +81,6 @@ $isError = ($statusCode ?? 200) >= 400;
<span>BlackBox Sensory to nazwa produktu FDMTech.</span>
</div>
</footer>
<script src="/assets/js/site.js" nonce="<?= $e($nonce ?? '') ?>" defer></script>
<script src="/assets/js/site.js?v=2" nonce="<?= $e($nonce ?? '') ?>" defer></script>
</body>
</html>