3d9431389b
- replace `getCaretOffset` with `countCharsUpTo` to treat `<br>` as 1 char - rewrite `locateOffset` to walk dom tree and account for `<br>` nodes - add `textLength` helper to compute model-consistent node length - update `getCaretOffset` and `getCaretRange` to use new counting logic