# `vim::selection` Notes
`vim::selection` owns visual selection geometry. It does not mutate buffers,
registers, cursor state, ECS components, or render entities.
## Public Shape
- `VimSelectionState`: optional active visual anchor.
- `VimSelection`: anchor proof clamped to a UTF-8 boundary.
- `BlockSelection`: rectangular selection over physical lines.
- `ScreenColumnRange`: ordered inclusive character-column range.
## Invariants
- Selection anchors are clamped at construction.
- All returned byte ranges are ordered, in bounds, and UTF-8 aligned.
- Characterwise ranges include the cursor cell.
- Linewise display ranges cover visible line content only.
- Linewise operator ranges include the trailing newline when present.
- Blockwise ranges are display ranges, not edit targets.
- Blockwise selection uses character columns. It does not yet model terminal
cell width, tab expansion, or grapheme clusters.
- Lines shorter than the selected start column produce no range.
## Boundary Notes
Blockwise visual mode is intentionally split from blockwise mutation. The
selection module can prove per-line display ranges today. It cannot prove the
shape required for delete, yank, change, paste, or register storage. Operator
resolution therefore rejects blockwise visual targets until that representation
exists.