Components · Forms
Label
The visible name of a field.
39% of the 2,062 sites in The UI Index have a form (806 sites).
Both previews render the same markup; the HTML tab below is that markup without a framework.
Install
- React
- npx shadcn@
latest add https:// www.themes.dev/ caseroom/ r/ label.json - Astro
- npx shadcn@
latest add https:// www.themes.dev/ caseroom/ r/ astro/ label.json
Or copy the files below into your project. They need clsx, tailwind-merge, and the Caseroom theme. The HTML needs only the compiled CSS.
import type { LabelHTMLAttributes } from 'react';
import { cn } from '@/lib/utils';
import { labelClasses } from './label.variants';
export type LabelProps = LabelHTMLAttributes<HTMLLabelElement>;
export function Label({ className, ...props }: LabelProps) {
return <label className={cn(labelClasses, className)} {...props} />;
}/** A label holding its control (checkbox, switch) keeps the control on the first line and wraps with leading. */
export const labelClasses =
'flex items-center gap-2 text-sm leading-none font-medium has-[input]:items-start has-[input]:leading-snug has-[input]:[&>*:first-child]:mt-px select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50';---
import type { HTMLAttributes } from 'astro/types';
import { cn } from '@/lib/utils';
import { labelClasses } from './label.variants';
type Props = HTMLAttributes<'label'>;
const { class: className, ...rest } = Astro.props;
---
<label class={cn(labelClasses, className)} {...rest}><slot /></label>/** A label holding its control (checkbox, switch) keeps the control on the first line and wraps with leading. */
export const labelClasses =
'flex items-center gap-2 text-sm leading-none font-medium has-[input]:items-start has-[input]:leading-snug has-[input]:[&>*:first-child]:mt-px select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50';<div class="grid w-full max-w-sm gap-2">
<label class="flex items-center gap-2 text-sm leading-none font-medium has-[input]:items-start has-[input]:leading-snug has-[input]:[&>*:first-child]:mt-px select-none peer-disabled:cursor-not-allowed peer-disabled:opacity-50" for="ex-name">
Full name
</label>
<input type="text" class="w-full min-w-0 rounded-md border border-input bg-background px-3 text-sm text-foreground transition-colors placeholder:text-muted-foreground enabled:hover:border-foreground/85 enabled:active:bg-muted aria-invalid:enabled:hover:border-destructive aria-invalid:enabled:hover:bg-[color-mix(in_oklab,var(--destructive)_6%,var(--background))] aria-invalid:enabled:active:bg-[color-mix(in_oklab,var(--destructive)_10%,var(--background))] focus-visible:border-ring focus-visible:outline-2 focus-visible:outline-offset-0 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:outline-destructive h-9 py-1 file:mr-3 file:border-0 file:bg-transparent file:text-sm file:font-medium" id="ex-name" autocomplete="name">
</div>