* fix(group_rides): make Join Group Ride dialog keyboard-safe in landscape (#69)
* fix(group_rides): responsive landscape form and keyboard scrolling in CreateGroupRideScreen (#70)
* fix(group_rides): constrain and scroll Attach Saved Route sheet in landscape (#75)
* fix(routes): make RoutePlannerScreen keyboard-safe and scrollable in landscape (#76)
* fix(clubs): make CreateClubScreen keyboard-safe and scrollable in landscape (#77)
* fix(forms): address PR #87 review findings on saved-route sheet and stop list auto-scrolling
---------
Co-authored-by: Developer <dev@example.com>
* fix(group_rides): prevent card bottom overflow in landscape grid (#68)
* fix(feed): ensure feed content and empty state scroll clear of share button (#71)
* fix(feed): make ShareRecentSessionModal keyboard-safe and scrollable in landscape
* fix(clubs): responsive grid and constrained card sizing in landscape (#73)
* fix(group_rides): prevent horizontal control clipping in Live Formation landscape (#74)
---------
Co-authored-by: Developer <dev@example.com>
* fix(dashboard): ensure Touring map follows rider and supports recenter (#48)
* fix(social): make shared session telemetry read-only and authoritative (#50)
* fix(social): use recorded telemetry for feed charts and verify GPS badge (#51)
* fix(social): standardize community feed typography and theme colors (#49)
* fix(social): prevent horizontal overflow in GPX export snackbar (#52)
- Wrap GPX export snackbar message Text in Expanded with maxLines: 2 and TextOverflow.ellipsis
- Add ValueKey('gpx_export_button_<id>') for deterministic testing
- Wrap narrow feed header/metric/empty-state Row labels in Flexible to prevent overflow under 320px/360px at 1.5x text scale
- Add BUG-005 widget tests across 320x640, 360x800, and 800x480 viewports at 1.5x text scale
* fix(social): harden share modal, inspector theming, and PR #78 accuracy (#49, #50, #51, #52)
- Require a selected recorded Ride in ShareSessionModal before enabling publish
- Theme ShareSessionModal and FeedTelemetryInspectorModal for Light and Dark modes
- Use LayoutBuilder width for FeedTelemetryInspectorModal scrubber drag/tap
- Route PopupMenuButton export_gpx action through the overflow-safe GPX snackbar
- Enforce telemetrySamples >= 2 when provided to verifyGpsCriteria
* fix(android): remediate map follow smoothness, orientation controls, starting location, and landscape overflow (#79, #80, #81, #52)
* fix(android): stop Pro upsell sheet overflowing in landscape (#52 / BUG-005)
The "Forensic CSV & PDF Export" Pro upsell sheet showed "BOTTOM OVERFLOWED BY 90
PIXELS" in landscape on a Pixel 8a. showProUpgradeSheet built a non-scrolling Column
inside a default modal bottom sheet, which Flutter caps at 9/16 of the screen height
(about 230 dp in landscape) - shorter than the header, description and two actions.
Use isScrollControlled and wrap the content in a SingleChildScrollView so the sheet can
take the full height and never overflows. This also covers every other caller (garage,
add motorcycle, ride detail).
Tests: pro_upgrade_sheet_landscape_test covers 914x411 (Pixel 8a), 800x360 and 780x360
at 1.0x and 1.3x text scale plus NOT NOW dismissal. Verified to fail on the old code
(RenderFlex overflowed 64-144 px) and pass on the fix. Full suite 1700 passed,
flutter analyze clean. Not validated on the physical device yet.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(social): require telemetry evidence, geodesic GPS threshold, and 3 MPH lean gate (#50, #51)
---------
Co-authored-by: Developer <dev@example.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* feat(clubs): enable admin group ride governance
* feat(clubs): add secure member ride discovery
* fix(clubs): protect meeting location in ride discovery
* feat(group-rides): secure club join moderation
* test(clubs): update ride discovery expectations
* test(founder-portal): update rides governance expectations
* fix(group-rides): resolve pre-merge findings on join moderation and discovery
- Block participant hard deletes for accepted status and organizer role for all callers
- Support atomic accessUids removal on invitation decline in firestore.rules
- Restrict mutual-block checks to approvals in GroupRideService, allowing decline of blocked requests
- Implement cursor-paginated candidate scanning with block filtering in website discovery API
- Add comprehensive emulator, vitest, and unit tests covering all 5 findings
* fix(discovery): page candidates until 30 eligible rides collected or query exhausted
- Remove artificial 150 candidate scan ceiling in club rides discovery route
- Continue cursor pagination until 30 unblocked eligible rides are collected or upcoming schedule query is exhausted
- Add test verifying pagination continues past 150 blocked rides to collect all 30 eligible rides
---------
Co-authored-by: Developer <dev@example.com>
Add optional immutable Club affiliation, authorized Club Owner/Admin ride planning, privacy-preserving point access, and narrowly scoped Club admin ride controls.
Club-wide ride discovery remains deferred pending a privacy-preserving architecture.