Skip to content

feat: support grabbing text nodes - #606

Open
aidenybai wants to merge 14 commits into
mainfrom
codex/grab-text-nodes
Open

feat: support grabbing text nodes#606
aidenybai wants to merge 14 commits into
mainfrom
codex/grab-text-nodes

Conversation

@aidenybai

@aidenybai aidenybai commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Summary

  • select direct text runs inside mixed-content elements as precise grab targets
  • preserve existing element selection for text-only buttons, headings, paragraphs, and other ordinary elements
  • carry text-node bounds and labels through hover, copy feedback, prompt mode, context-menu actions, and same-origin iframe coordinates
  • include the selected text plus the parent element's component/source context in clipboard metadata

Why

DOM hit testing returns elements, so text beside nested links, icons, or formatted children could only be grabbed as part of its parent element. This adds a secondary text-node hit test for mixed-content elements while retaining the parent element as the compatibility and source-resolution anchor.

Impact

Users can point React Grab at an individual direct text run without changing the public element-based API or making every text-only control behave like a text-node target.

Validation

  • nr build
  • E2E_ENVIRONMENT=vite-plus-development nr test:e2e:framework -- e2e/selection.spec.ts — 18 passed
  • nr typecheck
  • nr lint
  • formatter check scoped to all nine changed files

Summary by cubic

Adds precise direct text selection inside mixed-content elements in react-grab, with per-line targeting and stable anchors. Feedback, cursors, and context now lock to text bounds through scroll, reflow, DOM replacement, brief node disconnects, and across actions.

  • New Features

    • Direct text-node hit testing with per-line (wrapped-line) selection and quoted labels (20-char cap). Clipboard entries use getTextNodeReferenceContext to include the selected text plus parent component/stack; works via mouse, toolbar, Enter, keyboard Context Menu, and same-origin iframes.
    • Text-node bounds drive labels, grabbed boxes, prompt cursor, and context menu; padding clicks fall back to element bounds; text-only elements remain element targets.
  • Bug Fixes

    • Anchors persist through reflow and node replacement using normalized line index and relinking; disambiguates duplicates and ignores whitespace-only nodes; clears stale text targets when starting Shift multi-select.
    • Preserves the latest measured text bounds for labels and grabbed boxes across overlay refreshes and actions, including brief text-node disconnects; resyncs on reconnect. Stabilizes interactions with deterministic key-hold durations, a focused-input activation helper, and tighter prompt input focus/assertions.

Written for commit 43c0a33. Summary will update on new commits.

Review in cubic


Note

Medium Risk
Touches core selection, copy, and overlay state in core/index.tsx with new DOM text hit-testing and relinking; behavior is heavily covered by new e2e and unit tests but regressions in edge cases (duplicated text, iframes) are still plausible.

Overview
Adds precise selection of direct text runs inside elements that also have child nodes (e.g. text next to links or <strong>), while text-only elements still behave as normal element targets.

Pointer hit-testing now resolves a grabbable Text node under the cursor; selection boxes, labels, grabbed boxes, prompt/comment cursors, and context menus use text-line bounds (including wrapped lines) instead of the full parent box. Copy/prompt flows pass an optional textNode through the store, labels, and runCopyFlow, with getTextNodeReferenceContext so clipboard metadata quotes the text plus parent stack/source context.

Anchoring (text-node-anchors, normalized rect index in createTextNodeBounds) keeps the same logical line across reflow, DOM replacement, and brief disconnects; relinking is wired into relinkLiveTargets alongside elements.

E2E gains shared activation helpers/constants, stabler edit-panel and prompt Escape tests, and a large selection.spec.ts suite for mixed/wrapped text, scroll, shift-drag, comment mode, and DOM churn. Edit panel defers search-input focus until the dropdown mounts.

Reviewed by Cursor Bugbot for commit 43c0a33. Bugbot is set up for automated code reviews on this repo. Configure here.

@vercel

vercel Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
react-grab-storybook Ready Ready Preview, Comment Jul 26, 2026 2:16am
react-grab-website Ready Ready Preview, Comment Jul 26, 2026 2:16am

