import * as React from 'react' import { AlertCircle } from 'lucide-react' import { Label } from '@/components/ui/label' import { cn } from '@/lib/utils' /** * Ein Formularfeld mit Beschriftung, Erklaerung und Fehlermeldung. * * Der Erklaerungstext ist kein Beiwerk: Diese Anwendung benutzt an vielen * Stellen Begriffe aus dem Betreuungs- und Sozialrecht. Wer sie nicht * kennt, soll sie hier erklaert bekommen, statt nachschlagen zu muessen. * * Beschriftung, Erklaerung und Fehler sind ueber aria-describedby mit dem * Eingabefeld verbunden - Screenreader lesen sie mit vor. */ export function Feld({ id, beschriftung, erklaerung, fehler, pflicht, className, children, }: { id: string beschriftung: string erklaerung?: React.ReactNode fehler?: string | string[] | null pflicht?: boolean className?: string children: React.ReactNode }) { const fehlertext = Array.isArray(fehler) ? fehler[0] : fehler const erklaerungId = erklaerung ? `${id}-erklaerung` : undefined const fehlerId = fehlertext ? `${id}-fehler` : undefined const beschriftungVon = [erklaerungId, fehlerId].filter(Boolean).join(' ') || undefined return (
{React.isValidElement(children) ? React.cloneElement(children as React.ReactElement>, { id, 'aria-describedby': beschriftungVon, 'aria-invalid': fehlertext ? true : undefined, 'aria-required': pflicht || undefined, }) : children} {erklaerung && (

{erklaerung}

)} {fehlertext && (

)}
) } /** Gruppiert zusammengehoerige Felder mit einer Ueberschrift. */ export function Feldgruppe({ titel, beschreibung, children, className, }: { titel: string beschreibung?: React.ReactNode children: React.ReactNode className?: string }) { return (
{titel}

{titel}

{beschreibung &&

{beschreibung}

}
{children}
) }