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 ? (
-
Loading...
-

Fetching leaderboard data...

+

Loading leaderboard...

+
+ {[...Array(6)].map((_, index) => ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ))} +
) : (
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...

) : (