From fb68f341dd84858a867402dc9e13b2bc55469228 Mon Sep 17 00:00:00 2001 From: RevIQ Date: Sat, 10 Jan 2026 17:45:17 +0800 Subject: [PATCH] Reorganize layouts with dedicated admin sidebar (dark theme) - Create admin layout with dark sidebar (zinc-900 background, light text) - Move dashboard components to layout/dashboard/ subfolder - Move admin components to layout/admin/ subfolder - Admin sidebar has: Dashboard, Organizations, Users nav items - Admin header shows "Admin" badge and "Exit Admin" link - Update all route imports to use new barrel exports - Add macOS sed syntax reference to CLAUDE.md Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 8 + .../layout/admin/admin-header.svelte | 39 +++ .../layout/admin/admin-layout.svelte | 32 +++ .../layout/admin/admin-mobile-nav.svelte | 189 +++++++++++++++ .../layout/admin/admin-sidebar.svelte | 228 ++++++++++++++++++ .../src/lib/components/layout/admin/index.ts | 4 + .../layout/{ => dashboard}/app-header.svelte | 0 .../layout/{ => dashboard}/app-sidebar.svelte | 0 .../{ => dashboard}/dashboard-layout.svelte | 0 .../email-verification-banner.svelte | 0 .../lib/components/layout/dashboard/index.ts | 7 + .../layout/{ => dashboard}/mobile-nav.svelte | 0 .../{ => dashboard}/org-switcher.svelte | 0 .../layout/{ => dashboard}/user-menu.svelte | 0 .../src/lib/components/layout/index.ts | 23 +- .../src/routes/account/+layout.svelte | 2 +- .../src/routes/admin/+page.svelte | 12 +- .../src/routes/admin/orgs/+page.svelte | 6 +- .../src/routes/admin/orgs/[slug]/+page.svelte | 6 +- .../src/routes/admin/orgs/new/+page.svelte | 6 +- .../src/routes/admin/users/+page.svelte | 6 +- .../routes/admin/users/[email]/+page.svelte | 6 +- .../src/routes/dashboard/+page.svelte | 2 +- .../src/routes/dashboard/[slug]/+page.svelte | 2 +- .../dashboard/[slug]/members/+page.svelte | 2 +- .../dashboard/[slug]/performance/+page.svelte | 2 +- .../dashboard/[slug]/reports/+page.svelte | 2 +- .../dashboard/[slug]/settings/+page.svelte | 2 +- 28 files changed, 550 insertions(+), 36 deletions(-) create mode 100644 apps/publisher-dashboard/src/lib/components/layout/admin/admin-header.svelte create mode 100644 apps/publisher-dashboard/src/lib/components/layout/admin/admin-layout.svelte create mode 100644 apps/publisher-dashboard/src/lib/components/layout/admin/admin-mobile-nav.svelte create mode 100644 apps/publisher-dashboard/src/lib/components/layout/admin/admin-sidebar.svelte create mode 100644 apps/publisher-dashboard/src/lib/components/layout/admin/index.ts rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/app-header.svelte (100%) rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/app-sidebar.svelte (100%) rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/dashboard-layout.svelte (100%) rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/email-verification-banner.svelte (100%) create mode 100644 apps/publisher-dashboard/src/lib/components/layout/dashboard/index.ts rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/mobile-nav.svelte (100%) rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/org-switcher.svelte (100%) rename apps/publisher-dashboard/src/lib/components/layout/{ => dashboard}/user-menu.svelte (100%) diff --git a/CLAUDE.md b/CLAUDE.md index 4ed42e6..cea3024 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,3 +6,11 @@ Before starting the dev server, check if it's already running: - Use `lsof -i :6827` or check for existing background tasks - The dev server runs on port 6827 (may fall back to 6828 if port is in use) - Start with `bun run --cwd apps/publisher-dashboard dev` or `devenv up` + +## macOS sed Syntax + +macOS uses BSD sed which differs from GNU sed: +- In-place edit requires empty string for backup: `sed -i '' 's/old/new/g' file` +- GNU sed (Linux): `sed -i 's/old/new/g' file` +- Use `|` as delimiter when patterns contain `/`: `sed -i '' 's|old/path|new/path|g' file` +- For multiple files: `for f in *.txt; do sed -i '' 's/old/new/g' "$f"; done` diff --git a/apps/publisher-dashboard/src/lib/components/layout/admin/admin-header.svelte b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-header.svelte new file mode 100644 index 0000000..4d6f5dc --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-header.svelte @@ -0,0 +1,39 @@ + + +
+
+ + + +

{title}

