diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 79bf9094..df246067 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -1,6 +1,6 @@ -import React from 'react' +import React, { useState, useEffect, useRef } from 'react' import { NavLink, useNavigate } from 'react-router-dom' -import { FiHeart, FiSettings, FiZap } from 'react-icons/fi' +import { FiHeart, FiSettings, FiZap, FiMenu, FiX } from 'react-icons/fi' import { useApp } from '../context/AppContext' import ThemeToggle from './ThemeToggle' import Logo from "../assets/og-logo.svg?react"; @@ -21,71 +21,167 @@ export default function Navbar() { const navigate = useNavigate() const hasData = orgs.length > 0 const lowLimit = rateLimit && rateLimit.remaining < 15 + const [menuOpen, setMenuOpen] = useState(false) + const toggleRef = useRef(null) + + // Keyboard Escape key dismissal & focus restoration for mobile navigation + useEffect(() => { + const handleKeyDown = (e) => { + if (e.key === 'Escape') { + setMenuOpen(false); + toggleRef.current?.focus(); + } + }; + if (menuOpen) { + window.addEventListener('keydown', handleKeyDown); + } + return () => window.removeEventListener('keydown', handleKeyDown); + }, [menuOpen]); + + const navLinkStyle = ({ isActive }) => ({ + display: 'block', + padding: '6px 10px', + fontSize: 13, + whiteSpace: 'nowrap', + textDecoration: 'none', + fontWeight: isActive ? 600 : 400, + color: isActive ? 'var(--accent)' : 'var(--text2)', + borderBottom: isActive ? '2px solid var(--accent)' : '2px solid transparent', + transition: 'color 0.2s ease', + }) return ( ) } diff --git a/src/styles/global.css b/src/styles/global.css index d6f6d516..25d33211 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -35,6 +35,12 @@ --radius: 8px; } +*, +*::before, +*::after { + box-sizing: border-box; +} + html, body, #root { min-height: 100%; background: var(--bg);