mirror of
https://github.com/CompassConnections/Compass.git
synced 2026-04-12 10:37:38 -04:00
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import {Switch} from '@headlessui/react'
|
|
import clsx from 'clsx'
|
|
|
|
export type ToggleColorMode = 'primary' | 'warning'
|
|
|
|
export default function ShortToggle(props: {
|
|
on: boolean
|
|
setOn: (enabled: boolean) => void
|
|
disabled?: boolean
|
|
className?: string
|
|
colorMode?: ToggleColorMode
|
|
size?: 'sm'
|
|
testId?: string
|
|
}) {
|
|
const {on, size, setOn, disabled, className, colorMode = 'primary', testId} = props
|
|
|
|
const toggleBaseClasses =
|
|
'group relative inline-flex flex-shrink-0 rounded-full border-2 border-transparent ring-offset-2 transition-colors duration-200 ease-in-out focus:outline-none focus:ring-2'
|
|
const toggleColorClasses = clsx({
|
|
'ring-primary-500 ring-offset-canvas-50 bg-primary-500': on && colorMode === 'primary',
|
|
'ring-amber-500 ring-offset-canvas-50 bg-amber-500': on && colorMode === 'warning',
|
|
'bg-ink-300': !on,
|
|
})
|
|
const toggleEnabledClasses = !disabled
|
|
? 'cursor-pointer hover:opacity-80'
|
|
: 'cursor-not-allowed opacity-30'
|
|
|
|
const knobBaseClasses =
|
|
'bg-canvas-0 pointer-events-none inline-block rounded-full ring-0 transition duration-200 ease-in-out'
|
|
const knobColorClasses = clsx({
|
|
'dark:bg-primary-50': on && colorMode === 'primary',
|
|
'dark:bg-amber-50': on && colorMode === 'warning',
|
|
'dark:bg-ink-600 translate-x-0': !on,
|
|
'translate-x-5': on && size !== 'sm',
|
|
'translate-x-4': on && size === 'sm',
|
|
})
|
|
|
|
return (
|
|
<Switch
|
|
data-testid={testId}
|
|
disabled={disabled}
|
|
checked={on}
|
|
onChange={setOn}
|
|
className={clsx(
|
|
toggleBaseClasses,
|
|
toggleColorClasses,
|
|
toggleEnabledClasses,
|
|
size === 'sm' ? 'h-5 w-9' : 'h-6 w-11',
|
|
className,
|
|
)}
|
|
>
|
|
<span
|
|
aria-hidden="true"
|
|
className={clsx(knobBaseClasses, knobColorClasses, size === 'sm' ? 'h-4 w-4' : 'h-5 w-5')}
|
|
/>
|
|
</Switch>
|
|
)
|
|
}
|