Components
Checkbox
Checkbox is unchecked
'use client';
import { Checkbox } from '@/components/ui/checkbox';
import { useState } from 'react';
export function CheckboxDemo() {
const [checked, setChecked] = useState(false);
return (
<div className='flex flex-col items-center justify-center gap-4'>
<label htmlFor='checkbox' className='flex items-center gap-2'>
<Checkbox
id='checkbox'
checked={checked}
onCheckedChange={setChecked}
/>
<span className='typography-body-medium'>Checkbox</span>
</label>
<div className='flex flex-col gap-2'>
<p className='typography-body-medium'>
Checkbox is {checked ? 'checked' : 'unchecked'}
</p>
</div>
</div>
);
}
Checkbox Group
'use client';
import { Checkbox, CheckboxGroup } from '../ui/checkbox';
import React from 'react';
export function CheckboxGroupDemo() {
const fruits = ['fuji-apple', 'gala-apple', 'granny-smith-apple'];
const [value, setValue] = React.useState<string[]>([]);
return (
<CheckboxGroup
defaultValue={['fuji-apple']}
className='flex flex-col gap-3'
allValues={fruits}
value={value}
onValueChange={setValue}
>
<label
id='apples-caption'
className='typography-body-medium flex items-center gap-2'
>
<Checkbox parent name='apples' />
Apples
</label>
{fruits.map((fruit) => (
<label
htmlFor={fruit}
key={fruit}
className='typography-body-medium flex items-center gap-2 pl-4'
>
<Checkbox value={fruit} />
{fruit.replace(/-/g, ' ')}
</label>
))}
</CheckboxGroup>
);
}
Manual Installation
'use client';
import {
Checkbox as BaseCheckbox,
CheckboxGroup,
} from '@base-ui-components/react';
import * as React from 'react';
import { cn } from '@/lib/utils';
import { CheckIcon, MinusIcon } from 'lucide-react';
function Checkbox({
className,
...props
}: React.ComponentProps<typeof BaseCheckbox.Root>) {
return (
<BaseCheckbox.Root
className={cn(
'group border-grey-200 bg-grey-100 data-checked:text-white-1000 data-indeterminate:text-white-1000 dark:border-grey-600 dark:bg-grey-700 data-disabled:bg-grey-300 dark:data-disabled:bg-grey-500 data-checked:focus-visible:inset-ring-white-1000 size-4 shrink-0 rounded-md border outline-none focus-visible:border-blue-500 disabled:cursor-not-allowed data-checked:border-blue-600 data-checked:bg-blue-500 data-checked:focus-visible:inset-ring data-disabled:border-none data-indeterminate:border-blue-600 data-indeterminate:bg-blue-500 dark:focus-visible:border-blue-400 dark:data-checked:border-blue-400 dark:data-checked:bg-blue-500 dark:data-indeterminate:border-blue-400',
className,
)}
{...props}
>
<BaseCheckbox.Indicator
className='group-data-[disabled]:text-white-1000 dark:group-data-disabled:text-grey-800 flex items-center justify-center text-current transition-none [&__svg]:size-4 [&_svg]:pb-[1px]'
render={(props, state) => (
<span {...props}>
{state.indeterminate ? <MinusIcon /> : <CheckIcon />}
</span>
)}
></BaseCheckbox.Indicator>
</BaseCheckbox.Root>
);
}
export { Checkbox, CheckboxGroup };