diff --git a/docs/superpowers/plans/2026-07-17-admin-ux-cleanup-phase1.md b/docs/superpowers/plans/2026-07-17-admin-ux-cleanup-phase1.md new file mode 100644 index 00000000..e26bf146 --- /dev/null +++ b/docs/superpowers/plans/2026-07-17-admin-ux-cleanup-phase1.md @@ -0,0 +1,78 @@ +# Admin UX Cleanup Phase 1 — Implementation Plan + +> **For agentic workers:** Execute task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Remove double hub headers, wire orphan routes into tabs, dedupe theme/language controls, group Radio tabs, and differentiate Access vs Moderation icons. + +**Architecture:** Config-driven hubs in `src/lib/admin-nav.ts`; chrome in `AdminHubChrome` / `AdminSectionTabs`; layout controls in `src/app/admin/layout.tsx`. No new routes — only navigation and presentation. + +**Tech Stack:** Next.js App Router, React, Tailwind, Lucide, existing admin CSS tokens. + +**Spec:** `docs/superpowers/specs/2026-07-17-admin-ux-cleanup-design.md` + +--- + +## File map + +| File | Role | +|------|------| +| `src/lib/admin-nav.ts` | Hub tabs, Radio `group`, icon imports | +| `src/components/admin/admin-section-tabs.tsx` | Optional grouped tab rows | +| `src/components/admin/admin-hub-chrome.tsx` | Pass tabs through (no API change if tabs shape extends) | +| `src/app/admin/layout.tsx` | Theme/lang: sidebar always; topbar `lg:hidden` only | +| `src/app/admin/**/page.tsx` (hub lists) | Strip redundant `h1` + duplicate intro blocks | + +--- + +### Task 1: Extend tab type + Radio groups + orphan tabs + icons + +**Files:** +- Modify: `src/lib/admin-nav.ts` +- Modify: `src/components/admin/admin-section-tabs.tsx` + +- [ ] Add optional `group?: string` to `AdminHubTab` / `AdminTab` +- [ ] Users: add Multi-accounts tab +- [ ] Engagement: add Event types + Templates tabs +- [ ] Observability: add Chat, Commands, Trades, Activity, Economy, Errors; tighten Logs `match` to exact index only via scorer (href-only is enough if subpaths are longer) +- [ ] Radio: set `group: "primary"` / `group: "tools"` on tabs +- [ ] Moderation nav icon → `Gavel` (or `ShieldAlert`); keep Access as `Ban` +- [ ] Render grouped tabs: if any tab has `group`, render one nav per distinct group (label Primary / Tools only for radio tools group — use human labels from group id: `primary` unlabeled or “Main”, `tools` → “Tools”) + +### Task 2: Theme / language placement + +**Files:** +- Modify: `src/app/admin/layout.tsx` + +- [ ] Keep switchers in sidebar +- [ ] Wrap topbar switchers in `className="flex … lg:hidden"` so desktop shows them once + +### Task 3: Strip redundant hub list headers + +**Files:** Hub **list/overview** pages that duplicate shell title (not entity detail/create): + +Strip the page-level title row (`h1` / icon header duplicating hub), keep filters and action buttons. + +**Remove duplicate title on (list/tab pages):** +`banners`, `users`, `users/multi-accounts`, `rooms`, `prefixes`, `sounds`, `tickets`, `tickets/templates`, `polls`, `online`, `moderation`, `moderation/actions`, `moderation/cfh`, `moderation/team`, `logs` (if present), `logs/audit`, `logs/chat`, `logs/commands`, `logs/trades`, `events`, `events/types`, `devops`, `devops/errors`, `analytics`, `analytics/activity`, `analytics/economy`, `catalog` (list chrome only) + +**Keep title on:** +`polls/create`, `polls/[id]`, `events/create`, `events/[id]`, `catalog/[id]`, and any `show`/`edit`/`new` entity pages + +Also strip duplicate headers on other hub tab roots that use different class patterns (articles, photos, ads, radio overview, settings, etc.) if they repeat hub title — grep for similar patterns. + +### Task 4: Verify + commit + +- [ ] Spot-check tab active states: `/admin/users` vs `/admin/users/multi-accounts`, `/admin/logs` vs `/admin/logs/chat`, `/admin/events` vs `/admin/events/types` +- [ ] Commit + push + +--- + +## Spec coverage + +| Spec item | Task | +|-----------|------| +| 1.1 Single hub header | Task 3 | +| 1.2 Orphan routes | Task 1 | +| 1.3 Theme/lang | Task 2 | +| 1.4 Radio groups | Task 1 | +| 1.5 Icons | Task 1 | diff --git a/src/app/admin/achievements/page.tsx b/src/app/admin/achievements/page.tsx index f579d8e6..624b82ef 100644 --- a/src/app/admin/achievements/page.tsx +++ b/src/app/admin/achievements/page.tsx @@ -1,4 +1,3 @@ -import { Award } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; @@ -54,23 +53,6 @@ export default async function AdminAchievements() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle", { - rows: achievements.length, - categories: groups.size, - })} -

