Skip to content

feat(style): Motion-Fundament (reduced-motion + Tokens) + Wow-Polish#162

Merged
gerfru merged 1 commit into
mainfrom
feat/motion-foundation
Jun 8, 2026
Merged

feat(style): Motion-Fundament (reduced-motion + Tokens) + Wow-Polish#162
gerfru merged 1 commit into
mainfrom
feat/motion-foundation

Conversation

@gerfru

@gerfru gerfru commented Jun 8, 2026

Copy link
Copy Markdown
Owner

Kontext

Ergebnis des /dev:tool-style-Research (State-of-the-Art Dashboard-Design 2026 + AI-Anti-Pattern „Skeleton/Slop"). Befund: PulseBase hat bereits einen guten Wow-Moment (animierter Hero-Readiness-Ring), aber zwei Motion-Fundament-Lücken + Politur-Potenzial. Dieser PR legt das Fundament, macht den bestehenden Ring korrekt + premium und fügt einen dezenten neuen Wow hinzu — alles strikt prefers-reduced-motion-sicher, im bestehenden Token-/CSS-Stil (kein Framework, kein Build-Step, CSP-konform).

Änderungen

🚪 Gate A — prefers-reduced-motion-Guard (global)

Fehlte projektweit komplett. Globaler @media-Override neutralisiert alle Animationen/Transitions (WCAG 2.3.3) — relevant für eine Gesundheits-App (Trust). Betrifft nur Bewegung, nicht Fokus-Outlines.

🚪 Gate B — Motion-Tokens

Timings waren verstreut (.1s.4s). Neue :root-Tokens --dur-fast/base/slow, --ease-out, --ease-spring — analog zum bestehenden Spacing-/Typo-Token-System. (Migration alter Timings bewusst nicht Teil dieses PRs.)

✨ C — Neuer Wow: gestaffelte Karten-Entrance

card-in-Keyframe (opacity + translateY 8px), nth-child-Stagger (0/40/80/120 ms), CSS-only, backwards. Durch Gate A bei Reduced-Motion automatisch neutralisiert.

🎯 D — Hero-Ring: Easing + Korrektheit

Bestehende rAF-Animation (dashboard-hero.js) von linear → cubic-ease-out (premium-Feel) + expliziter matchMedia-Guard: das CSS-Gate greift bei JS-getriebenem setAttribute nicht, daher wird bei Reduced-Motion der Endzustand sofort gesetzt (kein Hochzählen/Draw-in).

Bewusst ausgeklammert (respektierte Bestandsentscheidungen)

  • Chart.js animation: false bleibt unangetastet
  • Opake Karten (kein Glassmorphism) bleiben
  • Skeleton-Screens = separater Folge-PR (300-ms-Regel, exakte Layout-Spiegelung, kein Layout-Shift)

Verifikation

  • npm test188/188 JS-Tests grün
  • Biome (js-lint-Gate) clean
  • Kein make tailwind-build nötig (keine neuen Tailwind-Utilities)
  • Manuell zu prüfen: Dashboard laden → Karten staffeln ein, Ring bremst am Ende ab; OS-Reduced-Motion an → Karten sofort da, Ring springt auf Endwert

🤖 Generated with Claude Code

Aus /dev:tool-style-Research (SOTA-Dashboard-Design + AI-Anti-Pattern):

Gate A — prefers-reduced-motion-Guard (global, style.css): neutralisiert
  alle Animationen/Transitions. WCAG 2.3.3 — fehlte projektweit komplett.

Gate B — Motion-Tokens in :root: --dur-fast/base/slow, --ease-out/-spring;
  analog zum bestehenden Spacing-/Typo-Token-System (Timings waren verstreut).

C — Neuer Wow: gestaffelte Karten-Entrance (card-in keyframe, nth-child-Delay,
  CSS-only, backwards). Reduced-Motion via Gate A automatisch neutralisiert.

D — Hero-Ring (dashboard-hero.js): bestehende rAF-Animation auf cubic-ease-out
  umgestellt (vorher linear) + expliziter matchMedia-Guard — CSS-Gate greift bei
  JS-getriebenem setAttribute nicht, daher Endzustand bei reduce sofort setzen.

Bewusst ausgeklammert: Chart.js animation:false (Bestandsentscheidung), opake
Karten (kein Glassmorphism). Skeleton-Screens = separater Folge-PR.

Verifiziert: 188/188 JS-Tests, Biome clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@gerfru gerfru merged commit 9461c1b into main Jun 8, 2026
10 checks passed
@gerfru gerfru deleted the feat/motion-foundation branch June 8, 2026 14:31
gerfru added a commit that referenced this pull request Jun 8, 2026
…ft) (#163)

Dritter Styling-Review-Schritt (nach #161 Audit, #162 Motion). Ersetzt den
"blank-then-pop"-Flash: #bento-hero zeigte <p>Lade…</p> (kollabiert) und
expandierte schlagartig — echter Layout-Shift.

- Skeleton-Primitive in style.css (.skeleton, .skel-box/-circle/-line/-tile)
  mit Pulse; nutzt --surface-2/--radius-sm (theme-aware gratis).
- Hero- + Aktivitäten-Skeleton im Template spiegeln das finale Layout über
  dieselben .hero-grid-Klassen → null Shift (NN/g). Ersetzt automatisch beim
  ersten buildHeroCard()/renderActivitiesTable() (innerHTML-Overwrite), kein JS.
- 300-ms-Regel CSS-only: .skeleton opacity:0 + animation-delay:300ms → bei
  schnellem fetch kein Flash. Reduced-Motion via Gate A (#162) automatisch;
  Platzhalter aria-hidden.
- Chart-Karten bewusst ausgenommen (.chart-wrap reserviert Höhe, kein Shift).

Tests: deterministischer pytest-Template-Test (test_pages.py). Doku:
design-decisions.md um Motion (#162 nachgeholt) + Skeleton-Abschnitt erweitert.

Verifiziert: pytest 27/27, JS 188/188.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
gerfru added a commit that referenced this pull request Jun 12, 2026
…162)

Aus /dev:tool-style-Research (SOTA-Dashboard-Design + AI-Anti-Pattern):

Gate A — prefers-reduced-motion-Guard (global, style.css): neutralisiert
  alle Animationen/Transitions. WCAG 2.3.3 — fehlte projektweit komplett.

Gate B — Motion-Tokens in :root: --dur-fast/base/slow, --ease-out/-spring;
  analog zum bestehenden Spacing-/Typo-Token-System (Timings waren verstreut).

C — Neuer Wow: gestaffelte Karten-Entrance (card-in keyframe, nth-child-Delay,
  CSS-only, backwards). Reduced-Motion via Gate A automatisch neutralisiert.

D — Hero-Ring (dashboard-hero.js): bestehende rAF-Animation auf cubic-ease-out
  umgestellt (vorher linear) + expliziter matchMedia-Guard — CSS-Gate greift bei
  JS-getriebenem setAttribute nicht, daher Endzustand bei reduce sofort setzen.

Bewusst ausgeklammert: Chart.js animation:false (Bestandsentscheidung), opake
Karten (kein Glassmorphism). Skeleton-Screens = separater Folge-PR.

Verifiziert: 188/188 JS-Tests, Biome clean.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
gerfru added a commit that referenced this pull request Jun 12, 2026
…ft) (#163)

Dritter Styling-Review-Schritt (nach #161 Audit, #162 Motion). Ersetzt den
"blank-then-pop"-Flash: #bento-hero zeigte <p>Lade…</p> (kollabiert) und
expandierte schlagartig — echter Layout-Shift.

- Skeleton-Primitive in style.css (.skeleton, .skel-box/-circle/-line/-tile)
  mit Pulse; nutzt --surface-2/--radius-sm (theme-aware gratis).
- Hero- + Aktivitäten-Skeleton im Template spiegeln das finale Layout über
  dieselben .hero-grid-Klassen → null Shift (NN/g). Ersetzt automatisch beim
  ersten buildHeroCard()/renderActivitiesTable() (innerHTML-Overwrite), kein JS.
- 300-ms-Regel CSS-only: .skeleton opacity:0 + animation-delay:300ms → bei
  schnellem fetch kein Flash. Reduced-Motion via Gate A (#162) automatisch;
  Platzhalter aria-hidden.
- Chart-Karten bewusst ausgenommen (.chart-wrap reserviert Höhe, kein Shift).

Tests: deterministischer pytest-Template-Test (test_pages.py). Doku:
design-decisions.md um Motion (#162 nachgeholt) + Skeleton-Abschnitt erweitert.

Verifiziert: pytest 27/27, JS 188/188.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant