Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Rolling transforms rebuild and publish every presented point on every frame, even with no pointer or focus

Open
#201 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
48/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript

Research direction

Start with the rolling transform presentation track in packages/charts-core/src/motion.ts and the handlePresentationPoints path in packages/charts-core/src/renderer.ts. Reproduce by streaming data into a rolling line chart with no pointer or focus, then profile a roll to confirm the per-frame work. Compare the two proposed approaches and check that presented points are available when interaction begins while idle frames avoid unnecessary rebuilds, publishes, and filtering.

Written by the indexing model from the issue text.

Description

A rolling-window chart pays a per-frame cost proportional to its row count for points nothing reads.

  • Each rolling transform plan gets a presentation track whose apply re-creates every point of the element, plus the exiting ones, as { ...point, x, y } keyed by pointIdentity(point) (motion.ts:3442-3453).
  • Every tick then calls lifecycle.publish (motion.ts:3999), which copies the whole map into a new array (motion.ts:3598).
  • The renderer's handlePresentationPoints filters that array with viewportInteractionPoints before it checks for a pointer or a focused point, so with neither the result is discarded (renderer.ts:1223-1246).

Use case: a live line that streams back to back 600 ms rolls of about 220 smoothed rows per mark (area, line and tail). With per-track timers, the points track is 77% of each frame's sampling (0.13 ms per call). In a production build the motion tick is about 0.23 ms per frame, about 131 ms of requestAnimationFrame time per 6 s of streaming, with no pointer over the chart. The DOM writes the roll needs are a small part of that.

Repro

Mount any line chart with a rolling window and keep appending data with no pointer and no focus. Profile one roll: apply runs on every frame for every row, and handlePresentationPoints runs viewportInteractionPoints every frame and then returns.

Proposal

Either:

  1. derive presented points lazily from the plan's transform when a subscriber or getPresentationPoints actually needs them; or
  2. skip the per-frame rebuild, publish and filter while there is no pointer, focus or tooltip, and publish once when one appears.

Related: #195 (rolling windows). Checked against 57774e14a1a86081eddb3a23523724a40da05640 (v1.1.0).

Dominant language
TypeScript
Stars
819
Forks
49
Avg merge
12h 9m
Merged PRs (30d)
6

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from TanStack/charts

All issues in TanStack/charts

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.