a06a94ff58
feat: #13 Light/Dark + EN/DE Toggle — Shift-2 Rollout
...
Rollout des Toggle-Patterns auf alle 57 statischen Sites (dasbes.de + dumusst.com sind dynamic, kein index.html).
1. **Bulk-Wiring (53 Sites)** via tools/patch-theme.py:
- Anti-FOUC inline IIFE im <head> (vor erstem Paint)
- <link rel="stylesheet" href="/shared/css/theme.css">
- <script src="/shared/theme.js"> + toggles.js (i18n.js bleibt, hängt sich ans neue Widget)
2. **Per-Site Light-Overrides (14 Sites)** via tools/patch-light-overrides.py:
- 6034, allainallain, commanderkin, hallofraumaier, heygoldi, keinefreun, lexsiebels, machesdocheinfach, matthiasbreier, orakil, osterai, patentonkel, traihard, wartebitte
- Pro Site nur die failing accent-vars darkened (--green-dim, --text-faint, --warm-dim, --gold-dim, etc.)
- AA 4.5:1+ auf white bg gesichert; Brand-Akzent erhalten
3. **data-theme-lock="dark" (4 Sites)** auf <html>:
- kilibri, killusion, killionaer, killuminati
- Aesthetisch dark-only — toggles.js blendet Theme-Button automatisch aus, Lang-Button bleibt
4. **Footer-Toggle Removal (52 Sites)** via tools/remove-footer-toggle.py:
- Bestehende footer [data-i18n-toggle] Buttons entfernt — top-right widget übernimmt
- Disclaimer-Information in tooltip des neuen Buttons + ai-disclosure.js footer
QA:
- ./build.sh: 59/59 sites built clean
- contrast-audit.py --both: 0/59 dark fail, 0/59 light fail
- anti-ai-lint: 0/57 sites flagged
Tools committed (idempotent, für Wiederverwendung):
- tools/patch-theme.py (--all wired alle Sites)
- tools/patch-light-overrides.py (per-site OVERRIDES dict)
- tools/remove-footer-toggle.py (4 Patterns für versch. Footer-Strukturen)
2026-05-08 11:16:15 +02:00
a221367c46
feat: #13 Light/Dark + EN/DE Toggle (Shift-1 Design + Pilot)
...
Architektur:
- shared/theme.js — Logik (data-theme attr auf <html>, localStorage, prefers-color-scheme fallback, data-theme-lock opt-out)
- shared/toggles.js — fixed top-right Pill mit Sun/Moon SVG + DE/EN Button (auto-injected, hängt sich an i18n.js's [data-i18n-toggle] Pattern)
- shared/css/theme.css — neutrale Light-Defaults (cream bg, AA-konforme grays)
- templates/base.html — Anti-FOUC inline IIFE im <head>, theme.css linked vor inline <style>, scripts in body
- tools/contrast-audit.py — neue --light/--dark/--both Modi, parsed [data-theme="light"] + shared fallback
Pilot auf 4 Sites:
- ichbinotto.de (Octopus rot/teal)
- paragraphenraiter.de (Gold)
- kilitaer.de (Olive)
- deinesei.de (Indigo)
Audit-Ergebnis:
- Dark mode: 0/59 Verstöße (regression-frei)
- Light mode: 14/59 Sites brauchen per-site overrides für sub-AA Akzent-Vars (Shift-2 follow-up)
Out of Scope (Shift-2):
- Rollout auf restliche 55 Sites
- Per-Site Light-Palette-Verfeinerung wo neutral-Default nicht trägt
- Per-Site Opt-Out (data-theme-lock) für aesthetisch dark-only Satire-Sites
Design-Doc: docs/plans/theme-toggle.md
2026-05-07 17:05:12 +02:00
b6d23f6d99
fix : #12 lift sub-WCAG-AA text colors on 33 dark-bg sites
...
Replaces FAIL-level (<3:1) and WEAK (<4.5:1) --text-muted/--text-dim/
--text-faint/--text-dimmer/--accent-dim/--gold-dim values across all
33 affected sites. Targets: text-muted >=4.6:1 (WCAG AA),
text-dim/text-faint >=7:1 (WCAG AAA).
Shared palette pattern (15 sites: deinesei, fragina, ichbinaufbali,
ichbinaufbarley, insain, kainstress, kinowhow, knzlmgmt, kopffrai,
legalais, martinsiebels, schulfrai, smartin3, sorgenfrai, vonschraitter):
--text-muted #44444f -> #7a7a8e (2.06 -> 4.71)
--text-dim #6e6e7a -> #9a9aab (3.93 -> 7.14)
Otto/mai-otto pattern (purple-tinted): #404068 -> #7373bb,
#7070a0 -> #9797d8.
Per-site fixes for kainco, kainefrage, kilitaer (olive), killegal,
killionaer, killuminati, killusion, killions, orakil (warm),
paragraphenraiter (gold), keinefreun, julietensity, billableaua,
allaisonme, allainallain, slopschild — each preserves its tint while
crossing the AA threshold.
Audit before: 31 FAIL, 2 WEAK / 33 sites flagged.
Audit after: 0 FAIL, 0 WEAK / 0 sites flagged.
Adds tools/contrast-audit.py (lifted from /tmp) so future edits can
re-run the regression check from the repo.
2026-05-07 16:48:37 +02:00
4f25d74452
fix: whitelist intentional anti-ai-pattern hits in satire sites
...
killusion.de mocks the inflation of "revolutionär" claims; the word
appears in scare-quotes as the punchline. kilofant.de parodies AI
marketing-speak; "robust" is part of the joke. Both add an explicit
<!-- anti-ai-allow: ... --> directive so the lint stops flagging them.
2026-04-30 03:35:33 +02:00
e06d4938ce
mAi: #6 - Revive knuth: i18n + AI/KI-Disclosure auf alle Sites
...
Merge mai/knuth/ai-ki-disclosure-footer (3 commits vom 2026-04-01) nach diesem
Branch. Bringt:
- i18n-Annotations (data-de/data-en) + Footer-Toggle auf 54 Custom-Sites
- shared/ai-disclosure.js (3 Tones: playful/serious/minimal, KI/AI nach lang)
- Template-Infrastruktur in render.sh + base.html (title_i18n, sections,
ai-disclosure-Tag mit disclosure_tone)
Konflikt-Auflösung (Issue #6 ):
- shared/impressum.js: main behalten (theme-aware + msbls-alias aus #4 )
- 10 Sites mit Marken-Setup aus #3 + #5 : main's Brand-Konfiguration
behalten, nur knuth's i18n-Annotations und ai-disclosure/i18n-Scripts
übernommen.
- heygoldi, lexsiebels, mai-otto: <script impressum.js data-owner=flexsiebels>
- martinsiebels: <script impressum.js data-owner=martinsiebels>
- 9 Satire (kilibri/kilitaer/killegal/killionaer/killions/killuminati/
killusion/paragraphenraiter/patentonkel): KEIN impressum.js, dafür
statischer onepager-msbls-link Footer.
- billableaua, smartin3, clemensplassmann: main's neuere Prosa/Struktur
behalten (durch #1 , #5 , #7 nachträglich umgeschrieben). Knuth's i18n-
Annotations dort verworfen, da auf altem Text. Toggle/Scripts kommen
trotzdem rein (auto-merged), Re-Annotation später möglich.
QA: ./build.sh -> 59 sites OK. Smoke-Tests heygoldi/kilibri/ichbinotto:
korrekte Brand-Setup, ai-disclosure + i18n.js geladen, Footer-Toggle da.
2026-04-27 20:17:24 +02:00
095ed0fccf
mAi: #7 - Mobile-Gating: Touch-Fix nur unter 768px
...
CSS touch-action: pan-y und JS-Listener-Scope (wrapper statt hero,
ohne preventDefault) jetzt explizit per @media / matchMedia auf
max-width: 768px begrenzt. Über 768px bleibt das ursprüngliche
Verhalten erhalten — touchmove auf .hero mit preventDefault, falls
Touch-Hardware im Desktop-Layout im Spiel ist.
2026-04-27 20:08:25 +02:00
66d0203f55
mAi: #7 - smartin3.de Mobile: 3D-Animation-Touch auf Wrapper begrenzen
...
Touchmove-Listener von .hero auf .text3d-wrapper verschoben, sodass nur
Touches direkt auf der animierten Text-Komponente die Animation triggern.
preventDefault() entfernt + touch-action: pan-y auf den Wrapper —
vertical scroll funktioniert jetzt sowohl außerhalb als auch innerhalb
des Animations-Bereichs ungestört. Desktop-mousemove unverändert.
2026-04-27 20:05:45 +02:00
272cc7b5d1
mAi: #5 - Marken-Konsequenz: heygoldi → flexsiebels/full, 9× Satire → msbls.de-Link
...
Strukturelle Folge aus Marken-Klärung (msbls = Marke unter flexsiebels-Umbrella,
Rechtsträger ist flexsiebels):
- shared/impressum.js: default owner ist jetzt flexsiebels; owners.msbls als
Legacy-Alias auf owners.flexsiebels (backward-compat). Header-Doku aktualisiert.
- heygoldi.de: Script-Tag auf data-owner="flexsiebels" data-variant="full".
- 9 Satire-Sites: Impressum-Script raus, statischer "Ein Projekt von msbls.de"-
Link im Footer (color:inherit, dezent).
Sites: patentonkel, paragraphenraiter, killuminati, kilitaer, killions,
killusion, killegal, killionaer, kilibri.
Build: ./build.sh -> 59 sites OK. Andere Overlay-Sites (ichbinotto, lexsiebels,
mai-otto, smartin3, martinsiebels, zensiebels) unverändert.
Closes via done-label: m/onepager#5
2026-04-26 15:10:15 +02:00
f85f4b4e7f
mAi: #3 - heygoldi/martinsiebels/zensiebels Impressum
...
- heygoldi.de: hardcoded "ein Projekt von msbls.de" Zeile entfernt, shared (msbls minimal) eingebunden
- martinsiebels.de: shared (martinsiebels full) — volles § 5 TMG
- zensiebels.de: shared (flexsiebels minimal)
- matthiasbreier.de: bewusst kein Impressum (m-Entscheidung)
Satire-Sites (kainco/kili*/kino* etc.) bleiben weiter ohne Impressum-Link.
Refs: #3
2026-04-23 00:26:18 +02:00
a5777ff65d
mAi: #3 - mai-otto/lexsiebels Impressum + clemensplassmann Redirect
...
- mai-otto.de: shared Impressum (flexsiebels full)
- lexsiebels.de: shared Impressum (flexsiebels full)
- clemensplassmann.de: offline genommen, leitet per meta refresh + JS zur
Hogan-Lovells-Profilseite weiter (https://www.hoganlovells.com/en/clemens-plassmann ).
Fallback-Link sichtbar, falls Redirect blockiert.
Refs: #3
2026-04-23 00:03:21 +02:00
a4e37735f8
mAi: #3 - Impressum-Konsistenz: shared als Single-Source-of-Truth
...
- shared/impressum.js: Name korrigiert (msbls/flexsiebels = Matthias Siebels, nicht Martin),
echte Adresse aus youpc.org übernommen (c/o Online-Impressum.de #5892 , Sankt Augustin).
Neuer Owner 'flexsiebels', neuer Owner 'martinsiebels' (für Martin als separate Person
mit eigener Adresse in Osnabrück). data-variant als offizielles Attribut, data-style
weiterhin als Legacy-Alias. Rendert in #impressum falls vorhanden, sonst footer.
- paragraphenraiter.de: hardcoded "Ein Projekt von Matthias Flexsiebels" → shared (msbls minimal)
- patentonkel.de: hardcoded "Matthias Flexsiebels" + kaputter window.__impressum() → shared (msbls minimal)
- smartin3.de: inline Impressum-Text → shared (martinsiebels full) in #impressum Div
- ichbinotto.de: shared (flexsiebels full) mit echter § 5 TMG-Angabe
Caddyfile: Regenerierung hat fehlende Einträge für 6034.de, traihard.de, zensiebels.de ergänzt.
Refs: #3
2026-04-22 23:39:41 +02:00
m
dadfa0df7c
feat: smartin3.de — mouse interaction covers full hero section width and depth
2026-04-18 21:20:56 +02:00
m
1caf12d801
fix: smartin3.de — remove noise overlay from body
2026-04-18 21:19:45 +02:00
m
f6c9eddfe4
fix: smartin3.de — tighten hero gradient, smaller radius to avoid page-wide glow
2026-04-18 21:19:31 +02:00
m
4315f4c2c0
fix: smartin3.de — larger mouse interaction area, gradient not clipped by container
2026-04-18 21:18:29 +02:00
m
8f615fd3d1
feat: smartin3.de — interactive 3D text, follows mouse/touch
2026-04-18 21:14:38 +02:00
m
6f2f150cb6
fix: smartin3.de — sweep -45° to 45°
2026-04-18 21:13:29 +02:00
m
3d457d6b42
feat: smartin3.de gallery — add Sonnenblendenhalter photo
2026-04-18 21:13:08 +02:00
m
d8e145a49d
feat: smartin3.de — slow sweep 45° to 165°, no full rotation
2026-04-18 21:12:36 +02:00
m
8fc605c851
fix: smartin3.de — replace all fake umlauts with real ä ö ü ß
2026-04-18 21:12:11 +02:00
m
66166d979c
feat: smartin3.de — 3D text gradient from orange to blue
2026-04-18 21:10:26 +02:00
m
b12b8e9068
feat: smartin3.de — 30 depth layers at 1px spacing for solid 3D extrusion
2026-04-18 21:08:50 +02:00
m
5a2416f3a6
feat: smartin3.de — solid text-shadow extrusion, no gaps between layers
2026-04-18 21:07:20 +02:00
m
5454f0fc27
feat: smartin3.de — lightbox on gallery click with caption
2026-04-18 21:06:39 +02:00
m
ab4003fb15
feat: smartin3.de — solid 3D block letters, remove duplicate h1
2026-04-18 21:05:32 +02:00
m
7d56e6a2fd
feat: smartin3.de — full 360 rotation from diagonal angle, more depth
2026-04-18 21:03:42 +02:00
m
866d30476d
fix: smartin3.de — missing closing brace on @keyframes rotateText
2026-04-18 21:02:39 +02:00
m
5240244a14
fix: smartin3.de — rename Schaltschrank Abdeckungshalter title
2026-04-18 21:01:53 +02:00
m
057fbf5434
feat: smartin3.de — replace rotating cube with 3D "smart" text animation
2026-04-18 21:01:29 +02:00
m
52758c94a8
fix: smartin3.de — prevent horizontal overflow from hero gradient on mobile
2026-04-18 20:57:53 +02:00
m
e2fc469957
fix: smartin3.de — remove container div from nav, flex directly on nav element
2026-04-18 20:53:38 +02:00
m
4a7aa31dc1
feat: smartin3.de gallery — add Schaltanlage Panelhalter photo
2026-04-18 20:52:23 +02:00
m
3c324d4103
fix: smartin3.de — nav container full-width, no more 860px constraint
2026-04-18 20:51:16 +02:00
m
9d6debecbd
fix: smartin3.de — nav uses full viewport width, hamburger aligned properly
2026-04-18 20:48:42 +02:00
m
21f22dc90d
fix: smartin3.de — remove max-width on gallery description text
2026-04-18 20:47:40 +02:00
m
98fd237298
fix: smartin3.de — remove stock photos, fix umlauts, Flachkabelhalter
2026-04-18 20:46:42 +02:00
m
ffeed4998c
feat: smartin3.de gallery — add Muenzhalter photo
2026-04-18 20:36:52 +02:00
m
fc4986b805
feat: smartin3.de gallery — add Flachkabel Halter photo
2026-04-18 20:29:25 +02:00
m
1576ac892b
fix: smartin3.de — hamburger menu on mobile, nav no longer overflows
2026-04-18 20:22:50 +02:00
m
08739c6294
feat: smartin3.de — add Etsy shop link to nav and contact section
2026-04-18 20:19:52 +02:00
m
075be054e9
fix: smartin3.de — responsive nav, prevent overflow on mobile
2026-04-18 20:17:53 +02:00
m
6480e72472
feat: smartin3.de — add Instagram link to nav and contact section
2026-04-18 20:03:49 +02:00
m
6dc338ddc2
feat: smartin3.de gallery — add VW Golf MK1 cover photo with caption
...
Add real product photo (VW Golf MK1 trunk cover) to gallery with
description. Extend gallery CSS to support figcaption elements.
2026-04-18 19:59:38 +02:00
m
2c4b693ac8
fix: 6034.de — minimal links only, no description
2026-04-16 16:32:11 +02:00
m
fc50219740
feat: add 6034.de — personal project space with mGreen link
2026-04-16 15:11:28 +02:00
m
89a0f992e0
feat: smartin3.de — add gallery section with Unsplash placeholders
2026-04-09 19:18:33 +02:00
m
5fe3132e34
feat: traihard.de — universal tryhard manifesto (cycling, comunio, fitness, productivity)
2026-04-08 13:21:12 +02:00
m
4dfae76862
fix: remove comunio link from traihard.de footer
2026-04-08 13:15:30 +02:00
m
2ffb1b4192
fix: remove 'powered by' from footers
2026-04-08 13:13:59 +02:00
m
40f07304de
feat: traihard.de — tryhard cycling manifesto + comunio guide
2026-04-08 13:12:30 +02:00