/** * Viewport hook shared by the chart components. * Hydration-safe: SSR and the first client render report desktop; the * media-query subscription flips the value after mount. */ 'use client'; import { useEffect, useState } from 'react'; export function useIsMobile(maxWidth = 640): boolean { const [isMobile, setIsMobile] = useState(false); useEffect(() => { const mq = window.matchMedia(`(max-width: ${maxWidth}px)`); const update = () => setIsMobile(mq.matches); update(); mq.addEventListener('change', update); return () => mq.removeEventListener('change', update); }, [maxWidth]); return isMobile; }