/** * DOM utility functions for common operations */ /** * Clamps a value between a minimum and maximum * @param value - The value to clamp * @param min - The minimum allowed value * @param max - The maximum allowed value * @returns The clamped value */ export function clamp(value: number, min: number, max: number): number { return Math.min(Math.max(value, min), max); } /** * Safely adds an event listener with proper cleanup * @param target - The target element or window/document * @param event - The event type * @param handler - The event handler function * @param options - Event listener options * @returns A cleanup function to remove the listener */ export function addEventListenerWithCleanup( target: EventTarget, event: string, handler: EventListener, options?: boolean | AddEventListenerOptions ): () => void { target.addEventListener(event, handler, options); return () => target.removeEventListener(event, handler, options); } /** * Checks if a click event occurred outside of a specified element * @param event - The click event * @param element - The element to check against * @returns True if the click was outside the element */ export function isClickOutside(event: MouseEvent, element: HTMLElement | null): boolean { return element ? !element.contains(event.target as Node) : true; }