Trainingsplanung und Rahmenplanung #9

Merged
Lars merged 29 commits from develop into main 2026-05-05 16:05:01 +02:00
16 changed files with 28 additions and 62 deletions
Showing only changes of commit 8c9c97bedb - Show all commits

View File

@ -18,8 +18,6 @@
--header-h: 52px; --header-h: 52px;
--font: system-ui, -apple-system, 'Segoe UI', sans-serif; --font: system-ui, -apple-system, 'Segoe UI', sans-serif;
--capture-content-max: 800px; --capture-content-max: 800px;
/* Admin: nutzt volle Hauptspalte bis zu dieser Obergrenze (siehe .app-main:has(.admin-shell)) */
--admin-main-max: min(1720px, calc(100vw - 200px));
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
:root { :root {
@ -72,37 +70,13 @@ 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; } .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 === */ /* === Seiten-Inhalt: volle Breite der Spalte, kein künstlicher Max-Wert auf großen Screens === */
.app-page { .app-page {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
min-width: 0; min-width: 0;
box-sizing: border-box; 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 */ /* Form-Grids: minmax(0,…) verhindert Grid-Overflow; eine Spalte bis zum ersten Breakpoint */
.responsive-grid-2 { .responsive-grid-2 {
display: grid; display: grid;
@ -1515,7 +1489,7 @@ a.analysis-split__nav-item {
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 12px; border-radius: 12px;
padding: 18px 20px; padding: 18px 20px;
max-width: 720px; max-width: 100%;
} }
.skills-catalog-detail__title { .skills-catalog-detail__title {
font-size: 15px; font-size: 15px;
@ -2307,18 +2281,13 @@ a.analysis-split__nav-item {
.app-main { .app-main {
padding: 24px 32px 32px; padding: 24px 32px 32px;
padding-bottom: max(32px, env(safe-area-inset-bottom, 0px)); padding-bottom: max(32px, env(safe-area-inset-bottom, 0px));
max-width: 1200px;
margin-left: auto;
margin-right: auto;
width: 100%; width: 100%;
max-width: none;
margin-left: 0;
margin-right: 0;
box-sizing: border-box; box-sizing: border-box;
} }
/* Admin: mehr horizontaler Raum für Tabellen auf großen Screens (:has ~2022+, sonst bleibt 1200px) */
.app-main:has(.admin-shell) {
max-width: var(--admin-main-max);
}
/* Dashboard (P3): Begrüßung + Kennzahlen-Zeile */ /* Dashboard (P3): Begrüßung + Kennzahlen-Zeile */
.dashboard-greeting { .dashboard-greeting {
display: flex; display: flex;
@ -2422,7 +2391,7 @@ a.analysis-split__nav-item {
color: var(--text3); color: var(--text3);
margin: 4px 0 0 0; margin: 4px 0 0 0;
line-height: 1.35; line-height: 1.35;
max-width: 640px; max-width: none;
} }
.dashboard-section__body { .dashboard-section__body {
@ -2638,8 +2607,9 @@ a.analysis-split__nav-item {
} }
.exercise-detail-shell { .exercise-detail-shell {
max-width: 640px; max-width: none;
margin: 0 auto; margin: 0;
width: 100%;
} }
.exercise-detail-section { .exercise-detail-section {
margin-bottom: 14px; margin-bottom: 14px;
@ -2819,11 +2789,6 @@ a.analysis-split__nav-item {
min-width: 0; min-width: 0;
} }
@media (min-width: 900px) { @media (min-width: 900px) {
.framework-edit {
max-width: min(1200px, 100%);
margin-left: auto;
margin-right: auto;
}
.framework-edit__tabbar { .framework-edit__tabbar {
display: none !important; display: none !important;
} }
@ -3189,8 +3154,8 @@ a.analysis-split__nav-item {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
width: 100%; width: 100%;
max-width: 720px; max-width: none;
margin: 0 auto; margin: 0;
min-height: calc(100dvh - var(--header-h) - var(--nav-h) - env(safe-area-inset-bottom, 0px) - 48px); min-height: calc(100dvh - var(--header-h) - var(--nav-h) - env(safe-area-inset-bottom, 0px) - 48px);
} }

View File

@ -23,8 +23,9 @@ function Navigation() {
zIndex: 1000 zIndex: 1000
}}> }}>
<div style={{ <div style={{
maxWidth: '1200px', width: '100%',
margin: '0 auto', maxWidth: 'none',
margin: '0',
display: 'flex', display: 'flex',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',

View File

@ -98,7 +98,7 @@ function AccountSettingsPage() {
} }
return ( return (
<div className="page-padding app-page app-page--reading" style={{ padding: '1rem' }}> <div className="page-padding app-page" style={{ padding: '1rem' }}>
<h1 style={{ marginBottom: '0.35rem', fontSize: '1.5rem' }}>Einstellungen</h1> <h1 style={{ marginBottom: '0.35rem', fontSize: '1.5rem' }}>Einstellungen</h1>
<p style={{ color: 'var(--text2)', marginBottom: '1.25rem', fontSize: '0.95rem' }}> <p style={{ color: 'var(--text2)', marginBottom: '1.25rem', fontSize: '0.95rem' }}>
Konto &amp; Sicherheit Konto &amp; Sicherheit

View File

@ -313,7 +313,7 @@ export default function AdminCatalogsPage() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<AdminPageNav /> <AdminPageNav />
<h1 style={{ marginBottom: '24px' }}>Stammdaten-Kataloge</h1> <h1 style={{ marginBottom: '24px' }}>Stammdaten-Kataloge</h1>

View File

@ -93,7 +93,7 @@ function AdminHierarchyPage() {
] ]
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<AdminPageNav /> <AdminPageNav />
<h1 style={{ marginTop: 0 }}>Admin: Katalog-Hierarchie</h1> <h1 style={{ marginTop: 0 }}>Admin: Katalog-Hierarchie</h1>

View File

@ -143,7 +143,7 @@ function ClubsPage() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<h1 style={{ marginBottom: '0.75rem' }}>Vereinsverwaltung</h1> <h1 style={{ marginBottom: '0.75rem' }}>Vereinsverwaltung</h1>
<p style={{ color: 'var(--text2)', marginBottom: '1.35rem', maxWidth: '46rem', lineHeight: 1.55 }}> <p style={{ color: 'var(--text2)', marginBottom: '1.35rem', maxWidth: '46rem', lineHeight: 1.55 }}>
Für die Trainingsplanung wird mindestens ein <strong>Verein</strong> und eine <strong>Trainingsgruppe</strong> gebraucht. Für die Trainingsplanung wird mindestens ein <strong>Verein</strong> und eine <strong>Trainingsgruppe</strong> gebraucht.

View File

@ -38,7 +38,7 @@ function Dashboard() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<h1>Dashboard</h1> <h1>Dashboard</h1>
<p style={{ color: 'var(--text2)', marginTop: '0.5rem' }}> <p style={{ color: 'var(--text2)', marginTop: '0.5rem' }}>
Willkommen, {user?.name || user?.email}! Willkommen, {user?.name || user?.email}!

View File

@ -144,7 +144,7 @@ function ExerciseDetailPage() {
if (error) { if (error) {
const msg = error.message || String(error) const msg = error.message || String(error)
return ( return (
<div style={{ padding: '1rem' }} className="app-page app-page--reading"> <div style={{ padding: '1rem' }} className="app-page">
<div className="card"> <div className="card">
<h2>Übung</h2> <h2>Übung</h2>
<p style={{ color: 'var(--danger)' }}>{msg}</p> <p style={{ color: 'var(--danger)' }}>{msg}</p>

View File

@ -699,7 +699,7 @@ function ExerciseFormPage() {
} }
return ( return (
<div style={{ padding: '12px' }} className="app-page app-page--constrained-sm"> <div style={{ padding: '12px' }} className="app-page">
<div style={{ marginBottom: '12px' }}> <div style={{ marginBottom: '12px' }}>
<button type="button" className="btn btn-secondary" onClick={() => navigate('/exercises')}> <button type="button" className="btn btn-secondary" onClick={() => navigate('/exercises')}>
Übersicht Übersicht

View File

@ -352,7 +352,7 @@ function ExercisesListPage() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<div <div
style={{ style={{
display: 'flex', display: 'flex',

View File

@ -103,7 +103,7 @@ export default function MediaWikiImportPage() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<AdminPageNav /> <AdminPageNav />
<h1>MediaWiki Import (Semantic MediaWiki)</h1> <h1>MediaWiki Import (Semantic MediaWiki)</h1>

View File

@ -143,7 +143,7 @@ function SkillsPage() {
const methodsByCategory = groupByCategory(methods) const methodsByCategory = groupByCategory(methods)
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<h1 style={{ marginBottom: '1.5rem' }}>Fähigkeiten & Methoden</h1> <h1 style={{ marginBottom: '1.5rem' }}>Fähigkeiten & Methoden</h1>
{/* Tabs */} {/* Tabs */}

View File

@ -95,7 +95,7 @@ export default function TrainerContextsPage() {
} }
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<h1>Meine Trainer-Bereiche</h1> <h1>Meine Trainer-Bereiche</h1>
<p style={{ color: 'var(--text2)', marginBottom: '32px' }}> <p style={{ color: 'var(--text2)', marginBottom: '32px' }}>
Definiere deine Tätigkeitsbereiche für fokussierte Ansichten und Filter. Definiere deine Tätigkeitsbereiche für fokussierte Ansichten und Filter.

View File

@ -41,7 +41,7 @@ export default function TrainingFrameworkProgramsListPage() {
} }
return ( return (
<div className="app-page app-page--constrained-md"> <div className="app-page">
<div <div
style={{ style={{
display: 'flex', display: 'flex',

View File

@ -534,7 +534,7 @@ function TrainingPlanningPage() {
const selectedGroup = groups.find((g) => g.id === parseInt(selectedGroupId, 10)) const selectedGroup = groups.find((g) => g.id === parseInt(selectedGroupId, 10))
return ( return (
<div className="app-page app-page--constrained-lg"> <div className="app-page">
<h1 style={{ marginBottom: '0.35rem' }}>Trainingsplanung</h1> <h1 style={{ marginBottom: '0.35rem' }}>Trainingsplanung</h1>
<p style={{ color: 'var(--text2)', fontSize: '0.95rem', marginBottom: '1.25rem' }}> <p style={{ color: 'var(--text2)', fontSize: '0.95rem', marginBottom: '1.25rem' }}>
Wähle eine Trainingsgruppe, lege dann Termine mit Inhalt (Abschnitte und Übungen) an ein Plan entsteht aus einer oder mehreren{' '} Wähle eine Trainingsgruppe, lege dann Termine mit Inhalt (Abschnitte und Übungen) an ein Plan entsteht aus einer oder mehreren{' '}

View File

@ -141,7 +141,7 @@ export default function TrainingUnitRunPage() {
} }
return ( return (
<div className="training-run-page app-page app-page--constrained-sm" style={{ paddingBottom: '2rem' }}> <div className="training-run-page app-page" style={{ paddingBottom: '2rem' }}>
<ExercisePeekModal <ExercisePeekModal
open={peekExerciseId != null} open={peekExerciseId != null}
exerciseId={peekExerciseId} exerciseId={peekExerciseId}