- add public AtomicRange API with validation and diagnostic errors
- make cursor movement, deletion, insertion, selection, undo/redo, and set_lines atom-aware
- clear caller-derived atomic ranges after successful content mutations
- add focused atomic range tests plus serde coverage
- document atomic ranges and add a caller-owned parsing example
* feat(textarea): add bulk replace API and transparent measure() caching
- add TextArea::set_lines(lines, cursor) for direct whole-buffer replacement
- preserve widget configuration while resetting history, selection, highlights, viewport scroll, and cached measurement state
- cache measure(width_cols) results by outer width and reuse them until dependencies change
- invalidate cached measurement on content edits, undo/redo, and measure-affecting setters
- add focused tests for set_lines behavior and cache correctness
* chore(release): bump to v0.10.2 and refresh docs
- prepare the v0.10.2 release with updated crate version and changelog entry
- refresh README coverage for fork-added APIs including wrapping, measurement, bulk replace, and custom highlights
* feat(cursor): add Up/Down navigation between wrapped visual lines
- Extend CursorMove::next_cursor() with optional wrapped rows parameter so Up/Down use visual row indices when wrapping is active
- Compute wrapped rows in move_cursor_with_shift() and pass them through
- Fix cursor_at_visual_row() boundary clamping for non-last wrapped segments to prevent the cursor landing on the next visual line
- Preserve visual column offset when moving between wrapped rows so the cursor moves straight vertically instead of jumping to row start/end
* chore(release): bump to v0.10.1 and update changelog
* chore: migrate to Rust 2024 edition and bump to v0.9.2
- Bump edition to 2024 and rust-version to 1.85.0
- Replace f64::log10 with usize::ilog10 in num_digits
- Fix clippy lints surfaced by edition bump: repeat_n, derived Default, then_some
- Expand watch-check and watch-test aliases to cover all feature paths (crossterm_0_28, no-backend, tuirs variants, serde, arbitrary)
- Expand CI test and clippy workflows to full 6/8-entry feature matrices including termion on Ubuntu
- Apply rustfmt import reordering from edition 2024 rules
* fix: revert turis linux checks
* ci(workflows): split CI into focused workflows and add Codecov upload
* ci(coverage): upload to codecov for same-repo PRs and main pushes
* fix(ci): upload coverage to codecov only on main pushes
* chore: rename crate to tui-textarea-2 and update metadata/docs links
* chore: prepare v0.7.1 publish for tui-textarea-2
* ci(release): automate publish, tag, and release after merge to main
`e`'s behavior is actually not same as `w`. For example, let's say we
have the following text and the cursor is on 'f'.
```
foo bar
```
Then `de` deletes the text 'foo' but `dw` deletes the text 'foo '
including the trailing space.