Compare commits

...

2 Commits

Author SHA1 Message Date
beo3000 310cc0e2ec layout optimization for tablets 2026-01-09 10:59:15 +01:00
beo3000 325bf5b002 added manifest and icons 2026-01-09 09:54:43 +01:00
6 changed files with 122 additions and 54 deletions

View File

@ -18,7 +18,9 @@
"Bash(cat:*)", "Bash(cat:*)",
"Bash(dir:*)", "Bash(dir:*)",
"Bash(dotnet add:*)", "Bash(dotnet add:*)",
"Bash(del \"C:\\\\work\\\\chrka\\\\Koogle2025\\\\KoogleApp\\\\src\\\\Koogle.Application\\\\DTOs\\\\DayProtocolDto.cs\")" "Bash(del \"C:\\\\work\\\\chrka\\\\Koogle2025\\\\KoogleApp\\\\src\\\\Koogle.Application\\\\DTOs\\\\DayProtocolDto.cs\")",
"Bash(ls -la \"C:\\\\work\\\\chrka\\\\Koogle2025\\\\KoogleApp\\\\src\\\\Koogle.Web\\\\wwwroot\"\" | grep -E \"icon)",
"Bash(png \")"
] ]
} }
} }

View File

@ -3,7 +3,13 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="KOOGLE" />
<meta name="mobile-web-app-capable" content="yes" />
<link rel="manifest" href="manifest.webmanifest" />
<link rel="apple-touch-icon" href="icon-192.png" />
<base href="/" /> <base href="/" />
<link rel="stylesheet" href="@Assets["app.css"]" /> <link rel="stylesheet" href="@Assets["app.css"]" />
<link rel="stylesheet" href="@Assets["Koogle.Web.styles.css"]" /> <link rel="stylesheet" href="@Assets["Koogle.Web.styles.css"]" />

View File

