Skip to content

[diffs] CodeView: Ctrl+F#833

Draft
amadeus wants to merge 36 commits into
beta-1.3from
amadeus/codeview-find
Draft

[diffs] CodeView: Ctrl+F#833
amadeus wants to merge 36 commits into
beta-1.3from
amadeus/codeview-find

Conversation

@amadeus

@amadeus amadeus commented Jun 18, 2026

Copy link
Copy Markdown
Member

A WIP vibe coded ctrl+f for CodeView.

amadeus and others added 30 commits June 15, 2026 17:21
* Remove history coalesce

* Fix selction/crate not updated when do "redo" command

* Remove visualColumns.ts

* Move editor ts files

* Refactor textarea buffer

* Rename `EditSnippet` type to `TextareaSnapshot`

* Remove `Editor` component, introduce the `Editor` class for `File` component

* Update demo

* Update editor constants to set text and background color to transparent

* Rewrite rerender logic

* Format

* Remove dead code

* Fix caret postion on empty line

* Improve `renderSelectionRange` performance by using cached DOM elements

* Support range selection in textarea

* Improve rerender performance

* Use piece table data sturcture for the text document

* refactor

* Add public `setSelection` method for the `Editor` class

* Add `FileContentsWithLineOffsets` interface and update related components to support line offsets and line count. Refactor file handling to utilize computed line offsets for rendering and iteration.

* Add `updateRenderCacheAt` method to `FileRenderer` and `File` classes for improved rendering. Refactor theme handling in `Editor` to utilize a dedicated method for color map retrieval.

* Refactor file iteration logic by removing `iterateOverFile` utility and replacing it with direct loops in `VirtualizedFile` and `FileRenderer` components. Update line offset computation to exclude trailing newlines in multi-line files while maintaining correct line counts. Enhance tests to validate line counting behavior.

* Remove EOF field

* Remove text length fields from HistoryEntry and related test cases in EditHistory

* Rename class `EditHistory` to `EditStack`

* Refactor EditStack and PieceTable to use a unified text slice interface.

* Refactor PieceTable and TextDocument to improve line offset handling and remove unnecessary EOL trimming logic.

* Refactor `Editor` to utilize new dirty line resolution logic, enhancing performance and accuracy in line tracking.

* Fix multi-cursor textarea sync

* Refactor Editor rendering logic for improved performance and reduce direct DOM manipulation.

* Add grammer cache

* Enhance line position caching in Editor for improved performance and accuracy.

* Refactor indentation handling in Editor and remove unused utility function for improved clarity and performance.

* Fix testing types

* Improve performance of the `getCharacterX` method

* Improve caching mechanism for enhanced performance.

* Add maxEntries feature to EditStack for managing undo history size

* Refactor

* Enhance PieceTable and TextDocument to trim line endings in getLineText method, improving text handling consistency. Update related tests for accuracy.

* Refactor

* Add `BackgroundTokenzier` class

* Improve performance

* Fix hightlight bug

* Add `--diffs-bg-caret` css property

* Fix input

* Fix selection range rendering

* Fix prebuildStateStackCache funciton

* Update `TOKENIZE_MAX_LINE_LENGTH` to 10,000

* Add `DiffsEditor` interface

* Fix `lineAnnotations` argument on `triggerEdit` invoke

* Refactor editor edit method to accept onChange callback directly and update demo to log file changes

* Clean up

* typo

* Refactor BackgroundTokenizer to use message-based scheduling.

* Refactor editor focus handling by removing redundant event listeners and updating CSS selectors for caret visibility.

* Refactor

* Fix `toTextareaSelectionDirection` function

* Refactor

* Update `DiffsEditor` types

* Add line annotation handling

* Add documentation for `hasVisibleLineAnnotation` function.

* Get rid of enum

* Clean up

* Refactor

* Update editor CSS

* Support text wrap

* Clean up

* Fix line y/wrap cache

* Fix line cache

* Copies leading indentation onto the new line after Enter

* Focus textare after undo/redo

* Move multi-selection functions to editorSelection module

* Add support for handling leading indentation deletion in applyTextChangeToSelections

* Fix selection glitch bug

* Add extendSelection command

* Fix `focusTextare` function

* Fix `resolveTextareaChange` function

* Remove unnecessary target check in mouseup event listener in Editor class

* Fix textarea selction direction

* Fix selection bg color for safair

* Clean up

* Fix shift select

* Refactor

* Refactor

* Fix shift select delay

* Coalesce edit stack entries for simple typing or backspace operations.

* Add Support forward-delete coalescing for edit history

* docs: add docs for editStack module

* Refctor

