diff --git a/frontend/src/app.css b/frontend/src/app.css
index 956501d..7aaf75e 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -71,6 +71,76 @@ body { font-family: var(--font); background: var(--bg); color: var(--text1); -we
}
}
.app-logo { font-size: 18px; font-weight: 700; color: var(--accent); letter-spacing: -0.02em; }
+
+/* === Seiten-Inhalt: einheitlich volle Breite bis 1023px; ab Desktop optionale Max-Breite === */
+.app-page {
+ width: 100%;
+ max-width: 100%;
+ min-width: 0;
+ box-sizing: border-box;
+}
+
+@media (min-width: 1024px) {
+ .app-page--constrained-lg {
+ max-width: 1200px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .app-page--constrained-md {
+ max-width: 900px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .app-page--constrained-sm {
+ max-width: 720px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .app-page--reading {
+ max-width: 640px;
+ margin-left: auto;
+ margin-right: auto;
+ }
+}
+
+/* Form-Grids: minmax(0,…) verhindert Grid-Overflow; eine Spalte bis zum ersten Breakpoint */
+.responsive-grid-2 {
+ display: grid;
+ gap: 12px;
+ grid-template-columns: minmax(0, 1fr);
+}
+@media (min-width: 480px) {
+ .responsive-grid-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+.responsive-grid-3 {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: minmax(0, 1fr);
+}
+@media (min-width: 560px) {
+ .responsive-grid-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+}
+
+.responsive-grid-4 {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: minmax(0, 1fr);
+}
+@media (min-width: 560px) {
+ .responsive-grid-4 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+@media (min-width: 900px) {
+ .responsive-grid-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
/* unten: Tab-Leiste + Abstand nach oben zur Leiste + Home-Indicator (iPhone) */
.app-main {
flex: 1;
@@ -163,6 +233,7 @@ body { font-family: var(--font); background: var(--bg); color: var(--text1); -we
gap: 8px;
padding: 0;
margin-bottom: 16px;
+ min-width: 0;
}
.form-label {
@@ -183,6 +254,7 @@ body { font-family: var(--font); background: var(--bg); color: var(--text1); -we
.form-input {
width: 100%;
+ min-width: 0;
padding: 10px 12px;
text-align: left;
font-family: var(--font);
@@ -2741,14 +2813,16 @@ a.analysis-split__nav-item {
/* Rahmenprogramm bearbeiten — Mobile: Stammdaten | Plan; Desktop: untereinander Ziele → Slots (synchron zu FRAMEWORK_DESKTOP_MIN_PX) */
.framework-edit {
- max-width: 800px;
- margin: 0 auto;
+ max-width: 100%;
+ margin: 0;
width: 100%;
min-width: 0;
}
@media (min-width: 900px) {
.framework-edit {
max-width: min(1200px, 100%);
+ margin-left: auto;
+ margin-right: auto;
}
.framework-edit__tabbar {
display: none !important;
@@ -2834,6 +2908,12 @@ a.analysis-split__nav-item {
scrollbar-gutter: stable;
}
+@media (max-width: 1023px) {
+ .framework-slots-board-outer {
+ scrollbar-gutter: auto;
+ }
+}
+
.framework-slots-board {
display: flex;
flex-direction: row;
diff --git a/frontend/src/pages/AccountSettingsPage.jsx b/frontend/src/pages/AccountSettingsPage.jsx
index 0edb2c0..e2c9895 100644
--- a/frontend/src/pages/AccountSettingsPage.jsx
+++ b/frontend/src/pages/AccountSettingsPage.jsx
@@ -98,7 +98,7 @@ function AccountSettingsPage() {
}
return (
-
+
Einstellungen
Konto & Sicherheit
diff --git a/frontend/src/pages/AdminCatalogsPage.jsx b/frontend/src/pages/AdminCatalogsPage.jsx
index a5952d7..b92f66a 100644
--- a/frontend/src/pages/AdminCatalogsPage.jsx
+++ b/frontend/src/pages/AdminCatalogsPage.jsx
@@ -313,7 +313,7 @@ export default function AdminCatalogsPage() {
}
return (
-
+
Stammdaten-Kataloge
diff --git a/frontend/src/pages/AdminHierarchyPage.jsx b/frontend/src/pages/AdminHierarchyPage.jsx
index 1361d83..f44845b 100644
--- a/frontend/src/pages/AdminHierarchyPage.jsx
+++ b/frontend/src/pages/AdminHierarchyPage.jsx
@@ -93,7 +93,7 @@ function AdminHierarchyPage() {
]
return (
-
+
Admin: Katalog-Hierarchie
diff --git a/frontend/src/pages/ClubsPage.jsx b/frontend/src/pages/ClubsPage.jsx
index 470fae2..e9ef58b 100644
--- a/frontend/src/pages/ClubsPage.jsx
+++ b/frontend/src/pages/ClubsPage.jsx
@@ -143,8 +143,7 @@ function ClubsPage() {
}
return (
-
-
+
Vereinsverwaltung
Für die Trainingsplanung wird mindestens ein Verein und eine Trainingsgruppe gebraucht.
@@ -696,7 +695,6 @@ function ClubsPage() {
)}
-
)
}
diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx
index a0212eb..069cca3 100644
--- a/frontend/src/pages/Dashboard.jsx
+++ b/frontend/src/pages/Dashboard.jsx
@@ -30,7 +30,7 @@ function Dashboard() {
if (loading) {
return (
-
+
@@ -38,8 +38,7 @@ function Dashboard() {
}
return (
-
-
+
Dashboard
Willkommen, {user?.name || user?.email}!
@@ -56,7 +55,7 @@ function Dashboard() {
{/* Status Grid */}
@@ -122,7 +121,6 @@ function Dashboard() {
)}
-
)
}
diff --git a/frontend/src/pages/ExerciseDetailPage.jsx b/frontend/src/pages/ExerciseDetailPage.jsx
index ddf901c..bcdaac8 100644
--- a/frontend/src/pages/ExerciseDetailPage.jsx
+++ b/frontend/src/pages/ExerciseDetailPage.jsx
@@ -144,7 +144,7 @@ function ExerciseDetailPage() {
if (error) {
const msg = error.message || String(error)
return (
-
+
Übung
{msg}
diff --git a/frontend/src/pages/ExerciseFormPage.jsx b/frontend/src/pages/ExerciseFormPage.jsx
index ee89dfe..01327ae 100644
--- a/frontend/src/pages/ExerciseFormPage.jsx
+++ b/frontend/src/pages/ExerciseFormPage.jsx
@@ -699,7 +699,7 @@ function ExerciseFormPage() {
}
return (
-
+