Files
emmas-schatzkiste/DESIGN.md
T
Andrej StevanovskiandClaude Opus 5.5 6bd5c12d3e Trust-Icons repariert, Gelb heller statt braun
- .trust span traf auch den Icon-Chip (selbst ein span): Icon rutschte aus dem Kreis
  und war dunkel. Selektor auf die Unterzeile eingegrenzt.
- Gelbe Display-Schrift jetzt helles Markengelb mit dunkler Kontur wie im Logo statt
  sun-600/700 (las als Braun). Kleine gelbe Texte und Links auf Ink umgestellt,
  Icon-Chips im Verein hellgelb mit Ink-Icon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 21:59:01 +02:00

320 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Emma's Schatzkiste — Design-System
Live-Dateien: `index.html`, `hilfe-verein.html`, `shop.html`, `assets/site.css`.
Stand 2026-09-21. Offene Punkte: [`README.md`](README.md).
## Benannte Referenz
Workspace-Regel: *kein UI-Code ohne benannte Referenz*. Diese Seiten stehen auf einer:
**[`emmas-schatzkiste-ds.md`](../design-references/entries/emmas-schatzkiste-ds.md)** —
das mitgelieferte, gebundene Handoff-Design-System. Neue Familie *Warm Local Retail /
Handmade Consumer*; vorher hatte die Bibliothek für ein Projekt dieser Art keinen Eintrag.
**Übernommen:** die handgelegte Headline (jede Zeile eigenes Grid-Item mit eigener
Rotation), die Zwei-Farbwelten-Trennung Shop = blau / Verein = gelb, die eigene Kante der
Vereinsseite (gelbe 6px-Unterkante, rotierte Pille statt Eyebrow-Text, zwei Buttons statt
einem, freies Logo unten rechts), durchgehende Pill-Rundung, blaustichige Schatten,
4px-Raster, Motion ausschließlich als Zustandsfeedback, Sprache und Tonalität.
**Nicht übernommen:** Dreifach-Akzent, neunstufige Typo-Skala, die durchgefallenen
Textkontraste, die fixen Pixel-Stopps im Hero-Scrim, `mix-blend-mode` auf den Logos,
Pexels-Hotlinks. Begründung je unten.
## Produktwahrheit
Baby- und Kinder-Second-Hand-Laden in **84056 Rottenburg a.d. Laaber**, seit September in
neuer Hand. Dazu der **Hilfe Verein** („Hilfe. Herz. Hoffnung."), **noch nicht
eingetragen** — deshalb keine Spendenstufen, kein Zahlungsformular, kein
Mitgliedschafts-Flow. Drei Hilfearten, genau wie vom Kunden benannt: Geldspenden,
ehrenamtliche Helfer, Weitersagen. Kontakt nur über `tel:` und `mailto:`.
**Opa Martin** ist der Inhaber; Bild und Name, kein Bildtext — Kundenvorgabe. Foto seit
2026-09-24 in `assets/opa-martin.jpg`, 4:5 zugeschnitten, gleich behandelt wie das Story-Bild
(gekippt, weiß gerahmt).
Der Online-Shop ist bewusst geparkt. Tonalität: **Du-Form**, Satzkleinschreibung, keine Emoji.
## Drei Abweichungen vom Handoff
Alle drei freigegeben. Der Handoff erklärt Farben und Typo für final; diese drei Punkte
kollidieren mit den [Guardrails](../design-references/GUARDRAILS.md), zwei davon sind
zusätzlich messbare Fehler.
### 1. Farbe — Guardrail bewusst gelockert
Guardrail: *„Ein einziger Akzent-Ton pro Seite."* Die erste Fassung hielt ihn streng ein
und wurde vom Auftraggeber am 2026-09-21 als **zu blass** zurückgewiesen. Der Guardrail
ist damit bewusst gelockert — dasselbe Vorgehen wie bei Hypno Active, wo die drei
Logofarben ebenfalls gegen den Guardrail stehen und im CSS-Kopf dokumentiert sind.
Damit die Hierarchie trotzdem trägt, gilt eine harte Ersatzregel:
> **Farbe lebt in Flächen und in Display-Typo — nie im Fließtext.**
Alle drei Buntfamilien laufen wieder, aber ausschließlich als Sektionsflächen,
Kachelfüllungen, Icon-Chips und H1-Zeilen. Jeder Fließtext bleibt `--ink-500` oder
`--ink-700`. So konkurrieren die Farben nie auf derselben Leseebene.
Die Seitenidentität bleibt: `--accent*` ist weiter pro Seite gesetzt und regiert Icons,
Rahmen, Kontaktkarten, Footer-Kante und den aktiven Nav-Zustand.
| Seite | `--accent` | `--accent-text` | `--accent-soft` | `--accent-line` |
|---|---|---|---|---|
| Startseite, Shop (`.page-shop`) | `--sky-500` | `--sky-600` | `--sky-50` | `--sky-400` |
| Hilfe Verein (`.page-verein`) | `--sun-600` | `--sun-700` | `--sun-100` | `--sun-400` |
**H1 wieder dreifarbig,** Reihenfolge pro Seite gespiegelt: Startseite Sky → Sun → Coral,
Verein Sun → Coral → Sky. Zulässig, weil Display-Typo ab 24px die Large-Text-Schwelle
3.0 nutzt und alle drei Werte darüber liegen (auf Weiß 3.86 / 3.92 / 4.00, auf Creme
3.52 / 3.57 / 3.65). Im Fließtext wäre keiner davon erlaubt.
**Ein gesättigtes Vollflächen-Band pro Seite.** Pastelltöne allein trugen die Seite nicht,
sie verschwinden gegen Weiß. Startseite: „Für Familien" auf `--sky-500` mit weißer
Überschrift und weißen Kacheln. Verein: „Wir brauchen Hilfe" auf `--sun-400` mit
`--ink-700`. Weiß auf `--sky-500` misst 3.86 und reicht nur für Überschriften ab 24px —
deshalb steht auf dem blauen Band **kein** Fließtext, der sitzt in den weißen Kacheln.
`--ink-700` auf `--sun-400` misst 8.67 und ist überall zulässig.
Der Seitenrhythmus ist damit: Foto-Hero → Weiß → Creme → gesättigtes Band → Weiß →
Creme-Band → Footer.
Coral bleibt unverändert **ausschließlich** Handlungsfarbe der primären Buttons.
Eine bewusste Ausnahme: das Band *„Wo alles angefangen hat"* auf der Vereinsseite steht im
Blau der Shop-Welt. Es verweist auf den Laden; die Tönung markiert den Themenwechsel.
### 1b. Kräftigere Tönungen (2026-09-24)
Zweite Rückmeldung des Auftraggebers: die Farben wirken **„zu transparent"**. Gemessen
lag das an drei Stellen: den 50/100-Pastellen (`--sky-50`, `--sun-100`, `--coral-50`)
mit Leuchtdichte nahe Weiß, dem halbtransparenten Weißschleier im Hero, der bis 820px
über dem Foto lag, und dem durchscheinenden Header (`rgba(255,255,255,.92)`).
Begründung aus derselben Referenz: [`emmas-schatzkiste-ds.md`](../design-references/entries/emmas-schatzkiste-ds.md)
hält bereits fest, dass *Pastell allein in dieser Familie nicht trägt*. Das wird jetzt
eine Stufe weiter gezogen, ohne neue Farbfamilie:
| Rolle | vorher | jetzt |
|---|---|---|
| Creme-Flächen, Footer, Verein-Hero | `--sun-100` `#FDF4DC` | `--sun-200` `#FBE3A0` (neu) |
| Blaue Flächen, Shop-Hero | `--sky-50` / Weiß | `--sky-100` `#CFE6F8` |
| Rosa Kachel | `--coral-50` | `--coral-100` `#FFD8CE` (neu) |
| Icon-Chips | Pastell mit farbigem Icon | Vollton `--accent`, weißes Icon (3.86 / 3.92) |
| Hero-Verlauf | Weiß bis 430px, Schleier bis 820px | Fläche bis zur Textspalte, 90px Kante |
| Header | 92 % Weiß mit Blur | deckend Weiß |
Die Kacheln im gelben Band der Vereinsseite tragen jetzt ihre Tönung (rosa, blau, gelb)
statt einheitlich Weiß.
**Kontrast neu gerechnet.** Auf den kräftigeren Gründen fallen die hellen Buntwerte auf
~3.0–3.1. Deshalb stehen H1-Zeilen, Band-Überschriften und der Name unter dem Porträt dort
in der dunkleren Stufe derselben Familie: auf `--sun-200` `--sky-600` 4.43 · `--sun-700`
4.11 · `--coral-600` 3.93; auf `--sky-100` 4.35 · 4.04 · 3.87. Fließtext auf getöntem Grund
ist `--ink-700` (≥ 11.0).
**Gelb als Schrift (2026-09-24, dritte Rückmeldung: „geht mehr auf Braun als Gelb").**
Ein Gelb, das auf hellem Grund 3:1 erreicht, liegt bei Leuchtdichte ≤ 0.3 — und das ist
bei diesem Farbton zwangsläufig Ocker/Braun (`--sun-600`, `--sun-700`). Heller geht nur,
wenn nicht die Füllung den Kontrast trägt. Lösung aus dem Logo übernommen: helles
Markengelb `--sun-400` mit dunkler Kontur (`-webkit-text-stroke` in `--ink-700`,
`paint-order: stroke fill`), wie die umrandeten Buchstaben der Wortmarke. Gilt nur für
Displaygrößen (H1-Zeile, Band-Überschrift Verein). Kleinere gelbe Texte gibt es nicht
mehr: `Lied vom Hilfe Verein` steht in Ink, Links auf der Vereinsseite in Ink mit 3px
gelber Unterstreichung. Icon-Chips auf der Vereinsseite: `--sun-400` mit Ink-Icon (8.67).
### 2. Kontrast
Guardrail: *„Graue Schrift auf farbigem Grund."* Gemessen statt geschätzt:
| Paar | Verhältnis | |
|---|---|---|
| `--ink-300` `#8B94A0` auf `--sun-100` `#FDF4DC` | **2.80** | durchgefallen — das war die §19-Zeile |
| weiß auf `--coral-400` `#F4715A` | **2.85** | durchgefallen |
| weiß auf `--sky-400` `#4A9FE0` | **2.87** | durchgefallen — Header-Farbe des Handoffs |
| `--ink-500` `#4A5560` auf `--sun-100` | 6.94 | bestanden |
Der Fließtext auf Creme bestand also; dort war der Guardrail stilistisch. Die §19-Zeile
und die beiden weiß-auf-bunt-Fälle waren echte Fehler.
Geändert: Text auf farbigem Grund steht in `--ink-700` (13.20 auf Creme). Der Header ist
weiß mit `--ink-700`-Navigation statt `--sky-400` mit Weiß. Für den Primärbutton kamen drei
Stufen dazu, die bei jedem Zustand nachdunkeln und nie heller werden:
| Zustand | Füllung | Weiß darauf |
|---|---|---|
| Ruhe | `--coral-600` `#C8402B` | 4.97 |
| Hover | `--coral-700` `#B03422` | 6.25 |
| Press | `--coral-800` `#A82F1E` | 6.80 |
Dazu `--sun-700` `#8F6510` für gelben Text in Body-Größe (4.74 auf Creme); `--sun-600`
bleibt für Displaygrößen. `--coral-400` und `--sky-400` bleiben als Flächen im System,
nicht mehr als Grund für weißen Text.
**Alle drei Seiten sind gegen WCAG AA geprüft, inklusive der Large-Text-Schwellen
(≥24px, oder ≥18.66px ab Weight 700). Keine Verstöße.** Eine Stelle fiel dabei auf, die im
Handoff nicht sichtbar war: `Lied vom Laden` stand in `--accent` bei 20px/600 — 3.86 bei
verlangten 4.5, weil 20px/600 die Large-Text-Ausnahme nicht erreicht. Steht jetzt in
`--accent-text`.
### 3. Typo-Skala
Guardrail: *„Typo-Extreme (groß oder klein, kein Mittelmaß)."* Neun gleichmäßige Stufen
(56 · 42 · 32 · 24 · 19 · 17 · 15 · 13 · 11) sind genau das Mittelmaß — 24/19/17/15 liegen
so dicht, dass der Unterschied nicht mehr liest.
Auf sechs reduziert, gestrichen sind 42, 24, 19 und 15:
| Token | Wert | Face |
|---|---|---|
| `--t-display` | `clamp(34px, 7.2vw, 60px)` / 1.02 | Fredoka 700 |
| `--t-h2` | `clamp(24px, 3.1vw, 30px)` / 1.12 | Fredoka 600 |
| `--t-h3` | 20px / 1.3 | Fredoka 600 |
| `--t-body` | 17px / 1.65 | Nunito 400 |
| `--t-small` | 13px / 1.5 | Nunito 400 |
| `--t-label` | 11px / 1.4, `+0.08em`, versal | Nunito 700 |
Display-Tracking `-0.01em`. **Fredoka** und **Nunito** sind laut Handoff Platzhalter für
einen nicht gelieferten Markenfont — ersetzen, sobald echte Binaries da sind. Kein Inter,
kein System-Font.
## Weitere Korrekturen
**Hero unter 820px.** Der Handoff markiert die fixen Gradient-Stopps (430/560/820px) selbst
als Schwachstelle: unter ~820px deckt der Scrim das Foto fast vollständig zu. Ab 820px
bleibt der Scrim wie spezifiziert; darunter stapelt der Hero — Foto oben, Text darunter auf
voller Fläche, Scrim aus.
**Mobile Header.** Wortmarke plus vier Nav-Items passen unter 640px nicht nebeneinander;
die Nav brach aus den 64px heraus und legte sich über den Hero. Unter 640px ist die
Wortmarke auf das Zeichen reduziert, die Nav enger und notfalls horizontal scrollbar statt
umbrechend.
**Logos freigestellt.** Die Client-JPEGs haben einen eingebackenen weißen Kasten, im
Handoff per `mix-blend-mode: multiply` kaschiert — das bricht auf jedem dunkleren Grund und
ließ auf der Vereinsseite sichtbar Weiß stehen. Beide sind jetzt echt freigestellt
(Flood-Fill über randverbundenes Nahe-Weiß plus weiche Kante, 800px, 96-Farben-Palette) und
liegen als `assets/logo-*.png`, zusammen 135 KB statt 326 KB. Blend-Mode ist raus.
**Fokusring.** `--ring-focus` stand im Base-Block **vor** den Button-Regeln. Bei gleicher
Spezifität gewinnt die spätere Regel, also überschrieb `.btn--primary` ihre eigene
`box-shadow` über den Ring: auf Buttons war für Tastaturnutzer gar kein Fokus sichtbar. Der
Fokus-Block steht jetzt am Dateiende, und `.btn:focus-visible` setzt Ring **und** eigenen
Schatten. Geprüft mit echter Tab-Navigation.
**Keine Hotlinks.** Die beiden Pexels-Fotos waren auf ein fremdes CDN verlinkt. Statt sie
zu übernehmen liegen beschriftete Platzhalter in `assets/`, die unübersehbar als solche
lesen. Ersetzen, siehe README.
## Bilder
Alle Fotos von **Pexels**, [Lizenz](https://www.pexels.com/license/) am 2026-09-21 geprüft:
kommerzielle Nutzung frei, keine Namensnennung nötig, Selbsthosting erlaubt. Sie sind
**heruntergeladen und selbst gehostet**, nicht vom fremden CDN verlinkt wie im Handoff.
| Datei | Pexels-ID | Motiv |
|---|---|---|
| `assets/hero-start.jpg` | 10831693 | bunte Holzfahrzeuge auf Holz |
| `assets/hero-verein.jpg` | 34148341 | Kindersachen auf der Kleiderstange |
| `assets/laden-story.jpg` | 6591155 | Hände legen ein Oberteil zusammen |
**Bewusst keine Kinderfotos.** Pexels gibt für erkennbare Personen **kein Model Release**;
für eine deutsche Gewerbeseite wäre das ein unnötiges Risiko. Deshalb Sachmotive und, beim
Story-Bild, Hände ohne Gesicht. Aus demselben Grund aussortiert: Motive mit klar
erkennbaren Personen und englischen Aufdrucken („VOLUNTEER", „DONATE") sowie die
generischen Hände-im-Kreis-Klischees.
Beim Verein-Hero war im ersten Zuschnitt ein fremdes Kleidungs-Etikett sichtbar — weg
geschnitten, weil die Pexels-Lizenz Darstellungen untersagt, die eine Markenempfehlung
nahelegen.
Zuschnitte sind rechtsbetont: die Textspalte sitzt links unter dem Scrim, das Motiv muss
im rechten Drittel liegen. Alle 2000×1100, progressives JPEG, Qualität 76.
Das Vereinslogo im Hero liegt auf einer weißen Karte — auf dem gemusterten Stoff war die
feine Schrift darin sonst nicht lesbar.
## Motion
Nur Zustandsfeedback, wie im Handoff: 120ms Farbe, 200ms Lift, 340ms alles Größere,
`--ease: cubic-bezier(.2,.6,.3,1)`. Hover hebt 3px und vertieft den Schatten, Press
`scale(.97)` mit `--shadow-xs`. Kein Load-Fade, kein Parallax, keine Loop-Animation, kein
Bounce-Easing. `prefers-reduced-motion: reduce` schaltet Transitions ab und stellt Headline,
Pille und Logo aufrecht.
## Recht und Datenschutz
Kein Anwaltsersatz — aber die technische Seite ist so gebaut, dass möglichst wenig zu
regeln bleibt.
**Die Seite macht null Anfragen an Dritte.** Gemessen im Browser: keine Cookies, kein
Local oder Session Storage, keine Skripte, keine Iframes, keine Fremd-Origins. Damit ist
§ 25 TDDDG nicht berührt und **ein Einwilligungsbanner ist nicht erforderlich** — es gibt
nichts, wozu man einwilligen könnte. Das ist die bessere Lösung als ein aufgesetztes
Banner: kein Klickhindernis, keine Consent-Logik, nichts, was falsch konfiguriert sein kann.
**Schriften selbst gehostet.** Vorher kamen Fredoka und Nunito von
`fonts.googleapis.com` / `fonts.gstatic.com`. Das überträgt die IP jedes Besuchers an
Google; das LG München I hat darin am 20.01.2022 (3 O 17493/20) eine Verletzung des
Persönlichkeitsrechts gesehen. Beide liegen jetzt als woff2 in `assets/fonts/`, eingebunden
über `assets/fonts.css`. Es sind Variable Fonts — alle Schnitte einer Familie in einer
Datei, deshalb je eine `@font-face`-Deklaration mit Gewichtsbereich statt sechs. Nur die
Subsets `latin` und `latin-ext`, zusammen 106 KB. Lizenz SIL OFL 1.1, Lizenztexte liegen
daneben.
**Was bewusst fehlt:** die OS-Plattform. Sie wurde zum 20.07.2025 abgeschaltet
(VO (EU) 2024/3228), die Hinweispflicht ist entfallen, und ein stehengebliebener Link
darauf ist inzwischen selbst abmahnfähig. Beim Übernehmen alter Rechtstexte ist das der
erste Punkt, den man rauswerfen muss.
**Zwei neue Seiten:** `impressum.html` (§ 5 DDG — nicht mehr § 5 TMG, das ist seit Mai 2024
abgelöst) und `datenschutz.html`. Beide nutzen die `.prose`-Klassen. Offene Angaben stehen
als `.todo`-Felder mit gestricheltem Coral-Rahmen im Fließtext, damit nichts davon
versehentlich live geht, plus ein `.prose__warn`-Kasten oben auf jeder Seite.
## Mobil und Touch
Geprüft bei 320 · 375 · 390 · 640 · 768 · 1024 · 1440 · 1920 px, auf allen fünf Seiten,
jeweils auf horizontalen Overflow, Zielgrößen, Schriftgrößen und Randabstände. Alles
sauber. Gefunden und behoben wurde dabei:
**Der Header war auf dem Handy kaputt.** Nav-Links 28px hoch, Wortmarken-Link 32px breit,
und unter 400px scrollte die Navigation seitlich weg, ohne dass es jemand sieht. Jetzt
unter 640px zwei Zeilen: Wortmarke mittig, darunter die vier Punkte als Viererraster über
die volle Breite, jedes Ziel 44px. „Hilfe Verein" bricht bei 320px sauber um. Der Header
ist auf dem Handy dafür **nicht mehr sticky** — zwei Zeilen würden dauerhaft ein Sechstel
des Displays wegnehmen, und bei fünf Unterseiten ist eine mitlaufende Navigation kein
Verlust.
**Zielgrößen nach WCAG.** Zwei Schwellen, bewusst getrennt:
| Element | vorher | jetzt | Maßstab |
|---|---|---|---|
| Nav-Links, Wortmarke | 28–34px | 44px | 2.5.5 (AAA) |
| Telefon/E-Mail in Kontaktkarten | 23px | 44px | wichtigste Links der Seite |
| Telefon/E-Mail im Impressum | 23px | 44px | stehen allein, nicht im Satz |
| Footer-Links | 21px | 30px Desktop, 44px Handy | 2.5.8 (AA) verlangt 24px |
Links **mitten im Fließtext** (etwa der Pexels-Verweis) bleiben unverändert — für die gilt
die Inline-Ausnahme von WCAG 2.5.8.
**Schriftgrößen.** Die 11px-Versallabels gehen auf dem Handy auf 12px hoch. Auf dem Desktop
bleiben sie bei 11px, so wie das Handoff-DS es vorgibt.
**Versionierte Stylesheets.** Die CSS-Links tragen einen Hash des Dateiinhalts
(`site.css?v=…`). Ändert sich das CSS, ändert sich die URL, und Besucher mit altem
Browser-Cache bekommen zwingend die neue Datei. `deploy.sh` setzt den Hash bei jedem
Deploy automatisch neu. Das war keine Theorie: beim Testen hat der Panel-Cache mehrfach
veraltetes CSS ausgeliefert und Korrekturen als „nicht gewirkt" erscheinen lassen.
## Technik
Statische Seiten ohne Build, wie die übrigen `Websites/*` im Workspace. Eine Abweichung vom
Hausmuster: das CSS liegt als `assets/site.css` statt inline, weil es drei Seiten trägt.
Icons sind als Lucide-Pfade inline gesetzt — kein CDN-UMD-Build, keine Netzabhängigkeit.
Fonts über Google Fonts mit `preconnect`.
Lokal ansehen:
```bash
cd "/Users/andrej/ASX Studio/Emmas schatzkiste" && python3 -m http.server 4173
```