Checkbox

Checkbox는 여러 항목 중 복수 선택을 가능하게 하는 입력 컴포넌트입니다.
import { Checkbox } from '@vapor-ui/core';

export default function DefaultCheckbox() {
    return <Checkbox.Root />;
}

Property


Size

Checkbox 사이즈는 md, lg 로 제공합니다.

import { Checkbox } from '@vapor-ui/core';

export default function CheckboxSize() {
    return (
        <div className="flex items-center gap-4">
            <Checkbox.Root size="md" />
            <Checkbox.Root size="lg" />
        </div>
    );
}

Disabled

비활성화된 상태의 Checkbox입니다. 사용자가 상호작용할 수 없습니다.

import { Checkbox } from '@vapor-ui/core';

export default function CheckboxDisabled() {
    return (
        <div className="flex items-center gap-4">
            <Checkbox.Root disabled />
            <Checkbox.Root disabled checked />
        </div>
    );
}

Invalid

유효하지 않은 상태의 Checkbox입니다. 폼 검증 실패 시 사용됩니다.

import { Checkbox } from '@vapor-ui/core';

export default function CheckboxInvalid() {
    return (
        <div className="flex items-center gap-4">
            <Checkbox.Root invalid />
            <Checkbox.Root invalid checked />
        </div>
    );
}

Indeterminate

부분적으로 선택된 상태의 Checkbox입니다. 하위 항목 중 일부만 선택되었을 때 사용됩니다.

import { useState } from 'react';

import { Checkbox, Text } from '@vapor-ui/core';

export default function CheckboxIndeterminate() {
    const [checkedItems, setCheckedItems] = useState({
        apple: false,
        banana: false,
        orange: false,
    });

    const allChecked = Object.values(checkedItems).every(Boolean);
    const isIndeterminate = Object.values(checkedItems).some(Boolean) && !allChecked;

    const handleSelectAll = (checked: boolean) => {
        setCheckedItems({
            apple: checked,
            banana: checked,
            orange: checked,
        });
    };

    const handleItemChange = (item: keyof typeof checkedItems, checked: boolean) => {
        setCheckedItems((prev) => ({
            ...prev,
            [item]: checked,
        }));
    };

    return (
        <div className="space-y-3">
            <Text
                render={<label />}
                typography="body2"
                className="flex items-center gap-2.5 font-medium"
            >
                <Checkbox.Root
                    checked={allChecked}
                    indeterminate={isIndeterminate}
                    onCheckedChange={handleSelectAll}
                    className="flex items-center gap-3"
                />
                Select All Fruits
            </Text>
            <div className="ml-6 space-y-2">
                <Text
                    render={<label />}
                    typography="body2"
                    className="flex items-center gap-2.5 cursor-pointer"
                >
                    <Checkbox.Root
                        checked={checkedItems.apple}
                        onCheckedChange={(checked) => handleItemChange('apple', checked)}
                        className="flex items-center gap-3"
                    />
                    Apple
                </Text>

                <Text
                    render={<label />}
                    typography="body2"
                    className="flex items-center gap-2.5 cursor-pointer"
                >
                    <Checkbox.Root
                        checked={checkedItems.banana}
                        onCheckedChange={(checked) => handleItemChange('banana', checked)}
                        className="flex items-center gap-3"
                    />
                    Banana
                </Text>

                <Text
                    render={<label />}
                    typography="body2"
                    className="flex items-center gap-2.5 cursor-pointer"
                >
                    <Checkbox.Root
                        checked={checkedItems.orange}
                        onCheckedChange={(checked) => handleItemChange('orange', checked)}
                        className="flex items-center gap-3"
                    />
                    Orange
                </Text>
            </div>
        </div>
    );
}

Read Only

사용자는 체크박스 상태를 변경할 수 없지만, 현재 상태를 확인할 수 있도록 허용하는 상태입니다.

import { Checkbox, Flex } from '@vapor-ui/core';

export default function CheckboxReadOnly() {
    return (
        <Flex gap="$000" flexDirection="column">
            <label className="flex items-center gap-2">
                <Checkbox.Root readOnly defaultChecked>
                    <Checkbox.Indicator />
                </Checkbox.Root>
                읽기 전용 (체크됨)
            </label>
            <label className="flex items-center gap-2">
                <Checkbox.Root readOnly>
                    <Checkbox.Indicator />
                </Checkbox.Root>
                읽기 전용 (체크 안됨)
            </label>
            <label className="flex items-center gap-2">
                <Checkbox.Root readOnly indeterminate>
                    <Checkbox.Indicator />
                </Checkbox.Root>
                읽기 전용 (혼합 상태)
            </label>
        </Flex>
    );
}

Props Table


Checkbox.Root

Checkbox의 메인 컨테이너 컴포넌트입니다. Base UI의 Checkbox를 래핑하여 size, disabled, invalid 등의 속성을 제공하며, 체크, 미체크, 불확정 상태를 시각적으로 나타냅니다. 이 컴포넌트는 button 요소를 기반으로 합니다.

PropDefaultType
render?
button
ReactElementfunction
checked?
undefined
booleanindeterminate
defaultChecked?
undefined
booleanindeterminate
onCheckedChange?
undefined
function
disabled?
false
boolean
required?
undefined
boolean
name?
undefined
string
value?
on
string
size?
md
mdlg
invalid?
false
boolean
indeterminate?
false
boolean
readOnly?
false
boolean
className?
undefined
string
children?
undefined
ReactNode

Checkbox.Indicator

체크박스의 체크 상태를 시각적으로 표시하는 인디케이터 컴포넌트입니다. 체크됨/미체크됨/불확정 상태에 따라 적절한 아이콘을 표시합니다. Root 컴포넌트에서 자동으로 포함되므로 대부분의 경우 직접 사용할 필요가 없습니다. 이 컴포넌트는 div 요소를 기반으로 합니다.

PropDefaultType
render?
div
ReactElementfunction
forceMount?
undefined
boolean
className?
undefined
string