// ACUL React — login-id screen boilerplate // SDK: @auth0/auth0-acul-react // Customize: apply design tokens, adjust layout, add/remove social providers import React, { useState } from 'react' import { useScreen, useTransaction, useErrors, useLoginIdentifiers, login, federatedLogin, passkeyLogin, } from '@auth0/auth0-acul-react/login-id' // Import your theme: CSS Modules, Tailwind classes, or styled-components interface LoginIdScreenProps {} export const LoginIdScreen: React.FC = () => { // SDK hooks const screen = useScreen() const { alternateConnections } = useTransaction() const { hasErrors, errors } = useErrors() const identifiers = useLoginIdentifiers() // Local state const [username, setUsername] = useState('') const [captcha, setCaptcha] = useState('') const [loading, setLoading] = useState(false) // Handlers const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) await login({ username, captcha: captcha || undefined }) setLoading(false) } const handleSocial = async (connectionName: string) => { await federatedLogin({ connection: connectionName }) } // Dynamic label from configured identifiers const identifierLabel = identifiers?.length ? `Enter your ${identifiers.join(' or ')}` : 'Email or username' return (
{/* Logo slot */}
{/* Heading */}

{screen.texts?.title ?? 'Log in'}

{screen.texts?.description && (

{screen.texts.description}

)} {/* Error banner */} {hasErrors && (
{errors.map((err, i) => (

{err.message}

))}
)} {/* Login form */}
setUsername(e.target.value)} required />
{/* Captcha (only if configured) */} {screen.isCaptchaAvailable && (
setCaptcha(e.target.value)} />
)}
{/* Passkey (only if enabled) */} {screen.isPasskeyEnabled && ( )} {/* Social login */} {alternateConnections && alternateConnections.length > 0 && ( <>
{screen.texts?.separatorText ?? 'Or'}
{alternateConnections.map(conn => ( ))}
)} {/* Footer links */}
{screen.texts?.signupActionLinkText ?? "Don't have an account? Sign up"}
) }