feat: update Switch component to support customizable labels and adjust related UI elements

This commit is contained in:
Ardeman 2025-03-07 10:30:46 +08:00
parent d765d92df7
commit 75e548dc83
3 changed files with 20 additions and 5 deletions

View File

@ -20,6 +20,10 @@ type TSwitchProperties<T extends FieldValues> = {
labelClassName?: string labelClassName?: string
className?: string className?: string
inputClassName?: string inputClassName?: string
options?: {
true: string
false: string
}
} }
export const Switch = <TFormValues extends Record<string, unknown>>( export const Switch = <TFormValues extends Record<string, unknown>>(
@ -34,6 +38,7 @@ export const Switch = <TFormValues extends Record<string, unknown>>(
labelClassName, labelClassName,
className, className,
inputClassName, inputClassName,
options,
} = properties } = properties
const { const {
@ -63,13 +68,22 @@ export const Switch = <TFormValues extends Record<string, unknown>>(
field.onChange(checked) field.onChange(checked)
}} }}
className={twMerge( className={twMerge(
'group relative flex h-7 w-14 cursor-pointer rounded-full bg-[#2E2F7C]/10 p-1 shadow transition-colors duration-200 ease-in-out focus:outline-none data-[checked]:bg-[#2E2F7C]/90 data-[focus]:outline-1 data-[focus]:outline-white', 'group flex h-7 cursor-pointer items-center rounded-full bg-[#2E2F7C]/10 p-1 shadow transition-colors duration-200 ease-in-out focus:outline-none data-[checked]:bg-[#2E2F7C]/90 data-[focus]:outline-1 data-[focus]:outline-white',
inputClassName, inputClassName,
)} )}
> >
<span <div
className={twMerge(
'order-2 text-xs transition duration-200 group-data-[checked]:order-1',
options?.true ? 'w-18' : 'w-8',
field.value ? 'text-white' : 'text-black/80',
)}
>
{field.value ? options?.true : options?.false}
</div>
<div
aria-hidden="true" aria-hidden="true"
className="pointer-events-none inline-block size-5 translate-x-0 rounded-full bg-white ring-0 shadow-lg transition duration-200 ease-in-out group-data-[checked]:translate-x-7" className="pointer-events-none order-1 size-5 rounded-full bg-white ring-0 shadow-lg transition duration-200 group-data-[checked]:order-2"
/> />
</HeadlessSwitch> </HeadlessSwitch>
</div> </div>

View File

@ -180,9 +180,10 @@ export const CreateContentsPage = () => {
<Switch <Switch
id="is_premium" id="is_premium"
name="is_premium" name="is_premium"
label="Premium" label="Subscription"
labelClassName="text-sm font-medium text-[#363636]" labelClassName="text-sm font-medium text-[#363636]"
className="h-[42px]" className="h-[42px]"
options={{ true: 'Premium', false: 'Normal' }}
/> />
</div> </div>

View File

@ -45,7 +45,7 @@ export const ContentsPage = () => {
}, },
{ title: 'Tag', data: 'tags' }, { title: 'Tag', data: 'tags' },
{ {
title: 'Premium', title: 'Subscription',
data: 'is_premium', data: 'is_premium',
}, },
{ {