feat: add vibrant gradients and equal heights to game cards

Updated the game theme system and game cards to have vibrant, eye-catching
gradients and consistent heights:

Theme System Changes:
- Updated all game themes from pastel to vibrant gradients
- Blue: Vibrant cyan (#4facfe to #00f2fe)
- Purple: Vibrant purple (#667eea to #764ba2)
- Pink: Vibrant pink (#f093fb to #f5576c)
- Green: Vibrant green/teal (#43e97b to #38f9d7)
- Plus updated indigo, teal, orange, yellow, red, gray themes

Game Manifest Updates:
- Memory Lightning: now uses purple theme
- Matching Pairs: now uses pink theme
- Complement Race: continues using blue (cyan) theme
- Card Sorting: now uses green theme

Homepage Game Cards:
- Added height: '100%' and flexbox to make all cards equal height
- Cards now stretch uniformly regardless of content length
- Maintains responsive hover effects and text readability overlays

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Thomas Hallock
2025-10-20 17:13:09 -05:00
parent 7f516526fb
commit a1a135a858
6 changed files with 40 additions and 28 deletions

View File

@@ -103,7 +103,8 @@
"Bash(node -e:*)",
"Bash(do gh run list --limit 1 --workflow=\"Build and Deploy\" --json conclusion,status,databaseId --jq '.[0] | \"\"\\(.status) - \\(.conclusion // \"\"running\"\") - Run \\(.databaseId)\"\"')",
"Bash(do ssh nas.home.network '/usr/local/bin/docker inspect soroban-abacus-flashcards --format=\"\"{{index .Config.Labels \\\"\"org.opencontainers.image.revision\\\"\"}}\"\"')",
"Bash(git rev-parse HEAD)"
"Bash(git rev-parse HEAD)",
"Bash(gh run watch --exit-status 18662351595)"
],
"deny": [],
"ask": []

View File

@@ -590,7 +590,7 @@ function GameCard({
href: string
}) {
return (
<Link href={href}>
<Link href={href} style={{ height: '100%', display: 'block' }}>
<div
className={css({
rounded: 'xl',
@@ -600,6 +600,9 @@ function GameCard({
cursor: 'pointer',
position: 'relative',
overflow: 'hidden',
height: '100%',
display: 'flex',
flexDirection: 'column',
_hover: {
transform: 'translateY(-6px) scale(1.02)',
shadow: '0 25px 50px rgba(0, 0, 0, 0.3)',
@@ -625,7 +628,15 @@ function GameCard({
})}
/>
{/* Content */}
<div className={css({ position: 'relative', zIndex: 2 })}>
<div
className={css({
position: 'relative',
zIndex: 2,
flex: 1,
display: 'flex',
flexDirection: 'column',
})}
>
<div
className={css({
fontSize: '3xl',

View File

@@ -24,7 +24,7 @@ const manifest: GameManifest = {
maxPlayers: 1, // Single player only
difficulty: 'Intermediate',
chips: ['🧠 Pattern Recognition', '🎯 Solo Challenge', '📊 Smart Scoring'],
...getGameTheme('teal'),
...getGameTheme('green'),
available: true,
}

View File

@@ -23,7 +23,7 @@ const manifest: GameManifest = {
maxPlayers: 4,
difficulty: 'Intermediate',
chips: ['👥 Multiplayer', '🎯 Strategic', '🏆 Competitive'],
...getGameTheme('purple'),
...getGameTheme('pink'),
available: true,
}

View File

@@ -23,7 +23,7 @@ const manifest: GameManifest = {
maxPlayers: 8,
difficulty: 'Intermediate',
chips: ['👥 Multiplayer', '🧠 Memory', '🧮 Soroban'],
...getGameTheme('blue'),
...getGameTheme('purple'),
available: true,
}

View File

@@ -14,59 +14,59 @@ export interface GameTheme {
}
/**
* Standard theme presets
* These use Panda CSS's color system and provide consistent styling
* Standard theme presets with vibrant gradients
* Updated for eye-catching game cards on the homepage
*/
export const GAME_THEMES = {
blue: {
color: 'blue',
gradient: 'linear-gradient(135deg, #dbeafe, #bfdbfe)', // blue.100 to blue.200
borderColor: '#bfdbfe', // blue.200
gradient: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)', // Vibrant cyan
borderColor: '#00f2fe',
},
purple: {
color: 'purple',
gradient: 'linear-gradient(135deg, #e9d5ff, #ddd6fe)', // purple.100 to purple.200
borderColor: '#ddd6fe', // purple.200
gradient: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)', // Vibrant purple
borderColor: '#764ba2',
},
green: {
color: 'green',
gradient: 'linear-gradient(135deg, #d1fae5, #a7f3d0)', // green.100 to green.200
borderColor: '#a7f3d0', // green.200
gradient: 'linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)', // Vibrant green/teal
borderColor: '#38f9d7',
},
teal: {
color: 'teal',
gradient: 'linear-gradient(135deg, #ccfbf1, #99f6e4)', // teal.100 to teal.200
borderColor: '#99f6e4', // teal.200
gradient: 'linear-gradient(135deg, #11998e 0%, #38ef7d 100%)', // Vibrant teal
borderColor: '#38ef7d',
},
indigo: {
color: 'indigo',
gradient: 'linear-gradient(135deg, #e0e7ff, #c7d2fe)', // indigo.100 to indigo.200
borderColor: '#c7d2fe', // indigo.200
gradient: 'linear-gradient(135deg, #5f72bd 0%, #9b23ea 100%)', // Vibrant indigo
borderColor: '#9b23ea',
},
pink: {
color: 'pink',
gradient: 'linear-gradient(135deg, #fce7f3, #fbcfe8)', // pink.100 to pink.200
borderColor: '#fbcfe8', // pink.200
gradient: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)', // Vibrant pink
borderColor: '#f5576c',
},
orange: {
color: 'orange',
gradient: 'linear-gradient(135deg, #ffedd5, #fed7aa)', // orange.100 to orange.200
borderColor: '#fed7aa', // orange.200
gradient: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)', // Vibrant orange/coral
borderColor: '#fee140',
},
yellow: {
color: 'yellow',
gradient: 'linear-gradient(135deg, #fef3c7, #fde68a)', // yellow.100 to yellow.200
borderColor: '#fde68a', // yellow.200
gradient: 'linear-gradient(135deg, #ffd89b 0%, #19547b 100%)', // Vibrant yellow/blue
borderColor: '#ffd89b',
},
red: {
color: 'red',
gradient: 'linear-gradient(135deg, #fee2e2, #fecaca)', // red.100 to red.200
borderColor: '#fecaca', // red.200
gradient: 'linear-gradient(135deg, #f85032 0%, #e73827 100%)', // Vibrant red
borderColor: '#e73827',
},
gray: {
color: 'gray',
gradient: 'linear-gradient(135deg, #f3f4f6, #e5e7eb)', // gray.100 to gray.200
borderColor: '#e5e7eb', // gray.200
gradient: 'linear-gradient(135deg, #868f96 0%, #596164 100%)', // Vibrant gray
borderColor: '#596164',
},
} as const satisfies Record<string, GameTheme>