From fa01a0d4a0b1b0d67b7372e075506b44b0591b73 Mon Sep 17 00:00:00 2001 From: Jake Jarvis Date: Thu, 5 Mar 2026 10:16:54 -0500 Subject: [PATCH] Fix loading skeletons to match current UI across all pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Stats grid: sm:grid-cols-4 → lg:grid-cols-4 to match actual breakpoint - Continue watching cards: border → ring-1 to match actual card styling - Continue watching section: add carousel-like margins (-mx-4/px-4) - Title detail: full-viewport backdrop, responsive poster (120px/220px), metadata row + star rating instead of two generic buttons - Explore hero: full-viewport width matching HeroBanner component - Explore rows: add icon placeholders, carousel-like margins, genre chip overflow - Settings: icon+label section headings, 3 integration cards instead of 2 - Dashboard: add icon placeholders to section headings, fix mt-2 → mt-1 - Extract shared SectionHeading helper for icon+text skeleton pattern Co-Authored-By: Claude Opus 4.6 --- app/(pages)/explore/loading.tsx | 13 +++++--- app/(pages)/settings/loading.tsx | 46 +++++++++++++++++++-------- components/skeletons.tsx | 53 +++++++++++++++++++++++--------- 3 files changed, 80 insertions(+), 32 deletions(-) diff --git a/app/(pages)/explore/loading.tsx b/app/(pages)/explore/loading.tsx index 72039bc..521e3d8 100644 --- a/app/(pages)/explore/loading.tsx +++ b/app/(pages)/explore/loading.tsx @@ -4,9 +4,12 @@ import { Skeleton } from "@/components/ui/skeleton"; function TitleRowSkeleton({ withGenreChips }: { withGenreChips?: boolean }) { return (
- +
+ + +
{withGenreChips && ( -
+
{Array.from({ length: 7 }).map((_, i) => ( )} -
+
{Array.from({ length: 6 }).map((_, i) => ( // biome-ignore lint/suspicious/noArrayIndexKey: static skeleton placeholders
@@ -31,8 +34,8 @@ function TitleRowSkeleton({ withGenreChips }: { withGenreChips?: boolean }) { export default function ExploreLoading() { return (
- {/* Hero skeleton */} -
+ {/* Hero skeleton — full viewport width like the actual HeroBanner */} +
diff --git a/app/(pages)/settings/loading.tsx b/app/(pages)/settings/loading.tsx index f557de5..6ce91f2 100644 --- a/app/(pages)/settings/loading.tsx +++ b/app/(pages)/settings/loading.tsx @@ -1,26 +1,48 @@ import { Skeleton } from "@/components/ui/skeleton"; +function SectionSkeleton({ + headingWidth, + children, +}: { + headingWidth: string; + children: React.ReactNode; +}) { + return ( +
+
+ + +
+ {children} +
+ ); +} + export default function SettingsLoading() { return (
{/* Header */}
- - +
+ + +
+
{/* Account card */} -
- - -
+ + + - {/* Media server cards */} -
- - - -
+ {/* Integrations cards */} + +
+ + + +
+
); } diff --git a/components/skeletons.tsx b/components/skeletons.tsx index 68dd86c..efee6be 100644 --- a/components/skeletons.tsx +++ b/components/skeletons.tsx @@ -1,5 +1,14 @@ import { Skeleton } from "@/components/ui/skeleton"; +function SectionHeading({ width = "w-32" }: { width?: string }) { + return ( +
+ + +
+ ); +} + export function TitleCardSkeleton() { return (
@@ -14,7 +23,7 @@ export function TitleCardSkeleton() { export function ContinueWatchingSkeleton() { return ( -
+
@@ -28,12 +37,14 @@ export function ContinueWatchingSkeleton() { } export function StatCardSkeleton() { - return ; + return ( + + ); } export function StatsSectionSkeleton() { return ( -
+
@@ -45,8 +56,8 @@ export function StatsSectionSkeleton() { export function ContinueWatchingSectionSkeleton() { return (
- -
+ +
@@ -59,7 +70,7 @@ export function ContinueWatchingSectionSkeleton() { export function TitleGridSectionSkeleton() { return (
- +
@@ -90,20 +101,32 @@ export function RecommendationsSkeleton() { export function TitleDetailSkeleton() { return (
- -
- + +
+
- - +
+ +
+ + + +
+
-
- - +
+ + +
+ {Array.from({ length: 5 }).map((_, i) => ( + // biome-ignore lint/suspicious/noArrayIndexKey: static skeleton + + ))} +
@@ -116,7 +139,7 @@ export function DashboardSkeleton() {
- +