registry:component
Motion Checkbox
v1.0.0ga
Checkbox primitive with motion-enhanced state transitions.
Registry Endpoint
Open JSONhttps://registry.aavya.com/r/ui-motion-checkbox.json
npx shadcn@latest add https://registry.aavya.com/r/ui-motion-checkbox.json
Live Preview
Usage Snippet
import MotionCheckbox from '@/components/ui/motion-checkbox.tsx'
export default function Example() {
return (
<div className="p-6">
<MotionCheckbox />
</div>
)
}
Source Preview
'use client'
import * as React from 'react'
import * as CheckboxPrimitive from '@radix-ui/react-checkbox'
import { motion, type HTMLMotionProps } from 'motion/react'
import { cn } from '@/lib/utils'
type CheckboxProps = React.ComponentProps<typeof CheckboxPrimitive.Root> & HTMLMotionProps<'button'>
function Checkbox({ className, onCheckedChange, ...props }: CheckboxProps) {
const [isChecked, setIsChecked] = React.useState(props?.checked ?? props?.defaultChecked ?? false)
React.useEffect(() => {
if (props?.checked !== undefined) setIsChecked(props.checked)
}, [props?.checked])
const handleCheckedChange = React.useCallback(
(checked: boolean) => {
setIsChecked(checked)
onCheckedChange?.(checked)
},
[onCheckedChange]
)
return (
<CheckboxPrimitive.Root {...props} onCheckedChange={handleCheckedChange} asChild>
<motion.button
data-slot='checkbox'
className={cn(
'peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-colors duration-500 outline-none focus-visible:r