<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Fixes scrollbar flickering in annotator mode by constraining draggable
inputs within the container and suppressing scroll during drag for
smoother movement.
- **Bug Fixes**
- Added containerRef to DraggableTextInput and elementRef to calculate
bounds.
- Constrained drag coordinates to container size and accounted for
scale.
- Prevented default and stopped propagation on mousemove to avoid scroll
jitter.
- Passed containerRef from Annotator to DraggableTextInput.
<sup>Written for commit 959605ddaa5faf23252ee797bf206c6dff46a069.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
## Summary by cubic
Adds an in-app screenshot annotator to the Preview panel for Pro users
so you can capture the current app view, draw or add text, and submit an
annotated image to chat.
- **New Features**
- Pen button in PreviewIframe to toggle annotator; captures a screenshot
via worker messaging and displays it in a Konva canvas.
- Tools: select, freehand draw, and draggable text; supports undo/redo,
delete, and resizing with Transformer. Canvas scales to the container.
Includes a color picker.
- Submit exports a PNG and attaches it to the chat via useAttachments;
prefills the chat input; annotator auto-closes after submit.
- Pro-only: non-Pro users see an upsell screen.
- State atoms added: annotatorModeAtom, screenshotDataUrlAtom,
attachmentsAtom; PreviewIframe now handles dyad-screenshot-response
messages.
- **Dependencies**
- Added konva, react-konva, perfect-freehand, and html-to-image.
- Proxy now injects html-to-image and the new dyad-screenshot-client.js
for screenshot capture.
<sup>Written for commit 580aca271c5993a0dc7426e36e34393e073bd67b.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Prototype visual editing mode for the preview app. Toggle the mode, pick
elements (single or multiple), and edit margin, padding, border,
background, static text, and text styles with live updates, then save
changes back to code.
- **New Features**
- Pen tool button to enable/disable visual editing in the preview and
toggle single/multi select; pro-only.
- Inline toolbar anchored to the selected element for Margin (X/Y),
Padding (X/Y), Border (width/radius/color), Background color, Edit Text
(when static), and Text Style (font size/weight/color/font family).
- Reads computed styles from the iframe and applies changes in real
time; auto-appends px; overlay updates on scroll/resize.
- Save/Discard dialog batches edits and writes Tailwind classes to
source files via IPC; uses AST/recast to update className and text,
replacing conflicting classes by prefix; supports multiple components.
- New visual editor worker to get/apply styles and enable inline text
editing via postMessage; selector client updated for coordinates
streaming and highlight/deselect.
- Proxy injects the visual editor client; new atoms track selected
component, coordinates, and pending changes; component analysis flags
dynamic styling and static text.
- Uses runtimeId to correctly target and edit duplicate components.
- **Dependencies**
- Added @babel/parser for AST-based text updates.
- Added recast for safer code transformations.
<sup>Written for commit cdd50d33387a29103864f4743ae7570d64d61e93.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
…h-replace failure in error message
Addresses part of #1898
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Treat identical SEARCH/REPLACE as a no-op warning and propagate
detailed applySearchReplace errors (incl. fuzzy match stats) to the UI;
add scoped logging and update tests/snapshots.
>
> - **Processors**:
> - `src/pro/main/ipc/processors/search_replace_processor.ts`: Log a
warning (not error) when SEARCH and REPLACE blocks are identical; add
scoped logger; keep content unchanged.
> - `src/ipc/processors/response_processor.ts`: Include detailed failure
reason from `applySearchReplace` in dry-run issues.
> - **Tests & Snapshots**:
> - `search_replace_processor.spec.ts`: Update test to expect success
when blocks are identical.
> - `e2e-tests/...turbo-edits-v2...snapshot`: Reflect detailed error
message with fuzzy match similarity/threshold.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
a394d297d5561ada3bdd197dbb4e6aca6928ad99. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Warn instead of error when search and replace blocks are identical, and
include the specific failure reason in search-replace error messages for
clearer feedback.
- **Bug Fixes**
- Treat identical search/replace blocks as a no-op: log a warning and
return success.
- Bubble up detailed failure reasons to the UI (e.g., no match and fuzzy
similarity/threshold).
- Add scoped logging to the processor and update the e2e snapshot to
reflect new error messaging.
<sup>Written for commit a394d297d5561ada3bdd197dbb4e6aca6928ad99.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->
<!-- CURSOR_SUMMARY -->
> [!NOTE]
> Makes search-replace tolerant to typos/whitespace via two-pass fuzzy
matching with Levenshtein and smart-quote normalization, with clearer
errors and tests.
>
> - **Search/Replace Processor
(`src/pro/main/ipc/processors/search_replace_processor.ts`)**
> - Add two-pass fuzzy matching: quick exact-line prefilter +
Levenshtein scoring (`fastest-levenshtein`).
> - Match flow: exact > whitespace-insensitive > fuzzy; detect ambiguity
and improve error messages with similarity %.
> - Introduce thresholds and limits: `FUZZY_MATCH_THRESHOLD=0.9`,
`EARLY_STOP_THRESHOLD=0.95`, `MAX_FUZZY_SEARCH_TIME_MS=10000`.
> - Normalize text before scoring using `normalizeString` (handles
quotes, dashes, ellipsis, NBSP, soft hyphen, BOM).
> - Preserve indentation for replacements; keep existing
unescape/validation logic.
> - **Utils (`src/utils/text_normalization.ts`)**
> - New `normalizeString` helper for Unicode normalization used by fuzzy
matching.
> - **Tests
(`src/pro/main/ipc/processors/search_replace_processor.test.ts`)**
> - Add cases for typos, smart quotes, below-threshold failure,
exact-over-fuzzy preference, whitespace differences, and ambiguity.
> - **Dependencies**
> - Add `fastest-levenshtein` to `package.json`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
289dab915c37bc4f9ab4bf0209ff3f95a57341fc. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Makes applySearchReplace more tolerant by preferring exact and
whitespace-insensitive matches, then falling back to fast two-pass
Levenshtein-based fuzzy matching with Unicode normalization. Improves
failure messages and adds tests to cover common edit scenarios.
- **New Features**
- Exact > whitespace-insensitive > fuzzy matching flow (threshold 0.9).
- Two-pass fuzzy search with exact-line prefilter; early stop at 0.95
and 10s timeout.
- normalizeString handles smart quotes, dashes, ellipsis, NBSPs, soft
hyphen, and BOM.
- Errors now report best fuzzy similarity when below threshold.
- Tests for typos, smart quotes, below-threshold cases,
exact-over-fuzzy, whitespace differences, and ambiguity.
- **Dependencies**
- Add fastest-levenshtein.
<sup>Written for commit 289dab915c37bc4f9ab4bf0209ff3f95a57341fc.
Summary will update automatically on new commits.</sup>
<!-- End of auto-generated description by cubic. -->