feat: tablet-first UX overhaul with wizard improvements

- Tablet-first responsive scoreboard: whole player card is tap target
- Per-step wizard backgrounds and live summary panel
- Larger touch targets, safe-area handling, reduced-motion support
- German UI error strings in App.tsx
- Updated SOUL.md and README.md for current architecture
- Cleanup: removed legacy components, .cursor/, UI_IMPROVEMENTS.md
- Renamed package to bscscore, fixed TOTAL_WIZARD_STEPS
This commit is contained in:
Frank Schwenk
2026-09-21 17:59:31 +02:00
parent 3327f6e19e
commit 678977ab23
92 changed files with 3359 additions and 3063 deletions
+14 -18
View File
@@ -1,29 +1,25 @@
import { test, expect } from '@playwright/test';
import { test } from '@playwright/test';
import { addPoint, enterPlayerName, skipPlayer3 } from '../helpers/wizard';
test('test', async ({ page }) => {
await page.goto('http://localhost:3000/');
await page.getByRole('button', { name: 'Neues Spiel starten' }).click();
await page.getByRole('textbox', { name: 'Name Spieler' }).click();
await page.getByRole('textbox', { name: 'Name Spieler' }).fill('Wendy');
await page.getByRole('button', { name: 'Weiter' }).click();
await page.getByRole('textbox', { name: 'Name Spieler' }).click();
await page.getByRole('textbox', { name: 'Name Spieler' }).fill('Xavier');
await page.getByRole('button', { name: 'Weiter' }).click();
await page.getByRole('button', { name: 'Überspringen' }).click();
await enterPlayerName(page, 'Spieler 1', 'Name Spieler 1', 'Wendy');
await enterPlayerName(page, 'Spieler 2', 'Name Spieler 2', 'Xavier');
await skipPlayer3(page);
await page.getByRole('button', { name: '8-Ball' }).click();
await page.getByRole('button', { name: '5' }).click();
await page.getByRole('button', { name: 'Break-Regel wählen: Wechselbreak' }).click();
await page.getByRole('button', { name: 'Zuerst: Xavier' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Xavier' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Wendy' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Xavier' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Wendy' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Xavier' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Wendy' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Xavier' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Wendy' }).click();
await page.getByRole('button', { name: 'Aktueller Punktestand für Xavier' }).click();
await addPoint(page, 'Xavier', 0);
await addPoint(page, 'Wendy', 0);
await addPoint(page, 'Xavier', 1);
await addPoint(page, 'Wendy', 1);
await addPoint(page, 'Xavier', 2);
await addPoint(page, 'Wendy', 2);
await addPoint(page, 'Xavier', 3);
await addPoint(page, 'Wendy', 3);
await addPoint(page, 'Xavier', 4);
await page.getByRole('button', { name: 'Bestätigen' }).click();
await page.getByRole('button', { name: 'Zurück zur Liste' }).click();
});