feat: Rebrand from CS2.WTF to teamflash.rip with full pun mode

Complete site rebrand with flash-themed humor throughout:

- Update logo to "team" + "flash.rip" two-color design
- Add flash-themed error pages (404 = "You've Been Full-Blind")
- Revamp homepage hero with "Stop Flashing Your Teammates" tagline
- Update flash statistics page with playful labels ("Friendly Crimes", "Self-Inflicted L")
- Add loading messages store with flash-themed text
- Update all page meta titles and descriptions
- Update sitemap.xml and robots.txt with new domain
- Update package.json name and description

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-07 15:30:41 +01:00
parent 49033560fa
commit 3383302225
25 changed files with 208 additions and 112 deletions

View File

@@ -1,7 +1,7 @@
{ {
"name": "cs2wtf", "name": "teamflash-rip",
"version": "2.0.0", "version": "2.0.0",
"description": "Statistics for CS2 matchmaking matches", "description": "Stop flashing your teammates. CS2 match statistics and analysis.",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@@ -34,10 +34,10 @@
<!-- Brand --> <!-- Brand -->
<div class="md:col-span-1"> <div class="md:col-span-1">
<a href="/" class="mb-4 inline-block text-2xl font-bold"> <a href="/" class="mb-4 inline-block text-2xl font-bold">
<span class="text-primary">CS2</span><span class="text-secondary">.WTF</span> <span class="text-primary">team</span><span class="text-secondary">flash.rip</span>
</a> </a>
<p class="mb-4 text-sm text-base-content/60"> <p class="mb-4 text-sm text-base-content/60">
Statistics for CS2 matchmaking matches. Free and open source. Stop flashing your teammates. Free and open source.
</p> </p>
<div class="flex gap-3"> <div class="flex gap-3">
<a <a
@@ -121,11 +121,11 @@
<!-- Bottom --> <!-- Bottom -->
<div class="mt-12 border-t border-base-300 pt-8 text-center text-sm text-base-content/60"> <div class="mt-12 border-t border-base-300 pt-8 text-center text-sm text-base-content/60">
<p> <p>
© {currentYear} CSGOW.TF Team. Licensed under © {currentYear} teamflash.rip Team. Licensed under
<a href="/license" class="hover:text-primary">GPL-3.0</a> <a href="/license" class="hover:text-primary">GPL-3.0</a>
</p> </p>
<p class="mt-2"> <p class="mt-2">
Made with <Heart class="inline h-4 w-4 text-error" /> by the community, for the community. Made with <Heart class="inline h-4 w-4 text-error" /> by players who are tired of being flashed.
</p> </p>
</div> </div>
</div> </div>

View File

@@ -17,9 +17,9 @@
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="flex h-16 items-center justify-between"> <div class="flex h-16 items-center justify-between">
<!-- Logo --> <!-- Logo -->
<a href="/" class="transition-transform hover:scale-105" aria-label="CS2.WTF Home"> <a href="/" class="transition-transform hover:scale-105" aria-label="teamflash.rip Home">
<h1 class="text-2xl font-bold"> <h1 class="text-2xl font-bold">
<span class="text-primary">CS2</span><span class="text-secondary">.WTF</span> <span class="text-primary">team</span><span class="text-secondary">flash.rip</span>
</h1> </h1>
</a> </a>

View File

@@ -0,0 +1,37 @@
/**
* Collection of flash-themed loading messages for the UI
* Because waiting shouldn't be boring when you're exposing flash criminals
*/
export const flashLoadingMessages = [
'Looking through the white screen...',
'Waiting for vision to return...',
'Parsing flashbang trajectories...',
'Counting team flashes (this might take a while)...',
'Reviewing the tape for flash crimes...',
'Loading the wall of shame...',
'Calculating flash guilt percentages...',
'Scanning for pop flash perpetrators...',
'Analyzing who ruined the retake...',
'Determining flash assist eligibility...',
'Cross-referencing teammate blind reports...',
'Compiling evidence for the post-game argument...'
];
/**
* Get a random flash-themed loading message
*/
export function getRandomLoadingMessage(): string {
const index = Math.floor(Math.random() * flashLoadingMessages.length);
return flashLoadingMessages[index] as string;
}
/**
* Flash-themed error messages for various scenarios
*/
export const flashErrorMessages = {
networkError: "Connection got flashed. Can't see the server right now.",
timeout: 'Request timed out. Server is still rubbing its eyes.',
notFound: "Data got pop-flashed out of existence. We can't find it.",
serverError: 'Server caught a flashbang to the face. Please wait.',
parseError: 'Failed to parse the data. Too many flashes, not enough pixels.'
};

View File

@@ -2,47 +2,78 @@
import { page } from '$app/stores'; import { page } from '$app/stores';
import Button from '$lib/components/ui/Button.svelte'; import Button from '$lib/components/ui/Button.svelte';
import Card from '$lib/components/ui/Card.svelte'; import Card from '$lib/components/ui/Card.svelte';
import { Home, ArrowLeft } from 'lucide-svelte'; import { Home, ArrowLeft, Zap } from 'lucide-svelte';
// Get error information // Get error information
const error = $page.error; const error = $page.error;
const status = $page.status; const status = $page.status;
// Determine error message // Flash-themed error messages
const getErrorMessage = (status: number): string => { const getErrorMessage = (status: number): string => {
switch (status) { switch (status) {
case 404: case 404:
return "We couldn't find the page you're looking for."; return "This page got pop-flashed out of existence. Even we can't see it.";
case 500: case 500:
return 'Something went wrong on our end. Please try again later.'; return "The server got flashbanged. It's currently rubbing its eyes. Please wait.";
case 503: case 503:
return 'Service temporarily unavailable. Please check back soon.'; return 'Service temporarily blinded. Someone threw a flash into the server room.';
case 400:
return 'Bad request? More like bad flash lineup. Try again.';
case 401:
return "You need to authenticate. Unlike flashes, you can't just walk through this.";
case 403:
return 'Forbidden. This area is as off-limits as throwing flashes at your own spawn.';
default: default:
return 'An unexpected error occurred.'; return 'Something went white. Very white. Flash-in-the-face white.';
} }
}; };
const getErrorTitle = (status: number): string => { const getErrorTitle = (status: number): string => {
switch (status) { switch (status) {
case 404: case 404:
return 'Page Not Found'; return "You've Been Full-Blind";
case 500: case 500:
return 'Internal Server Error'; return 'Server Got Flashbanged';
case 503: case 503:
return 'Service Unavailable'; return 'Temporarily Blinded';
case 400:
return 'Bad Flash Lineup';
case 401:
return 'Flash Authentication Required';
case 403:
return 'Flash Access Denied';
default: default:
return 'Error'; return 'Unexpected Flash';
} }
}; };
// Rotating flash puns for extra fun
const flashPuns = [
"At least this error didn't team flash you.",
"Error logging: You've been added to the wall of shame.",
'Did you try turning off the flashbang and turning it back on?',
'This error is brighter than your flash lineups.',
'404: Your aim, also not found.',
"The page didn't peek, but got flashed anyway.",
'Server.exe has stopped responding to flash inputs.',
'Have you considered not running into your own flashes?'
];
const randomPun = flashPuns[Math.floor(Math.random() * flashPuns.length)];
</script> </script>
<svelte:head> <svelte:head>
<title>{status} - {getErrorTitle(status)} | CS2.WTF</title> <title>{status} - {getErrorTitle(status)} | teamflash.rip</title>
</svelte:head> </svelte:head>
<div class="container mx-auto flex min-h-[60vh] items-center justify-center px-4 py-16"> <div class="container mx-auto flex min-h-[60vh] items-center justify-center px-4 py-16">
<Card padding="lg" class="w-full max-w-2xl"> <Card padding="lg" class="w-full max-w-2xl">
<div class="text-center"> <div class="text-center">
<!-- Flash Icon -->
<div class="mb-4 flex justify-center">
<Zap class="h-16 w-16 animate-pulse text-warning" />
</div>
<!-- Error Code --> <!-- Error Code -->
<div class="mb-4 text-8xl font-bold text-primary"> <div class="mb-4 text-8xl font-bold text-primary">
{status} {status}
@@ -54,15 +85,20 @@
</h1> </h1>
<!-- Error Message --> <!-- Error Message -->
<p class="mb-8 text-lg text-base-content/70"> <p class="mb-4 text-lg text-base-content/70">
{getErrorMessage(status)} {getErrorMessage(status)}
</p> </p>
<!-- Random Flash Pun -->
<p class="mb-8 text-sm italic text-base-content/50">
"{randomPun}"
</p>
<!-- Debug Info (only in development) --> <!-- Debug Info (only in development) -->
{#if import.meta.env?.DEV && error} {#if import.meta.env?.DEV && error}
<div class="mb-8 rounded-lg bg-base-300 p-4 text-left"> <div class="mb-8 rounded-lg bg-base-300 p-4 text-left">
<p class="mb-2 font-mono text-sm text-error"> <p class="mb-2 font-mono text-sm text-error">
<strong>Debug Info:</strong> <strong>Flash Report (Debug):</strong>
</p> </p>
<pre class="overflow-x-auto text-xs text-base-content/80">{JSON.stringify( <pre class="overflow-x-auto text-xs text-base-content/80">{JSON.stringify(
error, error,
@@ -76,21 +112,22 @@
<div class="flex flex-col justify-center gap-4 sm:flex-row"> <div class="flex flex-col justify-center gap-4 sm:flex-row">
<Button variant="secondary" href="javascript:history.back()"> <Button variant="secondary" href="javascript:history.back()">
<ArrowLeft class="mr-2 h-5 w-5" /> <ArrowLeft class="mr-2 h-5 w-5" />
Go Back Peek Again
</Button> </Button>
<Button variant="primary" href="/"> <Button variant="primary" href="/">
<Home class="mr-2 h-5 w-5" /> <Home class="mr-2 h-5 w-5" />
Go Home Return to Spawn
</Button> </Button>
</div> </div>
<!-- Help Text --> <!-- Help Text -->
<p class="mt-8 text-sm text-base-content/50"> <p class="mt-8 text-sm text-base-content/50">
If this problem persists, please If this flash keeps happening, please
<a href="https://somegit.dev/CSGOWTF/csgowtf/issues" class="link-hover link text-primary"> <a href="https://somegit.dev/CSGOWTF/csgowtf/issues" class="link-hover link text-primary">
report it on GitHub report it on GitHub
</a> </a>
(we won't flash you, we promise)
</p> </p>
</div> </div>
</Card> </Card>

View File

@@ -48,9 +48,9 @@
}); });
const stats = [ const stats = [
{ icon: Users, label: 'Players Tracked', value: '1.2M+' }, { icon: Users, label: 'Players Exposed', value: '1.2M+' },
{ icon: TrendingUp, label: 'Matches Analyzed', value: '500K+' }, { icon: TrendingUp, label: 'Flash Crimes Documented', value: '500K+' },
{ icon: Zap, label: 'Demos Parsed', value: '2M+' } { icon: Zap, label: 'Flashbangs Analyzed', value: '2M+' }
]; ];
// Carousel state // Carousel state
@@ -147,26 +147,30 @@
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="mx-auto max-w-4xl text-center"> <div class="mx-auto max-w-4xl text-center">
<div class="mb-6"> <div class="mb-6">
<Badge variant="info" size="md">🎮 Now supporting CS2</Badge> <Badge variant="warning" size="md">STOP FLASHING YOUR TEAMMATES</Badge>
</div> </div>
<h1 class="mb-6 text-6xl font-bold leading-tight md:text-7xl"> <h1 class="mb-6 text-6xl font-bold leading-tight md:text-7xl">
<span class="text-primary">CS2</span><span class="text-secondary">.WTF</span> <span class="text-primary">team</span><span class="text-secondary">flash.rip</span>
</h1> </h1>
<p class="mb-8 text-xl text-base-content/70 md:text-2xl"> <p class="mb-4 text-xl text-base-content/70 md:text-2xl">
Track your performance, analyze matches, and improve your game with Track your performance, analyze matches, and finally learn
<span class="font-semibold text-primary">detailed statistics</span> and insights. <span class="font-semibold text-error">who keeps flashing their own team</span>.
</p>
<p class="mb-8 text-lg italic text-base-content/60">
"Where flash stats become flash shaming."
</p> </p>
<div class="mb-12 flex flex-col justify-center gap-4 sm:flex-row"> <div class="mb-12 flex flex-col justify-center gap-4 sm:flex-row">
<Button variant="primary" size="lg" href="/matches"> <Button variant="primary" size="lg" href="/matches">
<Search class="mr-2 h-5 w-5" /> <Search class="mr-2 h-5 w-5" />
Browse Matches Find Flash Criminals
</Button> </Button>
<Button variant="secondary" size="lg" href="/player/76561198012345678"> <Button variant="secondary" size="lg" href="/player/76561198012345678">
<Users class="mr-2 h-5 w-5" /> <Users class="mr-2 h-5 w-5" />
View Demo Profile Check Your Shame Stats
</Button> </Button>
</div> </div>
@@ -376,8 +380,8 @@
<section class="border-t border-base-300 bg-base-200 py-16"> <section class="border-t border-base-300 bg-base-200 py-16">
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<div class="mb-12 text-center"> <div class="mb-12 text-center">
<h2 class="text-3xl font-bold text-base-content">Why CS2.WTF?</h2> <h2 class="text-3xl font-bold text-base-content">Why teamflash.rip?</h2>
<p class="mt-2 text-base-content/60">Everything you need to analyze your CS2 performance</p> <p class="mt-2 text-base-content/60">Because someone needs to track these flash crimes</p>
</div> </div>
<div class="grid gap-8 md:grid-cols-2 lg:grid-cols-3"> <div class="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
@@ -385,10 +389,10 @@
<div class="mb-4 inline-flex rounded-lg bg-primary/10 p-3"> <div class="mb-4 inline-flex rounded-lg bg-primary/10 p-3">
<TrendingUp class="h-6 w-6 text-primary" /> <TrendingUp class="h-6 w-6 text-primary" />
</div> </div>
<h3 class="mb-2 text-xl font-semibold">Detailed Statistics</h3> <h3 class="mb-2 text-xl font-semibold">Flash Forensics</h3>
<p class="text-base-content/60"> <p class="text-base-content/60">
Track K/D, ADR, HS%, KAST, and more. Analyze your performance round-by-round with Track enemies blinded, teammates betrayed, and self-inflicted Ls. We see through the
comprehensive stats. white.
</p> </p>
</Card> </Card>
@@ -396,9 +400,9 @@
<div class="mb-4 inline-flex rounded-lg bg-secondary/10 p-3"> <div class="mb-4 inline-flex rounded-lg bg-secondary/10 p-3">
<Zap class="h-6 w-6 text-secondary" /> <Zap class="h-6 w-6 text-secondary" />
</div> </div>
<h3 class="mb-2 text-xl font-semibold">Economy Tracking</h3> <h3 class="mb-2 text-xl font-semibold">Shame Statistics</h3>
<p class="text-base-content/60"> <p class="text-base-content/60">
Understand money management with round-by-round economy analysis and spending patterns. See exactly who threw that flash into your team's face. Evidence-based blame assignment.
</p> </p>
</Card> </Card>
@@ -406,10 +410,10 @@
<div class="mb-4 inline-flex rounded-lg bg-info/10 p-3"> <div class="mb-4 inline-flex rounded-lg bg-info/10 p-3">
<Users class="h-6 w-6 text-info" /> <Users class="h-6 w-6 text-info" />
</div> </div>
<h3 class="mb-2 text-xl font-semibold">Player Profiles</h3> <h3 class="mb-2 text-xl font-semibold">Hall of Shame</h3>
<p class="text-base-content/60"> <p class="text-base-content/60">
View comprehensive player profiles with match history, favorite maps, and performance View comprehensive player profiles with flash history. Know who to mute before the match
trends. starts.
</p> </p>
</Card> </Card>
</div> </div>
@@ -421,12 +425,16 @@
<div class="container mx-auto px-4"> <div class="container mx-auto px-4">
<Card variant="elevated" padding="lg"> <Card variant="elevated" padding="lg">
<div class="text-center"> <div class="text-center">
<h2 class="mb-4 text-3xl font-bold text-base-content">Ready to improve your game?</h2> <h2 class="mb-4 text-3xl font-bold text-base-content">
Ready to expose the flash criminals?
</h2>
<p class="mb-8 text-lg text-base-content/70"> <p class="mb-8 text-lg text-base-content/70">
Start tracking your CS2 matches and get insights that help you rank up. Start tracking your CS2 matches and finally have evidence for the post-game arguments.
</p> </p>
<Button variant="primary" size="lg" href="/matches">Get Started - It's Free</Button> <Button variant="primary" size="lg" href="/matches">Get Started - It's Free</Button>
<p class="mt-4 text-sm text-base-content/50">Free and open source. No signup required.</p> <p class="mt-4 text-sm text-base-content/50">
Free and open source. No signup required. Full flash transparency.
</p>
</div> </div>
</Card> </Card>
</div> </div>

View File

@@ -32,9 +32,9 @@ export const load: PageLoad = async ({ parent }) => {
mapStats, // For most played maps pie chart mapStats, // For most played maps pie chart
totalMatchesAnalyzed: allMatches.length, totalMatchesAnalyzed: allMatches.length,
meta: { meta: {
title: 'CS2.WTF - Statistics for CS2 Matchmaking', title: 'teamflash.rip - Stop Flashing Your Teammates',
description: description:
'Track your CS2 performance, analyze matches, and improve your game with detailed statistics and insights.' 'Track your CS2 performance, analyze matches, and finally learn to stop team flashing. Detailed flash statistics, blinding insights, and more.'
} }
}; };
} catch (error) { } catch (error) {
@@ -50,9 +50,9 @@ export const load: PageLoad = async ({ parent }) => {
mapStats: [], mapStats: [],
totalMatchesAnalyzed: 0, totalMatchesAnalyzed: 0,
meta: { meta: {
title: 'CS2.WTF - Statistics for CS2 Matchmaking', title: 'teamflash.rip - Stop Flashing Your Teammates',
description: description:
'Track your CS2 performance, analyze matches, and improve your game with detailed statistics and insights.' 'Track your CS2 performance, analyze matches, and finally learn to stop team flashing. Detailed flash statistics, blinding insights, and more.'
} }
}; };
} }

