.agents/skills/frontend-large-feature-architecture/references/virtualized-lists.md
Virtualized lists are render-boundary infrastructure. They should calculate which item shells are visible and position those shells. They should not make each row own feature state, effects, subscriptions, data loading, and workflows.
Langfuse uses @tanstack/react-virtual for virtualization. Find current
callsites before changing a virtualized surface, then apply the same
state-boundary rules as any large feature.
The broken shape is:
That is not a small memoization bug. It is leaked state ownership.
The fix is to make scroll and measurement state update the smallest possible integration boundary. If scrolling changes a virtual item offset, unchanged row content should not receive new semantic props, refire effects, or recreate expensive derived data.
Google Translate mutates rendered DOM after React has committed it. It can wrap text nodes, replace text, and change element dimensions outside React's data flow. React and TanStack Virtual do not know whether the changed DOM represents stable translated content or a transient mutation.
Do not opt product UI out of translation with translate="no" unless product
explicitly chooses that. Langfuse must work under browser translation.
data-index on the row element TanStack treats as the
item.measureElement with externally mutated translated DOM
in text-heavy rows.ResizeObserver reads the row shell.virtualizer.resizeItem(index, height).src/features/*; shared
src/components/* row exports should be context-free.measureElement with fixed estimates or controlled measurement.