diff --git a/.replit b/.replit index 4da27183..cd4d0b4b 100644 --- a/.replit +++ b/.replit @@ -53,7 +53,7 @@ localPort = 8044 externalPort = 3003 [[ports]] -localPort = 38223 +localPort = 34311 externalPort = 3002 [[ports]] diff --git a/client/components/IsometricRealmCard.tsx b/client/components/IsometricRealmCard.tsx index b734db20..4f32cd56 100644 --- a/client/components/IsometricRealmCard.tsx +++ b/client/components/IsometricRealmCard.tsx @@ -16,6 +16,7 @@ interface IsometricRealmCardProps { index: number; onClick: (realm: RealmData) => void; isSelected: boolean; + isFeatured?: boolean; } export default function IsometricRealmCard({ @@ -23,6 +24,7 @@ export default function IsometricRealmCard({ index, onClick, isSelected, + isFeatured = false, }: IsometricRealmCardProps) { const cardRef = useRef(null); const [tilt, setTilt] = useState({ x: 0, y: 0 }); @@ -88,7 +90,7 @@ export default function IsometricRealmCard({ {/* Main card surface */}
+ {/* Shimmer effect */} +
+ + {/* Corner accents */} +
+
+
+
+ + {/* Ambient particles inside card */} +
+ {[...Array(4)].map((_, i) => ( + + ))} +
+ {/* Floating icon layer */}
{ + const startTime = Date.now(); + const animate = () => { + const elapsed = Date.now() - startTime; + const progress = Math.min(elapsed / duration, 1); + const eased = 1 - Math.pow(1 - progress, 3); + setCount(Math.floor(target * eased)); + if (progress < 1) requestAnimationFrame(animate); + }; + const timer = setTimeout(animate, 500); + return () => clearTimeout(timer); + }, [target, duration]); + + return <>{count.toLocaleString()}; +} + export default function IsometricRealmSelector() { const navigate = useNavigate(); const [selectedRealm, setSelectedRealm] = useState(null); const [mousePosition, setMousePosition] = useState({ x: 0.5, y: 0.5 }); + const [featuredIndex, setFeaturedIndex] = useState(0); + const [isPaused, setIsPaused] = useState(false); const particles = useMemo(() => generateParticles(20), []); + + // Auto-rotate featured realm + useEffect(() => { + if (isPaused) return; + const interval = setInterval(() => { + setFeaturedIndex((prev) => (prev + 1) % realms.length); + }, 4000); + return () => clearInterval(interval); + }, [isPaused]); useEffect(() => { let rafId: number; @@ -248,17 +279,17 @@ export default function IsometricRealmSelector() { transition={{ duration: 0.6, delay: 0.3 }} >
- 12,000+ + + Builders
- 500+ + + Projects
- 7 + Realms
@@ -268,14 +299,89 @@ export default function IsometricRealmSelector() {
+ {/* Featured Realm Spotlight Carousel */} + setIsPaused(true)} + onMouseLeave={() => setIsPaused(false)} + > +
+

Featured Realm

+
+ {realms.map((realm, index) => ( +
+
+ +
+ + +
+
+
+
+ {realms[featuredIndex].icon} +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+
+
+
+ + {Math.floor(Math.random() * 200 + 50)} online +
+

{realms[featuredIndex].label}

+

{realms[featuredIndex].description}

+
+ {realms[featuredIndex].features.map((feature, i) => ( + {feature} + ))} +
+ +
+
+
+
+
+
+ + +
+ + -

Select Your Realm

-

Each realm unlocks a unique experience tailored to your journey

+

All Realms

+

Explore every realm and find your place in the ecosystem

@@ -286,6 +392,7 @@ export default function IsometricRealmSelector() { index={index} onClick={handleRealmClick} isSelected={selectedRealm === realm.id} + isFeatured={index === featuredIndex} /> ))}
@@ -509,6 +616,245 @@ export default function IsometricRealmSelector() { 50% { opacity: 0.4; } } + /* Featured Realm Carousel */ + .featured-realm-section { + margin-bottom: 60px; + } + + .featured-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + } + + .featured-header h2 { + font-size: 20px; + font-weight: 700; + color: hsl(var(--foreground)); + text-transform: uppercase; + letter-spacing: 0.1em; + } + + .carousel-indicators { + display: flex; + gap: 8px; + } + + .indicator { + width: 32px; + height: 4px; + border-radius: 2px; + background: hsl(var(--muted)); + border: none; + cursor: pointer; + transition: all 0.3s ease; + } + + .indicator.active { + background: var(--indicator-color); + box-shadow: 0 0 10px var(--indicator-color); + } + + .indicator:hover { + background: var(--indicator-color); + opacity: 0.7; + } + + .featured-carousel { + position: relative; + min-height: 280px; + } + + .featured-card { + position: relative; + padding: 32px; + border-radius: 20px; + background: linear-gradient(145deg, hsl(var(--muted) / 0.8) 0%, hsl(var(--card) / 0.6) 100%); + border: 2px solid var(--featured-color, hsl(var(--aethex-500))); + backdrop-filter: blur(12px); + overflow: hidden; + } + + .featured-glow { + position: absolute; + inset: -100px; + background: radial-gradient(ellipse at 30% 30%, var(--featured-color) 0%, transparent 50%); + opacity: 0.15; + pointer-events: none; + } + + .featured-shimmer { + position: absolute; + inset: 0; + background: linear-gradient( + 105deg, + transparent 40%, + hsl(var(--foreground) / 0.05) 45%, + hsl(var(--foreground) / 0.1) 50%, + hsl(var(--foreground) / 0.05) 55%, + transparent 60% + ); + transform: translateX(-100%); + animation: shimmer 3s infinite; + pointer-events: none; + } + + @keyframes shimmer { + 0% { transform: translateX(-100%); } + 100% { transform: translateX(100%); } + } + + .featured-content { + position: relative; + display: flex; + gap: 32px; + align-items: center; + z-index: 1; + } + + .featured-icon-wrapper { + position: relative; + flex-shrink: 0; + } + + .featured-icon { + font-size: 80px; + display: block; + filter: drop-shadow(0 0 20px var(--featured-color)); + } + + .featured-particles { + position: absolute; + inset: -20px; + pointer-events: none; + } + + .featured-particle { + position: absolute; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--featured-color); + opacity: 0.6; + animation: float-particle 3s ease-in-out infinite; + animation-delay: calc(var(--i) * 0.5s); + } + + .featured-particle:nth-child(1) { top: 0; left: 50%; } + .featured-particle:nth-child(2) { top: 25%; right: 0; } + .featured-particle:nth-child(3) { bottom: 25%; right: 0; } + .featured-particle:nth-child(4) { bottom: 0; left: 50%; } + .featured-particle:nth-child(5) { bottom: 25%; left: 0; } + .featured-particle:nth-child(6) { top: 25%; left: 0; } + + @keyframes float-particle { + 0%, 100% { transform: translate(0, 0) scale(1); opacity: 0.6; } + 50% { transform: translate(5px, -10px) scale(1.2); opacity: 1; } + } + + .featured-info { + flex: 1; + } + + .featured-badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 12px; + background: hsl(120, 100%, 50%, 0.15); + border: 1px solid hsl(120, 100%, 50%, 0.3); + border-radius: 20px; + font-size: 11px; + font-weight: 600; + color: hsl(120, 100%, 60%); + margin-bottom: 12px; + } + + .online-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: hsl(120, 100%, 50%); + animation: pulse 2s ease-in-out infinite; + } + + .featured-title { + font-size: 32px; + font-weight: 800; + color: var(--featured-color); + margin-bottom: 8px; + letter-spacing: 0.05em; + } + + .featured-description { + font-size: 15px; + color: hsl(var(--muted-foreground)); + margin-bottom: 16px; + line-height: 1.6; + } + + .featured-features { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 20px; + } + + .featured-feature { + padding: 6px 12px; + background: var(--featured-color, hsl(var(--aethex-500))); + background: color-mix(in srgb, var(--featured-color) 15%, transparent); + border: 1px solid var(--featured-color); + border-radius: 6px; + font-size: 12px; + font-weight: 500; + color: hsl(var(--foreground)); + } + + .featured-cta { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 14px 28px; + background: var(--featured-color); + border: none; + border-radius: 10px; + font-size: 14px; + font-weight: 700; + color: hsl(var(--background)); + cursor: pointer; + transition: all 0.2s ease; + text-transform: uppercase; + letter-spacing: 0.05em; + } + + .featured-cta:hover { + transform: translateY(-2px); + box-shadow: 0 10px 30px color-mix(in srgb, var(--featured-color) 50%, transparent); + } + + .featured-cta .cta-arrow { + transition: transform 0.2s ease; + } + + .featured-cta:hover .cta-arrow { + transform: translateX(4px); + } + + .featured-corner { + position: absolute; + width: 20px; + height: 20px; + border: 2px solid var(--featured-color); + opacity: 0.6; + } + + .featured-corner.tl { top: 8px; left: 8px; border-right: none; border-bottom: none; } + .featured-corner.tr { top: 8px; right: 8px; border-left: none; border-bottom: none; } + .featured-corner.bl { bottom: 8px; left: 8px; border-right: none; border-top: none; } + .featured-corner.br { bottom: 8px; right: 8px; border-left: none; border-top: none; } + .hero-text { text-align: center; margin-bottom: 40px; @@ -601,6 +947,38 @@ export default function IsometricRealmSelector() { height: 24px; } + .featured-realm-section { + margin-bottom: 40px; + } + + .featured-header { + flex-direction: column; + gap: 12px; + align-items: flex-start; + } + + .featured-content { + flex-direction: column; + text-align: center; + } + + .featured-icon { + font-size: 60px; + } + + .featured-title { + font-size: 24px; + } + + .featured-features { + justify-content: center; + } + + .featured-cta { + width: 100%; + justify-content: center; + } + .hero-text { margin-bottom: 32px; }