@pkg-pr-new

pkg-pr-new Bot commented Jul 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@react-grab/cli@606
npm i https://pkg.pr.new/grab@606
npm i https://pkg.pr.new/react-grab@606

commit: 43c0a33

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Performance report — this PR vs base branch

🔴 2 regressions · 🟢 1 improvement across 77 scenarios.

Scenario Metric Base → PR Verdict
drag-sweep-massive-grid Interaction latency (INP) 468ms → 720ms (+54%) 🔴 worse
animation-scheduling-controls/legacy-production-count Graphics CPU over paused 3% → 6% (+140%) 🔴 worse
heavy-virtual-hover-sweep GPU process CPU 46% → 36% (-22%) 🟢 better

A metric counts as changed only past per-metric thresholds sized to measured shared-runner variance on identical code: interaction latency ±10% and 16ms (measured in 8ms steps), frame times ±30%, long-task/LoAF sums ±10% and 500ms, memory ±25% and 512KB / 60 nodes, process CPU ±20% and 10 points, GPU-process CPU ±20% and 3 points, animation ticks ±20% and 3/s, draws/tick ±20% and 0.05, hardware GPU ±20% and 10 points, compositor production ±20% and 3fps / 5 duty-cycle points, composited layers ±20% and 2 layers / 0.5 viewport areas, rendering stages ±20% and 1ms; any ms metric with a ≥100ms baseline needs ±30%.

