Add dark mode, i18n, messenger/moderation/verify, admin CRUD parity

Web-tier features completing the AtomCMS→Next.js conversion (slice 2):

UI/UX:
- Dark mode: html.dark CSS-var overrides + ThemeSwitcher (localStorage,
  no-flash boot script) wired into the nav.
- i18n (next-intl, cookie-based / no URL routing): en + it catalogs,
  request.ts, provider in root layout, LanguageSwitcher; shell (nav,
  header, footer) fully translated. URLs + access-guard unchanged.
- globals.css: --muted/--border aliases used across admin pages.

User features:
- /messages: offline messages + friend-request accept (server action
  re-reads session, two directional rows, idempotent).
- Email verification: signed-token /verify route + sendVerification wired
  into register (best-effort, never blocks signup).
- Article reactions: toggle UI on news/[slug] + server action.
- Content moderation service (website_wordfilter + optional OpenAI
  moderations, fail-open) wired into article comments + guestbook.

Admin CRUD parity (Filament replacement):
- /admin/shop (+ new/[id]) packages CRUD + read-only orders.
- /admin/transactions read-only PayPal log.
- /admin/permissions, /admin/tags, /admin/ads (+ new/[id]),
  /admin/help-questions (+ new/[id]), /admin/radio/history,
  /admin/users/[id]/edit. All gated by requireStaff + logStaffActivity.

Verified: tsc 0, vitest 48/48, next build 0 (all routes incl. new
admin CRUD + /messages + /verify).
This commit is contained in:
Simo committed 2026-06-28 16:06:42 +02:00
1 parent 22d53d0e9c
commit 7daeccb832
45 files changed
+3312 -84

No files matched your search

+39
View File
@@ -0,0 +1,39 @@
{
"nav": {
"home": "Home",
"community": "Community",
"articles": "Articles",
"photos": "Photos",
"staff": "Staff",
"rankings": "Rankings",
"guilds": "Guilds",
"leaderboards": "Leaderboards",
"rareValues": "Rare values",
"shop": "Shop",
"market": "Market",
"assistance": "Assistance",
"helpCenter": "Help center",
"myTickets": "My tickets",
"badges": "Badges",
"radio": "Radio",
"friends": "Friends",
"messages": "Messages",
"admin": "Admin"
},
"header": {
"online": "{count} {hotel} online",
"nitroClient": "Nitro client",
"tagline": "An online virtual world where you can create your own avatar, make friends, chat, create rooms and much more!",
"login": "Login",
"or": "Or",
"createAccount": "Create an account"
},
"footer": {
"copyright": "© {year} - {hotel} is a not for profit educational project"
},
"common": {
"language": "Language",
"lightMode": "Light mode",
"darkMode": "Dark mode"
}
}
+39
View File
@@ -0,0 +1,39 @@
{
"nav": {
"home": "Home",
"community": "Community",
"articles": "Articoli",
"photos": "Foto",
"staff": "Staff",
"rankings": "Classifiche",
"guilds": "Gruppi",
"leaderboards": "Classifiche",
"rareValues": "Valori rari",
"shop": "Negozio",
"market": "Mercato",
"assistance": "Assistenza",
"helpCenter": "Centro assistenza",
"myTickets": "I miei ticket",
"badges": "Distintivi",
"radio": "Radio",
"friends": "Amici",
"messages": "Messaggi",
"admin": "Admin"
},
"header": {
"online": "{count} online su {hotel}",
"nitroClient": "Client Nitro",
"tagline": "Un mondo virtuale online dove puoi creare il tuo avatar, fare amicizia, chattare, creare stanze e molto altro!",
"login": "Accedi",
"or": "Oppure",
"createAccount": "Crea un account"
},
"footer": {
"copyright": "© {year} - {hotel} è un progetto educativo senza scopo di lucro"
},
"common": {
"language": "Lingua",
"lightMode": "Tema chiaro",
"darkMode": "Tema scuro"
}
}