diff --git a/src/components/shared/ScanSkeleton.tsx b/src/components/shared/ScanSkeleton.tsx
new file mode 100644
index 0000000..60559fd
--- /dev/null
+++ b/src/components/shared/ScanSkeleton.tsx
@@ -0,0 +1,33 @@
+import GlassCard from "../GlassCard";
+export default function ScanSkeleton() {
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
index e1d1223..055a6c0 100644
--- a/src/index.css
+++ b/src/index.css
@@ -396,4 +396,25 @@ input::placeholder {
@media print {
nav, .print\:hidden { display: none !important; }
+}
+@keyframes shimmer {
+ 0% {
+ background-position: -200% 0;
+ }
+
+ 100% {
+ background-position: 200% 0;
+ }
+}
+
+.skeleton-shimmer {
+ background: linear-gradient(
+ 90deg,
+ var(--color-surface-mid) 25%,
+ var(--color-surface-highest) 50%,
+ var(--color-surface-mid) 75%
+ );
+
+ background-size: 200% 100%;
+ animation: shimmer 1.5s linear infinite;
}
\ No newline at end of file
diff --git a/src/pages/AnalysisDashboard.tsx b/src/pages/AnalysisDashboard.tsx
index b5c2925..14d4f89 100644
--- a/src/pages/AnalysisDashboard.tsx
+++ b/src/pages/AnalysisDashboard.tsx
@@ -5,6 +5,7 @@ import GlassCard from '../components/GlassCard';
import StatusTerminal from '../components/StatusTerminal';
import { api } from '../lib/api';
import type { ScanResult } from '../lib/types';
+import ScanSkeleton from "../components/shared/ScanSkeleton";
const BIOMARKER_META = {
gill_saturation: { label: 'Gill Saturation', icon: Droplets },
corneal_clarity: { label: 'Corneal Clarity', icon: EyeIcon },
@@ -69,13 +70,9 @@ export default function AnalysisDashboard() {
load();
}, [params]);
-
- if (loading) {
- return (
-
-
-
- );
+ // ── Loading state ────────────────────────────────────────────────────────
+ if (loading) {
+ return ;
}
// ── Error state ──────────────────────────────────────────────────────────