The shaper flags the last visible glyph of a final line without a trailing newline (and the synthetic end-of-text glyph after a trailing newline); the layout capture recorded both as visual-line starts at len(str). Taps below the content mapped onto that phantom line (harmless: it returned the EOF byte), but CaretPoint resolved the caret through it and drew the caret on the phantom line - one line BELOW where the typed text lands. Result: tap the empty space below the last line, the cursor appears one line down, and the typed letter appears one line ABOVE the cursor. - render.go: only record a next-line start when a real line follows the break (a real newline cluster, or a soft wrap with content after it). - state.go: a tap below every recorded line now returns the window end explicitly (the old clamp-to-last-text-line fallback remains only for layouts with no line starts at all). Verified on the emulator for both 'test\nA' (caret now drawn at the end of the 'A' line, where the letter lands) and 'test\nA\n' (caret and letter on the trailing line); full test suite green. |
||
|---|---|---|
| .. | ||
| browser | ||
| editor | ||
| io/pool | ||
| perf | ||
| test/e2e | ||
| ui | ||