* Fix 'documentStart' and 'documentEnd' commands

* Rewrite selection handle logic

* Fix shouldCoalesceEditStackEntry function

* Update demo

* Add `removeEditor` for File component

* Add react api

* Clean up

* Update demo app

* Refactor useFileInstance to remove redundant editor cleanup logic

* Fix `computeLineOffsets` function

* typo

* Update editor style

* Fix `getOrCreateLineOffSets` method

* Refactor line count and annotation handling in File component; remove hasVisibleLineAnnotation utility

* Fix lines deletion crocss virtul viewport

* Remove `normalizeSelectionsForDocument` function

* Fix `edit` function

* Add editor sub-module

* Use `contenteditable` model

* Fix line wrap

* Fix wrap line

* Fix selection on mobile

* Update editor style

* Fix resize handling

* Add editor overlay layer

* Cleanup

* Add `DiffsEditableComponent` types

* Fix `VirtualizedFile` component

* Update `DiffsEditableComponent` type

* Add editor demo

* Fix slection rendering

* Update editor demo app

* Fix VirualizedFile component

* Update editor demo app

* Fix some selection bugs

* Update demo app

* Refactor findNextNonOverlappingSubstring method into PieceTable and TextDocument

* Refactor

* feat: Implement line jump

* Fix selection rendering when scrolling

* Improve tokenzier performance

* feat: simple search pannel

* Update editor demo app

* Fix jump

* Update search UI

* Add lag radar

* Fix virtualizer

* Fix render range after typing

* Fix editor tokenzier cache

* Fix search input focus

* Update log rader position

* Improve piece table performance

* Refactor

* Add lag radar

* Fix line count for empty documents

* Fix offscreen lines flush

* Introduce gutter width tracking

* refactor

* Refactor

* fix import

* Add 'expandSelectionDocStart' and 'expandSelectionDocEnd' commands

* Fix buffer height

* Add matches text for the search pancel

* Disable preious/next icon when no matches

* Update style.css

* feat: Support `quiteEdit` action

* Update edtior demo app

* Refactor

* Update demo app

* Update demo app

* Fix girdRow when render quick edit UI

* Move testing files

* Clean up

* Add searchPanel.ts

* Fix expandCollapsedSelectionToWord to match when the cursor is immediately touching one of the word's boundaries

* clean up

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Fix typo

* Clean up searchPanel and quickEdit when swith file

* Rebase to beta-1.2

* Fix selection after clean up quick edit widget

* Fix virtual buffer

* Fix `updateWindowSelection` method of Editor class

* Fix render range when typing new line at the end of the file

* Fix buffer when adding large lines

* [editor] Support 'deleteHardLineForward' input

* Add `insertTranspose` input

* Move `change` handler to options

* Update css

* Merge beta-1.2 changes

* Fix emply line rendering

* Add search settings UI

* Merge branch 'main' into editor

* Support FileDiff component

* Update `DiffsEditableComponent` interface

* Fix `getSelectionAnchor` function

* Fix text measurement for emoji

* Increase delay for diff rendering in FileDiff component

* Update types

* Add unit testings for text measue functions

* Clean up dirty render cache

* Fix `lineAnnotations` re-rendering

* Disable gutter utility when editing

* Add global css

* Fix scrollToLine method

* Refactor selection handling in Editor class to initialize selections properly and streamline rendering logic

* Fix diffs components

* Allow to create selection from gutter interaction

* Fix focus

* Fix browser compatibility

* Support dual themes

* Fix selection bugs

* refactor

* Add `Metrics` class

* Clean up

* Fix wrap selection rendering on safari

* Add `QuickEditContext` types

* Fix caret scroll margin when search panel is on

* Refactor search panel widget

* Fix selection position

* Update react components

* Update search panel CSS

* Fix quick edit

* Add editor docs

* Fix react hooks for editor

* Update editor demo component

* Update Quick Edit docs

* Update `diffStyle` and `expandUnchanged` options when editing

* demo: remove editor route

* Update docs

* Update docs

* Update examples

* Reset selection when 'Esc' key pressed

* Fix selection focus

* Add 'enable edit' shortcut('e')

* Handle the arrow key events to scroll to the cursor position manually

* Merge of overlapping selections

* Handle cursor moving events

* Fix scroll margin top

* Add debug logging option to Editor class

* Fix selection bugs

* Fix selection renering for unified `FileDiff`

* Reset ignore selection change flag on mouse up event

* Clean up

* fix bun.lock

* Add editor theme style

* Refactor

* Fix react types

* Fix last line index calculation

* Update condition for marking DOM dirty in VirtualizedFile component

* Throw if someone is trying to edit with no editor instance

