import type { PlotParams } from 'react-plotly.js'; /** * Shared pieces of the phone-sized Plotly preset. * * Only values that are byte-for-byte the same in every chart live here. The * layouts themselves are deliberately *not* shared: the charts plot different * things and their axis objects differ (date vs. category range, rangeslider, * gridcolor, an explicit domain), so a common "layout builder" would need more * override knobs than it saves. Duplicating three axis lines is cheaper to read * than an abstraction that fits none of the call sites exactly. * * Pair every use of these with `useIsMobile()` — see `@/src/hooks/useIsMobile`. */ /** * Plotly config for phone-sized viewports. * * On phones the plot is only ~200px wide, so Plotly's own chrome has to go: * the modebar does not fit, and `dragmode: false` (set in each layout) makes * Plotly skip its non-passive touchmove handler so a swipe scrolls the page * instead of drawing a zoom box. */ export const MOBILE_PLOT_CONFIG: PlotParams['config'] = { responsive: true, displayModeBar: false, doubleClick: 'reset', }; /** * Plot margins on phones. * * Just enough on the left for a y-axis label and on the bottom for one row of * date ticks; the top and right are trimmed to the frame. Combine with * `automargin: true` on both axes so Plotly can grow these if a tick label * genuinely needs more room. */ export const MOBILE_PLOT_MARGIN = { l: 44, r: 8, t: 8, b: 36 }; /** * Plot height on phones, as a CSS length. * * Viewport-relative so the chart never eats a whole screen, capped so it does * not become a letterbox on a tablet-ish phone in landscape. */ export const MOBILE_PLOT_HEIGHT = 'min(60vh, 360px)';