From 8e18325660128753a0b6cb2e34b4b3aaab099b28 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 10 Jul 2026 01:16:29 +0200 Subject: [PATCH] Frontend: hamburger menu v hlavicke na mobile Hlavicka GameListu sa na uzkych displejoch nezmestila do jedneho riadku. Pod sm: breakpointom sa polozky zbalia do dropdownu. Co-Authored-By: Claude Opus 4.8 --- frontend/src/components/HeaderMenu.tsx | 100 +++++++++++++++++++++++++ frontend/src/pages/GameList.tsx | 19 ++--- 2 files changed, 107 insertions(+), 12 deletions(-) create mode 100644 frontend/src/components/HeaderMenu.tsx diff --git a/frontend/src/components/HeaderMenu.tsx b/frontend/src/components/HeaderMenu.tsx new file mode 100644 index 0000000..5f06eff --- /dev/null +++ b/frontend/src/components/HeaderMenu.tsx @@ -0,0 +1,100 @@ +import { useEffect, useRef, useState } from 'react'; + +interface Props { + username?: string; + onHistory: () => void; + onDonate: () => void; + onLogout: () => void; +} + +/** Header navigation: a row of links from `sm:` up, a hamburger dropdown below it. */ +export default function HeaderMenu({ username, onHistory, onDonate, onLogout }: Props) { + const [open, setOpen] = useState(false); + const ref = useRef(null); + + useEffect(() => { + if (!open) return; + const onPointerDown = (e: PointerEvent) => { + if (!ref.current?.contains(e.target as Node)) setOpen(false); + }; + const onKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') setOpen(false); + }; + document.addEventListener('pointerdown', onPointerDown); + document.addEventListener('keydown', onKeyDown); + return () => { + document.removeEventListener('pointerdown', onPointerDown); + document.removeEventListener('keydown', onKeyDown); + }; + }, [open]); + + const pick = (action: () => void) => () => { + setOpen(false); + action(); + }; + + return ( + <> +
+ {username} + + + +
+ +
+ + + {open && ( +
+ {username && ( +

+ {username} +

+ )} + + + +
+ )} +
+ + ); +} diff --git a/frontend/src/pages/GameList.tsx b/frontend/src/pages/GameList.tsx index aa54c0d..25fba3d 100644 --- a/frontend/src/pages/GameList.tsx +++ b/frontend/src/pages/GameList.tsx @@ -3,6 +3,7 @@ import { useNavigate } from 'react-router-dom'; import { useGameStore } from '../store/gameStore'; import { emit, socket, setAuthToken } from '../lib/socket'; import { trackEvent } from '../lib/track'; +import HeaderMenu from '../components/HeaderMenu'; import NameModal from '../components/NameModal'; import RulesModal from '../components/RulesModal'; @@ -33,18 +34,12 @@ export default function GameList() {

Bridžik

-
- {account?.username} - - - -
+ navigate('/history')} + onDonate={() => navigate('/donate')} + onLogout={handleLogout} + />