* Update `mergeFileDiffOptions` function

* `lineOffsets` -> `lines`

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…d for the `DiffsEditor` (#766)

* feat(editor): add pause and resume functionality for background tokenization

* pref(editor): Introduce `postponeBackgroundTokenizeToNextFrame` method for the `DiffsEditor`

* fix

* Add debug option for the tokenzier

* Update types

* Refactor

* typo

* Reduce requestAnimationFrame calls
* chore: empty commit for beta branch

* Homepage FileDiff editor demo

* Style kbd elements, add beta badge to docs content, redo table for keyboards, few edits

* docs(editor): add MultiFileDiff React example

Document editing with MultiFileDiff alongside File and FileDiff in the React integration tabs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs(editor): use parseDiffFromFile in FileDiff React example

Align the editor FileDiff tab with the pre-parsed fileDiff prop API.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Update editor react examples

* docs(editor): document worker pool usage with useTokenTransformer

Add a Worker Pool section with tabbed vanilla/React examples, and enable
useTokenTransformer on the docs site worker pool so editing works off-thread.

Co-authored-by: Cursor <cursoragent@cursor.com>

* format

* Remove toolbar, put reset into header metadata

* add link

* little copy editing

* Update homepage example to include file and diff

* redo reset

---------

Co-authored-by: Amadeus Demarzi <amadeusdemarzi@gmail.com>
Co-authored-by: Je Xia <i@jex.me>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Rounded selection boundaries
* Search panel refactor/redesign
* Introduce `postponeBackgroundTokenizeToNextFrame` method for the `DiffsEditor`
Removing BETA badge from Virtualization
* [diffs/editor] refactor editor API

* Refactor

* refactor

* fix

* Refactor

* refactor

* refactor

* Add blur method to Editor class for improved focus management

* Update docs

* Refactor
* Includes editor code refactor
* Find/Replace functionality
fix(diffs): Handle IME composition input

Fixes the following issue:
1. Open an editable diffs editor and place the caret in content.
2. Start a CJK IME or accented/dead-key composition.
3. Type a preview candidate, then commit it or press Esc to cancel.

Previously, each preview beforeinput was prevented and warned as an
unknown input type, so the browser could not show native preview text
and canceled composition text could still be inserted on compositionend.

Let insertCompositionText beforeinput events stay with the browser.
Track composition updates and only commit non-canceled compositionend
data into the editor model. Add regression coverage for preview,
commit, warning noise, and canceled composition text.

Also guard the selectionchange handler against browsers and embedded
WebViews that lack Selection.getComposedRanges, which previously threw
out of the listener on every selection change and left the editable
surface unusable.
* [diffs/editor] Support editing unified diffs and refresh diff view on edit

Allow the editor to edit unified diffs by syncing the render view against
the FileDiff metadata (additions) instead of a separate addition file, and
mark deletion/annotation lines non-editable in unified mode. Replace the
post-edit `updateLineType` path with `refreshDiffView`/`fastRefreshDiffView`
so the diff view re-renders correctly after edits.

* Fix home live editor reset when toggling mode

Include `mode` in the editable surface memo deps so switching modes
recreates the surface instead of reusing a stale instance.

---------

Co-authored-by: Mark Otto <markdotto@gmail.com>
* New homepage editor

Co-authored-by: Cursor <cursoragent@cursor.com>

* revamp

* feat(diffs/editor): color marker hover popover by severity

Tag the marker hover popover with its severity so the popover renders as
a solid chip filled in the severity color with white text, mirroring the
underline. Drops the inset surface ring on severity popovers so the fill
reads as one solid color.

* fix(diffs/editor): pin dual-theme surface tokenizer to themeType

Only observe the document/system color scheme when the surface follows
it (themeType: 'system'). A surface pinned to an explicit dark/light
theme must re-tokenize after an edit with the same theme the SSR markup
used; otherwise edited tokens fall back to the default foreground.

* chore(demo): adapt marker message to severity-filled popover

The marker hover popover is now filled with the severity color, so let
the icon and description inherit the popover's white text instead of
painting their own color (which would vanish against the fill).

* refactor(docs): drive shortcut tables from ShortcutKeys

Extract the platform-modifier logic into usePlatformModifier and add a
ShortcutKeys component that renders a shortcut from plain string arrays,
so a serializable shortcuts table can drive rendering without inlining
JSX per row. Move the tree a11y shortcut table onto this model.

* style(docs): default AUI editor demo to split diff

Switch the homepage editor demo from unified to split diff style.

* feat(docs): add Edit feature page

Add a dedicated /edit feature page showcasing edit mode: live editing,
selection actions, lint markers, find-in-file, undo history, and
keyboard shortcuts, plus a reference section. Wire it into the header,
mobile menu, and footer navigation, and link to it from the homepage
agent demo. Rename the LiveEditor toggle from file/diff to a read-only
Review vs editable Edit of the same File surface.

* Redesign selection action icon a smidge

* improve edit hero and content

* vibe update docs

* copy and layout updates

* fixes mb

* Fix AUI demo and more

* fucking sick

* better

* better again

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
The contenteditable host advertises role="textbox" but had no
accessible name, so screen readers announced an unlabeled text
field. Label it with the current file name in __syncRenderView.

The content element is reused across file switches, so the label
is refreshed on every sync rather than only when the element is
first initialized.
A touch or pen tap on a line number ran the gutter selection logic,
setting #isGutterMouseDown and attaching a document mousemove listener.
The global pointerup that clears that state bails for non-mouse
pointers, so the flag stayed stuck true and the listener leaked, with a
fresh one added on every later gutter tap. The flag also feeds
isMouseDown(), which the marker renderer reads.

Add the same pointer-type guard the content pointerdown already uses so
non-mouse taps bail early. Route both select-listener reassignment sites
(the gutter drag tracker and the Safari annotation-hover workaround)
through a #replaceSelectEventListeners helper that disposes the prior
batch before assigning, keeping the dispose-before-replace invariant in
one place so the sites cannot drift.
Editing a diff was re-diffing the whole file twice for every keystroke
that adds or removes a line (Enter, Backspace that merges lines, typing
over a multi-line selection).

For such edits the editor calls updateRenderCache and then
applyDocumentChange in the same pass, and both rebuild hunk metadata
with a full recompute. The recompute in updateRenderCache runs against
a half-updated line array and is immediately discarded by
applyDocumentChange, which recomputes from the authoritative document
text — so it is pure wasted work.

It cannot be made incremental: updateDiffHunks falls back to a full
recompute whenever the addition and deletion line counts differ, which
is exactly a line-count change. Since applyDocumentChange already does
the authoritative recompute, the editor now tells updateRenderCache to
skip the hunk recompute on these edits. The per-line token and text
updates still run, so the rendered output is unchanged.
necolas and others added 6 commits June 17, 2026 18:39
editor.applyEdits applied edits to the buffer but called #applyChange
with selections=undefined, so the selection-update path was skipped
and #selections was never remapped against the edit. After a
programmatic edit before the caret, getState().selections, the native
window selection, and the on-screen caret all pointed at stale
offsets, and the next keystroke was computed from the wrong position.

Capture the selection edges and edit ranges as pre-edit offsets, remap
each selection edge through the applied edits (an edge inside a
replaced range collapses to the end of the replacement; direction is
preserved), and pass the remapped selections to #applyChange. When
updateHistory is set, record them as the entry's after-selections so
redo restores the same caret. This matches every other edit path,
which already remaps selections.

Behavior change: a programmatic applyEdits now repositions the caret
and, like undo/redo and other edits, focuses the editor and scrolls
the caret into view. Hosts that previously relied on applyEdits
leaving focus untouched will now see the editor take focus.

Add test/editorApplyEdits.test.ts, which drives the public API through
the jsdom harness: caret shifts down for an insert above it, both
edges of a range shift while direction is preserved, the caret holds
for an edit after it, and redo restores the remapped caret under
updateHistory. Verified with moonx diffs:test (552 pass),
diffs:typecheck, and root:format root:lint.
remapOffsetThroughEdits treated an offset equal to an edit's start as
sitting before the edit, so inserting text at a collapsed caret left
the caret on the left of the new text and the next keystroke landed in
front of it. Use right gravity at the edit-start boundary so an offset
at or after an edit's start follows the replacement, matching how
typing advances the caret past inserted characters.

Add a regression test covering an insert at the collapsed caret.
Verified with moonx diffs:test (553 pass), diffs:typecheck, and
root:format root:lint.
The editor caret animated with `blinking 1.2s infinite` regardless of
the OS reduced-motion preference. Add a `prefers-reduced-motion: reduce`
media query that drops the animation so the caret renders as a solid
bar instead of pulsing.
I need to more deeply review this... it's probably a fuck ton
@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
pierre-docs-diffs Ready Ready Preview Jun 18, 2026 1:46am
pierre-docs-diffshub Ready Ready Preview Jun 18, 2026 1:46am
pierre-docs-trees Ready Ready Preview Jun 18, 2026 1:46am
pierrejs-diff-demo Ready Ready Preview Jun 18, 2026 1:46am

Request Review

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.

4 participants