View File

@@ -1,26 +1,26 @@
<script lang="ts"> <script lang="ts">
import { Github, Heart, Code } from 'lucide-svelte'; import { Github, Heart, Code, Zap } from 'lucide-svelte';
import Card from '$lib/components/ui/Card.svelte'; import Card from '$lib/components/ui/Card.svelte';
import Button from '$lib/components/ui/Button.svelte'; import Button from '$lib/components/ui/Button.svelte';
</script> </script>
<svelte:head> <svelte:head>
<title>About - CS2.WTF</title> <title>About - teamflash.rip</title>
</svelte:head> </svelte:head>
<div class="container mx-auto max-w-4xl px-4 py-12"> <div class="container mx-auto max-w-4xl px-4 py-12">
<h1 class="mb-8 text-4xl font-bold">About CS2.WTF</h1> <h1 class="mb-8 text-4xl font-bold">About teamflash.rip</h1>
<Card padding="lg" class="mb-8"> <Card padding="lg" class="mb-8">
<h2 class="mb-4 text-2xl font-semibold">Our Mission</h2> <h2 class="mb-4 text-2xl font-semibold">Our Mission</h2>
<p class="mb-4 text-base-content/80"> <p class="mb-4 text-base-content/80">
CS2.WTF is a free and open-source platform for analyzing Counter-Strike 2 matchmaking matches. teamflash.rip is a free and open-source platform for analyzing Counter-Strike 2 matchmaking
We provide detailed statistics, performance insights, and tools to help players improve their matches. We're on a mission to expose every teammate who ever threw a flashbang backwards.
game.
</p> </p>
<p class="text-base-content/80"> <p class="text-base-content/80">
Originally created for CS:GO, we've completely rewritten the platform to support CS2 with Originally created for CS:GO, we've completely rewritten the platform to support CS2 with
modern technologies and enhanced features. modern technologies and the ability to track exactly who ruined your retake with a poorly
timed flash.
</p> </p>
</Card> </Card>
@@ -37,15 +37,15 @@
<Heart class="mb-3 h-8 w-8 text-error" /> <Heart class="mb-3 h-8 w-8 text-error" />
<h3 class="mb-2 text-xl font-semibold">Free Forever</h3> <h3 class="mb-2 text-xl font-semibold">Free Forever</h3>
<p class="text-sm text-base-content/70"> <p class="text-sm text-base-content/70">
No paywalls, no premium features. Everyone gets full access to all statistics. No paywalls, no premium features. Everyone gets full access to all flash crime statistics.
</p> </p>
</Card> </Card>
<Card padding="lg"> <Card padding="lg">
<Github class="mb-3 h-8 w-8 text-info" /> <Zap class="mb-3 h-8 w-8 text-warning" />
<h3 class="mb-2 text-xl font-semibold">Community Driven</h3> <h3 class="mb-2 text-xl font-semibold">Community Driven</h3>
<p class="text-sm text-base-content/70"> <p class="text-sm text-base-content/70">
Contributions welcome! Help us make CS2.WTF better for everyone. Contributions welcome! Help us shame more team-flashers together.
</p> </p>
</Card> </Card>
</div> </div>
@@ -68,7 +68,7 @@
<li>• Go + Gin Framework</li> <li>• Go + Gin Framework</li>
<li>• PostgreSQL Database</li> <li>• PostgreSQL Database</li>
<li>• Redis Cache</li> <li>• Redis Cache</li>
<li>• Demo Parser</li> <li>• Demo Parser (flash crime evidence collector)</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@@ -6,9 +6,9 @@ import type { PageLoad } from './$types';
export const load: PageLoad = async () => { export const load: PageLoad = async () => {
return { return {
meta: { meta: {
title: 'About CS2.WTF', title: 'About teamflash.rip - We See Through the White',
description: description:
'Learn about CS2.WTF, an open-source platform for analyzing Counter-Strike 2 matchmaking matches.' 'Learn about teamflash.rip, an open-source platform for exposing flashbang crimes in Counter-Strike 2.'
} }
}; };
}; };

