strat-gameplay-webapp/frontend-sba/pages/index.vue
Cal Corum 2381456189 test: Skip unstable test suites
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 20:18:33 -06:00

187 lines
9.7 KiB
Vue
Executable File

<template>
<div>
<!-- Guest View: Landing Page -->
<div v-if="!authStore.isAuthenticated" class="min-h-screen bg-gradient-to-br from-blue-50 to-blue-100">
<!-- Hero Section -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16">
<div class="text-center">
<h1 class="text-5xl font-bold text-gray-900 mb-4">
Welcome to <span class="text-primary">SBa</span>
</h1>
<p class="text-xl text-gray-600 mb-8 max-w-2xl mx-auto">
Experience the thrill of Strat-O-Matic Baseball in real-time.
Manage your team, make strategic decisions, and compete with friends.
</p>
<NuxtLink
to="/auth/login"
class="inline-block px-8 py-4 bg-primary hover:bg-blue-700 text-white font-bold text-lg rounded-lg shadow-lg hover:shadow-xl transition transform hover:-translate-y-0.5"
>
Sign in with Discord
</NuxtLink>
</div>
<!-- Features Grid -->
<div class="mt-24 grid md:grid-cols-3 gap-8">
<div class="bg-white rounded-lg shadow-md p-8 text-center hover:shadow-lg transition">
<div class="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">Real-Time Gameplay</h3>
<p class="text-gray-600">
Live WebSocket updates keep you in sync with every pitch, swing, and strategic decision.
</p>
</div>
<div class="bg-white rounded-lg shadow-md p-8 text-center hover:shadow-lg transition">
<div class="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
</svg>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">Strategic Depth</h3>
<p class="text-gray-600">
Defensive positioning, substitutions, and tactical decisions - you control every aspect.
</p>
</div>
<div class="bg-white rounded-lg shadow-md p-8 text-center hover:shadow-lg transition">
<div class="w-16 h-16 bg-primary/10 rounded-full flex items-center justify-center mx-auto mb-4">
<svg xmlns="http://www.w3.org/2000/svg" class="h-8 w-8 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
</svg>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">Multiplayer</h3>
<p class="text-gray-600">
Compete head-to-head with friends or challenge the AI opponent.
</p>
</div>
</div>
</div>
</div>
<!-- Authenticated View: Dashboard -->
<div v-else class="min-h-screen">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Welcome Header -->
<div class="mb-8">
<h1 class="text-3xl font-bold text-gray-900 mb-2">
Welcome back, {{ authStore.currentUser?.username || 'Manager' }}!
</h1>
<p class="text-gray-600">
Ready to lead your team to victory?
</p>
</div>
<!-- Quick Actions -->
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6 mb-12">
<NuxtLink
to="/games/create"
class="bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition cursor-pointer border-2 border-transparent hover:border-primary"
>
<div class="flex items-center justify-between mb-4">
<div class="w-12 h-12 bg-primary/10 rounded-lg flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-primary" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4" />
</svg>
</div>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-1">New Game</h3>
<p class="text-sm text-gray-600">Start a fresh matchup</p>
</NuxtLink>
<NuxtLink
to="/games"
class="bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition cursor-pointer border-2 border-transparent hover:border-primary"
>
<div class="flex items-center justify-between mb-4">
<div class="w-12 h-12 bg-green-100 rounded-lg flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
</svg>
</div>
<span class="text-2xl font-bold text-gray-900">0</span>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-1">Active Games</h3>
<p class="text-sm text-gray-600">Your ongoing matches</p>
</NuxtLink>
<div class="bg-white rounded-lg shadow-md p-6">
<div class="flex items-center justify-between mb-4">
<div class="w-12 h-12 bg-yellow-100 rounded-lg flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-yellow-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" />
</svg>
</div>
<span class="text-2xl font-bold text-gray-900">0</span>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-1">Wins</h3>
<p class="text-sm text-gray-600">Season record</p>
</div>
<div class="bg-white rounded-lg shadow-md p-6">
<div class="flex items-center justify-between mb-4">
<div class="w-12 h-12 bg-blue-100 rounded-lg flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 text-blue-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<span class="text-2xl font-bold text-gray-900">-</span>
</div>
<h3 class="text-lg font-bold text-gray-900 mb-1">Last Played</h3>
<p class="text-sm text-gray-600">Never</p>
</div>
</div>
<!-- Recent Activity / Getting Started -->
<div class="bg-white rounded-lg shadow-md p-8">
<h2 class="text-2xl font-bold text-gray-900 mb-6">Getting Started</h2>
<div class="space-y-4">
<div class="flex items-start">
<div class="flex-shrink-0 w-8 h-8 bg-primary text-white rounded-full flex items-center justify-center font-bold">
1
</div>
<div class="ml-4">
<h3 class="font-semibold text-gray-900">Create Your First Game</h3>
<p class="text-gray-600">Click "New Game" to set up your first matchup and choose your teams.</p>
</div>
</div>
<div class="flex items-start">
<div class="flex-shrink-0 w-8 h-8 bg-gray-300 text-white rounded-full flex items-center justify-center font-bold">
2
</div>
<div class="ml-4">
<h3 class="font-semibold text-gray-900">Make Strategic Decisions</h3>
<p class="text-gray-600">Control defensive positioning, batting order, and substitutions throughout the game.</p>
</div>
</div>
<div class="flex items-start">
<div class="flex-shrink-0 w-8 h-8 bg-gray-300 text-white rounded-full flex items-center justify-center font-bold">
3
</div>
<div class="ml-4">
<h3 class="font-semibold text-gray-900">Watch Your Team Win</h3>
<p class="text-gray-600">Follow the action in real-time as plays unfold and your strategy comes to life.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { useAuthStore } from '~/store/auth'
const authStore = useAuthStore()
// Initialize auth from localStorage on client-side
onMounted(() => {
if (import.meta.client) {
authStore.initializeAuth()
}
})
</script>