Sign In
Installation
Run the following command
npx vibes@latest add sign-in
Usage
import { SignIn } from '@/vibes/soul/sections/sign-in';import { schema } from '@/vibes/soul/sections/sign-in/schema';import { SubmissionResult } from '@conform-to/react';import { parseWithZod } from '@conform-to/zod';function Usage() { return <SignIn action={signInAction} forgotPasswordHref="#" />;}async function signInAction(lastResult: SubmissionResult | null, formData: FormData) { 'use server'; const submission = parseWithZod(formData, { schema }); if (submission.status !== 'success') { return submission.reply({ formErrors: ['Boom!'] }); } // Simulate a network request await new Promise((resolve) => setTimeout(resolve, 1000)); // const user = await logIn(submission.value) return submission.reply({ resetForm: true });}
API Reference
Prop | Type | Default |
---|---|---|
title | string | 'Sign In' |
signUpTitle | string | 'New Customer?' |
signUpDescription | string | 'Create an account with us and be able to:' |
signUpBenefits | string[] | [ 'Check out faster', 'Save multiple shipping addresses', 'Access your order history', 'Track new orders', 'Save items to your Wish List'] |
action* | SignInAction | |
submitLabel | string | |
emailLabel | string | |
passwordLabel | string | |
forgotPasswordHref* | string | '/forgot-password' |
forgotPasswordLabel | string | 'Forgot your password?' |
signUpHref | string | '/sign-up' |
emailPlaceholder | string | 'Enter your email' |
passwordPlaceholder | string | 'Enter your password' |
SignInAction
type Action<State, Payload> = (state: Awaited<State>, payload: Payload) => State | Promise<State>;export type SignInAction = Action<SubmissionResult | null, FormData>;
This component uses Confom to handle form submissions. Refer to the Conform docs for more details.
Here's an example of an action function that does validation and simulates making a network request:
async function signInAction(lastResult: SubmissionResult | null, formData: FormData) { 'use server'; const submission = parseWithZod(formData, { schema }); if (submission.status !== 'success') { return submission.reply({ formErrors: ['Boom!'] }); } // Simulate a network request await new Promise((resolve) => setTimeout(resolve, 1000)); // const user = await logIn(submission.value) return submission.reply({ resetForm: true });}
CSS Variables
This component supports various CSS variables for theming. Here's a comprehensive list.
:root { --sign-in-font-family: var(--font-family-body); --sign-in-title-font-family: var(--font-family-heading); --sign-in-title: var(--foreground); --sign-in-description: var(--contrast-500); --sign-in-border: var(--contrast-100);}