View File

@@ -38,7 +38,7 @@ export const GET: RequestHandler = async ({ params, url, request }) => {
headers: { headers: {
// Forward relevant headers // Forward relevant headers
Accept: request.headers.get('Accept') || 'application/json', Accept: request.headers.get('Accept') || 'application/json',
'User-Agent': 'CS2.WTF Frontend' 'User-Agent': 'teamflash.rip Frontend'
} }
}); });
@@ -87,7 +87,7 @@ export const POST: RequestHandler = async ({ params, url, request }) => {
headers: { headers: {
'Content-Type': request.headers.get('Content-Type') || 'application/json', 'Content-Type': request.headers.get('Content-Type') || 'application/json',
Accept: request.headers.get('Accept') || 'application/json', Accept: request.headers.get('Accept') || 'application/json',
'User-Agent': 'CS2.WTF Frontend' 'User-Agent': 'teamflash.rip Frontend'
}, },
body body
}); });
@@ -133,7 +133,7 @@ export const DELETE: RequestHandler = async ({ params, url, request }) => {
method: 'DELETE', method: 'DELETE',
headers: { headers: {
Accept: request.headers.get('Accept') || 'application/json', Accept: request.headers.get('Accept') || 'application/json',
'User-Agent': 'CS2.WTF Frontend' 'User-Agent': 'teamflash.rip Frontend'
} }
}); });

