feat(itinerary): add constraint-aware drag and drop with visual feedback

- Add constraint validation during drag using ItineraryConstraints
- Calculate invalid zones and barrier games when drag starts
- Apply visual dimming (alpha 0.3) to invalid drop zones during drag
- Highlight barrier games with gold border when dragging travel segments
- Block invalid drops using ItineraryConstraints.isValidPosition validation
- Add haptic feedback for drag interactions:
  - Medium impact on pickup
  - Light impact when entering valid zone
  - Warning notification when entering invalid zone
  - Soft impact on drop

The drag state is tracked via draggingItem, invalidRowIndices, and
barrierGameIds properties. Visual feedback is applied and removed
via applyDragVisualFeedback/removeDragVisualFeedback methods.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-01-17 21:59:57 -06:00
parent cd00384010
commit 9c40721af0
2 changed files with 282 additions and 9 deletions

View File

@@ -83,7 +83,7 @@ struct ItineraryTableViewWrapper<HeaderContent: View>: UIViewControllerRepresent
// Load initial data
let (days, validRanges) = buildItineraryData()
controller.reloadData(days: days, travelValidRanges: validRanges)
controller.reloadData(days: days, travelValidRanges: validRanges, itineraryItems: itineraryItems)
return controller
}
@@ -101,7 +101,7 @@ struct ItineraryTableViewWrapper<HeaderContent: View>: UIViewControllerRepresent
context.coordinator.headerHostingController?.rootView = headerContent
let (days, validRanges) = buildItineraryData()
controller.reloadData(days: days, travelValidRanges: validRanges)
controller.reloadData(days: days, travelValidRanges: validRanges, itineraryItems: itineraryItems)
}
// MARK: - Build Itinerary Data