import { cn } from '@/lib/utils'; | |
import * as React from 'react'; | |
export declare type SegmentedValue = string | number; | |
export declare type SegmentedRawOption = SegmentedValue; | |
export interface SegmentedLabeledOption { | |
className?: string; | |
disabled?: boolean; | |
label: React.ReactNode; | |
value: SegmentedRawOption; | |
/** | |
* html `title` property for label | |
*/ | |
title?: string; | |
} | |
declare type SegmentedOptions = (SegmentedRawOption | SegmentedLabeledOption)[]; | |
export interface SegmentedProps | |
extends Omit<React.HTMLProps<HTMLDivElement>, 'onChange'> { | |
options: SegmentedOptions; | |
defaultValue?: SegmentedValue; | |
value?: SegmentedValue; | |
onChange?: (value: SegmentedValue) => void; | |
disabled?: boolean; | |
prefixCls?: string; | |
direction?: 'ltr' | 'rtl'; | |
motionName?: string; | |
} | |
export function Segmented({ | |
options, | |
value, | |
onChange, | |
className, | |
}: SegmentedProps) { | |
return ( | |
<div | |
className={cn( | |
'flex items-center rounded-sm p-1 gap-2 bg-zinc-200', | |
className, | |
)} | |
> | |
{options.map((option) => { | |
const isObject = typeof option === 'object'; | |
const actualValue = isObject ? option.value : option; | |
return ( | |
<div | |
key={actualValue} | |
className={cn( | |
'inline-flex items-center px-3 py-2 text-sm font-medium rounded-sm cursor-pointer', | |
{ 'bg-backgroundCoreStandard': value === actualValue }, | |
)} | |
onClick={() => onChange?.(actualValue)} | |
> | |
{isObject ? option.label : option} | |
</div> | |
); | |
})} | |
</div> | |
); | |
} | |