@jonelhatwell/arcade-games 1.3.5 → 1.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +0 -30
- package/dist/index.css.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/games/spacedodger/index.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/games/memorygame/index.tsx","../src/components/games/snake/index.tsx"],"sourcesContent":["import \"./index.css\";\r\nexport { default as SpaceDodger } from \"./components/games/spacedodger\";\r\nexport { default as MemoryGame } from \"./components/games/memorygame\";\r\nexport { default as Snake } from \"./components/games/snake\";","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface Position {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface Enemy extends Position {\r\n radius: number;\r\n}\r\n\r\ninterface Player extends Position {\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface SpaceDodgerState {\r\n player: Player;\r\n enemies: Enemy[];\r\n frame: number;\r\n keys: Record<string, boolean>;\r\n}\r\n\r\n\r\nconst config = {\r\n canvasSize : { \r\n width: 450, \r\n height: 450 \r\n },\r\n player: { x: 200, y: 350, width: 25, height: 50 }\r\n}\r\n\r\nconst SpaceDodger: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const scoreRef = useRef(0);\r\n const lastBatchScoreRef = useRef(0);\r\n\r\n const [score, setScore] = useState(0);\r\n const [gameOver, setGameOver] = useState(false);\r\n\r\n const gameStateRef = useRef<SpaceDodgerState>({\r\n player: config.player,\r\n enemies: [],\r\n frame: 0,\r\n keys: {}\r\n });\r\n\r\n const resetGame = () => {\r\n gameStateRef.current = {\r\n player: config.player,\r\n enemies: [],\r\n frame: 0,\r\n keys: {}\r\n };\r\n scoreRef.current = 0;\r\n lastBatchScoreRef.current = 0;\r\n setScore(0);\r\n setGameOver(false);\r\n };\r\n\r\n\r\n \r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const state = gameStateRef.current;\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n state.keys[e.key] = true;\r\n };\r\n const handleKeyUp = (e: KeyboardEvent) => {\r\n state.keys[e.key] = false;\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n window.addEventListener('keyup', handleKeyUp);\r\n\r\n const randomRadius = () => 10 + Math.random() * 15;\r\n\r\n const getEnemySpeed = () => {\r\n const base = 3;\r\n const increase = Math.floor(scoreRef.current / 20) * 0.5;\r\n return base + increase;\r\n };\r\n\r\n let animationId: number;\r\n\r\n const gameLoop = () => {\r\n if (gameOver) return;\r\n\r\n state.frame++;\r\n\r\n ctx.fillStyle = '#000';\r\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\r\n\r\n // Player movement\r\n if (state.keys['ArrowLeft'] && state.player.x > 0) state.player.x -= 5;\r\n if (state.keys['ArrowRight'] && state.player.x < config.canvasSize.width - state.player.width) state.player.x += 5;\r\n if (state.keys['ArrowUp'] && state.player.y > 0) state.player.y -= 5;\r\n if (state.keys['ArrowDown'] && state.player.y < config.canvasSize.height - state.player.height) state.player.y += 5;\r\n\r\n // Draw player\r\n ctx.fillStyle = '#0ea5e9';\r\n ctx.fillRect(\r\n state.player.x,\r\n state.player.y,\r\n state.player.width,\r\n state.player.height\r\n );\r\n\r\n // Normal enemy spawn\r\n if (state.frame % 40 === 0) {\r\n const radius = randomRadius();\r\n state.enemies.push({\r\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\r\n y: -radius,\r\n radius,\r\n });\r\n }\r\n\r\n // Extra batch every 20 score\r\n if (\r\n scoreRef.current > 0 &&\r\n scoreRef.current % 20 === 0 &&\r\n lastBatchScoreRef.current !== scoreRef.current\r\n ) {\r\n lastBatchScoreRef.current = scoreRef.current;\r\n const batchCount = 2 + Math.floor(Math.random() * 3);\r\n\r\n for (let i = 0; i < batchCount; i++) {\r\n const radius = randomRadius();\r\n state.enemies.push({\r\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\r\n y: -Math.random() * 100,\r\n radius\r\n });\r\n }\r\n }\r\n\r\n // Enemies update\r\n state.enemies = state.enemies.filter(enemy => {\r\n enemy.y += getEnemySpeed();\r\n\r\n // Draw enemy (circle)\r\n ctx.fillStyle = '#ef4444';\r\n ctx.beginPath();\r\n ctx.arc(enemy.x, enemy.y, enemy.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n\r\n // Circle vs rectangle collision\r\n const closestX = Math.max(\r\n state.player.x,\r\n Math.min(enemy.x, state.player.x + state.player.width)\r\n );\r\n const closestY = Math.max(\r\n state.player.y,\r\n Math.min(enemy.y, state.player.y + state.player.height)\r\n );\r\n\r\n const dx = enemy.x - closestX;\r\n const dy = enemy.y - closestY;\r\n\r\n if (dx * dx + dy * dy < enemy.radius * enemy.radius) {\r\n setGameOver(true);\r\n return false;\r\n }\r\n\r\n // Passed screen\r\n if (enemy.y - enemy.radius > config.canvasSize.height) {\r\n setScore(s => {\r\n scoreRef.current = s + 1;\r\n return s + 1;\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n animationId = requestAnimationFrame(gameLoop);\r\n };\r\n\r\n gameLoop();\r\n\r\n return () => {\r\n cancelAnimationFrame(animationId);\r\n window.removeEventListener('keydown', handleKeyDown);\r\n window.removeEventListener('keyup', handleKeyUp);\r\n };\r\n }, [gameOver]);\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\r\n <div className=\"text-xl font-bold\">Score: {score}</div>\r\n <canvas\r\n ref={canvasRef}\r\n width={config.canvasSize.width}\r\n height={config.canvasSize.height}\r\n className=\"border-2 border-gray-300\"\r\n />\r\n\r\n {gameOver && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-xl font-bold text-red-500 mb-3\">Game Over</p>\r\n <Button onClick={resetGame}>Play Again</Button>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-sm text-foreground\">Use arrow keys to move</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SpaceDodger;","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\r\n outline:\r\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n ghost:\r\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\r\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\r\n icon: \"size-9\",\r\n \"icon-sm\": \"size-8\",\r\n \"icon-lg\": \"size-10\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant = \"default\",\r\n size = \"default\",\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<\"button\"> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n data-variant={variant}\r\n data-size={size}\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface NumberItem {\r\n x: number;\r\n y: number;\r\n value: number;\r\n radius: number;\r\n}\r\n\r\ntype GamePhase = 'memorize' | 'recall' | 'transition';\r\n\r\ninterface GameState {\r\n numbers: NumberItem[];\r\n sequence: number[];\r\n currentIndex: number;\r\n level: number;\r\n showNumbers: boolean;\r\n phase: GamePhase;\r\n revealed: Set<number>;\r\n}\r\n\r\nconst config = {\r\n canvasSize: { width: 450, height: 450 },\r\n baseHideTime: 3000,\r\n numberRadius: 30,\r\n};\r\n\r\nconst MemoryGame: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [level, setLevel] = useState(1);\r\n const [gameOver, setGameOver] = useState(false);\r\n const [message, setMessage] = useState('');\r\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\r\n visible: false,\r\n text: '',\r\n });\r\n const gameStateRef = useRef<GameState>({\r\n numbers: [],\r\n sequence: [],\r\n currentIndex: 0,\r\n level: 1,\r\n showNumbers: true,\r\n phase: 'memorize',\r\n revealed: new Set(),\r\n });\r\n\r\n // Max numbers = 9\r\n const getNumberCount = (lvl: number) => Math.min(4 + lvl, 9);\r\n\r\n // Hide time decreases as level increases, min 500ms\r\n const getHideTime = (lvl: number) =>\r\n Math.max(500, config.baseHideTime - Math.floor((lvl - 1) / 1) * 500);\r\n\r\n const generateNumbers = (lvl: number) => {\r\n const count = getNumberCount(lvl);\r\n const numbers: NumberItem[] = [];\r\n const sequence: number[] = [];\r\n const padding = config.numberRadius * 2.5;\r\n\r\n for (let i = 0; i < count; i++) {\r\n let x: number, y: number, overlap: boolean;\r\n let attempts = 0;\r\n\r\n do {\r\n overlap = false;\r\n x = padding + Math.random() * (config.canvasSize.width - padding * 2);\r\n y = padding + Math.random() * (config.canvasSize.height - padding * 2);\r\n\r\n for (const num of numbers) {\r\n const dx = x - num.x;\r\n const dy = y - num.y;\r\n if (Math.sqrt(dx * dx + dy * dy) < config.numberRadius * 2.5) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n attempts++;\r\n } while (overlap && attempts < 100);\r\n\r\n numbers.push({ x, y, value: i + 1, radius: config.numberRadius });\r\n sequence.push(i + 1);\r\n }\r\n\r\n return { numbers, sequence };\r\n };\r\n\r\n const startLevel = (lvl: number) => {\r\n const { numbers, sequence } = generateNumbers(lvl);\r\n gameStateRef.current = {\r\n numbers,\r\n sequence,\r\n currentIndex: 0,\r\n level: lvl,\r\n showNumbers: true,\r\n phase: 'memorize',\r\n revealed: new Set(),\r\n };\r\n setMessage('Memorize the sequence!');\r\n\r\n setTimeout(() => {\r\n gameStateRef.current.showNumbers = false;\r\n gameStateRef.current.phase = 'recall';\r\n setMessage('Click the numbers in order!');\r\n }, getHideTime(lvl));\r\n };\r\n\r\n const resetGame = () => {\r\n setLevel(1);\r\n setGameOver(false);\r\n setShowOverlay({ visible: false, text: '' });\r\n startLevel(1);\r\n };\r\n\r\n const handleCanvasClick = (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n if (gameOver || gameStateRef.current.phase !== 'recall') return;\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const state = gameStateRef.current;\r\n\r\n for (const num of state.numbers) {\r\n const distance = Math.hypot(x - num.x, y - num.y);\r\n if (distance <= num.radius) {\r\n const expected = state.sequence[state.currentIndex];\r\n if (num.value === expected) {\r\n state.revealed.add(num.value);\r\n state.currentIndex++;\r\n\r\n if (state.currentIndex === state.sequence.length) {\r\n const nextLevel = level + 1;\r\n setLevel(nextLevel);\r\n state.phase = 'transition';\r\n setShowOverlay({ visible: true, text: `Get Ready! Level ${nextLevel}` });\r\n\r\n setTimeout(() => {\r\n setShowOverlay({ visible: false, text: '' });\r\n startLevel(nextLevel);\r\n }, 1500);\r\n }\r\n } else {\r\n setGameOver(true);\r\n setMessage(`Wrong! Clicked ${num.value}, expected ${expected}`);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => startLevel(1), []);\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n let animationId: number;\r\n\r\n const draw = () => {\r\n const state = gameStateRef.current;\r\n ctx.fillStyle = '#000';\r\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\r\n\r\n state.numbers.forEach((num, idx) => {\r\n // Show green hint only in level 1\r\n const isNext = state.phase === 'recall' && level === 1 && idx === state.currentIndex;\r\n ctx.fillStyle = isNext ? '#22c55e' : '#3b82f6';\r\n ctx.beginPath();\r\n ctx.arc(num.x, num.y, num.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n\r\n // Reveal numbers if memorizing, transitioning, or already correctly guessed\r\n if (state.showNumbers || state.phase === 'transition' || state.revealed.has(num.value)) {\r\n ctx.fillStyle = '#fff';\r\n ctx.font = 'bold 24px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(num.value.toString(), num.x, num.y);\r\n }\r\n });\r\n\r\n if (!gameOver) animationId = requestAnimationFrame(draw);\r\n };\r\n\r\n draw();\r\n return () => cancelAnimationFrame(animationId);\r\n }, [gameOver, level]);\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\r\n <div className=\"flex gap-8 text-xl font-bold\">\r\n <div>Level: {level}</div>\r\n <div>Numbers: {getNumberCount(level)}</div>\r\n </div>\r\n <div className=\"text-lg font-semibold text-blue-400 h-6\">{message}</div>\r\n <canvas\r\n ref={canvasRef}\r\n width={config.canvasSize.width}\r\n height={config.canvasSize.height}\r\n className=\"border-2 border-gray-300 cursor-pointer\"\r\n onClick={handleCanvasClick}\r\n />\r\n {gameOver && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-xl font-bold text-red-500 mb-2\">Game Over</p>\r\n <p className=\"text-lg text-white mb-4\">Reached Level {level}</p>\r\n <Button onClick={resetGame}>Play Again</Button>\r\n </div>\r\n )}\r\n\r\n {showOverlay.visible && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-2xl font-bold text-yellow-400\">{showOverlay.text}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-sm text-center text-foreground max-w-md\">\r\n <div>Memorize the numbers, then click them in sequence (1, 2, 3...)</div>\r\n <div className=\"mt-1 text-xs text-gray-400\">Green circle = next number to click (level 1 only)</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default MemoryGame;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ntype GamePhase = 'playing' | 'paused' | 'gameover';\r\ntype Direction = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\r\n\r\ninterface Position {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface GameState {\r\n snake: Position[];\r\n food: Position;\r\n bonusFood: Position[];\r\n direction: Direction;\r\n nextDirection: Direction;\r\n score: number;\r\n speed: number;\r\n phase: GamePhase;\r\n}\r\n\r\nconst config = {\r\n gridSize: 20,\r\n cellSize: 20,\r\n initialSpeed: 150,\r\n speedIncrement: 5,\r\n};\r\n\r\nconst SnakeGame: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [message, setMessage] = useState('Use arrow keys or WASD to play!');\r\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\r\n visible: false,\r\n text: '',\r\n });\r\n\r\n const gameStateRef = useRef<GameState>({\r\n snake: [{ x: 10, y: 10 }],\r\n food: { x: 15, y: 15 },\r\n bonusFood: [],\r\n direction: 'RIGHT',\r\n nextDirection: 'RIGHT',\r\n score: 0,\r\n speed: config.initialSpeed,\r\n phase: 'playing',\r\n });\r\n\r\n const generateFood = (snake: Position[]): Position => {\r\n let food: Position;\r\n do {\r\n food = {\r\n x: Math.floor(Math.random() * config.gridSize),\r\n y: Math.floor(Math.random() * config.gridSize),\r\n };\r\n } while (snake.some((seg) => seg.x === food.x && seg.y === food.y));\r\n return food;\r\n };\r\n\r\n const generateBonusFood = (snake: Position[], regularFood: Position, count: number = 3): Position[] => {\r\n const bonusFood: Position[] = [];\r\n for (let i = 0; i < count; i++) {\r\n let food: Position;\r\n do {\r\n food = {\r\n x: Math.floor(Math.random() * config.gridSize),\r\n y: Math.floor(Math.random() * config.gridSize),\r\n };\r\n } while (\r\n snake.some((seg) => seg.x === food.x && seg.y === food.y) ||\r\n (food.x === regularFood.x && food.y === regularFood.y) ||\r\n bonusFood.some((bf) => bf.x === food.x && bf.y === food.y)\r\n );\r\n bonusFood.push(food);\r\n }\r\n return bonusFood;\r\n };\r\n\r\n const initGame = () => {\r\n const initialSnake = [{ x: 10, y: 10 }];\r\n gameStateRef.current = {\r\n snake: initialSnake,\r\n food: generateFood(initialSnake),\r\n bonusFood: [],\r\n direction: 'RIGHT',\r\n nextDirection: 'RIGHT',\r\n score: 0,\r\n speed: config.initialSpeed,\r\n phase: 'playing',\r\n };\r\n setMessage('Use arrow keys or WASD to play!');\r\n };\r\n\r\n const checkCollision = (head: Position, snake: Position[]): boolean => {\r\n // Only self collision (no wall collision - wrap around instead)\r\n return snake.some((seg) => seg.x === head.x && seg.y === head.y);\r\n };\r\n\r\n const moveSnake = () => {\r\n const state = gameStateRef.current;\r\n if (state.phase !== 'playing') return;\r\n\r\n state.direction = state.nextDirection;\r\n\r\n const head = { ...state.snake[0] };\r\n\r\n switch (state.direction) {\r\n case 'UP':\r\n head.y -= 1;\r\n break;\r\n case 'DOWN':\r\n head.y += 1;\r\n break;\r\n case 'LEFT':\r\n head.x -= 1;\r\n break;\r\n case 'RIGHT':\r\n head.x += 1;\r\n break;\r\n }\r\n\r\n // Wrap around edges\r\n if (head.x < 0) head.x = config.gridSize - 1;\r\n if (head.x >= config.gridSize) head.x = 0;\r\n if (head.y < 0) head.y = config.gridSize - 1;\r\n if (head.y >= config.gridSize) head.y = 0;\r\n\r\n if (checkCollision(head, state.snake)) {\r\n state.phase = 'gameover';\r\n setShowOverlay({ visible: true, text: 'Game Over! 💀' });\r\n return;\r\n }\r\n\r\n const newSnake = [head, ...state.snake];\r\n let ateFood = false;\r\n\r\n // Check if regular food eaten\r\n if (head.x === state.food.x && head.y === state.food.y) {\r\n state.score += 10;\r\n state.speed = Math.max(50, state.speed - config.speedIncrement);\r\n state.food = generateFood(newSnake);\r\n ateFood = true;\r\n setMessage(`Score: ${state.score} 🍎`);\r\n\r\n // Generate bonus food every 50 points\r\n if (state.score % 50 === 0 && state.score > 0) {\r\n state.bonusFood = generateBonusFood(newSnake, state.food);\r\n setMessage(`Score: ${state.score} 🍎 BONUS FOOD! ⭐`);\r\n }\r\n }\r\n\r\n // Check if bonus food eaten\r\n const bonusFoodIndex = state.bonusFood.findIndex(\r\n (bf) => bf.x === head.x && bf.y === head.y\r\n );\r\n if (bonusFoodIndex !== -1) {\r\n state.score += 10;\r\n state.bonusFood.splice(bonusFoodIndex, 1);\r\n ateFood = true;\r\n setMessage(`Score: ${state.score} ⭐ Bonus!`);\r\n }\r\n\r\n if (!ateFood) {\r\n newSnake.pop();\r\n }\r\n\r\n state.snake = newSnake;\r\n };\r\n\r\n const handleDirectionChange = (newDirection: Direction) => {\r\n const state = gameStateRef.current;\r\n const opposites: Record<Direction, Direction> = {\r\n UP: 'DOWN',\r\n DOWN: 'UP',\r\n LEFT: 'RIGHT',\r\n RIGHT: 'LEFT',\r\n };\r\n\r\n if (opposites[state.direction] !== newDirection) {\r\n state.nextDirection = newDirection;\r\n }\r\n };\r\n\r\n const togglePause = () => {\r\n const state = gameStateRef.current;\r\n if (state.phase === 'playing') {\r\n state.phase = 'paused';\r\n setMessage('Game Paused');\r\n } else if (state.phase === 'paused') {\r\n state.phase = 'playing';\r\n setMessage('Use arrow keys or WASD to play!');\r\n }\r\n };\r\n\r\n const resetGame = () => {\r\n setShowOverlay({ visible: false, text: '' });\r\n initGame();\r\n };\r\n\r\n useEffect(() => {\r\n initGame();\r\n\r\n const onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key.toLowerCase();\r\n \r\n if (key === ' ') {\r\n e.preventDefault();\r\n togglePause();\r\n return;\r\n }\r\n\r\n if (gameStateRef.current.phase !== 'playing') return;\r\n\r\n switch (key) {\r\n case 'arrowup':\r\n case 'w':\r\n e.preventDefault();\r\n handleDirectionChange('UP');\r\n break;\r\n case 'arrowdown':\r\n case 's':\r\n e.preventDefault();\r\n handleDirectionChange('DOWN');\r\n break;\r\n case 'arrowleft':\r\n case 'a':\r\n e.preventDefault();\r\n handleDirectionChange('LEFT');\r\n break;\r\n case 'arrowright':\r\n case 'd':\r\n e.preventDefault();\r\n handleDirectionChange('RIGHT');\r\n break;\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, []);\r\n\r\n // Game loop\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n moveSnake();\r\n }, gameStateRef.current.speed);\r\n\r\n return () => clearInterval(interval);\r\n }, []);\r\n\r\n // Drawing\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n let animationId: number;\r\n\r\n const draw = () => {\r\n const state = gameStateRef.current;\r\n const width = config.gridSize * config.cellSize;\r\n const height = config.gridSize * config.cellSize;\r\n\r\n // Background\r\n ctx.fillStyle = '#1a1a2e';\r\n ctx.fillRect(0, 0, width, height);\r\n\r\n // Grid\r\n ctx.strokeStyle = '#16213e';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= config.gridSize; i++) {\r\n ctx.beginPath();\r\n ctx.moveTo(i * config.cellSize, 0);\r\n ctx.lineTo(i * config.cellSize, height);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(0, i * config.cellSize);\r\n ctx.lineTo(width, i * config.cellSize);\r\n ctx.stroke();\r\n }\r\n\r\n // Food\r\n ctx.fillStyle = '#ef4444';\r\n ctx.beginPath();\r\n ctx.arc(\r\n state.food.x * config.cellSize + config.cellSize / 2,\r\n state.food.y * config.cellSize + config.cellSize / 2,\r\n config.cellSize / 2 - 2,\r\n 0,\r\n Math.PI * 2\r\n );\r\n ctx.fill();\r\n\r\n // Bonus Food (star-shaped)\r\n state.bonusFood.forEach((bf) => {\r\n ctx.fillStyle = '#fbbf24';\r\n ctx.strokeStyle = '#f59e0b';\r\n ctx.lineWidth = 2;\r\n \r\n const centerX = bf.x * config.cellSize + config.cellSize / 2;\r\n const centerY = bf.y * config.cellSize + config.cellSize / 2;\r\n const outerRadius = config.cellSize / 2 - 2;\r\n const innerRadius = outerRadius / 2;\r\n const points = 5;\r\n \r\n ctx.beginPath();\r\n for (let i = 0; i < points * 2; i++) {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\r\n const angle = (Math.PI * i) / points - Math.PI / 2;\r\n const x = centerX + Math.cos(angle) * radius;\r\n const y = centerY + Math.sin(angle) * radius;\r\n if (i === 0) {\r\n ctx.moveTo(x, y);\r\n } else {\r\n ctx.lineTo(x, y);\r\n }\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n });\r\n\r\n // Snake\r\n state.snake.forEach((seg, idx) => {\r\n if (idx === 0) {\r\n // Head\r\n ctx.fillStyle = '#22c55e';\r\n } else {\r\n // Body\r\n ctx.fillStyle = '#16a34a';\r\n }\r\n ctx.fillRect(\r\n seg.x * config.cellSize + 1,\r\n seg.y * config.cellSize + 1,\r\n config.cellSize - 2,\r\n config.cellSize - 2\r\n );\r\n });\r\n\r\n animationId = requestAnimationFrame(draw);\r\n };\r\n\r\n draw();\r\n return () => cancelAnimationFrame(animationId);\r\n }, []);\r\n\r\n const state = gameStateRef.current;\r\n const canvasSize = config.gridSize * config.cellSize;\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4 max-w-xl mx-auto\">\r\n <div className=\"text-3xl font-bold text-green-500\">🐍 Snake Game</div>\r\n\r\n <div className=\"flex gap-8 text-lg\">\r\n <div className=\"text-yellow-400\">\r\n Score: <span className=\"font-bold\">{state.score}</span>\r\n </div>\r\n <div className=\"text-blue-400\">\r\n Length: <span className=\"font-bold\">{state.snake.length}</span>\r\n </div>\r\n </div>\r\n\r\n <canvas\r\n ref={canvasRef}\r\n width={canvasSize}\r\n height={canvasSize}\r\n className=\"border-4 border-green-600 rounded-lg shadow-xl\"\r\n />\r\n\r\n <div className=\"flex gap-2\">\r\n <Button onClick={togglePause} variant=\"outline\" disabled={state.phase === 'gameover'}>\r\n {state.phase === 'paused' ? 'Resume' : 'Pause'}\r\n </Button>\r\n <Button onClick={resetGame} variant=\"outline\">\r\n Restart\r\n </Button>\r\n </div>\r\n\r\n <div className=\"text-sm text-center text-blue-400 h-5\">{message}</div>\r\n\r\n {/* Touch controls for mobile */}\r\n <div className=\"grid grid-cols-3 gap-2 w-48\">\r\n <div></div>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('UP')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ↑\r\n </Button>\r\n <div></div>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('LEFT')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ←\r\n </Button>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('DOWN')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ↓\r\n </Button>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('RIGHT')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n →\r\n </Button>\r\n </div>\r\n\r\n {showOverlay.visible && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/80 rounded-lg\">\r\n <p className=\"text-4xl font-bold mb-4 text-red-500\">{showOverlay.text}</p>\r\n <p className=\"mb-2 text-xl text-gray-300\">\r\n Final Score: <strong className=\"text-yellow-400\">{state.score}</strong>\r\n </p>\r\n <p className=\"mb-6 text-lg text-gray-300\">\r\n Length: <strong className=\"text-green-400\">{state.snake.length}</strong>\r\n </p>\r\n <Button onClick={resetGame} size=\"lg\" className=\"bg-green-600 hover:bg-green-700\">\r\n Play Again\r\n </Button>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-xs text-center text-gray-400 max-w-md\">\r\n Arrow keys or WASD to move • Space to pause • Red apple = +10 pts • Golden star = +10 pts (every 50 pts)\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SnakeGame;"],"mappings":"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","names":["import_jsx_runtime","import_react","import_jsx_runtime","config","import_react","import_jsx_runtime","config","state"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/games/spacedodger/index.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/games/memorygame/index.tsx","../src/components/games/snake/index.tsx"],"sourcesContent":["import \"./index.css\";\nexport { default as SpaceDodger } from \"./components/games/spacedodger\";\nexport { default as MemoryGame } from \"./components/games/memorygame\";\nexport { default as Snake } from \"./components/games/snake\";","import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface Enemy extends Position {\n radius: number;\n}\n\ninterface Player extends Position {\n width: number;\n height: number;\n}\n\ninterface SpaceDodgerState {\n player: Player;\n enemies: Enemy[];\n frame: number;\n keys: Record<string, boolean>;\n}\n\n\nconst config = {\n canvasSize : { \n width: 450, \n height: 450 \n },\n player: { x: 200, y: 350, width: 25, height: 50 }\n}\n\nconst SpaceDodger: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const scoreRef = useRef(0);\n const lastBatchScoreRef = useRef(0);\n\n const [score, setScore] = useState(0);\n const [gameOver, setGameOver] = useState(false);\n\n const gameStateRef = useRef<SpaceDodgerState>({\n player: config.player,\n enemies: [],\n frame: 0,\n keys: {}\n });\n\n const resetGame = () => {\n gameStateRef.current = {\n player: config.player,\n enemies: [],\n frame: 0,\n keys: {}\n };\n scoreRef.current = 0;\n lastBatchScoreRef.current = 0;\n setScore(0);\n setGameOver(false);\n };\n\n\n \n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const state = gameStateRef.current;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n state.keys[e.key] = true;\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n state.keys[e.key] = false;\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n const randomRadius = () => 10 + Math.random() * 15;\n\n const getEnemySpeed = () => {\n const base = 3;\n const increase = Math.floor(scoreRef.current / 20) * 0.5;\n return base + increase;\n };\n\n let animationId: number;\n\n const gameLoop = () => {\n if (gameOver) return;\n\n state.frame++;\n\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\n\n // Player movement\n if (state.keys['ArrowLeft'] && state.player.x > 0) state.player.x -= 5;\n if (state.keys['ArrowRight'] && state.player.x < config.canvasSize.width - state.player.width) state.player.x += 5;\n if (state.keys['ArrowUp'] && state.player.y > 0) state.player.y -= 5;\n if (state.keys['ArrowDown'] && state.player.y < config.canvasSize.height - state.player.height) state.player.y += 5;\n\n // Draw player\n ctx.fillStyle = '#0ea5e9';\n ctx.fillRect(\n state.player.x,\n state.player.y,\n state.player.width,\n state.player.height\n );\n\n // Normal enemy spawn\n if (state.frame % 40 === 0) {\n const radius = randomRadius();\n state.enemies.push({\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\n y: -radius,\n radius,\n });\n }\n\n // Extra batch every 20 score\n if (\n scoreRef.current > 0 &&\n scoreRef.current % 20 === 0 &&\n lastBatchScoreRef.current !== scoreRef.current\n ) {\n lastBatchScoreRef.current = scoreRef.current;\n const batchCount = 2 + Math.floor(Math.random() * 3);\n\n for (let i = 0; i < batchCount; i++) {\n const radius = randomRadius();\n state.enemies.push({\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\n y: -Math.random() * 100,\n radius\n });\n }\n }\n\n // Enemies update\n state.enemies = state.enemies.filter(enemy => {\n enemy.y += getEnemySpeed();\n\n // Draw enemy (circle)\n ctx.fillStyle = '#ef4444';\n ctx.beginPath();\n ctx.arc(enemy.x, enemy.y, enemy.radius, 0, Math.PI * 2);\n ctx.fill();\n\n // Circle vs rectangle collision\n const closestX = Math.max(\n state.player.x,\n Math.min(enemy.x, state.player.x + state.player.width)\n );\n const closestY = Math.max(\n state.player.y,\n Math.min(enemy.y, state.player.y + state.player.height)\n );\n\n const dx = enemy.x - closestX;\n const dy = enemy.y - closestY;\n\n if (dx * dx + dy * dy < enemy.radius * enemy.radius) {\n setGameOver(true);\n return false;\n }\n\n // Passed screen\n if (enemy.y - enemy.radius > config.canvasSize.height) {\n setScore(s => {\n scoreRef.current = s + 1;\n return s + 1;\n });\n return false;\n }\n\n return true;\n });\n\n animationId = requestAnimationFrame(gameLoop);\n };\n\n gameLoop();\n\n return () => {\n cancelAnimationFrame(animationId);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, [gameOver]);\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\n <div className=\"text-xl font-bold\">Score: {score}</div>\n <canvas\n ref={canvasRef}\n width={config.canvasSize.width}\n height={config.canvasSize.height}\n className=\"border-2 border-gray-300\"\n />\n\n {gameOver && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-xl font-bold text-red-500 mb-3\">Game Over</p>\n <Button onClick={resetGame}>Play Again</Button>\n </div>\n )}\n\n <div className=\"text-sm text-foreground\">Use arrow keys to move</div>\n </div>\n );\n};\n\nexport default SpaceDodger;","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ninterface NumberItem {\n x: number;\n y: number;\n value: number;\n radius: number;\n}\n\ntype GamePhase = 'memorize' | 'recall' | 'transition';\n\ninterface GameState {\n numbers: NumberItem[];\n sequence: number[];\n currentIndex: number;\n level: number;\n showNumbers: boolean;\n phase: GamePhase;\n revealed: Set<number>;\n}\n\nconst config = {\n canvasSize: { width: 450, height: 450 },\n baseHideTime: 3000,\n numberRadius: 30,\n};\n\nconst MemoryGame: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [level, setLevel] = useState(1);\n const [gameOver, setGameOver] = useState(false);\n const [message, setMessage] = useState('');\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\n visible: false,\n text: '',\n });\n const gameStateRef = useRef<GameState>({\n numbers: [],\n sequence: [],\n currentIndex: 0,\n level: 1,\n showNumbers: true,\n phase: 'memorize',\n revealed: new Set(),\n });\n\n // Max numbers = 9\n const getNumberCount = (lvl: number) => Math.min(4 + lvl, 9);\n\n // Hide time decreases as level increases, min 500ms\n const getHideTime = (lvl: number) =>\n Math.max(500, config.baseHideTime - Math.floor((lvl - 1) / 1) * 500);\n\n const generateNumbers = (lvl: number) => {\n const count = getNumberCount(lvl);\n const numbers: NumberItem[] = [];\n const sequence: number[] = [];\n const padding = config.numberRadius * 2.5;\n\n for (let i = 0; i < count; i++) {\n let x: number, y: number, overlap: boolean;\n let attempts = 0;\n\n do {\n overlap = false;\n x = padding + Math.random() * (config.canvasSize.width - padding * 2);\n y = padding + Math.random() * (config.canvasSize.height - padding * 2);\n\n for (const num of numbers) {\n const dx = x - num.x;\n const dy = y - num.y;\n if (Math.sqrt(dx * dx + dy * dy) < config.numberRadius * 2.5) {\n overlap = true;\n break;\n }\n }\n attempts++;\n } while (overlap && attempts < 100);\n\n numbers.push({ x, y, value: i + 1, radius: config.numberRadius });\n sequence.push(i + 1);\n }\n\n return { numbers, sequence };\n };\n\n const startLevel = (lvl: number) => {\n const { numbers, sequence } = generateNumbers(lvl);\n gameStateRef.current = {\n numbers,\n sequence,\n currentIndex: 0,\n level: lvl,\n showNumbers: true,\n phase: 'memorize',\n revealed: new Set(),\n };\n setMessage('Memorize the sequence!');\n\n setTimeout(() => {\n gameStateRef.current.showNumbers = false;\n gameStateRef.current.phase = 'recall';\n setMessage('Click the numbers in order!');\n }, getHideTime(lvl));\n };\n\n const resetGame = () => {\n setLevel(1);\n setGameOver(false);\n setShowOverlay({ visible: false, text: '' });\n startLevel(1);\n };\n\n const handleCanvasClick = (e: React.MouseEvent<HTMLCanvasElement>) => {\n if (gameOver || gameStateRef.current.phase !== 'recall') return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const state = gameStateRef.current;\n\n for (const num of state.numbers) {\n const distance = Math.hypot(x - num.x, y - num.y);\n if (distance <= num.radius) {\n const expected = state.sequence[state.currentIndex];\n if (num.value === expected) {\n state.revealed.add(num.value);\n state.currentIndex++;\n\n if (state.currentIndex === state.sequence.length) {\n const nextLevel = level + 1;\n setLevel(nextLevel);\n state.phase = 'transition';\n setShowOverlay({ visible: true, text: `Get Ready! Level ${nextLevel}` });\n\n setTimeout(() => {\n setShowOverlay({ visible: false, text: '' });\n startLevel(nextLevel);\n }, 1500);\n }\n } else {\n setGameOver(true);\n setMessage(`Wrong! Clicked ${num.value}, expected ${expected}`);\n }\n break;\n }\n }\n };\n\n useEffect(() => startLevel(1), []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let animationId: number;\n\n const draw = () => {\n const state = gameStateRef.current;\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\n\n state.numbers.forEach((num, idx) => {\n // Show green hint only in level 1\n const isNext = state.phase === 'recall' && level === 1 && idx === state.currentIndex;\n ctx.fillStyle = isNext ? '#22c55e' : '#3b82f6';\n ctx.beginPath();\n ctx.arc(num.x, num.y, num.radius, 0, Math.PI * 2);\n ctx.fill();\n\n // Reveal numbers if memorizing, transitioning, or already correctly guessed\n if (state.showNumbers || state.phase === 'transition' || state.revealed.has(num.value)) {\n ctx.fillStyle = '#fff';\n ctx.font = 'bold 24px sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(num.value.toString(), num.x, num.y);\n }\n });\n\n if (!gameOver) animationId = requestAnimationFrame(draw);\n };\n\n draw();\n return () => cancelAnimationFrame(animationId);\n }, [gameOver, level]);\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\n <div className=\"flex gap-8 text-xl font-bold\">\n <div>Level: {level}</div>\n <div>Numbers: {getNumberCount(level)}</div>\n </div>\n <div className=\"text-lg font-semibold text-blue-400 h-6\">{message}</div>\n <canvas\n ref={canvasRef}\n width={config.canvasSize.width}\n height={config.canvasSize.height}\n className=\"border-2 border-gray-300 cursor-pointer\"\n onClick={handleCanvasClick}\n />\n {gameOver && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-xl font-bold text-red-500 mb-2\">Game Over</p>\n <p className=\"text-lg text-white mb-4\">Reached Level {level}</p>\n <Button onClick={resetGame}>Play Again</Button>\n </div>\n )}\n\n {showOverlay.visible && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-2xl font-bold text-yellow-400\">{showOverlay.text}</p>\n </div>\n )}\n\n <div className=\"text-sm text-center text-foreground max-w-md\">\n <div>Memorize the numbers, then click them in sequence (1, 2, 3...)</div>\n <div className=\"mt-1 text-xs text-gray-400\">Green circle = next number to click (level 1 only)</div>\n </div>\n </div>\n );\n};\n\nexport default MemoryGame;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ntype GamePhase = 'playing' | 'paused' | 'gameover';\ntype Direction = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface GameState {\n snake: Position[];\n food: Position;\n bonusFood: Position[];\n direction: Direction;\n nextDirection: Direction;\n score: number;\n speed: number;\n phase: GamePhase;\n}\n\nconst config = {\n gridSize: 20,\n cellSize: 20,\n initialSpeed: 150,\n speedIncrement: 5,\n};\n\nconst SnakeGame: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [message, setMessage] = useState('Use arrow keys or WASD to play!');\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\n visible: false,\n text: '',\n });\n\n const gameStateRef = useRef<GameState>({\n snake: [{ x: 10, y: 10 }],\n food: { x: 15, y: 15 },\n bonusFood: [],\n direction: 'RIGHT',\n nextDirection: 'RIGHT',\n score: 0,\n speed: config.initialSpeed,\n phase: 'playing',\n });\n\n const generateFood = (snake: Position[]): Position => {\n let food: Position;\n do {\n food = {\n x: Math.floor(Math.random() * config.gridSize),\n y: Math.floor(Math.random() * config.gridSize),\n };\n } while (snake.some((seg) => seg.x === food.x && seg.y === food.y));\n return food;\n };\n\n const generateBonusFood = (snake: Position[], regularFood: Position, count: number = 3): Position[] => {\n const bonusFood: Position[] = [];\n for (let i = 0; i < count; i++) {\n let food: Position;\n do {\n food = {\n x: Math.floor(Math.random() * config.gridSize),\n y: Math.floor(Math.random() * config.gridSize),\n };\n } while (\n snake.some((seg) => seg.x === food.x && seg.y === food.y) ||\n (food.x === regularFood.x && food.y === regularFood.y) ||\n bonusFood.some((bf) => bf.x === food.x && bf.y === food.y)\n );\n bonusFood.push(food);\n }\n return bonusFood;\n };\n\n const initGame = () => {\n const initialSnake = [{ x: 10, y: 10 }];\n gameStateRef.current = {\n snake: initialSnake,\n food: generateFood(initialSnake),\n bonusFood: [],\n direction: 'RIGHT',\n nextDirection: 'RIGHT',\n score: 0,\n speed: config.initialSpeed,\n phase: 'playing',\n };\n setMessage('Use arrow keys or WASD to play!');\n };\n\n const checkCollision = (head: Position, snake: Position[]): boolean => {\n // Only self collision (no wall collision - wrap around instead)\n return snake.some((seg) => seg.x === head.x && seg.y === head.y);\n };\n\n const moveSnake = () => {\n const state = gameStateRef.current;\n if (state.phase !== 'playing') return;\n\n state.direction = state.nextDirection;\n\n const head = { ...state.snake[0] };\n\n switch (state.direction) {\n case 'UP':\n head.y -= 1;\n break;\n case 'DOWN':\n head.y += 1;\n break;\n case 'LEFT':\n head.x -= 1;\n break;\n case 'RIGHT':\n head.x += 1;\n break;\n }\n\n // Wrap around edges\n if (head.x < 0) head.x = config.gridSize - 1;\n if (head.x >= config.gridSize) head.x = 0;\n if (head.y < 0) head.y = config.gridSize - 1;\n if (head.y >= config.gridSize) head.y = 0;\n\n if (checkCollision(head, state.snake)) {\n state.phase = 'gameover';\n setShowOverlay({ visible: true, text: 'Game Over! 💀' });\n return;\n }\n\n const newSnake = [head, ...state.snake];\n let ateFood = false;\n\n // Check if regular food eaten\n if (head.x === state.food.x && head.y === state.food.y) {\n state.score += 10;\n state.speed = Math.max(50, state.speed - config.speedIncrement);\n state.food = generateFood(newSnake);\n ateFood = true;\n setMessage(`Score: ${state.score} 🍎`);\n\n // Generate bonus food every 50 points\n if (state.score % 50 === 0 && state.score > 0) {\n state.bonusFood = generateBonusFood(newSnake, state.food);\n setMessage(`Score: ${state.score} 🍎 BONUS FOOD! ⭐`);\n }\n }\n\n // Check if bonus food eaten\n const bonusFoodIndex = state.bonusFood.findIndex(\n (bf) => bf.x === head.x && bf.y === head.y\n );\n if (bonusFoodIndex !== -1) {\n state.score += 10;\n state.bonusFood.splice(bonusFoodIndex, 1);\n ateFood = true;\n setMessage(`Score: ${state.score} ⭐ Bonus!`);\n }\n\n if (!ateFood) {\n newSnake.pop();\n }\n\n state.snake = newSnake;\n };\n\n const handleDirectionChange = (newDirection: Direction) => {\n const state = gameStateRef.current;\n const opposites: Record<Direction, Direction> = {\n UP: 'DOWN',\n DOWN: 'UP',\n LEFT: 'RIGHT',\n RIGHT: 'LEFT',\n };\n\n if (opposites[state.direction] !== newDirection) {\n state.nextDirection = newDirection;\n }\n };\n\n const togglePause = () => {\n const state = gameStateRef.current;\n if (state.phase === 'playing') {\n state.phase = 'paused';\n setMessage('Game Paused');\n } else if (state.phase === 'paused') {\n state.phase = 'playing';\n setMessage('Use arrow keys or WASD to play!');\n }\n };\n\n const resetGame = () => {\n setShowOverlay({ visible: false, text: '' });\n initGame();\n };\n\n useEffect(() => {\n initGame();\n\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n \n if (key === ' ') {\n e.preventDefault();\n togglePause();\n return;\n }\n\n if (gameStateRef.current.phase !== 'playing') return;\n\n switch (key) {\n case 'arrowup':\n case 'w':\n e.preventDefault();\n handleDirectionChange('UP');\n break;\n case 'arrowdown':\n case 's':\n e.preventDefault();\n handleDirectionChange('DOWN');\n break;\n case 'arrowleft':\n case 'a':\n e.preventDefault();\n handleDirectionChange('LEFT');\n break;\n case 'arrowright':\n case 'd':\n e.preventDefault();\n handleDirectionChange('RIGHT');\n break;\n }\n };\n\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, []);\n\n // Game loop\n useEffect(() => {\n const interval = setInterval(() => {\n moveSnake();\n }, gameStateRef.current.speed);\n\n return () => clearInterval(interval);\n }, []);\n\n // Drawing\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let animationId: number;\n\n const draw = () => {\n const state = gameStateRef.current;\n const width = config.gridSize * config.cellSize;\n const height = config.gridSize * config.cellSize;\n\n // Background\n ctx.fillStyle = '#1a1a2e';\n ctx.fillRect(0, 0, width, height);\n\n // Grid\n ctx.strokeStyle = '#16213e';\n ctx.lineWidth = 1;\n for (let i = 0; i <= config.gridSize; i++) {\n ctx.beginPath();\n ctx.moveTo(i * config.cellSize, 0);\n ctx.lineTo(i * config.cellSize, height);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(0, i * config.cellSize);\n ctx.lineTo(width, i * config.cellSize);\n ctx.stroke();\n }\n\n // Food\n ctx.fillStyle = '#ef4444';\n ctx.beginPath();\n ctx.arc(\n state.food.x * config.cellSize + config.cellSize / 2,\n state.food.y * config.cellSize + config.cellSize / 2,\n config.cellSize / 2 - 2,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n\n // Bonus Food (star-shaped)\n state.bonusFood.forEach((bf) => {\n ctx.fillStyle = '#fbbf24';\n ctx.strokeStyle = '#f59e0b';\n ctx.lineWidth = 2;\n \n const centerX = bf.x * config.cellSize + config.cellSize / 2;\n const centerY = bf.y * config.cellSize + config.cellSize / 2;\n const outerRadius = config.cellSize / 2 - 2;\n const innerRadius = outerRadius / 2;\n const points = 5;\n \n ctx.beginPath();\n for (let i = 0; i < points * 2; i++) {\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const x = centerX + Math.cos(angle) * radius;\n const y = centerY + Math.sin(angle) * radius;\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n });\n\n // Snake\n state.snake.forEach((seg, idx) => {\n if (idx === 0) {\n // Head\n ctx.fillStyle = '#22c55e';\n } else {\n // Body\n ctx.fillStyle = '#16a34a';\n }\n ctx.fillRect(\n seg.x * config.cellSize + 1,\n seg.y * config.cellSize + 1,\n config.cellSize - 2,\n config.cellSize - 2\n );\n });\n\n animationId = requestAnimationFrame(draw);\n };\n\n draw();\n return () => cancelAnimationFrame(animationId);\n }, []);\n\n const state = gameStateRef.current;\n const canvasSize = config.gridSize * config.cellSize;\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4 max-w-xl mx-auto\">\n <div className=\"text-3xl font-bold text-green-500\">🐍 Snake Game</div>\n\n <div className=\"flex gap-8 text-lg\">\n <div className=\"text-yellow-400\">\n Score: <span className=\"font-bold\">{state.score}</span>\n </div>\n <div className=\"text-blue-400\">\n Length: <span className=\"font-bold\">{state.snake.length}</span>\n </div>\n </div>\n\n <canvas\n ref={canvasRef}\n width={canvasSize}\n height={canvasSize}\n className=\"border-4 border-green-600 rounded-lg shadow-xl\"\n />\n\n <div className=\"flex gap-2\">\n <Button onClick={togglePause} variant=\"outline\" disabled={state.phase === 'gameover'}>\n {state.phase === 'paused' ? 'Resume' : 'Pause'}\n </Button>\n <Button onClick={resetGame} variant=\"outline\">\n Restart\n </Button>\n </div>\n\n <div className=\"text-sm text-center text-blue-400 h-5\">{message}</div>\n\n {/* Touch controls for mobile */}\n <div className=\"grid grid-cols-3 gap-2 w-48\">\n <div></div>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('UP')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ↑\n </Button>\n <div></div>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('LEFT')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ←\n </Button>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('DOWN')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ↓\n </Button>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('RIGHT')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n →\n </Button>\n </div>\n\n {showOverlay.visible && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/80 rounded-lg\">\n <p className=\"text-4xl font-bold mb-4 text-red-500\">{showOverlay.text}</p>\n <p className=\"mb-2 text-xl text-gray-300\">\n Final Score: <strong className=\"text-yellow-400\">{state.score}</strong>\n </p>\n <p className=\"mb-6 text-lg text-gray-300\">\n Length: <strong className=\"text-green-400\">{state.snake.length}</strong>\n </p>\n <Button onClick={resetGame} size=\"lg\" className=\"bg-green-600 hover:bg-green-700\">\n Play Again\n </Button>\n </div>\n )}\n\n <div className=\"text-xs text-center text-gray-400 max-w-md\">\n Arrow keys or WASD to move • Space to pause • Red apple = +10 pts • Golden star = +10 pts (every 50 pts)\n </div>\n </div>\n );\n};\n\nexport default SnakeGame;"],"mappings":"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","names":["import_jsx_runtime","import_react","import_jsx_runtime","config","import_react","import_jsx_runtime","config","state"]}
|
package/dist/index.css
CHANGED
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"Liberation Mono",
|
|
22
22
|
"Courier New",
|
|
23
23
|
monospace;
|
|
24
|
-
--color-red-400: oklch(70.4% 0.191 22.216);
|
|
25
24
|
--color-red-500: oklch(63.7% 0.237 25.331);
|
|
26
25
|
--color-yellow-400: oklch(85.2% 0.199 91.936);
|
|
27
26
|
--color-green-400: oklch(79.2% 0.209 151.711);
|
|
@@ -53,7 +52,6 @@
|
|
|
53
52
|
--font-weight-medium: 500;
|
|
54
53
|
--font-weight-semibold: 600;
|
|
55
54
|
--font-weight-bold: 700;
|
|
56
|
-
--tracking-widest: 0.1em;
|
|
57
55
|
--default-transition-duration: 150ms;
|
|
58
56
|
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
59
57
|
--default-font-family: var(--font-sans);
|
|
@@ -329,9 +327,6 @@
|
|
|
329
327
|
.h-10 {
|
|
330
328
|
height: calc(var(--spacing) * 10);
|
|
331
329
|
}
|
|
332
|
-
.w-6 {
|
|
333
|
-
width: calc(var(--spacing) * 6);
|
|
334
|
-
}
|
|
335
330
|
.w-48 {
|
|
336
331
|
width: calc(var(--spacing) * 48);
|
|
337
332
|
}
|
|
@@ -353,9 +348,6 @@
|
|
|
353
348
|
.grid-cols-3 {
|
|
354
349
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
355
350
|
}
|
|
356
|
-
.grid-cols-7 {
|
|
357
|
-
grid-template-columns: repeat(7, minmax(0, 1fr));
|
|
358
|
-
}
|
|
359
351
|
.grid-rows-\[auto_auto\] {
|
|
360
352
|
grid-template-rows: auto auto;
|
|
361
353
|
}
|
|
@@ -413,10 +405,6 @@
|
|
|
413
405
|
border-style: var(--tw-border-style);
|
|
414
406
|
border-width: 4px;
|
|
415
407
|
}
|
|
416
|
-
.border-b {
|
|
417
|
-
border-bottom-style: var(--tw-border-style);
|
|
418
|
-
border-bottom-width: 1px;
|
|
419
|
-
}
|
|
420
408
|
.border-gray-300 {
|
|
421
409
|
border-color: var(--color-gray-300);
|
|
422
410
|
}
|
|
@@ -432,12 +420,6 @@
|
|
|
432
420
|
background-color: color-mix(in oklab, var(--color-black) 60%, transparent);
|
|
433
421
|
}
|
|
434
422
|
}
|
|
435
|
-
.bg-black\/70 {
|
|
436
|
-
background-color: color-mix(in srgb, #000 70%, transparent);
|
|
437
|
-
@supports (color: color-mix(in lab, red, red)) {
|
|
438
|
-
background-color: color-mix(in oklab, var(--color-black) 70%, transparent);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
423
|
.bg-black\/80 {
|
|
442
424
|
background-color: color-mix(in srgb, #000 80%, transparent);
|
|
443
425
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -480,9 +462,6 @@
|
|
|
480
462
|
.text-center {
|
|
481
463
|
text-align: center;
|
|
482
464
|
}
|
|
483
|
-
.font-mono {
|
|
484
|
-
font-family: var(--font-mono);
|
|
485
|
-
}
|
|
486
465
|
.text-2xl {
|
|
487
466
|
font-size: var(--text-2xl);
|
|
488
467
|
line-height: var(--tw-leading, var(--text-2xl--line-height));
|
|
@@ -527,10 +506,6 @@
|
|
|
527
506
|
--tw-font-weight: var(--font-weight-semibold);
|
|
528
507
|
font-weight: var(--font-weight-semibold);
|
|
529
508
|
}
|
|
530
|
-
.tracking-widest {
|
|
531
|
-
--tw-tracking: var(--tracking-widest);
|
|
532
|
-
letter-spacing: var(--tracking-widest);
|
|
533
|
-
}
|
|
534
509
|
.whitespace-nowrap {
|
|
535
510
|
white-space: nowrap;
|
|
536
511
|
}
|
|
@@ -564,9 +539,6 @@
|
|
|
564
539
|
.text-primary-foreground {
|
|
565
540
|
color: var(--primary-foreground);
|
|
566
541
|
}
|
|
567
|
-
.text-red-400 {
|
|
568
|
-
color: var(--color-red-400);
|
|
569
|
-
}
|
|
570
542
|
.text-red-500 {
|
|
571
543
|
color: var(--color-red-500);
|
|
572
544
|
}
|
|
@@ -980,7 +952,6 @@
|
|
|
980
952
|
@property --tw-border-style { syntax: "*"; inherits: false; initial-value: solid; }
|
|
981
953
|
@property --tw-leading { syntax: "*"; inherits: false; }
|
|
982
954
|
@property --tw-font-weight { syntax: "*"; inherits: false; }
|
|
983
|
-
@property --tw-tracking { syntax: "*"; inherits: false; }
|
|
984
955
|
@property --tw-shadow { syntax: "*"; inherits: false; initial-value: 0 0 #0000; }
|
|
985
956
|
@property --tw-shadow-color { syntax: "*"; inherits: false; }
|
|
986
957
|
@property --tw-shadow-alpha { syntax: "<percentage>"; inherits: false; initial-value: 100%; }
|
|
@@ -1005,7 +976,6 @@
|
|
|
1005
976
|
--tw-border-style: solid;
|
|
1006
977
|
--tw-leading: initial;
|
|
1007
978
|
--tw-font-weight: initial;
|
|
1008
|
-
--tw-tracking: initial;
|
|
1009
979
|
--tw-shadow: 0 0 #0000;
|
|
1010
980
|
--tw-shadow-color: initial;
|
|
1011
981
|
--tw-shadow-alpha: 100%;
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.css"],"sourcesContent":["/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-md: 28rem;\n --container-xl: 36rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-widest: 0.1em;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .visible {\n visibility: visible;\n }\n .absolute {\n position: absolute;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .mx-auto {\n margin-inline: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .inline-flex {\n display: inline-flex;\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .w-6 {\n width: calc(var(--spacing) * 6);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-xl {\n max-width: var(--container-xl);\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .grid-cols-7 {\n grid-template-columns: repeat(7, minmax(0, 1fr));\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-center {\n justify-content: center;\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .self-start {\n align-self: flex-start;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-b {\n border-bottom-style: var(--tw-border-style);\n border-bottom-width: 1px;\n }\n .border-gray-300 {\n border-color: var(--color-gray-300);\n }\n .border-green-600 {\n border-color: var(--color-green-600);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-black\\/60 {\n background-color: color-mix(in srgb, #000 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 60%, transparent);\n }\n }\n .bg-black\\/70 {\n background-color: color-mix(in srgb, #000 70%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 70%, transparent);\n }\n }\n .bg-black\\/80 {\n background-color: color-mix(in srgb, #000 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 80%, transparent);\n }\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-green-600 {\n background-color: var(--color-green-600);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .text-center {\n text-align: center;\n }\n .font-mono {\n font-family: var(--font-mono);\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .tracking-widest {\n --tw-tracking: var(--tracking-widest);\n letter-spacing: var(--tracking-widest);\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-gray-300 {\n color: var(--color-gray-300);\n }\n .text-gray-400 {\n color: var(--color-gray-400);\n }\n .text-green-400 {\n color: var(--color-green-400);\n }\n .text-green-500 {\n color: var(--color-green-500);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-red-400 {\n color: var(--color-red-400);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-400 {\n color: var(--color-yellow-400);\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .paused {\n animation-play-state: paused;\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-green-700 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-green-700);\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: none;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-blur {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-blur {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.145 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.145 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.985 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.637 0.237 25.331);\n --border: oklch(0.269 0 0);\n --input: oklch(0.269 0 0);\n --ring: oklch(0.439 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(0.269 0 0);\n --sidebar-ring: oklch(0.439 0 0);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: none;\n --tw-animation-iteration-count: 1;\n --tw-enter-blur: 0;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-blur: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.css"],"sourcesContent":["/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root, :host {\n --font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-black: #000;\n --color-white: #fff;\n --spacing: 0.25rem;\n --container-md: 28rem;\n --container-xl: 36rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: var(--font-sans);\n --default-mono-font-family: var(--font-mono);\n }\n}\n@layer base {\n *, ::after, ::before, ::backdrop, ::file-selector-button {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0 solid;\n }\n html, :host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n tab-size: 4;\n font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");\n font-feature-settings: var(--default-font-feature-settings, normal);\n font-variation-settings: var(--default-font-variation-settings, normal);\n -webkit-tap-highlight-color: transparent;\n }\n hr {\n height: 0;\n color: inherit;\n border-top-width: 1px;\n }\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n h1, h2, h3, h4, h5, h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n b, strong {\n font-weight: bolder;\n }\n code, kbd, samp, pre {\n font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n font-feature-settings: var(--default-mono-font-feature-settings, normal);\n font-variation-settings: var(--default-mono-font-variation-settings, normal);\n font-size: 1em;\n }\n small {\n font-size: 80%;\n }\n sub, sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n table {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse;\n }\n :-moz-focusring {\n outline: auto;\n }\n progress {\n vertical-align: baseline;\n }\n summary {\n display: list-item;\n }\n ol, ul, menu {\n list-style: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n vertical-align: middle;\n }\n img, video {\n max-width: 100%;\n height: auto;\n }\n button, input, select, optgroup, textarea, ::file-selector-button {\n font: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n letter-spacing: inherit;\n color: inherit;\n border-radius: 0;\n background-color: transparent;\n opacity: 1;\n }\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n ::placeholder {\n opacity: 1;\n }\n @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {\n ::placeholder {\n color: currentcolor;\n @supports (color: color-mix(in lab, red, red)) {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n }\n textarea {\n resize: vertical;\n }\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n ::-webkit-date-and-time-value {\n min-height: 1lh;\n text-align: inherit;\n }\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n :-moz-ui-invalid {\n box-shadow: none;\n }\n button, input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]), ::file-selector-button {\n appearance: button;\n }\n ::-webkit-inner-spin-button, ::-webkit-outer-spin-button {\n height: auto;\n }\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n@layer utilities {\n .\\@container\\/card-header {\n container-type: inline-size;\n container-name: card-header;\n }\n .visible {\n visibility: visible;\n }\n .absolute {\n position: absolute;\n }\n .relative {\n position: relative;\n }\n .inset-0 {\n inset: calc(var(--spacing) * 0);\n }\n .col-start-2 {\n grid-column-start: 2;\n }\n .row-span-2 {\n grid-row: span 2 / span 2;\n }\n .row-start-1 {\n grid-row-start: 1;\n }\n .mx-auto {\n margin-inline: auto;\n }\n .mt-1 {\n margin-top: calc(var(--spacing) * 1);\n }\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n .mb-4 {\n margin-bottom: calc(var(--spacing) * 4);\n }\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n .flex {\n display: flex;\n }\n .grid {\n display: grid;\n }\n .inline-flex {\n display: inline-flex;\n }\n .size-8 {\n width: calc(var(--spacing) * 8);\n height: calc(var(--spacing) * 8);\n }\n .size-9 {\n width: calc(var(--spacing) * 9);\n height: calc(var(--spacing) * 9);\n }\n .size-10 {\n width: calc(var(--spacing) * 10);\n height: calc(var(--spacing) * 10);\n }\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n .h-6 {\n height: calc(var(--spacing) * 6);\n }\n .h-8 {\n height: calc(var(--spacing) * 8);\n }\n .h-9 {\n height: calc(var(--spacing) * 9);\n }\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n .w-48 {\n width: calc(var(--spacing) * 48);\n }\n .max-w-md {\n max-width: var(--container-md);\n }\n .max-w-xl {\n max-width: var(--container-xl);\n }\n .shrink-0 {\n flex-shrink: 0;\n }\n .cursor-pointer {\n cursor: pointer;\n }\n .auto-rows-min {\n grid-auto-rows: min-content;\n }\n .grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n .grid-rows-\\[auto_auto\\] {\n grid-template-rows: auto auto;\n }\n .flex-col {\n flex-direction: column;\n }\n .items-center {\n align-items: center;\n }\n .items-start {\n align-items: flex-start;\n }\n .justify-center {\n justify-content: center;\n }\n .gap-1\\.5 {\n gap: calc(var(--spacing) * 1.5);\n }\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n .gap-4 {\n gap: calc(var(--spacing) * 4);\n }\n .gap-6 {\n gap: calc(var(--spacing) * 6);\n }\n .gap-8 {\n gap: calc(var(--spacing) * 8);\n }\n .self-start {\n align-self: flex-start;\n }\n .justify-self-end {\n justify-self: flex-end;\n }\n .rounded-lg {\n border-radius: var(--radius);\n }\n .rounded-md {\n border-radius: calc(var(--radius) - 2px);\n }\n .rounded-xl {\n border-radius: calc(var(--radius) + 4px);\n }\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n .border-2 {\n border-style: var(--tw-border-style);\n border-width: 2px;\n }\n .border-4 {\n border-style: var(--tw-border-style);\n border-width: 4px;\n }\n .border-gray-300 {\n border-color: var(--color-gray-300);\n }\n .border-green-600 {\n border-color: var(--color-green-600);\n }\n .bg-background {\n background-color: var(--background);\n }\n .bg-black\\/60 {\n background-color: color-mix(in srgb, #000 60%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 60%, transparent);\n }\n }\n .bg-black\\/80 {\n background-color: color-mix(in srgb, #000 80%, transparent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--color-black) 80%, transparent);\n }\n }\n .bg-card {\n background-color: var(--card);\n }\n .bg-destructive {\n background-color: var(--destructive);\n }\n .bg-green-600 {\n background-color: var(--color-green-600);\n }\n .bg-primary {\n background-color: var(--primary);\n }\n .bg-secondary {\n background-color: var(--secondary);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n .py-6 {\n padding-block: calc(var(--spacing) * 6);\n }\n .text-center {\n text-align: center;\n }\n .text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n .text-4xl {\n font-size: var(--text-4xl);\n line-height: var(--tw-leading, var(--text-4xl--line-height));\n }\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n .whitespace-nowrap {\n white-space: nowrap;\n }\n .text-blue-400 {\n color: var(--color-blue-400);\n }\n .text-card-foreground {\n color: var(--card-foreground);\n }\n .text-foreground {\n color: var(--foreground);\n }\n .text-gray-300 {\n color: var(--color-gray-300);\n }\n .text-gray-400 {\n color: var(--color-gray-400);\n }\n .text-green-400 {\n color: var(--color-green-400);\n }\n .text-green-500 {\n color: var(--color-green-500);\n }\n .text-muted-foreground {\n color: var(--muted-foreground);\n }\n .text-primary {\n color: var(--primary);\n }\n .text-primary-foreground {\n color: var(--primary-foreground);\n }\n .text-red-500 {\n color: var(--color-red-500);\n }\n .text-secondary-foreground {\n color: var(--secondary-foreground);\n }\n .text-white {\n color: var(--color-white);\n }\n .text-yellow-400 {\n color: var(--color-yellow-400);\n }\n .underline-offset-4 {\n text-underline-offset: 4px;\n }\n .shadow-sm {\n --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xl {\n --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .shadow-xs {\n --tw-shadow: 0 1px 2px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.05));\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .outline {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n .outline-none {\n --tw-outline-style: none;\n outline-style: none;\n }\n .paused {\n animation-play-state: paused;\n }\n .hover\\:bg-accent {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n }\n }\n }\n .hover\\:bg-destructive\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-green-700 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--color-green-700);\n }\n }\n }\n .hover\\:bg-primary\\/90 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--primary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--primary) 90%, transparent);\n }\n }\n }\n }\n .hover\\:bg-secondary\\/80 {\n &:hover {\n @media (hover: hover) {\n background-color: var(--secondary);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--secondary) 80%, transparent);\n }\n }\n }\n }\n .hover\\:text-accent-foreground {\n &:hover {\n @media (hover: hover) {\n color: var(--accent-foreground);\n }\n }\n }\n .hover\\:underline {\n &:hover {\n @media (hover: hover) {\n text-decoration-line: underline;\n }\n }\n }\n .focus-visible\\:border-ring {\n &:focus-visible {\n border-color: var(--ring);\n }\n }\n .focus-visible\\:ring-\\[3px\\] {\n &:focus-visible {\n --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n }\n .focus-visible\\:ring-destructive\\/20 {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .focus-visible\\:ring-ring\\/50 {\n &:focus-visible {\n --tw-ring-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n }\n .disabled\\:pointer-events-none {\n &:disabled {\n pointer-events: none;\n }\n }\n .disabled\\:opacity-50 {\n &:disabled {\n opacity: 50%;\n }\n }\n .has-data-\\[slot\\=card-action\\]\\:grid-cols-\\[1fr_auto\\] {\n &:has(*[data-slot=\"card-action\"]) {\n grid-template-columns: 1fr auto;\n }\n }\n .has-\\[\\>svg\\]\\:px-2\\.5 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 2.5);\n }\n }\n .has-\\[\\>svg\\]\\:px-3 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 3);\n }\n }\n .has-\\[\\>svg\\]\\:px-4 {\n &:has(>svg) {\n padding-inline: calc(var(--spacing) * 4);\n }\n }\n .aria-invalid\\:border-destructive {\n &[aria-invalid=\"true\"] {\n border-color: var(--destructive);\n }\n }\n .aria-invalid\\:ring-destructive\\/20 {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 20%, transparent);\n }\n }\n }\n .dark\\:border-input {\n &:is(.dark *) {\n border-color: var(--input);\n }\n }\n .dark\\:bg-destructive\\/60 {\n &:is(.dark *) {\n background-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--destructive) 60%, transparent);\n }\n }\n }\n .dark\\:bg-input\\/30 {\n &:is(.dark *) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 30%, transparent);\n }\n }\n }\n .dark\\:hover\\:bg-accent\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--accent);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--accent) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:hover\\:bg-input\\/50 {\n &:is(.dark *) {\n &:hover {\n @media (hover: hover) {\n background-color: var(--input);\n @supports (color: color-mix(in lab, red, red)) {\n background-color: color-mix(in oklab, var(--input) 50%, transparent);\n }\n }\n }\n }\n }\n .dark\\:focus-visible\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &:focus-visible {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .dark\\:aria-invalid\\:ring-destructive\\/40 {\n &:is(.dark *) {\n &[aria-invalid=\"true\"] {\n --tw-ring-color: var(--destructive);\n @supports (color: color-mix(in lab, red, red)) {\n --tw-ring-color: color-mix(in oklab, var(--destructive) 40%, transparent);\n }\n }\n }\n }\n .\\[\\&_svg\\]\\:pointer-events-none {\n & svg {\n pointer-events: none;\n }\n }\n .\\[\\&_svg\\]\\:shrink-0 {\n & svg {\n flex-shrink: 0;\n }\n }\n .\\[\\&_svg\\:not\\(\\[class\\*\\=\\'size-\\'\\]\\)\\]\\:size-4 {\n & svg:not([class*='size-']) {\n width: calc(var(--spacing) * 4);\n height: calc(var(--spacing) * 4);\n }\n }\n .\\[\\.border-b\\]\\:pb-6 {\n &:is(.border-b) {\n padding-bottom: calc(var(--spacing) * 6);\n }\n }\n .\\[\\.border-t\\]\\:pt-6 {\n &:is(.border-t) {\n padding-top: calc(var(--spacing) * 6);\n }\n }\n}\n@property --tw-animation-delay {\n syntax: \"*\";\n inherits: false;\n initial-value: 0s;\n}\n@property --tw-animation-direction {\n syntax: \"*\";\n inherits: false;\n initial-value: normal;\n}\n@property --tw-animation-duration {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-animation-fill-mode {\n syntax: \"*\";\n inherits: false;\n initial-value: none;\n}\n@property --tw-animation-iteration-count {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-blur {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-enter-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-enter-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-blur {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-opacity {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-rotate {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-scale {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n@property --tw-exit-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n@property --tw-exit-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n:root {\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --destructive-foreground: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n --chart-1: oklch(0.646 0.222 41.116);\n --chart-2: oklch(0.6 0.118 184.704);\n --chart-3: oklch(0.398 0.07 227.392);\n --chart-4: oklch(0.828 0.189 84.429);\n --chart-5: oklch(0.769 0.188 70.08);\n --radius: 0.625rem;\n --sidebar: oklch(0.985 0 0);\n --sidebar-foreground: oklch(0.145 0 0);\n --sidebar-primary: oklch(0.205 0 0);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.97 0 0);\n --sidebar-accent-foreground: oklch(0.205 0 0);\n --sidebar-border: oklch(0.922 0 0);\n --sidebar-ring: oklch(0.708 0 0);\n}\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.145 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.145 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.985 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.396 0.141 25.723);\n --destructive-foreground: oklch(0.637 0.237 25.331);\n --border: oklch(0.269 0 0);\n --input: oklch(0.269 0 0);\n --ring: oklch(0.439 0 0);\n --chart-1: oklch(0.488 0.243 264.376);\n --chart-2: oklch(0.696 0.17 162.48);\n --chart-3: oklch(0.769 0.188 70.08);\n --chart-4: oklch(0.627 0.265 303.9);\n --chart-5: oklch(0.645 0.246 16.439);\n --sidebar: oklch(0.205 0 0);\n --sidebar-foreground: oklch(0.985 0 0);\n --sidebar-primary: oklch(0.488 0.243 264.376);\n --sidebar-primary-foreground: oklch(0.985 0 0);\n --sidebar-accent: oklch(0.269 0 0);\n --sidebar-accent-foreground: oklch(0.985 0 0);\n --sidebar-border: oklch(0.269 0 0);\n --sidebar-ring: oklch(0.439 0 0);\n}\n@layer base {\n * {\n border-color: var(--border);\n outline-color: var(--ring);\n @supports (color: color-mix(in lab, red, red)) {\n outline-color: color-mix(in oklab, var(--ring) 50%, transparent);\n }\n }\n body {\n background-color: var(--background);\n color: var(--foreground);\n }\n}\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@property --tw-leading {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-inset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-shadow-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n@property --tw-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-inset-ring-color {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-inset-ring-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-ring-inset {\n syntax: \"*\";\n inherits: false;\n}\n@property --tw-ring-offset-width {\n syntax: \"<length>\";\n inherits: false;\n initial-value: 0px;\n}\n@property --tw-ring-offset-color {\n syntax: \"*\";\n inherits: false;\n initial-value: #fff;\n}\n@property --tw-ring-offset-shadow {\n syntax: \"*\";\n inherits: false;\n initial-value: 0 0 #0000;\n}\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n@layer properties {\n @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) {\n *, ::before, ::after, ::backdrop {\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-shadow: 0 0 #0000;\n --tw-shadow-color: initial;\n --tw-shadow-alpha: 100%;\n --tw-inset-shadow: 0 0 #0000;\n --tw-inset-shadow-color: initial;\n --tw-inset-shadow-alpha: 100%;\n --tw-ring-color: initial;\n --tw-ring-shadow: 0 0 #0000;\n --tw-inset-ring-color: initial;\n --tw-inset-ring-shadow: 0 0 #0000;\n --tw-ring-inset: initial;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-outline-style: solid;\n --tw-animation-delay: 0s;\n --tw-animation-direction: normal;\n --tw-animation-duration: initial;\n --tw-animation-fill-mode: none;\n --tw-animation-iteration-count: 1;\n --tw-enter-blur: 0;\n --tw-enter-opacity: 1;\n --tw-enter-rotate: 0;\n --tw-enter-scale: 1;\n --tw-enter-translate-x: 0;\n --tw-enter-translate-y: 0;\n --tw-exit-blur: 0;\n --tw-exit-opacity: 1;\n --tw-exit-rotate: 0;\n --tw-exit-scale: 1;\n --tw-exit-translate-x: 0;\n --tw-exit-translate-y: 0;\n }\n }\n}"],"mappings":"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","names":[]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/games/spacedodger/index.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/games/memorygame/index.tsx","../src/components/games/snake/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface Position {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface Enemy extends Position {\r\n radius: number;\r\n}\r\n\r\ninterface Player extends Position {\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface SpaceDodgerState {\r\n player: Player;\r\n enemies: Enemy[];\r\n frame: number;\r\n keys: Record<string, boolean>;\r\n}\r\n\r\n\r\nconst config = {\r\n canvasSize : { \r\n width: 450, \r\n height: 450 \r\n },\r\n player: { x: 200, y: 350, width: 25, height: 50 }\r\n}\r\n\r\nconst SpaceDodger: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const scoreRef = useRef(0);\r\n const lastBatchScoreRef = useRef(0);\r\n\r\n const [score, setScore] = useState(0);\r\n const [gameOver, setGameOver] = useState(false);\r\n\r\n const gameStateRef = useRef<SpaceDodgerState>({\r\n player: config.player,\r\n enemies: [],\r\n frame: 0,\r\n keys: {}\r\n });\r\n\r\n const resetGame = () => {\r\n gameStateRef.current = {\r\n player: config.player,\r\n enemies: [],\r\n frame: 0,\r\n keys: {}\r\n };\r\n scoreRef.current = 0;\r\n lastBatchScoreRef.current = 0;\r\n setScore(0);\r\n setGameOver(false);\r\n };\r\n\r\n\r\n \r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n const state = gameStateRef.current;\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n state.keys[e.key] = true;\r\n };\r\n const handleKeyUp = (e: KeyboardEvent) => {\r\n state.keys[e.key] = false;\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n window.addEventListener('keyup', handleKeyUp);\r\n\r\n const randomRadius = () => 10 + Math.random() * 15;\r\n\r\n const getEnemySpeed = () => {\r\n const base = 3;\r\n const increase = Math.floor(scoreRef.current / 20) * 0.5;\r\n return base + increase;\r\n };\r\n\r\n let animationId: number;\r\n\r\n const gameLoop = () => {\r\n if (gameOver) return;\r\n\r\n state.frame++;\r\n\r\n ctx.fillStyle = '#000';\r\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\r\n\r\n // Player movement\r\n if (state.keys['ArrowLeft'] && state.player.x > 0) state.player.x -= 5;\r\n if (state.keys['ArrowRight'] && state.player.x < config.canvasSize.width - state.player.width) state.player.x += 5;\r\n if (state.keys['ArrowUp'] && state.player.y > 0) state.player.y -= 5;\r\n if (state.keys['ArrowDown'] && state.player.y < config.canvasSize.height - state.player.height) state.player.y += 5;\r\n\r\n // Draw player\r\n ctx.fillStyle = '#0ea5e9';\r\n ctx.fillRect(\r\n state.player.x,\r\n state.player.y,\r\n state.player.width,\r\n state.player.height\r\n );\r\n\r\n // Normal enemy spawn\r\n if (state.frame % 40 === 0) {\r\n const radius = randomRadius();\r\n state.enemies.push({\r\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\r\n y: -radius,\r\n radius,\r\n });\r\n }\r\n\r\n // Extra batch every 20 score\r\n if (\r\n scoreRef.current > 0 &&\r\n scoreRef.current % 20 === 0 &&\r\n lastBatchScoreRef.current !== scoreRef.current\r\n ) {\r\n lastBatchScoreRef.current = scoreRef.current;\r\n const batchCount = 2 + Math.floor(Math.random() * 3);\r\n\r\n for (let i = 0; i < batchCount; i++) {\r\n const radius = randomRadius();\r\n state.enemies.push({\r\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\r\n y: -Math.random() * 100,\r\n radius\r\n });\r\n }\r\n }\r\n\r\n // Enemies update\r\n state.enemies = state.enemies.filter(enemy => {\r\n enemy.y += getEnemySpeed();\r\n\r\n // Draw enemy (circle)\r\n ctx.fillStyle = '#ef4444';\r\n ctx.beginPath();\r\n ctx.arc(enemy.x, enemy.y, enemy.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n\r\n // Circle vs rectangle collision\r\n const closestX = Math.max(\r\n state.player.x,\r\n Math.min(enemy.x, state.player.x + state.player.width)\r\n );\r\n const closestY = Math.max(\r\n state.player.y,\r\n Math.min(enemy.y, state.player.y + state.player.height)\r\n );\r\n\r\n const dx = enemy.x - closestX;\r\n const dy = enemy.y - closestY;\r\n\r\n if (dx * dx + dy * dy < enemy.radius * enemy.radius) {\r\n setGameOver(true);\r\n return false;\r\n }\r\n\r\n // Passed screen\r\n if (enemy.y - enemy.radius > config.canvasSize.height) {\r\n setScore(s => {\r\n scoreRef.current = s + 1;\r\n return s + 1;\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n animationId = requestAnimationFrame(gameLoop);\r\n };\r\n\r\n gameLoop();\r\n\r\n return () => {\r\n cancelAnimationFrame(animationId);\r\n window.removeEventListener('keydown', handleKeyDown);\r\n window.removeEventListener('keyup', handleKeyUp);\r\n };\r\n }, [gameOver]);\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\r\n <div className=\"text-xl font-bold\">Score: {score}</div>\r\n <canvas\r\n ref={canvasRef}\r\n width={config.canvasSize.width}\r\n height={config.canvasSize.height}\r\n className=\"border-2 border-gray-300\"\r\n />\r\n\r\n {gameOver && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-xl font-bold text-red-500 mb-3\">Game Over</p>\r\n <Button onClick={resetGame}>Play Again</Button>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-sm text-foreground\">Use arrow keys to move</div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SpaceDodger;","import * as React from \"react\"\r\nimport { Slot } from \"@radix-ui/react-slot\"\r\nimport { cva, type VariantProps } from \"class-variance-authority\"\r\n\r\nimport { cn } from \"@/lib/utils\"\r\n\r\nconst buttonVariants = cva(\r\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\r\n {\r\n variants: {\r\n variant: {\r\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\r\n destructive:\r\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\r\n outline:\r\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\r\n secondary:\r\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\r\n ghost:\r\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\r\n link: \"text-primary underline-offset-4 hover:underline\",\r\n },\r\n size: {\r\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\r\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\r\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\r\n icon: \"size-9\",\r\n \"icon-sm\": \"size-8\",\r\n \"icon-lg\": \"size-10\",\r\n },\r\n },\r\n defaultVariants: {\r\n variant: \"default\",\r\n size: \"default\",\r\n },\r\n }\r\n)\r\n\r\nfunction Button({\r\n className,\r\n variant = \"default\",\r\n size = \"default\",\r\n asChild = false,\r\n ...props\r\n}: React.ComponentProps<\"button\"> &\r\n VariantProps<typeof buttonVariants> & {\r\n asChild?: boolean\r\n }) {\r\n const Comp = asChild ? Slot : \"button\"\r\n\r\n return (\r\n <Comp\r\n data-slot=\"button\"\r\n data-variant={variant}\r\n data-size={size}\r\n className={cn(buttonVariants({ variant, size, className }))}\r\n {...props}\r\n />\r\n )\r\n}\r\n\r\nexport { Button, buttonVariants }\r\n","import { clsx, type ClassValue } from \"clsx\"\r\nimport { twMerge } from \"tailwind-merge\"\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs))\r\n}","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ninterface NumberItem {\r\n x: number;\r\n y: number;\r\n value: number;\r\n radius: number;\r\n}\r\n\r\ntype GamePhase = 'memorize' | 'recall' | 'transition';\r\n\r\ninterface GameState {\r\n numbers: NumberItem[];\r\n sequence: number[];\r\n currentIndex: number;\r\n level: number;\r\n showNumbers: boolean;\r\n phase: GamePhase;\r\n revealed: Set<number>;\r\n}\r\n\r\nconst config = {\r\n canvasSize: { width: 450, height: 450 },\r\n baseHideTime: 3000,\r\n numberRadius: 30,\r\n};\r\n\r\nconst MemoryGame: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [level, setLevel] = useState(1);\r\n const [gameOver, setGameOver] = useState(false);\r\n const [message, setMessage] = useState('');\r\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\r\n visible: false,\r\n text: '',\r\n });\r\n const gameStateRef = useRef<GameState>({\r\n numbers: [],\r\n sequence: [],\r\n currentIndex: 0,\r\n level: 1,\r\n showNumbers: true,\r\n phase: 'memorize',\r\n revealed: new Set(),\r\n });\r\n\r\n // Max numbers = 9\r\n const getNumberCount = (lvl: number) => Math.min(4 + lvl, 9);\r\n\r\n // Hide time decreases as level increases, min 500ms\r\n const getHideTime = (lvl: number) =>\r\n Math.max(500, config.baseHideTime - Math.floor((lvl - 1) / 1) * 500);\r\n\r\n const generateNumbers = (lvl: number) => {\r\n const count = getNumberCount(lvl);\r\n const numbers: NumberItem[] = [];\r\n const sequence: number[] = [];\r\n const padding = config.numberRadius * 2.5;\r\n\r\n for (let i = 0; i < count; i++) {\r\n let x: number, y: number, overlap: boolean;\r\n let attempts = 0;\r\n\r\n do {\r\n overlap = false;\r\n x = padding + Math.random() * (config.canvasSize.width - padding * 2);\r\n y = padding + Math.random() * (config.canvasSize.height - padding * 2);\r\n\r\n for (const num of numbers) {\r\n const dx = x - num.x;\r\n const dy = y - num.y;\r\n if (Math.sqrt(dx * dx + dy * dy) < config.numberRadius * 2.5) {\r\n overlap = true;\r\n break;\r\n }\r\n }\r\n attempts++;\r\n } while (overlap && attempts < 100);\r\n\r\n numbers.push({ x, y, value: i + 1, radius: config.numberRadius });\r\n sequence.push(i + 1);\r\n }\r\n\r\n return { numbers, sequence };\r\n };\r\n\r\n const startLevel = (lvl: number) => {\r\n const { numbers, sequence } = generateNumbers(lvl);\r\n gameStateRef.current = {\r\n numbers,\r\n sequence,\r\n currentIndex: 0,\r\n level: lvl,\r\n showNumbers: true,\r\n phase: 'memorize',\r\n revealed: new Set(),\r\n };\r\n setMessage('Memorize the sequence!');\r\n\r\n setTimeout(() => {\r\n gameStateRef.current.showNumbers = false;\r\n gameStateRef.current.phase = 'recall';\r\n setMessage('Click the numbers in order!');\r\n }, getHideTime(lvl));\r\n };\r\n\r\n const resetGame = () => {\r\n setLevel(1);\r\n setGameOver(false);\r\n setShowOverlay({ visible: false, text: '' });\r\n startLevel(1);\r\n };\r\n\r\n const handleCanvasClick = (e: React.MouseEvent<HTMLCanvasElement>) => {\r\n if (gameOver || gameStateRef.current.phase !== 'recall') return;\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const state = gameStateRef.current;\r\n\r\n for (const num of state.numbers) {\r\n const distance = Math.hypot(x - num.x, y - num.y);\r\n if (distance <= num.radius) {\r\n const expected = state.sequence[state.currentIndex];\r\n if (num.value === expected) {\r\n state.revealed.add(num.value);\r\n state.currentIndex++;\r\n\r\n if (state.currentIndex === state.sequence.length) {\r\n const nextLevel = level + 1;\r\n setLevel(nextLevel);\r\n state.phase = 'transition';\r\n setShowOverlay({ visible: true, text: `Get Ready! Level ${nextLevel}` });\r\n\r\n setTimeout(() => {\r\n setShowOverlay({ visible: false, text: '' });\r\n startLevel(nextLevel);\r\n }, 1500);\r\n }\r\n } else {\r\n setGameOver(true);\r\n setMessage(`Wrong! Clicked ${num.value}, expected ${expected}`);\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => startLevel(1), []);\r\n\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n let animationId: number;\r\n\r\n const draw = () => {\r\n const state = gameStateRef.current;\r\n ctx.fillStyle = '#000';\r\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\r\n\r\n state.numbers.forEach((num, idx) => {\r\n // Show green hint only in level 1\r\n const isNext = state.phase === 'recall' && level === 1 && idx === state.currentIndex;\r\n ctx.fillStyle = isNext ? '#22c55e' : '#3b82f6';\r\n ctx.beginPath();\r\n ctx.arc(num.x, num.y, num.radius, 0, Math.PI * 2);\r\n ctx.fill();\r\n\r\n // Reveal numbers if memorizing, transitioning, or already correctly guessed\r\n if (state.showNumbers || state.phase === 'transition' || state.revealed.has(num.value)) {\r\n ctx.fillStyle = '#fff';\r\n ctx.font = 'bold 24px sans-serif';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n ctx.fillText(num.value.toString(), num.x, num.y);\r\n }\r\n });\r\n\r\n if (!gameOver) animationId = requestAnimationFrame(draw);\r\n };\r\n\r\n draw();\r\n return () => cancelAnimationFrame(animationId);\r\n }, [gameOver, level]);\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\r\n <div className=\"flex gap-8 text-xl font-bold\">\r\n <div>Level: {level}</div>\r\n <div>Numbers: {getNumberCount(level)}</div>\r\n </div>\r\n <div className=\"text-lg font-semibold text-blue-400 h-6\">{message}</div>\r\n <canvas\r\n ref={canvasRef}\r\n width={config.canvasSize.width}\r\n height={config.canvasSize.height}\r\n className=\"border-2 border-gray-300 cursor-pointer\"\r\n onClick={handleCanvasClick}\r\n />\r\n {gameOver && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-xl font-bold text-red-500 mb-2\">Game Over</p>\r\n <p className=\"text-lg text-white mb-4\">Reached Level {level}</p>\r\n <Button onClick={resetGame}>Play Again</Button>\r\n </div>\r\n )}\r\n\r\n {showOverlay.visible && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\r\n <p className=\"text-2xl font-bold text-yellow-400\">{showOverlay.text}</p>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-sm text-center text-foreground max-w-md\">\r\n <div>Memorize the numbers, then click them in sequence (1, 2, 3...)</div>\r\n <div className=\"mt-1 text-xs text-gray-400\">Green circle = next number to click (level 1 only)</div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default MemoryGame;\r\n","import React, { useEffect, useRef, useState } from 'react';\r\nimport { Button } from '@/components/ui/button';\r\n\r\ntype GamePhase = 'playing' | 'paused' | 'gameover';\r\ntype Direction = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\r\n\r\ninterface Position {\r\n x: number;\r\n y: number;\r\n}\r\n\r\ninterface GameState {\r\n snake: Position[];\r\n food: Position;\r\n bonusFood: Position[];\r\n direction: Direction;\r\n nextDirection: Direction;\r\n score: number;\r\n speed: number;\r\n phase: GamePhase;\r\n}\r\n\r\nconst config = {\r\n gridSize: 20,\r\n cellSize: 20,\r\n initialSpeed: 150,\r\n speedIncrement: 5,\r\n};\r\n\r\nconst SnakeGame: React.FC = () => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const [message, setMessage] = useState('Use arrow keys or WASD to play!');\r\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\r\n visible: false,\r\n text: '',\r\n });\r\n\r\n const gameStateRef = useRef<GameState>({\r\n snake: [{ x: 10, y: 10 }],\r\n food: { x: 15, y: 15 },\r\n bonusFood: [],\r\n direction: 'RIGHT',\r\n nextDirection: 'RIGHT',\r\n score: 0,\r\n speed: config.initialSpeed,\r\n phase: 'playing',\r\n });\r\n\r\n const generateFood = (snake: Position[]): Position => {\r\n let food: Position;\r\n do {\r\n food = {\r\n x: Math.floor(Math.random() * config.gridSize),\r\n y: Math.floor(Math.random() * config.gridSize),\r\n };\r\n } while (snake.some((seg) => seg.x === food.x && seg.y === food.y));\r\n return food;\r\n };\r\n\r\n const generateBonusFood = (snake: Position[], regularFood: Position, count: number = 3): Position[] => {\r\n const bonusFood: Position[] = [];\r\n for (let i = 0; i < count; i++) {\r\n let food: Position;\r\n do {\r\n food = {\r\n x: Math.floor(Math.random() * config.gridSize),\r\n y: Math.floor(Math.random() * config.gridSize),\r\n };\r\n } while (\r\n snake.some((seg) => seg.x === food.x && seg.y === food.y) ||\r\n (food.x === regularFood.x && food.y === regularFood.y) ||\r\n bonusFood.some((bf) => bf.x === food.x && bf.y === food.y)\r\n );\r\n bonusFood.push(food);\r\n }\r\n return bonusFood;\r\n };\r\n\r\n const initGame = () => {\r\n const initialSnake = [{ x: 10, y: 10 }];\r\n gameStateRef.current = {\r\n snake: initialSnake,\r\n food: generateFood(initialSnake),\r\n bonusFood: [],\r\n direction: 'RIGHT',\r\n nextDirection: 'RIGHT',\r\n score: 0,\r\n speed: config.initialSpeed,\r\n phase: 'playing',\r\n };\r\n setMessage('Use arrow keys or WASD to play!');\r\n };\r\n\r\n const checkCollision = (head: Position, snake: Position[]): boolean => {\r\n // Only self collision (no wall collision - wrap around instead)\r\n return snake.some((seg) => seg.x === head.x && seg.y === head.y);\r\n };\r\n\r\n const moveSnake = () => {\r\n const state = gameStateRef.current;\r\n if (state.phase !== 'playing') return;\r\n\r\n state.direction = state.nextDirection;\r\n\r\n const head = { ...state.snake[0] };\r\n\r\n switch (state.direction) {\r\n case 'UP':\r\n head.y -= 1;\r\n break;\r\n case 'DOWN':\r\n head.y += 1;\r\n break;\r\n case 'LEFT':\r\n head.x -= 1;\r\n break;\r\n case 'RIGHT':\r\n head.x += 1;\r\n break;\r\n }\r\n\r\n // Wrap around edges\r\n if (head.x < 0) head.x = config.gridSize - 1;\r\n if (head.x >= config.gridSize) head.x = 0;\r\n if (head.y < 0) head.y = config.gridSize - 1;\r\n if (head.y >= config.gridSize) head.y = 0;\r\n\r\n if (checkCollision(head, state.snake)) {\r\n state.phase = 'gameover';\r\n setShowOverlay({ visible: true, text: 'Game Over! 💀' });\r\n return;\r\n }\r\n\r\n const newSnake = [head, ...state.snake];\r\n let ateFood = false;\r\n\r\n // Check if regular food eaten\r\n if (head.x === state.food.x && head.y === state.food.y) {\r\n state.score += 10;\r\n state.speed = Math.max(50, state.speed - config.speedIncrement);\r\n state.food = generateFood(newSnake);\r\n ateFood = true;\r\n setMessage(`Score: ${state.score} 🍎`);\r\n\r\n // Generate bonus food every 50 points\r\n if (state.score % 50 === 0 && state.score > 0) {\r\n state.bonusFood = generateBonusFood(newSnake, state.food);\r\n setMessage(`Score: ${state.score} 🍎 BONUS FOOD! ⭐`);\r\n }\r\n }\r\n\r\n // Check if bonus food eaten\r\n const bonusFoodIndex = state.bonusFood.findIndex(\r\n (bf) => bf.x === head.x && bf.y === head.y\r\n );\r\n if (bonusFoodIndex !== -1) {\r\n state.score += 10;\r\n state.bonusFood.splice(bonusFoodIndex, 1);\r\n ateFood = true;\r\n setMessage(`Score: ${state.score} ⭐ Bonus!`);\r\n }\r\n\r\n if (!ateFood) {\r\n newSnake.pop();\r\n }\r\n\r\n state.snake = newSnake;\r\n };\r\n\r\n const handleDirectionChange = (newDirection: Direction) => {\r\n const state = gameStateRef.current;\r\n const opposites: Record<Direction, Direction> = {\r\n UP: 'DOWN',\r\n DOWN: 'UP',\r\n LEFT: 'RIGHT',\r\n RIGHT: 'LEFT',\r\n };\r\n\r\n if (opposites[state.direction] !== newDirection) {\r\n state.nextDirection = newDirection;\r\n }\r\n };\r\n\r\n const togglePause = () => {\r\n const state = gameStateRef.current;\r\n if (state.phase === 'playing') {\r\n state.phase = 'paused';\r\n setMessage('Game Paused');\r\n } else if (state.phase === 'paused') {\r\n state.phase = 'playing';\r\n setMessage('Use arrow keys or WASD to play!');\r\n }\r\n };\r\n\r\n const resetGame = () => {\r\n setShowOverlay({ visible: false, text: '' });\r\n initGame();\r\n };\r\n\r\n useEffect(() => {\r\n initGame();\r\n\r\n const onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key.toLowerCase();\r\n \r\n if (key === ' ') {\r\n e.preventDefault();\r\n togglePause();\r\n return;\r\n }\r\n\r\n if (gameStateRef.current.phase !== 'playing') return;\r\n\r\n switch (key) {\r\n case 'arrowup':\r\n case 'w':\r\n e.preventDefault();\r\n handleDirectionChange('UP');\r\n break;\r\n case 'arrowdown':\r\n case 's':\r\n e.preventDefault();\r\n handleDirectionChange('DOWN');\r\n break;\r\n case 'arrowleft':\r\n case 'a':\r\n e.preventDefault();\r\n handleDirectionChange('LEFT');\r\n break;\r\n case 'arrowright':\r\n case 'd':\r\n e.preventDefault();\r\n handleDirectionChange('RIGHT');\r\n break;\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', onKeyDown);\r\n return () => window.removeEventListener('keydown', onKeyDown);\r\n }, []);\r\n\r\n // Game loop\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n moveSnake();\r\n }, gameStateRef.current.speed);\r\n\r\n return () => clearInterval(interval);\r\n }, []);\r\n\r\n // Drawing\r\n useEffect(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return;\r\n\r\n let animationId: number;\r\n\r\n const draw = () => {\r\n const state = gameStateRef.current;\r\n const width = config.gridSize * config.cellSize;\r\n const height = config.gridSize * config.cellSize;\r\n\r\n // Background\r\n ctx.fillStyle = '#1a1a2e';\r\n ctx.fillRect(0, 0, width, height);\r\n\r\n // Grid\r\n ctx.strokeStyle = '#16213e';\r\n ctx.lineWidth = 1;\r\n for (let i = 0; i <= config.gridSize; i++) {\r\n ctx.beginPath();\r\n ctx.moveTo(i * config.cellSize, 0);\r\n ctx.lineTo(i * config.cellSize, height);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(0, i * config.cellSize);\r\n ctx.lineTo(width, i * config.cellSize);\r\n ctx.stroke();\r\n }\r\n\r\n // Food\r\n ctx.fillStyle = '#ef4444';\r\n ctx.beginPath();\r\n ctx.arc(\r\n state.food.x * config.cellSize + config.cellSize / 2,\r\n state.food.y * config.cellSize + config.cellSize / 2,\r\n config.cellSize / 2 - 2,\r\n 0,\r\n Math.PI * 2\r\n );\r\n ctx.fill();\r\n\r\n // Bonus Food (star-shaped)\r\n state.bonusFood.forEach((bf) => {\r\n ctx.fillStyle = '#fbbf24';\r\n ctx.strokeStyle = '#f59e0b';\r\n ctx.lineWidth = 2;\r\n \r\n const centerX = bf.x * config.cellSize + config.cellSize / 2;\r\n const centerY = bf.y * config.cellSize + config.cellSize / 2;\r\n const outerRadius = config.cellSize / 2 - 2;\r\n const innerRadius = outerRadius / 2;\r\n const points = 5;\r\n \r\n ctx.beginPath();\r\n for (let i = 0; i < points * 2; i++) {\r\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\r\n const angle = (Math.PI * i) / points - Math.PI / 2;\r\n const x = centerX + Math.cos(angle) * radius;\r\n const y = centerY + Math.sin(angle) * radius;\r\n if (i === 0) {\r\n ctx.moveTo(x, y);\r\n } else {\r\n ctx.lineTo(x, y);\r\n }\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n });\r\n\r\n // Snake\r\n state.snake.forEach((seg, idx) => {\r\n if (idx === 0) {\r\n // Head\r\n ctx.fillStyle = '#22c55e';\r\n } else {\r\n // Body\r\n ctx.fillStyle = '#16a34a';\r\n }\r\n ctx.fillRect(\r\n seg.x * config.cellSize + 1,\r\n seg.y * config.cellSize + 1,\r\n config.cellSize - 2,\r\n config.cellSize - 2\r\n );\r\n });\r\n\r\n animationId = requestAnimationFrame(draw);\r\n };\r\n\r\n draw();\r\n return () => cancelAnimationFrame(animationId);\r\n }, []);\r\n\r\n const state = gameStateRef.current;\r\n const canvasSize = config.gridSize * config.cellSize;\r\n\r\n return (\r\n <div className=\"relative flex flex-col items-center gap-4 p-4 max-w-xl mx-auto\">\r\n <div className=\"text-3xl font-bold text-green-500\">🐍 Snake Game</div>\r\n\r\n <div className=\"flex gap-8 text-lg\">\r\n <div className=\"text-yellow-400\">\r\n Score: <span className=\"font-bold\">{state.score}</span>\r\n </div>\r\n <div className=\"text-blue-400\">\r\n Length: <span className=\"font-bold\">{state.snake.length}</span>\r\n </div>\r\n </div>\r\n\r\n <canvas\r\n ref={canvasRef}\r\n width={canvasSize}\r\n height={canvasSize}\r\n className=\"border-4 border-green-600 rounded-lg shadow-xl\"\r\n />\r\n\r\n <div className=\"flex gap-2\">\r\n <Button onClick={togglePause} variant=\"outline\" disabled={state.phase === 'gameover'}>\r\n {state.phase === 'paused' ? 'Resume' : 'Pause'}\r\n </Button>\r\n <Button onClick={resetGame} variant=\"outline\">\r\n Restart\r\n </Button>\r\n </div>\r\n\r\n <div className=\"text-sm text-center text-blue-400 h-5\">{message}</div>\r\n\r\n {/* Touch controls for mobile */}\r\n <div className=\"grid grid-cols-3 gap-2 w-48\">\r\n <div></div>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('UP')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ↑\r\n </Button>\r\n <div></div>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('LEFT')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ←\r\n </Button>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('DOWN')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n ↓\r\n </Button>\r\n <Button\r\n size=\"lg\"\r\n variant=\"outline\"\r\n onClick={() => handleDirectionChange('RIGHT')}\r\n disabled={state.phase !== 'playing'}\r\n className=\"text-2xl\"\r\n >\r\n →\r\n </Button>\r\n </div>\r\n\r\n {showOverlay.visible && (\r\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/80 rounded-lg\">\r\n <p className=\"text-4xl font-bold mb-4 text-red-500\">{showOverlay.text}</p>\r\n <p className=\"mb-2 text-xl text-gray-300\">\r\n Final Score: <strong className=\"text-yellow-400\">{state.score}</strong>\r\n </p>\r\n <p className=\"mb-6 text-lg text-gray-300\">\r\n Length: <strong className=\"text-green-400\">{state.snake.length}</strong>\r\n </p>\r\n <Button onClick={resetGame} size=\"lg\" className=\"bg-green-600 hover:bg-green-700\">\r\n Play Again\r\n </Button>\r\n </div>\r\n )}\r\n\r\n <div className=\"text-xs text-center text-gray-400 max-w-md\">\r\n Arrow keys or WASD to move • Space to pause • Red apple = +10 pts • Golden star = +10 pts (every 50 pts)\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default SnakeGame;"],"mappings":"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","names":["jsx","useEffect","useRef","useState","jsx","jsxs","config","useRef","useState","useEffect","useEffect","useRef","useState","jsx","jsxs","config","useRef","useState","state","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/games/spacedodger/index.tsx","../src/components/ui/button.tsx","../src/lib/utils.ts","../src/components/games/memorygame/index.tsx","../src/components/games/snake/index.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface Enemy extends Position {\n radius: number;\n}\n\ninterface Player extends Position {\n width: number;\n height: number;\n}\n\ninterface SpaceDodgerState {\n player: Player;\n enemies: Enemy[];\n frame: number;\n keys: Record<string, boolean>;\n}\n\n\nconst config = {\n canvasSize : { \n width: 450, \n height: 450 \n },\n player: { x: 200, y: 350, width: 25, height: 50 }\n}\n\nconst SpaceDodger: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const scoreRef = useRef(0);\n const lastBatchScoreRef = useRef(0);\n\n const [score, setScore] = useState(0);\n const [gameOver, setGameOver] = useState(false);\n\n const gameStateRef = useRef<SpaceDodgerState>({\n player: config.player,\n enemies: [],\n frame: 0,\n keys: {}\n });\n\n const resetGame = () => {\n gameStateRef.current = {\n player: config.player,\n enemies: [],\n frame: 0,\n keys: {}\n };\n scoreRef.current = 0;\n lastBatchScoreRef.current = 0;\n setScore(0);\n setGameOver(false);\n };\n\n\n \n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const state = gameStateRef.current;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n state.keys[e.key] = true;\n };\n const handleKeyUp = (e: KeyboardEvent) => {\n state.keys[e.key] = false;\n };\n\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('keyup', handleKeyUp);\n\n const randomRadius = () => 10 + Math.random() * 15;\n\n const getEnemySpeed = () => {\n const base = 3;\n const increase = Math.floor(scoreRef.current / 20) * 0.5;\n return base + increase;\n };\n\n let animationId: number;\n\n const gameLoop = () => {\n if (gameOver) return;\n\n state.frame++;\n\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\n\n // Player movement\n if (state.keys['ArrowLeft'] && state.player.x > 0) state.player.x -= 5;\n if (state.keys['ArrowRight'] && state.player.x < config.canvasSize.width - state.player.width) state.player.x += 5;\n if (state.keys['ArrowUp'] && state.player.y > 0) state.player.y -= 5;\n if (state.keys['ArrowDown'] && state.player.y < config.canvasSize.height - state.player.height) state.player.y += 5;\n\n // Draw player\n ctx.fillStyle = '#0ea5e9';\n ctx.fillRect(\n state.player.x,\n state.player.y,\n state.player.width,\n state.player.height\n );\n\n // Normal enemy spawn\n if (state.frame % 40 === 0) {\n const radius = randomRadius();\n state.enemies.push({\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\n y: -radius,\n radius,\n });\n }\n\n // Extra batch every 20 score\n if (\n scoreRef.current > 0 &&\n scoreRef.current % 20 === 0 &&\n lastBatchScoreRef.current !== scoreRef.current\n ) {\n lastBatchScoreRef.current = scoreRef.current;\n const batchCount = 2 + Math.floor(Math.random() * 3);\n\n for (let i = 0; i < batchCount; i++) {\n const radius = randomRadius();\n state.enemies.push({\n x: radius + Math.random() * (config.canvasSize.width - radius * 2),\n y: -Math.random() * 100,\n radius\n });\n }\n }\n\n // Enemies update\n state.enemies = state.enemies.filter(enemy => {\n enemy.y += getEnemySpeed();\n\n // Draw enemy (circle)\n ctx.fillStyle = '#ef4444';\n ctx.beginPath();\n ctx.arc(enemy.x, enemy.y, enemy.radius, 0, Math.PI * 2);\n ctx.fill();\n\n // Circle vs rectangle collision\n const closestX = Math.max(\n state.player.x,\n Math.min(enemy.x, state.player.x + state.player.width)\n );\n const closestY = Math.max(\n state.player.y,\n Math.min(enemy.y, state.player.y + state.player.height)\n );\n\n const dx = enemy.x - closestX;\n const dy = enemy.y - closestY;\n\n if (dx * dx + dy * dy < enemy.radius * enemy.radius) {\n setGameOver(true);\n return false;\n }\n\n // Passed screen\n if (enemy.y - enemy.radius > config.canvasSize.height) {\n setScore(s => {\n scoreRef.current = s + 1;\n return s + 1;\n });\n return false;\n }\n\n return true;\n });\n\n animationId = requestAnimationFrame(gameLoop);\n };\n\n gameLoop();\n\n return () => {\n cancelAnimationFrame(animationId);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('keyup', handleKeyUp);\n };\n }, [gameOver]);\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\n <div className=\"text-xl font-bold\">Score: {score}</div>\n <canvas\n ref={canvasRef}\n width={config.canvasSize.width}\n height={config.canvasSize.height}\n className=\"border-2 border-gray-300\"\n />\n\n {gameOver && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-xl font-bold text-red-500 mb-3\">Game Over</p>\n <Button onClick={resetGame}>Play Again</Button>\n </div>\n )}\n\n <div className=\"text-sm text-foreground\">Use arrow keys to move</div>\n </div>\n );\n};\n\nexport default SpaceDodger;","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}","import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ninterface NumberItem {\n x: number;\n y: number;\n value: number;\n radius: number;\n}\n\ntype GamePhase = 'memorize' | 'recall' | 'transition';\n\ninterface GameState {\n numbers: NumberItem[];\n sequence: number[];\n currentIndex: number;\n level: number;\n showNumbers: boolean;\n phase: GamePhase;\n revealed: Set<number>;\n}\n\nconst config = {\n canvasSize: { width: 450, height: 450 },\n baseHideTime: 3000,\n numberRadius: 30,\n};\n\nconst MemoryGame: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [level, setLevel] = useState(1);\n const [gameOver, setGameOver] = useState(false);\n const [message, setMessage] = useState('');\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\n visible: false,\n text: '',\n });\n const gameStateRef = useRef<GameState>({\n numbers: [],\n sequence: [],\n currentIndex: 0,\n level: 1,\n showNumbers: true,\n phase: 'memorize',\n revealed: new Set(),\n });\n\n // Max numbers = 9\n const getNumberCount = (lvl: number) => Math.min(4 + lvl, 9);\n\n // Hide time decreases as level increases, min 500ms\n const getHideTime = (lvl: number) =>\n Math.max(500, config.baseHideTime - Math.floor((lvl - 1) / 1) * 500);\n\n const generateNumbers = (lvl: number) => {\n const count = getNumberCount(lvl);\n const numbers: NumberItem[] = [];\n const sequence: number[] = [];\n const padding = config.numberRadius * 2.5;\n\n for (let i = 0; i < count; i++) {\n let x: number, y: number, overlap: boolean;\n let attempts = 0;\n\n do {\n overlap = false;\n x = padding + Math.random() * (config.canvasSize.width - padding * 2);\n y = padding + Math.random() * (config.canvasSize.height - padding * 2);\n\n for (const num of numbers) {\n const dx = x - num.x;\n const dy = y - num.y;\n if (Math.sqrt(dx * dx + dy * dy) < config.numberRadius * 2.5) {\n overlap = true;\n break;\n }\n }\n attempts++;\n } while (overlap && attempts < 100);\n\n numbers.push({ x, y, value: i + 1, radius: config.numberRadius });\n sequence.push(i + 1);\n }\n\n return { numbers, sequence };\n };\n\n const startLevel = (lvl: number) => {\n const { numbers, sequence } = generateNumbers(lvl);\n gameStateRef.current = {\n numbers,\n sequence,\n currentIndex: 0,\n level: lvl,\n showNumbers: true,\n phase: 'memorize',\n revealed: new Set(),\n };\n setMessage('Memorize the sequence!');\n\n setTimeout(() => {\n gameStateRef.current.showNumbers = false;\n gameStateRef.current.phase = 'recall';\n setMessage('Click the numbers in order!');\n }, getHideTime(lvl));\n };\n\n const resetGame = () => {\n setLevel(1);\n setGameOver(false);\n setShowOverlay({ visible: false, text: '' });\n startLevel(1);\n };\n\n const handleCanvasClick = (e: React.MouseEvent<HTMLCanvasElement>) => {\n if (gameOver || gameStateRef.current.phase !== 'recall') return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const state = gameStateRef.current;\n\n for (const num of state.numbers) {\n const distance = Math.hypot(x - num.x, y - num.y);\n if (distance <= num.radius) {\n const expected = state.sequence[state.currentIndex];\n if (num.value === expected) {\n state.revealed.add(num.value);\n state.currentIndex++;\n\n if (state.currentIndex === state.sequence.length) {\n const nextLevel = level + 1;\n setLevel(nextLevel);\n state.phase = 'transition';\n setShowOverlay({ visible: true, text: `Get Ready! Level ${nextLevel}` });\n\n setTimeout(() => {\n setShowOverlay({ visible: false, text: '' });\n startLevel(nextLevel);\n }, 1500);\n }\n } else {\n setGameOver(true);\n setMessage(`Wrong! Clicked ${num.value}, expected ${expected}`);\n }\n break;\n }\n }\n };\n\n useEffect(() => startLevel(1), []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let animationId: number;\n\n const draw = () => {\n const state = gameStateRef.current;\n ctx.fillStyle = '#000';\n ctx.fillRect(0, 0, config.canvasSize.width, config.canvasSize.height);\n\n state.numbers.forEach((num, idx) => {\n // Show green hint only in level 1\n const isNext = state.phase === 'recall' && level === 1 && idx === state.currentIndex;\n ctx.fillStyle = isNext ? '#22c55e' : '#3b82f6';\n ctx.beginPath();\n ctx.arc(num.x, num.y, num.radius, 0, Math.PI * 2);\n ctx.fill();\n\n // Reveal numbers if memorizing, transitioning, or already correctly guessed\n if (state.showNumbers || state.phase === 'transition' || state.revealed.has(num.value)) {\n ctx.fillStyle = '#fff';\n ctx.font = 'bold 24px sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(num.value.toString(), num.x, num.y);\n }\n });\n\n if (!gameOver) animationId = requestAnimationFrame(draw);\n };\n\n draw();\n return () => cancelAnimationFrame(animationId);\n }, [gameOver, level]);\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4\">\n <div className=\"flex gap-8 text-xl font-bold\">\n <div>Level: {level}</div>\n <div>Numbers: {getNumberCount(level)}</div>\n </div>\n <div className=\"text-lg font-semibold text-blue-400 h-6\">{message}</div>\n <canvas\n ref={canvasRef}\n width={config.canvasSize.width}\n height={config.canvasSize.height}\n className=\"border-2 border-gray-300 cursor-pointer\"\n onClick={handleCanvasClick}\n />\n {gameOver && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-xl font-bold text-red-500 mb-2\">Game Over</p>\n <p className=\"text-lg text-white mb-4\">Reached Level {level}</p>\n <Button onClick={resetGame}>Play Again</Button>\n </div>\n )}\n\n {showOverlay.visible && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/60\">\n <p className=\"text-2xl font-bold text-yellow-400\">{showOverlay.text}</p>\n </div>\n )}\n\n <div className=\"text-sm text-center text-foreground max-w-md\">\n <div>Memorize the numbers, then click them in sequence (1, 2, 3...)</div>\n <div className=\"mt-1 text-xs text-gray-400\">Green circle = next number to click (level 1 only)</div>\n </div>\n </div>\n );\n};\n\nexport default MemoryGame;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Button } from '@/components/ui/button';\n\ntype GamePhase = 'playing' | 'paused' | 'gameover';\ntype Direction = 'UP' | 'DOWN' | 'LEFT' | 'RIGHT';\n\ninterface Position {\n x: number;\n y: number;\n}\n\ninterface GameState {\n snake: Position[];\n food: Position;\n bonusFood: Position[];\n direction: Direction;\n nextDirection: Direction;\n score: number;\n speed: number;\n phase: GamePhase;\n}\n\nconst config = {\n gridSize: 20,\n cellSize: 20,\n initialSpeed: 150,\n speedIncrement: 5,\n};\n\nconst SnakeGame: React.FC = () => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [message, setMessage] = useState('Use arrow keys or WASD to play!');\n const [showOverlay, setShowOverlay] = useState<{ visible: boolean; text: string }>({\n visible: false,\n text: '',\n });\n\n const gameStateRef = useRef<GameState>({\n snake: [{ x: 10, y: 10 }],\n food: { x: 15, y: 15 },\n bonusFood: [],\n direction: 'RIGHT',\n nextDirection: 'RIGHT',\n score: 0,\n speed: config.initialSpeed,\n phase: 'playing',\n });\n\n const generateFood = (snake: Position[]): Position => {\n let food: Position;\n do {\n food = {\n x: Math.floor(Math.random() * config.gridSize),\n y: Math.floor(Math.random() * config.gridSize),\n };\n } while (snake.some((seg) => seg.x === food.x && seg.y === food.y));\n return food;\n };\n\n const generateBonusFood = (snake: Position[], regularFood: Position, count: number = 3): Position[] => {\n const bonusFood: Position[] = [];\n for (let i = 0; i < count; i++) {\n let food: Position;\n do {\n food = {\n x: Math.floor(Math.random() * config.gridSize),\n y: Math.floor(Math.random() * config.gridSize),\n };\n } while (\n snake.some((seg) => seg.x === food.x && seg.y === food.y) ||\n (food.x === regularFood.x && food.y === regularFood.y) ||\n bonusFood.some((bf) => bf.x === food.x && bf.y === food.y)\n );\n bonusFood.push(food);\n }\n return bonusFood;\n };\n\n const initGame = () => {\n const initialSnake = [{ x: 10, y: 10 }];\n gameStateRef.current = {\n snake: initialSnake,\n food: generateFood(initialSnake),\n bonusFood: [],\n direction: 'RIGHT',\n nextDirection: 'RIGHT',\n score: 0,\n speed: config.initialSpeed,\n phase: 'playing',\n };\n setMessage('Use arrow keys or WASD to play!');\n };\n\n const checkCollision = (head: Position, snake: Position[]): boolean => {\n // Only self collision (no wall collision - wrap around instead)\n return snake.some((seg) => seg.x === head.x && seg.y === head.y);\n };\n\n const moveSnake = () => {\n const state = gameStateRef.current;\n if (state.phase !== 'playing') return;\n\n state.direction = state.nextDirection;\n\n const head = { ...state.snake[0] };\n\n switch (state.direction) {\n case 'UP':\n head.y -= 1;\n break;\n case 'DOWN':\n head.y += 1;\n break;\n case 'LEFT':\n head.x -= 1;\n break;\n case 'RIGHT':\n head.x += 1;\n break;\n }\n\n // Wrap around edges\n if (head.x < 0) head.x = config.gridSize - 1;\n if (head.x >= config.gridSize) head.x = 0;\n if (head.y < 0) head.y = config.gridSize - 1;\n if (head.y >= config.gridSize) head.y = 0;\n\n if (checkCollision(head, state.snake)) {\n state.phase = 'gameover';\n setShowOverlay({ visible: true, text: 'Game Over! 💀' });\n return;\n }\n\n const newSnake = [head, ...state.snake];\n let ateFood = false;\n\n // Check if regular food eaten\n if (head.x === state.food.x && head.y === state.food.y) {\n state.score += 10;\n state.speed = Math.max(50, state.speed - config.speedIncrement);\n state.food = generateFood(newSnake);\n ateFood = true;\n setMessage(`Score: ${state.score} 🍎`);\n\n // Generate bonus food every 50 points\n if (state.score % 50 === 0 && state.score > 0) {\n state.bonusFood = generateBonusFood(newSnake, state.food);\n setMessage(`Score: ${state.score} 🍎 BONUS FOOD! ⭐`);\n }\n }\n\n // Check if bonus food eaten\n const bonusFoodIndex = state.bonusFood.findIndex(\n (bf) => bf.x === head.x && bf.y === head.y\n );\n if (bonusFoodIndex !== -1) {\n state.score += 10;\n state.bonusFood.splice(bonusFoodIndex, 1);\n ateFood = true;\n setMessage(`Score: ${state.score} ⭐ Bonus!`);\n }\n\n if (!ateFood) {\n newSnake.pop();\n }\n\n state.snake = newSnake;\n };\n\n const handleDirectionChange = (newDirection: Direction) => {\n const state = gameStateRef.current;\n const opposites: Record<Direction, Direction> = {\n UP: 'DOWN',\n DOWN: 'UP',\n LEFT: 'RIGHT',\n RIGHT: 'LEFT',\n };\n\n if (opposites[state.direction] !== newDirection) {\n state.nextDirection = newDirection;\n }\n };\n\n const togglePause = () => {\n const state = gameStateRef.current;\n if (state.phase === 'playing') {\n state.phase = 'paused';\n setMessage('Game Paused');\n } else if (state.phase === 'paused') {\n state.phase = 'playing';\n setMessage('Use arrow keys or WASD to play!');\n }\n };\n\n const resetGame = () => {\n setShowOverlay({ visible: false, text: '' });\n initGame();\n };\n\n useEffect(() => {\n initGame();\n\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key.toLowerCase();\n \n if (key === ' ') {\n e.preventDefault();\n togglePause();\n return;\n }\n\n if (gameStateRef.current.phase !== 'playing') return;\n\n switch (key) {\n case 'arrowup':\n case 'w':\n e.preventDefault();\n handleDirectionChange('UP');\n break;\n case 'arrowdown':\n case 's':\n e.preventDefault();\n handleDirectionChange('DOWN');\n break;\n case 'arrowleft':\n case 'a':\n e.preventDefault();\n handleDirectionChange('LEFT');\n break;\n case 'arrowright':\n case 'd':\n e.preventDefault();\n handleDirectionChange('RIGHT');\n break;\n }\n };\n\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, []);\n\n // Game loop\n useEffect(() => {\n const interval = setInterval(() => {\n moveSnake();\n }, gameStateRef.current.speed);\n\n return () => clearInterval(interval);\n }, []);\n\n // Drawing\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let animationId: number;\n\n const draw = () => {\n const state = gameStateRef.current;\n const width = config.gridSize * config.cellSize;\n const height = config.gridSize * config.cellSize;\n\n // Background\n ctx.fillStyle = '#1a1a2e';\n ctx.fillRect(0, 0, width, height);\n\n // Grid\n ctx.strokeStyle = '#16213e';\n ctx.lineWidth = 1;\n for (let i = 0; i <= config.gridSize; i++) {\n ctx.beginPath();\n ctx.moveTo(i * config.cellSize, 0);\n ctx.lineTo(i * config.cellSize, height);\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(0, i * config.cellSize);\n ctx.lineTo(width, i * config.cellSize);\n ctx.stroke();\n }\n\n // Food\n ctx.fillStyle = '#ef4444';\n ctx.beginPath();\n ctx.arc(\n state.food.x * config.cellSize + config.cellSize / 2,\n state.food.y * config.cellSize + config.cellSize / 2,\n config.cellSize / 2 - 2,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n\n // Bonus Food (star-shaped)\n state.bonusFood.forEach((bf) => {\n ctx.fillStyle = '#fbbf24';\n ctx.strokeStyle = '#f59e0b';\n ctx.lineWidth = 2;\n \n const centerX = bf.x * config.cellSize + config.cellSize / 2;\n const centerY = bf.y * config.cellSize + config.cellSize / 2;\n const outerRadius = config.cellSize / 2 - 2;\n const innerRadius = outerRadius / 2;\n const points = 5;\n \n ctx.beginPath();\n for (let i = 0; i < points * 2; i++) {\n const radius = i % 2 === 0 ? outerRadius : innerRadius;\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const x = centerX + Math.cos(angle) * radius;\n const y = centerY + Math.sin(angle) * radius;\n if (i === 0) {\n ctx.moveTo(x, y);\n } else {\n ctx.lineTo(x, y);\n }\n }\n ctx.closePath();\n ctx.fill();\n ctx.stroke();\n });\n\n // Snake\n state.snake.forEach((seg, idx) => {\n if (idx === 0) {\n // Head\n ctx.fillStyle = '#22c55e';\n } else {\n // Body\n ctx.fillStyle = '#16a34a';\n }\n ctx.fillRect(\n seg.x * config.cellSize + 1,\n seg.y * config.cellSize + 1,\n config.cellSize - 2,\n config.cellSize - 2\n );\n });\n\n animationId = requestAnimationFrame(draw);\n };\n\n draw();\n return () => cancelAnimationFrame(animationId);\n }, []);\n\n const state = gameStateRef.current;\n const canvasSize = config.gridSize * config.cellSize;\n\n return (\n <div className=\"relative flex flex-col items-center gap-4 p-4 max-w-xl mx-auto\">\n <div className=\"text-3xl font-bold text-green-500\">🐍 Snake Game</div>\n\n <div className=\"flex gap-8 text-lg\">\n <div className=\"text-yellow-400\">\n Score: <span className=\"font-bold\">{state.score}</span>\n </div>\n <div className=\"text-blue-400\">\n Length: <span className=\"font-bold\">{state.snake.length}</span>\n </div>\n </div>\n\n <canvas\n ref={canvasRef}\n width={canvasSize}\n height={canvasSize}\n className=\"border-4 border-green-600 rounded-lg shadow-xl\"\n />\n\n <div className=\"flex gap-2\">\n <Button onClick={togglePause} variant=\"outline\" disabled={state.phase === 'gameover'}>\n {state.phase === 'paused' ? 'Resume' : 'Pause'}\n </Button>\n <Button onClick={resetGame} variant=\"outline\">\n Restart\n </Button>\n </div>\n\n <div className=\"text-sm text-center text-blue-400 h-5\">{message}</div>\n\n {/* Touch controls for mobile */}\n <div className=\"grid grid-cols-3 gap-2 w-48\">\n <div></div>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('UP')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ↑\n </Button>\n <div></div>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('LEFT')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ←\n </Button>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('DOWN')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n ↓\n </Button>\n <Button\n size=\"lg\"\n variant=\"outline\"\n onClick={() => handleDirectionChange('RIGHT')}\n disabled={state.phase !== 'playing'}\n className=\"text-2xl\"\n >\n →\n </Button>\n </div>\n\n {showOverlay.visible && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/80 rounded-lg\">\n <p className=\"text-4xl font-bold mb-4 text-red-500\">{showOverlay.text}</p>\n <p className=\"mb-2 text-xl text-gray-300\">\n Final Score: <strong className=\"text-yellow-400\">{state.score}</strong>\n </p>\n <p className=\"mb-6 text-lg text-gray-300\">\n Length: <strong className=\"text-green-400\">{state.snake.length}</strong>\n </p>\n <Button onClick={resetGame} size=\"lg\" className=\"bg-green-600 hover:bg-green-700\">\n Play Again\n </Button>\n </div>\n )}\n\n <div className=\"text-xs text-center text-gray-400 max-w-md\">\n Arrow keys or WASD to move • Space to pause • Red apple = +10 pts • Golden star = +10 pts (every 50 pts)\n </div>\n </div>\n );\n};\n\nexport default SnakeGame;"],"mappings":"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","names":["jsx","useEffect","useRef","useState","jsx","jsxs","config","useRef","useState","useEffect","useEffect","useRef","useState","jsx","jsxs","config","useRef","useState","state","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jonelhatwell/arcade-games",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"sideEffects": false,
|
|
9
|
+
"author": "Jonel Hatwell",
|
|
9
10
|
"exports": {
|
|
10
11
|
".": {
|
|
11
12
|
"types": "./dist/index.d.ts",
|