switch.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132
  1. 'use client';
  2. import { Switch as SwitchPrimitive } from '@base-ui/react/switch';
  3. import { cn } from '@/lib/utils';
  4. function Switch({
  5. className,
  6. size = 'default',
  7. ...props
  8. }: SwitchPrimitive.Root.Props & {
  9. size?: 'sm' | 'default';
  10. }) {
  11. return (
  12. <SwitchPrimitive.Root
  13. data-slot="switch"
  14. data-size={size}
  15. className={cn(
  16. 'peer group/switch relative inline-flex shrink-0 items-center rounded-full border border-transparent transition-all outline-none group-has-[:focus-visible]/field-label:border-transparent group-has-[:focus-visible]/field-label:ring-0 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-[size=default]:h-[18.4px] data-[size=default]:w-[32px] data-[size=sm]:h-[14px] data-[size=sm]:w-[24px] dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 data-checked:bg-primary data-unchecked:bg-input dark:data-unchecked:bg-input/80 data-disabled:cursor-not-allowed data-disabled:opacity-50',
  17. className,
  18. )}
  19. {...props}
  20. >
  21. <SwitchPrimitive.Thumb
  22. data-slot="switch-thumb"
  23. className="pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 group-data-[size=default]/switch:data-checked:translate-x-[calc(100%-2px)] group-data-[size=sm]/switch:data-checked:translate-x-[calc(100%-2px)] dark:data-checked:bg-primary-foreground group-data-[size=default]/switch:data-unchecked:translate-x-0 group-data-[size=sm]/switch:data-unchecked:translate-x-0 dark:data-unchecked:bg-foreground"
  24. />
  25. </SwitchPrimitive.Root>
  26. );
  27. }
  28. export { Switch };