# Checkbox **Category**: react **URL**: https://www.heroui.com/docs/react/migration/checkbox **Source**: https://raw.githubusercontent.com/heroui-inc/heroui/refs/heads/v3/apps/docs/content/docs/react/migration/(components)/checkbox.mdx > Migration guide for Checkbox from HeroUI v2 to v3 *** Refer to the [v3 Checkbox documentation](/docs/react/components/checkbox) for complete API reference, styling guide, and advanced examples. This guide only focuses on migrating from HeroUI v2. ## Structure Changes In v2, `Checkbox` accepted children as the label: ```tsx import { Checkbox } from "@heroui/react"; export default function App() { return Option; } ``` In v3, Checkbox uses a compound component pattern with explicit subcomponents: ```tsx import { Checkbox, Label } from "@heroui/react"; export default function App() { return ( ); } ``` ## Key Changes ### 1. Component Structure **v2:** Simple component with children as label **v3:** Compound components: `Checkbox.Control`, `Checkbox.Indicator`, `Checkbox.Content` ### 2. Label Handling **v2:** Label passed as children directly to `Checkbox` **v3:** Label must be wrapped in `Checkbox.Content` using the `Label` component ### 3. Prop Changes | v2 Prop | v3 Location | Notes | |---------|-------------|-------| | `onValueChange` | `Checkbox` | Use `onChange` | | `color` | - | Removed (use Tailwind on Checkbox.Control) | | `size` | - | Removed (use Tailwind e.g. `size-4`, `size-5`) | | `radius` | - | Removed (use Tailwind e.g. `rounded-sm`) | | `lineThrough` | - | Removed (use Tailwind `line-through` on label) | | `icon` | - | Use custom content in `Checkbox.Indicator` | | `classNames` | - | Use `className` on parts | | `disableAnimation` | - | Removed | | — | `variant` | New prop: `"primary"` (default) or `"secondary"` for lower emphasis styling | ### 4. CheckboxGroup Changes **v2:** `CheckboxGroup` (separate component) with `label` prop and simple `Checkbox` children **v3:** `CheckboxGroup` (separate component) with `Label`/`Description` as children and compound `Checkbox` structure For migrating checkbox groups, see the [CheckboxGroup migration guide](/docs/react/migration/checkbox-group). ## Migration Examples ### Controlled Checkbox ```tsx import { useState } from "react"; const [isSelected, setIsSelected] = useState(false); Subscribe ``` ```tsx import { useState } from "react"; import { Label } from "@heroui/react"; const [isSelected, setIsSelected] = useState(false); ``` ### Checkbox with Description ```tsx {/* v2 doesn't have built-in description support */} Option

Description text

```
```tsx import { Checkbox, Label, Description } from "@heroui/react"; Description text ```
### CheckboxGroup ```tsx import { Checkbox, CheckboxGroup } from "@heroui/react"; Buenos Aires Sydney San Francisco ``` ```tsx import { CheckboxGroup, Checkbox, Label, Description } from "@heroui/react"; Choose all that apply ``` ### Colors and Sizes ```tsx {/* Colors */} Primary {/* Sizes */} Medium ``` ```tsx {/* Colors - use Tailwind classes */} {/* Sizes - use Tailwind classes */} ``` ### Custom Icon/Indicator ```tsx }> Option ``` ```tsx {({isSelected}) => isSelected ? : null} ``` ### Variants v3 introduces a `variant` prop with `"primary"` (default) and `"secondary"` options: ```tsx {/* Primary variant (default) */} {/* Secondary variant - lower emphasis, suitable for Surface components */} ``` ### Indeterminate State ```tsx Option ``` ```tsx ``` ## Render Props Pattern v3 Checkbox supports a render prop pattern that provides state information: ```tsx {({isSelected, isIndeterminate, isHovered, isPressed, isFocused, isDisabled}) => ( <> )} ``` `Checkbox.Indicator` also supports a render prop pattern, providing the same state values. This is useful for rendering custom indicator content based on the checkbox state: ```tsx {({isSelected, isIndeterminate}) => isIndeterminate ? : isSelected ? : null } ``` Available render props: - `isSelected` - Whether checkbox is checked - `isIndeterminate` - Whether checkbox is in indeterminate state - `isHovered` - Whether checkbox is hovered - `isPressed` - Whether checkbox is currently pressed - `isFocused` - Whether checkbox is focused - `isFocusVisible` - Whether checkbox should show focus indicator - `isDisabled` - Whether checkbox is disabled - `isReadOnly` - Whether checkbox is read only ## Styling Changes ### v2: `classNames` Prop ```tsx ``` ### v3: Direct `className` Props ```tsx ``` ## Component Anatomy The v3 Checkbox follows this structure: ``` Checkbox (Root) ├── Checkbox.Control │ └── Checkbox.Indicator └── Checkbox.Content (optional) ├── Label (required if using Content) └── Description (optional) ``` ## Summary 1. **Component Structure**: Must use compound components (`Control`, `Indicator`, `Content`) 2. **Label Handling**: Labels must use `Label` component inside `Checkbox.Content` 3. **onValueChange → onChange**: Event handler prop renamed 4. **Color Removed**: Use Tailwind CSS classes on `Checkbox.Control` 5. **Size Removed**: Use Tailwind CSS classes on `Checkbox.Control` 6. **Radius Removed**: Use Tailwind CSS classes on `Checkbox.Control` 7. **LineThrough Removed**: Use Tailwind `line-through` class on label 8. **Icon Prop Removed**: Use custom content in `Checkbox.Indicator` 9. **CheckboxGroup**: Same component name; use `Label`/`Description` as children and compound `Checkbox` structure 10. **ClassNames Removed**: Use `className` props on individual components 11. **New `variant` Prop**: Supports `"primary"` (default) and `"secondary"` for lower emphasis styling 12. **Indicator Render Props**: `Checkbox.Indicator` accepts a render function with state values (`isSelected`, `isIndeterminate`, etc.)