From 3b32652ae5fa6ffd161aaa2cc70e316f55be2b4f Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Tue, 6 Jan 2026 09:31:20 +0000 Subject: [PATCH] Changes --- src/hooks/useZenMode.ts | 33 ++++++++++++++++++++++++++++++ src/pages/Index.tsx | 45 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/hooks/useZenMode.ts diff --git a/src/hooks/useZenMode.ts b/src/hooks/useZenMode.ts new file mode 100644 index 0000000..232c33b --- /dev/null +++ b/src/hooks/useZenMode.ts @@ -0,0 +1,33 @@ +import { useState, useEffect, useCallback } from 'react'; + +export const useZenMode = () => { + const [isZenMode, setIsZenMode] = useState(false); + + const toggleZenMode = useCallback(() => { + setIsZenMode(prev => !prev); + }, []); + + const exitZenMode = useCallback(() => { + setIsZenMode(false); + }, []); + + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + // Toggle with 'Z' key (not in input fields) + if (e.key.toLowerCase() === 'z' && + !['INPUT', 'TEXTAREA'].includes((e.target as HTMLElement).tagName) && + !e.ctrlKey && !e.metaKey && !e.altKey) { + toggleZenMode(); + } + // Exit with Escape + if (e.key === 'Escape' && isZenMode) { + exitZenMode(); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [isZenMode, toggleZenMode, exitZenMode]); + + return { isZenMode, toggleZenMode, exitZenMode }; +}; diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index f730a09..9a21190 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -8,8 +8,10 @@ import { VERIFIED_KEY, BYPASS_KEY } from '@/components/HumanVerification'; import { useSettings } from '@/contexts/SettingsContext'; import { useAchievements } from '@/contexts/AchievementsContext'; import { useKonamiCode } from '@/hooks/useKonamiCode'; +import { useZenMode } from '@/hooks/useZenMode'; import { toast } from '@/hooks/use-toast'; import { AudioBlockedOverlay } from '@/components/AudioBlockedOverlay'; +import { motion, AnimatePresence } from 'framer-motion'; // Lazy load conditionally rendered components to reduce initial bundle const HumanVerification = lazy(() => import('@/components/HumanVerification')); @@ -47,6 +49,7 @@ const Index = () => { } = useSettings(); const { unlockAchievement } = useAchievements(); const { activated: konamiActivated, reset: resetKonami } = useKonamiCode(); + const { isZenMode, toggleZenMode } = useZenMode(); const location = useLocation(); // Hide mini music player when on the full music page (to avoid UI duplication) @@ -153,15 +156,47 @@ const Index = () => { {/* Moving scanline - only visible when CRT is enabled */}
+ {/* Zen Mode indicator */} + + {isZenMode && ( + +

+ ZEN MODE • Press Z or ESC to exit +

+
+ )} +
+ {!isLoading && ( - - -
- -
+ {/* Hide UI elements in Zen Mode */} + + {!isZenMode && ( + + + + +
+ +
+
+ )} +
+ + {/* Music player stays visible in Zen Mode */} {showMiniPlayer && }
)}