Add distinct themes to existing games
mindflux-ci / build (push) Successful in 23s

This commit is contained in:
AliceDarkest
2026-07-13 23:32:41 +02:00
parent f90f21589d
commit 95df002e24
18 changed files with 87 additions and 10 deletions
+11
View File
@@ -6,6 +6,17 @@ Versionierung [semantisch](https://semver.org/lang/de/).
## [Unreleased] – 2026-07-13 · BugHunter, NetWorker & echter Lernfortschritt ## [Unreleased] – 2026-07-13 · BugHunter, NetWorker & echter Lernfortschritt
### Eigenständige Spielwelten
- **Bestandsspiele gestalterisch getrennt:** MindMatch erhielt ein Violett-/Mint-
„Neural Archive“, TechTacular eine Magenta-/Blaue Cyber-Quizshow, SyntaxSaga ein
phosphoriges Terminal und FinalFlux eine ruhige Gold-/Indigo-Prüfungszentrale.
- **DevLab als Werkstatt:** Petrol/Orange, Schaltkreisraster und Build-Pipeline-Akzente
schärfen die Oberfläche nach. Die schwebende Kolben-/dlFloat-Animation bleibt
unverändert erhalten.
- **Zugänglichkeit bleibt stimmig:** Das Accessibility-Widget erkennt und verwendet nun
auch für diese fünf Lernwelten automatisch deren lokalen Akzent; Statusfarben und
Spielmechaniken bleiben unverändert.
### ServiceClash ### ServiceClash
- **Auswertung repariert:** Nach dem letzten Ticket wurde die Abschlussansicht nicht - **Auswertung repariert:** Nach dem letzten Ticket wurde die Abschlussansicht nicht
geöffnet, weil der Renderer noch auf ein nicht vorhandenes Folgeticket zugriff. Die geöffnet, weil der Renderer noch auf ein nicht vorhandenes Folgeticket zugriff. Die
+27 -1
View File
@@ -45,7 +45,7 @@ Begründung Keys: Die vorhandenen Routen sind alle klein und zusammengeschrieben
--- ---
## Visuelle Identität: vier Spiele, vier Welten ## Visuelle Identität: neun Lernwelten
> ◐ **Stand 2026-07-13:** Die Dark-/Light-Akzent-Tokens für alle vier Spiele sind in > ◐ **Stand 2026-07-13:** Die Dark-/Light-Akzent-Tokens für alle vier Spiele sind in
> `theme.css` angelegt. SystemEscape, BugHunter und NetWorker haben eigene Spiel-Layouts; > `theme.css` angelegt. SystemEscape, BugHunter und NetWorker haben eigene Spiel-Layouts;
@@ -68,6 +68,32 @@ Vorgabe: Die Spiele sollen **grafisch stark ausgeprägt** sein und sich **sehr d
Dazu je Spiel ein eigenes Karten-Design auf dem Dashboard (Hover-Animation im jeweiligen Spiel-Akzent), damit die Unterscheidbarkeit schon in der Übersicht beginnt. Die Interaktionsformen sind ohnehin grundverschieden: Modal-Rätsel + Keypad (SystemEscape), klickbarer Code-Viewer (BugHunter), Echtzeit-Queue (ServiceClash), frei bespielbare SVG-Canvas (NetWorker). Dazu je Spiel ein eigenes Karten-Design auf dem Dashboard (Hover-Animation im jeweiligen Spiel-Akzent), damit die Unterscheidbarkeit schon in der Übersicht beginnt. Die Interaktionsformen sind ohnehin grundverschieden: Modal-Rätsel + Keypad (SystemEscape), klickbarer Code-Viewer (BugHunter), Echtzeit-Queue (ServiceClash), frei bespielbare SVG-Canvas (NetWorker).
### Eigenständige Skins für die Bestandsmodule ✅ umgesetzt
Die gemeinsame Mindflux-Grundlage bleibt erhalten: Typografie, Fokuszustände, Buttons,
Fehler-/Erfolgsfarben und das Accessibility-Widget werden nicht pro Spiel neu erfunden.
Jede Lernwelt erhält aber eigene Akzent-Tokens, Hintergrundstruktur und eine passende
Oberflächenmetapher – im Dark- wie im Light-Theme.
| Modul | Skin | Akzent & Metapher | Umsetzungshinweis |
|---|---|---|---|
| **MindMatch** | Neural Archive | Violett/Mint, Synapsenlinien und schwebende Gedächtniskarten | Paare bleiben klar lesbar; Verbindungen sind dekorativ, nicht alleiniger Status. |
| **TechTacular** | Cyber-Quizshow | Magenta/Blau, LED-Raster und Punktetafel | Das Jeopardy-Board wird zur Show-Bühne, ohne die Kachelkontraste zu verlieren. |
| **DevLab** | Werkstatt & Build-Pipeline | Petrol/Orange, Werkbank- und Schaltkreisstruktur | **Der schwebende Kolben samt \`dlFloat\`-Animation bleibt unverändert erhalten.** Nur Farben, Umgebung und Panels werden nachgeschärft. |
| **SyntaxSaga** | Textadventure-Terminal | Phosphorgrün/Bernstein, dezente CRT-Scanlines und Log-Charakter | Grün dient ausschließlich der Atmosphäre; richtig bleibt Plattform-Blau, falsch bleibt Rot. |
| **FinalFlux** | Prüfungszentrale | Gold/Indigo, ruhige Sternkarten-/Konstellationsstruktur | Bewusst weniger spielig: die Lernzentrale verbindet alle Welten und priorisiert Lesbarkeit. |
**Technische Leitplanken:** zentrale Token in \`theme.css\`, lokale Überschreibung nur am
jeweiligen Seiten-Root (\`mm-\`, \`tt-\`, \`dl-\`/\`dlg-\`, \`ss-\`, \`finalflux-\`), keine
Änderung der Spielmechanik; Cache-Busting bei jeder CSS-Auslieferung. Das
Accessibility-Widget soll anschließend jeweils den lokalen Akzent übernehmen.
> ✅ **Stand 2026-07-13:** Die fünf Skins sind als lokale Token-Überschreibungen mit
> Cache-Busting umgesetzt. MindMatch, TechTacular, DevLab samt Aufgabenraum, SyntaxSaga
> und FinalFlux haben jeweils eigene Hintergründe und Akzente; das Accessibility-Widget
> übernimmt die neue Farbe. Die bestehende Kolben-/dlFloat-Animation in DevLab blieb
> unverändert.
--- ---
## Das gemeinsame Architektur-Rezept (gilt für alle 4 Spiele) ## Das gemeinsame Architektur-Rezept (gilt für alle 4 Spiele)
@@ -5,6 +5,11 @@ body{padding-left:0!important;padding-bottom:0!important}
.mf-a11y-utility{position:sticky;top:0;z-index:1700;min-height:60px;display:flex;align-items:center;justify-content:flex-end;padding:.5rem 1rem;background:var(--panel);border-bottom:1px solid var(--border)} .mf-a11y-utility{position:sticky;top:0;z-index:1700;min-height:60px;display:flex;align-items:center;justify-content:flex-end;padding:.5rem 1rem;background:var(--panel);border-bottom:1px solid var(--border)}
.mf-theme-float{display:flex;align-items:center;gap:.55rem} .mf-theme-float{display:flex;align-items:center;gap:.55rem}
body.mf-a11y-skin-codeescape{--mf-a11y-accent:var(--esc-accent);--mf-a11y-glow:var(--esc-glow);--mf-a11y-ink:#1c1100} body.mf-a11y-skin-codeescape{--mf-a11y-accent:var(--esc-accent);--mf-a11y-glow:var(--esc-glow);--mf-a11y-ink:#1c1100}
body.mf-a11y-skin-mindmatch{--mf-a11y-accent:var(--mm-accent);--mf-a11y-glow:var(--mm-glow);--mf-a11y-ink:#180d2b}
body.mf-a11y-skin-techtacular{--mf-a11y-accent:var(--tt-accent);--mf-a11y-glow:var(--tt-glow);--mf-a11y-ink:#270718}
body.mf-a11y-skin-devlab{--mf-a11y-accent:var(--dl-accent);--mf-a11y-glow:var(--dl-glow);--mf-a11y-ink:#221004}
body.mf-a11y-skin-syntaxsaga{--mf-a11y-accent:var(--ss-accent);--mf-a11y-glow:var(--ss-glow);--mf-a11y-ink:#07170d}
body.mf-a11y-skin-finalflux{--mf-a11y-accent:var(--ff-accent);--mf-a11y-glow:var(--ff-glow);--mf-a11y-ink:#211708}
body.mf-a11y-skin-bughunter{--mf-a11y-accent:var(--bh-accent);--mf-a11y-glow:var(--bh-glow);--mf-a11y-ink:#210c12} body.mf-a11y-skin-bughunter{--mf-a11y-accent:var(--bh-accent);--mf-a11y-glow:var(--bh-glow);--mf-a11y-ink:#210c12}
body.mf-a11y-skin-networker{--mf-a11y-accent:var(--nw-accent);--mf-a11y-glow:var(--nw-glow);--mf-a11y-ink:#061321} body.mf-a11y-skin-networker{--mf-a11y-accent:var(--nw-accent);--mf-a11y-glow:var(--nw-glow);--mf-a11y-ink:#061321}
body.mf-a11y-skin-serviceclash{--mf-a11y-accent:var(--sc-accent);--mf-a11y-glow:var(--sc-glow);--mf-a11y-ink:#06171c} body.mf-a11y-skin-serviceclash{--mf-a11y-accent:var(--sc-accent);--mf-a11y-glow:var(--sc-glow);--mf-a11y-ink:#06171c}
+4
View File
@@ -385,3 +385,7 @@ body.dl-body {
align-items: flex-start; align-items: flex-start;
} }
} }
/* Werkstatt & Build-Pipeline: die Kolben- und dlFloat-Animation darüber bleibt unverändert. */
body.dl-body { --accent:var(--dl-accent); --accent-2:var(--dl-secondary); --glow-s:var(--dl-glow); --glow-w:color-mix(in srgb,var(--dl-accent) 15%,transparent); background:radial-gradient(circle at 78% 4%,color-mix(in srgb,var(--dl-secondary) 16%,transparent),transparent 35%),var(--bg); }
.dl-hero { background:linear-gradient(135deg,color-mix(in srgb,var(--dl-secondary) 9%,var(--surface)),var(--surface)); border-color:color-mix(in srgb,var(--dl-accent) 55%,var(--border)); }.dl-hero::before { opacity:.34; background:linear-gradient(90deg,transparent 0 31px,color-mix(in srgb,var(--dl-secondary) 35%,transparent) 32px,transparent 33px),linear-gradient(0deg,transparent 0 31px,color-mix(in srgb,var(--dl-secondary) 35%,transparent) 32px,transparent 33px); background-size:34px 34px; }.dl-station.active { background:linear-gradient(145deg,color-mix(in srgb,var(--dl-accent) 13%,var(--surface-2)),var(--surface-2)); }
@@ -118,3 +118,7 @@ body.dlg-body { min-height: 100vh; display: flex; flex-direction: column; color:
.dlg-stat { font-size: 0.62rem; padding: 0.3rem 0.5rem; } .dlg-stat { font-size: 0.62rem; padding: 0.3rem 0.5rem; }
.dlg-code, .dlg-code code { font-size: 0.82rem; } .dlg-code, .dlg-code code { font-size: 0.82rem; }
} }
/* Dieselbe Werkstatt-Palette im eigentlichen Aufgabenraum. */
body.dlg-body { --accent:var(--dl-accent); --accent-2:var(--dl-secondary); --glow-s:var(--dl-glow); --glow-w:color-mix(in srgb,var(--dl-accent) 15%,transparent); background:radial-gradient(circle at 86% 2%,color-mix(in srgb,var(--dl-secondary) 15%,transparent),transparent 34%),var(--bg); }
.dlg-header,.dlg-card { border-color:color-mix(in srgb,var(--dl-accent) 55%,var(--border)); }.dlg-code { border-color:color-mix(in srgb,var(--dl-secondary) 45%,var(--border)); }
@@ -340,3 +340,7 @@ body.finalflux-page {
padding: 1rem; padding: 1rem;
} }
} }
/* Prüfungszentrale: ruhige Gold-/Indigo-Konstellation statt Spielhallen-Optik. */
body.finalflux-shell,body.finalflux-page { --accent:var(--ff-accent); --accent-2:var(--ff-secondary); --glow-s:var(--ff-glow); --glow-w:color-mix(in srgb,var(--ff-accent) 14%,transparent); background:radial-gradient(circle at 17% 13%,color-mix(in srgb,var(--ff-secondary) 17%,transparent),transparent 30%),radial-gradient(circle at 82% 8%,color-mix(in srgb,var(--ff-accent) 13%,transparent),transparent 28%),#0b0d1b; }
body.finalflux-shell::before,body.finalflux-page::before { content:""; position:fixed; inset:0; pointer-events:none; opacity:.28; background-image:radial-gradient(circle,var(--ff-accent) 0 1px,transparent 1.5px),radial-gradient(circle,var(--ff-secondary) 0 1px,transparent 1.5px); background-size:91px 91px,137px 137px; background-position:14px 22px,47px 65px; }.finalflux-sidebar,.finalflux-main,.finalflux-page { position:relative; z-index:1; }.finalflux-hero,.finalflux-panel,.finalflux-page section { border-left-color:var(--ff-secondary); box-shadow:0 10px 28px color-mix(in srgb,var(--ff-secondary) 9%,transparent); }
@@ -359,3 +359,8 @@ body.mm-body {
.mm-board { height: auto; grid-auto-rows: auto; } .mm-board { height: auto; grid-auto-rows: auto; }
.mm-card { aspect-ratio: 3 / 4; } .mm-card { aspect-ratio: 3 / 4; }
} }
/* Neural Archive: eigene Spielwelt, Statusfarben bleiben die globalen Tokens. */
body.mm-body { --accent:var(--mm-accent); --accent-2:var(--mm-secondary); --glow-s:var(--mm-glow); --glow-w:color-mix(in srgb,var(--mm-accent) 16%,transparent); background:radial-gradient(circle at 16% 8%,color-mix(in srgb,var(--mm-accent) 18%,transparent),transparent 31%),radial-gradient(circle at 83% 86%,color-mix(in srgb,var(--mm-secondary) 12%,transparent),transparent 30%),var(--bg); }
body.mm-body::before { content:""; position:fixed; inset:0; pointer-events:none; opacity:.28; background:radial-gradient(circle at 12% 28%,var(--mm-secondary) 0 1px,transparent 2px),radial-gradient(circle at 77% 18%,var(--mm-accent) 0 1px,transparent 2px),repeating-linear-gradient(32deg,transparent 0 58px,color-mix(in srgb,var(--mm-accent) 14%,transparent) 59px 60px,transparent 61px 118px); }
.mm-shell { position:relative; z-index:1; }.mm-card-front { background:linear-gradient(145deg,color-mix(in srgb,var(--mm-accent) 23%,var(--surface-2)),var(--surface)); border-color:color-mix(in srgb,var(--mm-accent) 62%,var(--border)); }.mm-card-front::after { color:var(--mm-secondary); }.mm-card-back.mm-term { border-color:color-mix(in srgb,var(--mm-secondary) 60%,var(--border)); }
@@ -245,3 +245,7 @@ body.ss-body {
.ss-mission-title { font-size: 1.2rem; } .ss-mission-title { font-size: 1.2rem; }
.ss-code code { font-size: 0.85rem; } .ss-code code { font-size: 0.85rem; }
} }
/* Textadventure-Terminal: phosphorige Log-Atmosphäre, Bewertung bleibt blau/rot. */
body.ss-body { --accent:var(--ss-accent); --accent-2:var(--ss-secondary); --glow-s:var(--ss-glow); --glow-w:color-mix(in srgb,var(--ss-accent) 15%,transparent); background:radial-gradient(circle at 45% -8%,color-mix(in srgb,var(--ss-accent) 16%,transparent),transparent 42%),#07100b; }
body.ss-body::before { content:""; position:fixed; inset:0; pointer-events:none; opacity:.14; background:repeating-linear-gradient(0deg,transparent 0 3px,rgba(129,214,149,.18) 4px 5px); }.ss-shell { position:relative; z-index:1; }.ss-code { border-color:color-mix(in srgb,var(--ss-accent) 55%,var(--border)); box-shadow:inset 0 0 28px color-mix(in srgb,var(--ss-accent) 10%,transparent); }.ss-mission-no::before { content:"> "; color:var(--ss-secondary); }
@@ -275,3 +275,7 @@ body.tt-body {
.tt-board { height: auto; } .tt-board { height: auto; }
.tt-tile { flex: 0 0 auto; min-height: clamp(58px, 12vw, 86px); } .tt-tile { flex: 0 0 auto; min-height: clamp(58px, 12vw, 86px); }
} }
/* Cyber-Quizshow: LED-Bühne statt generischer Spieloberfläche. */
body.tt-body { --accent:var(--tt-accent); --accent-2:var(--tt-secondary); --glow-s:var(--tt-glow); --glow-w:color-mix(in srgb,var(--tt-accent) 16%,transparent); background:radial-gradient(circle at 50% -15%,color-mix(in srgb,var(--tt-accent) 22%,transparent),transparent 42%),repeating-linear-gradient(90deg,color-mix(in srgb,var(--tt-secondary) 11%,transparent) 0 1px,transparent 1px 22px),var(--bg); }
.tt-board { border-color:color-mix(in srgb,var(--tt-secondary) 55%,var(--border)); box-shadow:0 0 28px color-mix(in srgb,var(--tt-accent) 18%,transparent); }.tt-cat-title { color:var(--tt-secondary); text-shadow:0 0 9px color-mix(in srgb,var(--tt-secondary) 52%,transparent); }.tt-tile { background:linear-gradient(145deg,color-mix(in srgb,var(--tt-accent) 10%,var(--surface)),var(--surface-2)); }
+10
View File
@@ -18,6 +18,11 @@
--bh-accent:#d94b64; --bh-glow:rgba(217,75,100,.42); --bh-accent:#d94b64; --bh-glow:rgba(217,75,100,.42);
--sc-accent:#38b9d6; --sc-glow:rgba(56,185,214,.40); --sc-accent:#38b9d6; --sc-glow:rgba(56,185,214,.40);
--nw-accent:#4f8ff7; --nw-glow:rgba(79,143,247,.42); --nw-accent:#4f8ff7; --nw-glow:rgba(79,143,247,.42);
--mm-accent:#a979f7; --mm-secondary:#59d6b5; --mm-glow:rgba(169,121,247,.38);
--tt-accent:#eb5dac; --tt-secondary:#668cff; --tt-glow:rgba(235,93,172,.38);
--dl-accent:#e78b39; --dl-secondary:#38bbb8; --dl-glow:rgba(231,139,57,.36);
--ss-accent:#81d695; --ss-secondary:#e7ad54; --ss-glow:rgba(129,214,149,.32);
--ff-accent:#d9ad54; --ff-secondary:#7d8ee9; --ff-glow:rgba(217,173,84,.30);
--fluxtimer-primary:#ff5a5f; --fluxtimer-secondary:#f0a81a; --fluxtimer-primary:#ff5a5f; --fluxtimer-secondary:#f0a81a;
--fluxtimer-display:#170704; --fluxtimer-segment:#ff765f; --fluxtimer-display:#170704; --fluxtimer-segment:#ff765f;
--glow-s:rgba(240,168,26,.55); --glow-w:rgba(240,168,26,.16); --glow-s:rgba(240,168,26,.55); --glow-w:rgba(240,168,26,.16);
@@ -35,6 +40,11 @@
--bh-accent:#b42342; --bh-glow:rgba(180,35,66,.26); --bh-accent:#b42342; --bh-glow:rgba(180,35,66,.26);
--sc-accent:#147f9e; --sc-glow:rgba(20,127,158,.26); --sc-accent:#147f9e; --sc-glow:rgba(20,127,158,.26);
--nw-accent:#2868c7; --nw-glow:rgba(40,104,199,.26); --nw-accent:#2868c7; --nw-glow:rgba(40,104,199,.26);
--mm-accent:#7d4ac5; --mm-secondary:#127b68; --mm-glow:rgba(125,74,197,.24);
--tt-accent:#b42c76; --tt-secondary:#315bb8; --tt-glow:rgba(180,44,118,.22);
--dl-accent:#ba5d16; --dl-secondary:#147d7a; --dl-glow:rgba(186,93,22,.22);
--ss-accent:#277d49; --ss-secondary:#a56918; --ss-glow:rgba(39,125,73,.20);
--ff-accent:#a8781f; --ff-secondary:#4b59ae; --ff-glow:rgba(168,120,31,.20);
--fluxtimer-primary:#b42342; --fluxtimer-secondary:#c96a12; --fluxtimer-primary:#b42342; --fluxtimer-secondary:#c96a12;
--fluxtimer-display:#fff5ec; --fluxtimer-segment:#a93131; --fluxtimer-display:#fff5ec; --fluxtimer-segment:#a93131;
--glow-s:rgba(214,81,22,.40); --glow-w:rgba(214,81,22,.12); --glow-s:rgba(214,81,22,.40); --glow-w:rgba(214,81,22,.12);
@@ -2,7 +2,7 @@
function load(){try{return Object.assign({},defaults,JSON.parse(localStorage.getItem(KEY)||'{}'));}catch(e){return Object.assign({},defaults);}}var state=load(); function load(){try{return Object.assign({},defaults,JSON.parse(localStorage.getItem(KEY)||'{}'));}catch(e){return Object.assign({},defaults);}}var state=load();
function apply(){var h=document.documentElement;h.setAttribute('data-mf-font',String(state.font));h.setAttribute('data-mf-readable',state.readable);h.setAttribute('data-mf-contrast',state.contrast);h.setAttribute('data-mf-color',state.color?'safe':'standard');h.setAttribute('data-mf-mono',state.mono);h.setAttribute('data-mf-links',state.links);h.setAttribute('data-mf-motion',state.motion);h.setAttribute('data-mf-cursor',state.cursor);try{localStorage.setItem(KEY,JSON.stringify(state));}catch(e){}} function apply(){var h=document.documentElement;h.setAttribute('data-mf-font',String(state.font));h.setAttribute('data-mf-readable',state.readable);h.setAttribute('data-mf-contrast',state.contrast);h.setAttribute('data-mf-color',state.color?'safe':'standard');h.setAttribute('data-mf-mono',state.mono);h.setAttribute('data-mf-links',state.links);h.setAttribute('data-mf-motion',state.motion);h.setAttribute('data-mf-cursor',state.cursor);try{localStorage.setItem(KEY,JSON.stringify(state));}catch(e){}}
apply(); apply();
function applySkin(){var root=document.querySelector('[data-a11y-skin]'),skin=root&&root.getAttribute('data-a11y-skin');if(!skin&&document.querySelector('.esc-app'))skin='codeescape';if(!skin&&document.querySelector('.bh-app'))skin='bughunter';if(!skin&&document.querySelector('.sc-app'))skin='serviceclash';if(!skin&&document.querySelector('.nw-app'))skin='networker';if(skin)document.body.classList.add('mf-a11y-skin-'+skin);} function applySkin(){var root=document.querySelector('[data-a11y-skin]'),skin=root&&root.getAttribute('data-a11y-skin');if(!skin&&document.querySelector('.mm-body'))skin='mindmatch';if(!skin&&document.querySelector('.tt-body'))skin='techtacular';if(!skin&&document.querySelector('.dl-body,.dlg-body'))skin='devlab';if(!skin&&document.querySelector('.ss-body'))skin='syntaxsaga';if(!skin&&document.querySelector('.finalflux-shell,.finalflux-page'))skin='finalflux';if(!skin&&document.querySelector('.esc-app'))skin='codeescape';if(!skin&&document.querySelector('.bh-app'))skin='bughunter';if(!skin&&document.querySelector('.sc-app'))skin='serviceclash';if(!skin&&document.querySelector('.nw-app'))skin='networker';if(skin)document.body.classList.add('mf-a11y-skin-'+skin);}
function button(id,icon,label,detail){return '<button type="button" class="mf-a11y-option" data-a11y="'+id+'"><strong aria-hidden="true">'+icon+'</strong><span>'+label+'</span>'+(detail?'<small>'+detail+'</small>':'')+'</button>';} function button(id,icon,label,detail){return '<button type="button" class="mf-a11y-option" data-a11y="'+id+'"><strong aria-hidden="true">'+icon+'</strong><span>'+label+'</span>'+(detail?'<small>'+detail+'</small>':'')+'</button>';}
function init(){if(document.querySelector('.mf-a11y-trigger'))return;var trigger=document.createElement('button');trigger.type='button';trigger.className='mf-a11y-trigger';trigger.setAttribute('aria-label','Barrierefreiheit öffnen');trigger.setAttribute('aria-expanded','false');trigger.setAttribute('aria-controls','mf-a11y-panel');trigger.innerHTML='<svg viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><circle cx="18" cy="5" r="3" fill="currentColor"/><path d="M13 11l5-2 5 4m-7-2-2 7-6 1m8-4 6 2 3 7M13 18a7 7 0 1 0 6 7"/></svg>'; function init(){if(document.querySelector('.mf-a11y-trigger'))return;var trigger=document.createElement('button');trigger.type='button';trigger.className='mf-a11y-trigger';trigger.setAttribute('aria-label','Barrierefreiheit öffnen');trigger.setAttribute('aria-expanded','false');trigger.setAttribute('aria-controls','mf-a11y-panel');trigger.innerHTML='<svg viewBox="0 0 32 32" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><circle cx="18" cy="5" r="3" fill="currentColor"/><path d="M13 11l5-2 5 4m-7-2-2 7-6 1m8-4 6 2 3 7M13 18a7 7 0 1 0 6 7"/></svg>';
var panel=document.createElement('section');panel.id='mf-a11y-panel';panel.className='mf-a11y-panel';panel.hidden=true;panel.setAttribute('role','dialog');panel.setAttribute('aria-modal','false');panel.setAttribute('aria-labelledby','mf-a11y-title');panel.innerHTML='<div class="mf-a11y-head"><button type="button" class="mf-a11y-close" aria-label="Barrierefreiheit schließen">×</button><h2 id="mf-a11y-title">Barrierefreiheit</h2></div><div class="mf-a11y-grid">'+button('font','T⁺','Text vergrößern','100 %')+button('contrast','◐','Hochkontrast')+button('color','◉','Farbenblind-Modus')+button('mono','◒','Monochrom')+button('readable','Aa','Lesemodus (Dyslexie)','Verdana + Abstände')+button('links','🔗','Links unterstreichen')+button('motion','Ⅱ','Animationen stoppen')+button('cursor','➤','Großer Cursor')+button('reset','↺','Alles zurücksetzen')+'</div>'; var panel=document.createElement('section');panel.id='mf-a11y-panel';panel.className='mf-a11y-panel';panel.hidden=true;panel.setAttribute('role','dialog');panel.setAttribute('aria-modal','false');panel.setAttribute('aria-labelledby','mf-a11y-title');panel.innerHTML='<div class="mf-a11y-head"><button type="button" class="mf-a11y-close" aria-label="Barrierefreiheit schließen">×</button><h2 id="mf-a11y-title">Barrierefreiheit</h2></div><div class="mf-a11y-grid">'+button('font','T⁺','Text vergrößern','100 %')+button('contrast','◐','Hochkontrast')+button('color','◉','Farbenblind-Modus')+button('mono','◒','Monochrom')+button('readable','Aa','Lesemodus (Dyslexie)','Verdana + Abstände')+button('links','🔗','Links unterstreichen')+button('motion','Ⅱ','Animationen stoppen')+button('cursor','➤','Großer Cursor')+button('reset','↺','Alles zurücksetzen')+'</div>';
+2 -2
View File
@@ -32,13 +32,13 @@
document.head.appendChild(accessibilityCss); document.head.appendChild(accessibilityCss);
var accessibilityPlacementCss = document.createElement('link'); var accessibilityPlacementCss = document.createElement('link');
accessibilityPlacementCss.rel = 'stylesheet'; accessibilityPlacementCss.rel = 'stylesheet';
accessibilityPlacementCss.href = '/css/accessibility-placement.css?v=8'; accessibilityPlacementCss.href = '/css/accessibility-placement.css?v=9';
accessibilityPlacementCss.setAttribute('data-accessibility', ''); accessibilityPlacementCss.setAttribute('data-accessibility', '');
document.head.appendChild(accessibilityPlacementCss); document.head.appendChild(accessibilityPlacementCss);
} }
if (!document.querySelector('script[data-accessibility]')) { if (!document.querySelector('script[data-accessibility]')) {
var accessibilityScript = document.createElement('script'); var accessibilityScript = document.createElement('script');
accessibilityScript.src = '/js/accessibility.js?v=7'; accessibilityScript.src = '/js/accessibility.js?v=8';
accessibilityScript.defer = true; accessibilityScript.defer = true;
accessibilityScript.setAttribute('data-accessibility', ''); accessibilityScript.setAttribute('data-accessibility', '');
document.head.appendChild(accessibilityScript); document.head.appendChild(accessibilityScript);
@@ -6,7 +6,7 @@
<title>Dev Lab Spiel – Mindflux</title> <title>Dev Lab Spiel – Mindflux</title>
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
<link rel="stylesheet" href="/css/devlabgame.css?v=4"> <link rel="stylesheet" href="/css/devlabgame.css?v=5">
</head> </head>
<body class="dlg-body" th:attr="data-game=${gameSlug}"> <body class="dlg-body" th:attr="data-game=${gameSlug}">
<div class="dlg-shell"> <div class="dlg-shell">
+1 -1
View File
@@ -6,7 +6,7 @@
<title>Dev Lab - Mindflux</title> <title>Dev Lab - Mindflux</title>
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
<link rel="stylesheet" href="/css/devlab.css?v=2"> <link rel="stylesheet" href="/css/devlab.css?v=3">
</head> </head>
<body class="dl-body"> <body class="dl-body">
<div class="mf-shell no-right dl-shell"> <div class="mf-shell no-right dl-shell">
+1 -1
View File
@@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/style.css"> <link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<link rel="stylesheet" href="/css/finalflux.css"> <link rel="stylesheet" href="/css/finalflux.css?v=2">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
</head> </head>
<body class="finalflux-shell"> <body class="finalflux-shell">
+1 -1
View File
@@ -6,7 +6,7 @@
<title>MindMatch – Mindflux</title> <title>MindMatch – Mindflux</title>
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
<link rel="stylesheet" href="/css/mindmatch.css?v=4"> <link rel="stylesheet" href="/css/mindmatch.css?v=5">
</head> </head>
<body class="mm-body"> <body class="mm-body">
+1 -1
View File
@@ -6,7 +6,7 @@
<title>Syntax Saga – Mindflux</title> <title>Syntax Saga – Mindflux</title>
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
<link rel="stylesheet" href="/css/syntaxsaga.css?v=1"> <link rel="stylesheet" href="/css/syntaxsaga.css?v=2">
</head> </head>
<body class="ss-body"> <body class="ss-body">
@@ -6,7 +6,7 @@
<title>TechTacular – Mindflux</title> <title>TechTacular – Mindflux</title>
<link rel="stylesheet" href="/css/theme.css"> <link rel="stylesheet" href="/css/theme.css">
<script src="/js/theme.js"></script> <script src="/js/theme.js"></script>
<link rel="stylesheet" href="/css/techtacular.css?v=3"> <link rel="stylesheet" href="/css/techtacular.css?v=4">
</head> </head>
<body class="tt-body"> <body class="tt-body">