import { clamp, isFunction } from '@robonen/stdlib'; import { computed, isReadonly, ref, toValue, type ComputedRef, type MaybeRef, type MaybeRefOrGetter, type WritableComputedRef } from 'vue'; /** * @name useClamp * @category Math * @description Clamps a value between a minimum and maximum value * * @param {MaybeRefOrGetter} value The value to clamp * @param {MaybeRefOrGetter} min The minimum value * @param {MaybeRefOrGetter} max The maximum value * @returns {ComputedRef} The clamped value * * @example * const value = ref(10); * const clampedValue = useClamp(value, 0, 5); * * @example * const value = ref(10); * const clampedValue = useClamp(value, () => 0, () => 5); * * @since 0.0.1 */ export function useClamp(value: MaybeRef, min: MaybeRefOrGetter, max: MaybeRefOrGetter): WritableComputedRef; export function useClamp(value: MaybeRefOrGetter, min: MaybeRefOrGetter, max: MaybeRefOrGetter): ComputedRef { if (isFunction(value) || isReadonly(value)) return computed(() => clamp(toValue(value), toValue(min), toValue(max))); const _value = ref(value); return computed({ get() { return clamp(_value.value, toValue(min), toValue(max)); }, set(newValue) { _value.value = clamp(newValue, toValue(min), toValue(max)); }, }); }