- 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>
- PaletteController: render proper color swatch cards (box + label) and
wrap output in Markup::create() so Drupal's XSS filter doesn't strip
inline style attributes
- riverside_pt.module: scope page_attachments and page_top to
riverside_pt.* routes only — Tailwind preflight was blowing away
Drupal's default form styles on the login page
- settings.php: derive trusted_host_patterns from BASE_URL so the host
and port always agree; prevents localhost:8080 being treated as untrusted
- entrypoint.sh: pass --base-url to drush site:install so Drupal stores
the correct canonical URL from the start
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Home controller with hero and services sections
- Nav rebuilt on install: Home, Services, About, FAQ, Contact (CTA), Book An Appointment (CTA)
- Entrypoint uses IS_SETUP check so failed installs retry on restart
- Gitea Actions workflow builds and pushes multi-arch image to forge.quinefoundation.com
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>