@ -14,72 +14,77 @@
@GameState.Value.ThrowPanelBefore *@ @GameState.Value.ThrowPanelBefore *@
<div class="game-input-panel"> <div class="game-input-panel">
@* Current player display *@ @* Left column: Player + Pins *@
<div class="current-player-section"> <div class="left-column">
<MudText Typo="Typo.h6" Class="player-label">Aktueller Spieler</MudText> @* Current player display *@
<MudText Typo="Typo.h4" Class="player-name"> <div class="current-player-section">
@(CurrentPlayerName ?? "Kein Spieler") <MudText Typo="Typo.h6" Class="player-label">Aktueller Spieler</MudText>
</MudText> <MudText Typo="Typo.h4" Class="player-name">
@if (GameState.Value.Participants.Mode == ParticipantsMode.FreeToChoose) @(CurrentPlayerName ?? "Kein Spieler")
</MudText>
@if (GameState.Value.Participants.Mode == ParticipantsMode.FreeToChoose)
{
<MudButton Variant="Variant.Outlined"
Color="Color.Warning"
Size="Size.Small"
OnClick="ShowPlayerSelector"
StartIcon="@Icons.Material.Filled.SwapHoriz">
Spieler wechseln
</MudButton>
}
</div>
@* Pin input area *@
<div class="pin-input-section">
<PinPanel ThrowPanelState="@GameState.Value.ThrowPanelAfter"
IsInteractive="@IsInteractive"
OnPinClicked="HandlePinClick" />
</div>
@* Number quick-entry (below pins) *@
@if (@GameState.Value.ThrowPanelAfter.ThrowMode == ThrowMode.Reposition)
{ {
<MudButton Variant="Variant.Outlined" <div class="number-input-section">
Color="Color.Warning" <NumberPanel IsInteractive="@IsInteractive"
Size="Size.Small" CanConfirmThrow="@CanConfirmThrow"
OnClick="ShowPlayerSelector" SelectedNumber="@_selectedNumber"
StartIcon="@Icons.Material.Filled.SwapHoriz"> OnNumberClicked="HandleNumberClick" />
Spieler wechseln </div>
</MudButton>
} }
</div> </div>
@* Pin input area *@ @* Right column: Controls *@
<div class="pin-input-section"> <div class="right-column">
<PinPanel ThrowPanelState="@GameState.Value.ThrowPanelAfter" <ConfirmPanel IsInteractive="@IsInteractive"
IsInteractive="@IsInteractive" CanConfirmThrow="@CanConfirmThrow"
OnPinClicked="HandlePinClick" /> OnBellClicked="HandleBellClick"
</div> OnThrowConfirmed="HandleThrowConfirmed"/>
@* Throw info and controls *@
@if (@GameState.Value.ThrowPanelAfter.ThrowMode == ThrowMode.Reposition) <div class="throw-control-section">
{ <ThrowPanel ThrowPanelState="@GameState.Value.ThrowPanelAfter"
@* Number quick-entry *@ IsInteractive="@IsInteractive"
<div class="number-input-section"> OnGutterClicked="HandleGutterClick" />
<NumberPanel IsInteractive="@IsInteractive"
CanConfirmThrow="@CanConfirmThrow"
SelectedNumber="@_selectedNumber"
OnNumberClicked="HandleNumberClick" />
</div> </div>
}
<ConfirmPanel IsInteractive="@IsInteractive"
CanConfirmThrow="@CanConfirmThrow"
OnBellClicked="HandleBellClick"
OnThrowConfirmed="HandleThrowConfirmed"/>
@* Throw info and controls *@ @* Undo/Redo buttons *@
<div class="throw-control-section"> <div class="undo-section">
<ThrowPanel ThrowPanelState="@GameState.Value.ThrowPanelAfter" <UndoRedoButtons IsDisabled="@GameState.Value.IsSaving" />
IsInteractive="@IsInteractive" </div>
OnGutterClicked="HandleGutterClick" />
@* Game-specific actions *@
<GameActionPanel />
</div> </div>
@* Undo/Redo buttons *@ @* Error display (full width) *@
<div class="undo-section">
<UndoRedoButtons IsDisabled="@GameState.Value.IsSaving" />
</div>
@* Game-specific actions *@
<GameActionPanel />
@* Error display *@
@if (!string.IsNullOrEmpty(GameState.Value.Error)) @if (!string.IsNullOrEmpty(GameState.Value.Error))
{ {
<MudAlert Severity="Severity.Error" Class="mt-2"> <MudAlert Severity="Severity.Error" Class="mt-2 error-section">
@GameState.Value.Error @GameState.Value.Error
</MudAlert> </MudAlert>
} }
@* Saving indicator *@ @* Saving indicator (full width) *@
@if (GameState.Value.IsSaving) @if (GameState.Value.IsSaving)
{ {
<div class="saving-indicator"> <div class="saving-indicator">
@ -95,10 +100,44 @@
flex-direction: column; flex-direction: column;
gap: 16px; gap: 16px;
padding: 16px; padding: 16px;
max-width: 500px; max-width: 900px;
margin: 0 auto; margin: 0 auto;
} }
.left-column {
display: flex;
flex-direction: column;
gap: 16px;
}
.right-column {
display: flex;
flex-direction: column;
gap: 16px;
}
/* Tablet and larger: two-column layout */
@@media (min-width: 768px) {
.game-input-panel {
display: grid;
grid-template-columns: minmax(300px, 1fr) minmax(280px, 1fr);
gap: 24px;
align-items: start;
}
.error-section,
.saving-indicator {
grid-column: 1 / -1;
}
}
/* Mobile: stack everything vertically */
@@media (max-width: 767px) {
.game-input-panel {
max-width: 500px;
}
}
.current-player-section { .current-player-section {
text-align: center; text-align: center;
padding: 16px; padding: 16px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

View File

@ -0,0 +1,21 @@
{
"name": "KOOGLE",
"short_name": "KOOGLE",
"description": "Club Management App",
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#594AE2",
"icons": [
{
"src": "icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}