From bee0bd94f1fcb366d29b2b5c4efbd4dc82cbcfce Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 6 Oct 2025 13:49:15 +0000
Subject: [PATCH 1/3] Initial plan
From 72dc5dbbaffad6a10cf7ae213c9f4bff5e646e2a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 6 Oct 2025 14:20:20 +0000
Subject: [PATCH 2/3] Add animated skeleton loader to giveaway leaderboard page
with theme support
Co-authored-by: Adez017 <142787780+Adez017@users.noreply.github.com>
---
src/pages/dashboard/giveaway/index.tsx | 217 ++++++++++++++++++++++++-
1 file changed, 215 insertions(+), 2 deletions(-)
diff --git a/src/pages/dashboard/giveaway/index.tsx b/src/pages/dashboard/giveaway/index.tsx
index 80f9307b..93bcb767 100644
--- a/src/pages/dashboard/giveaway/index.tsx
+++ b/src/pages/dashboard/giveaway/index.tsx
@@ -145,6 +145,200 @@ const giveawayStyles = `
color: var(--ifm-color-emphasis-700);
}
+.giveaway-loading-container {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 1.5rem;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 2rem 0;
+}
+
+.giveaway-skeleton-card {
+ background: var(--ifm-background-color);
+ border: 1px solid var(--ifm-color-emphasis-300);
+ border-radius: 16px;
+ padding: 1.5rem;
+ position: relative;
+ overflow: hidden;
+ box-shadow: 0 4px 12px var(--ifm-color-emphasis-200);
+}
+
+[data-theme='dark'] .giveaway-skeleton-card {
+ background: var(--ifm-color-emphasis-100);
+ border-color: var(--ifm-color-emphasis-400);
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+}
+
+.giveaway-skeleton-badge {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: var(--ifm-color-emphasis-300);
+}
+
+[data-theme='dark'] .giveaway-skeleton-badge {
+ background: var(--ifm-color-emphasis-600);
+}
+
+.giveaway-skeleton-avatar {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ margin: 0 auto 1rem;
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-200) 25%,
+ var(--ifm-color-emphasis-300) 50%,
+ var(--ifm-color-emphasis-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 2s infinite;
+}
+
+[data-theme='dark'] .giveaway-skeleton-avatar {
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-400) 25%,
+ var(--ifm-color-emphasis-500) 50%,
+ var(--ifm-color-emphasis-400) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.giveaway-skeleton-name {
+ height: 24px;
+ width: 70%;
+ margin: 0 auto 1rem;
+ border-radius: 4px;
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-200) 25%,
+ var(--ifm-color-emphasis-300) 50%,
+ var(--ifm-color-emphasis-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 2s infinite;
+}
+
+[data-theme='dark'] .giveaway-skeleton-name {
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-400) 25%,
+ var(--ifm-color-emphasis-500) 50%,
+ var(--ifm-color-emphasis-400) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.giveaway-skeleton-stats {
+ display: flex;
+ justify-content: space-around;
+ margin-bottom: 1.5rem;
+}
+
+.giveaway-skeleton-stat {
+ text-align: center;
+}
+
+.giveaway-skeleton-stat-value {
+ height: 32px;
+ width: 60px;
+ margin: 0 auto 0.5rem;
+ border-radius: 4px;
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-200) 25%,
+ var(--ifm-color-emphasis-300) 50%,
+ var(--ifm-color-emphasis-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 2s infinite;
+}
+
+[data-theme='dark'] .giveaway-skeleton-stat-value {
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-400) 25%,
+ var(--ifm-color-emphasis-500) 50%,
+ var(--ifm-color-emphasis-400) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.giveaway-skeleton-stat-label {
+ height: 16px;
+ width: 50px;
+ margin: 0 auto;
+ border-radius: 4px;
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-200) 25%,
+ var(--ifm-color-emphasis-300) 50%,
+ var(--ifm-color-emphasis-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 2s infinite;
+}
+
+[data-theme='dark'] .giveaway-skeleton-stat-label {
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-400) 25%,
+ var(--ifm-color-emphasis-500) 50%,
+ var(--ifm-color-emphasis-400) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.giveaway-skeleton-button {
+ height: 45px;
+ width: 100%;
+ border-radius: 8px;
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-200) 25%,
+ var(--ifm-color-emphasis-300) 50%,
+ var(--ifm-color-emphasis-200) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 2s infinite;
+}
+
+[data-theme='dark'] .giveaway-skeleton-button {
+ background: linear-gradient(
+ 90deg,
+ var(--ifm-color-emphasis-400) 25%,
+ var(--ifm-color-emphasis-500) 50%,
+ var(--ifm-color-emphasis-400) 75%
+ );
+ background-size: 200% 100%;
+}
+
+@keyframes shimmer {
+ 0% {
+ background-position: -200% 0;
+ }
+ 100% {
+ background-position: 200% 0;
+ }
+}
+
+.giveaway-loading-text {
+ text-align: center;
+ padding: 2rem 0;
+ color: var(--ifm-color-emphasis-700);
+ font-size: 1.1rem;
+ font-weight: 500;
+}
+
+[data-theme='dark'] .giveaway-loading-text {
+ color: var(--ifm-color-emphasis-600);
+}
+
.giveaway-leaderboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
@@ -770,8 +964,27 @@ const GiveawayPage: React.FC = () => {
{loading ? (
From be380962a908898092139ea854e50299d9ef657d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 6 Oct 2025 17:13:57 +0000
Subject: [PATCH 3/3] Fix: Add skeleton loader styles to LeaderBoard component,
revert giveaway changes
Co-authored-by: Adez017 <142787780+Adez017@users.noreply.github.com>
---
.../dashboard/LeaderBoard/leaderboard.css | 154 +++++++++++++
src/pages/dashboard/giveaway/index.tsx | 217 +-----------------
2 files changed, 156 insertions(+), 215 deletions(-)
diff --git a/src/components/dashboard/LeaderBoard/leaderboard.css b/src/components/dashboard/LeaderBoard/leaderboard.css
index f31f1b3e..f7be1bf4 100644
--- a/src/components/dashboard/LeaderBoard/leaderboard.css
+++ b/src/components/dashboard/LeaderBoard/leaderboard.css
@@ -884,6 +884,160 @@
}
}
+/* Skeleton Loader Styles */
+.skeleton-loader {
+ padding: 24px;
+ border-radius: 12px;
+ margin-top: 24px;
+}
+
+.skeleton-loader.light {
+ background: #fff;
+ border: 1px solid #e2e8f0;
+}
+
+.skeleton-loader.dark {
+ background: #2b303b;
+ border: 1px solid #444;
+}
+
+.skeleton-header {
+ display: grid;
+ grid-template-columns: 0.5fr 0.5fr 2fr 1fr 1fr;
+ gap: 16px;
+ padding: 16px 24px;
+ font-weight: 600;
+ font-size: 14px;
+ border-bottom: 2px solid;
+ margin-bottom: 16px;
+}
+
+.skeleton-loader.light .skeleton-header {
+ color: #666;
+ border-color: #e2e8f0;
+}
+
+.skeleton-loader.dark .skeleton-header {
+ color: #b3b3b3;
+ border-color: #444;
+}
+
+.skeleton-row {
+ display: grid;
+ grid-template-columns: 0.5fr 0.5fr 2fr 1fr 1fr;
+ align-items: center;
+ gap: 16px;
+ padding: 16px 24px;
+ margin-bottom: 12px;
+ border-radius: 8px;
+}
+
+.skeleton-loader.light .skeleton-row {
+ background: #f8fafc;
+}
+
+.skeleton-loader.dark .skeleton-row {
+ background: #323742;
+}
+
+.skeleton-avatar {
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ background: linear-gradient(
+ 90deg,
+ rgba(0, 0, 0, 0.06) 25%,
+ rgba(0, 0, 0, 0.12) 50%,
+ rgba(0, 0, 0, 0.06) 75%
+ );
+ background-size: 200% 100%;
+ animation: skeleton-shimmer 2s infinite;
+}
+
+.skeleton-loader.dark .skeleton-avatar {
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0.05) 25%,
+ rgba(255, 255, 255, 0.1) 50%,
+ rgba(255, 255, 255, 0.05) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.skeleton-avatar.large {
+ width: 40px;
+ height: 40px;
+}
+
+.skeleton-info {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ width: 100%;
+}
+
+.skeleton-bar {
+ height: 16px;
+ width: 60%;
+ border-radius: 4px;
+ background: linear-gradient(
+ 90deg,
+ rgba(0, 0, 0, 0.06) 25%,
+ rgba(0, 0, 0, 0.12) 50%,
+ rgba(0, 0, 0, 0.06) 75%
+ );
+ background-size: 200% 100%;
+ animation: skeleton-shimmer 2s infinite;
+}
+
+.skeleton-loader.dark .skeleton-bar {
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0.05) 25%,
+ rgba(255, 255, 255, 0.1) 50%,
+ rgba(255, 255, 255, 0.05) 75%
+ );
+ background-size: 200% 100%;
+}
+
+.skeleton-badges {
+ display: flex;
+ gap: 8px;
+}
+
+.skeleton-badge {
+ height: 20px;
+ width: 60px;
+ border-radius: 12px;
+ background: linear-gradient(
+ 90deg,
+ rgba(0, 0, 0, 0.06) 25%,
+ rgba(0, 0, 0, 0.12) 50%,
+ rgba(0, 0, 0, 0.06) 75%
+ );
+ background-size: 200% 100%;
+ animation: skeleton-shimmer 2s infinite;
+}
+
+.skeleton-loader.dark .skeleton-badge {
+ background: linear-gradient(
+ 90deg,
+ rgba(255, 255, 255, 0.05) 25%,
+ rgba(255, 255, 255, 0.1) 50%,
+ rgba(255, 255, 255, 0.05) 75%
+ );
+ background-size: 200% 100%;
+}
+
+@keyframes skeleton-shimmer {
+ 0% {
+ background-position: -200% 0;
+ }
+ 100% {
+ background-position: 200% 0;
+ }
+}
+
/* PR List Modal Styles */
.pr-modal-backdrop {
position: fixed;
diff --git a/src/pages/dashboard/giveaway/index.tsx b/src/pages/dashboard/giveaway/index.tsx
index 93bcb767..80f9307b 100644
--- a/src/pages/dashboard/giveaway/index.tsx
+++ b/src/pages/dashboard/giveaway/index.tsx
@@ -145,200 +145,6 @@ const giveawayStyles = `
color: var(--ifm-color-emphasis-700);
}
-.giveaway-loading-container {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
- gap: 1.5rem;
- max-width: 1200px;
- margin: 0 auto;
- padding: 2rem 0;
-}
-
-.giveaway-skeleton-card {
- background: var(--ifm-background-color);
- border: 1px solid var(--ifm-color-emphasis-300);
- border-radius: 16px;
- padding: 1.5rem;
- position: relative;
- overflow: hidden;
- box-shadow: 0 4px 12px var(--ifm-color-emphasis-200);
-}
-
-[data-theme='dark'] .giveaway-skeleton-card {
- background: var(--ifm-color-emphasis-100);
- border-color: var(--ifm-color-emphasis-400);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
-}
-
-.giveaway-skeleton-badge {
- position: absolute;
- top: 1rem;
- right: 1rem;
- width: 40px;
- height: 40px;
- border-radius: 50%;
- background: var(--ifm-color-emphasis-300);
-}
-
-[data-theme='dark'] .giveaway-skeleton-badge {
- background: var(--ifm-color-emphasis-600);
-}
-
-.giveaway-skeleton-avatar {
- width: 80px;
- height: 80px;
- border-radius: 50%;
- margin: 0 auto 1rem;
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-200) 25%,
- var(--ifm-color-emphasis-300) 50%,
- var(--ifm-color-emphasis-200) 75%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-[data-theme='dark'] .giveaway-skeleton-avatar {
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-400) 25%,
- var(--ifm-color-emphasis-500) 50%,
- var(--ifm-color-emphasis-400) 75%
- );
- background-size: 200% 100%;
-}
-
-.giveaway-skeleton-name {
- height: 24px;
- width: 70%;
- margin: 0 auto 1rem;
- border-radius: 4px;
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-200) 25%,
- var(--ifm-color-emphasis-300) 50%,
- var(--ifm-color-emphasis-200) 75%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-[data-theme='dark'] .giveaway-skeleton-name {
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-400) 25%,
- var(--ifm-color-emphasis-500) 50%,
- var(--ifm-color-emphasis-400) 75%
- );
- background-size: 200% 100%;
-}
-
-.giveaway-skeleton-stats {
- display: flex;
- justify-content: space-around;
- margin-bottom: 1.5rem;
-}
-
-.giveaway-skeleton-stat {
- text-align: center;
-}
-
-.giveaway-skeleton-stat-value {
- height: 32px;
- width: 60px;
- margin: 0 auto 0.5rem;
- border-radius: 4px;
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-200) 25%,
- var(--ifm-color-emphasis-300) 50%,
- var(--ifm-color-emphasis-200) 75%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-[data-theme='dark'] .giveaway-skeleton-stat-value {
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-400) 25%,
- var(--ifm-color-emphasis-500) 50%,
- var(--ifm-color-emphasis-400) 75%
- );
- background-size: 200% 100%;
-}
-
-.giveaway-skeleton-stat-label {
- height: 16px;
- width: 50px;
- margin: 0 auto;
- border-radius: 4px;
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-200) 25%,
- var(--ifm-color-emphasis-300) 50%,
- var(--ifm-color-emphasis-200) 75%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-[data-theme='dark'] .giveaway-skeleton-stat-label {
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-400) 25%,
- var(--ifm-color-emphasis-500) 50%,
- var(--ifm-color-emphasis-400) 75%
- );
- background-size: 200% 100%;
-}
-
-.giveaway-skeleton-button {
- height: 45px;
- width: 100%;
- border-radius: 8px;
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-200) 25%,
- var(--ifm-color-emphasis-300) 50%,
- var(--ifm-color-emphasis-200) 75%
- );
- background-size: 200% 100%;
- animation: shimmer 2s infinite;
-}
-
-[data-theme='dark'] .giveaway-skeleton-button {
- background: linear-gradient(
- 90deg,
- var(--ifm-color-emphasis-400) 25%,
- var(--ifm-color-emphasis-500) 50%,
- var(--ifm-color-emphasis-400) 75%
- );
- background-size: 200% 100%;
-}
-
-@keyframes shimmer {
- 0% {
- background-position: -200% 0;
- }
- 100% {
- background-position: 200% 0;
- }
-}
-
-.giveaway-loading-text {
- text-align: center;
- padding: 2rem 0;
- color: var(--ifm-color-emphasis-700);
- font-size: 1.1rem;
- font-weight: 500;
-}
-
-[data-theme='dark'] .giveaway-loading-text {
- color: var(--ifm-color-emphasis-600);
-}
-
.giveaway-leaderboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
@@ -964,27 +770,8 @@ const GiveawayPage: React.FC = () => {
{loading ? (
-
Loading leaderboard...
-
- {[...Array(6)].map((_, index) => (
-
- ))}
-
+
Loading...
+
Fetching leaderboard data...
) : (