// components/ui/Checkbox.tsx 'use client'; import * as React from 'react'; import clsx from 'clsx'; export type CheckboxProps = Omit< React.InputHTMLAttributes, 'type' > & { /** * Label neben der Checkbox */ label?: React.ReactNode; /** * Beschreibung unter/neben dem Label */ description?: React.ReactNode; /** * Visueller indeterminate-Zustand (Strich statt Haken) */ indeterminate?: boolean; /** * Zusätzliche Klassen für das Wrapper-Element (Label+Beschreibung+Checkbox) */ wrapperClassName?: string; /** * Zusätzliche Klassen für das Label */ labelClassName?: string; /** * Zusätzliche Klassen für die Beschreibung */ descriptionClassName?: string; }; export const Checkbox = React.forwardRef( function Checkbox( { label, description, className, wrapperClassName, labelClassName, descriptionClassName, indeterminate, id, ...inputProps }, ref, ) { const innerRef = React.useRef(null); // externe + interne Ref zusammenführen React.useImperativeHandle(ref, () => innerRef.current as HTMLInputElement); React.useEffect(() => { if (innerRef.current) { innerRef.current.indeterminate = Boolean(indeterminate); } }, [indeterminate]); // Fallback-ID, falls keine übergeben wurde const inputId = id ?? (typeof label === 'string' ? label.toLowerCase().replace(/\s+/g, '-') : undefined); const descriptionId = description && inputId ? `${inputId}-description` : undefined; return (
{/* Checkbox-Icon */}
{/* Label + Beschreibung (optional) */} {(label || description) && (
{label && ( )} {description && (

{description}

)}
)}
); }, );