feat: add scrub.snapToCandles — crosshair snaps to candle centers - #264
Merged
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Owner
|
Reviewed, fixed, and QA'd. What I found:
What I fixed:
Validation:
The PR is mergeable now; CI is rerunning on the updated head. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
ScrubConfig.snapToCandles(defaultfalse): quantizes the scrub X to the hovered candle's center, so the crosshair — and everything derived from it (time, tooltip, trailing dim) — jumps tick-to-tick, TradingView-style, instead of gliding.Why a pure helper in
crosshairSharedsnapScrubXToCandleCenter(the inverse ofcomputeScrubTime, then the forward mapping of the picked candle's center viapickCandleAtTime) is unit-testable under Jest; the gesture-side gate stays a thin istanbul-ignored worklet like its siblings.Why LiveChart only
LiveChartSerieshas no candle mode, so the flag is wired throughuseCrosshair's two plain-scrub call sites (startPlainScrub/updatePlainScrub) and is inert everywhere else. Default behavior is unchanged.Test plan
resolveScrubdefault/carry cases; snap-math unit tests (center quantization across a bucket, live candle, gap + pre-history pass-through, zero-width plot/window guards); render coverage in candle and line mode with the flag on.npm run verifygreen; coverage thresholds hold (branches 91.6, functions 95.3, lines 97.0, statements 96.2).🤖 Generated with Claude Code