import { isRef, ref, toValue, type MaybeRefOrGetter, type MaybeRef, type Ref } from 'vue'; export interface UseToggleOptions { truthyValue?: MaybeRefOrGetter, falsyValue?: MaybeRefOrGetter, } export function useToggle( initialValue?: MaybeRef, options?: UseToggleOptions, ): { value: Ref, toggle: (value?: Truthy | Falsy) => Truthy | Falsy }; export function useToggle( initialValue: MaybeRef = false as Truthy | Falsy, options: UseToggleOptions = {}, ) { const { truthyValue = true as Truthy, falsyValue = false as Falsy, } = options; const value = ref(initialValue) as Ref; const toggle = (newValue?: Truthy | Falsy) => { if (newValue !== undefined) { value.value = newValue; return value.value; } const truthy = toValue(truthyValue); const falsy = toValue(falsyValue); value.value = value.value === truthy ? falsy : truthy; return value.value; }; return { value, toggle }; }