diff options
Diffstat (limited to 'packages/ui-new/src/components/ui/field.tsx')
| -rw-r--r-- | packages/ui-new/src/components/ui/field.tsx | 238 |
1 files changed, 0 insertions, 238 deletions
diff --git a/packages/ui-new/src/components/ui/field.tsx b/packages/ui-new/src/components/ui/field.tsx deleted file mode 100644 index ab9fb71..0000000 --- a/packages/ui-new/src/components/ui/field.tsx +++ /dev/null @@ -1,238 +0,0 @@ -import { cva, type VariantProps } from "class-variance-authority"; -import { useMemo } from "react"; -import { Label } from "@/components/ui/label"; -import { Separator } from "@/components/ui/separator"; -import { cn } from "@/lib/utils"; - -function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) { - return ( - <fieldset - data-slot="field-set" - className={cn( - "gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3 flex flex-col", - className, - )} - {...props} - /> - ); -} - -function FieldLegend({ - className, - variant = "legend", - ...props -}: React.ComponentProps<"legend"> & { variant?: "legend" | "label" }) { - return ( - <legend - data-slot="field-legend" - data-variant={variant} - className={cn( - "mb-2.5 font-medium data-[variant=label]:text-xs data-[variant=legend]:text-sm", - className, - )} - {...props} - /> - ); -} - -function FieldGroup({ className, ...props }: React.ComponentProps<"div">) { - return ( - <div - data-slot="field-group" - className={cn( - "gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4 group/field-group @container/field-group flex w-full flex-col", - className, - )} - {...props} - /> - ); -} - -const fieldVariants = cva( - "data-[invalid=true]:text-destructive gap-2 group/field flex w-full", - { - variants: { - orientation: { - vertical: "flex-col *:w-full [&>.sr-only]:w-auto", - horizontal: - "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", - responsive: - "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", - }, - }, - defaultVariants: { - orientation: "vertical", - }, - }, -); - -function Field({ - className, - orientation = "vertical", - ...props -}: React.ComponentProps<"div"> & VariantProps<typeof fieldVariants>) { - return ( - <div - data-slot="field" - data-orientation={orientation} - className={cn(fieldVariants({ orientation }), className)} - {...props} - /> - ); -} - -function FieldContent({ className, ...props }: React.ComponentProps<"div">) { - return ( - <div - data-slot="field-content" - className={cn( - "gap-0.5 group/field-content flex flex-1 flex-col leading-snug", - className, - )} - {...props} - /> - ); -} - -function FieldLabel({ - className, - ...props -}: React.ComponentProps<typeof Label>) { - return ( - <Label - data-slot="field-label" - className={cn( - "has-data-checked:bg-primary/5 has-data-checked:border-primary/30 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10 gap-2 group-data-[disabled=true]/field:opacity-50 has-[>[data-slot=field]]:rounded-none has-[>[data-slot=field]]:border *:data-[slot=field]:p-2 group/field-label peer/field-label flex w-fit leading-snug", - "has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col", - className, - )} - {...props} - /> - ); -} - -function FieldTitle({ className, ...props }: React.ComponentProps<"div">) { - return ( - <div - data-slot="field-label" - className={cn( - "gap-2 text-xs/relaxed group-data-[disabled=true]/field:opacity-50 flex w-fit items-center leading-snug", - className, - )} - {...props} - /> - ); -} - -function FieldDescription({ className, ...props }: React.ComponentProps<"p">) { - return ( - <p - data-slot="field-description" - className={cn( - "text-muted-foreground text-left text-xs/relaxed [[data-variant=legend]+&]:-mt-1.5 leading-normal font-normal group-has-data-horizontal/field:text-balance", - "last:mt-0 nth-last-2:-mt-1", - "[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4", - className, - )} - {...props} - /> - ); -} - -function FieldSeparator({ - children, - className, - ...props -}: React.ComponentProps<"div"> & { - children?: React.ReactNode; -}) { - return ( - <div - data-slot="field-separator" - data-content={!!children} - className={cn( - "-my-2 h-5 text-xs group-data-[variant=outline]/field-group:-mb-2 relative", - className, - )} - {...props} - > - <Separator className="absolute inset-0 top-1/2" /> - {children && ( - <span - className="text-muted-foreground px-2 bg-background relative mx-auto block w-fit" - data-slot="field-separator-content" - > - {children} - </span> - )} - </div> - ); -} - -function FieldError({ - className, - children, - errors, - ...props -}: React.ComponentProps<"div"> & { - errors?: Array<{ message?: string } | undefined>; -}) { - const content = useMemo(() => { - if (children) { - return children; - } - - if (!errors?.length) { - return null; - } - - const uniqueErrors = [ - ...new Map(errors.map((error) => [error?.message, error])).values(), - ]; - - if (uniqueErrors?.length === 1) { - return uniqueErrors[0]?.message; - } - - return ( - <ul className="ml-4 flex list-disc flex-col gap-1"> - {uniqueErrors.map( - (error, index) => - error?.message && ( - <li key={`${error.message.slice(6)}-${index}`}> - {error.message} - </li> - ), - )} - </ul> - ); - }, [children, errors]); - - if (!content) { - return null; - } - - return ( - <div - role="alert" - data-slot="field-error" - className={cn("text-destructive text-xs font-normal", className)} - {...props} - > - {content} - </div> - ); -} - -export { - Field, - FieldLabel, - FieldDescription, - FieldError, - FieldGroup, - FieldLegend, - FieldSeparator, - FieldSet, - FieldContent, - FieldTitle, -}; |