Fiber UI LogoFiberUI

Label

Renders an accessible label associated with controls.

Basic Usage

import { Input } from "@repo/ui/components/input";
import { Label } from "@repo/ui/components/label";

interface Example1Props {}

export const Example1: React.FC<Example1Props> = ({}) => {
    return (
        <div className="flex w-80 flex-col gap-2 md:w-80">
            <Label htmlFor="name">Name</Label>
            <Input id="name" />
        </div>
    );
};

Component Code

"use client";

import { cn } from "@repo/ui/lib/utils";
import { ComponentProps, forwardRef, ReactNode } from "react";
import { LabelAriaProps, mergeProps, useLabel } from "react-aria";

interface LabelProps extends LabelAriaProps, ComponentProps<"label"> {
    className?: string;
    children: ReactNode;
}

export const Label = forwardRef<HTMLLabelElement, LabelProps>(
    ({ className = "", children, ...restProps }, ref) => {
        const { labelProps } = useLabel(restProps);

        return (
            <label
                {...mergeProps(labelProps, restProps)}
                ref={ref}
                className={cn(
                    `flex select-none items-center gap-2 text-sm font-medium leading-none`,
                    `peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,
                    `peer-[data-disabled=true]:cursor-not-allowed peer-[data-disabled="true"]:opacity-50`,
                    `aria-disabled:pointer-events-none aria-disabled:opacity-50`,
                    `group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50`,
                    className,
                )}
            >
                {children}
            </label>
        );
    },
);
Label.displayName = "Label";