- {/* Selection indicator - center highlight */}
-
- {/* Neon border glow */}
-
-
- {/* Side arrows */}
-
-
-
- {/* Inner glow */}
-
-
-
- {/* Top fade gradient */}
-
-
- {/* Bottom fade gradient */}
-
-
- {/* Items container */}
-
-
- {extendedGames.map((game, index) => {
- const realIndex = index % games.length
- const isSelected = !isSpinning && realIndex === currentIndex
- const { opacity, scale } = getItemStyle(index)
-
- return (
-
-
- {/* Game cover */}
-
- {game.cover_url ? (
-

- ) : (
-
-
-
- )}
-
-
- {/* Game info */}
-
-
- {game.title}
-
- {game.genre && (
-
{game.genre}
- )}
-
-
- {/* Selected indicator */}
- {isSelected && (
-
-
-
- )}
-
-
- )
- })}
+ {/* Указатель (стрелка сверху) */}
+
+
+ {/* Свечение указателя */}
+
+ {/* Указатель */}
+
- {/* Spinning indicator lines */}
+ {/* Колесо */}
+
+ {/* Внешний ободок */}
+
+
+ {/* SVG колесо */}
+
+
+ {/* Кнопка КРУТИТЬ в центре */}
+
+
+
+ {/* Декоративные элементы при вращении */}
{isSpinning && (
<>
-
-
-
+
+
>
)}
- {/* Spin button */}
-
:
}
- >
- {isSpinning ? 'Крутится...' : 'КРУТИТЬ!'}
-
+ {/* Подсказка */}
+
+ {isSpinning ? 'Колесо вращается...' : 'Нажмите на колесо, чтобы крутить!'}
+
)
}
diff --git a/frontend/src/components/ui/NeonButton.tsx b/frontend/src/components/ui/NeonButton.tsx
index dfc12cb..4eb5436 100644
--- a/frontend/src/components/ui/NeonButton.tsx
+++ b/frontend/src/components/ui/NeonButton.tsx
@@ -40,6 +40,8 @@ export const NeonButton = forwardRef
(
danger: 'bg-red-600 hover:bg-red-700 text-white',
glow: '0 0 12px rgba(34, 211, 238, 0.4)',
glowHover: '0 0 18px rgba(34, 211, 238, 0.55)',
+ glowDanger: '0 0 12px rgba(239, 68, 68, 0.4)',
+ glowDangerHover: '0 0 18px rgba(239, 68, 68, 0.55)',
},
purple: {
primary: 'bg-accent-500 hover:bg-accent-400 text-white',
@@ -49,6 +51,8 @@ export const NeonButton = forwardRef(
danger: 'bg-red-600 hover:bg-red-700 text-white',
glow: '0 0 12px rgba(139, 92, 246, 0.4)',
glowHover: '0 0 18px rgba(139, 92, 246, 0.55)',
+ glowDanger: '0 0 12px rgba(239, 68, 68, 0.4)',
+ glowDangerHover: '0 0 18px rgba(239, 68, 68, 0.55)',
},
pink: {
primary: 'bg-pink-500 hover:bg-pink-400 text-white',
@@ -58,6 +62,8 @@ export const NeonButton = forwardRef(
danger: 'bg-red-600 hover:bg-red-700 text-white',
glow: '0 0 12px rgba(244, 114, 182, 0.4)',
glowHover: '0 0 18px rgba(244, 114, 182, 0.55)',
+ glowDanger: '0 0 12px rgba(239, 68, 68, 0.4)',
+ glowDangerHover: '0 0 18px rgba(239, 68, 68, 0.55)',
},
}
@@ -93,17 +99,19 @@ export const NeonButton = forwardRef(
className
)}
style={{
- boxShadow: glow && !disabled && variant !== 'ghost' ? colors.glow : undefined,
+ boxShadow: glow && !disabled && variant !== 'ghost'
+ ? (variant === 'danger' ? colors.glowDanger : colors.glow)
+ : undefined,
}}
onMouseEnter={(e) => {
if (glow && !disabled && variant !== 'ghost') {
- e.currentTarget.style.boxShadow = colors.glowHover
+ e.currentTarget.style.boxShadow = variant === 'danger' ? colors.glowDangerHover : colors.glowHover
}
props.onMouseEnter?.(e)
}}
onMouseLeave={(e) => {
if (glow && !disabled && variant !== 'ghost') {
- e.currentTarget.style.boxShadow = colors.glow
+ e.currentTarget.style.boxShadow = variant === 'danger' ? colors.glowDanger : colors.glow
}
props.onMouseLeave?.(e)
}}
diff --git a/frontend/src/pages/PlayPage.tsx b/frontend/src/pages/PlayPage.tsx
index 8dde144..05b66a9 100644
--- a/frontend/src/pages/PlayPage.tsx
+++ b/frontend/src/pages/PlayPage.tsx
@@ -1006,8 +1006,7 @@ export function PlayPage() {
Выполнено
}
diff --git a/frontend/src/pages/TeapotPage.tsx b/frontend/src/pages/TeapotPage.tsx
new file mode 100644
index 0000000..103756c
--- /dev/null
+++ b/frontend/src/pages/TeapotPage.tsx
@@ -0,0 +1,192 @@
+import { useState } from 'react'
+import { Link } from 'react-router-dom'
+import { NeonButton } from '@/components/ui'
+import { Home, Sparkles, Coffee } from 'lucide-react'
+
+export function TeapotPage() {
+ const [isPoured, setIsPoured] = useState(false)
+
+ return (
+
+ {/* Background effects */}
+
+
+ {/* Teapot ASCII art / SVG */}
+
setIsPoured(!isPoured)}
+ >
+ {/* Steam animation */}
+
+
+ {/* Teapot */}
+
+
+ {/* Tea drops when pouring */}
+ {isPoured && (
+
+ )}
+
+ {/* Glow effect */}
+
+
+
+ {/* 418 text */}
+
+
+
+ I'm a teapot
+
+
+
+ Сервер отказывается варить кофе, потому что он чайник.
+
+
+ RFC 2324, Hyper Text Coffee Pot Control Protocol
+
+
+ {/* Fun fact */}
+
+
+
+ Fun fact
+
+
+ Это настоящий HTTP-код ответа из первоапрельской шутки 1998 года.
+ Нажми на чайник!
+
+
+
+ {/* Button */}
+
+
}>
+ На главную
+
+
+
+ {/* Decorative sparkles */}
+
+
+
+
+
+
+
+ {/* Custom animations */}
+
+
+ )
+}
diff --git a/frontend/src/pages/index.ts b/frontend/src/pages/index.ts
index bcbc7a0..3c1da62 100644
--- a/frontend/src/pages/index.ts
+++ b/frontend/src/pages/index.ts
@@ -10,3 +10,4 @@ export { LeaderboardPage } from './LeaderboardPage'
export { ProfilePage } from './ProfilePage'
export { UserProfilePage } from './UserProfilePage'
export { NotFoundPage } from './NotFoundPage'
+export { TeapotPage } from './TeapotPage'