--- description: 'Scaffold a new admin page for The Collective Hub. Generates +page.server.ts (auth guard, load data, form actions) and +page.svelte (Svelte 5, form, Tailwind).' agent: 'agent' --- Scaffold a new admin page at `admin/{section}/` for The Collective Hub. Follow all conventions in: - [admin-panel.instructions.md](.github/instructions/admin-panel.instructions.md) - [auth-and-roles.instructions.md](.github/instructions/auth-and-roles.instructions.md) - [svelte5.instructions.md](.github/instructions/svelte5.instructions.md) - [server-ts.instructions.md](.github/instructions/server-ts.instructions.md) ## What to Create ### 1. `+page.server.ts` ```ts import { fail, redirect } from '@sveltejs/kit'; import { db } from '$lib/server/db'; import { siteSettings } from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; import type { Actions, PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) redirect(302, '/login'); // Load current data return { settings: locals.siteSettings, // Add more data as needed }; }; export const actions: Actions = { default: async ({ locals, request }) => { if (!locals.user) return fail(401, { error: 'Unauthorized' }); const form = await request.formData(); // const value = form.get('fieldName') as string; // Validate // if (!value) return fail(400, { error: 'Field is required' }); // Save to DB (scoped by locals.site.id) // await db.update(siteSettings)... return { success: true, message: 'Saved' }; }, }; ``` ### 2. `+page.svelte` ```svelte

Page Title

{#if form?.error}

{form.error}

{/if} {#if form?.success}

{form.message}

{/if}
```