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. +

+
+ + + +
+
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 +
+ + +

+ teamflash.rip +

+ + +

+ Track flashbang statistics in CS2. Expose team flashers. Know who to mute before the match. +

+ + +
{ + e.preventDefault(); + handleSearch(); + }} + class="w-full max-w-2xl" + role="search" + aria-label="Search for players" + > + +
+ +
+ +
+
+
+ + +
+
+
+ {stats.playersExposed.toLocaleString()} +
+
Players Exposed
+
+ +
+
+ {stats.flashCrimes.toLocaleString()} +
+
+ Flash Crimes Documented +
+
+ +
+
+ {stats.flashbangsAnalyzed.toLocaleString()}+ +
+
Flashbangs Analyzed
+
+
+ + + +
+
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 @@ + + +
+ +
+ + + + +
+ {#if player.avatarUrl} + Avatar for {player.name} + {: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 @@ + + +
+ +
+
+
+ + View all → + +
+ + +
+ + + + + + + + +
+
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} + + {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. +

+ + +
+ + + + + +
+ + + +
+
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 @@ + + +
{ + e.preventDefault(); + handleSubmit(); + }} + class="w-full max-w-2xl" +> +
+ +
+ +
+ + + +
+
+
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} + +{/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 -
+ + -

- teamflash.rip -

+ + -

- Track your performance, analyze matches, and finally learn - who keeps flashing their own team. -

- -

- "Where flash stats become flash shaming." -

- -
- - -
- - -
- {#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

-
- -
+ + - {#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} - - - - - - {/if} -
- - - {#if totalSlides > 1} -
- {#each Array(totalSlides) as _, i} - - {/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.map} -
- {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 -

-
- -
- -
-
-
-
-
-
-{/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. -

- -

- 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' } } },