diff --git a/Elternbeirat.Web/Components/App.razor b/Elternbeirat.Web/Components/App.razor
index d649b4a..a336909 100644
--- a/Elternbeirat.Web/Components/App.razor
+++ b/Elternbeirat.Web/Components/App.razor
@@ -1,5 +1,5 @@
-
+
diff --git a/Elternbeirat.Web/Components/Layout/MainLayout.razor b/Elternbeirat.Web/Components/Layout/MainLayout.razor
index 53a4e95..d1e6cb2 100644
--- a/Elternbeirat.Web/Components/Layout/MainLayout.razor
+++ b/Elternbeirat.Web/Components/Layout/MainLayout.razor
@@ -1,3 +1,33 @@
-@inherits LayoutComponentBase
+@inherits LayoutComponentBase
-@Body
\ No newline at end of file
+
+
+
+
+ @Body
+
+
+
+
diff --git a/Elternbeirat.Web/Components/Layout/MainLayout.razor.css b/Elternbeirat.Web/Components/Layout/MainLayout.razor.css
index 60cec92..6932f38 100644
--- a/Elternbeirat.Web/Components/Layout/MainLayout.razor.css
+++ b/Elternbeirat.Web/Components/Layout/MainLayout.razor.css
@@ -18,3 +18,100 @@
right: 0.75rem;
top: 0.5rem;
}
+
+/* Page frame: header and footer stay put, the content grows and pushes the
+ footer to the bottom even on short pages. */
+.page {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+}
+
+/* Header */
+.site-header {
+ border-bottom: 1px solid #e0e0e0;
+ background: #fff;
+}
+
+.header-inner {
+ max-width: 60rem;
+ margin: 0 auto;
+ padding: 1rem 1.25rem;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: baseline;
+ gap: 0.5rem 1.5rem;
+}
+
+.brand {
+ font-size: 1.35rem;
+ font-weight: 700;
+ color: #1f3a5f;
+ text-decoration: none;
+ white-space: nowrap;
+}
+
+.main-nav {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.25rem 1.25rem;
+}
+
+.main-nav a {
+ color: #333;
+ text-decoration: none;
+ padding: 0.2rem 0;
+ border-bottom: 2px solid transparent;
+}
+
+.main-nav a:hover {
+ color: #1f3a5f;
+}
+
+/* NavLink adds .active to the link of the current route. */
+.main-nav a.active {
+ color: #1f3a5f;
+ border-bottom-color: #1f3a5f;
+}
+
+/* Content */
+.content {
+ flex: 1;
+ width: 100%;
+ max-width: 60rem;
+ margin: 0 auto;
+ padding: 1.5rem 1.25rem 3rem;
+}
+
+/* Footer */
+.site-footer {
+ border-top: 1px solid #e0e0e0;
+ background: #fafafa;
+ color: #555;
+ font-size: 0.9rem;
+}
+
+.footer-inner {
+ max-width: 60rem;
+ margin: 0 auto;
+ padding: 1rem 1.25rem;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ gap: 0.5rem 1.5rem;
+}
+
+.footer-nav {
+ display: flex;
+ gap: 1.25rem;
+}
+
+.footer-nav a {
+ color: #555;
+ text-decoration: none;
+}
+
+.footer-nav a:hover {
+ color: #1f3a5f;
+ text-decoration: underline;
+}
diff --git a/Elternbeirat.Web/wwwroot/app.css b/Elternbeirat.Web/wwwroot/app.css
index 5388357..4a2497d 100644
--- a/Elternbeirat.Web/wwwroot/app.css
+++ b/Elternbeirat.Web/wwwroot/app.css
@@ -1,3 +1,23 @@
+/* Base styles. Self-hosted system font stack — no external fonts, for privacy. */
+html {
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
+ line-height: 1.6;
+ color: #222;
+}
+
+body {
+ margin: 0;
+}
+
+a {
+ color: #1f3a5f;
+}
+
+h1, h2, h3 {
+ line-height: 1.25;
+ color: #1f3a5f;
+}
+
h1:focus {
outline: none;
}