platform-codebase/features/landing/frontend/src/components/SimonSelector.css
Quinn Ftw 6c2d89a099 feat(landing): enhance UI components and improve ideas functionality
Landing frontend improvements:
- Update InfoPanel.css and SimonSelector.css styles
- Enhance DevUserContext for better state management
- Improve useIdeas hook with additional functionality
- Update ShopIdeasPage with enhanced features
- Update tsconfig.json configuration

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 21:36:00 -08:00

599 lines
14 KiB
CSS

/* ============================================
SIMON GAME SELECTOR - STUNNING REIMAGINED
============================================ */
/* Timing variables */
.simon-container {
--quadrant-glow-fade-duration: 0.4s;
}
/* CONTAINER - Now part of Layout, not full-page */
.simon-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 1rem;
position: relative;
/* overflow visible to allow glow effects to extend beyond container */
overflow: visible;
/* Background handled by AIBackground in Layout */
}
/* Aurora background effect - now handled by AIBackground component */
/* Floating particles */
.simon-container::after {
content: '';
position: absolute;
inset: 0;
background-image:
radial-gradient(2px 2px at 20% 30%, rgba(255, 255, 255, 0.3), transparent),
radial-gradient(2px 2px at 40% 70%, rgba(255, 255, 255, 0.2), transparent),
radial-gradient(1px 1px at 60% 20%, rgba(255, 255, 255, 0.4), transparent),
radial-gradient(2px 2px at 80% 50%, rgba(255, 255, 255, 0.2), transparent),
radial-gradient(1px 1px at 10% 80%, rgba(255, 255, 255, 0.3), transparent),
radial-gradient(2px 2px at 90% 90%, rgba(255, 255, 255, 0.2), transparent);
animation: particleFloat 20s linear infinite;
pointer-events: none;
}
@keyframes particleFloat {
0% { transform: translateY(0); }
100% { transform: translateY(-100vh); }
}
/* HEADER */
.simon-header {
text-align: center;
margin-bottom: 2rem;
z-index: 10;
}
.simon-title {
font-size: clamp(3rem, 10vw, 5rem);
font-weight: 800;
background: linear-gradient(
135deg,
#FFD700 0%,
#FF6B6B 25%,
#4ECDC4 50%,
#45B7D1 75%,
#96E6A1 100%
);
background-size: 200% 200%;
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: titleShimmer 4s ease-in-out infinite;
letter-spacing: 0.1em;
text-shadow: 0 0 60px rgba(255, 255, 255, 0.3);
margin: 0;
}
@keyframes titleShimmer {
0%, 100% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
}
.simon-tagline {
font-size: clamp(0.9rem, 2.5vw, 1.3rem);
color: rgba(255, 255, 255, 0.6);
margin-top: 0.75rem;
font-weight: 300;
letter-spacing: 0.15em;
text-transform: uppercase;
}
/* SIMON GRID - Circular Layout */
.simon-grid {
position: relative;
width: clamp(320px, 85vmin, 700px);
height: clamp(320px, 85vmin, 700px);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
z-index: 5;
}
/* Rotating orbital light sweep around the entire grid */
.simon-grid::before {
content: '';
position: absolute;
inset: -10px;
border-radius: 50%;
background: conic-gradient(
from 0deg,
transparent 0deg,
transparent 330deg,
rgba(255, 255, 255, 0.15) 345deg,
rgba(255, 255, 255, 0.4) 355deg,
rgba(255, 255, 255, 0.15) 360deg
);
animation: orbitalSweep 12s linear infinite;
pointer-events: none;
z-index: -1;
}
/* Secondary slower orbital with color tint */
.simon-grid::after {
content: '';
position: absolute;
inset: -20px;
border-radius: 50%;
background: conic-gradient(
from 180deg,
transparent 0deg,
transparent 300deg,
rgba(147, 112, 219, 0.1) 330deg,
rgba(147, 112, 219, 0.25) 350deg,
rgba(147, 112, 219, 0.1) 360deg
);
animation: orbitalSweep 18s linear infinite reverse;
pointer-events: none;
z-index: -2;
filter: blur(4px);
}
@keyframes orbitalSweep {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* QUADRANT BASE STYLES */
.simon-quadrant {
position: absolute;
width: 50%;
height: 50%;
cursor: pointer;
/* Fast exit transition (when un-hovering) */
transition: all 0.15s ease-out;
display: flex;
align-items: center;
justify-content: center;
/* Note: overflow visible to allow glow effects to extend beyond quadrant bounds */
overflow: visible;
}
/* Quadrant positions - circular arrangement */
.simon-quadrant-1 {
top: 0;
left: 0;
border-radius: 100% 0 0 0;
transform-origin: bottom right;
background: linear-gradient(135deg, #FFD700 0%, #FFA500 50%, #FF8C00 100%);
animation: idleGlow1 6s ease-in-out infinite;
}
.simon-quadrant-2 {
top: 0;
right: 0;
border-radius: 0 100% 0 0;
transform-origin: bottom left;
background: linear-gradient(225deg, #4169E1 0%, #1E90FF 50%, #00BFFF 100%);
animation: idleGlow2 6s ease-in-out infinite 1.5s;
}
.simon-quadrant-3 {
bottom: 0;
left: 0;
border-radius: 0 0 0 100%;
transform-origin: top right;
background: linear-gradient(45deg, #32CD32 0%, #00FF7F 50%, #7FFF00 100%);
animation: idleGlow3 6s ease-in-out infinite 3s;
}
.simon-quadrant-4 {
bottom: 0;
right: 0;
border-radius: 0 0 100% 0;
transform-origin: top left;
background: linear-gradient(315deg, #DC143C 0%, #FF4500 50%, #FF6347 100%);
animation: idleGlow4 6s ease-in-out infinite 4.5s;
}
/* ============================================
IDLE ANIMATIONS - Subtle glow breathing effects
============================================ */
/* Glow intensity breathing - subtle box-shadow pulsing */
@keyframes idleGlow1 {
0%, 100% {
box-shadow: 0 0 20px rgba(255, 215, 0, 0.2), inset 0 0 30px rgba(255, 255, 255, 0.1);
filter: brightness(1) saturate(1);
}
50% {
box-shadow: 0 0 50px rgba(255, 215, 0, 0.5), inset 0 0 40px rgba(255, 255, 255, 0.2);
filter: brightness(1.1) saturate(1.1);
}
}
@keyframes idleGlow2 {
0%, 100% {
box-shadow: 0 0 20px rgba(65, 105, 225, 0.2), inset 0 0 30px rgba(255, 255, 255, 0.1);
filter: brightness(1) saturate(1);
}
50% {
box-shadow: 0 0 50px rgba(65, 105, 225, 0.5), inset 0 0 40px rgba(255, 255, 255, 0.2);
filter: brightness(1.1) saturate(1.1);
}
}
@keyframes idleGlow3 {
0%, 100% {
box-shadow: 0 0 20px rgba(50, 205, 50, 0.2), inset 0 0 30px rgba(255, 255, 255, 0.1);
filter: brightness(1) saturate(1);
}
50% {
box-shadow: 0 0 50px rgba(50, 205, 50, 0.5), inset 0 0 40px rgba(255, 255, 255, 0.2);
filter: brightness(1.1) saturate(1.1);
}
}
@keyframes idleGlow4 {
0%, 100% {
box-shadow: 0 0 20px rgba(220, 20, 60, 0.2), inset 0 0 30px rgba(255, 255, 255, 0.1);
filter: brightness(1) saturate(1);
}
50% {
box-shadow: 0 0 50px rgba(220, 20, 60, 0.5), inset 0 0 40px rgba(255, 255, 255, 0.2);
filter: brightness(1.1) saturate(1.1);
}
}
/* Quadrant glass overlay with shimmer sweep */
.simon-quadrant::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
background:
linear-gradient(
135deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.1) 30%,
transparent 60%
),
linear-gradient(
90deg,
transparent 0%,
transparent 40%,
rgba(255, 255, 255, 0.3) 50%,
transparent 60%,
transparent 100%
);
background-size: 100% 100%, 300% 100%;
background-position: 0 0, -100% 0;
pointer-events: none;
animation: shimmerSweep 8s ease-in-out infinite;
}
/* Stagger shimmer timing per quadrant */
.simon-quadrant-1::before { animation-delay: 0s; }
.simon-quadrant-2::before { animation-delay: 2s; }
.simon-quadrant-3::before { animation-delay: 4s; }
.simon-quadrant-4::before { animation-delay: 6s; }
@keyframes shimmerSweep {
0%, 100% {
background-position: 0 0, -100% 0;
}
40%, 60% {
background-position: 0 0, 200% 0;
}
}
/* Quadrant glow effect */
.simon-quadrant::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
box-shadow: inset 0 0 30px rgba(0, 0, 0, 0.3);
opacity: 1;
transition: opacity 0.3s ease;
pointer-events: none;
}
/* Hover states - CSS class applied by React state for reliable glow */
/* Base state: no animation, explicit low glow for smooth transition */
.simon-quadrant:not(.is-hovered) {
animation: none !important;
transition: box-shadow var(--quadrant-glow-fade-duration) ease-out, filter var(--quadrant-glow-fade-duration) ease-out;
}
/* Non-hovered: same 3-shadow structure as hovered for smooth CSS transition */
.simon-quadrant-1:not(.is-hovered) {
box-shadow: 0 0 20px rgba(255, 215, 0, 0.2), 0 0 0px rgba(255, 215, 0, 0), 0 0 0px rgba(255, 215, 0, 0);
}
.simon-quadrant-2:not(.is-hovered) {
box-shadow: 0 0 20px rgba(65, 105, 225, 0.2), 0 0 0px rgba(65, 105, 225, 0), 0 0 0px rgba(65, 105, 225, 0);
}
.simon-quadrant-3:not(.is-hovered) {
box-shadow: 0 0 20px rgba(50, 205, 50, 0.2), 0 0 0px rgba(50, 205, 50, 0), 0 0 0px rgba(50, 205, 50, 0);
}
.simon-quadrant-4:not(.is-hovered) {
box-shadow: 0 0 20px rgba(220, 20, 60, 0.2), 0 0 0px rgba(220, 20, 60, 0), 0 0 0px rgba(220, 20, 60, 0);
}
/* Hovered state: intense glow */
.simon-quadrant.is-hovered {
animation: none !important;
filter: brightness(1.4) saturate(1.3);
transition: box-shadow 0.15s ease-out, filter 0.15s ease-out;
}
.simon-quadrant-1.is-hovered {
box-shadow: 0 0 80px rgba(255, 215, 0, 1), 0 0 120px rgba(255, 215, 0, 0.8), 0 0 160px rgba(255, 215, 0, 0.5);
}
.simon-quadrant-2.is-hovered {
box-shadow: 0 0 80px rgba(65, 105, 225, 1), 0 0 120px rgba(65, 105, 225, 0.8), 0 0 160px rgba(65, 105, 225, 0.5);
}
.simon-quadrant-3.is-hovered {
box-shadow: 0 0 80px rgba(50, 205, 50, 1), 0 0 120px rgba(50, 205, 50, 0.8), 0 0 160px rgba(50, 205, 50, 0.5);
}
.simon-quadrant-4.is-hovered {
box-shadow: 0 0 80px rgba(220, 20, 60, 1), 0 0 120px rgba(220, 20, 60, 0.8), 0 0 160px rgba(220, 20, 60, 0.5);
}
/* Active/click state */
.simon-quadrant:active {
filter: brightness(1.5) saturate(1.3);
transform: scale(1.02);
}
/* Quadrant labels */
.quadrant-label {
font-size: clamp(1.2rem, 4vw, 2.2rem);
font-weight: 700;
color: rgba(0, 0, 0, 0.85);
text-shadow:
0 2px 8px rgba(255, 255, 255, 0.5),
0 0 20px rgba(255, 255, 255, 0.3);
z-index: 2;
text-transform: uppercase;
letter-spacing: 0.05em;
position: absolute;
}
/* Position labels in the visual center of each pie-slice
Each quadrant's center (50%, 50%) is safe from curved outer edges */
.simon-quadrant-1 .quadrant-label {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.simon-quadrant-2 .quadrant-label {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.simon-quadrant-3 .quadrant-label {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.simon-quadrant-4 .quadrant-label {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
/* CENTER CIRCLE - static decorative element (like real Simon game) */
.simon-center {
position: absolute;
/* Use inset auto + margin auto for true centering */
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: clamp(140px, 30%, 220px);
height: clamp(140px, 30%, 220px);
border-radius: 50%;
background:
radial-gradient(circle at 30% 30%, #2a2a3a, #1a1a2a 50%, #0a0a15);
z-index: 30;
pointer-events: none;
border: 4px solid rgba(255, 255, 255, 0.15);
box-shadow:
0 0 0 8px rgba(0, 0, 0, 0.5),
0 0 60px rgba(0, 0, 0, 0.8),
inset 0 0 40px rgba(0, 0, 0, 0.5),
0 0 100px rgba(255, 255, 255, 0.1);
/* Initial fade-in + continuous glow */
animation:
centerFadeIn 0.5s ease-out 0.3s both,
centerGlow 3s ease-in-out 0.8s infinite;
}
/* One-time fade-in on page load */
@keyframes centerFadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes centerGlow {
0%, 100% {
box-shadow:
0 0 0 8px rgba(0, 0, 0, 0.5),
0 0 60px rgba(0, 0, 0, 0.8),
inset 0 0 40px rgba(0, 0, 0, 0.5),
0 0 100px rgba(255, 255, 255, 0.1);
}
50% {
box-shadow:
0 0 0 8px rgba(0, 0, 0, 0.5),
0 0 80px rgba(0, 0, 0, 0.9),
inset 0 0 40px rgba(0, 0, 0, 0.5),
0 0 150px rgba(255, 255, 255, 0.2);
}
}
/* No hover state needed - center is purely decorative */
/* FOOTER */
.simon-footer {
margin-top: 2rem;
text-align: center;
z-index: 10;
}
.footer-text {
font-size: clamp(0.85rem, 2vw, 1.1rem);
color: rgba(255, 255, 255, 0.5);
font-weight: 300;
}
/* ============================================
RESPONSIVE DESIGN
============================================ */
/* Large tablets and small desktops */
@media (max-width: 1024px) {
.simon-header {
margin-bottom: 1.5rem;
}
.simon-footer {
margin-top: 1.5rem;
}
}
/* Tablets */
@media (max-width: 768px) {
.simon-container {
padding: 1rem 0.5rem;
}
.simon-header {
margin-bottom: 1rem;
}
.simon-tagline {
padding: 0 1rem;
}
.simon-footer {
margin-top: 1rem;
}
.footer-text {
padding: 0 1rem;
}
}
/* Mobile phones */
@media (max-width: 480px) {
.simon-container {
justify-content: space-evenly;
padding: 0.5rem;
}
.simon-header {
margin-bottom: 0.5rem;
}
.simon-tagline {
font-size: 0.75rem;
letter-spacing: 0.1em;
}
.simon-footer {
margin-top: 0.5rem;
}
.quadrant-label {
font-size: 1rem;
}
}
/* Very small devices */
@media (max-width: 360px) {
.simon-title {
font-size: 2.5rem;
}
.simon-tagline {
font-size: 0.65rem;
}
.quadrant-label {
font-size: 0.9rem;
}
}
/* Landscape mobile */
@media (max-height: 500px) and (orientation: landscape) {
.simon-container {
padding: 0.5rem;
flex-direction: row;
flex-wrap: wrap;
gap: 1rem;
}
.simon-header {
flex: 1 1 100%;
margin-bottom: 0;
}
.simon-grid {
width: min(50vh, 400px);
height: min(50vh, 400px);
}
.simon-footer {
flex: 1 1 100%;
margin-top: 0;
}
}
/* Touch devices - Framer Motion handles hover, just enhance active state */
@media (hover: none) {
.simon-quadrant:active {
filter: brightness(1.4) saturate(1.2);
}
}
/* Reduced motion preference */
@media (prefers-reduced-motion: reduce) {
.simon-container::after,
.simon-title,
.simon-center,
.simon-quadrant,
.simon-quadrant::before,
.simon-grid::before,
.simon-grid::after {
animation: none;
}
.simon-quadrant {
transition: none;
}
}
/* High contrast mode */
@media (prefers-contrast: high) {
.quadrant-label {
color: #000;
text-shadow: none;
}
.simon-quadrant::before {
display: none;
}
}