diff --git a/__tests__/components/memes/drops/MemesLeaderboardDropCard.test.tsx b/__tests__/components/memes/drops/MemesLeaderboardDropCard.test.tsx index aae71372c0..aa536cce5b 100644 --- a/__tests__/components/memes/drops/MemesLeaderboardDropCard.test.tsx +++ b/__tests__/components/memes/drops/MemesLeaderboardDropCard.test.tsx @@ -3,9 +3,9 @@ import React from 'react'; import MemesLeaderboardDropCard from '@/components/memes/drops/MemesLeaderboardDropCard'; test.each([ - [1, 'desktop-hover:hover:tw-border-[#fbbf24]/40'], - [2, 'desktop-hover:hover:tw-border-[#94a3b8]/40'], - [3, 'desktop-hover:hover:tw-border-[#CD7F32]/40'], + [1, 'desktop-hover:hover:tw-border-yellow-500/20'], + [2, 'desktop-hover:hover:tw-border-iron-400/25'], + [3, 'desktop-hover:hover:tw-border-amber-600/20'], [4, 'desktop-hover:hover:tw-border-iron-700'], ])('applies border class for rank %i', (rank, expected) => { const drop = { rank } as any; diff --git a/__tests__/components/waves/drop/SingleWaveDropTraits.test.tsx b/__tests__/components/waves/drop/SingleWaveDropTraits.test.tsx index 430c6f6370..e170deb0b0 100644 --- a/__tests__/components/waves/drop/SingleWaveDropTraits.test.tsx +++ b/__tests__/components/waves/drop/SingleWaveDropTraits.test.tsx @@ -519,7 +519,7 @@ describe("SingleWaveDropTraits", () => { // Find the metadata item container by looking for the specific class pattern const { container } = render(); const metadataItems = container.querySelectorAll( - ".tw-px-2.tw-py-1.tw-rounded-md.tw-bg-iron-800" + String.raw`.tw-px-3.tw-py-1\.5.tw-rounded-md.tw-bg-iron-900` ); expect(metadataItems.length).toBeGreaterThan(0); diff --git a/__tests__/components/waves/leaderboard/header/WaveleaderboardSort.test.tsx b/__tests__/components/waves/leaderboard/header/WaveleaderboardSort.test.tsx index 4a5444044d..2da0426971 100644 --- a/__tests__/components/waves/leaderboard/header/WaveleaderboardSort.test.tsx +++ b/__tests__/components/waves/leaderboard/header/WaveleaderboardSort.test.tsx @@ -21,7 +21,7 @@ describe('WaveleaderboardSort', () => { ); const current = screen.getByText('Current Vote'); - expect(current.className).toContain('tw-bg-iron-800'); + expect(current.className).toContain('tw-bg-white/10'); await user.click(screen.getByText('Projected Vote')); expect(onSortChange).toHaveBeenCalledWith( diff --git a/components/brain/my-stream/votes/MyStreamWaveMyVote.tsx b/components/brain/my-stream/votes/MyStreamWaveMyVote.tsx index cd6cd9d196..54936402c8 100644 --- a/components/brain/my-stream/votes/MyStreamWaveMyVote.tsx +++ b/components/brain/my-stream/votes/MyStreamWaveMyVote.tsx @@ -7,10 +7,11 @@ import UserCICAndLevel, { UserCICAndLevelSize, } from "@/components/user/utils/UserCICAndLevel"; import { SingleWaveDropPosition } from "@/components/waves/drop/SingleWaveDropPosition"; -import { cicToType } from "@/helpers/Helpers"; +import { cicToType, formatNumberWithCommas } from "@/helpers/Helpers"; import Link from "next/link"; import UserProfileTooltipWrapper from "@/components/utils/tooltip/UserProfileTooltipWrapper"; import { ImageScale } from "@/helpers/image.helpers"; +import { Tooltip } from "react-tooltip"; interface MyStreamWaveMyVoteProps { readonly drop: ExtendedDrop; @@ -100,13 +101,11 @@ const MyStreamWaveMyVote: React.FC = ({
-
-
- {drop.rank && } -
+

{drop.title}

+ {drop.rank && }
@@ -144,24 +143,52 @@ const MyStreamWaveMyVote: React.FC = ({
e.stopPropagation()}>
-
- - - {drop.raters_count} +
+
+ {drop.top_raters?.slice(0, 3).map((voter) => ( + + e.stopPropagation()} + data-tooltip-id={`my-vote-voter-${drop.id}-${voter.profile.handle}`} + > + {voter.profile.pfp ? ( + Recent voter + ) : ( +
+ )} + + + {voter.profile.handle} - {formatNumberWithCommas(voter.rating)} + + + ))} +
+ + {formatNumberWithCommas(drop.raters_count)}{" "} + + {drop.raters_count === 1 ? "voter" : "voters"} +
diff --git a/components/brain/my-stream/votes/MyStreamWaveMyVoteVotes.tsx b/components/brain/my-stream/votes/MyStreamWaveMyVoteVotes.tsx index 05a5f74ef6..086133521b 100644 --- a/components/brain/my-stream/votes/MyStreamWaveMyVoteVotes.tsx +++ b/components/brain/my-stream/votes/MyStreamWaveMyVoteVotes.tsx @@ -14,7 +14,7 @@ const MyStreamWaveMyVoteVotes: React.FC = ({ return (
diff --git a/components/drops/view/utils/DropVoteProgressing.tsx b/components/drops/view/utils/DropVoteProgressing.tsx index be94aeb86d..80a5edc622 100644 --- a/components/drops/view/utils/DropVoteProgressing.tsx +++ b/components/drops/view/utils/DropVoteProgressing.tsx @@ -34,9 +34,9 @@ export default function DropVoteProgressing({ arrowColor = "tw-text-iron-600"; } else { color = isPositiveProgressing - ? "tw-text-emerald-400 tw-bg-emerald-900/40 tw-px-1.5 tw-py-0.5 tw-rounded-md" - : "tw-text-rose-400 tw-bg-rose-900/40 tw-px-1.5 tw-py-0.5 tw-rounded-md"; - arrowColor = isPositiveProgressing ? "tw-text-emerald-400" : "tw-text-rose-400"; + ? "tw-text-emerald-400 tw-bg-emerald-500/10 tw-px-2 tw-py-0.5 tw-rounded tw-border tw-border-solid tw-border-emerald-500/20 tw-font-mono" + : "tw-text-rose-400 tw-bg-rose-500/10 tw-px-2 tw-py-0.5 tw-rounded tw-border tw-border-solid tw-border-rose-500/20 tw-font-mono"; + arrowColor = "tw-text-iron-600"; } return ( @@ -52,7 +52,7 @@ export default function DropVoteProgressing({ icon={faArrowRight} className={`tw-flex-shrink-0 tw-size-2.5 ${arrowColor}`} /> - {formatNumberWithCommas(projected)} + {formatNumberWithCommas(projected)} { @@ -24,33 +25,42 @@ const convertValue = (value: string) => { return value; }; -const MemeDropTrait: React.FC = ({ label, value }) => { +const MemeDropTrait: React.FC = ({ label, value, dropId }) => { const isMobile = useIsMobileDevice(); const convertedValue = convertValue(value); + const tooltipId = dropId ? `meme-drop-trait-${dropId}-${label}` : `meme-drop-trait-${label}`; if (label === FIELD_TO_LABEL_MAP.pointsLoki) { console.log(value, typeof value); } return ( -
- - {label}: +
+ + {label} <> - + {convertedValue} {!isMobile && ( {convertedValue} diff --git a/components/memes/drops/MemeDropTraits.tsx b/components/memes/drops/MemeDropTraits.tsx index 01ce6765d6..0e3d956a7d 100644 --- a/components/memes/drops/MemeDropTraits.tsx +++ b/components/memes/drops/MemeDropTraits.tsx @@ -38,7 +38,7 @@ const MemeDropTraits: React.FC = ({ drop }) => { }; return ( -
+
{traits.slice(0, 2).map((trait) => ( = ({ drop }) => { ] } value={trait.data_value ?? ""} + dropId={drop.id} /> ))} @@ -63,18 +64,19 @@ const MemeDropTraits: React.FC = ({ drop }) => { ] } value={trait.data_value ?? ""} + dropId={drop.id} /> ))} ) : ( )} diff --git a/components/memes/drops/MemeParticipationDrop.tsx b/components/memes/drops/MemeParticipationDrop.tsx index 587234577a..e70166d51f 100644 --- a/components/memes/drops/MemeParticipationDrop.tsx +++ b/components/memes/drops/MemeParticipationDrop.tsx @@ -103,7 +103,7 @@ export default function MemeParticipationDrop({ <>
-
+
diff --git a/components/memes/drops/MemeWinnerArtistInfo.tsx b/components/memes/drops/MemeWinnerArtistInfo.tsx index 901b330ccb..31d34db248 100644 --- a/components/memes/drops/MemeWinnerArtistInfo.tsx +++ b/components/memes/drops/MemeWinnerArtistInfo.tsx @@ -23,9 +23,9 @@ export default function MemeWinnerArtistInfo({ const cicType = cicToType(drop.author?.cic); return ( -
+
-
+
{!!drop.author?.level && ( )} -

+

{drop.author?.handle ? ( e.stopPropagation()} - href={`/${drop.author?.handle}`} + href={`/${drop.author?.handle ?? drop.author?.id}`} className="tw-no-underline desktop-hover:hover:tw-underline tw-text-iron-200 desktop-hover:hover:tw-text-opacity-80 tw-transition tw-duration-300 tw-ease-out" > - {drop.author?.handle} + {drop.author?.handle ?? drop.author?.id} )}

-
-

+

+

{getTimeAgoShort(drop.created_at)}

-
- -
+ {showWaveInfo && drop.wave && ( +
<> -
-
- -
-
+
+ +
+ +
+
{artworkMedia && ( -
+
)} - + +
- +
- {/* Actions for desktop */} {!isMobile && showReplyAndQuote && (
= ({
-
-
-
- -
- {!hasTouchScreen && ( - <> -
- -
-
- {canDelete && ( - - )} -
- - )} -
-
-
- - + {/* Artist info section with border */} +
+
+ +
+ {!hasTouchScreen && ( + <> + + {canDelete && ( + + )} + + )}
+ {/* Title and Description */} +
+
+ + +
+
+ {artworkMedia && (
= ({ />
)} - -
-
+ + {/* Footer Section: Traits + Vote Summary + Vote Button */} +
+ + +
= ({ topVoters={firstThreeVoters} userContext={drop.context_profile_context} /> -
-
e.stopPropagation()}> - setIsVotingModalOpen(true)} - /> +
e.stopPropagation()}> + {/* Voters - only on small containers */} +
+
+ {firstThreeVoters.map((voter) => ( + e.stopPropagation()} + > + {voter.profile.pfp ? ( + Recent voter + ) : ( +
+ )} + + ))} +
+ + {formatNumberWithCommas(drop.raters_count)}{" "} + + {drop.raters_count === 1 ? "voter" : "voters"} + + +
+ setIsVotingModalOpen(true)} + /> +
diff --git a/components/memes/drops/MemesLeaderboardDropArtistInfo.tsx b/components/memes/drops/MemesLeaderboardDropArtistInfo.tsx index 8ec039c27a..3ad0355103 100644 --- a/components/memes/drops/MemesLeaderboardDropArtistInfo.tsx +++ b/components/memes/drops/MemesLeaderboardDropArtistInfo.tsx @@ -35,10 +35,11 @@ const MemesLeaderboardDropArtistInfo: React.FC< }; return ( -
+
-
-
+
+ {/* Top row: Handle + Artist badge + Timestamp */} +
{drop.author?.level && ( e.stopPropagation()} className="tw-no-underline desktop-hover:hover:tw-underline" > - + {drop.author?.handle} @@ -64,11 +65,12 @@ const MemesLeaderboardDropArtistInfo: React.FC< onClick={(e) => e.stopPropagation()} className="tw-no-underline desktop-hover:hover:tw-underline" > - + {drop.author?.handle} )} + {hasSubmissions && ( )} - {/* Divider followed by WaveDropTime component */} -
-
+ +
- + + {/* Bottom row: Winner badge */} +
+ +
- + {/* Artist Submission Preview Modal */} { "tw-rounded-xl tw-border tw-border-solid tw-border-iron-800 tw-transition-all tw-duration-200 tw-ease-out tw-overflow-hidden"; if (rank === 1) { - return `${baseClasses} desktop-hover:hover:tw-border-[#fbbf24]/40`; + return `${baseClasses} desktop-hover:hover:tw-border-yellow-500/20`; } else if (rank === 2) { - return `${baseClasses} desktop-hover:hover:tw-border-[#94a3b8]/40`; + return `${baseClasses} desktop-hover:hover:tw-border-iron-400/25`; } else if (rank === 3) { - return `${baseClasses} desktop-hover:hover:tw-border-[#CD7F32]/40`; + return `${baseClasses} desktop-hover:hover:tw-border-amber-600/20`; } else { // More subtle hover effect for ranks 4+ return `${baseClasses} desktop-hover:hover:tw-border-iron-700`; diff --git a/components/memes/drops/MemesLeaderboardDropDescription.tsx b/components/memes/drops/MemesLeaderboardDropDescription.tsx index bda27a4dc2..8b0a79f6b1 100644 --- a/components/memes/drops/MemesLeaderboardDropDescription.tsx +++ b/components/memes/drops/MemesLeaderboardDropDescription.tsx @@ -9,7 +9,7 @@ const MemesLeaderboardDropDescription: React.FC { return (
-

{description}

+

{description}

); }; diff --git a/components/memes/drops/MemesLeaderboardDropHeader.tsx b/components/memes/drops/MemesLeaderboardDropHeader.tsx index 4ec31aa0cc..f016a2039e 100644 --- a/components/memes/drops/MemesLeaderboardDropHeader.tsx +++ b/components/memes/drops/MemesLeaderboardDropHeader.tsx @@ -8,7 +8,7 @@ const MemesLeaderboardDropHeader: React.FC< MemesLeaderboardDropHeaderProps > = ({ title }) => { return ( -

+

{title}

); diff --git a/components/memes/drops/MemesLeaderboardDropVoteSummary.tsx b/components/memes/drops/MemesLeaderboardDropVoteSummary.tsx index 935dff1ee1..f199446e84 100644 --- a/components/memes/drops/MemesLeaderboardDropVoteSummary.tsx +++ b/components/memes/drops/MemesLeaderboardDropVoteSummary.tsx @@ -34,82 +34,81 @@ const MemesLeaderboardDropVoteSummary: React.FC< const isUserVoteNegative = userVote < 0; return ( -
-
+
+ {/* Left side: Vote counts + User vote (on large) */} +
{formatNumberWithCommas(current)} - + {creditType} total -
-
-
- {topVoters.map((voter) => ( - - e.stopPropagation()} - data-tooltip-id={`voter-${voter.profile.handle}`} - > - {voter.profile.pfp ? ( - Recent voter - ) : ( -
- )} - - - {voter.profile.handle} - {formatNumberWithCommas(voter.rating)} - - - ))} -
-
- - {formatNumberWithCommas(ratersCount)} - - - {ratersCount === 1 ? "voter" : "voters"} + {/* User vote badge - hidden on small containers */} + {hasUserVoted && ( + + Your vote:{" "} + + {isUserVoteNegative && "-"} + {formatNumberWithCommas(Math.abs(userVote))} + -
+ )}
- {hasUserVoted && ( -
-
- - Your vote: - - - {isUserVoteNegative && "-"} - {formatNumberWithCommas(Math.abs(userVote))}{" "} - - {creditType} - - + {/* Right side: Voters - hidden on small containers (shown next to button) */} +
+
+ {topVoters.map((voter) => ( + + e.stopPropagation()} + data-tooltip-id={`voter-${voter.profile.handle}`} + > + {voter.profile.pfp ? ( + Recent voter + ) : ( +
+ )} + + + {voter.profile.handle} - {formatNumberWithCommas(voter.rating)} + + + ))}
-
- )} + + {formatNumberWithCommas(ratersCount)}{" "} + + {ratersCount === 1 ? "voter" : "voters"} + + +
); }; diff --git a/components/memes/drops/meme-participation-drop/MemeDropVoteStats.tsx b/components/memes/drops/meme-participation-drop/MemeDropVoteStats.tsx index e25807d3d7..aa16c18379 100644 --- a/components/memes/drops/meme-participation-drop/MemeDropVoteStats.tsx +++ b/components/memes/drops/meme-participation-drop/MemeDropVoteStats.tsx @@ -44,15 +44,15 @@ export default function MemeDropVoteStats({
- - {votingCreditType} total + + {votingCreditType} total
-
-
+
+
{firstThreeVoters.map((voter) => (
{voter.profile.pfp ? ( Recent voter ) : ( -
+
)} ))}
-
- - {formatNumberWithCommas(ratersCount ?? 0)} - - + + {formatNumberWithCommas(ratersCount ?? 0)}{" "} + {ratersCount === 1 ? "voter" : "voters"} -
+
{/* User's vote */} diff --git a/components/user/utils/UserCICAndLevel.tsx b/components/user/utils/UserCICAndLevel.tsx index f9b93d4724..d1d10e159e 100644 --- a/components/user/utils/UserCICAndLevel.tsx +++ b/components/user/utils/UserCICAndLevel.tsx @@ -20,26 +20,34 @@ export default function UserCICAndLevel({ readonly size?: UserCICAndLevelSize; }) { const mainColor = color ?? "iron-300"; + const LEVEL_SIZE_CLASSES: Record = { - [UserCICAndLevelSize.SMALL]: "tw-h-4 tw-w-4 tw-text-[9px]", - [UserCICAndLevelSize.MEDIUM]: "tw-h-5 tw-w-5 tw-text-[0.625rem]", - [UserCICAndLevelSize.LARGE]: "tw-h-6 tw-w-6 tw-text-[0.75rem]", - [UserCICAndLevelSize.XLARGE]: "tw-h-8 tw-w-8 tw-text-[1rem]", + [UserCICAndLevelSize.SMALL]: "tw-h-5 tw-w-5 tw-text-[9px]", + [UserCICAndLevelSize.MEDIUM]: "tw-h-6 tw-w-6 tw-text-[0.65rem]", + [UserCICAndLevelSize.LARGE]: "tw-h-8 tw-w-8 tw-text-[0.8rem]", + [UserCICAndLevelSize.XLARGE]: "tw-h-10 tw-w-10 tw-text-[1rem]", }; + const CIC_SIZE_CLASSES: Record = { - [UserCICAndLevelSize.SMALL]: "-tw-top-[0.1875rem] tw-h-2 tw-w-2", - [UserCICAndLevelSize.MEDIUM]: "tw-top-0 tw-h-2 tw-w-2", - [UserCICAndLevelSize.LARGE]: "-tw-top-1.5 tw-h-3 tw-w-3", - [UserCICAndLevelSize.XLARGE]: "-tw-top-2 tw-h-4 tw-w-4", + [UserCICAndLevelSize.SMALL]: "-tw-top-0.5 -tw-right-0.5 tw-h-2 tw-w-2", + [UserCICAndLevelSize.MEDIUM]: "-tw-top-1 -tw-right-0.5 tw-h-2.5 tw-w-2.5", + [UserCICAndLevelSize.LARGE]: "-tw-top-0.5 -tw-right-0.5 tw-h-3.5 tw-w-3.5", + [UserCICAndLevelSize.XLARGE]: "-tw-top-0.5 -tw-right-0.5 tw-h-4 tw-w-4", }; + return ( -
+
- {level} + className={`${LEVEL_SIZE_CLASSES[size]} tw-flex tw-items-center tw-justify-center tw-font-bold tw-rounded-full + tw-bg-iron-800 tw-leading-none + tw-border tw-border-solid tw-border-iron-700 + tw-text-${mainColor}`}> + {level}
+ className={`${CIC_SIZE_CLASSES[size]} ${CIC_COLOR[cicType]} + tw-flex-shrink-0 tw-absolute tw-block tw-rounded-full + tw-ring-2 tw-ring-[#050505] tw-shadow-sm`}>
); } diff --git a/components/user/utils/profile/UserProfileTooltip.tsx b/components/user/utils/profile/UserProfileTooltip.tsx index b3e735a8c3..04a243daaa 100644 --- a/components/user/utils/profile/UserProfileTooltip.tsx +++ b/components/user/utils/profile/UserProfileTooltip.tsx @@ -114,7 +114,7 @@ export default function UserProfileTooltip({ )}
diff --git a/components/voting/VotingModalButton.tsx b/components/voting/VotingModalButton.tsx index 4fafc2e520..9f94ef8eef 100644 --- a/components/voting/VotingModalButton.tsx +++ b/components/voting/VotingModalButton.tsx @@ -24,7 +24,7 @@ const VotingModalButton: React.FC = ({ onClick(); }; - const baseClasses = "tw-flex tw-items-center tw-justify-center tw-gap-x-1 tw-px-3 tw-py-1.5 tw-rounded-lg tw-border tw-border-solid tw-text-xs tw-whitespace-nowrap tw-transition-all tw-duration-300 tw-ease-out"; + const baseClasses = "tw-flex tw-items-center tw-justify-center tw-gap-x-1 tw-px-3 tw-py-1.5 tw-rounded-md tw-border tw-border-solid tw-text-xs tw-whitespace-nowrap tw-transition-all tw-duration-300 tw-ease-out"; const variantClasses = variant === "subtle" ? "tw-bg-white tw-border-white tw-text-black tw-font-semibold desktop-hover:hover:tw-bg-iron-300 tw-shadow-[0_0_15px_rgba(255,255,255,0.1)]" diff --git a/components/waves/drop/SingleWaveDropAuthor.tsx b/components/waves/drop/SingleWaveDropAuthor.tsx index d1ee0f059d..6366f6cb2a 100644 --- a/components/waves/drop/SingleWaveDropAuthor.tsx +++ b/components/waves/drop/SingleWaveDropAuthor.tsx @@ -11,7 +11,9 @@ interface SingleWaveDropAuthorProps { readonly drop: ApiDrop; } -export const SingleWaveDropAuthor: React.FC = ({ drop }) => { +export const SingleWaveDropAuthor: React.FC = ({ + drop, +}) => { return ( = ({ drop ) : (
)} - - - - {drop.author.handle} - - +
+ + + + + {drop.author.handle} + + +
); -}; \ No newline at end of file +}; diff --git a/components/waves/drop/SingleWaveDropLogs.tsx b/components/waves/drop/SingleWaveDropLogs.tsx index bfd386cbdd..41a6ad923f 100644 --- a/components/waves/drop/SingleWaveDropLogs.tsx +++ b/components/waves/drop/SingleWaveDropLogs.tsx @@ -38,7 +38,7 @@ export const SingleWaveDropLogs: React.FC = ({
- + {formatNumberWithCommas(drop.raters_count)}{" "} - {drop.raters_count === 1 ? "voter" : "voters"} + + {drop.raters_count === 1 ? "voter" : "voters"} +
diff --git a/components/waves/drops/participation/EndedParticipationDrop.tsx b/components/waves/drops/participation/EndedParticipationDrop.tsx index 3d01986579..4892e51360 100644 --- a/components/waves/drops/participation/EndedParticipationDrop.tsx +++ b/components/waves/drops/participation/EndedParticipationDrop.tsx @@ -108,7 +108,7 @@ export default function EndedParticipationDrop({
-
+
-

+

{getTimeAgoShort(drop.created_at)}

-
+
Participant
diff --git a/components/waves/drops/time/WaveDropTime.tsx b/components/waves/drops/time/WaveDropTime.tsx index 94bdedf2b7..ab96cf9018 100644 --- a/components/waves/drops/time/WaveDropTime.tsx +++ b/components/waves/drops/time/WaveDropTime.tsx @@ -82,7 +82,7 @@ const WaveDropTime: React.FC = ({ timestamp }) => { }; return ( -

+

{formatTime()}

); diff --git a/components/waves/drops/winner/DefaultWinnerDrop.tsx b/components/waves/drops/winner/DefaultWinnerDrop.tsx index 10045a12f0..797288fedb 100644 --- a/components/waves/drops/winner/DefaultWinnerDrop.tsx +++ b/components/waves/drops/winner/DefaultWinnerDrop.tsx @@ -62,9 +62,9 @@ const getDropStyles = ( } return { - boxShadow: `inset 1.5px 0 0 ${colors.borderColor}, - inset 0 1px 0 ${colors.borderColor}20, - inset -1.5px 0 0 ${colors.borderColor}20, + boxShadow: `inset 1.5px 0 0 ${colors.borderColor}80, + inset 0 1px 0 ${colors.borderColor}20, + inset -1.5px 0 0 ${colors.borderColor}20, inset 0 -1.5px 0 ${colors.borderColor}20`, }; }; @@ -172,19 +172,17 @@ const DefaultWinnerDrop = ({
-
+
- } + /> + {showWaveInfo && (() => { const waveDetails = diff --git a/components/waves/drops/winner/WinnerDropBadge.tsx b/components/waves/drops/winner/WinnerDropBadge.tsx index 24d9921881..d697a2d493 100644 --- a/components/waves/drops/winner/WinnerDropBadge.tsx +++ b/components/waves/drops/winner/WinnerDropBadge.tsx @@ -57,59 +57,38 @@ const WinnerDropBadge: React.FC = ({ : null; // Colors for each rank - let accentColor = ""; - let bgColor = ""; + let colorClasses = ""; let rankText = ""; switch (rankNumber) { case 1: - accentColor = "#fbbf24"; // amber-400 - Gold from ParticipationDrop - bgColor = "rgba(251,191,36,0.1)"; + colorClasses = "tw-bg-yellow-500/10 tw-text-yellow-400 tw-border-yellow-500/20"; rankText = "1st"; break; case 2: - accentColor = "#CAD5E3"; // slate-400 - Silver from ParticipationDrop - bgColor = "rgba(202, 213, 227,0.1)"; + colorClasses = "tw-bg-iron-400/10 tw-text-iron-300 tw-border-iron-400/20"; rankText = "2nd"; break; case 3: - accentColor = "#CD7F32"; // Bronze - bgColor = "rgba(205,127,50,0.1)"; + colorClasses = "tw-bg-amber-600/10 tw-text-amber-500 tw-border-amber-600/20"; rankText = "3rd"; break; default: - accentColor = "#848490"; // iron-600 from Tailwind config - bgColor = "rgba(96,96,108,0.2)"; + colorClasses = "tw-bg-iron-600/20 tw-text-iron-400 tw-border-iron-600/20"; rankText = `${rankNumber}${getOrdinalSuffix(rankNumber)}`; } return (
- {/* Rank part */} - - - {rankText} - {position > 1 && #{position}} - + className={`tw-flex tw-items-center tw-gap-1 tw-px-2 tw-py-0.5 tw-rounded tw-text-[10px] tw-font-bold tw-uppercase tw-tracking-wider tw-border tw-border-solid tw-whitespace-nowrap ${colorClasses}`}> + + {rankText} + {position > 1 && #{position}} {dateString && ( -
- +
+ {dateString} {timeString && ( diff --git a/components/waves/leaderboard/header/WaveleaderboardHeader.tsx b/components/waves/leaderboard/header/WaveleaderboardHeader.tsx index 689470f169..709cc66694 100644 --- a/components/waves/leaderboard/header/WaveleaderboardHeader.tsx +++ b/components/waves/leaderboard/header/WaveleaderboardHeader.tsx @@ -40,14 +40,14 @@ export const WaveLeaderboardHeader: React.FC = ({
{/* Hide view toggle buttons on mobile (S breakpoint), show only on desktop (MD breakpoint) */} {breakpoint === "MD" && ( -
+
<>
)}
-
+
diff --git a/components/waves/winners/drops/MemesWaveWinnerDrop.tsx b/components/waves/winners/drops/MemesWaveWinnerDrop.tsx index fb97cbdc3e..9186baef79 100644 --- a/components/waves/winners/drops/MemesWaveWinnerDrop.tsx +++ b/components/waves/winners/drops/MemesWaveWinnerDrop.tsx @@ -15,8 +15,6 @@ import UserCICAndLevel, { } from "@/components/user/utils/UserCICAndLevel"; import { cicToType, formatNumberWithCommas } from "@/helpers/Helpers"; import { Tooltip } from "react-tooltip"; -import { faTrophy } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import MemeDropTraits from "@/components/memes/drops/MemeDropTraits"; import DropListItemContentMedia from "@/components/drops/view/item/content/media/DropListItemContentMedia"; import useDeviceInfo from "@/hooks/useDeviceInfo"; @@ -26,6 +24,7 @@ import CommonDropdownItemsMobileWrapper from "@/components/utils/select/dropdown import WaveDropMobileMenuOpen from "@/components/waves/drops/WaveDropMobileMenuOpen"; import WaveDropTime from "@/components/waves/drops/time/WaveDropTime"; import UserProfileTooltipWrapper from "@/components/utils/tooltip/UserProfileTooltipWrapper"; +import WinnerDropBadge from "@/components/waves/drops/winner/WinnerDropBadge"; interface MemesWaveWinnersDropProps { readonly winner: ApiWaveDecisionWinner; @@ -46,8 +45,6 @@ export const MemesWaveWinnersDrop: React.FC = ({ hasTouchScreen, }); - // Mobile detection is now handled by the WaveDropTime component - const title = winner.drop.metadata?.find((m) => m.data_key === "title")?.data_value || "Artwork Title"; @@ -78,88 +75,89 @@ export const MemesWaveWinnersDrop: React.FC = ({ onClick={() => onDropClick(extendedDrop)} className="touch-select-none tw-cursor-pointer tw-rounded-xl tw-transition-all tw-duration-300 tw-ease-out tw-w-full" > -
+
-
-
-
-
- e.stopPropagation()} - scroll={false} - className="tw-flex tw-items-center tw-gap-x-2 tw-no-underline group" - > - - -
-
- {winner.drop.author?.level && ( - - )} - {winner.drop.author?.handle ? ( - - e.stopPropagation()} - scroll={false} - className="tw-no-underline desktop-hover:hover:tw-underline desktop-hover:hover:tw-opacity-80 tw-transition-opacity" - > - - {winner.drop.author?.handle} - - - - ) : ( + {/* Header section with border */} +
+
+
+ +
+ {/* Top row: Handle + Timestamp */} +
+ {winner.drop.author?.level && ( + + )} + {winner.drop.author?.handle ? ( + e.stopPropagation()} scroll={false} - className="tw-no-underline desktop-hover:hover:tw-underline desktop-hover:hover:tw-opacity-80 tw-transition-opacity" + className="tw-no-underline desktop-hover:hover:tw-underline" > - + {winner.drop.author?.handle} - )} + + ) : ( + e.stopPropagation()} + scroll={false} + className="tw-no-underline desktop-hover:hover:tw-underline" + > + + {winner.drop.author?.handle ?? winner.drop.author?.id} + + + )} + + -
- - -
+
-
- +
+
- {/* Show open icon when not a touch device */} - {!hasTouchScreen && ( -
-
- -
+ {/* Show open icon when not a touch device */} + {!hasTouchScreen && ( +
+
+
- )} -
-
-

- {title} -

-
{description}
-
+
+ )} +
+
+ + {/* Title and Description */} +
+
+

+ {title} +

+

+ {description} +

{artworkMedia && ( -
+
= ({
)} - - -
-
- - {formatNumberWithCommas(rating)} - - {creditType} -
+ {/* Footer Section: Traits + Vote Summary */} +
+ -
-
- {topVoters.map((voter) => ( - - e.stopPropagation()} - scroll={false} - className="tw-transition-transform desktop-hover:hover:tw-translate-y-[-2px]" - data-tooltip-id={`voter-${voter.profile.handle}-${voter.rating}`} - > - {voter.profile.pfp ? ( - Recent voter - ) : ( -
- )} - - - {voter.profile.handle} - {formatNumberWithCommas(voter.rating)} - - - ))} -
-
- - {formatNumberWithCommas(ratersCount)} - - - {ratersCount === 1 ? "voter" : "voters"} +
+
+ + {formatNumberWithCommas(rating)} + {creditType} total
-
- {/* User's vote */} - {hasUserVoted && ( -
-
- - Your vote: +
+
+ {topVoters.map((voter) => ( + + e.stopPropagation()} + scroll={false} + className="tw-transition-transform desktop-hover:hover:tw-translate-y-[-2px]" + data-tooltip-id={`voter-${voter.profile.handle}-${voter.rating}`} + > + {voter.profile.pfp ? ( + Recent voter + ) : ( +
+ )} + + + {voter.profile.handle} - {formatNumberWithCommas(voter.rating)} + + + ))} +
+ + {formatNumberWithCommas(ratersCount)}{" "} + + {ratersCount === 1 ? "voter" : "voters"} - - {isUserVoteNegative && "-"} - {formatNumberWithCommas(Math.abs(userVote))}{" "} - - {creditType} + +
+ + {/* User's vote */} + {hasUserVoted && ( +
+
+ + Your vote: - + + {isUserVoteNegative && "-"} + {formatNumberWithCommas(Math.abs(userVote))}{" "} + + {creditType} + + +
-
- )} + )} +
{/* Touch slide-up menu */} diff --git a/components/waves/winners/drops/header/WaveWinnersDropHeader.tsx b/components/waves/winners/drops/header/WaveWinnersDropHeader.tsx index 9e4f7e8e0e..f225768f67 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropHeader.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropHeader.tsx @@ -20,19 +20,17 @@ export const WaveWinnersDropHeader: React.FC = ({ onClick={(e) => e.stopPropagation()} className="tw-flex tw-flex-wrap xl:tw-flex-nowrap tw-gap-y-2 tw-justify-between tw-w-full" > -
+
-
- -
+
{showVotingInfo && ( diff --git a/components/waves/winners/drops/header/WaveWinnersDropHeaderAuthorPfp.tsx b/components/waves/winners/drops/header/WaveWinnersDropHeaderAuthorPfp.tsx index 9f8d663827..d210e4f1b3 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropHeaderAuthorPfp.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropHeaderAuthorPfp.tsx @@ -9,7 +9,7 @@ export default function WaveWinnersDropHeaderAuthorPfp({ winner, }: WaveWinnersDropHeaderAuthorPfpProps) { return ( -
+
{winner.drop.author.pfp ? (
diff --git a/components/waves/winners/drops/header/WaveWinnersDropHeaderTotalVotes.tsx b/components/waves/winners/drops/header/WaveWinnersDropHeaderTotalVotes.tsx index 2b30b7f24f..68a1a90818 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropHeaderTotalVotes.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropHeaderTotalVotes.tsx @@ -29,11 +29,11 @@ export default function WaveWinnersDropHeaderTotalVotes({ const style = getVoteStyle(winner.place, winner.drop.rating); return ( -
- +
+ {formatNumberWithCommas(winner.drop.rating)} - + {winner.drop.wave.voting_credit_type} total
diff --git a/components/waves/winners/drops/header/WaveWinnersDropHeaderVoter.tsx b/components/waves/winners/drops/header/WaveWinnersDropHeaderVoter.tsx index 888ba05933..450e99fe38 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropHeaderVoter.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropHeaderVoter.tsx @@ -31,10 +31,10 @@ export default function WaveWinnersDropHeaderVoter({ {`${voter.profile.handle}'s ) : ( -
+
)}
diff --git a/components/waves/winners/drops/header/WaveWinnersDropHeaderVoters.tsx b/components/waves/winners/drops/header/WaveWinnersDropHeaderVoters.tsx index 5831dc9fc1..2707456636 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropHeaderVoters.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropHeaderVoters.tsx @@ -38,22 +38,24 @@ export default function WaveWinnersDropHeaderVoters({ return (
-
- {winner.drop.top_raters.map((voter, index) => ( - - ))} -
- - +
+
+ {winner.drop.top_raters.map((voter, index) => ( + + ))} +
+ {formatNumberWithCommas(winner.drop.raters_count)}{" "} + + {winner.drop.raters_count === 1 ? "voter" : "voters"} + - {winner.drop.raters_count === 1 ? "voter" : "voters"} - +
{hasUserVoted && (
diff --git a/components/waves/winners/drops/header/WaveWinnersDropOutcome.tsx b/components/waves/winners/drops/header/WaveWinnersDropOutcome.tsx index 9577f337a2..745df6576f 100644 --- a/components/waves/winners/drops/header/WaveWinnersDropOutcome.tsx +++ b/components/waves/winners/drops/header/WaveWinnersDropOutcome.tsx @@ -61,7 +61,7 @@ export default function WaveWinnersDropOutcome({ return (
- + Outcome: