{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "checkbox", "type": "registry:ui", "title": "Checkbox", "description": "Pressable checkbox with lucide check icon.", "registryDependencies": [ "https://raw.githubusercontent.com/truongnat/rnui/main/registry/dist/nativewind/utils.json", "https://raw.githubusercontent.com/truongnat/rnui/main/registry/dist/nativewind/theme.json" ], "dependencies": [ "lucide-react-native" ], "files": [ { "path": "registry/shared/ui/checkbox.tsx", "type": "registry:ui", "target": "components/ui/checkbox.tsx", "content": "import { Check } from 'lucide-react-native';\nimport { useContext, useState } from 'react';\nimport {\n type GestureResponderEvent,\n Pressable,\n type PressableProps,\n StyleSheet,\n type ViewStyle,\n} from 'react-native';\nimport { cn, FormFieldContext, useThemeColor } from '@/lib/utils';\n\nexport interface CheckboxProps extends Omit {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** Mirrors shadcn `aria-invalid` — destructive border. Auto-detected from FormField error. */\n invalid?: boolean;\n className?: string;\n}\n\nexport function Checkbox({\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n invalid,\n className,\n disabled,\n style,\n onPress,\n ...props\n}: CheckboxProps) {\n const [uncontrolledChecked, setUncontrolledChecked] =\n useState(defaultChecked);\n const isControlled = controlledChecked !== undefined;\n const checked = isControlled ? controlledChecked : uncontrolledChecked;\n\n const colors = useThemeColor();\n const field = useContext(FormFieldContext);\n const isInvalid = invalid ?? !!field?.error;\n\n const handlePress = (e: GestureResponderEvent) => {\n if (disabled) return;\n const next = !checked;\n if (!isControlled) {\n setUncontrolledChecked(next);\n }\n onCheckedChange?.(next);\n onPress?.(e);\n };\n\n const dynamicStyle: ViewStyle = {\n backgroundColor: checked ? colors.primary : colors.background,\n borderColor: isInvalid\n ? colors.destructive\n : checked\n ? colors.primary\n : colors.input || colors.border,\n opacity: disabled ? 0.5 : 1,\n };\n\n return (\n \n {checked ? (\n \n ) : null}\n \n );\n}\n\nconst styles = StyleSheet.create({\n base: {\n width: 20,\n height: 20,\n borderRadius: 4,\n borderWidth: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n" } ] }