Files
Epicnabbo-Catalogus-Updated…/src/components/navigation.tsx
T
openhands ac16df98c3 Replace PNG icons with Habbo-style SVG pixel art icons across index, nav, and mobile nav
- Create 20 Habbo-style pixel-art SVG icon components (home, user, catalog, star, community, games, enter, news, online, camera, chat, clock, heart, arrow, cog, furni, diamond, credits, duckets, rank)
- Update index page: replace all PNG icon references, add pixel font headings, add Habbo-style gradient section headers
- Update navigation: replace all PNG nav icons with Habbo SVG icons
- Update NavDropdown: accept ReactNode icon instead of string path
- Update mobile-nav: replace PNG brand icon with HabboHome SVG
2026-07-23 16:36:32 +02:00

332 lines
9.1 KiB
TypeScript

import Link from "next/link";
import type { Session } from "next-auth";
import { getTranslations } from "next-intl/server";
import { LanguageSwitcher } from "@/components/language-switcher";
import { MobileNav } from "@/components/mobile-nav";
import { NavDropdown } from "@/components/nav-dropdown";
import { NavbarColorPicker } from "@/components/navbar-color-picker";
import { ThemeSwitcher } from "@/components/theme-switcher";
import { resolveHotelName } from "@/lib/hotel-name";
import { canAccess, getApiAdminContext, PERMS } from "@/lib/permissions";
import {
HabboHome,
HabboCommunity,
HabboCatalog,
HabboRank,
HabboGames,
HabboHeart,
HabboOnline,
HabboChat,
HabboCog,
} from "@/components/shared/habbo-icons";
export async function Navigation({ session }: { session: Session | null }) {
const t = await getTranslations("nav");
const brandLabel = await resolveHotelName();
let showAdmin = false;
let showMod = false;
if (session?.user) {
const ctx = await getApiAdminContext();
if (ctx) {
showAdmin = canAccess(
ctx.permissions,
PERMS.ADMIN_DASHBOARD,
ctx.session.user.rank,
);
showMod =
canAccess(
ctx.permissions,
PERMS.MOD_DASHBOARD,
ctx.session.user.rank,
) ||
canAccess(
ctx.permissions,
PERMS.MODERATION_VIEW,
ctx.session.user.rank,
) ||
canAccess(ctx.permissions, PERMS.MOD_CFH_VIEW, ctx.session.user.rank) ||
canAccess(ctx.permissions, PERMS.MOD_ACTIONS, ctx.session.user.rank);
}
}
return (
<nav
className="sticky top-0 z-40"
style={{ backgroundColor: "var(--color-navbar)" }}
>
<div className="relative mx-auto flex min-h-[56px] max-w-7xl items-center px-4 md:px-6 gap-x-2">
<div
className="absolute bottom-0 left-0 right-0 h-[3px]"
style={{ backgroundColor: "var(--color-primary, #eeb425)" }}
/>
{/* Desktop: home link */}
<div className="hidden md:flex items-center gap-x-1">
<Link href="/" className="nav-item shrink-0">
<HabboHome size={18} />
<span className="ml-1.5">{t("home")}</span>
</Link>
</div>
{/* Desktop: nav items */}
<div className="hidden md:flex items-center gap-x-1">
<NavDropdown
label={t("community")}
icon={<HabboCommunity size={18} />}
>
<Link href="/news" className="dropdown-item" role="menuitem">
{t("articles")}
</Link>
<Link href="/photos" className="dropdown-item" role="menuitem">
{t("photos")}
</Link>
<Link href="/staff" className="dropdown-item" role="menuitem">
{t("staff")}
</Link>
<Link href="/rankings" className="dropdown-item" role="menuitem">
{t("rankings")}
</Link>
<Link href="/guilds" className="dropdown-item" role="menuitem">
{t("guilds")}
</Link>
<Link href="/events" className="dropdown-item" role="menuitem">
{t("events")}
</Link>
<Link href="/polls" className="dropdown-item" role="menuitem">
{t("polls")}
</Link>
</NavDropdown>
<NavDropdown
label={t("shop")}
icon={<HabboCatalog size={18} />}
>
<Link href="/shop" className="dropdown-item" role="menuitem">
{t("shop")}
</Link>
<Link href="/marketplace" className="dropdown-item" role="menuitem">
{t("market")}
</Link>
<Link href="/rares" className="dropdown-item" role="menuitem">
{t("rareValues")}
</Link>
</NavDropdown>
<Link href="/leaderboard" className="nav-item">
<HabboRank size={18} />
<span className="ml-1.5">{t("leaderboards")}</span>
</Link>
<Link href="/radio" className="nav-item">
<HabboGames size={18} />
<span className="ml-1.5">{t("radio")}</span>
</Link>
<NavDropdown
label={t("assistance")}
icon={<HabboHeart size={18} />}
>
<Link href="/help" className="dropdown-item" role="menuitem">
{t("helpCenter")}
</Link>
{session?.user ? (
<Link
href="/help/tickets"
className="dropdown-item"
role="menuitem"
>
{t("myTickets")}
</Link>
) : null}
<Link href="/badges" className="dropdown-item" role="menuitem">
{t("badges")}
</Link>
<Link href="/draw-badge" className="dropdown-item" role="menuitem">
{t("drawBadge")}
</Link>
</NavDropdown>
{session?.user ? (
<>
<Link href="/friends" className="nav-item">
<HabboOnline size={18} />
<span className="ml-1.5">{t("friends")}</span>
</Link>
<Link href="/messages" className="nav-item">
<HabboChat size={18} />
<span className="ml-1.5">{t("messages")}</span>
</Link>
</>
) : null}
{showMod ? (
<Link href="/mod" className="nav-item">
<HabboCog size={18} />
<span className="ml-1.5">{t("mod")}</span>
</Link>
) : null}
{showAdmin ? (
<Link href="/admin" className="nav-item">
<HabboCog size={18} />
<span className="ml-1.5">{t("admin")}</span>
</Link>
) : null}
</div>
{/* Mobile: hamburger menu (details/summary) */}
<MobileNav
menuLabel={t("openMenu") || "Open menu"}
closeLabel={t("closeMenu") || "Close menu"}
brandLabel={brandLabel}
>
<Link href="/" className="nav-item">
<HabboHome size={18} />
<span className="ml-1.5">{t("home")}</span>
</Link>
<NavDropdown
label={t("community")}
icon={<HabboCommunity size={18} />}
>
<Link href="/news" className="dropdown-item" role="menuitem">
{t("articles")}
</Link>
<Link href="/photos" className="dropdown-item" role="menuitem">
{t("photos")}
</Link>
<Link href="/staff" className="dropdown-item" role="menuitem">
{t("staff")}
</Link>
<Link href="/rankings" className="dropdown-item" role="menuitem">
{t("rankings")}
</Link>
<Link href="/guilds" className="dropdown-item" role="menuitem">
{t("guilds")}
</Link>
<Link href="/events" className="dropdown-item" role="menuitem">
{t("events")}
</Link>
<Link href="/polls" className="dropdown-item" role="menuitem">
{t("polls")}
</Link>
</NavDropdown>
<NavDropdown
label={t("shop")}
icon={<HabboCatalog size={18} />}
>
<Link href="/shop" className="dropdown-item" role="menuitem">
{t("shop")}
</Link>
<Link href="/marketplace" className="dropdown-item" role="menuitem">
{t("market")}
</Link>
<Link href="/rares" className="dropdown-item" role="menuitem">
{t("rareValues")}
</Link>
</NavDropdown>
<Link href="/leaderboard" className="nav-item">
<HabboRank size={18} />
<span className="ml-1.5">{t("leaderboards")}</span>
</Link>
<Link href="/radio" className="nav-item">
<HabboGames size={18} />
<span className="ml-1.5">{t("radio")}</span>
</Link>
<NavDropdown
label={t("assistance")}
icon={<HabboHeart size={18} />}
>
<Link href="/help" className="dropdown-item" role="menuitem">
{t("helpCenter")}
</Link>
{session?.user ? (
<Link
href="/help/tickets"
className="dropdown-item"
role="menuitem"
>
{t("myTickets")}
</Link>
) : null}
<Link href="/badges" className="dropdown-item" role="menuitem">
{t("badges")}
</Link>
<Link href="/draw-badge" className="dropdown-item" role="menuitem">
{t("drawBadge")}
</Link>
</NavDropdown>
{session?.user ? (
<>
<Link href="/friends" className="nav-item">
<HabboOnline size={18} />
<span className="ml-1.5">{t("friends")}</span>
</Link>
<Link href="/messages" className="nav-item">
<HabboChat size={18} />
<span className="ml-1.5">{t("messages")}</span>
</Link>
</>
) : null}
{showMod ? (
<Link href="/mod" className="nav-item">
<HabboCog size={18} />
<span className="ml-1.5">{t("mod")}</span>
</Link>
) : null}
{showAdmin ? (
<Link href="/admin" className="nav-item">
<HabboCog size={18} />
<span className="ml-1.5">{t("admin")}</span>
</Link>
) : null}
<div
className="flex items-center gap-x-1 pt-2 mt-2 border-t"
style={{
borderColor:
"color-mix(in srgb, var(--color-text-muted) 10%, transparent)",
}}
>
<LanguageSwitcher />
<NavbarColorPicker />
<ThemeSwitcher />
</div>
</MobileNav>
{/* Mobile: brand (right) */}
<Link
href="/"
className="ml-auto flex md:hidden items-center gap-2 shrink-0"
aria-label="Home"
>
<HabboHome size={24} />
<span
className="text-base font-extrabold uppercase tracking-wide"
style={{
color:
"var(--color-navbar-text-readable, var(--color-navbar-text))",
}}
>
Atom
</span>
</Link>
{/* Desktop: controls */}
<div className="ml-auto hidden md:flex items-center gap-x-1">
<LanguageSwitcher />
<NavbarColorPicker />
<ThemeSwitcher />
</div>
</div>
</nav>
);
}