feat: reskin admin pages to zine design system

Migrate the entire admin section from the dark guild-* Tailwind theme
to the zine design system (dashed borders, CSS custom properties,
Brygada 1918 + Commit Mono, cream/dark mode palette).

- Replace admin top-nav layout with sidebar matching default layout
- Reskin dashboard, members, events, series management pages
- Reskin events/create and series/create form pages
- Add dev-only test login endpoint (GET /api/dev/test-login)
- Redirect duplicate admin/dashboard.vue to /admin
- Update CLAUDE.md design system docs
This commit is contained in:
Jennie Robinson Faber 2026-04-03 10:56:01 +01:00
parent f16f9ada64
commit fcd6f4cdf4
23 changed files with 3845 additions and 3827 deletions

View file

@ -56,7 +56,7 @@ export default defineEventHandler(async (event) => {
.replace(/\n/g, '<br>')
.replace(/\{loginLink\}/g, loginButton)
const { error: sendError } = await resend.emails.send({
const { error: emailError } = await resend.emails.send({
from: 'Ghost Guild <welcome@babyghosts.org>',
to: [member.email],
subject: 'You\'re invited to Ghost Guild',
@ -64,8 +64,8 @@ export default defineEventHandler(async (event) => {
html: emailHtml
})
if (sendError) {
results.push({ memberId: member._id, email: member.email, success: false, error: sendError.message })
if (emailError) {
results.push({ memberId: member._id, email: member.email, success: false, error: emailError.message })
continue
}

View file

@ -0,0 +1,42 @@
import jwt from 'jsonwebtoken'
import Member from '../../models/member.js'
import { connectDB } from '../../utils/mongoose.js'
export default defineEventHandler(async (event) => {
// Only allow in development
if (process.env.NODE_ENV === 'production') {
throw createError({ statusCode: 404, statusMessage: 'Not found' })
}
await connectDB()
// Find or create a test admin user
let member = await Member.findOne({ email: 'test-admin@ghostguild.dev' })
if (!member) {
member = await Member.create({
email: 'test-admin@ghostguild.dev',
name: 'Test Admin',
circle: 'founder',
contributionTier: '0',
role: 'admin',
status: 'active',
})
}
const config = useRuntimeConfig(event)
const token = jwt.sign(
{ memberId: member._id, email: member.email },
config.jwtSecret,
{ expiresIn: '7d' }
)
setCookie(event, 'auth-token', token, {
httpOnly: true,
secure: false,
sameSite: 'lax',
maxAge: 60 * 60 * 24 * 7,
})
await sendRedirect(event, '/admin', 302)
})