UNPKG

@ark-ui/vue

Version:

A collection of unstyled, accessible UI components for Vue, utilizing state machines for seamless interaction.

59 lines (56 loc) 1.68 kB
import { computed, toRefs } from 'vue'; import { useVModel } from '../use-v-model.js'; function useCheckboxGroup(props, emit) { const interactive = computed(() => !(props.disabled || props.readOnly)); const { defaultValue } = toRefs(props); const valueRef = useVModel(props, "modelValue", emit, { defaultValue: defaultValue?.value ?? [], passive: props.modelValue === void 0, eventName: ["valueChange", "update:modelValue"] }); const isChecked = (val) => { return valueRef.value.some((v) => String(v) === String(val)); }; const toggleValue = (val) => { isChecked(val) ? removeValue(val) : addValue(val); }; const addValue = (val) => { if (!interactive.value) return; if (isChecked(val)) return; valueRef.value = valueRef.value.concat(val); }; const removeValue = (val) => { if (!interactive.value) return; valueRef.value = valueRef.value.filter((v) => String(v) !== String(val)); }; const getItemProps = (itemProps) => { return { checked: itemProps.value != null ? isChecked(itemProps.value) : void 0, onCheckedChange() { if (itemProps.value != null) { toggleValue(itemProps.value); } }, name: props.name, disabled: props.disabled, readOnly: props.readOnly, invalid: props.invalid }; }; const setValue = (value) => { valueRef.value = value; }; return computed(() => ({ isChecked, value: valueRef.value, name: props.name, disabled: props.disabled, readOnly: props.readOnly, invalid: props.invalid, addValue, setValue, toggleValue, getItemProps })); } export { useCheckboxGroup };