+ +
+ + +
diff --git a/apps/publisher-dashboard/src/lib/components/layout/admin/admin-layout.svelte b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-layout.svelte new file mode 100644 index 0000000..0f37356 --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-layout.svelte @@ -0,0 +1,32 @@ + + +
+ + + +
+ + +
+
+ {@render children()} +
+
+
+
diff --git a/apps/publisher-dashboard/src/lib/components/layout/admin/admin-mobile-nav.svelte b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-mobile-nav.svelte new file mode 100644 index 0000000..a66238f --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-mobile-nav.svelte @@ -0,0 +1,189 @@ + + + + + {#snippet child({ props })} + + {/snippet} + + + + +
+
+ + + +
+ Admin Panel +
+
+ + +
+
diff --git a/apps/publisher-dashboard/src/lib/components/layout/admin/admin-sidebar.svelte b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-sidebar.svelte new file mode 100644 index 0000000..3161c52 --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/admin/admin-sidebar.svelte @@ -0,0 +1,228 @@ + + + diff --git a/apps/publisher-dashboard/src/lib/components/layout/admin/index.ts b/apps/publisher-dashboard/src/lib/components/layout/admin/index.ts new file mode 100644 index 0000000..c0d9636 --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/admin/index.ts @@ -0,0 +1,4 @@ +export { default as AdminHeader } from "./admin-header.svelte"; +export { default as AdminLayout } from "./admin-layout.svelte"; +export { default as AdminMobileNav } from "./admin-mobile-nav.svelte"; +export { default as AdminSidebar } from "./admin-sidebar.svelte"; diff --git a/apps/publisher-dashboard/src/lib/components/layout/app-header.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/app-header.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/app-header.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/app-header.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/app-sidebar.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/app-sidebar.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/app-sidebar.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/app-sidebar.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/dashboard-layout.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/dashboard-layout.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/dashboard-layout.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/dashboard-layout.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/email-verification-banner.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/email-verification-banner.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/email-verification-banner.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/email-verification-banner.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/dashboard/index.ts b/apps/publisher-dashboard/src/lib/components/layout/dashboard/index.ts new file mode 100644 index 0000000..2a18177 --- /dev/null +++ b/apps/publisher-dashboard/src/lib/components/layout/dashboard/index.ts @@ -0,0 +1,7 @@ +export { default as AppHeader } from "./app-header.svelte"; +export { default as AppSidebar } from "./app-sidebar.svelte"; +export { default as DashboardLayout } from "./dashboard-layout.svelte"; +export { default as EmailVerificationBanner } from "./email-verification-banner.svelte"; +export { default as MobileNav } from "./mobile-nav.svelte"; +export { default as OrgSwitcher } from "./org-switcher.svelte"; +export { default as UserMenu } from "./user-menu.svelte"; diff --git a/apps/publisher-dashboard/src/lib/components/layout/mobile-nav.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/mobile-nav.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/mobile-nav.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/mobile-nav.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/org-switcher.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/org-switcher.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/org-switcher.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/org-switcher.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/user-menu.svelte b/apps/publisher-dashboard/src/lib/components/layout/dashboard/user-menu.svelte similarity index 100% rename from apps/publisher-dashboard/src/lib/components/layout/user-menu.svelte rename to apps/publisher-dashboard/src/lib/components/layout/dashboard/user-menu.svelte diff --git a/apps/publisher-dashboard/src/lib/components/layout/index.ts b/apps/publisher-dashboard/src/lib/components/layout/index.ts index 44d5210..197efe5 100644 --- a/apps/publisher-dashboard/src/lib/components/layout/index.ts +++ b/apps/publisher-dashboard/src/lib/components/layout/index.ts @@ -1,5 +1,18 @@ -export { default as AppHeader } from "./app-header.svelte"; -export { default as AppSidebar } from "./app-sidebar.svelte"; -export { default as DashboardLayout } from "./dashboard-layout.svelte"; -export { default as EmailVerificationBanner } from "./email-verification-banner.svelte"; -export { default as MobileNav } from "./mobile-nav.svelte"; +// Dashboard layout components +export { + AppHeader, + AppSidebar, + DashboardLayout, + EmailVerificationBanner, + MobileNav, + OrgSwitcher, + UserMenu, +} from "./dashboard/index.js"; + +// Admin layout components +export { + AdminHeader, + AdminLayout, + AdminMobileNav, + AdminSidebar, +} from "./admin/index.js"; diff --git a/apps/publisher-dashboard/src/routes/account/+layout.svelte b/apps/publisher-dashboard/src/routes/account/+layout.svelte index 4720447..6e50421 100644 --- a/apps/publisher-dashboard/src/routes/account/+layout.svelte +++ b/apps/publisher-dashboard/src/routes/account/+layout.svelte @@ -1,7 +1,7 @@ diff --git a/apps/publisher-dashboard/src/routes/dashboard/[slug]/settings/+page.svelte b/apps/publisher-dashboard/src/routes/dashboard/[slug]/settings/+page.svelte index a87f035..0a58f1a 100644 --- a/apps/publisher-dashboard/src/routes/dashboard/[slug]/settings/+page.svelte +++ b/apps/publisher-dashboard/src/routes/dashboard/[slug]/settings/+page.svelte @@ -12,7 +12,7 @@ import { getContext } from "svelte"; import { toast } from "svelte-sonner"; import { goto } from "$app/navigation"; import { api } from "$lib/api/client"; -import DashboardLayout from "$lib/components/layout/dashboard-layout.svelte"; +import { DashboardLayout } from "$lib/components/layout"; import { ConfirmDialog } from "$lib/components/org"; import { Alert, AlertDescription } from "$lib/components/ui/alert"; import { Button } from "$lib/components/ui/button";