TopNav.jsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React from "react";
  2. import Link from "next/link";
  3. import Image from "next/image";
  4. import QuickNav from "@/components/app-shell/QuickNav";
  5. import UserStatus from "@/components/app-shell/UserStatus";
  6. import ThemeToggleButton from "@/components/app-shell/ThemeToggleButton";
  7. export default function TopNav() {
  8. return (
  9. <header className="sticky top-0 z-50 w-full border-b bg-background/80 backdrop-blur">
  10. <div className="px-4">
  11. <div className="mx-auto grid h-14 w-full items-center 2xl:grid-cols-[1fr_minmax(0,45%)_1fr]">
  12. <div className="flex items-center justify-between gap-4 2xl:col-start-2">
  13. <div className="flex items-center gap-2">
  14. <Link
  15. href="/"
  16. title="Startseite"
  17. className="hover:cursor-pointer"
  18. >
  19. {/*
  20. Logo rendering:
  21. - Use `fill` so we don't need to hardcode width/height for string src.
  22. - This avoids Next/Image runtime errors and keeps aspect ratio via object-contain. :contentReference[oaicite:2]{index=2}
  23. */}
  24. <div className="relative h-10 w-16">
  25. <Image
  26. src="/brand/logo-blackNav.png"
  27. alt="Firmenlogo"
  28. fill
  29. sizes="64px"
  30. className="object-contain dark:hidden"
  31. priority
  32. />
  33. <Image
  34. src="/brand/logo-whiteNav.png"
  35. alt="Firmenlogo"
  36. fill
  37. sizes="64px"
  38. className="hidden object-contain dark:block"
  39. priority
  40. />
  41. </div>
  42. </Link>
  43. <nav aria-label="Hauptnavigation" className="flex items-center">
  44. <QuickNav />
  45. </nav>
  46. </div>
  47. <div className="flex items-center gap-3">
  48. {/* Icon-only theme toggle */}
  49. <ThemeToggleButton />
  50. {/* User is now the dropdown trigger (settings/logout) */}
  51. <UserStatus />
  52. </div>
  53. </div>
  54. </div>
  55. </div>
  56. </header>
  57. );
  58. }