View File

@@ -8,7 +8,7 @@ export const load: PageLoad = async ({ parent }) => {
match, match,
chatData: chat, chatData: chat,
meta: { meta: {
title: `${match.map || 'Match'} Chat - Match ${match.match_id} - CS2.WTF` title: `${match.map || 'Match'} Chat - Match ${match.match_id} - teamflash.rip`
} }
}; };
}; };

View File

@@ -152,7 +152,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Damage Analysis - CS2.WTF</title> <title>Damage Analysis - teamflash.rip</title>
</svelte:head> </svelte:head>
{#if !hasPlayerData} {#if !hasPlayerData}

View File

@@ -258,7 +258,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Match Details - CS2.WTF</title> <title>Match Details - teamflash.rip</title>
</svelte:head> </svelte:head>
{#if !hasPlayerData} {#if !hasPlayerData}

View File

@@ -8,7 +8,7 @@ export const load: PageLoad = async ({ parent }) => {
match, match,
weaponsData: weapons, weaponsData: weapons,
meta: { meta: {
title: `${match.map || 'Match'} Details - Match ${match.match_id} - CS2.WTF` title: `${match.map || 'Match'} Details - Match ${match.match_id} - teamflash.rip`
} }
}; };
}; };

View File

@@ -8,7 +8,7 @@ export const load: PageLoad = async ({ parent }) => {
match, match,
roundsData: rounds, roundsData: rounds,
meta: { meta: {
title: `${match.map || 'Match'} Economy - Match ${match.match_id} - CS2.WTF` title: `${match.map || 'Match'} Economy - Match ${match.match_id} - teamflash.rip`
} }
}; };
}; };

