Signup Form
- Source
- Aceternity UI ↗
- Author
- Aceternity UI
- Licence
- Aceternity UI licence (free component)
Loading…
Form fields light up with a radial glow that follows the pointer.
Code
"use client";
import React from "react";
import { Label } from "@/lab/aceternity/ui/signup-form-label";
import { Input } from "@/lab/aceternity/ui/signup-form-input";
import { cn } from "@/lib/utils";
import {
IconBrandGithub,
IconBrandGoogle,
IconBrandOnlyfans,
} from "@tabler/icons-react";
export default function SignupFormDemo() {
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
};
return (
<div className="@container relative h-full w-full overflow-y-auto bg-neutral-100 px-3 py-6 dark:bg-neutral-950">
<div className="shadow-ace-b-input mx-auto w-full max-w-md rounded-2xl bg-white p-4 @md:p-8 dark:bg-black">
<h2 className="text-xl font-bold text-neutral-800 dark:text-neutral-200">
Welcome to Aceternity
</h2>
<p className="mt-2 max-w-sm text-sm text-neutral-600 dark:text-neutral-300">
Login to aceternity if you can because we don't have a login flow
yet
</p>
<form className="my-8" onSubmit={handleSubmit} autoComplete="off">
<div className="mb-4 flex flex-col space-y-2 @sm:flex-row @sm:space-y-0 @sm:space-x-2">
<LabelInputContainer>
<Label htmlFor="firstname">First name</Label>
<Input id="firstname" placeholder="Tyler" type="text" />
</LabelInputContainer>
<LabelInputContainer>
<Label htmlFor="lastname">Last name</Label>
<Input id="lastname" placeholder="Durden" type="text" />
</LabelInputContainer>
</div>
<LabelInputContainer className="mb-4">
<Label htmlFor="email">Email Address</Label>
<Input id="email" placeholder="projectmayhem@fc.com" type="email" />
</LabelInputContainer>
<LabelInputContainer className="mb-4">
<Label htmlFor="password">Password</Label>
<Input id="password" placeholder="••••••••" type="password" />
</LabelInputContainer>
<LabelInputContainer className="mb-8">
<Label htmlFor="twitterpassword">Your twitter password</Label>
<Input
id="twitterpassword"
placeholder="••••••••"
type="twitterpassword"
/>
</LabelInputContainer>
<button
className="group/btn relative block h-10 w-full rounded-md bg-gradient-to-br from-black to-neutral-600 font-medium text-white shadow-[0px_1px_0px_0px_#ffffff40_inset,0px_-1px_0px_0px_#ffffff40_inset] dark:bg-zinc-800 dark:from-zinc-900 dark:to-zinc-900 dark:shadow-[0px_1px_0px_0px_#27272a_inset,0px_-1px_0px_0px_#27272a_inset]"
type="submit"
>
Sign up →
<BottomGradient />
</button>
<div className="my-8 h-[1px] w-full bg-gradient-to-r from-transparent via-neutral-300 to-transparent dark:via-neutral-700" />
<div className="flex flex-col space-y-4">
<button
className="group/btn shadow-ace-b-input relative flex h-10 w-full items-center justify-start space-x-2 rounded-md bg-gray-50 px-4 font-medium text-black dark:bg-zinc-900 dark:shadow-[0px_0px_1px_1px_#262626]"
type="submit"
>
<IconBrandGithub className="h-4 w-4 text-neutral-800 dark:text-neutral-300" />
<span className="text-sm text-neutral-700 dark:text-neutral-300">
GitHub
</span>
<BottomGradient />
</button>
<button
className="group/btn shadow-ace-b-input relative flex h-10 w-full items-center justify-start space-x-2 rounded-md bg-gray-50 px-4 font-medium text-black dark:bg-zinc-900 dark:shadow-[0px_0px_1px_1px_#262626]"
type="submit"
>
<IconBrandGoogle className="h-4 w-4 text-neutral-800 dark:text-neutral-300" />
<span className="text-sm text-neutral-700 dark:text-neutral-300">
Google
</span>
<BottomGradient />
</button>
<button
className="group/btn shadow-ace-b-input relative flex h-10 w-full items-center justify-start space-x-2 rounded-md bg-gray-50 px-4 font-medium text-black dark:bg-zinc-900 dark:shadow-[0px_0px_1px_1px_#262626]"
type="submit"
>
<IconBrandOnlyfans className="h-4 w-4 text-neutral-800 dark:text-neutral-300" />
<span className="text-sm text-neutral-700 dark:text-neutral-300">
OnlyFans
</span>
<BottomGradient />
</button>
</div>
</form>
</div>
</div>
);
}
const BottomGradient = () => {
return (
<>
<span className="absolute inset-x-0 -bottom-px block h-px w-full bg-gradient-to-r from-transparent via-cyan-500 to-transparent opacity-0 transition duration-500 group-hover/btn:opacity-100" />
<span className="absolute inset-x-10 -bottom-px mx-auto block h-px w-1/2 bg-gradient-to-r from-transparent via-indigo-500 to-transparent opacity-0 blur-sm transition duration-500 group-hover/btn:opacity-100" />
</>
);
};
const LabelInputContainer = ({
children,
className,
}: {
children: React.ReactNode;
className?: string;
}) => {
return (
<div className={cn("flex w-full flex-col space-y-2", className)}>
{children}
</div>
);
};
Prompt
Build "Signup Form", a input animation. What it does: Form fields light up with a radial glow that follows the pointer. Write it as a single self-contained React component in TypeScript that fills its parent (w-full h-full), styled with Tailwind CSS, using @tabler/icons-react, motion. Technique: the Motion library, pointer tracking. It sits on a light background, in a tall frame. Respect prefers-reduced-motion with a still state, pause work when the element is off screen, and keep it accessible. Original: https://ui.aceternity.com/components/signup-form (Aceternity UI, Aceternity UI licence (free component)).