Skip to content

feat(style): Skeleton-Screens für Hero + Aktivitäten (kein Layout-Shift)#163

Merged
gerfru merged 1 commit into
mainfrom
feat/skeleton-screens
Jun 8, 2026
Merged

feat(style): Skeleton-Screens für Hero + Aktivitäten (kein Layout-Shift)#163
gerfru merged 1 commit into
mainfrom
feat/skeleton-screens

Conversation

@gerfru

@gerfru gerfru commented Jun 8, 2026

Copy link
Copy Markdown
Owner

Kontext

Dritter Schritt der Styling-Review-Serie (nach #161 Audit, #162 Motion). Behebt den „blank-then-pop"-Flash: #bento-hero zeigte <p class="empty">Lade…</p> (kollabiert) und expandierte schlagartig zur vollen Höhe, sobald buildHeroCard() feuert — ein echter Layout-Shift. Adressiert das vom Nutzer gewünschte AI-Anti-Pattern-Thema („Skeleton richtig machen").

Änderungen

Skeleton-Primitive (CSS)

.skeleton, .skel-box/-circle/-line/-tile + Pulse in style.css. Nutzt vorhandene Tokens (--surface-2, --radius-sm) → theme-aware (Dark/Light) gratis.

Hero- + Aktivitäten-Skeleton (Template)

Spiegeln das finale Layout über dieselben Layout-Klassen (.hero-grid.hero-ring-panel/.hero-right-panel, .hero-signals-row, .hero-capacity-grid) → null Layout-Shift (NN/g). Werden automatisch beim ersten buildHeroCard()/renderActivitiesTable() ersetzt (innerHTML-Overwrite) — kein JS nötig. Platzhalter aria-hidden="true".

300-ms-Regel (CSS-only, kein JS-Timer)

.skeleton startet opacity:0 + animation-delay:300ms. Kommt der Inhalt früher, wird das Markup ersetzt, bevor es je erscheint → kein Flash bei schnellen Loads (NN/g / LogRocket). Reduced-Motion via Gate A (#162) automatisch → statisch, kein Puls.

Bewusst ausgeklammert

Chart-Karten: .chart-wrap reserviert bereits feste Höhe (240/280 px) → kein Shift; Skeleton-Shimmer auf ~12 Canvas wäre Scope-Creep.

Tests & Doku

Verifikation

  • pytest tests/test_pages.py27/27 grün
  • npm test188/188 grün
  • Kein make tailwind-build nötig (keine neuen Tailwind-Utilities)
  • Manuell: DevTools → Network „Slow 3G" → Hero zeigt Skeleton in finaler Höhe, dann nahtlos Inhalt (kein Springen); ohne Drossel kein Flash; OS-Reduced-Motion → Skeleton statisch

🤖 Generated with Claude Code

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 gerfru merged commit 01e7520 into main Jun 8, 2026
10 checks passed
@gerfru gerfru deleted the feat/skeleton-screens branch June 8, 2026 14:58
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