View File

@@ -64,17 +64,17 @@
} }
const columns = [ const columns = [
{ key: 'name' as const, label: 'Player', sortable: true, width: '200px' }, { key: 'name' as const, label: 'Flashbang Criminal', sortable: true, width: '200px' },
{ {
key: 'enemies_blinded' as const, key: 'enemies_blinded' as const,
label: 'Enemies Blinded', label: 'Victims (Correct)',
sortable: true, sortable: true,
align: 'center' as const, align: 'center' as const,
width: '150px' width: '150px'
}, },
{ {
key: 'avg_blind_duration' as const, key: 'avg_blind_duration' as const,
label: 'Avg Duration (s)', label: 'Avg Suffering (s)',
sortable: true, sortable: true,
align: 'center' as const, align: 'center' as const,
format: (value: string | number | boolean, _row: FlashStat) => `${value as string}s`, format: (value: string | number | boolean, _row: FlashStat) => `${value as string}s`,
@@ -82,21 +82,21 @@
}, },
{ {
key: 'flash_assists' as const, key: 'flash_assists' as const,
label: 'Flash Assists', label: 'Actually Useful',
sortable: true, sortable: true,
align: 'center' as const, align: 'center' as const,
width: '130px' width: '130px'
}, },
{ {
key: 'teammates_blinded' as const, key: 'teammates_blinded' as const,
label: 'Team Flashed', label: 'Friendly Crimes',
sortable: true, sortable: true,
align: 'center' as const, align: 'center' as const,
width: '130px' width: '130px'
}, },
{ {
key: 'self_blinded' as const, key: 'self_blinded' as const,
label: 'Self Flashed', label: 'Self-Inflicted L',
sortable: true, sortable: true,
align: 'center' as const, align: 'center' as const,
width: '130px' width: '130px'
@@ -112,7 +112,8 @@
<div class="text-3xl font-bold text-base-content"> <div class="text-3xl font-bold text-base-content">
{teamATotals.total_enemies_blinded + teamBTotals.total_enemies_blinded} {teamATotals.total_enemies_blinded + teamBTotals.total_enemies_blinded}
</div> </div>
<div class="text-sm text-base-content/60">Total Enemies Blinded</div> <div class="text-sm text-base-content/60">Enemies Successfully Blinded</div>
<div class="mt-1 text-xs text-success">The correct way to use flashes</div>
</Card> </Card>
<Card padding="lg"> <Card padding="lg">
@@ -120,17 +121,17 @@
<div class="text-3xl font-bold text-base-content"> <div class="text-3xl font-bold text-base-content">
{teamATotals.total_flash_assists + teamBTotals.total_flash_assists} {teamATotals.total_flash_assists + teamBTotals.total_flash_assists}
</div> </div>
<div class="text-sm text-base-content/60">Total Flash Assists</div> <div class="text-sm text-base-content/60">Flash Assists</div>
<div class="mt-1 text-xs text-success">Teamwork makes the dream work</div>
</Card> </Card>
<Card padding="lg"> <Card padding="lg">
<Users class="mb-2 h-8 w-8 text-info" /> <Users class="mb-2 h-8 w-8 text-error" />
<div class="text-3xl font-bold text-base-content"> <div class="text-3xl font-bold text-base-content">
{((teamATotals.total_enemy_blind_time + teamBTotals.total_enemy_blind_time) / 1000).toFixed( {flashStats.reduce((sum, p) => sum + p.teammates_blinded, 0)}
1
)}s
</div> </div>
<div class="text-sm text-base-content/60">Total Enemy Blind Time</div> <div class="text-sm text-base-content/60">Teammates Betrayed</div>
<div class="mt-1 text-xs text-error">These players owe apologies</div>
</Card> </Card>
</div> </div>
@@ -176,9 +177,9 @@
<!-- Flash Effectiveness Leaderboard --> <!-- Flash Effectiveness Leaderboard -->
<Card padding="none"> <Card padding="none">
<div class="p-6"> <div class="p-6">
<h2 class="text-2xl font-bold text-base-content">Flash Effectiveness Leaderboard</h2> <h2 class="text-2xl font-bold text-base-content">Flash Hall of Fame (and Shame)</h2>
<p class="mt-1 text-sm text-base-content/60"> <p class="mt-1 text-sm text-base-content/60">
Ranked by total enemies blinded during the match Ranked by enemies blinded. Teammates blinded is tracked for... scientific purposes.
</p> </p>
</div> </div>
@@ -204,18 +205,28 @@
<!-- Info Box --> <!-- Info Box -->
<Card padding="lg" variant="elevated"> <Card padding="lg" variant="elevated">
<div class="text-sm text-base-content/60"> <div class="text-sm text-base-content/60">
<p class="mb-2 font-semibold">Understanding Flash Stats:</p> <p class="mb-2 font-semibold">Flash Stats Explained (For the Visually Challenged):</p>
<ul class="list-inside list-disc space-y-1"> <ul class="list-inside list-disc space-y-1">
<li><strong>Enemies Blinded:</strong> Total number of enemy players flashed</li> <li><strong>Victims (Correct):</strong> Enemies you blinded - the RIGHT people to flash</li>
<li> <li>
<strong>Avg Duration:</strong> Average time enemies were blinded per flash (in seconds) <strong>Avg Suffering:</strong> Average time enemies spent regretting their peek
</li> </li>
<li> <li>
<strong>Flash Assists:</strong> Enemies killed by teammates while blinded by your flash <strong>Actually Useful:</strong> Enemies killed by teammates while your flash was doing its
job
</li>
<li>
<strong>Friendly Crimes:</strong> Number of times you betrayed your own team - shame counter
</li>
<li>
<strong>Self-Inflicted L:</strong> Times you stared at your own flashbang like a moth to a
flame
</li> </li>
<li><strong>Team Flashed:</strong> Number of times you accidentally flashed teammates</li>
<li><strong>Self Flashed:</strong> Number of times you flashed yourself</li>
</ul> </ul>
<p class="mt-4 text-xs italic">
Remember: If your "Friendly Crimes" is higher than "Victims (Correct)", you might want to
reconsider your flash lineups.
</p>
</div> </div>
</Card> </Card>
</div> </div>

View File

@@ -189,7 +189,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Match Weapons - CS2.WTF</title> <title>Match Weapons - teamflash.rip</title>
</svelte:head> </svelte:head>
{#if !hasWeaponsData} {#if !hasWeaponsData}

View File

@@ -434,7 +434,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Matches - CS2.WTF</title> <title>Matches - teamflash.rip</title>
</svelte:head> </svelte:head>
<!-- Export Toast Notification --> <!-- Export Toast Notification -->

View File

@@ -27,8 +27,9 @@ export const load: PageLoad = async ({ url }) => {
playerId playerId
}, },
meta: { meta: {
title: 'Browse Matches - CS2.WTF', title: 'Browse Matches - teamflash.rip',
description: 'Browse and search through CS2 matchmaking games with detailed filters.' description:
'Browse CS2 matches and see who is blinding the competition (and their teammates).'
} }
}; };
} catch (error) { } catch (error) {
@@ -44,8 +45,9 @@ export const load: PageLoad = async ({ url }) => {
nextPageTime: undefined, nextPageTime: undefined,
filters: { map, playerId }, filters: { map, playerId },
meta: { meta: {
title: 'Browse Matches - CS2.WTF', title: 'Browse Matches - teamflash.rip',
description: 'Browse and search through CS2 matchmaking games with detailed filters.' description:
'Browse CS2 matches and see who is blinding the competition (and their teammates).'
} }
}; };
} }

