# Development Standards - Soroban Abacus Web App ## 🚨 Critical Rules - DO NOT BREAK THESE ### Navigation Standards #### ✅ ALWAYS Use Next.js Router for Navigation ```typescript // ✅ CORRECT - Use Next.js router import { useRouter } from "next/navigation"; const router = useRouter(); router.push("/target-route"); ``` #### ❌ NEVER Use window.location.href ```typescript // ❌ WRONG - Causes page reloads, breaks state, kills fullscreen window.location.href = "/target-route"; ``` **Why this matters:** - `window.location.href` causes full page reloads - Page reloads break React state, exit fullscreen mode, and hurt performance - Next.js router provides client-side navigation that preserves state - **This is literally the main reason we use Next.js!** ### Fullscreen State Management #### ✅ Let Client-Side Navigation Preserve Fullscreen - Users enter fullscreen manually (respects browser security) - Navigation preserves fullscreen automatically via client-side routing - No need for complex restoration logic #### ❌ Never Try to Auto-Enter Fullscreen ```typescript // ❌ WRONG - Violates browser security, causes errors useEffect(() => { enterFullscreen(); // Browser blocks this without user gesture }, []); ``` **Why this fails:** - Browser security requires user gestures for fullscreen - Automatic fullscreen attempts cause "Permissions check failed" errors - Client-side navigation makes this unnecessary anyway ## Code Review Checklist Before any PR/commit, verify: - [ ] All navigation uses `useRouter().push()` instead of `window.location.href` - [ ] No automatic fullscreen entry in useEffect hooks - [ ] No complex fullscreen restoration prompts (should be unnecessary) - [ ] Import `useRouter` from `next/navigation` (not `next/router`) ## Common Anti-Patterns to Avoid ### 1. The "Quick Fix" Trap ```typescript // Don't do this even if "it works" const handleClick = () => { window.location.href = "/somewhere"; // ❌ Lazy }; // Do this instead const handleClick = () => { router.push("/somewhere"); // ✅ Proper }; ``` ### 2. The "Copy-Paste" Mistake - If you see `window.location.href` in existing code, **fix it**, don't copy it - One bad pattern can infect the entire codebase ### 3. The "State Preservation" Hack ```typescript // Don't try to manually preserve state across page reloads sessionStorage.setItem("someState", value); // ❌ Unnecessary hack // Just use proper navigation and state persists automatically router.push("/route"); // ✅ State preserved ``` ## Performance Benefits Using proper Next.js navigation provides: - **Instant navigation** (no page reload) - **Prefetching** of linked routes - **Preserved React state** across routes - **Better Core Web Vitals** scores - **Maintained fullscreen** and other browser states ## Migration Guide If you find `window.location.href` in the codebase: 1. Add `useRouter` import: ```typescript import { useRouter } from "next/navigation"; ``` 2. Get router instance in component: ```typescript const router = useRouter(); ``` 3. Replace the navigation: ```typescript // Before window.location.href = "/path"; // After router.push("/path"); ``` 4. Test that state is preserved across navigation ## Exception Cases The **ONLY** time you should use `window.location.href` is for: - External links (different domains) - Full page refreshes (rare, must be justified) - Server-side redirects (outside React components) For everything else: **Use the router!** --- **Remember:** We chose Next.js for its routing capabilities. Using `window.location.href` is like buying a car and pushing it everywhere instead of using the engine. 🚗➡️🦶 _Last updated: When we fixed the fullscreen persistence issue by actually using Next.js properly_