diff --git a/.gitignore b/.gitignore index a547bf3..3f81ac6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ node_modules dist dist-ssr *.local +.pi-cache/ # Editor directories and files .vscode/* diff --git a/public/icon-proposals/option-a.png b/public/icon-proposals/option-a.png new file mode 100644 index 0000000..7179ff0 Binary files /dev/null and b/public/icon-proposals/option-a.png differ diff --git a/public/icon-proposals/option-a.svg b/public/icon-proposals/option-a.svg new file mode 100644 index 0000000..9638a1d --- /dev/null +++ b/public/icon-proposals/option-a.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icon-proposals/option-b.png b/public/icon-proposals/option-b.png new file mode 100644 index 0000000..9772592 Binary files /dev/null and b/public/icon-proposals/option-b.png differ diff --git a/public/icon-proposals/option-b.svg b/public/icon-proposals/option-b.svg new file mode 100644 index 0000000..35b36f2 --- /dev/null +++ b/public/icon-proposals/option-b.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icon-proposals/option-c.png b/public/icon-proposals/option-c.png new file mode 100644 index 0000000..1084da5 Binary files /dev/null and b/public/icon-proposals/option-c.png differ diff --git a/public/icon-proposals/option-c.svg b/public/icon-proposals/option-c.svg new file mode 100644 index 0000000..e594d59 --- /dev/null +++ b/public/icon-proposals/option-c.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icon-proposals/option-d.png b/public/icon-proposals/option-d.png new file mode 100644 index 0000000..a3b4fa1 Binary files /dev/null and b/public/icon-proposals/option-d.png differ diff --git a/public/icon-proposals/option-d.svg b/public/icon-proposals/option-d.svg new file mode 100644 index 0000000..77295bb --- /dev/null +++ b/public/icon-proposals/option-d.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icon-proposals/overview.png b/public/icon-proposals/overview.png new file mode 100644 index 0000000..21d9e6c Binary files /dev/null and b/public/icon-proposals/overview.png differ diff --git a/src/App.tsx b/src/App.tsx index ee3d559..eac9bda 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,4 @@ -import { Settings as SettingsIcon } from 'lucide-react'; +import { Maximize, Minimize, Settings as SettingsIcon } from 'lucide-react'; import { useCallback, useEffect, useRef, useState } from 'react'; import { FocusDisplay } from './components/FocusDisplay'; import { SettingsDrawer } from './components/SettingsDrawer'; @@ -23,8 +23,22 @@ export default function App() { const [words, setWords] = useState([]); const [isSettingsOpen, setIsSettingsOpen] = useState(false); const [isUserActive, setIsUserActive] = useState(true); + const [isFullscreen, setIsFullscreen] = useState(() => + typeof document !== 'undefined' ? Boolean(document.fullscreenElement) : false + ); const inactivityTimerRef = useRef(null); + // Sync fullscreen state with document events + useEffect(() => { + const handleFullscreenChange = () => { + setIsFullscreen(Boolean(document.fullscreenElement)); + }; + document.addEventListener('fullscreenchange', handleFullscreenChange); + return () => { + document.removeEventListener('fullscreenchange', handleFullscreenChange); + }; + }, []); + // Fast-path IndexedDB restore with silent background verification useEffect(() => { let isCancelled = false; @@ -337,14 +351,31 @@ export default function App() { {BOOK_TITLE} - {/* Quiet Gear Button */} - + {/* Top Right Action Buttons */} +
+ {/* Fullscreen Toggle Button */} + + + {/* Quiet Gear Button */} + +
{/* Main RSVPs Central Stream (Instant 0ms display, zero loading mask) */}