- Snap clamps after rounding so it can't overshoot max on narrow viewports
- atEnd computed inline each render from live measureMax()
- forceUpdate on resize guarantees re-render even when left doesn't change
- Track gets explicit width (TOTAL_W) so gap areas are hit-testable
- Resize handler always calls setLeft (clamp or no-op) to keep state consistent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop live drag tracking, rubber-band resistance, and dragging ref.
A swipe > 50px left/right calls next()/prev() — same result, far less code.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Live drag tracks the finger with transition disabled; slight rubber-band
resistance at both edges. On touchend, snaps to the nearest card
boundary within [−maxLeft, 0].
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Register resize listener once with empty deps; track left via ref so
the debounced callback always reads the current offset without
re-registering on every click.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- rpt-testimonials: pixel-offset carousel with DOM-measured max scroll,
cards overflow the 1200px safe area to the right; red debug border on container
- calendar: circle-per-day design replacing event bars; teal outline for
available days, filled for selected; dateClick replaces moreLinkClick
- settings.php: normalize BASE_URL before parse_url to fix trusted host
error when scheme is missing; always include localhost fallback patterns
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>