···2121 bool get allowImplicitScrolling => true;
22222323 @override
2424- double get minFlingVelocity => 200; // Between default (50) and feed snappy (400)
2424+ double get minFlingVelocity => 200; // Between default 50 & feed snappy 400
25252626 @override
2727- double get minFlingDistance => 25; // Between default (0) and feed snappy (20)
2727+ double get minFlingDistance => 25; // Between default 0 & feed snappy 20
28282929 @override
3030 Tolerance get tolerance => const Tolerance(
···3838 double velocity,
3939 ) {
4040 // Only snap if there's actual user interaction
4141- // Don't snap on initial load or when position is at boundaries with no velocity
4141+ // Don't snap on initial load or when position at boundaries w/ no velocity
4242 final hasVelocity = velocity.abs() >= tolerance.velocity;
4343-4444- // Check if we're at a boundary - if so, only snap if there's significant velocity
4545- final isAtMinBoundary = (position.pixels - position.minScrollExtent).abs() < 1.0;
4646- final isAtMaxBoundary = (position.maxScrollExtent - position.pixels).abs() < 1.0;
4747-4343+4444+ // Check if we're at a boundary - if so, only snap if significant velocity
4545+ final isAtMinBoundary =
4646+ (position.pixels - position.minScrollExtent).abs() < 1.0;
4747+ final isAtMaxBoundary =
4848+ (position.maxScrollExtent - position.pixels).abs() < 1.0;
4949+4850 // If at boundaries with no velocity, don't snap
4951 if ((isAtMinBoundary || isAtMaxBoundary) && !hasVelocity) {
5052 return super.createBallisticSimulation(position, velocity);
5153 }
5252-5454+5355 // Check for significant drag (user has actually moved the page)
5454- final hasSignificantDrag = (position.pixels - position.minScrollExtent).abs() > minFlingDistance &&
5555- !isAtMinBoundary && !isAtMaxBoundary;
5656-5656+ final hasSignificantDrag =
5757+ (position.pixels - position.minScrollExtent).abs() > minFlingDistance &&
5858+ !isAtMinBoundary &&
5959+ !isAtMaxBoundary;
6060+5761 if (hasVelocity || hasSignificantDrag) {
5862 final targetPage = _getTargetPage(position, velocity);
5963 final target = targetPage * position.viewportDimension;
···89939094 // If dragged past 50% threshold, snap to next page (less aggressive than feed's 30%/70%)
9195 final progress = page - page.floor();
9292-9696+9397 // At first page (0), only snap forward if dragged significantly past 50%
9498 if (currentPage == 0) {
9599 if (progress > 0.6 && currentPage < maxPage) {
···97101 }
98102 return 0; // Stay on first page unless dragged significantly
99103 }
100100-104104+101105 // At last page, only snap backward if dragged significantly
102106 if (currentPage >= maxPage) {
103107 if (progress < 0.4 && currentPage > 0) {
···105109 }
106110 return maxPage; // Stay on last page unless dragged significantly
107111 }
108108-112112+109113 // Middle pages: use 50% threshold
110114 if (progress > 0.5 && currentPage < maxPage) {
111115 // Snap forward if dragged past 50%