๐ฏ Introduction
In this article, I'll walk you through building a modern, accessible Tic-Tac-Toe game using React, Radix UI, and Tailwind CSS v4. What makes this project unique is the collaborative approach: I used Gemini CLI for the core game logic and Claude Sonnet 4 for UX design decisions. This demonstrates how AI can enhance different aspects of development.
๐ ๏ธ Tech Stack
- React 19 - Latest React with concurrent features
- TypeScript - Type safety and better DX
- Radix UI - Accessible, unstyled components
- Tailwind CSS v4 - Latest version with Vite plugin
- Vite - Fast build tool and dev server
๐ฎ The Game Logic (Powered by Gemini CLI)
Why Gemini CLI for Logic ?
I chose Gemini CLI for the game logic because it excels at:
- Algorithmic thinking - Perfect for game state management
- TypeScript patterns - Clean, type-safe code generation
- React hooks - Proper state management patterns
Core Game Implementation
// Game state management with TypeScript
type SquareValue = 'X' | 'O' | null;
interface BoardProps {
xIsNext: boolean;
squares: SquareValue[];
onPlay: (squares: SquareValue[]) => void;
winningSquares?: number[];
}
// AI opponent logic
useEffect(() => {
const winnerInfo = calculateWinner(squares);
if (xIsNext && !winnerInfo && squares.some(s => s === null)) {
const availableSquares = squares
.map((value, index) => (value === null ? index : null))
.filter((val): val is number => val !== null);
if (availableSquares.length > 0) {
const randomMove = availableSquares[Math.floor(Math.random() * availableSquares.length)];
const nextSquares = squares.slice();
nextSquares[randomMove] = 'X';
const timer = setTimeout(() => {
onPlay(nextSquares);
}, 700);
return () => clearTimeout(timer);
}
}
}, [xIsNext, squares, onPlay]);
Key Features:
- Type-safe game state with TypeScript
- AI opponent with realistic timing
- Win detection with winning squares highlighting
- Game history with move navigation
UX Design (Powered by Claude Sonnet 4)
Why Claude Sonnet 4 for UX?
Claude Sonnet 4 was perfect for UX decisions because it:
- Understands design patterns - Modern UI/UX best practices
- Accessibility focus - WCAG compliance and inclusive design
- Micro-interactions - Subtle animations and feedback
- Responsive design - Mobile-first approach
Modern UI Implementation
// Accessible button with micro-interactions
<button
className={`
w-20 h-20 lg:w-24 lg:h-24
bg-white border-2 border-gray-200
rounded-xl shadow-sm
flex items-center justify-center
transition-all duration-200 ease-out
hover:border-indigo-400 hover:shadow-lg hover:-translate-y-0.5
focus:outline-none focus:ring-2 focus:ring-indigo-400 focus:ring-offset-2
disabled:cursor-not-allowed disabled:hover:translate-y-0
group
${isWinningSquare ?
'bg-gradient-to-br from-emerald-400 to-emerald-500 border-emerald-500 animate-pulse shadow-emerald-200 shadow-lg' :
''
}
`}
onClick={onSquareClick}
disabled={value !== null}
aria-label={value ? `Square played by ${value}` : 'Empty square, click to play'}
>
{value === 'X' && (
<Cross1Icon
className="w-12 h-12 lg:w-14 lg:h-14 text-red-600 stroke-2 group-hover:scale-110 transition-transform duration-200 drop-shadow-sm"
/>
)}
</button>
๐ Migrating to Tailwind CSS v4
The Migration Process
We migrated from Tailwind CSS v3 to v4 following the official guide:
- Install the Vite plugin:
npm install @tailwindcss/vite
- Update Vite config:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
react(),
tailwindcss(),
],
})
- Simplify CSS imports:
@import "tailwindcss";
-
Remove old config files:
tailwind.config.js
postcss.config.js
Benefits of Tailwind v4
- Better performance with Vite integration
- Simplified configuration - no config file needed
- Automatic scanning of used classes
- Zero runtime - all styles compiled at build time
โฟ Accessibility with Radix UI
Why Radix UI ?
Radix UI provides:
- Unstyled components - Full styling control
- Built-in accessibility - ARIA attributes and keyboard navigation
- Composition patterns - Flexible component architecture
- TypeScript support - Excellent type definitions
Accessibility Features
// Tooltip with proper ARIA
<Tooltip.Provider>
<Tooltip.Root>
<Tooltip.Trigger asChild>
<button aria-label="Reset game">
<ResetIcon />
</button>
</Tooltip.Trigger>
<Tooltip.Portal>
<Tooltip.Content className="bg-gray-900 text-white px-3 py-2 rounded-lg">
Reset Game
<Tooltip.Arrow />
</Tooltip.Content>
</Tooltip.Portal>
</Tooltip.Root>
</Tooltip.Provider>
๐ฏ Key UX Improvements
1. Micro-interactions
- Hover effects with scale and translate transforms
- Focus states with ring indicators
- Loading states with smooth transitions
- Success animations for winning combinations
2. Visual Hierarchy
- Gradient backgrounds for visual appeal
- Consistent spacing with Tailwind's spacing scale
- Color semantics (red for X, blue for O, green for wins)
- Typography scale for clear information hierarchy
3. Responsive Design
- Mobile-first approach
- Flexible layouts that adapt to screen size
- Touch-friendly button sizes
- Optimized spacing for different devices
๐ค AI Collaboration Insights
Working with Gemini CLI
Strengths:
- Excellent at algorithmic problems
- Generates clean, maintainable code
- Good understanding of React patterns
- Strong TypeScript knowledge
Best practices:
- Provide clear context about your tech stack
- Ask for specific patterns (e.g., "use React hooks")
- Request explanations for complex logic
Working with Claude Sonnet 4
Strengths:
- Deep understanding of UX principles
- Excellent at design system thinking
- Strong accessibility knowledge
- Great at explaining design decisions
Best practices:
- Share your design goals and constraints
- Ask for multiple design approaches
- Request accessibility considerations
- Get explanations for UX decisions
๐ฑ Performance Optimizations
1. Tailwind CSS v4 Benefits
- Purge unused styles automatically
- Optimized bundle size with Vite
- Fast hot reload during development
2. React Optimizations
- Proper dependency arrays in useEffect
- Memoization where beneficial
- Efficient re-renders with proper state management
3. Bundle Analysis
npm run build
npx vite-bundle-analyzer
๐ Deployment
The app is ready for deployment on:
- Vercel - Zero config deployment
- Netlify - Drag and drop deployment
- GitHub Pages - Free hosting for open source
๐ Conclusion
This project demonstrates the power of combining:
- Modern web technologies (React, TypeScript, Tailwind v4)
- Accessible UI components (Radix UI)
- AI collaboration for different aspects of development
The result is a polished, accessible, and performant game that showcases best practices in modern web development.
Top comments (0)