Kontaktskjema
Et kontaktskjema som viser hvordan flere skjemaelementer fungerer sammen — tekstfelt, nedtrekksliste, radioknapper og tekstområde.
Komplett eksempel
<div className="flex items-center justify-center bg-page p-4"> <Card className="w-full max-w-lg"> <CardHeader> <CardTitle>Kontakt oss</CardTitle> <CardDescription> Fyll ut skjemaet så tar vi kontakt med deg innen 2 virkedager. </CardDescription> </CardHeader> <CardContent className="flex flex-col gap-4"> <div className="grid grid-cols-2 gap-4"> <FormField> <Label required>Fornavn</Label> <Input required placeholder="Ola" /> </FormField> <FormField> <Label required>Etternavn</Label> <Input required placeholder="Nordmann" /> </FormField> </div> <FormField> <Label required>E-post</Label> <Input type="email" required placeholder="ola@eksempel.no" /> </FormField> <FormField> <Label>Emne</Label> <Select> <SelectTrigger> <SelectValue placeholder="Velg et emne" /> </SelectTrigger> <SelectContent> <SelectItem value="general">Generell henvendelse</SelectItem> <SelectItem value="support">Teknisk støtte</SelectItem> <SelectItem value="sales">Salg og samarbeid</SelectItem> <SelectItem value="feedback">Tilbakemelding</SelectItem> </SelectContent> </Select> </FormField> <FormField> <Label>Hvordan vil du bli kontaktet?</Label> <RadioGroup defaultValue="email" className="flex gap-4 mt-1"> <div className="flex items-center gap-2"> <RadioGroupItem value="email" id="contact-email-radio" /> <Label htmlFor="contact-email-radio" className="font-normal">E-post</Label> </div> <div className="flex items-center gap-2"> <RadioGroupItem value="phone" id="contact-phone" /> <Label htmlFor="contact-phone" className="font-normal">Telefon</Label> </div> </RadioGroup> </FormField> <FormField> <Label>Melding</Label> <Textarea placeholder="Skriv meldingen din her..." rows={4} /> <FormDescription>Maks 500 tegn.</FormDescription> </FormField> </CardContent> <CardFooter className="flex justify-between"> <Button variant="secondary">Avbryt</Button> <Button>Send melding</Button> </CardFooter> </Card> </div>
Komponenter som brukes
| Komponent | Rolle |
|---|---|
Card | Ramme rundt skjemaet |
FormField | Grupperer label, input og hjelpetekst |
FormDescription | Hjelpetekst under et felt |
Label | Tilgjengelig ledetekst for hvert felt |
Input | Tekstfelt for navn og e-post |
Select | Nedtrekksliste for emnevalg |
RadioGroup | Radioknapper for kontaktpreferanse |
Textarea | Tekstområde for meldingen |
Button | Primær- og sekundærhandling |
Med validering
Slik ser skjemaet ut med valideringsfeil:
<div className="flex items-center justify-center bg-page p-4"> <Card className="w-full max-w-lg"> <CardHeader> <CardTitle>Kontakt oss</CardTitle> <CardDescription> Fyll ut skjemaet så tar vi kontakt med deg innen 2 virkedager. </CardDescription> </CardHeader> <CardContent className="flex flex-col gap-4"> <div className="grid grid-cols-2 gap-4"> <FormField> <Label required>Fornavn</Label> <Input required /> <FormMessage>Fornavn er påkrevd.</FormMessage> </FormField> <FormField> <Label required>Etternavn</Label> <Input required /> <FormMessage>Etternavn er påkrevd.</FormMessage> </FormField> </div> <FormField> <Label required>E-post</Label> <Input type="email" required value="ola@" /> <FormMessage>Du må skrive inn en gyldig e-postadresse.</FormMessage> </FormField> <FormField> <Label>Melding</Label> <Textarea /> <FormMessage>Du må skrive en melding.</FormMessage> </FormField> </CardContent> <CardFooter className="flex justify-between"> <Button variant="secondary">Avbryt</Button> <Button>Send melding</Button> </CardFooter> </Card> </div>
Med suksessmelding
Bruk Alert for å bekrefte at skjemaet ble sendt:
<div className="flex items-center justify-center bg-page p-4"> <Card className="w-full max-w-lg"> <CardContent className="pt-6"> <Alert variant="success"> <AlertTitle>Meldingen er sendt!</AlertTitle> <AlertDescription> Takk for at du tok kontakt. Vi svarer deg innen 2 virkedager. </AlertDescription> </Alert> </CardContent> <CardFooter> <Button variant="secondary" className="w-full">Send en ny melding</Button> </CardFooter> </Card> </div>