TypeScript 61.9%
HTML 37.2%
SQL 0.7%
1import { adminLogin } from '@/lib/admin/actions';23export default async function AdminLoginPage({ searchParams }: { searchParams: Promise<{ error?: string; next?: string }> }) {4 const sp = await searchParams;5 return (6 <div className="mx-auto mt-16 max-w-sm">7 <div className="card p-6">8 <p className="text-[10px] font-semibold uppercase tracking-wider text-subtle">Admin</p>9 <h1 className="mt-1 text-lg font-semibold">Connector control center</h1>10 <p className="mt-1 text-xs text-muted">Enter the server admin token. The token is exchanged for a signed, httpOnly cookie valid 12 hours.</p>11 <form action={adminLogin} className="mt-4 space-y-3">12 <input type="hidden" name="next" value={sp.next ?? '/admin'} />13 <input name="token" type="password" autoComplete="current-password" required placeholder="ADMIN_TOKEN" className="w-full rounded-md border border-border bg-sunken px-3 py-2 text-sm focus:border-border-strong focus:outline-none" />14 {sp.error ? <p className="rounded-md bg-loss-bg px-3 py-2 text-xs text-loss">{sp.error}</p> : null}15 <button type="submit" className="w-full rounded-md bg-accent px-3 py-2 text-sm font-medium text-accent-fg">Sign in</button>16 </form>17 </div>18 </div>19 );20}21