AP4 Spielanleitungen & Hints: gemeinsames Guide-Modul + MindMatch Paar-Blitz

- game-guide.js/.css (neu): gemeinsames "So funktioniert's"-Overlay mit ?-Button
  in der Header-Tools-Leiste, Auto-Open beim Erstbesuch (localStorage
  mf-guide-seen:<slug>), Escape/Backdrop schliesst, Fokus-Trap; deutsches Inline-
  Registry fuer 7 Spiele (Networker bleibt bewusst bei seinem Inline-Guide). API
  window.MindfluxGuide = {open, close, registerHintProvider} fuer einheitliche
  Tipp-Buttons. Injektion via theme.js nur auf Game-Routen (wie FluxTimer), keine
  Template-Edits.
- mindmatch.js: Hint "Paar-Blitz" (3 Ladungen) deckt ~1s ein ungematchtes Paar
  auf und kostet +1 Zug -> Score/Sterne degradieren ueber die bestehende
  Serverformel (null Backend-Aenderung); Reset in newGame, Verstecken in
  finish/cancelGame; .mm-card.hinted-Glow.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WFxcjtc9HNP4VECT6Ur1tE
This commit is contained in:
AliceDarkest
2026-07-21 00:32:11 +02:00
parent f8f068150e
commit 983e57cd8d
4 changed files with 561 additions and 0 deletions
@@ -0,0 +1,167 @@
/* Mindflux – Gemeinsames Guide-Modul „So funktioniert's".
Styles für den „?"-Trigger, den Tipp-Button, das Overlay und den MindMatch-Hint-Glow.
Theme-bewusst: dunkel als Standard, helle Überschreibungen für data-theme="light". */
/* ---------- Buttons in der Header-Tools-Leiste ---------- */
.mf-guide-trigger,
.mf-guide-hint {
font: inherit;
color: inherit;
cursor: pointer;
border: 1px solid rgba(255, 255, 255, 0.28);
background: rgba(255, 255, 255, 0.06);
border-radius: 999px;
transition: background-color .2s ease, border-color .2s ease, transform .12s ease;
}
.mf-guide-trigger {
display: inline-flex;
align-items: center;
justify-content: center;
width: 2.1rem;
height: 2.1rem;
font-size: 1.05rem;
font-weight: 700;
line-height: 1;
}
.mf-guide-hint {
padding: .34rem .8rem;
font-size: .85rem;
font-weight: 600;
white-space: nowrap;
}
.mf-guide-trigger:hover,
.mf-guide-hint:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.16);
border-color: rgba(255, 255, 255, 0.5);
transform: translateY(-1px);
}
.mf-guide-trigger:focus-visible,
.mf-guide-hint:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
.mf-guide-hint:disabled {
opacity: .45;
cursor: not-allowed;
}
/* ---------- Overlay ---------- */
.mf-guide-backdrop {
position: fixed;
inset: 0;
z-index: 99999;
display: flex;
align-items: center;
justify-content: center;
padding: 1.25rem;
background: rgba(5, 8, 16, 0.72);
backdrop-filter: blur(4px);
}
.mf-guide-backdrop[hidden] { display: none; }
.mf-guide-panel {
width: min(34rem, 100%);
max-height: min(82vh, 640px);
overflow-y: auto;
box-sizing: border-box;
padding: 1.4rem 1.5rem 1.6rem;
border-radius: 18px;
border: 1px solid rgba(255, 255, 255, 0.14);
background: #141a26;
color: #eef2f8;
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.5);
animation: mf-guide-in .22s ease;
}
@keyframes mf-guide-in {
from { opacity: 0; transform: translateY(12px) scale(.98); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.mf-guide-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
margin-bottom: .4rem;
}
.mf-guide-kicker {
font-size: .72rem;
letter-spacing: .16em;
text-transform: uppercase;
opacity: .7;
}
.mf-guide-close {
flex: none;
width: 2rem;
height: 2rem;
border: none;
border-radius: 50%;
cursor: pointer;
font-size: 1.3rem;
line-height: 1;
color: inherit;
background: rgba(255, 255, 255, 0.08);
}
.mf-guide-close:hover { background: rgba(255, 255, 255, 0.18); }
.mf-guide-title {
margin: 0 0 .9rem;
font-size: 1.3rem;
line-height: 1.25;
}
.mf-guide-steps {
margin: 0 0 1rem;
padding-left: 1.2rem;
display: grid;
gap: .5rem;
}
.mf-guide-steps li { line-height: 1.45; }
.mf-guide-tip {
margin: 0;
padding: .75rem .9rem;
border-radius: 12px;
line-height: 1.45;
background: rgba(120, 170, 255, 0.14);
border: 1px solid rgba(120, 170, 255, 0.3);
}
body.mf-guide-open { overflow: hidden; }
/* ---------- Helles Theme ---------- */
:root[data-theme="light"] .mf-guide-trigger,
:root[data-theme="light"] .mf-guide-hint {
border-color: rgba(20, 30, 50, 0.28);
background: rgba(20, 30, 50, 0.05);
}
:root[data-theme="light"] .mf-guide-trigger:hover,
:root[data-theme="light"] .mf-guide-hint:hover:not(:disabled) {
background: rgba(20, 30, 50, 0.12);
border-color: rgba(20, 30, 50, 0.45);
}
:root[data-theme="light"] .mf-guide-backdrop { background: rgba(15, 23, 42, 0.5); }
:root[data-theme="light"] .mf-guide-panel {
background: #ffffff;
color: #16202e;
border-color: rgba(20, 30, 50, 0.12);
}
:root[data-theme="light"] .mf-guide-close { background: rgba(20, 30, 50, 0.08); }
:root[data-theme="light"] .mf-guide-close:hover { background: rgba(20, 30, 50, 0.16); }
:root[data-theme="light"] .mf-guide-tip {
background: rgba(60, 110, 220, 0.12);
border-color: rgba(60, 110, 220, 0.28);
}
/* ---------- MindMatch – kurz aufgedecktes Tipp-Paar ---------- */
.mm-card.hinted {
position: relative;
z-index: 2;
box-shadow: 0 0 0 2px #ffd54a, 0 0 22px 5px rgba(255, 213, 74, 0.6);
border-radius: 14px;
animation: mf-hint-pulse 1s ease;
}
@keyframes mf-hint-pulse {
0%, 100% { filter: none; }
50% { filter: brightness(1.12); }
}
@media (prefers-reduced-motion: reduce) {
.mf-guide-panel { animation: none; }
.mm-card.hinted { animation: none; }
}