UNPKG

@undp/design-system-react

Version:

React based design system for UNDP

1 lines 10 kB
{"version":3,"file":"SegmentedControl.cjs","names":[],"sources":["../src/components/ui/segmented-control.tsx"],"sourcesContent":["import { cva } from 'class-variance-authority';\nimport { useEffect, useEffectEvent, useState } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nconst segmentedButtonVariants = cva('inline-flex rounded-base bg-surface', {\n variants: {\n variant: {\n normal: 'border-2 border-foreground bg-background',\n light: 'border-0',\n },\n size: {\n sm: '',\n base: '',\n },\n rounded: {\n base: 'rounded-base',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n full: 'rounded-full',\n },\n },\n compoundVariants: [\n { variant: 'normal', size: 'sm', class: 'p-0' },\n { variant: 'normal', size: 'base', class: 'p-0' },\n { variant: 'light', size: 'sm', class: 'p-[3px]' },\n { variant: 'light', size: 'base', class: 'p-[5px]' },\n ],\n defaultVariants: {\n size: 'base',\n variant: 'normal',\n rounded: 'base',\n },\n});\n\nconst buttonSelectedVariants = cva('disabled:opacity-disabled disabled:cursor-not-allowed', {\n variants: {\n variant: {\n normal: '',\n light: '',\n },\n color: {\n primary: '',\n secondary: '',\n tertiary: '',\n quaternary: '',\n foreground: '',\n },\n rounded: {\n base: 'rounded-base',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n full: 'rounded-full',\n },\n },\n\n compoundVariants: [\n { variant: 'normal', color: 'primary', class: 'bg-primary text-content-reverse' },\n { variant: 'normal', color: 'secondary', class: 'bg-secondary text-content-reverse' },\n { variant: 'normal', color: 'tertiary', class: 'bg-tertiary text-content-reverse' },\n { variant: 'normal', color: 'quaternary', class: 'bg-quaternary text-content-primary' },\n {\n variant: 'normal',\n color: 'foreground',\n class: 'font-bold bg-foreground text-content-reverse',\n },\n { variant: 'light', color: 'primary', class: 'font-bold bg-background text-primary' },\n { variant: 'light', color: 'secondary', class: 'font-bold bg-background text-secondary' },\n { variant: 'light', color: 'tertiary', class: 'font-bold bg-background text-tertiary' },\n { variant: 'light', color: 'quaternary', class: 'font-bold bg-background text-quaternary' },\n {\n variant: 'light',\n color: 'foreground',\n class: 'font-bold bg-background text-foreground',\n },\n ],\n defaultVariants: { color: 'primary', rounded: 'base', variant: 'normal' },\n});\n\nconst buttonUnselectedVariants = cva(\n 'text-content-primary hover:bg-surface-hover disabled:hover:bg-transparent disabled:hover:text-inherit disabled:cursor-not-allowed disabled:opacity-25',\n {\n variants: {\n variant: {\n normal: '',\n light: '',\n },\n color: {\n primary: '',\n secondary: '',\n tertiary: '',\n quaternary: '',\n foreground: '',\n },\n rounded: {\n base: 'rounded-base',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n full: 'rounded-full',\n },\n },\n\n compoundVariants: [\n {\n variant: 'normal',\n color: 'primary',\n class: 'hover:bg-primary-light',\n },\n { variant: 'normal', color: 'secondary', class: 'hover:bg-secondary-light' },\n { variant: 'normal', color: 'tertiary', class: 'hover:bg-tertiary-light' },\n { variant: 'normal', color: 'quaternary', class: 'hover:bg-quaternary-hover' },\n { variant: 'normal', color: 'foreground', class: 'hover:bg-surface-hover' },\n {\n variant: 'light',\n color: 'primary',\n class: 'hover:text-primary disabled:hover:text-inherit',\n },\n {\n variant: 'light',\n color: 'secondary',\n class: 'hover:text-secondary disabled:hover:text-inherit',\n },\n {\n variant: 'light',\n color: 'tertiary',\n class: 'hover:text-tertiary disabled:hover:text-inherit',\n },\n {\n variant: 'light',\n color: 'quaternary',\n class: 'hover:text-quaternary disabled:hover:text-inherit',\n },\n {\n variant: 'light',\n color: 'foreground',\n class: 'hover:text-foreground disabled:hover:text-inherit',\n },\n ],\n defaultVariants: { color: 'primary', rounded: 'base', variant: 'normal' },\n },\n);\n\nfunction SegmentedControl(props: {\n options: {\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n }[];\n defaultValue?: string;\n value?: string;\n onValueChange?: (d: string) => void;\n className?: string;\n size?: 'sm' | 'base';\n variant?: 'light' | 'normal';\n color?: 'primary' | 'secondary' | 'tertiary' | 'quaternary' | 'foreground';\n rounded?: 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';\n disabled?: boolean;\n buttonStyle?: {\n active?: React.CSSProperties;\n items?: React.CSSProperties;\n };\n classNames?: {\n control?: string;\n items?: string;\n active?: string;\n };\n}) {\n const {\n options,\n defaultValue,\n onValueChange,\n className,\n size,\n variant,\n color,\n value,\n disabled,\n rounded,\n buttonStyle,\n classNames,\n } = props;\n const [selected, setSelected] = useState(value || defaultValue || options[0].value);\n\n const handleSelect = (value: string) => {\n setSelected(value);\n onValueChange?.(value);\n };\n\n const setSelectedEffect = useEffectEvent((value?: string) => {\n setSelected(value || defaultValue || options[0].value);\n });\n\n useEffect(() => {\n setSelectedEffect(value);\n }, [value]);\n\n return (\n <div\n className={cn(\n segmentedButtonVariants({ size, variant, rounded }),\n className,\n classNames?.control,\n )}\n >\n {options.map((option) => (\n <button\n disabled={disabled || option.disabled}\n type='button'\n key={option.value}\n onClick={() => handleSelect(option.value)}\n className={cn(\n 'rounded-sm px-4 py-2 text-sm transition-all duration-200',\n selected === option.value\n ? buttonSelectedVariants({ color, rounded, variant })\n : buttonUnselectedVariants({ color, rounded, variant }),\n classNames?.items,\n selected === option.value && classNames?.active,\n )}\n style={\n buttonStyle?.items || (selected === option.value && buttonStyle?.active)\n ? {\n ...(buttonStyle?.items || {}),\n ...(selected === option.value ? buttonStyle?.active : {}),\n }\n : undefined\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport { SegmentedControl };\n"],"mappings":"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"}