All 73 standard scenarios (full numbers)
Scenario Interaction latency (INP) Main-thread blocking (long tasks) Janky frames (LoAF total) Frame time (p95) Frame time (worst) Heap growth Leaked DOM nodes Browser process CPU GPU process CPU Renderer process CPU Animation ticks Active animation timeline duty Animation-attributable renderer CPU Animation-attributable GPU-process CPU Animation-attributable graphics CPU Hardware GPU busy Compositor frame production Compositor production duty cycle Composited content layers Composited surface area Painted area Paint work CSS selector matching CSS selector attempts Compositor work
activate-deactivate-dense-animations 0.0ms → 0.0ms (0%) 22553ms → 21876ms (-3%) 21244ms → 20507ms (-3%) 633ms → 592ms (-7%) 667ms → 633ms (-5%) 165KB → 96KB (-42%) 0 → 0 (0%) 184% → 183% (-1%) 39% → 38% (-3%) 145% → 145% (0%)
activate-large-dom-sparse-animations 0.0ms → 0.0ms (0%) 193ms → 178ms (-8%) 1229ms → 1266ms (+3%) 66.8ms → 66.8ms (0%) 83.3ms → 91.7ms (+10%) 67KB → 76KB (+13%) 0 → 0 (0%) 139% → 141% (+2%) 42% → 44% (+5%) 95% → 95% (0%)
activate-with-many-animations 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 138KB → 77KB (-44%) 0 → 0 (0%) 155% → 158% (+2%) 68% → 69% (+1%) 84% → 86% (+3%)
arrow-navigation-storm 24.0ms → 36.0ms (+50%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 132KB → 124KB (-6%) 0 → 0 (0%) 84% → 86% (+3%) 28% → 31% (+8%) 52% → 52% (0%)
context-menu-arrow-navigation 40.0ms → 40.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 213KB → 224KB (+5%) 1 → 1 (0%) 175% → 177% (+1%) 130% → 130% (0%) 43% → 42% (-2%)
context-menu-open-close-cycle 32.0ms → 32.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 303KB → 294KB (-3%) 1 → 1 (0%) 103% → 102% (0%) 71% → 71% (0%) 27% → 27% (0%)
copy-multi-element-batch 40.0ms → 40.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 286KB → 280KB (-2%) 1 → 1 (0%) 79% → 81% (+2%) 25% → 25% (-1%) 51% → 53% (+3%)
copy-then-deactivate-stress 64.0ms → 56.0ms (-12%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.2ms → 33.3ms (0%) 79KB → 65KB (-18%) 0 → 0 (0%) 167% → 167% (0%) 105% → 105% (0%) 59% → 59% (+1%)
copy-under-saturated-network 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 289KB → 302KB (+4%) 2 → 2 (0%) 14% → 14% (+1%) 8% → 8% (+5%) 6% → 6% (-2%)
copy-under-saturated-network (sourceResolveMs) 8006ms → 8005ms (0%)
deactivate-with-many-frozen-elements 52.0ms → 52.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 25.1ms (+49%) 503KB → 11KB (-98%) 0 → 0 (0%) 122% → 119% (-3%) 44% → 41% (-6%) 75% → 74% (-1%)
deep-element-stack-hover 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 63KB → 70KB (+11%) 0 → 0 (0%) 47% → 46% (-2%) 16% → 16% (0%) 27% → 26% (-4%)
dom-rerender-during-selection 44.0ms → 40.0ms (-9%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.3ms → 25.0ms (-25%) 216KB → 218KB (+1%) 0 → 0 (0%) 170% → 174% (+2%) 102% → 103% (+1%) 57% → 59% (+4%)
drag-commit-massive-grid 1236ms → 1236ms (0%) 6788ms → 7103ms (+5%) 6741ms → 7051ms (+5%) 658ms → 658ms (0%) 1192ms → 1192ms (0%) 269KB → 481KB (+79%) 1 → 14 (+1300%) 113% → 112% (-1%) 6% → 6% (-7%) 106% → 106% (0%)
drag-freeze-animation-storm 900ms → 888ms (-1%) 3043ms → 2966ms (-3%) 3301ms → 3134ms (-5%) 167ms → 175ms (+5%) 850ms → 833ms (-2%) 327KB → 338KB (+3%) 0 → 0 (0%) 155% → 156% (+1%) 30% → 29% (-3%) 121% → 123% (+1%)
drag-rapid-zigzag 48.0ms → 40.0ms (-17%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 169KB → 170KB (+1%) 0 → 0 (0%) 53% → 56% (+4%) 18% → 19% (+1%) 25% → 27% (+11%)
drag-selection-sweep 48.0ms → 48.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 199KB → 205KB (+3%) 4 → 4 (0%) 34% → 35% (+1%) 11% → 11% (+2%) 20% → 20% (+1%)
drag-sweep-massive-grid 468ms → 720ms (+54%) 🔴 worse 9548ms → 9907ms (+4%) 9398ms → 9760ms (+4%) 400ms → 400ms (0%) 583ms → 708ms (+21%) 737KB → 737KB (0%) 8 → 8 (0%) 108% → 106% (-1%) 8% → 8% (-3%) 94% → 93% (-1%)
drag-with-autoscroll 48.0ms → 40.0ms (-17%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 156KB → 161KB (+3%) 18 → 18 (0%) 37% → 35% (-6%) 13% → 11% (-13%) 20% → 19% (-3%)
heavy-all-activate-toggle 0.0ms → 0.0ms (0%) 80.0ms → 56.0ms (-30%) 1390ms → 1284ms (-8%) 66.7ms → 66.7ms (0%) 83.3ms → 91.6ms (+10%) 143KB → 146KB (+2%) 0 → 0 (0%) 158% → 156% (-1%) 44% → 38% (-14%) 112% → 116% (+4%)
heavy-all-copy-cross-section 152ms → 148ms (-3%) 417ms → 443ms (+6%) 451ms → 525ms (+16%) 91.6ms → 91.7ms (0%) 100ms → 100ms (0%) 293KB → 229KB (-22%) -5 → -5 (0%) 134% → 129% (-4%) 24% → 22% (-8%) 108% → 104% (-3%)
heavy-all-drag-sweep 232ms → 228ms (-2%) 394ms → 361ms (-8%) 452ms → 486ms (+8%) 25.0ms → 25.1ms (0%) 200ms → 200ms (0%) 250KB → 306KB (+22%) 3 → 3 (0%) 116% → 116% (0%) 21% → 21% (+1%) 82% → 82% (0%)
heavy-all-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 54.1ms → 0.0ms (-100%) 16.8ms → 16.7ms (-1%) 33.4ms → 33.4ms (0%) 5520KB → 5506KB (0%) 0 → 0 (0%) 125% → 128% (+3%) 44% → 45% (+1%) 77% → 79% (+3%)
heavy-charts-activate-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 26.1ms (was 0) 16.8ms → 16.8ms (0%) 25.0ms → 33.3ms (+33%) 42KB → 53KB (+26%) 0 → 0 (0%) 138% → 159% (+15%) 41% → 44% (+7%) 94% → 112% (+19%)
heavy-charts-drag-select 120ms → 120ms (0%) 61.0ms → 59.0ms (-3%) 89.4ms → 89.4ms (0%) 16.8ms → 16.8ms (0%) 83.2ms → 83.3ms (0%) 175KB → 126KB (-28%) 7 → 0 (-100%) 95% → 94% (-1%) 24% → 23% (-3%) 62% → 61% (-2%)
heavy-charts-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 77KB → 78KB (+1%) 0 → 0 (0%) 45% → 45% (0%) 15% → 14% (-2%) 27% → 28% (+3%)
heavy-charts-tooltip-sweep-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) -404KB → -397KB (+2%) 0 → 0 (0%) 112% → 112% (0%) 13% → 14% (+4%) 93% → 94% (+1%)
heavy-dashboard-drag-sweep 56.0ms → 56.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.3ms → 33.3ms (0%) 175KB → 251KB (+43%) -6 → 1 (+117%) 58% → 59% (+3%) 19% → 19% (0%) 29% → 30% (+1%)
heavy-dashboard-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 120KB → 122KB (+2%) 4 → 4 (0%) 77% → 78% (+1%) 41% → 42% (+2%) 34% → 35% (+2%)
heavy-dashboard-selection-under-rerender 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 120KB → 119KB (-1%) 0 → 0 (0%) 14% → 14% (+2%) 7% → 7% (0%) 6% → 6% (+3%)
heavy-heatmap-crosshair-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 33.3ms → 33.3ms (0%) 33.4ms → 33.4ms (0%) -407KB → -398KB (+2%) 0 → 0 (0%) 128% → 128% (0%) 12% → 12% (0%) 112% → 112% (0%)
heavy-heatmap-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -328KB → -333KB (-2%) 0 → 0 (0%) 83% → 83% (0%) 38% → 38% (0%) 40% → 40% (0%)
heavy-table-drag-select-rows 64.0ms → 64.0ms (0%) 0.0ms → 0.0ms (0%) 53.1ms → 51.3ms (-3%) 16.7ms → 16.8ms (+1%) 33.4ms → 33.3ms (0%) 153KB → 171KB (+12%) 4 → 1 (-75%) 67% → 63% (-5%) 20% → 18% (-12%) 35% → 35% (0%)
heavy-table-expand-rows-passive 120ms → 112ms (-7%) 766ms → 801ms (+5%) 796ms → 830ms (+4%) 66.6ms → 50.1ms (-25%) 83.3ms → 83.5ms (0%) 576KB → 68KB (-88%) 0 → 0 (0%) 71% → 71% (-1%) 6% → 6% (-3%) 62% → 61% (-2%)
heavy-table-filter-typing-passive 192ms → 200ms (+4%) 1585ms → 1585ms (0%) 2114ms → 2074ms (-2%) 66.7ms → 66.7ms (0%) 192ms → 192ms (0%) -2849KB → -1854KB (+35%) 1 → 1 (0%) 106% → 105% (0%) 4% → 4% (-3%) 100% → 99% (-1%)
heavy-table-hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 69KB → 69KB (0%) 4 → 4 (0%) 90% → 84% (-7%) 41% → 35% (-14%) 46% → 47% (+2%)
heavy-table-multi-select-copy 64.0ms → 64.0ms (0%) 0.0ms → 0.0ms (0%) 37.0ms → 36.2ms (-2%) 16.8ms → 16.8ms (0%) 33.5ms → 33.4ms (0%) -366KB → -372KB (-2%) -136 → -139 (-2%) 84% → 84% (+1%) 26% → 26% (+2%) 54% → 55% (+1%)
heavy-table-paginate-passive 160ms → 160ms (0%) 1556ms → 1553ms (0%) 1667ms → 1661ms (0%) 83.4ms → 83.3ms (0%) 117ms → 133ms (+14%) -450KB → -441KB (+2%) 0 → 0 (0%) 81% → 82% (+2%) 4% → 4% (0%) 71% → 73% (+2%)
heavy-table-sort-passive 272ms → 272ms (0%) 4241ms → 4130ms (-3%) 4897ms → 4661ms (-5%) 66.7ms → 66.7ms (0%) 233ms → 233ms (0%) -129KB → -1320KB (-923%) 0 → 0 (0%) 85% → 86% (0%) 4% → 3% (-5%) 77% → 78% (0%)
heavy-virtual-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 79KB → 104KB (+32%) 4 → 4 (0%) 86% → 79% (-8%) 46% → 36% (-22%) 🟢 better 37% → 39% (+7%)
heavy-virtual-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 230KB → 238KB (+3%) 0 → 0 (0%) 98% → 98% (0%) 41% → 41% (0%) 54% → 54% (+1%)
heavy-virtual-scroll-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -431KB → -458KB (-6%) 0 → 0 (0%) 85% → 85% (0%) 18% → 19% (+1%) 63% → 63% (-1%)
hover-deep-nested-dom 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 56KB → 62KB (+11%) 0 → 0 (0%) 44% → 42% (-5%) 11% → 11% (-3%) 30% → 28% (-6%)
hover-dense-flat-dom 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 142KB → 24KB (-83%) 0 → 0 (0%) 94% → 97% (+3%) 45% → 47% (+4%) 46% → 47% (+2%)
hover-in-selection-mode 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 137KB → 151KB (+10%) 0 → 0 (0%) 74% → 72% (-3%) 33% → 32% (-5%) 38% → 37% (-2%)
hover-over-animated-elements 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 11KB → 12KB (+9%) 0 → 0 (0%) 13% → 13% (-1%) 7% → 7% (-4%) 5% → 5% (-3%)
idle-after-activation 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 133KB → 155KB (+17%) 0 → 0 (0%) 12% → 13% (+8%) 7% → 7% (0%) 4% → 5% (+22%) 57/s → 59/s (+2%) 0% → 0% (0%) 1% → 1% (0%) 0% → -0% (0%) 1% → 0% (-97%) 10fps → 10fps (+5%) 27% → 27% (+1%) 18 → 18 (0%) 3.7× → 3.7× (0%) 21.0× → 21.0× (0%) 6.8ms → 7.5ms (+9%) 0.0ms → 0.0ms (0%) 0 → 0 (0%) 135ms → 145ms (+7%)
interference-canvas-hover-markers 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 81KB → 68KB (-16%) 0 → 0 (0%) 102% → 96% (-6%) 51% → 45% (-12%) 48% → 47% (-2%)
interference-canvas-paint-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 0KB → 0KB (0%) 0 → 0 (0%) 55% → 56% (+2%) 25% → 26% (+3%) 29% → 29% (0%)
interference-editor-hover-with-swallowed-pointermove 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 59KB → 37KB (-37%) 0 → 0 (0%) 66% → 66% (+1%) 39% → 39% (+1%) 25% → 25% (0%)
interference-editor-typing-passive 24.0ms → 24.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 81KB → 80KB (-1%) 0 → 0 (0%) 74% → 73% (-1%) 7% → 7% (-4%) 60% → 60% (-1%)
interference-gauntlet-activate-toggle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 33.4ms → 16.8ms (-50%) 41.6ms → 33.3ms (-20%) 147KB → 275KB (+87%) 6 → 24 (+300%) 196% → 195% (-1%) 76% → 63% (-17%) 118% → 129% (+9%)
interference-gauntlet-drag-sweep 108ms → 100ms (-7%) 176ms → 169ms (-4%) 159ms → 180ms (+13%) 25.0ms → 16.8ms (-33%) 66.7ms → 66.7ms (0%) 478KB → 481KB (+1%) 65 → 65 (0%) 203% → 199% (-2%) 67% → 65% (-3%) 111% → 110% (-1%)
interference-gauntlet-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 136KB → 87KB (-36%) 0 → 0 (0%) 183% → 171% (-6%) 73% → 67% (-9%) 106% → 102% (-4%)
interference-hijacked-scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 120KB → 125KB (+4%) 0 → 0 (0%) 91% → 88% (-4%) 48% → 46% (-4%) 42% → 42% (-2%)
interference-hijacked-scroll-passive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 16.8ms → 16.8ms (0%) 78KB → 88KB (+13%) 0 → 0 (0%) 75% → 67% (-11%) 41% → 34% (-18%) 32% → 30% (-7%)
interference-kanban-app-drag-passive 32.0ms → 24.0ms (-25%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 281KB → 195KB (-31%) 0 → 0 (0%) 60% → 55% (-9%) 3% → 3% (-5%) 51% → 45% (-12%)
interference-kanban-grab-drag-select 56.0ms → 56.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 33.3ms → 16.8ms (-50%) 170KB → 178KB (+5%) 4 → 4 (0%) 62% → 63% (+1%) 15% → 15% (+2%) 27% → 27% (+2%)
interference-kanban-hover-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 45KB → 56KB (+24%) 0 → 0 (0%) 64% → 64% (+1%) 33% → 33% (+1%) 29% → 28% (-2%)
interference-raf-mutator-hover 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -423KB → -432KB (-2%) 0 → 0 (0%) 156% → 157% (+1%) 65% → 66% (+2%) 89% → 89% (0%)
interference-toast-hover-churn 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (+1%) 33.3ms → 16.8ms (-50%) 25KB → 88KB (+252%) 0 → 0 (0%) 110% → 107% (-3%) 70% → 68% (-3%) 37% → 36% (-2%)
interference-toast-storm-idle-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 23KB → 31KB (+35%) 0 → 0 (0%) 20% → 20% (-3%) 14% → 14% (0%) 6% → 6% (-8%)
interference-waapi-freeze-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 25.1ms → 16.8ms (-33%) 51KB → 52KB (+2%) 0 → 0 (0%) 181% → 170% (-6%) 59% → 49% (-16%) 119% → 117% (-1%)
interference-waapi-hover-sweep 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) -463KB → -454KB (+2%) 0 → 0 (0%) 161% → 158% (-1%) 68% → 66% (-2%) 90% → 90% (0%)
keyboard-rapid-arrows 40.0ms → 32.0ms (-20%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 117KB → 117KB (0%) 0 → 0 (0%) 92% → 92% (0%) 33% → 32% (-2%) 54% → 55% (+1%)
large-drag-selection 56.0ms → 64.0ms (+14%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 33.4ms → 33.3ms (0%) 158KB → 163KB (+3%) 1 → 1 (0%) 62% → 61% (-1%) 17% → 16% (-3%) 30% → 30% (+1%)
pointermove-storm-synthetic 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 33.4ms → 33.4ms (0%) 33.4ms → 33.4ms (0%) 90KB → 68KB (-24%) 0 → 0 (0%) 139% → 123% (-12%) 29% → 25% (-11%) 108% → 98% (-9%)
prompt-mode-typing 24.0ms → 24.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 182KB → 180KB (-1%) 1 → 1 (0%) 50% → 51% (0%) 14% → 14% (-1%) 31% → 31% (+1%)
rapid-toggle-active-inactive 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) 185KB → 187KB (+1%) 0 → 0 (0%) 139% → 147% (+6%) 72% → 74% (+3%) 63% → 69% (+10%)
scroll-during-selection 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.7ms (0%) 16.8ms → 16.8ms (0%) 121KB → 118KB (-2%) 0 → 0 (0%) 71% → 72% (0%) 42% → 42% (0%) 26% → 27% (+2%)
toolbar-collapse-expand-cycle 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.8ms → 16.7ms (-1%) 16.8ms → 16.8ms (0%) 111KB → 111KB (0%) 0 → 0 (0%) 131% → 133% (+1%) 93% → 94% (+1%) 37% → 38% (+2%)
toolbar-drag-to-edges 44.0ms → 40.0ms (-9%) 0.0ms → 0.0ms (0%) 0.0ms → 0.0ms (0%) 16.7ms → 16.8ms (0%) 16.8ms → 16.8ms (0%) -124KB → -135KB (-9%) 0 → 0 (0%) 137% → 138% (0%) 93% → 93% (+1%) 39% → 39% (-1%)
viewport-resize-during-selection 0.0ms → 0.0ms (0%) 127ms → 53.0ms (-58%) 0.0ms → 0.0ms (0%) 50.0ms → 50.0ms (0%) 50.1ms → 50.0ms (0%) 52KB → 78KB (+50%) 0 → 0 (0%) 125% → 123% (-1%) 48% → 47% (-2%) 74% → 73% (-1%)
All 5 animation scheduling controls (full numbers)
Control Active graphics-pipeline CPU Graphics CPU over paused Animation ticks Draws per animation tick Compositor frame production Compositor production duty cycle Active animation timeline duty
animation-scheduling-controls/finite-static-holds 84% → 85% (+1%) 1% → 2% (+45%) 154/s → 149/s (-3%) 0.0× → 0.0× (-4%) 14fps → 13fps (-4%) 26% → 26% (0%) 21% → 19% (-8%)
animation-scheduling-controls/infinite-stepped 97% → 98% (+1%) 4% → 3% (-16%) 166/s → 167/s (0%) 0.0× → 0.0× (0%) 4fps → 4fps (0%) 7% → 7% (-1%) 100% → 100% (0%)
animation-scheduling-controls/legacy-one-indicator 83% → 83% (+1%) 3% → 3% (+20%) 157/s → 164/s (+4%) 0.3× → 0.3× (+2%) 59fps → 59fps (0%) 100% → 100% (0%) 100% → 100% (0%)
animation-scheduling-controls/animations-paused 181/s → 180/s (0%) 0.0× → 0.0× (0%) 0fps → 0fps (0%) 0% → 0% (0%) 0% → 0% (0%)
animation-scheduling-controls/legacy-production-count 94% → 97% (+3%) 3% → 6% (+140%) 🔴 worse 162/s → 164/s (+1%) 0.3× → 0.3× (+1%) 60fps → 60fps (0%) 100% → 100% (0%) 100% → 100% (0%)

Commit 43c0a33 · full reports in the perf-bench-606 artifact.

@aidenybai
aidenybai marked this pull request as ready for review July 25, 2026 10:09
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx Outdated
Comment thread packages/react-grab/src/utils/create-text-node-bounds.ts
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/store.ts
Comment thread packages/react-grab/src/utils/create-text-node-bounds.ts
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/utils/create-text-node-bounds.ts Outdated
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/utils/create-grabbed-box-bounds.ts
Comment thread packages/react-grab/src/core/text-node-anchors.ts Outdated
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/utils/create-text-node-bounds.ts Outdated
Comment thread packages/react-grab/src/core/index.tsx Outdated
Comment thread packages/react-grab/src/core/store.ts
Comment thread packages/react-grab/src/core/store.ts
Comment thread packages/react-grab/src/core/text-node-anchors.ts Outdated
Comment thread packages/react-grab/src/core/text-node-anchors.ts Outdated
Comment thread packages/react-grab/src/core/index.tsx Outdated
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/core/index.tsx Outdated
Comment thread packages/react-grab/src/core/index.tsx
Comment thread packages/react-grab/src/utils/create-text-node-bounds.ts
Comment thread packages/react-grab/src/core/context.ts
Comment thread packages/react-grab/src/core/index.tsx Outdated
Comment thread packages/react-grab/src/core/text-node-anchors.ts Outdated

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ea022e6. Configure here.

Comment thread packages/react-grab/src/utils/create-label-instance-bounds-list.ts Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant