diff --git a/app/app.css b/app/app.css
index ef68fea..eb30487 100644
--- a/app/app.css
+++ b/app/app.css
@@ -8,15 +8,6 @@
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
-html,
-body {
- @apply bg-white dark:bg-gray-950;
-
- @media (prefers-color-scheme: dark) {
- color-scheme: dark;
- }
-}
-
@theme inline {
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
@@ -53,75 +44,51 @@ body {
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
+ --color-electric: var(--electric);
+ --color-amber-accent: var(--amber-accent);
+ --color-coral-accent: var(--coral-accent);
+}
+
+html {
+ color-scheme: dark;
}
:root {
--radius: 0.625rem;
- --background: oklch(1 0 0);
- --foreground: oklch(0.141 0.005 285.823);
- --card: oklch(1 0 0);
- --card-foreground: oklch(0.141 0.005 285.823);
- --popover: oklch(1 0 0);
- --popover-foreground: oklch(0.141 0.005 285.823);
- --primary: oklch(0.21 0.006 285.885);
+ --background: oklch(0.13 0.015 255);
+ --foreground: oklch(0.95 0.01 255);
+ --card: oklch(0.18 0.02 255);
+ --card-foreground: oklch(0.95 0.01 255);
+ --popover: oklch(0.18 0.02 255);
+ --popover-foreground: oklch(0.95 0.01 255);
+ --primary: oklch(0.623 0.214 259.815);
--primary-foreground: oklch(0.985 0 0);
- --secondary: oklch(0.967 0.001 286.375);
- --secondary-foreground: oklch(0.21 0.006 285.885);
- --muted: oklch(0.967 0.001 286.375);
- --muted-foreground: oklch(0.552 0.016 285.938);
- --accent: oklch(0.967 0.001 286.375);
- --accent-foreground: oklch(0.21 0.006 285.885);
- --destructive: oklch(0.577 0.245 27.325);
- --border: oklch(0.92 0.004 286.32);
- --input: oklch(0.92 0.004 286.32);
- --ring: oklch(0.705 0.015 286.067);
+ --secondary: oklch(0.22 0.025 255);
+ --secondary-foreground: oklch(0.95 0.01 255);
+ --muted: oklch(0.22 0.025 255);
+ --muted-foreground: oklch(0.65 0.02 255);
+ --accent: oklch(0.25 0.03 255);
+ --accent-foreground: oklch(0.95 0.01 255);
+ --destructive: oklch(0.65 0.22 25);
+ --border: oklch(1 0 0 / 8%);
+ --input: oklch(1 0 0 / 12%);
+ --ring: oklch(0.623 0.214 259.815 / 50%);
--chart-1: oklch(0.646 0.222 41.116);
--chart-2: oklch(0.6 0.118 184.704);
--chart-3: oklch(0.398 0.07 227.392);
--chart-4: oklch(0.828 0.189 84.429);
--chart-5: oklch(0.769 0.188 70.08);
- --sidebar: oklch(0.985 0 0);
- --sidebar-foreground: oklch(0.141 0.005 285.823);
- --sidebar-primary: oklch(0.21 0.006 285.885);
+ --sidebar: oklch(0.18 0.02 255);
+ --sidebar-foreground: oklch(0.95 0.01 255);
+ --sidebar-primary: oklch(0.623 0.214 259.815);
--sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.967 0.001 286.375);
- --sidebar-accent-foreground: oklch(0.21 0.006 285.885);
- --sidebar-border: oklch(0.92 0.004 286.32);
- --sidebar-ring: oklch(0.705 0.015 286.067);
-}
-
-.dark {
- --background: oklch(0.141 0.005 285.823);
- --foreground: oklch(0.985 0 0);
- --card: oklch(0.21 0.006 285.885);
- --card-foreground: oklch(0.985 0 0);
- --popover: oklch(0.21 0.006 285.885);
- --popover-foreground: oklch(0.985 0 0);
- --primary: oklch(0.92 0.004 286.32);
- --primary-foreground: oklch(0.21 0.006 285.885);
- --secondary: oklch(0.274 0.006 286.033);
- --secondary-foreground: oklch(0.985 0 0);
- --muted: oklch(0.274 0.006 286.033);
- --muted-foreground: oklch(0.705 0.015 286.067);
- --accent: oklch(0.274 0.006 286.033);
- --accent-foreground: oklch(0.985 0 0);
- --destructive: oklch(0.704 0.191 22.216);
- --border: oklch(1 0 0 / 10%);
- --input: oklch(1 0 0 / 15%);
- --ring: oklch(0.552 0.016 285.938);
- --chart-1: oklch(0.488 0.243 264.376);
- --chart-2: oklch(0.696 0.17 162.48);
- --chart-3: oklch(0.769 0.188 70.08);
- --chart-4: oklch(0.627 0.265 303.9);
- --chart-5: oklch(0.645 0.246 16.439);
- --sidebar: oklch(0.21 0.006 285.885);
- --sidebar-foreground: oklch(0.985 0 0);
- --sidebar-primary: oklch(0.488 0.243 264.376);
- --sidebar-primary-foreground: oklch(0.985 0 0);
- --sidebar-accent: oklch(0.274 0.006 286.033);
- --sidebar-accent-foreground: oklch(0.985 0 0);
- --sidebar-border: oklch(1 0 0 / 10%);
- --sidebar-ring: oklch(0.552 0.016 285.938);
+ --sidebar-accent: oklch(0.25 0.03 255);
+ --sidebar-accent-foreground: oklch(0.95 0.01 255);
+ --sidebar-border: oklch(1 0 0 / 8%);
+ --sidebar-ring: oklch(0.623 0.214 259.815 / 50%);
+ --electric: oklch(0.623 0.214 259.815);
+ --amber-accent: oklch(0.79 0.17 70);
+ --coral-accent: oklch(0.68 0.19 35);
}
@layer base {
diff --git a/app/components/DraftGrid.tsx b/app/components/DraftGrid.tsx
index 418ad9f..bf98a3c 100644
--- a/app/components/DraftGrid.tsx
+++ b/app/components/DraftGrid.tsx
@@ -66,10 +66,10 @@ export function DraftGrid({
teamTime === undefined
? "text-muted-foreground"
: teamTime > 60
- ? "text-green-600"
+ ? "text-emerald-400"
: teamTime > 30
- ? "text-yellow-600"
- : "text-red-600"
+ ? "text-amber-accent"
+ : "text-coral-accent"
}`}
>
{formatTime(teamTime)}
@@ -107,10 +107,10 @@ export function DraftGrid({
@@ -127,7 +127,7 @@ export function DraftGrid({
) : isCurrent ? (
-
+
On Clock
) : null}
diff --git a/app/components/StandingsTable.tsx b/app/components/StandingsTable.tsx
index c15ebb5..4867c24 100644
--- a/app/components/StandingsTable.tsx
+++ b/app/components/StandingsTable.tsx
@@ -44,14 +44,14 @@ export function StandingsTable({
if (change > 0) {
return (
-
+
+{change}
);
} else if (change < 0) {
return (
-
+
{change}
diff --git a/app/components/__tests__/DraftGrid.test.tsx b/app/components/__tests__/DraftGrid.test.tsx
index f8206df..97d64ac 100644
--- a/app/components/__tests__/DraftGrid.test.tsx
+++ b/app/components/__tests__/DraftGrid.test.tsx
@@ -82,8 +82,8 @@ describe('DraftGrid Component', () => {
);
const currentPickCell = screen.getByText('On Clock').parentElement;
- expect(currentPickCell).toHaveClass('border-blue-500');
- expect(currentPickCell).toHaveClass('bg-blue-50');
+ expect(currentPickCell).toHaveClass('border-electric');
+ expect(currentPickCell).toHaveClass('bg-electric/15');
});
});
diff --git a/app/components/draft/AvailableParticipantsSection.tsx b/app/components/draft/AvailableParticipantsSection.tsx
index e877be2..65ef28e 100644
--- a/app/components/draft/AvailableParticipantsSection.tsx
+++ b/app/components/draft/AvailableParticipantsSection.tsx
@@ -152,7 +152,7 @@ export function AvailableParticipantsSection({
isDrafted
? "bg-muted/50 opacity-60"
: !isEligible
- ? "bg-red-50/30 dark:bg-red-950/20 opacity-75"
+ ? "bg-destructive/10 opacity-75"
: "hover:bg-muted/50"
}`}
title={
diff --git a/app/components/draft/ConnectionOverlay.tsx b/app/components/draft/ConnectionOverlay.tsx
index 044d34b..db34a8b 100644
--- a/app/components/draft/ConnectionOverlay.tsx
+++ b/app/components/draft/ConnectionOverlay.tsx
@@ -23,9 +23,9 @@ export function ConnectionOverlay({
{/* Spinner or Error Icon */}
{connectionError ? (
-
+
{
if (seconds === null) return "text-muted-foreground";
- if (seconds > 60) return "text-green-600 dark:text-green-400";
- if (seconds > 30) return "text-yellow-600 dark:text-yellow-400";
- if (seconds > 10) return "text-red-600 dark:text-red-400";
- return "text-red-600 dark:text-red-400 animate-pulse";
+ if (seconds > 60) return "text-emerald-400";
+ if (seconds > 30) return "text-amber-accent";
+ if (seconds > 10) return "text-coral-accent";
+ return "text-coral-accent animate-pulse";
};
return (
@@ -126,10 +126,10 @@ export function DraftGridSection({
@@ -147,7 +147,7 @@ export function DraftGridSection({
) : isCurrent ? (
-
+
On Clock
) : null}
@@ -178,10 +178,10 @@ export function DraftGridSection({
key={cell.pickNumber}
className={`flex-1 min-w-32 h-20 border-2 rounded-lg p-2 transition-all ${
isCurrent
- ? "border-blue-500 bg-blue-50 dark:bg-blue-950 shadow-lg"
+ ? "border-electric bg-electric/15 shadow-lg shadow-electric/10"
: isPicked
- ? "border-green-500 bg-green-50 dark:bg-green-950"
- : "border-gray-300 bg-white dark:bg-gray-900"
+ ? "bg-emerald-500/10 border-emerald-500/30"
+ : "border-border bg-card"
}`}
title={`Overall Pick #${cell.pickNumber}`}
>
@@ -199,7 +199,7 @@ export function DraftGridSection({
) : isCurrent ? (
-
+
On Clock
) : null}
diff --git a/app/components/scoring/QualifyingPointsStandings.tsx b/app/components/scoring/QualifyingPointsStandings.tsx
index 0b9b636..89c03d1 100644
--- a/app/components/scoring/QualifyingPointsStandings.tsx
+++ b/app/components/scoring/QualifyingPointsStandings.tsx
@@ -103,15 +103,15 @@ export function QualifyingPointsStandings({
}
return (
-
+
-
+
Qualifying Points Standings
{isFinalized ? (
-
+
Finalized - Fantasy points have been assigned
@@ -185,7 +185,7 @@ export function QualifyingPointsStandings({
{standing.participant.name}
-
+
{parseFloat(standing.totalQualifyingPoints).toFixed(2)} QP
@@ -195,7 +195,7 @@ export function QualifyingPointsStandings({
{scoringRules && !isFinalized && (
{isTop8 ? (
-
+
{projectedPoints} pts
) : (
diff --git a/app/components/scoring/ScoringRulesEditor.tsx b/app/components/scoring/ScoringRulesEditor.tsx
index 6299288..f45d676 100644
--- a/app/components/scoring/ScoringRulesEditor.tsx
+++ b/app/components/scoring/ScoringRulesEditor.tsx
@@ -74,8 +74,8 @@ export function ScoringRulesEditor({ scoringRules, disabled = false }: ScoringRu
))}
-
-
+
+
💡 Tip: The default scoring rewards winning heavily (100 pts for 1st)
but also values consistency (25 pts for 5th/6th). Customize these values to fit your
league's strategy preferences.
diff --git a/app/components/scoring/SeasonStandings.tsx b/app/components/scoring/SeasonStandings.tsx
index 9feeea0..f8bdb0c 100644
--- a/app/components/scoring/SeasonStandings.tsx
+++ b/app/components/scoring/SeasonStandings.tsx
@@ -109,14 +109,14 @@ export function SeasonStandings({
if (change > 0) {
return (
-
+
+{change}
);
} else if (change < 0) {
return (
-
+
{change}
@@ -186,16 +186,16 @@ export function SeasonStandings({
@@ -203,7 +203,7 @@ export function SeasonStandings({
{isFinalized ? (
-
+
Season complete - Fantasy points assigned to top 8 finishers
@@ -281,7 +281,7 @@ export function SeasonStandings({
diff --git a/app/components/sports/SportSeasonCard.tsx b/app/components/sports/SportSeasonCard.tsx
index 061dcf8..67a7397 100644
--- a/app/components/sports/SportSeasonCard.tsx
+++ b/app/components/sports/SportSeasonCard.tsx
@@ -30,21 +30,21 @@ export function SportSeasonCard({
switch (status) {
case "upcoming":
return (
-
+
Upcoming
);
case "active":
return (
-
+
Active
);
case "completed":
return (
-
+
Completed
diff --git a/app/components/standings/StandingsTable.tsx b/app/components/standings/StandingsTable.tsx
index 207c4ce..dd4b502 100644
--- a/app/components/standings/StandingsTable.tsx
+++ b/app/components/standings/StandingsTable.tsx
@@ -112,7 +112,7 @@ export function StandingsTable({
function RankBadge({ rank }: { rank: number }) {
if (rank === 1) {
return (
-
+
🏆 1st
);
@@ -120,7 +120,7 @@ function RankBadge({ rank }: { rank: number }) {
if (rank === 2) {
return (
-
+
🥈 2nd
);
@@ -128,7 +128,7 @@ function RankBadge({ rank }: { rank: number }) {
if (rank === 3) {
return (
-
+
🥉 3rd
);
@@ -147,7 +147,7 @@ function RankBadge({ rank }: { rank: number }) {
function MovementIndicator({ change }: { change: number }) {
if (change > 0) {
return (
-
+
↑{change}
);
@@ -155,7 +155,7 @@ function MovementIndicator({ change }: { change: number }) {
if (change < 0) {
return (
-
+
↓{Math.abs(change)}
);
@@ -182,14 +182,14 @@ function PlacementBreakdown({
};
}) {
const items = [
- { label: "1st", count: placements.first, color: "text-yellow-600" },
- { label: "2nd", count: placements.second, color: "text-gray-500" },
- { label: "3rd", count: placements.third, color: "text-orange-600" },
- { label: "4th", count: placements.fourth, color: "text-blue-600" },
- { label: "5th", count: placements.fifth, color: "text-purple-600" },
- { label: "6th", count: placements.sixth, color: "text-green-600" },
- { label: "7th", count: placements.seventh, color: "text-pink-600" },
- { label: "8th", count: placements.eighth, color: "text-indigo-600" },
+ { label: "1st", count: placements.first, color: "text-amber-accent" },
+ { label: "2nd", count: placements.second, color: "text-muted-foreground" },
+ { label: "3rd", count: placements.third, color: "text-coral-accent" },
+ { label: "4th", count: placements.fourth, color: "text-electric" },
+ { label: "5th", count: placements.fifth, color: "text-purple-400" },
+ { label: "6th", count: placements.sixth, color: "text-emerald-400" },
+ { label: "7th", count: placements.seventh, color: "text-pink-400" },
+ { label: "8th", count: placements.eighth, color: "text-indigo-400" },
];
// Only show placements that have counts > 0
diff --git a/app/components/standings/TeamScoreBreakdown.tsx b/app/components/standings/TeamScoreBreakdown.tsx
index 8f78521..c99bece 100644
--- a/app/components/standings/TeamScoreBreakdown.tsx
+++ b/app/components/standings/TeamScoreBreakdown.tsx
@@ -99,7 +99,7 @@ export function TeamScoreBreakdown({
Actual Points
{breakdown.projectedPoints > breakdown.actualPoints && (
-
+
{breakdown.projectedPoints.toFixed(1)}
projected
@@ -174,19 +174,19 @@ export function TeamScoreBreakdown({
{standing.placementCounts.first > 0 && (
- 1st place
+ 1st place
{standing.placementCounts.first}
)}
{standing.placementCounts.second > 0 && (
- 2nd place
+ 2nd place
{standing.placementCounts.second}
)}
{standing.placementCounts.third > 0 && (
- 3rd place
+ 3rd place
{standing.placementCounts.third}
)}
@@ -278,7 +278,7 @@ export function TeamScoreBreakdown({
{pick.isComplete ? (
pick.finalPosition === 0 ? (
-
+
Did Not Score
) : (
@@ -330,14 +330,14 @@ export function TeamScoreBreakdown({
*/
function PlacementBadge({ position }: { position: number }) {
const badges: Record = {
- 1: { label: "1st", className: "bg-yellow-500 hover:bg-yellow-600 text-white" },
- 2: { label: "2nd", className: "bg-gray-400 hover:bg-gray-500 text-white" },
- 3: { label: "3rd", className: "bg-orange-600 hover:bg-orange-700 text-white" },
- 4: { label: "4th", className: "bg-blue-600 hover:bg-blue-700 text-white" },
- 5: { label: "5th", className: "bg-purple-600 hover:bg-purple-700 text-white" },
- 6: { label: "6th", className: "bg-green-600 hover:bg-green-700 text-white" },
- 7: { label: "7th", className: "bg-pink-600 hover:bg-pink-700 text-white" },
- 8: { label: "8th", className: "bg-indigo-600 hover:bg-indigo-700 text-white" },
+ 1: { label: "1st", className: "bg-amber-accent hover:bg-amber-accent/80 text-background" },
+ 2: { label: "2nd", className: "bg-muted hover:bg-muted/80 text-muted-foreground" },
+ 3: { label: "3rd", className: "bg-coral-accent hover:bg-coral-accent/80 text-background" },
+ 4: { label: "4th", className: "bg-electric/20 hover:bg-electric/30 text-electric" },
+ 5: { label: "5th", className: "bg-purple-500/20 hover:bg-purple-500/30 text-purple-400" },
+ 6: { label: "6th", className: "bg-emerald-500/20 hover:bg-emerald-500/30 text-emerald-400" },
+ 7: { label: "7th", className: "bg-pink-500/20 hover:bg-pink-500/30 text-pink-400" },
+ 8: { label: "8th", className: "bg-indigo-500/20 hover:bg-indigo-500/30 text-indigo-400" },
};
const badge = badges[position] || { label: `${position}th`, className: "" };
diff --git a/app/root.tsx b/app/root.tsx
index 085eb15..4c430d6 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -13,6 +13,7 @@ import "./app.css";
import { clerkMiddleware, rootAuthLoader, getAuth } from "@clerk/react-router/server";
import { Navbar } from "~/components/navbar";
import { ClerkProvider } from "@clerk/react-router";
+import { dark } from "@clerk/themes";
import { Toaster } from "~/components/ui/sonner";
import { isUserAdminByClerkId } from "~/models/user";
@@ -46,7 +47,7 @@ export const links: Route.LinksFunction = () => [
export function Layout({ children }: { children: React.ReactNode }) {
return (
-
+
@@ -67,7 +68,7 @@ export default function App({ loaderData }: Route.ComponentProps) {
const isDraftRoute = location.pathname.includes('/draft');
return (
-
+
{!isDraftRoute && }
{isDraftRoute ? (
diff --git a/app/routes/admin.data-sync.tsx b/app/routes/admin.data-sync.tsx
index 30501ff..890d7a4 100644
--- a/app/routes/admin.data-sync.tsx
+++ b/app/routes/admin.data-sync.tsx
@@ -168,7 +168,7 @@ export default function DataSync({ loaderData, actionData }: Route.ComponentProp
{actionData?.success && (
-
+
{actionData.message || "Operation completed successfully!"}
)}
@@ -342,11 +342,11 @@ export default function DataSync({ loaderData, actionData }: Route.ComponentProp
-
+
- How It Works
+ How It Works
-
+
Export: Downloads all sports data as a JSON file that you can
save, version control, or transfer to another environment.
@@ -359,7 +359,7 @@ export default function DataSync({ loaderData, actionData }: Route.ComponentProp
Import (Replace): Deletes all existing sports data and recreates
it from the file. Use this for a clean slate.
-
+
Typical workflow:
Export data from development
diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.tsx b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.tsx
index 4d178c1..5d558d5 100644
--- a/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.tsx
+++ b/app/routes/admin.sports-seasons.$id.events.$eventId.bracket.tsx
@@ -228,7 +228,7 @@ export default function EventBracket({
)}
{actionData?.success && (
-
+
{actionData.success}
)}
@@ -702,10 +702,10 @@ export default function EventBracket({
{/* Finalize Bracket Button */}
{allMatchesComplete && !event.isComplete && (
-
+
-
+
Finalize Bracket
@@ -726,7 +726,7 @@ export default function EventBracket({
Recalculate all team standings
-
+
Finalize Bracket & Update Standings
@@ -739,9 +739,9 @@ export default function EventBracket({
{/* Event Complete Badge */}
{event.isComplete && (
-
+
-
+
Event Complete
diff --git a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
index 3fb9ae2..eee6a44 100644
--- a/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
+++ b/app/routes/admin.sports-seasons.$id.events.$eventId.tsx
@@ -101,7 +101,7 @@ export default function EventResults({
)}
{event.isComplete ? (
-
+
Completed
@@ -120,9 +120,9 @@ export default function EventResults({
{/* Debug info and manual QP processing for completed major tournaments */}
{event.isComplete && event.eventType === "major_tournament" && (
-
+
-
+
Event Processing Status
@@ -169,7 +169,7 @@ export default function EventResults({
)}
{actionData?.success && (
-
+
{actionData.success}
)}
@@ -240,9 +240,9 @@ export default function EventResults({
{/* Complete Season Button */}
-
+
-
+
Finalize Season
@@ -489,13 +489,13 @@ export default function EventResults({
{/* Bracket Explanation Card for Playoff Events */}
{event.eventType === "playoff_game" && !participantResults?.length && (
-
+
-
+
Bracket Event
-
+
This is a bracket/playoff event. Results are managed through the bracket interface.
@@ -522,11 +522,11 @@ export default function EventResults({
{/* Participant Results with Fantasy Points */}
{participantResults && participantResults.length > 0 && (
-
+
-
+
{event.eventType === "playoff_game" ? (
<>
@@ -544,7 +544,7 @@ export default function EventResults({
{event.eventType === "playoff_game" && event.isComplete && (
-
+
Bracket Finalized
@@ -600,7 +600,7 @@ export default function EventResults({
{result.participant.name}
{result.qualifyingPoints ? (
-
+
{parseFloat(result.qualifyingPoints).toFixed(2)} pts
) : (
diff --git a/app/routes/admin.sports-seasons.$id.events.tsx b/app/routes/admin.sports-seasons.$id.events.tsx
index f7ecf34..fa70cb9 100644
--- a/app/routes/admin.sports-seasons.$id.events.tsx
+++ b/app/routes/admin.sports-seasons.$id.events.tsx
@@ -46,7 +46,7 @@ export default function SportsSeasonEvents({
const getStatusBadge = (isComplete: boolean) => {
return isComplete ? (
-
+
Completed
) : (
@@ -86,7 +86,7 @@ export default function SportsSeasonEvents({
)}
{actionData?.success && (
-
+
{actionData.success}
)}
diff --git a/app/routes/admin.sports-seasons.$id.expected-values.tsx b/app/routes/admin.sports-seasons.$id.expected-values.tsx
index 5358883..5036128 100644
--- a/app/routes/admin.sports-seasons.$id.expected-values.tsx
+++ b/app/routes/admin.sports-seasons.$id.expected-values.tsx
@@ -53,17 +53,17 @@ export default function ExpectedValuesPage({ loaderData, actionData }: Route.Com
{actionData?.error && (
-
+
{actionData.error}
)}
{actionData?.success && (
-
+
All participants saved successfully!
)}
-
+
Default Scoring Rules (for EV calculation):
1st: 100 pts
@@ -75,7 +75,7 @@ export default function ExpectedValuesPage({ loaderData, actionData }: Route.Com
7th: 15 pts
8th: 15 pts
-
+
Note: EVs will be recalculated with actual league scoring rules when used in fantasy leagues.
@@ -209,7 +209,7 @@ export default function ExpectedValuesPage({ loaderData, actionData }: Route.Com
{participants.length === 0 ? (
-
+
No participants found. Please add participants to this sports season first.
) : (
diff --git a/app/routes/admin.sports-seasons.$id.futures-odds.tsx b/app/routes/admin.sports-seasons.$id.futures-odds.tsx
index f3bef04..d68f5fc 100644
--- a/app/routes/admin.sports-seasons.$id.futures-odds.tsx
+++ b/app/routes/admin.sports-seasons.$id.futures-odds.tsx
@@ -308,11 +308,11 @@ export default function AdminSportsSeasonFuturesOdds() {
{parseResults.matched.length > 0 && (
-
+
Matched ({parseResults.matched.length})
-
+
{parseResults.matched.map(m => (
{m.inputName}
@@ -538,9 +538,9 @@ export default function AdminSportsSeasonFuturesOdds() {
)}
{actionData && actionData.success && !actionData.preview && (
-
+
- Success
+ Success
{actionData.message}
diff --git a/app/routes/admin.sports-seasons.$id.participants.tsx b/app/routes/admin.sports-seasons.$id.participants.tsx
index 0b3c665..835e930 100644
--- a/app/routes/admin.sports-seasons.$id.participants.tsx
+++ b/app/routes/admin.sports-seasons.$id.participants.tsx
@@ -163,7 +163,7 @@ export default function ManageParticipants({ loaderData, actionData }: Route.Com
)}
{actionData?.success && !actionData?.count && (
-
+
Participant added successfully!
)}
@@ -209,7 +209,7 @@ export default function ManageParticipants({ loaderData, actionData }: Route.Com
)}
{actionData?.success && actionData?.count && (
-
+
{actionData.count} participant{actionData.count !== 1 ? 's' : ''} added successfully!
)}
diff --git a/app/routes/admin.sports-seasons.$id.recalculate-probabilities.tsx b/app/routes/admin.sports-seasons.$id.recalculate-probabilities.tsx
index 496863d..496cb87 100644
--- a/app/routes/admin.sports-seasons.$id.recalculate-probabilities.tsx
+++ b/app/routes/admin.sports-seasons.$id.recalculate-probabilities.tsx
@@ -149,11 +149,11 @@ export default function RecalculateProbabilities() {
{invalidProbabilities.length > 0 && (
-
+
-
-
+
+
Invalid Probability Data Detected
@@ -192,11 +192,11 @@ export default function RecalculateProbabilities() {
)}
{actionData?.success ? (
-
+
-
-
+
+
Probabilities Updated Successfully
@@ -371,7 +371,7 @@ export default function RecalculateProbabilities() {
value="true"
/>
-
+
What happens:
diff --git a/app/routes/admin.sports-seasons.$id.tsx b/app/routes/admin.sports-seasons.$id.tsx
index 1821100..9d24ef5 100644
--- a/app/routes/admin.sports-seasons.$id.tsx
+++ b/app/routes/admin.sports-seasons.$id.tsx
@@ -270,7 +270,7 @@ export default function EditSportsSeason({ loaderData, actionData }: Route.Compo
)}
{actionData?.success && (
-
+
Sports season updated successfully!
)}
diff --git a/app/routes/admin.standings-snapshots.tsx b/app/routes/admin.standings-snapshots.tsx
index cc4f8e6..527aaa7 100644
--- a/app/routes/admin.standings-snapshots.tsx
+++ b/app/routes/admin.standings-snapshots.tsx
@@ -131,19 +131,19 @@ export default function AdminStandingsSnapshots({
{actionData.success ? (
-
+
) : (
-
+
)}
{actionData.message}
@@ -258,7 +258,7 @@ export default function AdminStandingsSnapshots({
{hasSnapshotToday && (
Today
diff --git a/app/routes/admin.templates.$id.tsx b/app/routes/admin.templates.$id.tsx
index 22ef175..d331f88 100644
--- a/app/routes/admin.templates.$id.tsx
+++ b/app/routes/admin.templates.$id.tsx
@@ -211,7 +211,7 @@ export default function EditTemplate({ loaderData, actionData }: Route.Component
)}
{actionData?.success && (
-
+
Template updated successfully!
)}
diff --git a/app/routes/admin.templates.new.tsx b/app/routes/admin.templates.new.tsx
index acdbcee..177ba48 100644
--- a/app/routes/admin.templates.new.tsx
+++ b/app/routes/admin.templates.new.tsx
@@ -125,11 +125,11 @@ export default function NewTemplate({ actionData }: Route.ComponentProps) {
-
+
- Next Steps
+ Next Steps
-
+
After creating the template, you'll be able to:
Add sports seasons to the template
diff --git a/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx b/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx
index 490f8f3..4bc4c84 100644
--- a/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx
+++ b/app/routes/leagues/$leagueId.draft-board.$seasonId.tsx
@@ -161,7 +161,7 @@ export default function DraftBoard() {
diff --git a/app/routes/leagues/$leagueId.draft.$seasonId.tsx b/app/routes/leagues/$leagueId.draft.$seasonId.tsx
index 76c0ffc..5888e28 100644
--- a/app/routes/leagues/$leagueId.draft.$seasonId.tsx
+++ b/app/routes/leagues/$leagueId.draft.$seasonId.tsx
@@ -758,14 +758,14 @@ export default function DraftRoom() {
{/* Draft Completion Banner */}
{isDraftComplete && (
-
+
🎉 Draft Complete! The season is now active.
{season.league.isPublicDraftBoard && (
<>
{" "}
View Draft Board
@@ -841,7 +841,7 @@ export default function DraftRoom() {
@@ -1029,7 +1029,7 @@ export default function DraftRoom() {
className={`border-t ${
isEligible
? "hover:bg-muted/50"
- : "bg-red-50/30 dark:bg-red-950/20 opacity-60"
+ : "bg-destructive/10 opacity-60"
}`}
title={!isEligible ? ineligibleReason : undefined}
>
diff --git a/app/routes/leagues/$leagueId.settings.tsx b/app/routes/leagues/$leagueId.settings.tsx
index d7ebfbb..f77db8d 100644
--- a/app/routes/leagues/$leagueId.settings.tsx
+++ b/app/routes/leagues/$leagueId.settings.tsx
@@ -660,7 +660,7 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone
id="isPublicDraftBoard"
name="isPublicDraftBoard"
defaultChecked={league.isPublicDraftBoard}
- className="h-4 w-4 rounded border-gray-300"
+ className="h-4 w-4 rounded border-border"
/>
Make draft board publicly accessible (no login required)
@@ -919,7 +919,7 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone
)}
{actionData?.success && (
-
+
Settings updated successfully!
)}
@@ -1005,7 +1005,7 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone
)}
{actionData?.success && actionData?.message && (
-
+
{actionData.message}
)}
@@ -1135,7 +1135,7 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone
)}
{actionData?.success && actionData?.message && (
-
+
{actionData.message}
)}
diff --git a/app/routes/leagues/$leagueId.tsx b/app/routes/leagues/$leagueId.tsx
index 17fe447..0de83b9 100644
--- a/app/routes/leagues/$leagueId.tsx
+++ b/app/routes/leagues/$leagueId.tsx
@@ -326,7 +326,7 @@ export default function LeagueHome({ loaderData }: Route.ComponentProps) {
Draft Board
View Draft Board
@@ -335,7 +335,7 @@ export default function LeagueHome({ loaderData }: Route.ComponentProps) {
Standings
View Standings
diff --git a/app/routes/test-socket.tsx b/app/routes/test-socket.tsx
index 446ac21..b91c9a3 100644
--- a/app/routes/test-socket.tsx
+++ b/app/routes/test-socket.tsx
@@ -37,7 +37,7 @@ export default function TestSocket() {
@@ -45,7 +45,7 @@ export default function TestSocket() {
{socket && (
-
+
Socket ID: {socket.id}
)}
@@ -54,20 +54,20 @@ export default function TestSocket() {
Send Test Message
Messages:
-
+
{messages.length === 0 ? (
-
No messages yet...
+
No messages yet...
) : (
{messages.map((msg, idx) => (
-
+
{msg}
))}
@@ -76,7 +76,7 @@ export default function TestSocket() {
-
+
Instructions:
Check that the status shows "Connected"
diff --git a/app/welcome/welcome.tsx b/app/welcome/welcome.tsx
index 95e319e..c4ed75d 100644
--- a/app/welcome/welcome.tsx
+++ b/app/welcome/welcome.tsx
@@ -2,7 +2,6 @@ import { Link } from "react-router";
import { Button } from "~/components/ui/button";
import logoDark from "./logo-dark.svg";
-import logoLight from "./logo-light.svg";
export function Welcome({ message }: { message: string }) {
return (
@@ -11,15 +10,10 @@ export function Welcome({ message }: { message: string }) {
{message}
-
@@ -29,15 +23,15 @@ export function Welcome({ message }: { message: string }) {
Start a League
-
-
+
+
What's next?
{resources.map(({ href, text, icon }) => (
=18.17.0"
},
"peerDependencies": {
- "react": "^18.0.0 || ^19.0.0 || ^19.0.0-0",
- "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-0"
+ "react": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0",
+ "react-dom": "^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0"
},
"peerDependenciesMeta": {
"react": {
@@ -796,6 +797,19 @@
}
}
},
+ "node_modules/@clerk/themes": {
+ "version": "2.4.55",
+ "resolved": "https://registry.npmjs.org/@clerk/themes/-/themes-2.4.55.tgz",
+ "integrity": "sha512-j9q8NtAaI2f7vNBuO2RAUDmAebab2UoZCXshlTzEhsbB1UH+94fPs4KyUlsbrSNxIJNfTrM2IKxAZKos3gcCJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@clerk/shared": "^3.47.0",
+ "tslib": "2.8.1"
+ },
+ "engines": {
+ "node": ">=18.17.0"
+ }
+ },
"node_modules/@clerk/types": {
"version": "4.92.0",
"resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.92.0.tgz",
@@ -11337,9 +11351,9 @@
}
},
"node_modules/react": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
- "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -11367,15 +11381,15 @@
}
},
"node_modules/react-dom": {
- "version": "19.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
- "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.2.0"
+ "react": "^19.2.4"
}
},
"node_modules/react-is": {
diff --git a/package.json b/package.json
index 30975b3..d1306dd 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
},
"dependencies": {
"@clerk/react-router": "^2.1.0",
+ "@clerk/themes": "^2.4.55",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",