diff --git a/src/components/admin/admin-shell.tsx b/src/components/admin/admin-shell.tsx
index f6e68ef50..14fedfd0c 100644
--- a/src/components/admin/admin-shell.tsx
+++ b/src/components/admin/admin-shell.tsx
@@ -263,8 +263,12 @@ export function AdminShell({ active, children }: AdminShellProps) {
- {/* Main column — page renders its own h1 + subtitle */}
- {children}
+ {/* Main column — page renders its own h1 + subtitle. Same
+ `min-h-[calc(100dvh-12rem)]` reserve as ``
+ so navigating between admin sub-pages (e.g. system-status
+ → login-overview) does not jump the page height while the
+ new section is still fetching. */}
+ {children}
);
diff --git a/src/components/settings/settings-shell.tsx b/src/components/settings/settings-shell.tsx
index 410d2379c..30ae48d53 100644
--- a/src/components/settings/settings-shell.tsx
+++ b/src/components/settings/settings-shell.tsx
@@ -214,8 +214,12 @@ export function SettingsShell({ active, children }: SettingsShellProps) {
- {/* Main column — page renders its own h1 + subtitle */}
- {children}
+ {/* Main column — page renders its own h1 + subtitle. The
+ `min-h-[calc(100dvh-12rem)]` reserve keeps the column tall
+ enough that swapping a short loading state for a long
+ section list (Thresholds, Sources) does not jump the page
+ height under the sticky sidebar. */}
+ {children}
);