Damit die Abteilungen das Wappen selbst holen können, statt jedes Mal zu fragen: drei Varianten (farbig, einfarbig schwarz, einfarbig weiß) in SVG, PDF, PNG und JPG, dazu ein ZIP über alles und die Vereinsfarben. Verlinkt nur in der Fußzeile. Bisher lag das Logo genau einmal im Projekt, als eine einzige SVG. Es gab kein PNG, kein JPG, kein PDF und keine einfarbige Fassung. bin/logo-build.php erzeugt alle Dateien aus einer Master-SVG unter storage/logo-quellen/. Gerastert wird mit headless Chrome, weil GD kein SVG lesen kann und weder Inkscape noch rsvg-convert noch ImageMagick verfügbar sind; das PDF ist dabei echter Vektor. Das Skript läuft einmalig lokal, nichts davon im Request-Pfad. bin/preflight.php meldet als Fehler, wenn eine Download-Datei fehlt: die Komponente ließe den Knopf sonst still weg. Die beiden einfarbigen Fassungen sind exakte Negative voneinander, nur Linien, alle Flächen frei. EPS gibt es bewusst nicht, dafür fehlt jedes Werkzeug; SVG und PDF decken die Druckereien ab. Frühere Vereinslogos sind vorbereitet, aber im Projekt liegt bisher kein einziges historisches Wappen vor. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J9mubC8gtpjtJntbhSJBRS
97 lines
4.2 KiB
PHP
97 lines
4.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* Logo zum Herunterladen. Inhalt: data/logo.json.
|
|
* Struktur: Hero → Varianten mit Downloads (samt ZIP-Knopf) → Farben → frühere Logos.
|
|
*
|
|
* Bewusst KARG (Entscheidung Felix, 17.09.2026): Einleitungstext, Nutzungshinweis,
|
|
* Abschnittsüberschrift und FAQ waren gebaut und sind wieder raus. Eine Downloadseite
|
|
* ist ein Regal, kein Text: Wappen, Knöpfe, Farben. Wer etwas fragen will, findet den
|
|
* Weg über die Fußzeile. Die Überschrift steht noch im DOM, aber visually-hidden,
|
|
* damit die Heading-Kette nicht von h1 auf h3 springt.
|
|
*
|
|
* Die DATEIEN erzeugt bin/logo-build.php nach public/assets/downloads/logo/; diese Seite
|
|
* kennt nur die Variantenschlüssel und liest Größen beim Rendern von der Platte.
|
|
*/
|
|
$page = json_load('logo');
|
|
|
|
$zip = 'downloads/logo/tsv08-kulmbach-logo-paket.zip';
|
|
$zipFile = PUBLIC_PATH . '/assets/' . $zip;
|
|
$zipSize = is_file($zipFile) ? number_format(filesize($zipFile) / 1024 / 1024, 1, ',', '.') . ' MB' : '';
|
|
|
|
// Farbfläche über eine Klasse, nie über ein style-Attribut: die CSP verwirft Inline-Styles
|
|
// in Produktion stillschweigend. Die Klasse holt sich den Wert aus dem Token in tokens.css,
|
|
// die JSON nennt nur den Namen. Unbekannte Namen fallen still weg.
|
|
$farbKlassen = ['accent' => 'accent', 'black' => 'black', 'bg' => 'bg', 'white' => 'white'];
|
|
|
|
$meta = [
|
|
'title' => 'Logo herunterladen',
|
|
'description' => 'Unser Vereinswappen zum Herunterladen: als Vektor für die Druckerei, als PNG und JPG für Dokumente und Aushänge, dazu unsere Vereinsfarben.',
|
|
'og_image' => 'downloads/logo/tsv08-kulmbach-logo-farbig-1000.jpg',
|
|
'schema' => page_schema([
|
|
['name' => 'Startseite', 'slug' => ''],
|
|
['name' => 'Der Verein', 'slug' => 'verein'],
|
|
['name' => 'Logo herunterladen', 'slug' => 'logo'],
|
|
]),
|
|
];
|
|
|
|
component('hero', ['hero' => $page['hero']]);
|
|
?>
|
|
<?php
|
|
component('logo-downloads', [
|
|
'varianten' => $page['varianten'] ?? [],
|
|
'title' => $page['varianten_title'] ?? 'Das aktuelle Wappen',
|
|
'title_hidden' => true,
|
|
'anchor' => 'varianten',
|
|
'paket' => $zipSize === '' ? [] : [
|
|
'label' => $page['paket']['label'] ?? 'Alle Dateien als ZIP',
|
|
'href' => asset($zip),
|
|
'meta' => 'ZIP, ' . $zipSize,
|
|
],
|
|
]);
|
|
?>
|
|
<?php if (!empty($page['farben']['items'])): ?>
|
|
<section class="section logo-farben" id="farben">
|
|
<div class="container">
|
|
<header class="logo-farben__head">
|
|
<h2><?= e($page['farben']['title']) ?></h2>
|
|
<?php if (!empty($page['farben']['text'])): ?>
|
|
<p class="logo-farben__intro"><?= e($page['farben']['text']) ?></p>
|
|
<?php endif; ?>
|
|
</header>
|
|
<ul class="logo-farben__grid" role="list">
|
|
<?php foreach ($page['farben']['items'] as $farbe): ?>
|
|
<?php $klasse = $farbKlassen[$farbe['token'] ?? ''] ?? null; ?>
|
|
<li class="logo-farbe">
|
|
<?php if ($klasse !== null): ?>
|
|
<span class="logo-farbe__swatch logo-farbe__swatch--<?= e($klasse) ?>"></span>
|
|
<?php endif; ?>
|
|
<div class="logo-farbe__body">
|
|
<h3 class="logo-farbe__name"><?= e($farbe['name']) ?></h3>
|
|
<dl class="logo-farbe__werte">
|
|
<div><dt>HEX</dt><dd><?= e($farbe['hex']) ?></dd></div>
|
|
<div><dt>RGB</dt><dd><?= e($farbe['rgb']) ?></dd></div>
|
|
<div><dt>CMYK</dt><dd><?= e($farbe['cmyk']) ?></dd></div>
|
|
</dl>
|
|
<?php if (!empty($farbe['hinweis'])): ?>
|
|
<p class="logo-farbe__hinweis"><?= e($farbe['hinweis']) ?></p>
|
|
<?php endif; ?>
|
|
</div>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
</div>
|
|
</section>
|
|
<?php endif; ?>
|
|
<?php
|
|
// Rendert nichts, solange retro[] leer ist: alte Vereinslogos liegen bisher nirgends vor.
|
|
component('logo-downloads', [
|
|
'varianten' => $page['retro'] ?? [],
|
|
'title' => $page['retro_title'] ?? 'Frühere Vereinslogos',
|
|
'text' => $page['retro_text'] ?? '',
|
|
'anchor' => 'frueher',
|
|
'tinted' => true,
|
|
]);
|