blob: 5ec38696cb646f9a530f41553e61c7a29dc450b4 [file]
/**
* Tailwind catalyst component
*/
import {
Description as HeadlessDescription,
Field as HeadlessField,
Fieldset as HeadlessFieldset,
Label as HeadlessLabel,
Legend as HeadlessLegend,
type DescriptionProps as HeadlessDescriptionProps,
type FieldProps as HeadlessFieldProps,
type FieldsetProps as HeadlessFieldsetProps,
type LabelProps as HeadlessLabelProps,
type LegendProps as HeadlessLegendProps
} from '@headlessui/react';
import clsx from 'clsx';
import type React from 'react';
export function Fieldset({ className, ...props }: { disabled?: boolean } & HeadlessFieldsetProps) {
return (
<HeadlessFieldset
{...props}
className={clsx(className, '[&>*+[data-slot=control]]:mt-6 [&>[data-slot=text]]:mt-1')}
/>
);
}
export function Legend({ ...props }: HeadlessLegendProps) {
return (
<HeadlessLegend
{...props}
data-slot="legend"
className={clsx(
props.className,
'text-base/6 font-semibold text-zinc-950 data-[disabled]:opacity-50 sm:text-sm/6 dark:text-white'
)}
/>
);
}
export function FieldGroup({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {
return <div {...props} data-slot="control" className={clsx(className, 'space-y-8')} />;
}
export function Field({ className, ...props }: HeadlessFieldProps) {
return (
<HeadlessField
className={clsx(
className,
'[&>[data-slot=label]+[data-slot=control]]:mt-3',
'[&>[data-slot=label]+[data-slot=description]]:mt-1',
'[&>[data-slot=description]+[data-slot=control]]:mt-3',
'[&>[data-slot=control]+[data-slot=description]]:mt-3',
'[&>[data-slot=control]+[data-slot=error]]:mt-3',
'[&>[data-slot=label]]:font-medium'
)}
{...props}
/>
);
}
export function Label({ className, ...props }: { className?: string } & HeadlessLabelProps) {
return (
<HeadlessLabel
{...props}
data-slot="label"
className={clsx(
className,
'select-none text-base/6 text-zinc-950 data-[disabled]:opacity-50 sm:text-sm/6 dark:text-white'
)}
/>
);
}
export function Description({
className,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
disabled,
...props
}: { className?: string; disabled?: boolean } & HeadlessDescriptionProps) {
return (
<HeadlessDescription
{...props}
data-slot="description"
className={clsx(
className,
'text-base/6 text-zinc-500 data-[disabled]:opacity-50 sm:text-sm/6 dark:text-zinc-400'
)}
/>
);
}
export function ErrorMessage({
className,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
disabled,
...props
}: { className?: string; disabled?: boolean } & HeadlessDescriptionProps) {
return (
<HeadlessDescription
{...props}
data-slot="error"
className={clsx(
className,
'text-base/6 text-red-600 data-[disabled]:opacity-50 sm:text-sm/6 dark:text-red-500'
)}
/>
);
}