The dashboard crashed with "Maximum update depth exceeded" on mobile
(iOS/Opera Touch), fingerprinted as PHP-LARAVEL-47. Root cause is upstream:
recharts < 3.9.0 measures the chart via useElementOffset, whose measuring
callback ref depended on the last bounding box, so every setState changed the
ref identity and React re-invoked it, re-measuring on each render. Because it
read viewport-relative getBoundingClientRect().top/left with a 1px threshold,
any mid-render viewport shift (the iOS URL bar showing/hiding on scroll) moved
the box > 1px on each commit, feeding an unbounded render->measure->setState
loop until React aborted at the nested-update limit and white-screened the
dashboard.
recharts 3.9.0 rewrote useElementOffset to drive measurement off a
ResizeObserver with a stable callback ref (deps no longer include the last
bounding box), which breaks the loop. Same crash family as the
ChartTooltipPortal loop fixed in #657, but a distinct root cause inside recharts.
package.json keeps its ^3.7.0 range (already satisfied by 3.9.2, so the npm
lockfile that only feeds release-it tooling stays in sync); bun.lock, the lock
that feeds the production 'bun run build' bundle, is pinned to 3.9.2. A code
comment on ResponsiveContainer records the >= 3.9.0 requirement.
Refs PHP-LARAVEL-47