-
-
-
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
+
+ {t("newAd")} diff --git a/src/app/admin/alerts/page.tsx b/src/app/admin/alerts/page.tsx index e27cd2ff..d3813760 100644 --- a/src/app/admin/alerts/page.tsx +++ b/src/app/admin/alerts/page.tsx @@ -1,4 +1,3 @@ -import { Bell } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { sendHotelAlert } from "@/actions/admin-alerts"; import { StatusCard } from "@/components/admin/dashboard"; @@ -83,20 +82,6 @@ export default async function AdminAlerts() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-

Activity

-

- User activity breakdown and engagement metrics -

-
-
-
-

Economy

-

- Currency circulation, shop revenue and marketplace activity -

-
-
-
-

Analytics

-

- Hotel performance overview and trends -

-
-
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
+
+ {t("newArticle")} diff --git a/src/app/admin/badges/page.tsx b/src/app/admin/badges/page.tsx index 6e223921..b4b99328 100644 --- a/src/app/admin/badges/page.tsx +++ b/src/app/admin/badges/page.tsx @@ -1,4 +1,3 @@ -import { Award } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { uploadBadge } from "@/actions/admin-badge-upload"; import { giveBadge } from "@/actions/admin-badges"; @@ -35,20 +34,6 @@ export default async function AdminBadges({ return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
- {uploaded && (
{t("uploadedMessage", { code: uploaded })} diff --git a/src/app/admin/banners/page.tsx b/src/app/admin/banners/page.tsx index 368fdb6b..5f66bb09 100644 --- a/src/app/admin/banners/page.tsx +++ b/src/app/admin/banners/page.tsx @@ -15,12 +15,6 @@ export default async function BannersPage() { return (
-
-

Banners

-

- Manage homepage banners and promotional slides -

-
); diff --git a/src/app/admin/bans/page.tsx b/src/app/admin/bans/page.tsx index 5e52fe2c..426fd06d 100644 --- a/src/app/admin/bans/page.tsx +++ b/src/app/admin/bans/page.tsx @@ -1,4 +1,3 @@ -import { Ban } from "lucide-react"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { createBan, liftBan } from "@/actions/admin-bans"; @@ -37,20 +36,6 @@ export default async function AdminBans() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle", { count: campaigns.length })} -

-
-
-
-
-

Catalog Pages

-

- {totalBcPages} BC pages ({enabledBcPages} enabled) ·{" "} - {totalBcItems} items -

-
+

+ {totalBcPages} BC pages ({enabledBcPages} enabled) ·{" "} + {totalBcItems} items +

{canEdit && } @@ -404,13 +401,10 @@ export default async function CatalogPagesPage({ return (
-
-

Catalog Pages

-

- {totalPages} pages ({enabledPages} enabled) · {totalItems}{" "} - items -

-
+

+ {totalPages} pages ({enabledPages} enabled) · {totalItems}{" "} + items +

{canEdit && } diff --git a/src/app/admin/commandocentrum/page.tsx b/src/app/admin/commandocentrum/page.tsx index 4eaa5b17..fb347b0d 100644 --- a/src/app/admin/commandocentrum/page.tsx +++ b/src/app/admin/commandocentrum/page.tsx @@ -1,5 +1,4 @@ import os from "node:os"; -import { Activity } from "lucide-react"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { @@ -117,20 +116,6 @@ export default async function CommandoCentrum() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
- {/* ── Live status ────────────────────────────────────────── */}
-
-

Emulator Errors

-

- {total} total errors — showing page {page} of {lastPage} -

-
+

+ {total} total errors — showing page {page} of {lastPage} +

diff --git a/src/app/admin/devops/page.tsx b/src/app/admin/devops/page.tsx index 6ca9c94d..05597ebf 100644 --- a/src/app/admin/devops/page.tsx +++ b/src/app/admin/devops/page.tsx @@ -59,13 +59,6 @@ export default async function DevOpsPage() { return (
-
-

Health Status

-

- System health, emulator status and error monitoring -

-
- {/* Status cards */}
diff --git a/src/app/admin/email-templates/page.tsx b/src/app/admin/email-templates/page.tsx index 2408058d..b9c4fca6 100644 --- a/src/app/admin/email-templates/page.tsx +++ b/src/app/admin/email-templates/page.tsx @@ -30,20 +30,6 @@ export default async function AdminEmailTemplates() { return (
-
-
- ✉️ -
-
-

- {t("title")} -

-

- {t.rich("subtitle", { code: (chunks) => {chunks} })} -

-
-
-

{t("newTemplate")} diff --git a/src/app/admin/emulator/page.tsx b/src/app/admin/emulator/page.tsx index 9987459f..c1bade04 100644 --- a/src/app/admin/emulator/page.tsx +++ b/src/app/admin/emulator/page.tsx @@ -49,13 +49,6 @@ export default async function AdminEmulator() { return (
-

{t("title")}

-

- {t.rich("subtitle", { - code: (chunks) => {chunks}, - })} -

-
-
-
-

Events

-

- Manage hotel events, calendar and prizes -

-
+
diff --git a/src/app/admin/events/types/page.tsx b/src/app/admin/events/types/page.tsx index 63cdc5f6..c6ded9c8 100644 --- a/src/app/admin/events/types/page.tsx +++ b/src/app/admin/events/types/page.tsx @@ -15,13 +15,6 @@ export default async function EventTypesPage() { return (
-
-

Event Types

-

- Manage event categories and types -

-
-
); diff --git a/src/app/admin/favicon/page.tsx b/src/app/admin/favicon/page.tsx index 8fe024d3..56fa99ce 100644 --- a/src/app/admin/favicon/page.tsx +++ b/src/app/admin/favicon/page.tsx @@ -1,5 +1,3 @@ -import { Image } from "lucide-react"; -import { getTranslations } from "next-intl/server"; import { prisma } from "@/lib/prisma"; import { FaviconForm } from "./favicon-form"; import { redirect } from "next/navigation"; @@ -13,8 +11,6 @@ export default async function AdminFaviconPage() { redirect("/admin"); } - const t = await getTranslations("pages.admin.favicon"); - let faviconUrl: string | null = null; try { const setting = await prisma.websiteSetting.findUnique({ @@ -27,20 +23,6 @@ export default async function AdminFaviconPage() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
); diff --git a/src/app/admin/help-questions/page.tsx b/src/app/admin/help-questions/page.tsx index f20a05a0..cba1743d 100644 --- a/src/app/admin/help-questions/page.tsx +++ b/src/app/admin/help-questions/page.tsx @@ -1,4 +1,3 @@ -import { HelpCircle } from "lucide-react"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; @@ -32,18 +31,7 @@ export default async function AdminHelpQuestions() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
+
+ {t("newEntry")} diff --git a/src/app/admin/housekeeping/page.tsx b/src/app/admin/housekeeping/page.tsx index 4d361756..2df89a9a 100644 --- a/src/app/admin/housekeeping/page.tsx +++ b/src/app/admin/housekeeping/page.tsx @@ -63,20 +63,6 @@ export default async function AdminHousekeeping({ return (
-
-
- 🔑 -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
{t("permissionsCount", { count: permissions.length })} diff --git a/src/app/admin/import/page.tsx b/src/app/admin/import/page.tsx index addc7d3c..35b071a5 100644 --- a/src/app/admin/import/page.tsx +++ b/src/app/admin/import/page.tsx @@ -66,11 +66,6 @@ export default async function ImportPage() { return (
-
-

{t("title")}

-

{t("subtitle")}

-
-
{SECTIONS.map(({ href, label, icon: Icon, description }) => ( -
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
- - +
+ + +
{staff.username} diff --git a/src/app/admin/logs/audit/page.tsx b/src/app/admin/logs/audit/page.tsx index 6117f8ab..f84e5355 100644 --- a/src/app/admin/logs/audit/page.tsx +++ b/src/app/admin/logs/audit/page.tsx @@ -37,11 +37,6 @@ export default async function AuditLogsPage({ return (
-
-

Audit Logs

-

Track admin actions and changes

-
-
); diff --git a/src/app/admin/logs/chat/page.tsx b/src/app/admin/logs/chat/page.tsx index 6a9f1488..5b3dad05 100644 --- a/src/app/admin/logs/chat/page.tsx +++ b/src/app/admin/logs/chat/page.tsx @@ -30,11 +30,6 @@ export default async function ChatLogsPage({ return (
-
-

Chat Logs

-

View in-game chat messages

-
- -
-

Command Logs

-

View in-game command usage

-
- -
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-

Trade Logs

-

View in-game trade history

-
- -
-
- -
-
-

- {t("title")} -

-

- {t.rich("subtitle", { code: (chunks) => {chunks} })} -

-
-
-
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
+
-
-

Quick Actions

-

- Fast moderation tools — kick, mute, alert, broadcast -

-
); diff --git a/src/app/admin/moderation/cfh/page.tsx b/src/app/admin/moderation/cfh/page.tsx index 94e4e6e3..a345be83 100644 --- a/src/app/admin/moderation/cfh/page.tsx +++ b/src/app/admin/moderation/cfh/page.tsx @@ -74,11 +74,6 @@ export default async function CfhListPage({ searchParams }: PageProps) { return (
-
-

CFH Tickets

-

In-game Call For Help reports

-
- {/* Filters */}
{[ diff --git a/src/app/admin/moderation/page.tsx b/src/app/admin/moderation/page.tsx index 6213a5bf..82b44629 100644 --- a/src/app/admin/moderation/page.tsx +++ b/src/app/admin/moderation/page.tsx @@ -81,11 +81,6 @@ export default async function ModerationDashboard() { return (
-
-

Moderation

-

In-game moderation dashboard

-
- {/* Stats */}
-
-

Mod Team

-

Staff performance and status

-
- {/* Summary */}
diff --git a/src/app/admin/navigation/page.tsx b/src/app/admin/navigation/page.tsx index caafa997..934a090f 100644 --- a/src/app/admin/navigation/page.tsx +++ b/src/app/admin/navigation/page.tsx @@ -1,4 +1,3 @@ -import { Navigation } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; import { prisma } from "@/lib/prisma"; @@ -116,20 +115,6 @@ export default async function AdminNavigation() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-

Online Users

-

- Currently online users ({result.total} connected) -

-
+

+ Currently online users ({result.total} connected) +

{/* Header */}
-
-

- - Permissions -

-

- {ranks.length} ranks · {totalUsers.toLocaleString()} users - total -

-
+

+ {ranks.length} ranks · {totalUsers.toLocaleString()} users + total +

diff --git a/src/app/admin/prefixes/page.tsx b/src/app/admin/prefixes/page.tsx index e4d2a3ef..2eb62ac5 100644 --- a/src/app/admin/prefixes/page.tsx +++ b/src/app/admin/prefixes/page.tsx @@ -17,12 +17,6 @@ export default async function PrefixesPage() { return (
-
-

Custom Prefixes

-

- Manage user prefixes, blacklist and settings -

-
); diff --git a/src/app/admin/radio/api-keys/page.tsx b/src/app/admin/radio/api-keys/page.tsx index 1975778f..d19eb786 100644 --- a/src/app/admin/radio/api-keys/page.tsx +++ b/src/app/admin/radio/api-keys/page.tsx @@ -1,5 +1,3 @@ -import { Key } from "lucide-react"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { createApiKey, @@ -71,30 +69,7 @@ export default async function AdminRadioApiKeysPage() { return (
- -
-
-
- -
-
-

- {t("apiKeysForm.title")} -

-

- {t("apiKeysForm.subtitle")} -

-
-
{dbError ? (
diff --git a/src/app/admin/radio/autodj/page.tsx b/src/app/admin/radio/autodj/page.tsx index 546cd037..30602e0c 100644 --- a/src/app/admin/radio/autodj/page.tsx +++ b/src/app/admin/radio/autodj/page.tsx @@ -1,6 +1,3 @@ -import { Disc3 } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { createTrack, @@ -75,29 +72,8 @@ export default async function AdminRadioAutoDjPage() { return (
-
-
-
- -
-
-

- {t("autoDjForm.title")} -

-

- {t("autoDjForm.subtitle")} -

-
-
{dbError ? (
diff --git a/src/app/admin/radio/banners/page.tsx b/src/app/admin/radio/banners/page.tsx index 97fb9dbf..49971933 100644 --- a/src/app/admin/radio/banners/page.tsx +++ b/src/app/admin/radio/banners/page.tsx @@ -1,6 +1,4 @@ -import { Image as LucideImage } from "lucide-react"; import NextImage from "next/image"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { createRadioBanner, @@ -57,28 +55,6 @@ export default async function AdminRadioBannersPage() { return (
- - -
-
- -
-
-

- {t("banners.heading")} -

-

- {t("banners.description")} -

-
-
- {dbError ? (

diff --git a/src/app/admin/radio/embed/page.tsx b/src/app/admin/radio/embed/page.tsx index a4b50a47..372c64ac 100644 --- a/src/app/admin/radio/embed/page.tsx +++ b/src/app/admin/radio/embed/page.tsx @@ -1,4 +1,3 @@ -import { Code } from "lucide-react"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; @@ -41,30 +40,7 @@ export default async function AdminRadioEmbedPage() { return (

- -
-
-
- -
-
-

- {t("embedPage.title")} -

-

- {t("embedPage.subtitle")} -

-
-
-
- - -
-
- -
-
-

- {t("historyPage.title")} -

-

- {t("historyPage.subtitle")} -

-
-
- {dbError ? (

diff --git a/src/app/admin/radio/moderation/page.tsx b/src/app/admin/radio/moderation/page.tsx index c0a70fe4..29f11479 100644 --- a/src/app/admin/radio/moderation/page.tsx +++ b/src/app/admin/radio/moderation/page.tsx @@ -1,5 +1,3 @@ -import { Shield } from "lucide-react"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { deleteShout } from "@/actions/admin-radio-moderation"; import { StatusCard } from "@/components/admin/dashboard"; @@ -41,28 +39,6 @@ export default async function AdminRadioModerationPage() { return (

- - -
-
- -
-
-

- {t("moderationPage.title")} -

-

- {t("moderationPage.subtitle")} -

-
-
-
-
-
- -
-
-

- {t("monitoring.title")} -

-

- {t("monitoring.subtitle", { timeout: FETCH_TIMEOUT_MS / 1000 })} -

-
-
-
- - -

{t("title")}

-

- {t("subtitle")} -

-
-
-
-
- -
-
-

- {t("pointsForm.title")} -

-

- {t("pointsForm.subtitle")} -

-
-
- {saved === "1" ? (

diff --git a/src/app/admin/radio/ranks/page.tsx b/src/app/admin/radio/ranks/page.tsx index 47e02a2d..f1d5be86 100644 --- a/src/app/admin/radio/ranks/page.tsx +++ b/src/app/admin/radio/ranks/page.tsx @@ -1,5 +1,3 @@ -import { Medal } from "lucide-react"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { createRadioRank, @@ -45,28 +43,6 @@ export default async function AdminRadioRanksPage() { return (

- - -
-
- -
-
-

- {t("ranksForm.title")} -

-

- {t("ranksForm.subtitle")} -

-
-
- {dbError ? (

diff --git a/src/app/admin/radio/settings/page.tsx b/src/app/admin/radio/settings/page.tsx index 3203de6b..79a55e14 100644 --- a/src/app/admin/radio/settings/page.tsx +++ b/src/app/admin/radio/settings/page.tsx @@ -1,5 +1,3 @@ -import { Settings } from "lucide-react"; -import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { saveRadioSetting, @@ -397,28 +395,6 @@ export default async function AdminRadioSettingsPage() { return (

- - -
-
- -
-
-

- {t("settingsForm.title")} -

-

- {t("settingsForm.subtitle")} -

-
-
- {dbError ? (

diff --git a/src/app/admin/rare-values/page.tsx b/src/app/admin/rare-values/page.tsx index 40011fe4..3b0518d0 100644 --- a/src/app/admin/rare-values/page.tsx +++ b/src/app/admin/rare-values/page.tsx @@ -1,4 +1,3 @@ -import { Gem } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { createCategory, @@ -54,20 +53,6 @@ export default async function AdminRareValues() { return (

-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-

Rooms

-

- {result.total.toLocaleString()} rooms total -

-
+

+ {result.total.toLocaleString()} rooms total +

-
-

{t("title")}

+
{t("newPackage")}
-

- {t("subtitle")} (website_shop_articles). {t("tableHint")} -

diff --git a/src/app/admin/sounds/page.tsx b/src/app/admin/sounds/page.tsx index 643853fe..1728316a 100644 --- a/src/app/admin/sounds/page.tsx +++ b/src/app/admin/sounds/page.tsx @@ -67,18 +67,13 @@ export default async function SoundsPage() { return (
-
-

Song Disks

-

- Upload and manage MP3 files for song disks played by in-game - jukeboxes. Files are served from {baseUrl}{" "} - (configurable in{" "} - - Settings - - ). -

-
+

+ Files are served from {baseUrl} (configurable in{" "} + + Settings + + ). +

-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
diff --git a/src/app/admin/tags/page.tsx b/src/app/admin/tags/page.tsx index be92cad9..b056af83 100644 --- a/src/app/admin/tags/page.tsx +++ b/src/app/admin/tags/page.tsx @@ -1,4 +1,3 @@ -import { Hash } from "lucide-react"; import { getTranslations } from "next-intl/server"; import { createTag, deleteTag, updateTag } from "@/actions/admin-tags"; import { StatusCard } from "@/components/admin/dashboard"; @@ -53,20 +52,6 @@ export default async function AdminTagsPage() { return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
- {dbError ? (

diff --git a/src/app/admin/theme/page.tsx b/src/app/admin/theme/page.tsx index b83a398a..3cf13f74 100644 --- a/src/app/admin/theme/page.tsx +++ b/src/app/admin/theme/page.tsx @@ -372,20 +372,6 @@ export default async function AdminTheme({ return (

-
-
- 🎨 -
-
-

- {t("title")} -

-

- {t.rich("subtitle", { code: (chunks) => {chunks} })} -

-
-
- {sp.saved ? (
{t("saved")} diff --git a/src/app/admin/tickets/page.tsx b/src/app/admin/tickets/page.tsx index 8d85a07c..bb6bb1d2 100644 --- a/src/app/admin/tickets/page.tsx +++ b/src/app/admin/tickets/page.tsx @@ -90,11 +90,6 @@ export default async function AdminTicketsPage({ searchParams }: PageProps) { return (
-
-

Support Tickets

-

Manage user support requests

-
- {/* Stats */}
diff --git a/src/app/admin/tickets/templates/page.tsx b/src/app/admin/tickets/templates/page.tsx index b3ff2f08..15cf1308 100644 --- a/src/app/admin/tickets/templates/page.tsx +++ b/src/app/admin/tickets/templates/page.tsx @@ -15,12 +15,6 @@ export default async function TicketTemplatesPage() { return (
-
-

Reply Templates

-

- Pre-defined responses for common ticket situations -

-
); diff --git a/src/app/admin/transactions/page.tsx b/src/app/admin/transactions/page.tsx index 9efb84d9..5c1e5fc9 100644 --- a/src/app/admin/transactions/page.tsx +++ b/src/app/admin/transactions/page.tsx @@ -1,4 +1,3 @@ -import { ArrowLeftRight } from "lucide-react"; import Link from "next/link"; import { getTranslations } from "next-intl/server"; import { StatusCard } from "@/components/admin/dashboard"; @@ -97,20 +96,6 @@ export default async function AdminTransactions({ return (
-
-
- -
-
-

- {t("title")} -

-

- {t("subtitle")} -

-
-
-
-
-

- - Client (Nitro) -

+