diff --git a/src/app/apply/staff/page.tsx b/src/app/(site)/apply/staff/page.tsx
similarity index 100%
rename from src/app/apply/staff/page.tsx
rename to src/app/(site)/apply/staff/page.tsx
diff --git a/src/app/apply/team/page.tsx b/src/app/(site)/apply/team/page.tsx
similarity index 100%
rename from src/app/apply/team/page.tsx
rename to src/app/(site)/apply/team/page.tsx
diff --git a/src/app/badges/page.tsx b/src/app/(site)/badges/page.tsx
similarity index 100%
rename from src/app/badges/page.tsx
rename to src/app/(site)/badges/page.tsx
diff --git a/src/app/banned/page.tsx b/src/app/(site)/banned/page.tsx
similarity index 100%
rename from src/app/banned/page.tsx
rename to src/app/(site)/banned/page.tsx
diff --git a/src/app/community/page.tsx b/src/app/(site)/community/page.tsx
similarity index 100%
rename from src/app/community/page.tsx
rename to src/app/(site)/community/page.tsx
diff --git a/src/app/developers/page.tsx b/src/app/(site)/developers/page.tsx
similarity index 100%
rename from src/app/developers/page.tsx
rename to src/app/(site)/developers/page.tsx
diff --git a/src/app/draw-badge/page.tsx b/src/app/(site)/draw-badge/page.tsx
similarity index 100%
rename from src/app/draw-badge/page.tsx
rename to src/app/(site)/draw-badge/page.tsx
diff --git a/src/app/forgot/page.tsx b/src/app/(site)/forgot/page.tsx
similarity index 100%
rename from src/app/forgot/page.tsx
rename to src/app/(site)/forgot/page.tsx
diff --git a/src/app/friends/page.tsx b/src/app/(site)/friends/page.tsx
similarity index 100%
rename from src/app/friends/page.tsx
rename to src/app/(site)/friends/page.tsx
diff --git a/src/app/guilds/[id]/forum/new/page.tsx b/src/app/(site)/guilds/[id]/forum/new/page.tsx
similarity index 100%
rename from src/app/guilds/[id]/forum/new/page.tsx
rename to src/app/(site)/guilds/[id]/forum/new/page.tsx
diff --git a/src/app/guilds/[id]/forum/page.tsx b/src/app/(site)/guilds/[id]/forum/page.tsx
similarity index 100%
rename from src/app/guilds/[id]/forum/page.tsx
rename to src/app/(site)/guilds/[id]/forum/page.tsx
diff --git a/src/app/guilds/[id]/page.tsx b/src/app/(site)/guilds/[id]/page.tsx
similarity index 100%
rename from src/app/guilds/[id]/page.tsx
rename to src/app/(site)/guilds/[id]/page.tsx
diff --git a/src/app/guilds/page.tsx b/src/app/(site)/guilds/page.tsx
similarity index 100%
rename from src/app/guilds/page.tsx
rename to src/app/(site)/guilds/page.tsx
diff --git a/src/app/help/[category]/page.tsx b/src/app/(site)/help/[category]/page.tsx
similarity index 100%
rename from src/app/help/[category]/page.tsx
rename to src/app/(site)/help/[category]/page.tsx
diff --git a/src/app/help/page.tsx b/src/app/(site)/help/page.tsx
similarity index 100%
rename from src/app/help/page.tsx
rename to src/app/(site)/help/page.tsx
diff --git a/src/app/help/tickets/page.tsx b/src/app/(site)/help/tickets/page.tsx
similarity index 100%
rename from src/app/help/tickets/page.tsx
rename to src/app/(site)/help/tickets/page.tsx
diff --git a/src/app/(site)/layout.tsx b/src/app/(site)/layout.tsx
new file mode 100644
index 00000000..6eee060e
--- /dev/null
+++ b/src/app/(site)/layout.tsx
@@ -0,0 +1,27 @@
+import type { ReactNode } from "react";
+import { Navigation } from "@/components/navigation";
+import RadioPlayerGate from "@/components/public/radio-player-gate";
+import { SiteFooter } from "@/components/site-footer";
+import { SiteHeader } from "@/components/site-header";
+import { TopHeader } from "@/components/top-header";
+
+/**
+ * Public site chrome. Route group `(site)` keeps this off `/admin` and `/client`,
+ * so housekeeping is never constrained by the public max-w-7xl grid.
+ */
+export default function SiteLayout({ children }: { children: ReactNode }) {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/leaderboard/page.tsx b/src/app/(site)/leaderboard/page.tsx
similarity index 100%
rename from src/app/leaderboard/page.tsx
rename to src/app/(site)/leaderboard/page.tsx
diff --git a/src/app/login/page.tsx b/src/app/(site)/login/page.tsx
similarity index 100%
rename from src/app/login/page.tsx
rename to src/app/(site)/login/page.tsx
diff --git a/src/app/logo/page.tsx b/src/app/(site)/logo/page.tsx
similarity index 100%
rename from src/app/logo/page.tsx
rename to src/app/(site)/logo/page.tsx
diff --git a/src/app/maintenance/page.tsx b/src/app/(site)/maintenance/page.tsx
similarity index 100%
rename from src/app/maintenance/page.tsx
rename to src/app/(site)/maintenance/page.tsx
diff --git a/src/app/marketplace/page.tsx b/src/app/(site)/marketplace/page.tsx
similarity index 100%
rename from src/app/marketplace/page.tsx
rename to src/app/(site)/marketplace/page.tsx
diff --git a/src/app/me/CopyReferralButton.tsx b/src/app/(site)/me/CopyReferralButton.tsx
similarity index 100%
rename from src/app/me/CopyReferralButton.tsx
rename to src/app/(site)/me/CopyReferralButton.tsx
diff --git a/src/app/me/page.tsx b/src/app/(site)/me/page.tsx
similarity index 100%
rename from src/app/me/page.tsx
rename to src/app/(site)/me/page.tsx
diff --git a/src/app/messages/page.tsx b/src/app/(site)/messages/page.tsx
similarity index 100%
rename from src/app/messages/page.tsx
rename to src/app/(site)/messages/page.tsx
diff --git a/src/app/news/[slug]/page.tsx b/src/app/(site)/news/[slug]/page.tsx
similarity index 100%
rename from src/app/news/[slug]/page.tsx
rename to src/app/(site)/news/[slug]/page.tsx
diff --git a/src/app/news/loading.tsx b/src/app/(site)/news/loading.tsx
similarity index 100%
rename from src/app/news/loading.tsx
rename to src/app/(site)/news/loading.tsx
diff --git a/src/app/news/page.tsx b/src/app/(site)/news/page.tsx
similarity index 100%
rename from src/app/news/page.tsx
rename to src/app/(site)/news/page.tsx
diff --git a/src/app/page.tsx b/src/app/(site)/page.tsx
similarity index 100%
rename from src/app/page.tsx
rename to src/app/(site)/page.tsx
diff --git a/src/app/photos/page.tsx b/src/app/(site)/photos/page.tsx
similarity index 100%
rename from src/app/photos/page.tsx
rename to src/app/(site)/photos/page.tsx
diff --git a/src/app/radio/apply/page.tsx b/src/app/(site)/radio/apply/page.tsx
similarity index 100%
rename from src/app/radio/apply/page.tsx
rename to src/app/(site)/radio/apply/page.tsx
diff --git a/src/app/radio/contests/[id]/page.tsx b/src/app/(site)/radio/contests/[id]/page.tsx
similarity index 100%
rename from src/app/radio/contests/[id]/page.tsx
rename to src/app/(site)/radio/contests/[id]/page.tsx
diff --git a/src/app/radio/contests/page.tsx b/src/app/(site)/radio/contests/page.tsx
similarity index 100%
rename from src/app/radio/contests/page.tsx
rename to src/app/(site)/radio/contests/page.tsx
diff --git a/src/app/radio/giveaways/[id]/page.tsx b/src/app/(site)/radio/giveaways/[id]/page.tsx
similarity index 100%
rename from src/app/radio/giveaways/[id]/page.tsx
rename to src/app/(site)/radio/giveaways/[id]/page.tsx
diff --git a/src/app/radio/giveaways/page.tsx b/src/app/(site)/radio/giveaways/page.tsx
similarity index 100%
rename from src/app/radio/giveaways/page.tsx
rename to src/app/(site)/radio/giveaways/page.tsx
diff --git a/src/app/radio/layout.tsx b/src/app/(site)/radio/layout.tsx
similarity index 100%
rename from src/app/radio/layout.tsx
rename to src/app/(site)/radio/layout.tsx
diff --git a/src/app/radio/leaderboard/page.tsx b/src/app/(site)/radio/leaderboard/page.tsx
similarity index 100%
rename from src/app/radio/leaderboard/page.tsx
rename to src/app/(site)/radio/leaderboard/page.tsx
diff --git a/src/app/radio/page.tsx b/src/app/(site)/radio/page.tsx
similarity index 100%
rename from src/app/radio/page.tsx
rename to src/app/(site)/radio/page.tsx
diff --git a/src/app/radio/requests/page.tsx b/src/app/(site)/radio/requests/page.tsx
similarity index 100%
rename from src/app/radio/requests/page.tsx
rename to src/app/(site)/radio/requests/page.tsx
diff --git a/src/app/radio/schedule/page.tsx b/src/app/(site)/radio/schedule/page.tsx
similarity index 100%
rename from src/app/radio/schedule/page.tsx
rename to src/app/(site)/radio/schedule/page.tsx
diff --git a/src/app/radio/shouts/page.tsx b/src/app/(site)/radio/shouts/page.tsx
similarity index 100%
rename from src/app/radio/shouts/page.tsx
rename to src/app/(site)/radio/shouts/page.tsx
diff --git a/src/app/rankings/page.tsx b/src/app/(site)/rankings/page.tsx
similarity index 100%
rename from src/app/rankings/page.tsx
rename to src/app/(site)/rankings/page.tsx
diff --git a/src/app/rares/[category]/page.tsx b/src/app/(site)/rares/[category]/page.tsx
similarity index 100%
rename from src/app/rares/[category]/page.tsx
rename to src/app/(site)/rares/[category]/page.tsx
diff --git a/src/app/rares/page.tsx b/src/app/(site)/rares/page.tsx
similarity index 100%
rename from src/app/rares/page.tsx
rename to src/app/(site)/rares/page.tsx
diff --git a/src/app/redeem/RedeemForm.tsx b/src/app/(site)/redeem/RedeemForm.tsx
similarity index 100%
rename from src/app/redeem/RedeemForm.tsx
rename to src/app/(site)/redeem/RedeemForm.tsx
diff --git a/src/app/redeem/page.tsx b/src/app/(site)/redeem/page.tsx
similarity index 100%
rename from src/app/redeem/page.tsx
rename to src/app/(site)/redeem/page.tsx
diff --git a/src/app/register/page.tsx b/src/app/(site)/register/page.tsx
similarity index 100%
rename from src/app/register/page.tsx
rename to src/app/(site)/register/page.tsx
diff --git a/src/app/reset/page.tsx b/src/app/(site)/reset/page.tsx
similarity index 100%
rename from src/app/reset/page.tsx
rename to src/app/(site)/reset/page.tsx
diff --git a/src/app/room/[id]/page.tsx b/src/app/(site)/room/[id]/page.tsx
similarity index 100%
rename from src/app/room/[id]/page.tsx
rename to src/app/(site)/room/[id]/page.tsx
diff --git a/src/app/settings/2fa/page.tsx b/src/app/(site)/settings/2fa/page.tsx
similarity index 100%
rename from src/app/settings/2fa/page.tsx
rename to src/app/(site)/settings/2fa/page.tsx
diff --git a/src/app/settings/connections/page.tsx b/src/app/(site)/settings/connections/page.tsx
similarity index 100%
rename from src/app/settings/connections/page.tsx
rename to src/app/(site)/settings/connections/page.tsx
diff --git a/src/app/settings/page.tsx b/src/app/(site)/settings/page.tsx
similarity index 100%
rename from src/app/settings/page.tsx
rename to src/app/(site)/settings/page.tsx
diff --git a/src/app/settings/sessions/page.tsx b/src/app/(site)/settings/sessions/page.tsx
similarity index 100%
rename from src/app/settings/sessions/page.tsx
rename to src/app/(site)/settings/sessions/page.tsx
diff --git a/src/app/shop/page.tsx b/src/app/(site)/shop/page.tsx
similarity index 100%
rename from src/app/shop/page.tsx
rename to src/app/(site)/shop/page.tsx
diff --git a/src/app/shop/topup/TopUpForm.tsx b/src/app/(site)/shop/topup/TopUpForm.tsx
similarity index 100%
rename from src/app/shop/topup/TopUpForm.tsx
rename to src/app/(site)/shop/topup/TopUpForm.tsx
diff --git a/src/app/shop/topup/page.tsx b/src/app/(site)/shop/topup/page.tsx
similarity index 100%
rename from src/app/shop/topup/page.tsx
rename to src/app/(site)/shop/topup/page.tsx
diff --git a/src/app/staff/page.tsx b/src/app/(site)/staff/page.tsx
similarity index 100%
rename from src/app/staff/page.tsx
rename to src/app/(site)/staff/page.tsx
diff --git a/src/app/u/[username]/page.tsx b/src/app/(site)/u/[username]/page.tsx
similarity index 100%
rename from src/app/u/[username]/page.tsx
rename to src/app/(site)/u/[username]/page.tsx
diff --git a/src/app/verify/page.tsx b/src/app/(site)/verify/page.tsx
similarity index 100%
rename from src/app/verify/page.tsx
rename to src/app/(site)/verify/page.tsx
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 3f10734f..ab9b19a2 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,17 +1,11 @@
import type { Metadata } from "next";
import { Nunito, Pixelify_Sans } from "next/font/google";
-import { headers } from "next/headers";
import Script from "next/script";
import { NextIntlClientProvider } from "next-intl";
import { getLocale, getMessages } from "next-intl/server";
import type { ReactNode } from "react";
-import { Navigation } from "@/components/navigation";
-import RadioPlayerGate from "@/components/public/radio-player-gate";
import { PwaRegister } from "@/components/pwa-register";
-import { SiteFooter } from "@/components/site-footer";
-import { SiteHeader } from "@/components/site-header";
import { ThemeVars } from "@/components/theme-vars";
-import { TopHeader } from "@/components/top-header";
import { enforceSiteAccess } from "@/lib/access-guard";
import { siteSettings } from "@/lib/services/site-settings";
import "./globals.css";
@@ -63,16 +57,9 @@ export default async function RootLayout({
await enforceSiteAccess();
const locale = await getLocale();
const messages = await getMessages();
- // "Dusk" / dark-by-default: the site starts dark unless the visitor has picked
- // light. The saved choice always wins over the default.
const defaultDark = await siteSettings.getBool("default_dark", false);
-
- const headersList = await headers();
- const pathname =
- headersList.get("x-pathname") || headersList.get("next-url") || "";
- const isClient = pathname === "/client" || pathname.startsWith("/client/");
- const isAdmin = pathname === "/admin" || pathname.startsWith("/admin/");
const nitroUrl = await siteSettings.get("nitro_client_url", "");
+
return (
- {isClient || isAdmin ? (
- children
- ) : (
- <>
-
-
-
-
-
-
-
-
- >
- )}
+ {children}