import { Button } from '@luke-ui/react/button'; import { Cluster } from '@luke-ui/react/cluster'; import { Stack } from '@luke-ui/react/stack'; import { Text } from '@luke-ui/react/text'; import { TextField } from '@luke-ui/react/text-field'; import { revalidateLogic, useForm } from '@tanstack/react-form'; import { useRef } from 'react'; import * as z from 'zod'; const schema = z.object({ email: z.email('Enter an email address in the form you@example.com.'), name: z.string().min(1, 'Enter your name.'), }); const FOCUSABLE_SELECTOR = 'input:not([type="hidden"]), select, textarea, [tabindex]:not([tabindex="-1"])'; function focusFirstInvalidField(form: HTMLFormElement | null) { const invalid = form?.querySelector('[aria-invalid="true"]'); if (!invalid) return; const control = invalid.matches(FOCUSABLE_SELECTOR) ? invalid : invalid.querySelector(FOCUSABLE_SELECTOR); if (control instanceof HTMLElement) control.focus(); } export default () => { const formRef = useRef(null); const form = useForm({ defaultValues: { email: '', name: '' }, onSubmit: () => undefined, onSubmitInvalid: () => focusFirstInvalidField(formRef.current), validationLogic: revalidateLogic({ mode: 'submit', modeAfterSubmission: 'change' }), validators: { onDynamic: schema, onSubmit: schema }, }); return (
{ event.preventDefault(); void form.handleSubmit(); }} ref={formRef} > {(field) => ( )} {(field) => ( )}
(state.isSubmitSuccessful ? state.values.name : '')}> {(submittedName) => (submittedName ? `Submitted: ${submittedName}` : '\u00a0')}
); };