HextaUI

Field

Labels, Beschreibungen und Fehler, mit ihrem Steuerelement verbunden, mit Validierungszuständen und Layouts für Formulare.

Shown on your profile.

"use client"

import { Form } from "@base-ui/react/form"
import { IconAt } from "@tabler/icons-react"

import { Button } from "@/components/ui/button"
import {
  Field,
  FieldCounter,
  FieldDescription,
  FieldError,
  FieldGroup,
  FieldLabel,
  FieldStatus,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"
import {
  InputGroup,
  InputGroupAddon,
  InputGroupInput,
  InputGroupTextarea,
} from "@/components/ui/input-group"

export function FieldDemo() {
  return (
    <Form
      className="w-full max-w-sm"
      onSubmit={(event) => event.preventDefault()}
    >
      <FieldGroup indicator="optional">
        <Field validationMode="onBlur">
          <FieldLabel>Display name</FieldLabel>
          <Input name="name" autoComplete="name" required />
          <FieldError match="valueMissing">
            Add the name people will see.
          </FieldError>
        </Field>
        <Field validationMode="onChange">
          <FieldLabel>Handle</FieldLabel>
          <InputGroup>
            <InputGroupInput
              name="handle"
              autoComplete="username"
              pattern="[a-z0-9_]{3,15}"
              maxLength={15}
              required
            />
            <InputGroupAddon>
              <IconAt />
            </InputGroupAddon>
            <InputGroupAddon align="inline-end">
              <FieldStatus />
            </InputGroupAddon>
          </InputGroup>
          <FieldError match="valueMissing">Pick a handle.</FieldError>
          <FieldError match="patternMismatch">
            Use 3–15 lowercase letters, numbers or underscores.
          </FieldError>
        </Field>
        <Field>
          <FieldLabel>Bio</FieldLabel>
          <InputGroup>
            <InputGroupTextarea name="bio" maxLength={160} />
          </InputGroup>
          <div className="flex items-baseline justify-between gap-3">
            <FieldDescription>Shown on your profile.</FieldDescription>
            <FieldCounter />
          </div>
        </Field>
        <Button type="submit">Save profile</Button>
      </FieldGroup>
    </Form>
  )
}
pnpm dlx shadcn@latest add https://hextaui.com/r/field.json

Fügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.

import {
  Field,
  FieldDescription,
  FieldError,
  FieldGroup,
  FieldLabel,
} from "@/components/ui/field"
<FieldGroup indicator="optional">
  <Field>
    <FieldLabel>Email</FieldLabel>
    <Input type="email" required />
    <FieldDescription>We’ll never share it.</FieldDescription>
    <FieldError />
  </Field>
</FieldGroup>

Setze ein beliebiges HextaUI-Steuerelement in ein <Field />, und es wird automatisch beschriftet, beschrieben und validiert. id, htmlFor oder aria-describedby musst du nicht von Hand verdrahten.

Ein Steuerelement mit Label, Hilfetext und Validierung.

Field
├── FieldLabel
├── Input / Textarea / Select / …
├── FieldDescription
├── FieldError
├── FieldCounter
└── FieldStatus

Ein Switch oder eine Checkbox mit ihrem Text daneben.

Field
├── Switch / Checkbox
└── FieldContent
    ├── FieldLabel
    └── FieldDescription

Ein Label, das ein ganzes Feld umschließt, sodass die Karte das Klickziel ist.

FieldLabel
└── Field
    ├── Checkbox / RadioGroupItem
    └── FieldContent
        ├── FieldTitle
        └── FieldDescription

Zusammengehörige Felder, gleichmäßig verteilt.

FieldGroup
├── Field
├── FieldSeparator
└── Field

Eine betitelte Gruppe von Feldern oder eine Radio- oder Checkbox-Gruppe mit einem Eintrag pro Option.

FieldSet
├── FieldLegend
├── FieldDescription
└── FieldGroup
    └── Field

FieldSet
├── FieldLegend
└── FieldItem
    ├── RadioGroupItem / Checkbox
    └── FieldLabel

Input

Ein Label, ein Steuerelement und eine Beschreibung. Ein Klick auf das Label fokussiert das Input, und Screenreader lesen die Beschreibung nach dem Label vor.

import { Field, FieldDescription, FieldLabel } from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldInput() {
  return (
    <Field className="max-w-sm">
      <FieldLabel>Username</FieldLabel>
      <Input placeholder="ada" autoComplete="username" />
      <FieldDescription>
        Shown on your profile. You can change it once a month.
      </FieldDescription>
    </Field>
  )
}

Validierung

Native Einschränkungen wie required und minLength werden beim Verlassen des Felds geprüft. Gib jedem <FieldError /> ein match, um die Meldung pro Problem zu formulieren. Ein leeres Pflichtfeld wird erst markiert, nachdem es bearbeitet wurde, sodass das Vorbeitabben nicht anschreit.

import {
  Field,
  FieldDescription,
  FieldError,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldValidation() {
  return (
    <Field validationMode="onBlur" className="max-w-sm">
      <FieldLabel>Password</FieldLabel>
      <Input
        type="password"
        autoComplete="new-password"
        required
        minLength={8}
      />
      <FieldDescription>At least 8 characters.</FieldDescription>
      <FieldError match="valueMissing">Choose a password.</FieldError>
      <FieldError match="tooShort">
        That’s too short. Use 8 or more characters.
      </FieldError>
    </Field>
  )
}

Eigene Validierung

Übergib validate, um beliebige Dinge zu prüfen, auch asynchrone Abfragen. Gib eine Meldung zurück, um zu scheitern, oder nichts, um zu bestehen. Mit validationMode="onChange" und validationDebounceTime läuft es beim Tippen, ohne bei jeder Taste zu feuern. Probiere „ada“.

"use client"

import {
  Field,
  FieldDescription,
  FieldError,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

const taken = ["admin", "ada", "hexta"]

async function checkUsername(value: unknown) {
  const name = String(value ?? "")
    .trim()
    .toLowerCase()
  if (name.length === 0) {
    return null
  }
  if (!/^[a-z0-9_]+$/.test(name)) {
    return "Use letters, numbers and underscores only."
  }
  await new Promise((resolve) => setTimeout(resolve, 400))
  return taken.includes(name) ? `“${name}” is taken.` : null
}

export function FieldCustomValidation() {
  return (
    <Field
      validationMode="onChange"
      validationDebounceTime={300}
      validate={checkUsername}
      className="max-w-sm"
    >
      <FieldLabel>Username</FieldLabel>
      <Input placeholder="Try “ada”" autoComplete="off" />
      <FieldDescription>Checked as you type.</FieldDescription>
      <FieldError />
    </Field>
  )
}

Erforderlich und optional

Setze indicator auf einer FieldGroup, einem FieldSet oder einem Field, und jedes Label darin markiert sich anhand des required-Attributs seines Steuerelements. "optional" kennzeichnet die Felder, die man überspringen kann, was ruhiger wirkt, wenn die meisten Felder Pflicht sind. "required" fügt ein Sternchen hinzu. Die Markierung ist für Screenreader verborgen, da das Steuerelement sie bereits ansagt.

import {
  Field,
  FieldGroup,
  FieldLabel,
  FieldSeparator,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldIndicatorDemo() {
  return (
    <div className="flex w-full max-w-sm flex-col gap-8">
      <FieldGroup indicator="optional">
        <Field>
          <FieldLabel>Email</FieldLabel>
          <Input type="email" autoComplete="email" required />
        </Field>
        <Field>
          <FieldLabel>Company</FieldLabel>
          <Input autoComplete="organization" />
        </Field>
      </FieldGroup>
      <FieldSeparator />
      <FieldGroup indicator="required">
        <Field>
          <FieldLabel>Card number</FieldLabel>
          <Input inputMode="numeric" autoComplete="cc-number" required />
        </Field>
        <Field>
          <FieldLabel>Billing note</FieldLabel>
          <Input />
        </Field>
      </FieldGroup>
    </div>
  )
}

Status

<FieldStatus /> zeichnet einen Haken, sobald ein bearbeitetes Feld die Validierung besteht, und zeigt ein Warn-Icon, solange sie fehlschlägt. Es folgt dem validationMode des Felds und beurteilt ein Feld daher nie, bevor die Validierung gelaufen ist.

import {
  Field,
  FieldDescription,
  FieldError,
  FieldLabel,
  FieldStatus,
} from "@/components/ui/field"
import {
  InputGroup,
  InputGroupAddon,
  InputGroupInput,
} from "@/components/ui/input-group"

export function FieldStatusDemo() {
  return (
    <Field validationMode="onChange" className="max-w-sm">
      <FieldLabel>Invite code</FieldLabel>
      <InputGroup>
        <InputGroupInput
          name="code"
          pattern="HX-[0-9]{4}"
          placeholder="HX-0000"
          autoComplete="off"
        />
        <InputGroupAddon align="inline-end">
          <FieldStatus />
        </InputGroupAddon>
      </InputGroup>
      <FieldDescription>Try HX-2026.</FieldDescription>
      <FieldError match="patternMismatch">
        Codes look like HX- followed by four digits.
      </FieldError>
    </Field>
  )
}

Zeichenzähler

<FieldCounter /> findet das Textsteuerelement in seinem Feld und zählt gegen dessen maxLength. Es lauscht nur, sodass das Tippen nie verlangsamt oder verändert wird.

import {
  Field,
  FieldCounter,
  FieldDescription,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldCounterDemo() {
  return (
    <Field className="max-w-sm">
      <FieldLabel>Status</FieldLabel>
      <Input defaultValue="Shipping the field rework" maxLength={40} />
      <div className="flex items-baseline justify-between gap-3">
        <FieldDescription>Clears after 24 hours.</FieldDescription>
        <FieldCounter />
      </div>
    </Field>
  )
}

Fehler aus einer Formularbibliothek oder vom Server

Übergib invalid an das Feld und ein errors-Array an <FieldError />. Es nimmt die Form { message }, die React Hook Form und die meisten Schema-Bibliotheken zurückgeben. Duplikate werden verworfen, und mehrere Meldungen werden zu einer Liste. Ändern sich die Meldungen, blenden die neuen ein, und die Höhe passt sich sanft an, sodass nichts darunter springt. Sende leer ab und behebe dann eine Regel nach der anderen.

"use client"

import * as React from "react"

import { Button } from "@/components/ui/button"
import {
  Field,
  FieldError,
  FieldGroup,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

type Errors = {
  email?: { message: string }[]
  password?: { message: string }[]
}

export function FieldErrors() {
  const [errors, setErrors] = React.useState<Errors>({})

  return (
    <form
      className="w-full max-w-sm"
      onSubmit={(event) => {
        event.preventDefault()
        const data = new FormData(event.currentTarget)
        const password = String(data.get("password") ?? "")
        const next: Errors = {}
        if (!String(data.get("email") ?? "").includes("@")) {
          next.email = [{ message: "Enter a valid email." }]
        }
        const problems = []
        if (password.length < 8) {
          problems.push({ message: "Use at least 8 characters." })
        }
        if (!/\d/.test(password)) {
          problems.push({ message: "Include a number." })
        }
        if (problems.length > 0) {
          next.password = problems
        }
        setErrors(next)
      }}
    >
      <FieldGroup>
        <Field invalid={Boolean(errors.email)}>
          <FieldLabel>Email</FieldLabel>
          <Input name="email" autoComplete="email" />
          <FieldError errors={errors.email ?? []} />
        </Field>
        <Field invalid={Boolean(errors.password)}>
          <FieldLabel>Password</FieldLabel>
          <Input name="password" type="password" autoComplete="new-password" />
          <FieldError errors={errors.password ?? []} />
        </Field>
        <Button type="submit">Sign up</Button>
      </FieldGroup>
    </form>
  )
}

Checkboxen

Nutze orientation="horizontal", um die Checkbox neben ihr Label zu setzen. In einem <FieldSet /> benennt die Legende die ganze Gruppe.

import { Checkbox, CheckboxGroup } from "@/components/ui/checkbox"
import {
  Field,
  FieldDescription,
  FieldLabel,
  FieldLegend,
  FieldSet,
} from "@/components/ui/field"

const options = [
  { value: "mentions", label: "Mentions" },
  { value: "replies", label: "Replies to my comments" },
  { value: "digest", label: "Weekly digest" },
]

export function FieldCheckbox() {
  return (
    <FieldSet className="w-full max-w-sm">
      <FieldLegend variant="label">Email me about</FieldLegend>
      <FieldDescription>Security alerts are always on.</FieldDescription>
      <CheckboxGroup defaultValue={["mentions", "replies"]}>
        {options.map((option) => (
          <Field key={option.value} orientation="horizontal">
            <Checkbox name="notifications" value={option.value} />
            <FieldLabel>{option.label}</FieldLabel>
          </Field>
        ))}
      </CheckboxGroup>
    </FieldSet>
  )
}

Auswahlkarten

Umschließe ein ganzes Feld mit <FieldLabel />, damit die Karte das Klickziel ist. Verwende darin <FieldTitle />, da Labels sich nicht verschachteln lassen. Die Karte wird im aktivierten Zustand getönt und zeigt den Fokusring, wenn ihre Checkbox fokussiert ist.

import { Checkbox } from "@/components/ui/checkbox"
import {
  Field,
  FieldContent,
  FieldDescription,
  FieldLabel,
  FieldLegend,
  FieldSet,
  FieldTitle,
} from "@/components/ui/field"

export function FieldChoiceCard() {
  return (
    <FieldSet className="w-full max-w-sm">
      <FieldLegend variant="label">Add-ons</FieldLegend>
      <div className="flex flex-col gap-3">
        <FieldLabel>
          <Field orientation="horizontal">
            <Checkbox name="backups" defaultChecked />
            <FieldContent>
              <FieldTitle>Daily backups</FieldTitle>
              <FieldDescription>
                Restore any day from the last 30.
              </FieldDescription>
            </FieldContent>
          </Field>
        </FieldLabel>
        <FieldLabel>
          <Field orientation="horizontal">
            <Checkbox name="support" />
            <FieldContent>
              <FieldTitle>Priority support</FieldTitle>
              <FieldDescription>Replies within four hours.</FieldDescription>
            </FieldContent>
          </Field>
        </FieldLabel>
        <FieldLabel>
          <Field orientation="horizontal" disabled>
            <Checkbox name="sso" />
            <FieldContent>
              <FieldTitle>Single sign-on</FieldTitle>
              <FieldDescription>
                Available on the Business plan.
              </FieldDescription>
            </FieldContent>
          </Field>
        </FieldLabel>
      </div>
    </FieldSet>
  )
}

Fieldset

<FieldSet /> gruppiert zusammengehörige Felder unter einer <FieldLegend />, die zum zugänglichen Namen der Gruppe wird. Ordne Felder mit einem einfachen Grid nebeneinander an.

import {
  Field,
  FieldDescription,
  FieldGroup,
  FieldLabel,
  FieldLegend,
  FieldSet,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldFieldset() {
  return (
    <FieldSet className="w-full max-w-md">
      <FieldLegend>Shipping address</FieldLegend>
      <FieldDescription>Where should we send your order?</FieldDescription>
      <FieldGroup>
        <Field>
          <FieldLabel>Street address</FieldLabel>
          <Input autoComplete="street-address" />
        </Field>
        <div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
          <Field>
            <FieldLabel>City</FieldLabel>
            <Input autoComplete="address-level2" />
          </Field>
          <Field>
            <FieldLabel>Postal code</FieldLabel>
            <Input autoComplete="postal-code" />
          </Field>
        </div>
      </FieldGroup>
    </FieldSet>
  )
}

Responsive

orientation="responsive" stapelt Label und Steuerelement bei wenig Platz und setzt sie nebeneinander, sobald das umgebende <FieldGroup /> breit genug ist. Es reagiert auf die Breite der Gruppe, nicht des Fensters.

import {
  Field,
  FieldContent,
  FieldDescription,
  FieldGroup,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldResponsive() {
  return (
    <FieldGroup className="w-full max-w-xl">
      <Field orientation="responsive">
        <FieldContent>
          <FieldLabel>Display name</FieldLabel>
          <FieldDescription>Shown next to your messages.</FieldDescription>
        </FieldContent>
        <Input placeholder="Ada" className="sm:max-w-56" />
      </Field>
      <Field orientation="responsive">
        <FieldContent>
          <FieldLabel>Website</FieldLabel>
          <FieldDescription>Linked from your profile.</FieldDescription>
        </FieldContent>
        <Input placeholder="example.com" className="sm:max-w-56" />
      </Field>
    </FieldGroup>
  )
}

Deaktiviert

Das Deaktivieren eines <FieldSet /> deaktiviert jedes Feld und Steuerelement darin. Übergib disabled an ein einzelnes <Field />, um nur dieses zu deaktivieren.

import { Checkbox } from "@/components/ui/checkbox"
import {
  Field,
  FieldDescription,
  FieldGroup,
  FieldLabel,
  FieldLegend,
  FieldSet,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldDisabled() {
  return (
    <FieldSet disabled className="w-full max-w-sm">
      <FieldLegend>Billing details</FieldLegend>
      <FieldDescription>Managed by your organization’s admin.</FieldDescription>
      <FieldGroup>
        <Field>
          <FieldLabel>Company</FieldLabel>
          <Input defaultValue="Acme Inc." />
        </Field>
        <Field orientation="horizontal">
          <Checkbox defaultChecked />
          <FieldLabel>Send invoices by email</FieldLabel>
        </Field>
      </FieldGroup>
    </FieldSet>
  )
}

Langer Inhalt

Labels, Beschreibungen und Fehler werden in schmalen Formularen umgebrochen, auch Strings ohne Umbruchstelle, und machen das Layout nie breiter.

import {
  Field,
  FieldDescription,
  FieldError,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldLongContent() {
  return (
    <Field invalid className="w-72">
      <FieldLabel>
        A label long enough to wrap onto a second line in a narrow form
      </FieldLabel>
      <Input defaultValue="averyveryverylongunbrokenvaluethatkeepsgoing" />
      <FieldDescription>
        averyveryverylongunbrokendescriptionthatmustwrapinsteadofoverflowing
      </FieldDescription>
      <FieldError
        errors={[
          {
            message:
              "This message is long on purpose and wraps onto several lines without pushing anything wider.",
          },
        ]}
      />
    </Field>
  )
}

Rechts nach links

Text, Checkbox-Platzierung und Fehlerlisten folgen der Leserichtung.

import { Checkbox } from "@/components/ui/checkbox"
import {
  Field,
  FieldDescription,
  FieldError,
  FieldGroup,
  FieldLabel,
} from "@/components/ui/field"
import { Input } from "@/components/ui/input"

export function FieldRtl() {
  return (
    <div dir="rtl" className="w-full max-w-sm">
      <FieldGroup>
        <Field invalid>
          <FieldLabel>البريد الإلكتروني</FieldLabel>
          <Input type="email" defaultValue="ada@" />
          <FieldDescription>
            سنرسل رابط التأكيد إلى هذا العنوان.
          </FieldDescription>
          <FieldError errors={[{ message: "أدخل عنوان بريد صالحًا." }]} />
        </Field>
        <Field orientation="horizontal">
          <Checkbox defaultChecked />
          <FieldLabel>تذكرني</FieldLabel>
        </Field>
      </FieldGroup>
    </div>
  )
}
  • Label, Beschreibung und sichtbare Fehler sind automatisch mit dem Steuerelement verknüpft, sodass Screenreader alle drei ansagen, wenn es fokussiert wird.
  • Ungültige Steuerelemente erhalten aria-invalid, was auch ihren Fehlerring zeichnet.
  • Fehler sind keine Live-Regionen. Sie werden vorgelesen, wenn das Steuerelement fokussiert wird, sodass die Validierung bei Änderungen das Tippen nicht unterbricht. Setze beim Absenden den Fokus auf das erste ungültige Feld.
  • Fehler wachsen und blenden an Ort und Stelle ein, statt Inhalt nach unten zu schieben. Bei reduzierter Bewegung erscheinen sie ohne Animation.

Basiert auf dem Base UI Field und Fieldset. Jeder Teil akzeptiert die Props des Elements oder der Primitive, die er rendert.

PropTypStandard
orientation
"vertical" | "horizontal" | "responsive""vertical"
indicatorMarkiert das Label anhand des required-Attributs des Steuerelements. Wird von FieldGroup oder FieldSet übernommen.
"required" | "optional" | null–
nameIdentifiziert das Feld beim Absenden des Formulars.
string–
validateGib eine oder mehrere Meldungen zurück, um zu scheitern, oder nichts, um zu bestehen. Asynchron wird unterstützt.
(value, formValues) => string | string[] | null | Promise<…>–
validationMode
"onSubmit" | "onBlur" | "onChange""onSubmit"
validationDebounceTimeMillisekunden, die zwischen onChange-Validierungen gewartet wird.
number0
invalidAus einer Formularbibliothek oder Serverantwort setzen.
boolean–
disabled
booleanfalse
dirty
boolean–
touched
boolean–
actionsRefDas Feld imperativ validieren.
RefObject<{ validate: () => void }>–
render
ReactElement | (props, state) => ReactElement<div>
AttributBeschreibung
data-slot="field"Felder in CSS ansprechen.
data-orientationDie aktuelle Orientierung.
data-disabledVorhanden, wenn das Feld deaktiviert ist.
data-validVorhanden, wenn das Feld gültig ist.
data-invalidVorhanden, wenn das Feld ungültig ist.
data-dirtyVorhanden, sobald sich der Wert vom Anfangswert geändert hat.
data-touchedVorhanden, sobald das Steuerelement fokussiert und wieder verlassen wurde.
data-filledVorhanden, wenn das Steuerelement einen Wert hat.
data-focusedVorhanden, solange das Steuerelement den Fokus hat.
PropTypStandard
nativeLabelAuf false setzen, wenn render das Label durch ein Nicht-Label-Element ersetzt.
booleantrue
optionalTextText, der mit indicator="optional" angezeigt wird.
ReactNode"Optional"
render
ReactElement | (props, state) => ReactElement<label>
AttributBeschreibung
data-slot="field-label"Labels in CSS ansprechen. Außerhalb eines Felds rendert es ein einfaches Label, so funktionieren Auswahlkarten.
data-disabledVorhanden, wenn das Feld deaktiviert ist.
data-validVorhanden, wenn das Feld gültig ist.
data-invalidVorhanden, wenn das Feld ungültig ist.
data-dirtyVorhanden, sobald sich der Wert vom Anfangswert geändert hat.
data-touchedVorhanden, sobald das Steuerelement fokussiert und wieder verlassen wurde.
data-filledVorhanden, wenn das Steuerelement einen Wert hat.
data-focusedVorhanden, solange das Steuerelement den Fokus hat.

Ein Icon, das die Gültigkeit des Felds widerspiegelt. Es ist dekorativ, da die Fehlermeldung die Bedeutung trägt.

AttributBeschreibung
data-slot="field-status"Das Status-Icon in CSS ansprechen.
PropTypStandard
threshold
number10% of maxLength, at most 20
announcementMeldung für Screenreader, wenn die Zeichenzahl den Schwellenwert überschreitet oder das Limit erreicht.
(remaining: number) => string–
AttributBeschreibung
data-slot="field-counter"Den Zähler in CSS ansprechen.
data-state="near" | "limit"Vorhanden innerhalb des Schwellenwerts und am Limit.
PropTypStandard
render
ReactElement | (props, state) => ReactElement<p>
AttributBeschreibung
data-slot="field-description"Beschreibungen in CSS ansprechen.
data-disabledVorhanden, wenn das Feld deaktiviert ist.
data-validVorhanden, wenn das Feld gültig ist.
data-invalidVorhanden, wenn das Feld ungültig ist.
data-dirtyVorhanden, sobald sich der Wert vom Anfangswert geändert hat.
data-touchedVorhanden, sobald das Steuerelement fokussiert und wieder verlassen wurde.
data-filledVorhanden, wenn das Steuerelement einen Wert hat.
data-focusedVorhanden, solange das Steuerelement den Fokus hat.
PropTypStandard
matchNur bei diesem Validitätsproblem anzeigen. true zeigt es immer.
boolean | "valueMissing" | "typeMismatch" | "tooShort" | "tooLong" | "patternMismatch" | "rangeOverflow" | "rangeUnderflow" | "stepMismatch" | "badInput" | "customError" | "valid"–
errorsFehler aus einer Formularbibliothek oder vom Server. Werden angezeigt, wenn die Liste eine Meldung enthält.
Array<{ message?: string } | undefined>–
childrenStandardmäßig die Validierungsmeldung.
ReactNode–
render
ReactElement | (props, state) => ReactElement<div>
AttributBeschreibung
data-slot="field-error"Fehler in CSS ansprechen.
data-starting-styleVorhanden, während der Fehler hereinwächst.
data-ending-styleVorhanden, während der Fehler einklappt.
data-disabledVorhanden, wenn das Feld deaktiviert ist.
data-validVorhanden, wenn das Feld gültig ist.
data-invalidVorhanden, wenn das Feld ungültig ist.
data-dirtyVorhanden, sobald sich der Wert vom Anfangswert geändert hat.
data-touchedVorhanden, sobald das Steuerelement fokussiert und wieder verlassen wurde.
data-filledVorhanden, wenn das Steuerelement einen Wert hat.
data-focusedVorhanden, solange das Steuerelement den Fokus hat.

Stapelt Label, Beschreibung und Fehler neben einem Steuerelement in einem horizontalen Feld.

PropTypStandard
render
ReactElement | (props, state) => ReactElement<div>

Ein Titel im Label-Stil für Inhalte in einer <FieldLabel />, etwa Auswahlkarten.

PropTypStandard
render
ReactElement | (props, state) => ReactElement<div>

Setzt Felder auseinander und ist der Container, den responsive Felder messen.

PropTypStandard
indicatorGilt für jedes Feld darin.
"required" | "optional" | null–
render
ReactElement | (props, state) => ReactElement<div>
PropTypStandard
indicatorGilt für jedes Feld darin.
"required" | "optional" | null–
disabledDeaktiviert jedes Feld darin.
booleanfalse
render
ReactElement | (props, state) => ReactElement<fieldset>
AttributBeschreibung
data-slot="field-set"Fieldsets in CSS ansprechen.
data-disabledVorhanden, wenn das Fieldset deaktiviert ist.
PropTypStandard
variantlabel entspricht der Größe eines Feld-Labels.
"legend" | "label""legend"
render
ReactElement | (props, state) => ReactElement<div>
AttributBeschreibung
data-slot="field-legend"Legenden in CSS ansprechen.
data-variantDie aktuelle Variante.

Ein <Separator /> mit Abständen für Formulare, das alle seine Props akzeptiert.

PropTypStandard
childrenOptionaler Text, der in der Mitte der Linie angezeigt wird.
ReactNode–
alignWo der Text auf der Linie sitzt.
"start" | "center" | "end""center"
decorativeVerbirgt eine einfache Linie vor Screenreadern, wenn sie nur visuell ist.
booleanfalse
render
ReactElement | (props, state) => ReactElement<div>
AttributBeschreibung
data-slot="field-separator"Feld-Trennzeichen in CSS ansprechen.
data-contentVorhanden, wenn das Trennzeichen Text hat.
data-slot="separator-label"Das Element, das den Text umschließt.

Umschließt eine Checkbox oder ein Radio samt Label in einer Gruppe, sodass sich jeder Eintrag einzeln deaktivieren lässt.

PropTypStandard
disabled
booleanfalse
render
ReactElement | (props, state) => ReactElement<div>

Rendert beliebige Inhalte aus dem Validitätszustand des Felds, zum Beispiel eine Stärkeanzeige oder einen Zeichenzähler.

PropTypStandard
children
(state: { validity, errors, error, value }) => ReactNode–

In Blocks verwendet

Blocks, die auf Field aufbauen.