"use client";
import { motion, type Variants } from "framer-motion";
import Image from "next/image";
import type { ReactNode } from "react";
import { cn } from "@/lib/utils";
const container: Variants = {
hidden: {},
show: { transition: { staggerChildren: 0.09, delayChildren: 0.18 } },
};
const item: Variants = {
hidden: { opacity: 0, y: 16 },
show: {
opacity: 1,
y: 0,
transition: { type: "spring", stiffness: 150, damping: 18 },
},
};
// Slowly drifting colored blobs behind everything.
function Aurora() {
return (
);
}
export function AuthShell({
title,
subtitle,
children,
footer,
}: {
title: string;
subtitle?: ReactNode;
children: ReactNode;
footer?: ReactNode;
}) {
return (
{/* rotating gradient halo */}
{/* the card */}
{/* top edge highlight */}
{/* one-time shimmer sweep on mount */}
{title}
{subtitle && (
{subtitle}
)}
{children}
{footer && (
{footer}
)}
);
}
export function Field({
label,
htmlFor,
hint,
children,
}: {
label: string;
htmlFor: string;
hint?: ReactNode;
children: ReactNode;
}) {
return (
{children}
{hint &&
{hint}
}
);
}
export function FormAlert({
tone = "error",
children,
}: {
tone?: "error" | "success";
children: ReactNode;
}) {
return (
{children}
);
}