Field
optics/fieldFreeComponent
A field component for grouping form elements with labels and descriptions.
See it running
Open the demo on optics
optics.agusmayol.com.ar/components/fieldInstall it
npx shadcn@latest add https://optics.agusmayol.com.ar/r/field.jsonSource
1"use client";23import { useMemo } from "react";4import { cva } from "class-variance-authority";56import { cn } from "@/lib/utils";7import { Label } from "@/registry/optics/label";8import { Separator } from "@/registry/optics/separator";910function FieldSet({ className = "", ...props }) {11 return (12 <fieldset13 data-slot="field-set"14 className={cn(15 "gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3 flex flex-col",16 className,17 )}18 {...props}19 />20 );21}2223function FieldLegend({ className = "", variant = "legend", ...props }) {24 return (25 <legend26 data-slot="field-legend"27 data-variant={variant}28 className={cn(29 "mb-2 font-medium data-[variant=label]:text-xs/relaxed data-[variant=legend]:text-sm",30 className,31 )}32 {...props}33 />34 );35}3637function FieldGroup({ className = "", ...props }) {38 return (39 <div40 data-slot="field-group"41 className={cn(42 "gap-4 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4 group/field-group @container/field-group flex w-full flex-col",43 className,44 )}45 {...props}46 />47 );48}4950const fieldVariants = cva(51 "data-[invalid=true]:text-destructive gap-2 group/field flex w-full",52 {53 variants: {54 orientation: {55 vertical: "flex-col [&>*]:w-full [&>.sr-only]:w-auto",56 horizontal:57 "flex-row items-center [&>[data-slot=field-label]]:flex-auto has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",58 responsive:59 "flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto @md/field-group:[&>[data-slot=field-label]]:flex-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px",60 },61 },62 defaultVariants: {63 orientation: "vertical",64 },65 },66);6768function Field({ className = "", orientation = "vertical", ...props }) {69 return (70 <div71 role="group"72 data-slot="field"73 data-orientation={orientation}74 className={cn(fieldVariants({ orientation }), className)}75 {...props}76 />77 );78}7980function FieldContent({ className = "", ...props }) {81 return (82 <div83 data-slot="field-content"84 className={cn(85 "gap-0.5 group/field-content flex flex-1 flex-col leading-snug",86 className,87 )}88 {...props}89 />90 );91}9293function FieldLabel({ className = "", ...props }) {94 return (95 <Label96// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from optics
All 79 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | optics | Components | Free | 5 deps | |
| Alertalert | optics | Components | Free | 4 deps | |
| Alert Dialogalert-dialog | optics | Components | Free | 4 deps | |
| Aspect Ratioaspect-ratio | optics | Components | Free | 2 deps | |
| Auto Heightauto-height | optics | Components | Free | 3 deps | |
| Avataravatar | optics | Components | Free | 3 deps | |
| Badgebadge | optics | Components | Free | 4 deps | |
| Breadcrumbbreadcrumb | optics | Components | Free | 4 deps |
