import { unref } from "vue"; export const useScroll = () => { /** * Scrolls to a specific component within a scroll container * @param {Ref} targetRef - Reference to the component to scroll to * @param {Ref} containerRef - Reference to the Quasar ScrollArea component * @param {Object} options - Scroll options * @param {number} options.offset - Offset from the top in pixels (default: 50) * @param {number} options.duration - Animation duration in milliseconds (default: 150) * @returns {boolean} - Whether the scroll was successful */ const scrollToComponent = (targetRef, containerRef, options = {}) => { const { offset = 50, duration = 150 } = options; const target = unref(targetRef); const container = unref(containerRef); const targetElement = target?.$el; const containerElement = container?.$el; if (!targetElement || !containerElement) { console.warn("useScroll: Target or container element not found"); return false; } try { let currentElement = targetElement; let offsetTop = 0; // Calculate total offset up to the scroll container while (currentElement && currentElement !== containerElement) { offsetTop += currentElement.offsetTop; currentElement = currentElement.offsetParent; } if (!currentElement) { console.warn("useScroll: Target is not a child of the container"); return false; } const targetPosition = Math.max(0, offsetTop - offset); container.setScrollPosition("vertical", targetPosition, duration); return true; } catch (error) { console.error("useScroll: Error while scrolling", error); return false; } }; return { scrollToComponent, }; };