diff --git a/src/app/admin/achievements/page.tsx b/src/app/admin/achievements/page.tsx index 13f5ece9..7267af99 100644 --- a/src/app/admin/achievements/page.tsx +++ b/src/app/admin/achievements/page.tsx @@ -50,7 +50,7 @@ export default async function AdminAchievements() { Read-only ยท {achievements.length} rows across {groups.size} categories.

-
+
@@ -60,10 +60,10 @@ export default async function AdminAchievements() {

No achievements found.

) : ( [...groups.entries()].map(([category, rows]) => ( -
+

{category}{" "} - {rows.length} + {rows.length}

diff --git a/src/app/admin/ads/page.tsx b/src/app/admin/ads/page.tsx index b7cb534d..a825e6a1 100644 --- a/src/app/admin/ads/page.tsx +++ b/src/app/admin/ads/page.tsx @@ -32,12 +32,12 @@ export default async function AdminAds() { across the site.

-
+
-
+

All ads

{ads.length === 0 ? (

No advertisements yet.

diff --git a/src/app/admin/alerts/page.tsx b/src/app/admin/alerts/page.tsx index 78ad306b..997b3608 100644 --- a/src/app/admin/alerts/page.tsx +++ b/src/app/admin/alerts/page.tsx @@ -79,7 +79,7 @@ export default async function AdminAlerts() { Read-only ยท 100 most recent alert_logs (newest first).

-
+
-
+
-
+

Applications ({applications.length})

{applications.length === 0 ? (

No pending applications.

@@ -84,7 +84,7 @@ export default async function AdminApplications() { <>User #{a.userId} )} - Rank {a.rankId} + Rank {a.rankId}

{formatDate(a.createdAt)} diff --git a/src/app/admin/articles/page.tsx b/src/app/admin/articles/page.tsx index 5da525c7..87ad088c 100644 --- a/src/app/admin/articles/page.tsx +++ b/src/app/admin/articles/page.tsx @@ -41,12 +41,12 @@ export default async function AdminArticles({

) : null} -
+
-
+

Recent articles

{articles.length === 0 ? (

No articles yet.

diff --git a/src/app/admin/badges/page.tsx b/src/app/admin/badges/page.tsx index 9641fc93..f19d099d 100644 --- a/src/app/admin/badges/page.tsx +++ b/src/app/admin/badges/page.tsx @@ -25,7 +25,7 @@ export default async function AdminBadges({ return (
-
+

Badges

Website badge catalogue (website_badges). Granting fires the emulator @@ -34,18 +34,18 @@ export default async function AdminBadges({ {uploaded ? (

- Uploaded Badge image{" "} + Uploaded Badge image{" "} {uploaded}.gif saved.

) : null} {error ? (

- Error {error} + Error {error}

) : null}
-
+

Upload badge image

Saves a .gif badge image to the emulator badge directory @@ -69,7 +69,7 @@ export default async function AdminBadges({

-
+

Give badge to user

@@ -96,7 +96,7 @@ export default async function AdminBadges({
-
+

Catalogue ({badges.length})

{badges.length === 0 ? (

No badges in the catalogue.

diff --git a/src/app/admin/bans/page.tsx b/src/app/admin/bans/page.tsx index ef5d709d..f2890ffc 100644 --- a/src/app/admin/bans/page.tsx +++ b/src/app/admin/bans/page.tsx @@ -32,7 +32,7 @@ export default async function AdminBans() { Active bans only (expiry in the future) ยท newest first.

-
+
-
+

Active bans ({bans.length})

{bans.length === 0 ? (

No active bans.

@@ -87,12 +87,12 @@ export default async function AdminBans() {
diff --git a/src/app/admin/commandocentrum/page.tsx b/src/app/admin/commandocentrum/page.tsx index 122df50f..999253a0 100644 --- a/src/app/admin/commandocentrum/page.tsx +++ b/src/app/admin/commandocentrum/page.tsx @@ -91,7 +91,7 @@ export default async function CommandoCentrum() {

{/* โ”€โ”€ Live status โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Server info

-
+
@@ -149,7 +149,7 @@ export default async function CommandoCentrum() {

System diagnostics

-
+
{/* โ”€โ”€ RCON controls โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Emulator controls

@@ -240,7 +240,7 @@ export default async function CommandoCentrum() {
{/* โ”€โ”€ User RCON actions โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

User actions (RCON)

Enter a User ID to perform actions on a specific user. Username required for disconnect. @@ -345,7 +345,7 @@ export default async function CommandoCentrum() {

{/* โ”€โ”€ Staff activity โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Recent staff activity

{activity.length === 0 ? (

No staff activity logged yet.

@@ -367,7 +367,7 @@ export default async function CommandoCentrum() {
@@ -378,7 +378,7 @@ export default async function CommandoCentrum() { {/* โ”€โ”€ Emulator errors โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Recent emulator errors

{errors.length === 0 ? (

No emulator errors logged.

diff --git a/src/app/admin/emulator/page.tsx b/src/app/admin/emulator/page.tsx index c1e193c3..2abede9d 100644 --- a/src/app/admin/emulator/page.tsx +++ b/src/app/admin/emulator/page.tsx @@ -41,12 +41,12 @@ export default async function AdminEmulator() { on the next emulator read (some keys require an emulator reload).

-
+
-
+

Settings

{settings.length} keys. @@ -111,7 +111,7 @@ export default async function AdminEmulator() { ) : null}

-
+

Texts

{textsCount} keys{textsTruncated ? ` (showing first ${texts.length})` : ""}. diff --git a/src/app/admin/help-questions/page.tsx b/src/app/admin/help-questions/page.tsx index 2958024f..5b4557a3 100644 --- a/src/app/admin/help-questions/page.tsx +++ b/src/app/admin/help-questions/page.tsx @@ -33,13 +33,13 @@ export default async function AdminHelpQuestions() { the public help page, ordered by position.

-
+
-
+

Entries

{entries.length === 0 ? (

No help-center entries yet.

@@ -63,7 +63,7 @@ export default async function AdminHelpQuestions() {
diff --git a/src/app/admin/housekeeping/page.tsx b/src/app/admin/housekeeping/page.tsx index 2dac2483..4bf76b59 100644 --- a/src/app/admin/housekeeping/page.tsx +++ b/src/app/admin/housekeeping/page.tsx @@ -49,13 +49,13 @@ export default async function AdminHousekeeping({ existing key overwrites its min rank and description.

-
+
-
+
{mode === "manage" ? ( -
+

Add / overwrite permission

@@ -109,7 +109,7 @@ export default async function AdminHousekeeping({
) : ( -
+

Import Permissions

Paste comma-separated permission IDs to import them as a selection. @@ -123,9 +123,9 @@ export default async function AdminHousekeeping({

)} -
+

- Permissions {filtered.length} + Permissions {filtered.length}

{filtered.length === 0 ? (

No housekeeping permissions match this search.

diff --git a/src/app/admin/ip/page.tsx b/src/app/admin/ip/page.tsx index acaea216..7aa10724 100644 --- a/src/app/admin/ip/page.tsx +++ b/src/app/admin/ip/page.tsx @@ -49,7 +49,7 @@ export default async function AdminIp() { Allow or block IP addresses (and ASNs) at the website edge.

-
+
{/* โ”€โ”€ Whitelist โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Whitelist

@@ -120,7 +120,7 @@ export default async function AdminIp() {
{/* โ”€โ”€ Blacklist โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Blacklist

diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx index 172d4df8..ad9fe021 100644 --- a/src/app/admin/layout.tsx +++ b/src/app/admin/layout.tsx @@ -92,22 +92,29 @@ export default async function AdminLayout({ children }: { children: ReactNode }) const initial = staff.username.charAt(0).toUpperCase(); return ( -
-
{b.userId} - {b.type} + {b.type} {b.banReason || "โ€”"} {b.banExpire === 0 ? ( - permanent + permanent ) : ( {fromUnix(b.banExpire)} diff --git a/src/app/admin/calendar/page.tsx b/src/app/admin/calendar/page.tsx index 8ecc5423..32f87ad5 100644 --- a/src/app/admin/calendar/page.tsx +++ b/src/app/admin/calendar/page.tsx @@ -62,7 +62,7 @@ export default async function AdminCalendar() { Read-only ยท {campaigns.length} campaign{campaigns.length === 1 ? "" : "s"}.

-
+

{c.name || `Campaign #${c.id}`}

- + {enabled ? "enabled" : "disabled"}
diff --git a/src/app/admin/catalog/page.tsx b/src/app/admin/catalog/page.tsx index a10eefeb..b2e6d204 100644 --- a/src/app/admin/catalog/page.tsx +++ b/src/app/admin/catalog/page.tsx @@ -53,7 +53,7 @@ export default async function AdminCatalog() { Browse catalog pages and the items they contain. Read-only.

-
+
-
+

Pages ({pages.length})

{pages.length === 0 ? (

No catalog pages found.

@@ -105,7 +105,7 @@ export default async function AdminCatalog() {
{p.minRank} {p.orderNum} - + {hidden ? "Hidden" : "Visible"} {nameById.get(Number(a.userId)) ?? `#${a.userId}`} - {a.action} + {a.action} {a.description}
{e.buttonText || "โ€”"} - + {e.smallBox ? "Yes" : "No"} {fromDate(a.createdAt)} #{Number(a.userId)} ({nameById.get(Number(a.userId)) ?? "unknown"}) - {a.action} + {a.action} {a.description} diff --git a/src/app/admin/maintenance/page.tsx b/src/app/admin/maintenance/page.tsx index 2509058c..7022d7e7 100644 --- a/src/app/admin/maintenance/page.tsx +++ b/src/app/admin/maintenance/page.tsx @@ -41,7 +41,7 @@ export default async function AdminMaintenance() { website_settings and read live by the login flow.

-
+
{/* โ”€โ”€ Current state โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Current state

- + {enabled ? "ENABLED" : "disabled"}
@@ -84,7 +84,7 @@ export default async function AdminMaintenance() {
{/* โ”€โ”€ Edit form โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ */} -
+

Settings