refactor: replace pagination engine with TextLayoutResult-first per-block layout
- New models: BlockMetrics (sealed), LineMetric, PageSpan, ReaderPage2,
PaginationResult, ReaderConstraints, FingerprintKey
- New engine: PaginationEngine interface + TextMeasurerPaginationEngine
with BlockMetricsFactory (getLineTop/Bottom/VisibleEnd) and PagePacker
(greedy fill with widow/orphan policy + paragraph splitting)
- New infrastructure: PaginationCache (LRU), WindowedPaginationState
- UI: ReaderPaginationLayout rewritten for ReaderPage2/PageSpan rendering,
ReaderPageContent2 renders blocks from spans with sub-sequence support
- ReaderScreen: replaced produceState with LaunchedEffect + mutableStateOf,
uses screenModel.paginationEngine directly
- ReaderModel: injects TextMeasurerPaginationEngine, uses firstBlockIndex
instead of startTextIndex
- Removed: PaginateReaderTextUseCase (380 lines), readerChapterTextStyle,
TextMeasurerModule (unnecessary, TextMeasurer passed from composable)
- Removed: unused ReaderTextAlignment import from BlockMetricsFactory