diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dd916757..7e84f06e 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -9,12 +9,14 @@ import { AuthProvider } from "./services/AuthContext"; * * - Wraps the entire application * - Provides consistent layout with Header and Footer + * - Applies the Godly-inspired dark theme (slate-950 background, design-tokens.json) * - Renders the routed pages inside the main content area */ const App: React.FC = () => { return ( -
+ {/* dark class activates the slate-950/900 dark design system */} +
{/* Global header */}
@@ -31,3 +33,4 @@ const App: React.FC = () => { }; export default App; + diff --git a/frontend/src/presentation/pages/HomePage.tsx b/frontend/src/presentation/pages/HomePage.tsx index c6ea86c1..f5cc2f1a 100644 --- a/frontend/src/presentation/pages/HomePage.tsx +++ b/frontend/src/presentation/pages/HomePage.tsx @@ -31,6 +31,7 @@ interface DisplayItem { /** * Home page component — introduces Bench Analytics and highlights * its main features to encourage user engagement. + * Styled to match the Godly-inspired dark design system (design-tokens.json). */ const Home: React.FC = () => { const navigate = useNavigate(); @@ -52,7 +53,7 @@ const Home: React.FC = () => { { title: "Matchup Analysis", description: - "Generate optimized lineups based on each batter’s statistical profile.", + "Generate optimized lineups based on each batter's statistical profile.", icon: Target, }, { @@ -84,18 +85,26 @@ const Home: React.FC = () => { ]; return ( -
+
{/* ---------- Hero Section ---------- */} - {/* Introduces the platform and main call-to-action buttons */} -
-
-
-

- Your lineup. Our analytics. +
+ {/* Radial gradient background glow */} +
+
+

+ Your lineup.{" "} + Our analytics.
- Their problem. + Their problem.

-

+

Stop guessing. Start winning. Our advanced analytics platform helps coaches optimize batting orders, analyze matchups, and make smarter decisions backed by data. @@ -104,7 +113,7 @@ const Home: React.FC = () => { @@ -112,11 +121,11 @@ const Home: React.FC = () => {

- {/* ---------- Features Grid ---------- */} - {/* Displays key platform features in a responsive grid of cards */} -
-

+ {/* ---------- Features Section Header ---------- */} +
+

Everything You Need to Win

-

+

Comprehensive tools designed specifically for baseball coaches. -

+

+ + {/* ---------- Features Grid ---------- */}
{features.map((feature, index) => { const Icon = feature.icon; + const isAccent = index % 2 === 1; return (
{feature.title} @@ -173,21 +186,30 @@ const Home: React.FC = () => { })}
- {/* ---------- Benefits Grid ---------- */} - {/* Displays our benefits in block */} - -
-

Key Benefits

-
- {benefits.map((benefit, index) => { + {/* ---------- Benefits Section ---------- */} +
+

+ Key Benefits +

+
+ {benefits.map((benefit) => { const Icon = benefit.icon; return ( -
-
- +
+
+
-

{benefit.title}

-

+

{benefit.title}

+

{benefit.description}

@@ -197,21 +219,27 @@ const Home: React.FC = () => {
{/* ---------- CTA Section ---------- */} - {/* Final call-to-action to encourage signup */} -
-
-
-

+
+
+
+

Ready to Transform Your Team?

-

+

Start today and unlock tools that make every decision smarter, faster, and more confident.

diff --git a/frontend/src/shared/design-tokens.json b/frontend/src/shared/design-tokens.json new file mode 100644 index 00000000..2df74a00 --- /dev/null +++ b/frontend/src/shared/design-tokens.json @@ -0,0 +1,109 @@ +{ + "meta": { + "name": "Bench Analytics Design System", + "version": "2.0.0", + "description": "Godly-inspired dark UI design tokens: slate-950/900 backgrounds, glassmorphism cards, subtle glow effects, and high-contrast typography." + }, + "colors": { + "background": { + "page": { "value": "#020617", "tailwind": "slate-950", "usage": "Main page / body background" }, + "surface": { "value": "#0f172a", "tailwind": "slate-900", "usage": "Cards, panels, elevated surfaces" }, + "header": { "value": "rgba(2,6,23,0.85)", "usage": "Fixed header glassmorphism background (with backdrop-blur)" }, + "overlay": { "value": "rgba(15,23,42,0.85)", "usage": "Glassmorphism card background (with backdrop-blur)" }, + "subtle": { "value": "#1e293b", "tailwind": "slate-800", "usage": "Hover states, input backgrounds" } + }, + "primary": { + "DEFAULT": { "value": "#3b82f6", "tailwind": "blue-500", "usage": "Primary interactive elements, links" }, + "hover": { "value": "#2563eb", "tailwind": "blue-600", "usage": "Primary button hover state" }, + "foreground": { "value": "#ffffff", "usage": "Text on primary-colored backgrounds" }, + "glow": { "value": "rgba(59,130,246,0.35)", "usage": "Blue glow for box-shadow accent" } + }, + "accent": { + "red": { "value": "#ef4444", "tailwind": "red-500", "usage": "Danger, destructive actions, baseball accent" }, + "redHover": { "value": "#dc2626", "tailwind": "red-600", "usage": "Red accent hover" }, + "redGlow": { "value": "rgba(239,68,68,0.35)", "usage": "Red glow box-shadow" } + }, + "text": { + "primary": { "value": "#f8fafc", "tailwind": "slate-50", "usage": "Headings, high-emphasis text" }, + "secondary": { "value": "#94a3b8", "tailwind": "slate-400", "usage": "Body text, descriptions, metadata" }, + "muted": { "value": "#64748b", "tailwind": "slate-500", "usage": "Placeholder text, disabled states" } + }, + "border": { + "subtle": { "value": "rgba(255,255,255,0.08)", "usage": "Default card / panel borders" }, + "medium": { "value": "rgba(255,255,255,0.12)", "usage": "Focused inputs, hover card borders" }, + "strong": { "value": "rgba(255,255,255,0.20)", "usage": "Dividers, emphasized borders" } + }, + "chart": { + "1": { "value": "#3b82f6", "tailwind": "blue-500" }, + "2": { "value": "#10b981", "tailwind": "emerald-500" }, + "3": { "value": "#f59e0b", "tailwind": "amber-500" }, + "4": { "value": "#ef4444", "tailwind": "red-500" }, + "5": { "value": "#8b5cf6", "tailwind": "violet-500" } + } + }, + "spacing": { + "density": "marketing", + "note": "Generous padding/margins typical of modern SaaS marketing pages.", + "scale": { + "xs": { "value": "0.25rem", "px": "4px" }, + "sm": { "value": "0.5rem", "px": "8px" }, + "md": { "value": "1rem", "px": "16px" }, + "lg": { "value": "1.5rem", "px": "24px" }, + "xl": { "value": "2rem", "px": "32px" }, + "2xl": { "value": "3rem", "px": "48px" }, + "3xl": { "value": "4rem", "px": "64px" } + }, + "cardPadding": { "value": "1.5rem", "px": "24px" }, + "sectionGap": { "value": "4rem", "px": "64px" }, + "containerMax": { "value": "80rem", "px": "1280px" } + }, + "borderRadius": { + "note": "Standard rounded corners — not fully circular, not sharp.", + "none": { "value": "0px" }, + "sm": { "value": "6px", "usage": "Small badges, tags" }, + "md": { "value": "8px", "usage": "Buttons, inputs" }, + "lg": { "value": "12px", "usage": "Cards, panels (primary radius)" }, + "xl": { "value": "16px", "usage": "Hero sections, large containers" }, + "2xl": { "value": "24px", "usage": "Modal overlays" }, + "full": { "value": "9999px", "usage": "Pills, avatars" } + }, + "effects": { + "glassmorphism": { + "card": { + "background": "rgba(15,23,42,0.80)", + "backdropBlur": "12px", + "border": "1px solid rgba(255,255,255,0.08)", + "boxShadow": "0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px -2px rgba(0,0,0,0.4)" + } + }, + "boxShadow": { + "sm": "0 1px 2px rgba(0,0,0,0.4)", + "md": "0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px -2px rgba(0,0,0,0.4)", + "lg": "0 10px 15px -3px rgba(0,0,0,0.5), 0 4px 6px -4px rgba(0,0,0,0.4)", + "glowBlue": "0 0 20px rgba(59,130,246,0.25), 0 4px 6px -1px rgba(0,0,0,0.4)", + "glowRed": "0 0 20px rgba(239,68,68,0.25), 0 4px 6px -1px rgba(0,0,0,0.4)" + }, + "ring": { + "focus": "0 0 0 2px rgba(59,130,246,0.5)" + } + }, + "typography": { + "fontFamily": "Inter, system-ui, -apple-system, sans-serif", + "scale": { + "xs": { "size": "0.75rem", "lineHeight": "1rem", "weight": 400 }, + "sm": { "size": "0.875rem", "lineHeight": "1.25rem", "weight": 400 }, + "base": { "size": "1rem", "lineHeight": "1.5rem", "weight": 400 }, + "lg": { "size": "1.125rem", "lineHeight": "1.75rem", "weight": 500 }, + "xl": { "size": "1.25rem", "lineHeight": "1.75rem", "weight": 600 }, + "2xl": { "size": "1.5rem", "lineHeight": "2rem", "weight": 700 }, + "3xl": { "size": "1.875rem", "lineHeight": "2.25rem", "weight": 700 }, + "4xl": { "size": "2.25rem", "lineHeight": "2.5rem", "weight": 800 }, + "5xl": { "size": "3rem", "lineHeight": "1", "weight": 800 }, + "6xl": { "size": "3.75rem", "lineHeight": "1.1", "weight": 900 } + }, + "contrastRatio": { + "heading-to-body": "slate-50 (#f8fafc) on slate-950 (#020617) — approx 18:1 contrast", + "body-to-background": "slate-400 (#94a3b8) on slate-950 (#020617) — approx 7:1 contrast" + } + } +} diff --git a/frontend/src/ui/components/card.tsx b/frontend/src/ui/components/card.tsx index b1513850..e0c23e2a 100644 --- a/frontend/src/ui/components/card.tsx +++ b/frontend/src/ui/components/card.tsx @@ -3,14 +3,15 @@ import { cn } from "../../utils"; /** * Card Component - * Base container with border, rounded corners, and flexible layout. + * Glassmorphism container with frosted-glass background, subtle white border, + * and rounded-lg corners — aligned with design-tokens.json. */ function Card({ className, ...props }: React.ComponentProps<"div">) { return (
) { /** * CardTitle - * Primary heading for the card. + * Primary heading for the card — slate-50 for high contrast. */ function CardTitle({ className, @@ -48,7 +49,7 @@ function CardTitle({ return (

{children} @@ -58,13 +59,13 @@ function CardTitle({ /** * CardDescription - * Secondary text or description below the title. + * Secondary text — slate-400 for measured contrast against dark background. */ function CardDescription({ className, ...props }: React.ComponentProps<"div">) { return (

); @@ -124,3 +125,4 @@ export { CardDescription, CardContent, }; + diff --git a/frontend/src/ui/layout/Footer.tsx b/frontend/src/ui/layout/Footer.tsx index 3c0ef7ec..07f85591 100644 --- a/frontend/src/ui/layout/Footer.tsx +++ b/frontend/src/ui/layout/Footer.tsx @@ -4,14 +4,21 @@ import { useNavigate } from "react-router-dom"; /** * Footer Component - * Displays site-wide footer with navigation links, support info, and company details. + * Dark themed footer matching the Godly design system (slate-900 surface, + * subtle white borders, muted text). */ export const Footer: React.FC = () => { const currentYear = new Date().getFullYear(); // Dynamic year for copyright const navigate = useNavigate(); // Used for client-side navigation return ( -