diff --git a/src/App.tsx b/src/App.tsx index 2b033cc..b9011ac 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import { Routes, Route, Navigate } from 'react-router' import { Component, Suspense, lazy, type ReactNode } from 'react' import { StoreProvider, useStore } from './store/store' import AppLayout from './components/AppLayout' +import LadeSkeleton from './components/LadeSkeleton' import Login from './pages/Login' // Seiten werden beim ersten Aufruf nachgeladen (Code-Splitting) – @@ -51,14 +52,7 @@ class FehlerGrenze extends Component<{ children: ReactNode }, { fehler: boolean } function Ladebildschirm() { - return ( -
-
-
Hinterstein Immobilien
-
Mieterportal wird geladen …
-
-
- ) + return } function RequireAuth({ children }: { children: React.ReactElement }) { diff --git a/src/components/LadeSkeleton.tsx b/src/components/LadeSkeleton.tsx new file mode 100644 index 0000000..3756b46 --- /dev/null +++ b/src/components/LadeSkeleton.tsx @@ -0,0 +1,68 @@ +import { Skeleton } from './ui/skeleton' +import logo from '../assets/logo.png' + +/** Skeleton-Ladebildschirm: zeigt statt Text die ungefähre Seitenstruktur + * (Kopf, Suche, Listenzeilen) mit Puls-Animation – wirkt schneller und + * orientiert den Nutzer, während die Daten geladen werden. */ +export default function LadeSkeleton() { + return ( +
+ {/* Desktop-Sidebar */} + + +
+ {/* Mobile top bar */} +
+ + +
+ +
+ {/* Seitenkopf */} +
+
+ + +
+ +
+ + {/* Filterzeile */} +
+ + + +
+ + {/* Listenzeilen */} +
+ {Array.from({ length: 6 }).map((_, i) => ( +
+ +
+ + +
+ + +
+ ))} +
+
+
+
+ ) +} diff --git a/src/components/ui/skeleton.tsx b/src/components/ui/skeleton.tsx index 32ea0ef..d613dae 100644 --- a/src/components/ui/skeleton.tsx +++ b/src/components/ui/skeleton.tsx @@ -4,7 +4,7 @@ function Skeleton({ className, ...props }: React.ComponentProps<"div">) { return (
)