From 6dc12f0c351b7a1e184ab81f07e17a2d362d81cf Mon Sep 17 00:00:00 2001 From: vikingowl Date: Sun, 7 Dec 2025 17:11:19 +0100 Subject: [PATCH] feat: Redesign matches page with neon styling and UX improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Convert matches page from DaisyUI to neon esports design system - Add colored left borders to cards for instant win/loss/tie scanning - Add player count badges and demo status icons to match cards - Implement filter state preservation across navigation - Add staggered card animations and skeleton loading states - Add slide transition for filter panel - Make cards compact with horizontal layout for better density - Update grid to 4 columns on xl screens - Style DataTable, ShareCodeInput with neon theme - Add external link support to NeonButton 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/app.css | 17 + .../components/data-display/DataTable.svelte | 94 +- src/lib/components/landing/NeonCTA.svelte | 2 +- src/lib/components/match/MatchCard.svelte | 115 ++- .../components/match/MatchCardSkeleton.svelte | 35 + .../components/match/ShareCodeInput.svelte | 99 +- src/lib/components/ui/NeonButton.svelte | 5 +- src/lib/utils/navigation.ts | 21 +- src/routes/matches/+page.svelte | 924 ++++++++++-------- 9 files changed, 824 insertions(+), 488 deletions(-) create mode 100644 src/lib/components/match/MatchCardSkeleton.svelte diff --git a/src/app.css b/src/app.css index 5fb0a70..f2b2e1c 100644 --- a/src/app.css +++ b/src/app.css @@ -129,6 +129,23 @@ } } + /* Card fade-in animation with stagger support */ + .animate-card-in { + animation: cardFadeIn 0.4s ease-out forwards; + opacity: 0; + } + + @keyframes cardFadeIn { + from { + opacity: 0; + transform: translateY(20px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } + } + /* Neon Text Glow Effects */ .text-glow-sm { text-shadow: 0 0 10px currentColor; diff --git a/src/lib/components/data-display/DataTable.svelte b/src/lib/components/data-display/DataTable.svelte index 5cc8e84..6cf9200 100644 --- a/src/lib/components/data-display/DataTable.svelte +++ b/src/lib/components/data-display/DataTable.svelte @@ -10,7 +10,7 @@ render?: (value: T[keyof T], row: T) => unknown; align?: 'left' | 'center' | 'right'; class?: string; - width?: string; // e.g., '200px', '30%', 'auto' + width?: string; } interface Props { @@ -20,7 +20,7 @@ striped?: boolean; hoverable?: boolean; compact?: boolean; - fixedLayout?: boolean; // Use table-layout: fixed for consistent column widths + fixedLayout?: boolean; } let { @@ -71,19 +71,18 @@
- +
- + {#each columns as column} - {#each sortedData as row} - + {#each sortedData as row, index} + {#each columns as column} -
handleSort(column)} > @@ -94,16 +93,16 @@ > {column.label} {#if column.sortable} -
+
{/if} @@ -113,10 +112,18 @@
+ {#if column.render} {@html column.render(row[column.key], row)} {:else} @@ -129,3 +136,50 @@
+ + diff --git a/src/lib/components/landing/NeonCTA.svelte b/src/lib/components/landing/NeonCTA.svelte index 2896934..6c8b199 100644 --- a/src/lib/components/landing/NeonCTA.svelte +++ b/src/lib/components/landing/NeonCTA.svelte @@ -47,7 +47,7 @@ Browse Matches - + diff --git a/src/lib/components/match/MatchCard.svelte b/src/lib/components/match/MatchCard.svelte index 12cb8fc..cd64f29 100644 --- a/src/lib/components/match/MatchCard.svelte +++ b/src/lib/components/match/MatchCard.svelte @@ -1,15 +1,17 @@ + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ - +
+
+
+
+
+
+
+
+
diff --git a/src/lib/components/match/ShareCodeInput.svelte b/src/lib/components/match/ShareCodeInput.svelte index b642b6c..62d6bc9 100644 --- a/src/lib/components/match/ShareCodeInput.svelte +++ b/src/lib/components/match/ShareCodeInput.svelte @@ -1,5 +1,5 @@