View File

@@ -53,8 +53,8 @@ export const load: PageLoad = async ({ params }) => {
recentMatches: matchesData.matches.slice(0, 4), // Show 4 in recent matches section recentMatches: matchesData.matches.slice(0, 4), // Show 4 in recent matches section
playerStats, // Full stats for charts playerStats, // Full stats for charts
meta: { meta: {
title: `${profile.name} - Player Profile | CS2.WTF`, title: `${profile.name} - Player Profile | teamflash.rip`,
description: `View ${profile.name}'s CS2 statistics, match history, and performance metrics.` description: `View ${profile.name}'s CS2 statistics, flash history, and how often they blind their own team.`
} }
}; };
} catch (err) { } catch (err) {

View File

@@ -5,7 +5,7 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Players - CS2.WTF</title> <title>Players - teamflash.rip</title>
</svelte:head> </svelte:head>
<div class="container mx-auto px-4 py-8"> <div class="container mx-auto px-4 py-8">

View File

@@ -7,8 +7,9 @@ import type { PageLoad } from './$types';
export const load: PageLoad = async () => { export const load: PageLoad = async () => {
return { return {
meta: { meta: {
title: 'Search Players - CS2.WTF', title: 'Search Players - teamflash.rip',
description: 'Search and browse CS2 player profiles with detailed statistics.' description:
'Search CS2 players and expose their flash crime history. Know who to mute before the match.'
} }
}; };
}; };

View File

@@ -4,10 +4,10 @@
</script> </script>
<svelte:head> <svelte:head>
<title>Privacy Policy | CS2.WTF</title> <title>Privacy Policy | teamflash.rip</title>
<meta <meta
name="description" name="description"
content="Privacy policy for CS2.WTF - Learn how we collect, use, and protect your data." content="Privacy policy for teamflash.rip - Learn how we collect, use, and protect your data."
/> />
</svelte:head> </svelte:head>
@@ -31,9 +31,9 @@
<Card padding="lg"> <Card padding="lg">
<h2 class="mb-4 text-2xl font-bold text-base-content">Introduction</h2> <h2 class="mb-4 text-2xl font-bold text-base-content">Introduction</h2>
<p class="text-base-content/80"> <p class="text-base-content/80">
CS2.WTF ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy teamflash.rip ("we", "our", or "us") is committed to protecting your privacy. This Privacy
explains how we collect, use, and safeguard your information when you use our CS2 match Policy explains how we collect, use, and safeguard your information when you use our CS2 match
statistics and analysis platform. statistics and flash crime analysis platform.
</p> </p>
</Card> </Card>
@@ -210,7 +210,7 @@
<!-- Footer Note --> <!-- Footer Note -->
<div class="text-center text-sm text-base-content/60"> <div class="text-center text-sm text-base-content/60">
<p> <p>
CS2.WTF is not affiliated with Valve Corporation or Counter-Strike. All trademarks are teamflash.rip is not affiliated with Valve Corporation or Counter-Strike. All trademarks are
property of their respective owners. property of their respective owners.
</p> </p>
</div> </div>

View File

@@ -1,6 +1,6 @@
import type { RequestHandler } from './$types'; import type { RequestHandler } from './$types';
const SITE_URL = 'https://cs2.wtf'; // Update with actual production URL const SITE_URL = 'https://teamflash.rip'; // Production URL
/** /**
* Generate robots.txt for search engine crawlers * Generate robots.txt for search engine crawlers

View File

@@ -1,7 +1,7 @@
import type { RequestHandler } from './$types'; import type { RequestHandler } from './$types';
import { matchesAPI } from '$lib/api/matches'; import { matchesAPI } from '$lib/api/matches';
const SITE_URL = 'https://cs2.wtf'; // Update with actual production URL const SITE_URL = 'https://teamflash.rip'; // Production URL
/** /**
* Generate XML sitemap for SEO * Generate XML sitemap for SEO