diff --git a/src/components/layout/legal/CookieConsentBanner.tsx b/src/components/layout/legal/CookieConsentBanner.tsx index fb0502fa..c8d040a6 100644 --- a/src/components/layout/legal/CookieConsentBanner.tsx +++ b/src/components/layout/legal/CookieConsentBanner.tsx @@ -18,12 +18,12 @@ export function CookieConsentBanner() {

Cookie Consent

-

+

We use essential cookies to make our app work properly and remember your preferences like sidebar state. We respect your privacy and don't use any tracking or analytics cookies.

-

+

By clicking "Accept", you agree to our use of essential cookies. Learn more in our{" "} diff --git a/src/components/layout/legal/CookiePreferencesDialog.tsx b/src/components/layout/legal/CookiePreferencesDialog.tsx index 5458aab7..01aabe1c 100644 --- a/src/components/layout/legal/CookiePreferencesDialog.tsx +++ b/src/components/layout/legal/CookiePreferencesDialog.tsx @@ -76,14 +76,14 @@ export function CookiePreferencesDialog({ Cookie Preferences - + Manage your cookie settings and privacy preferences. You can control which types of cookies are stored on your device.

-

+

Manage your cookie preferences below. You can change these settings at any time.

@@ -96,7 +96,7 @@ export function CookiePreferencesDialog({ >

{category.title}

-

+

{category.description}

diff --git a/src/index.css b/src/index.css index 7e14efd0..fc8a62c0 100644 --- a/src/index.css +++ b/src/index.css @@ -47,6 +47,7 @@ --accent-foreground: 0 0% 100%; --accent-hover: 272.1 71.7% 47.1%; /* purple-700 */ --accent-soft: 271.5 81.3% 55.9% / 0.4; /* bg-purple-600/40 */ + --accent-soft-foreground: 270 95.2% 75.3%; /* purple-400 */ --destructive: 0 90.6% 70.8%; /* red-400 */ --destructive-foreground: 221 39% 11%; /* gray-900 — red-400 is too light for a white foreground */ diff --git a/src/lib/timeUtils.ts b/src/lib/timeUtils.ts index f17d83bf..bddbd6d7 100644 --- a/src/lib/timeUtils.ts +++ b/src/lib/timeUtils.ts @@ -166,6 +166,18 @@ export function combineDateAndTime( return `${datePart} ${timePart}`; } +export function formatDateOnly( + dateTime: string | null, + timezone?: string, +): string | null { + if (!dateTime) return null; + const date = parseISO(dateTime); + if (!isValid(date)) return null; + const dateFormat = "MMM d, yyyy"; + if (timezone) return formatInTimeZone(date, timezone, dateFormat); + return format(date, dateFormat); +} + export function formatDayOnly( dateTime: string | null, timezone?: string, diff --git a/src/pages/EditionView/tabs/VoteTab/EmptyArtistsState.tsx b/src/pages/EditionView/tabs/VoteTab/EmptyArtistsState.tsx index 5bdeabf9..95e2f4c4 100644 --- a/src/pages/EditionView/tabs/VoteTab/EmptyArtistsState.tsx +++ b/src/pages/EditionView/tabs/VoteTab/EmptyArtistsState.tsx @@ -10,31 +10,33 @@ import { export function EmptyArtistsState() { return (
- +
- - + +
- No Artists Yet - + + No Artists Yet + + Be the first to add artists to the Boom Festival voting list!
-
- +
+ Connect with fellow festival-goers
-
- +
+ Discover new electronic artists
-
- +
+ Vote for your favorites
diff --git a/src/pages/EditionView/tabs/VoteTab/MultiArtistSetCard.tsx b/src/pages/EditionView/tabs/VoteTab/MultiArtistSetCard.tsx index 334f35b3..f4993494 100644 --- a/src/pages/EditionView/tabs/VoteTab/MultiArtistSetCard.tsx +++ b/src/pages/EditionView/tabs/VoteTab/MultiArtistSetCard.tsx @@ -7,7 +7,7 @@ import { SetVotingButtons } from "./SetCard/SetVotingButtons"; export function MultiArtistSetCard() { return ( - + {/* Set Image with Mixed Artists */} diff --git a/src/pages/EditionView/tabs/VoteTab/SetCard/MultiArtistInfo.tsx b/src/pages/EditionView/tabs/VoteTab/SetCard/MultiArtistInfo.tsx index 018df8a9..e6e65d97 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetCard/MultiArtistInfo.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetCard/MultiArtistInfo.tsx @@ -20,7 +20,9 @@ export function MultiArtistInfo({
{artists.map((artist) => (
- {artist.name} + + {artist.name} +
))} diff --git a/src/pages/EditionView/tabs/VoteTab/SetCard/SetDescription.tsx b/src/pages/EditionView/tabs/VoteTab/SetCard/SetDescription.tsx index ba277fcf..30c1b647 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetCard/SetDescription.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetCard/SetDescription.tsx @@ -8,7 +8,7 @@ interface SetDescriptionProps { } export function SetDescription({ - className = "text-purple-200 text-sm leading-relaxed", + className = "text-muted-foreground text-sm leading-relaxed", }: SetDescriptionProps) { const { set } = useFestivalSet(); const isMultiArtist = set.artists.length > 1; diff --git a/src/pages/EditionView/tabs/VoteTab/SetCard/SetHeader.tsx b/src/pages/EditionView/tabs/VoteTab/SetCard/SetHeader.tsx index b12870a2..945f3b3b 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetCard/SetHeader.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetCard/SetHeader.tsx @@ -14,8 +14,8 @@ export function SetHeader({ size = "lg" }: SetHeaderProps) { const titleClass = size === "sm" - ? "text-white text-lg font-semibold truncate" - : "text-white text-xl"; + ? "text-foreground text-lg font-semibold truncate" + : "text-foreground text-xl"; return (
@@ -24,7 +24,7 @@ export function SetHeader({ size = "lg" }: SetHeaderProps) { {isMultiArtist && ( {set.artists.length} diff --git a/src/pages/EditionView/tabs/VoteTab/SetCard/SetMetadata.tsx b/src/pages/EditionView/tabs/VoteTab/SetCard/SetMetadata.tsx index c078e286..d6a506e0 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetCard/SetMetadata.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetCard/SetMetadata.tsx @@ -55,7 +55,7 @@ export function SetMetadata() { )} {timeRangeFormatted && ( -
+
{timeRangeFormatted}
@@ -67,7 +67,7 @@ export function SetMetadata() {
)} {(timeRangeFormatted || dayOnlyFormatted) && ( - + {festival.timezone} )} diff --git a/src/pages/EditionView/tabs/VoteTab/SetCard/SocialPlatformLink.tsx b/src/pages/EditionView/tabs/VoteTab/SetCard/SocialPlatformLink.tsx index 71e00618..58a6ad5b 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetCard/SocialPlatformLink.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetCard/SocialPlatformLink.tsx @@ -26,7 +26,7 @@ export function SocialPlatformLink({ asChild variant="secondary" size="sm" - className={`p-1 ${buttonSize} bg-white/20 hover:bg-white/30 backdrop-blur-sm border-0 ${platformInfo.color}`} + className={`p-1 ${buttonSize} bg-surface-active hover:bg-foreground/30 backdrop-blur-sm border-0 ${platformInfo.color}`} title={`Open ${artistName} in ${platformInfo.platform}`} >
diff --git a/src/pages/EditionView/tabs/VoteTab/SetListItem.tsx b/src/pages/EditionView/tabs/VoteTab/SetListItem.tsx index 5594e4e5..f0fe6b48 100644 --- a/src/pages/EditionView/tabs/VoteTab/SetListItem.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SetListItem.tsx @@ -7,7 +7,7 @@ import { SetActionButtons } from "./SetCard/SetActionButtons"; export function SetListItem() { return (
{/* Mobile Layout (sm and below) */} @@ -20,7 +20,7 @@ export function SetListItem() {
- +
diff --git a/src/pages/EditionView/tabs/VoteTab/SingleArtistSetCard.tsx b/src/pages/EditionView/tabs/VoteTab/SingleArtistSetCard.tsx index f7979ac5..14cdcd54 100644 --- a/src/pages/EditionView/tabs/VoteTab/SingleArtistSetCard.tsx +++ b/src/pages/EditionView/tabs/VoteTab/SingleArtistSetCard.tsx @@ -7,7 +7,7 @@ import { SetVotingButtons } from "./SetCard/SetVotingButtons"; export function SingleArtistSetCard() { return ( - + diff --git a/src/pages/EditionView/tabs/VoteTab/filters/DesktopFilters.tsx b/src/pages/EditionView/tabs/VoteTab/filters/DesktopFilters.tsx index 1acf6a2e..e2a709a2 100644 --- a/src/pages/EditionView/tabs/VoteTab/filters/DesktopFilters.tsx +++ b/src/pages/EditionView/tabs/VoteTab/filters/DesktopFilters.tsx @@ -39,10 +39,14 @@ export function DesktopFilters({ {/* Stage Filter */} {canShowStage && (
-

Stages

+

+ Stages +

{stagesLoading ? ( -
Loading stages...
+
+ Loading stages... +
) : ( stages.map((stage) => ( - - {isFestivalMode && ( - - Live - - )} -
- - - - - - -
-

- Festival Mode: Timeline view recommended for live - schedule tracking -

-

- Planning Mode: Artists list with sorting for - pre-festival planning -

-
-
-
-
- ); -} diff --git a/src/pages/EditionView/tabs/VoteTab/filters/MobileFilters.tsx b/src/pages/EditionView/tabs/VoteTab/filters/MobileFilters.tsx index 46a8dc96..31282d30 100644 --- a/src/pages/EditionView/tabs/VoteTab/filters/MobileFilters.tsx +++ b/src/pages/EditionView/tabs/VoteTab/filters/MobileFilters.tsx @@ -47,23 +47,25 @@ export function MobileFilters({ {/* Stage Filter Select */} {canShowStage && (
-

Stage

+

+ Stage +

- + - - + + All Genres {genres.map((genre) => ( {genre.name} @@ -112,7 +116,7 @@ export function MobileFilters({ {/* Rating Filter */}
-

+

Minimum Rating

- +
- +
- + {SORT_OPTIONS.map((option) => { const Icon = SORT_ICONS[option.value as keyof typeof SORT_ICONS]; return (
@@ -74,44 +74,50 @@ export function SortControls({ sort, onSortChange }: SortControlsProps) { - +
-

+

Sort Options Explained

- +
- Name (A-Z): -

+ + Name (A-Z): + +

Sort artists alphabetically from A to Z

- +
- Name (Z-A): -

+ + Name (Z-A): + +

Sort artists alphabetically from Z to A

- +
- Highest Rated: -

+ + Highest Rated: + +

Sort by weighted average rating based on votes (Must go = 2 points, Interested = 1 point, Won't go = -1 point)

@@ -119,10 +125,12 @@ export function SortControls({ sort, onSortChange }: SortControlsProps) {
- +
- Most Popular: -

+ + Most Popular: + +

Sort by weighted popularity score (Must go = 2 points, Interested = 1 point)

@@ -130,10 +138,10 @@ export function SortControls({ sort, onSortChange }: SortControlsProps) {
- +
- By Date: -

+ By Date: +

Sort by estimated performance date (earliest performances first)

diff --git a/src/pages/EditionView/tabs/VoteTab/filters/TimeFormatToggle.tsx b/src/pages/EditionView/tabs/VoteTab/filters/TimeFormatToggle.tsx deleted file mode 100644 index 916e3637..00000000 --- a/src/pages/EditionView/tabs/VoteTab/filters/TimeFormatToggle.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Clock } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@/components/ui/tooltip"; - -interface TimeFormatToggleProps { - use24Hour: boolean; - onChange: (use24Hour: boolean) => void; -} - -export function TimeFormatToggle({ - use24Hour, - onChange, -}: TimeFormatToggleProps) { - return ( - - - - - - -

Switch to {use24Hour ? "12-hour" : "24-hour"} time format

-
-
-
- ); -} diff --git a/src/pages/EditionView/tabs/VoteTab/filters/VotePerspectiveToggle.tsx b/src/pages/EditionView/tabs/VoteTab/filters/VotePerspectiveToggle.tsx index cb4ca474..8b8f493d 100644 --- a/src/pages/EditionView/tabs/VoteTab/filters/VotePerspectiveToggle.tsx +++ b/src/pages/EditionView/tabs/VoteTab/filters/VotePerspectiveToggle.tsx @@ -21,12 +21,12 @@ export function VotePerspectiveToggle({ onScopeChange(value); } }} - className="rounded-md border border-purple-400/30 p-0.5" + className="rounded-md border p-0.5" > Everyone @@ -34,7 +34,7 @@ export function VotePerspectiveToggle({ {groupName} diff --git a/src/pages/ExploreSetPage/ExplorationProgress.tsx b/src/pages/ExploreSetPage/ExplorationProgress.tsx index 90271332..264ee7f0 100644 --- a/src/pages/ExploreSetPage/ExplorationProgress.tsx +++ b/src/pages/ExploreSetPage/ExplorationProgress.tsx @@ -13,11 +13,11 @@ export function ExplorationProgress({ return (
- + {current} of {total}
- +
); diff --git a/src/pages/ExploreSetPage/SetExploreCard.tsx b/src/pages/ExploreSetPage/SetExploreCard.tsx index f09916bf..f54d6c92 100644 --- a/src/pages/ExploreSetPage/SetExploreCard.tsx +++ b/src/pages/ExploreSetPage/SetExploreCard.tsx @@ -63,7 +63,7 @@ export function SetExploreCard({ )} {/* Content */} -
+
{/* Header Info */} -

+

Swipe or tap buttons to vote

diff --git a/src/pages/ExploreSetPage/SetExploreCard/PrimaryArtistDisplay.tsx b/src/pages/ExploreSetPage/SetExploreCard/PrimaryArtistDisplay.tsx index c8a652f5..9da19732 100644 --- a/src/pages/ExploreSetPage/SetExploreCard/PrimaryArtistDisplay.tsx +++ b/src/pages/ExploreSetPage/SetExploreCard/PrimaryArtistDisplay.tsx @@ -14,7 +14,7 @@ export function PrimaryArtistDisplay({ }: PrimaryArtistDisplayProps) { return (
-
+
{artist.image_url ? ( ) : (
- +
)}
diff --git a/src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx b/src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx index e67a56b8..d0ae1d43 100644 --- a/src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx +++ b/src/pages/ExploreSetPage/SetExploreCard/SetCardHeader.tsx @@ -40,7 +40,7 @@ export function SetCardHeader({ stageId, timeStart }: SetCardHeaderProps) { {dateLabel && ( {dateLabel} diff --git a/src/pages/ExploreSetPage/SetExploreCard/SoundCloudBadge.tsx b/src/pages/ExploreSetPage/SetExploreCard/SoundCloudBadge.tsx index 9d4288ca..f0f426d7 100644 --- a/src/pages/ExploreSetPage/SetExploreCard/SoundCloudBadge.tsx +++ b/src/pages/ExploreSetPage/SetExploreCard/SoundCloudBadge.tsx @@ -29,7 +29,7 @@ export function SoundCloudBadge({ } return ( -
+
-

+

{artists.length === 1 ? "With" : "With"}

@@ -24,7 +24,7 @@ export function SupportingArtists({ artists }: SupportingArtistsProps) { {artist.name} @@ -32,7 +32,7 @@ export function SupportingArtists({ artists }: SupportingArtistsProps) { {artists.length > 3 && ( +{artists.length - 3} more diff --git a/src/pages/ExploreSetPage/VotingActions.tsx b/src/pages/ExploreSetPage/VotingActions.tsx index 833bce77..096089dc 100644 --- a/src/pages/ExploreSetPage/VotingActions.tsx +++ b/src/pages/ExploreSetPage/VotingActions.tsx @@ -46,8 +46,8 @@ export function VotingActions({ variant="outline" className={`h-16 w-16 rounded-full transition-all duration-100 ${ isLeftDrag - ? `bg-gray-500 border-gray-500 text-white shadow-lg` - : "border-gray-500 hover:bg-gray-500 hover:border-gray-500 text-gray-500 hover:text-white" + ? `bg-vote-skip border-vote-skip text-foreground shadow-lg` + : "border-vote-skip hover:bg-vote-skip hover:border-vote-skip text-vote-skip hover:text-foreground" }`} onClick={() => onVote(wontGoConfig.value)} > @@ -59,7 +59,7 @@ export function VotingActions({ @@ -39,24 +39,28 @@ export function ProgressInfoTooltip({

Progress Details

- Already voted: + + Already voted: + {votedCount}
- Skipped: + Skipped: {skippedCount}
- No SoundCloud: + + No SoundCloud: + {nonExplorableCount}
-
+
- Current: + Current: {current}
- Total: + Total: {total}
diff --git a/src/pages/SetDetails/IndividualArtistCard.tsx b/src/pages/SetDetails/IndividualArtistCard.tsx index 7b9c7d84..d2d5f815 100644 --- a/src/pages/SetDetails/IndividualArtistCard.tsx +++ b/src/pages/SetDetails/IndividualArtistCard.tsx @@ -17,7 +17,7 @@ export function IndividualArtistCard({ showFullDetails = false, }: IndividualArtistCardProps) { return ( - + {/* Artist Image */}
- + {artist.name} @@ -48,7 +48,7 @@ export function IndividualArtistCard({ artist.artist_music_genres.length > 2 && ( +{artist.artist_music_genres.length - 2} @@ -62,7 +62,7 @@ export function IndividualArtistCard({
)} diff --git a/src/pages/SetDetails/MixedArtistImage.tsx b/src/pages/SetDetails/MixedArtistImage.tsx index 01117f73..2fa8d014 100644 --- a/src/pages/SetDetails/MixedArtistImage.tsx +++ b/src/pages/SetDetails/MixedArtistImage.tsx @@ -20,7 +20,7 @@ export function MixedArtistImage({
-
+
🎵
{/*
{setName}
*/}
@@ -128,7 +128,7 @@ export function MixedArtistImage({ {/* Show count overlay on last image if more than 4 */} {index === 3 && artistsWithImages.length > 4 && (
-
+
+{artistsWithImages.length - 4}
diff --git a/src/pages/SetDetails/MultiArtistSetInfoCard.tsx b/src/pages/SetDetails/MultiArtistSetInfoCard.tsx index 200fccfb..238e3df3 100644 --- a/src/pages/SetDetails/MultiArtistSetInfoCard.tsx +++ b/src/pages/SetDetails/MultiArtistSetInfoCard.tsx @@ -57,19 +57,19 @@ export function MultiArtistSetInfoCard({ return (
{/* Main Set Info Card */} - +
- + {set.name} {/* Set Summary */}
- - + + {set.artists.length} Artists
@@ -99,7 +99,7 @@ export function MultiArtistSetInfoCard({
{/* Performance Information */} -
+
{canShowStage && } {timeRangeFormatted && (
@@ -120,7 +120,7 @@ export function MultiArtistSetInfoCard({
{set.description && ( - + -

+

Artists in this Set

diff --git a/src/pages/SetDetails/SetGroupVoting.tsx b/src/pages/SetDetails/SetGroupVoting.tsx index fa2b48d3..7429b130 100644 --- a/src/pages/SetDetails/SetGroupVoting.tsx +++ b/src/pages/SetDetails/SetGroupVoting.tsx @@ -54,25 +54,25 @@ function SetGroupVotingContent({ const activeGroup = groups.find((g) => g.id === activeGroupId); return ( - + - + Group Voting {activeGroup && ( -

+

How {activeGroup.name} voted on this artist

)}
{loading ? ( -
+
Loading votes...
) : groupVotes.length === 0 ? ( -
+
No one in this group has voted on this artist yet.
) : ( @@ -110,7 +110,7 @@ function SetGroupVotingContent({ {/* Individual Votes */}
-

+

Individual Votes:

{groupVotes.map((vote) => { @@ -119,9 +119,9 @@ function SetGroupVotingContent({ return (
- + {vote.username || "Unknown User"} - + - +
- + {set.name}
@@ -78,7 +78,7 @@ export function SetInfoCard({
{/* Performance Information */} -
+
{canShowStage && } {timeRangeFormatted && (
@@ -99,7 +99,7 @@ export function SetInfoCard({
{(set.description || artist.description) && ( - + + - + Group Notes - + Sign in to add notes and see notes from group members @@ -40,15 +40,15 @@ export function SetNotes({ setId, userId }: SetNotesProps) { } return ( - +
- + Group Notes - + Notes from you and group members about this artist
@@ -77,10 +77,10 @@ export function SetNotes({ setId, userId }: SetNotesProps) {
)} -
+
)}
-
+
{note.note_content}
-
- {new Date(note.updated_at).toLocaleDateString()} +
+ {formatDateOnly(note.updated_at)}
); diff --git a/tailwind.config.ts b/tailwind.config.ts index a6448ada..507f4bf8 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -84,6 +84,7 @@ export default { foreground: "hsl(var(--accent-foreground))", hover: "hsl(var(--accent-hover))", soft: "hsl(var(--accent-soft))", + "soft-foreground": "hsl(var(--accent-soft-foreground))", }, popover: { DEFAULT: "hsl(var(--popover))",