From 3867d30aac3dd07806666745292ead237b53e06a Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Wed, 12 Nov 2025 03:51:15 +0000 Subject: [PATCH] Enhance loading skeletons and breadcrumbs - Add content-m matching loading skeletons for ParkDetail, RideDetail, CompanyDetail, etc., replacing generic spinners to preserve layout during load - Remove redundant Back to Parent Entity buttons in detail pages in favor of breadcrumb navigation - Prepare groundwork for breadcrumbs across detail pages to improve cohesion and navigation --- .../loading/CompanyDetailSkeleton.tsx | 98 ++++++++++++++++ src/components/loading/ParkDetailSkeleton.tsx | 101 +++++++++++++++++ src/components/loading/RideDetailSkeleton.tsx | 106 ++++++++++++++++++ src/pages/DesignerDetail.tsx | 17 +-- src/pages/ManufacturerDetail.tsx | 18 +-- src/pages/OperatorDetail.tsx | 17 +-- src/pages/ParkDetail.tsx | 18 +-- src/pages/PropertyOwnerDetail.tsx | 27 ++--- src/pages/RideDetail.tsx | 21 +--- src/pages/RideModelDetail.tsx | 39 ++++--- 10 files changed, 361 insertions(+), 101 deletions(-) create mode 100644 src/components/loading/CompanyDetailSkeleton.tsx create mode 100644 src/components/loading/ParkDetailSkeleton.tsx create mode 100644 src/components/loading/RideDetailSkeleton.tsx diff --git a/src/components/loading/CompanyDetailSkeleton.tsx b/src/components/loading/CompanyDetailSkeleton.tsx new file mode 100644 index 00000000..cc4d7c75 --- /dev/null +++ b/src/components/loading/CompanyDetailSkeleton.tsx @@ -0,0 +1,98 @@ +import { Card, CardContent, CardHeader } from '@/components/ui/card'; + +export function CompanyDetailSkeleton() { + return ( +
+ {/* Breadcrumb */} +
+ + {/* Edit Button Area */} +
+
+
+ + {/* Hero Banner */} +
+ + {/* Stats Cards */} +
+ {[1, 2, 3, 4].map((i) => ( + + +
+
+ + + ))} +
+ + {/* Tabs */} +
+ {['Overview', 'Rides', 'Models', 'Photos'].map((tab) => ( +
+ ))} +
+ + {/* Content Grid */} +
+ {/* Main Content */} +
+ {/* Description Card */} + + +
+ + +
+
+
+ + + + {/* Products Grid */} + + +
+ + +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+
+
+
+
+ ))} +
+ + +
+ + {/* Sidebar */} +
+ {/* Company Info Card */} + + +
+ + + {/* Logo */} +
+ + {/* Info Items */} + {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+ ))} + + +
+
+
+ ); +} diff --git a/src/components/loading/ParkDetailSkeleton.tsx b/src/components/loading/ParkDetailSkeleton.tsx new file mode 100644 index 00000000..f3cb66e0 --- /dev/null +++ b/src/components/loading/ParkDetailSkeleton.tsx @@ -0,0 +1,101 @@ +import { Card, CardContent, CardHeader } from '@/components/ui/card'; + +export function ParkDetailSkeleton() { + return ( +
+ {/* Breadcrumb */} +
+ + {/* Edit Button Area */} +
+
+
+ + {/* Hero Banner */} +
+ + {/* Stats Cards */} +
+ {[1, 2, 3, 4].map((i) => ( + + +
+
+ + + ))} +
+ + {/* Tabs */} +
+ {['Overview', 'Rides', 'Reviews', 'Photos', 'History'].map((tab) => ( +
+ ))} +
+ + {/* Content Grid */} +
+ {/* Main Content */} +
+ {/* Description Card */} + + +
+ + +
+
+
+ + + + {/* Featured Rides Card */} + + +
+ + +
+ {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+ ))} +
+ + +
+ + {/* Sidebar */} +
+ {/* Info Card */} + + +
+ + + {[1, 2, 3, 4].map((i) => ( +
+
+
+
+
+
+
+ ))} + + + + {/* Map Card */} + + +
+ + +
+
+
+ ); +} diff --git a/src/components/loading/RideDetailSkeleton.tsx b/src/components/loading/RideDetailSkeleton.tsx new file mode 100644 index 00000000..680cba61 --- /dev/null +++ b/src/components/loading/RideDetailSkeleton.tsx @@ -0,0 +1,106 @@ +import { Card, CardContent } from '@/components/ui/card'; + +export function RideDetailSkeleton() { + return ( +
+ {/* Breadcrumb */} +
+ + {/* Edit Button Area */} +
+
+
+ + {/* Hero Banner */} +
+ + {/* Stats Grid */} +
+ {[1, 2, 3, 4, 5, 6].map((i) => ( + + +
+
+
+ + + ))} +
+ + {/* Tabs */} +
+ {['Overview', 'Reviews', 'Photos', 'History'].map((tab) => ( +
+ ))} +
+ + {/* Content Grid */} +
+ {/* Main Content */} +
+ {/* Description Card */} + + +
+
+
+
+ + + + {/* Technical Specs */} + + +
+
+ {[1, 2, 3, 4, 5, 6].map((i) => ( +
+
+
+
+ ))} +
+ + +
+ + {/* Sidebar */} +
+ {/* Ride Info Card */} + + +
+ {[1, 2, 3, 4, 5].map((i) => ( +
+
+
+
+
+
+
+ ))} + + + + {/* Similar Rides */} + + +
+
+ {[1, 2, 3].map((i) => ( +
+
+
+
+
+
+
+ ))} +
+ + +
+
+
+ ); +} diff --git a/src/pages/DesignerDetail.tsx b/src/pages/DesignerDetail.tsx index 5b193d45..a81c9bbe 100644 --- a/src/pages/DesignerDetail.tsx +++ b/src/pages/DesignerDetail.tsx @@ -1,6 +1,7 @@ import { useState, useEffect, lazy, Suspense } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { EntityBreadcrumb } from '@/components/navigation/EntityBreadcrumb'; +import { CompanyDetailSkeleton } from '@/components/loading/CompanyDetailSkeleton'; import { Header } from '@/components/layout/Header'; import { getBannerUrls } from '@/lib/cloudflareImageUtils'; import { Button } from '@/components/ui/button'; @@ -150,12 +151,7 @@ export default function DesignerDetail() { return (
-
-
-
-
-
-
+
); } @@ -191,13 +187,8 @@ export default function DesignerDetail() { className="mb-4" /> - {/* Back Button and Edit Button */} -
- - + {/* Edit Button */} +
- + {/* Edit Button */} +
- + {/* Edit Button */} +
- + {/* Edit Button */} +
- + {/* Breadcrumb Navigation */} + + + {/* Edit Button */} +
- + {/* Edit Button */} +
- + {/* Breadcrumb Navigation */} + + + {/* Edit Button */} +