diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 211cd10..5eaa1c0 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -387,4 +387,7 @@ .tab-inactive { @apply text-secondary bg-interactive-hover border-b-3 border-transparent hover:border-intense; } + .sticky-tabs { + top: var(--header-height); + } } diff --git a/frontend/src/components/Header.tsx b/frontend/src/components/Header.tsx index 87d7ab9..a576271 100644 --- a/frontend/src/components/Header.tsx +++ b/frontend/src/components/Header.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import ThemeSwitcher from "@/components/utils/ThemeSwitcher"; import WifiQrModal from "@/components/modals/WifiQrModal"; import { generateWifiConfig, WifiConfig } from "@/utils/wifi"; @@ -8,6 +8,23 @@ import { generateWifiConfig, WifiConfig } from "@/utils/wifi"; export default function Header() { const [showWifi, setShowWifi] = useState(false); const [wifiConfig, setWifiConfig] = useState(null); + const headerRef = useRef(null); + + useEffect(() => { + // Set initial height and update on resize + function updateHeaderHeight() { + if (headerRef.current) { + document.documentElement.style.setProperty( + "--header-height", + `${headerRef.current.offsetHeight}px`, + ); + } + } + + updateHeaderHeight(); + window.addEventListener("resize", updateHeaderHeight); + return () => window.removeEventListener("resize", updateHeaderHeight); + }, []); useEffect(() => { const config: WifiConfig | null = (() => { @@ -23,7 +40,10 @@ export default function Header() { }, [generateWifiConfig]); return ( -
+

UniFi Voucher Manager diff --git a/frontend/src/components/tabs/Tabs.tsx b/frontend/src/components/tabs/Tabs.tsx index 5cc6c5c..87adc44 100644 --- a/frontend/src/components/tabs/Tabs.tsx +++ b/frontend/src/components/tabs/Tabs.tsx @@ -43,7 +43,7 @@ export default function Tabs() { return ( <> -