Implement fixed viewport with internal scrolling

Restructure app layout to prevent whole-page scrolling. The viewport
is now locked at 100vh with overflow:hidden, and individual content
areas scroll internally.

Architecture changes:
- Lock html/body at 100% height with overflow:hidden
- Fix Layout component to 100vh, Screen to 100% height
- Enable internal scrolling for content areas with flex:1 + overflow-y:auto

New game wizard improvements:
- Split forms into three sections: form-header (fixed), form-content
  (scrollable), form-footer (fixed with arrow navigation)
- Fixes issue where many player names pushed navigation arrows off-screen
- Applied to Player1Step, Player2Step, Player3Step, GameTypeStep

Game list improvements:
- Filter buttons stay fixed at top
- Games container scrolls internally with overflow-y:auto
- "Neues Spiel" button wrapped with flex-shrink:0

Game detail improvements:
- Game controls stay visible while content scrolls

Additional changes:
- Add Playwright test artifact exclusions to .gitignore
- Add Docker build instructions to README.md
- Remove unnecessary setSelectionRange calls from player input steps

Benefits:
- No accidental page scrolling
- Cleaner mobile UX (no address bar show/hide issues)
- Navigation controls always visible
- Predictable, contained scrolling behavior
This commit is contained in:
Frank Schwenk
2025-11-07 14:23:03 +01:00
parent 65aaa92359
commit 076d6ced36
14 changed files with 247 additions and 153 deletions

View File

@@ -13,10 +13,12 @@
.screen-content {
display: flex;
flex-direction: column;
min-height: 100vh;
height: 100%;
padding: var(--space-lg);
overflow-y: auto;
overflow-x: hidden;
-webkit-overflow-scrolling: touch;
min-height: 0;
}
.screen-title {
font-size: var(--font-size-xxl);
@@ -122,11 +124,31 @@
background: var(--color-surface);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
padding: var(--space-xl) var(--space-lg) var(--space-lg) var(--space-lg);
padding: 0;
display: flex;
flex-direction: column;
gap: var(--space-lg);
border: 1px solid var(--color-border);
flex: 1;
min-height: 0;
overflow: hidden;
}
.form-header {
flex-shrink: 0;
padding: var(--space-xl) var(--space-lg) var(--space-md) var(--space-lg);
}
.form-content {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: 0 var(--space-lg);
min-height: 0;
}
.form-footer {
flex-shrink: 0;
padding: var(--space-lg);
}
.progress-indicator {
display: flex;