refactor(frontend): Landing‑Seite als Start gesetzt, Navigation um AppScreen.Landing erweitert und Footer‑Text modernisiert.

This commit is contained in:
Stefan Mogeritsch 2025-12-13 13:00:13 +01:00
parent f402fbaf19
commit 7b5fd063fb
3 changed files with 118 additions and 2 deletions

View File

@ -20,7 +20,7 @@ fun AppFooter() {
contentAlignment = Alignment.Center
) {
Text(
text = "© 2025 Meldestelle - Built with Kotlin Multiplatform",
text = "© Equest-Events · Entwickelt in Österreich",
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
textAlign = TextAlign.Center

View File

@ -1,6 +1,7 @@
package at.mocode.clients.shared.navigation
sealed class AppScreen {
data object Landing : AppScreen()
data object Home : AppScreen()
data object Login : AppScreen()
data object Ping : AppScreen()

View File

@ -29,7 +29,7 @@ fun MainApp() {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
var currentScreen by remember { mutableStateOf<AppScreen>(AppScreen.Home) }
var currentScreen by remember { mutableStateOf<AppScreen>(AppScreen.Landing) }
// Resolve AuthTokenManager from Koin
val authTokenManager = koinInject<AuthTokenManager>()
@ -57,6 +57,10 @@ fun MainApp() {
}
when (currentScreen) {
is AppScreen.Landing -> LandingScreen(
onPrimaryCta = { currentScreen = AppScreen.Login },
onSecondary = { currentScreen = AppScreen.Home }
)
is AppScreen.Home -> WelcomeScreen(
authTokenManager = authTokenManager,
onOpenPing = { currentScreen = AppScreen.Ping },
@ -83,6 +87,117 @@ fun MainApp() {
}
}
@Composable
private fun LandingScreen(
onPrimaryCta: () -> Unit,
onSecondary: () -> Unit
) {
// Minimal Landing-Layout: Hero → Manifest → Features → Footer
Column(modifier = Modifier.fillMaxSize()) {
// Hero
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 24.dp, vertical = 40.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
// Wortmarke (Platzhalter)
Text(
text = "EquestEvents",
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.primary
)
Text(
text = "Die kompetente TurnierMeldestelle.",
style = MaterialTheme.typography.headlineLarge
)
Text(
text = "EquestEvents entwickelt die digitale Infrastruktur des österreichischen Pferdesports aus der Praxis. Für die Praxis.",
style = MaterialTheme.typography.bodyLarge
)
Row(horizontalArrangement = Arrangement.spacedBy(12.dp)) {
Button(onClick = onPrimaryCta) { Text("Anmelden (PilotPartner)") }
TextButton(onClick = onSecondary) { Text("Mehr erfahren") }
}
}
// Manifest
Surface(color = MaterialTheme.colorScheme.surfaceVariant) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 24.dp, vertical = 40.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text("Unser Anspruch: Durchdachtes System.", style = MaterialTheme.typography.headlineMedium)
Text(
"Die Meldestelle ist das Herzstück jedes Turniers. Wenn sie stolpert, stockt der Sport. Wir verstehen den Balanceakt zwischen Veranstaltern, Reitern und den Verbänden.",
style = MaterialTheme.typography.bodyLarge
)
Text(
"Deshalb entwickeln wir EquestEvents nicht am Reißbrett, sondern direkt am Turnier aus der Sicht der Meldestelle, der Richter, der Zeitnehmer und aller Funktionäre.",
style = MaterialTheme.typography.bodyLarge
)
Text(
"Aktuell befindet sich unser System in einer Pilotphase für C und CNEUTurniere. Wir wachsen organisch Seite an Seite mit unseren PilotPartnern.",
style = MaterialTheme.typography.bodyLarge
)
Text(
"Jedes Feedback fließt direkt in die Entwicklung ein, um eine Lösung zu schaffen, die den realen Bedürfnissen vor Ort entspricht.",
style = MaterialTheme.typography.bodyLarge
)
}
}
// Features
Column(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 24.dp, vertical = 40.dp),
verticalArrangement = Arrangement.spacedBy(24.dp)
) {
Text("Die drei Säulen", style = MaterialTheme.typography.headlineMedium)
Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
FeatureCard(
number = "01",
title = "RegelwerksIntelligenz (FEI & ÖTO)",
body = "Wir verbinden ÖTO und FEI und nehmen Ihnen die ValidierungsKomplexität ab. Von der Lizenzprüfung bis zur korrekten Anwendung der Bestimmungen."
)
FeatureCard(
number = "02",
title = "Plattformunabhängig & Offlinefähig",
body = "Stabil auf Laptop und mobil. Dank OfflineUnterstützung arbeiten Sie nahtlos weiter selbst wenn die Internetverbindung am Platz abreißt."
)
FeatureCard(
number = "03",
title = "Fokus auf den Sport",
body = "Wir reduzieren Administration dort, wo es sinnvoll ist damit sich alle auf das Wesentliche konzentrieren können: den Reitsport."
)
}
}
// Footer
at.mocode.clients.shared.commonui.components.AppFooter()
}
}
@Composable
private fun FeatureCard(number: String, title: String, body: String) {
Surface( tonalElevation = 0.dp ) {
Row(modifier = Modifier.fillMaxWidth()) {
Column(modifier = Modifier.width(56.dp).padding(top = 6.dp)) {
Text(text = number, style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.primary)
}
Column(modifier = Modifier.weight(1f)) {
Text(title, style = MaterialTheme.typography.titleLarge)
Spacer(Modifier.height(4.dp))
Text(body, style = MaterialTheme.typography.bodyLarge)
}
}
}
}
@Composable
private fun WelcomeScreen(
authTokenManager: AuthTokenManager,