diff --git a/src/app.css b/src/app.css
index 405d430..5fb0a70 100644
--- a/src/app.css
+++ b/src/app.css
@@ -128,4 +128,109 @@
transform: translateX(0);
}
}
+
+ /* Neon Text Glow Effects */
+ .text-glow-sm {
+ text-shadow: 0 0 10px currentColor;
+ }
+
+ .text-glow-md {
+ text-shadow:
+ 0 0 10px currentColor,
+ 0 0 20px currentColor;
+ }
+
+ .text-glow-lg {
+ text-shadow:
+ 0 0 10px currentColor,
+ 0 0 20px currentColor,
+ 0 0 40px currentColor;
+ }
+
+ /* Neon Box Glow Effects */
+ .glow-sm {
+ box-shadow: 0 0 10px currentColor;
+ }
+
+ .glow-md {
+ box-shadow:
+ 0 0 10px currentColor,
+ 0 0 20px currentColor;
+ }
+
+ .glow-lg {
+ box-shadow:
+ 0 0 10px currentColor,
+ 0 0 20px currentColor,
+ 0 0 40px currentColor;
+ }
+
+ /* Specific neon color glows */
+ .text-glow-neon-blue {
+ text-shadow:
+ 0 0 10px theme('colors.neon.blue'),
+ 0 0 20px theme('colors.neon.blue'),
+ 0 0 40px theme('colors.neon.blue');
+ }
+
+ .text-glow-neon-gold {
+ text-shadow:
+ 0 0 10px theme('colors.neon.gold'),
+ 0 0 20px theme('colors.neon.gold'),
+ 0 0 40px theme('colors.neon.gold');
+ }
+
+ .text-glow-neon-red {
+ text-shadow:
+ 0 0 10px theme('colors.neon.red'),
+ 0 0 20px theme('colors.neon.red'),
+ 0 0 40px theme('colors.neon.red');
+ }
+
+ .text-glow-neon-green {
+ text-shadow:
+ 0 0 10px theme('colors.neon.green'),
+ 0 0 20px theme('colors.neon.green'),
+ 0 0 40px theme('colors.neon.green');
+ }
+
+ .glow-neon-blue {
+ box-shadow:
+ 0 0 10px theme('colors.neon.blue'),
+ 0 0 20px theme('colors.neon.blue');
+ }
+
+ .glow-neon-gold {
+ box-shadow:
+ 0 0 10px theme('colors.neon.gold'),
+ 0 0 20px theme('colors.neon.gold');
+ }
+
+ .glow-neon-red {
+ box-shadow:
+ 0 0 10px theme('colors.neon.red'),
+ 0 0 20px theme('colors.neon.red');
+ }
+
+ /* Stagger animation delays */
+ .stagger-1 {
+ animation-delay: 0.1s;
+ }
+ .stagger-2 {
+ animation-delay: 0.2s;
+ }
+ .stagger-3 {
+ animation-delay: 0.3s;
+ }
+ .stagger-4 {
+ animation-delay: 0.4s;
+ }
+ .stagger-5 {
+ animation-delay: 0.5s;
+ }
+
+ /* Pause animation on hover */
+ .hover\:pause-animation:hover {
+ animation-play-state: paused;
+ }
}
diff --git a/src/lib/components/landing/AnimatedCounter.svelte b/src/lib/components/landing/AnimatedCounter.svelte
new file mode 100644
index 0000000..d487f69
--- /dev/null
+++ b/src/lib/components/landing/AnimatedCounter.svelte
@@ -0,0 +1,63 @@
+
+
+
+ {prefix}{format($displayValue)}{suffix}
+
diff --git a/src/lib/components/landing/FeatureCard.svelte b/src/lib/components/landing/FeatureCard.svelte
new file mode 100644
index 0000000..47fe0ef
--- /dev/null
+++ b/src/lib/components/landing/FeatureCard.svelte
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+ {description}
+
+
+
+
diff --git a/src/lib/components/landing/FeatureShowcase.svelte b/src/lib/components/landing/FeatureShowcase.svelte
new file mode 100644
index 0000000..e179127
--- /dev/null
+++ b/src/lib/components/landing/FeatureShowcase.svelte
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+ Everything You Need to Expose Team Flashers
+
+
+
+ Powerful tools to track, analyze, and publicly shame anyone who thinks it's okay to blind
+ their own teammates.
+
+
+
+
+
+ {#each features as feature, index}
+
+
+
+ {/each}
+
+
+
diff --git a/src/lib/components/landing/FlashLeaderboard.svelte b/src/lib/components/landing/FlashLeaderboard.svelte
new file mode 100644
index 0000000..0099a61
--- /dev/null
+++ b/src/lib/components/landing/FlashLeaderboard.svelte
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ This Week's Flash Criminals
+
+
+
+ These players have been blinding their teammates more than their enemies. Consider this a
+ public service announcement.
+
+
+
+
+
+ {#each podiumOrder as player, index}
+ {#if player}
+
+
+
+ {/if}
+ {/each}
+
+
+
+
+ "We're not saying these players are bad teammates... actually, yes we are. That's exactly what
+ we're saying."
+
+
+
diff --git a/src/lib/components/landing/HeroSection.svelte b/src/lib/components/landing/HeroSection.svelte
new file mode 100644
index 0000000..f0bb6ca
--- /dev/null
+++ b/src/lib/components/landing/HeroSection.svelte
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ STOP FLASHING YOUR TEAMMATES
+
+
+
+
+ team flash .rip
+
+
+
+
+ Track flashbang statistics in CS2. Expose team flashers. Know who to mute before the match.
+
+
+
+
+
+
+
+
+
+ {stats.playersExposed.toLocaleString()}
+
+
Players Exposed
+
+
+
+
+ {stats.flashCrimes.toLocaleString()}
+
+
+ Flash Crimes Documented
+
+
+
+
+
+ {stats.flashbangsAnalyzed.toLocaleString()}+
+
+
Flashbangs Analyzed
+
+
+
+
+
+
+
Scroll to explore
+
+
+
+
+
+
+
diff --git a/src/lib/components/landing/LeaderboardPodium.svelte b/src/lib/components/landing/LeaderboardPodium.svelte
new file mode 100644
index 0000000..b2f0830
--- /dev/null
+++ b/src/lib/components/landing/LeaderboardPodium.svelte
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+ #{player.rank}
+
+
+
+
+ {#if player.avatarUrl}
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+
{player.name}
+
+
+
{config.title}
+
+
+
+
+
Teammates Blinded
+ {player.teammatesBlinded}
+
+
+
Self-Flashes
+ {player.selfFlashes}
+
+
+
+
+
+
+
diff --git a/src/lib/components/landing/LiveMatchTicker.svelte b/src/lib/components/landing/LiveMatchTicker.svelte
new file mode 100644
index 0000000..cca4d36
--- /dev/null
+++ b/src/lib/components/landing/LiveMatchTicker.svelte
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#each duplicatedMatches as match (match.uniqueKey)}
+
+ {/each}
+
+
+
diff --git a/src/lib/components/landing/LiveMatchTickerCard.svelte b/src/lib/components/landing/LiveMatchTickerCard.svelte
new file mode 100644
index 0000000..c849ea1
--- /dev/null
+++ b/src/lib/components/landing/LiveMatchTickerCard.svelte
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {formatMapName(match.map)}
+
+
+
+
+
{match.scoreT}
+
vs
+
{match.scoreCT}
+
+ {#if match.isProcessing}
+
+ {/if}
+
+
+
diff --git a/src/lib/components/landing/NeonCTA.svelte b/src/lib/components/landing/NeonCTA.svelte
new file mode 100644
index 0000000..2896934
--- /dev/null
+++ b/src/lib/components/landing/NeonCTA.svelte
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Ready to Expose the Flash Criminals ?
+
+
+
+
+ Join thousands of CS2 players who use teamflash.rip to track flash statistics and hold their
+ teammates accountable. It's free, open source, and completely anonymous.
+
+
+
+
+
+
+ Browse Matches
+
+
+
+
+ View on GitHub
+
+
+
+
+
+
+
+ Free & Open Source
+
+
+
+ No Account Required
+
+
+
+ Updated Weekly
+
+
+
+
diff --git a/src/lib/components/landing/ParticleBackground.svelte b/src/lib/components/landing/ParticleBackground.svelte
new file mode 100644
index 0000000..ae31ffb
--- /dev/null
+++ b/src/lib/components/landing/ParticleBackground.svelte
@@ -0,0 +1,143 @@
+
+
+
diff --git a/src/lib/components/landing/TypewriterSearch.svelte b/src/lib/components/landing/TypewriterSearch.svelte
new file mode 100644
index 0000000..0d38e20
--- /dev/null
+++ b/src/lib/components/landing/TypewriterSearch.svelte
@@ -0,0 +1,101 @@
+
+
+
diff --git a/src/lib/components/ui/NeonButton.svelte b/src/lib/components/ui/NeonButton.svelte
new file mode 100644
index 0000000..3bb2524
--- /dev/null
+++ b/src/lib/components/ui/NeonButton.svelte
@@ -0,0 +1,73 @@
+
+
+{#if href}
+
+ {@render children()}
+
+{:else}
+
+ {@render children()}
+
+{/if}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 6047be4..02219da 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,139 +1,31 @@
@@ -142,300 +34,24 @@
-
-
-
-
-
- STOP FLASHING YOUR TEAMMATES
-
+
+
-
- team flash.rip
-
+
+
-
- Track your performance, analyze matches, and finally learn
- who keeps flashing their own team .
-
-
-
- "Where flash stats become flash shaming."
-
-
-
-
-
- Find Flash Criminals
-
-
-
- Check Your Shame Stats
-
-
-
-
-
- {#each stats as stat}
- {@const StatIcon = stat.icon}
-
-
-
{stat.value}
-
{stat.label}
-
- {/each}
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
Featured Matches
- {#if processingCount > 0}
-
-
-
-
-
- {processingCount} Processing
-
- {/if}
-
-
Latest competitive matches from our community
-
-
View All
-
+
+
- {#if featuredMatches.length > 0}
-
-
(isPaused = true)}
- onmouseleave={() => (isPaused = false)}
- role="region"
- aria-label="Featured matches carousel"
- >
-
-
-
- {#each visibleMatches as match (match.match_id)}
-
- {/each}
-
-
+
+
-
- {#if totalSlides > 1}
-
-
handleManualNavigation('prev')}
- class="group absolute left-0 top-1/2 z-10 -translate-x-4 -translate-y-1/2 rounded-md border border-base-content/10 bg-base-100/95 p-2 shadow-[0_8px_30px_rgb(0,0,0,0.12)] backdrop-blur-md transition-all duration-200 hover:-translate-x-5 hover:border-primary/30 hover:bg-base-100 hover:shadow-[0_12px_40px_rgb(0,0,0,0.15)] focus:outline-none focus:ring-2 focus:ring-primary/50 md:-translate-x-6 md:hover:-translate-x-7"
- aria-label="Previous slide"
- >
-
-
-
-
-
handleManualNavigation('next')}
- class="group absolute right-0 top-1/2 z-10 -translate-y-1/2 translate-x-4 rounded-md border border-base-content/10 bg-base-100/95 p-2 shadow-[0_8px_30px_rgb(0,0,0,0.12)] backdrop-blur-md transition-all duration-200 hover:translate-x-5 hover:border-primary/30 hover:bg-base-100 hover:shadow-[0_12px_40px_rgb(0,0,0,0.15)] focus:outline-none focus:ring-2 focus:ring-primary/50 md:translate-x-6 md:hover:translate-x-7"
- aria-label="Next slide"
- >
-
-
- {/if}
-
-
-
- {#if totalSlides > 1}
-
- {#each Array(totalSlides) as _, i}
- goToSlide(i)}
- class="h-2 w-2 rounded-full transition-all duration-300 hover:scale-125 focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2"
- class:bg-primary={i === currentSlide}
- class:w-8={i === currentSlide}
- class:bg-base-300={i !== currentSlide}
- aria-label={`Go to slide ${i + 1}`}
- >
- {/each}
-
- {/if}
- {:else}
-
-
-
No featured matches available at the moment.
-
Check back soon for the latest matches!
-
- {/if}
-
-
-
-
-{#if mapStats.length > 0}
-
-
-
-
Community Statistics
-
- Insights from {data.totalMatchesAnalyzed.toLocaleString()} recent matches
-
-
-
-
-
-
- Most Played Maps
-
-
- {#each mapStats as stat, i}
-
-
-
{stat.count} matches ({((stat.count / data.totalMatchesAnalyzed) * 100).toFixed(
- 1
- )}%)
-
- {/each}
-
-
-
-
-
- Recent Activity
-
-
-
-
-
Total Matches
-
- {data.totalMatchesAnalyzed.toLocaleString()}
-
-
-
-
-
From the last 24 hours
-
-
-
-
-
-
Most Popular Map
-
- {mapStats[0]?.map || 'N/A'}
-
-
-
{mapStats[0]
- ? `${((mapStats[0].count / data.totalMatchesAnalyzed) * 100).toFixed(0)}%`
- : '0%'}
-
-
- Played in {mapStats[0]?.count || 0} matches
-
-
-
-
- View All Match Statistics →
-
-
-
-
-
-
-{/if}
-
-
-
-
-
-
Why teamflash.rip?
-
Because someone needs to track these flash crimes
-
-
-
-
-
-
-
- Flash Forensics
-
- Track enemies blinded, teammates betrayed, and self-inflicted Ls. We see through the
- white.
-
-
-
-
-
-
-
- Shame Statistics
-
- See exactly who threw that flash into your team's face. Evidence-based blame assignment.
-
-
-
-
-
-
-
- Hall of Shame
-
- View comprehensive player profiles with flash history. Know who to mute before the match
- starts.
-
-
-
-
-
-
-
-
-
-
-
-
- Ready to expose the flash criminals?
-
-
- Start tracking your CS2 matches and finally have evidence for the post-game arguments.
-
-
Get Started - It's Free
-
- Free and open source. No signup required. Full flash transparency.
-
-
-
-
-
+
+
diff --git a/tailwind.config.cjs b/tailwind.config.cjs
index 23abcdc..391d77c 100644
--- a/tailwind.config.cjs
+++ b/tailwind.config.cjs
@@ -14,6 +14,18 @@ module.exports = {
DEFAULT: '#5e98d9',
light: '#7eaee5',
dark: '#4a7ab3'
+ },
+ // Neon Esports colors
+ neon: {
+ blue: '#00d4ff',
+ gold: '#ffd700',
+ red: '#ff3366',
+ green: '#00ff88',
+ purple: '#8b5cf6'
+ },
+ void: {
+ DEFAULT: '#0a0a0f',
+ light: '#12121a'
}
},
fontFamily: {
@@ -34,6 +46,37 @@ module.exports = {
'"Courier New"',
'monospace'
]
+ },
+ animation: {
+ ticker: 'ticker 60s linear infinite',
+ float: 'float 6s ease-in-out infinite',
+ 'glow-pulse': 'glow-pulse 2s ease-in-out infinite',
+ 'fade-up': 'fade-up 0.6s ease-out forwards'
+ },
+ keyframes: {
+ ticker: {
+ '0%': { transform: 'translateX(0)' },
+ '100%': { transform: 'translateX(-50%)' }
+ },
+ float: {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-10px)' }
+ },
+ 'glow-pulse': {
+ '0%, 100%': { opacity: '1' },
+ '50%': { opacity: '0.5' }
+ },
+ 'fade-up': {
+ '0%': { opacity: '0', transform: 'translateY(20px)' },
+ '100%': { opacity: '1', transform: 'translateY(0)' }
+ }
+ },
+ backgroundImage: {
+ 'grid-pattern':
+ 'linear-gradient(rgba(0, 212, 255, 0.03) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 212, 255, 0.03) 1px, transparent 1px)'
+ },
+ backgroundSize: {
+ grid: '50px 50px'
}
}
},