## Drag: pick up and drop

- Use case: Dragging a card or icon: a soft lift when it detaches, a rigid thud when it lands.
- Feel: Lift = soft and light (the object comes free). Drop = rigid and stronger (it settles into place).
- APIs: UIImpactFeedbackGenerator(.soft / .rigid), DragGesture
- Minimum OS: iOS 13+

### SwiftUI

```swift
import SwiftUI

struct DraggableCard: View {
    @State private var offset: CGSize = .zero
    @State private var dragging = false

    private let lift = UIImpactFeedbackGenerator(style: .soft)
    private let drop = UIImpactFeedbackGenerator(style: .rigid)

    var body: some View {
        RoundedRectangle(cornerRadius: 16)
            .fill(.blue.gradient)
            .frame(width: 140, height: 90)
            .scaleEffect(dragging ? 1.06 : 1.0)
            .shadow(radius: dragging ? 12 : 2)
            .offset(offset)
            .gesture(
                DragGesture()
                    .onChanged { value in
                        if !dragging {
                            dragging = true
                            lift.impactOccurred(intensity: 0.6) // pick up
                            drop.prepare()
                        }
                        offset = value.translation
                    }
                    .onEnded { _ in
                        dragging = false
                        drop.impactOccurred() // land
                        withAnimation(.spring) { offset = .zero }
                    }
            )
            .animation(.spring(duration: 0.2), value: dragging)
    }
}
```

### Notes
- The soft/rigid asymmetry is what sells the physicality: coming free is gentle, landing is definite.
