     // MARK: Lifecycle
     override func viewDidLoad() {
         super.viewDidLoad()
-        preview.closeButton.tapped = { [unowned self] in
+        previewView.closeButton.tapped = { [unowned self] in
             self.dismiss()
         }
-        preview.captureButton.tapped = { [unowned self] in
+        previewView.captureButton.tapped = { [unowned self] in
             self.process().flatMap {
                 self.delegate?.cropViewController(self, didCropPhoto: $0, for: self.side)
             }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        scrollView.contentInset = UIEdgeInsets()
    }
}

    fileprivate let side: Card.Side

    // MARK: Views
    fileprivate let previewView: PreviewOutline = PreviewOutline.constrained()
    fileprivate let backgroundView: UIImageView = UIImageView.constrained()
    fileprivate let backgroundEffectView: UIVisualEffectView = UIVisualEffectView(effect:
        UIBlurEffect(style: .dark)).with { $0.translatesAutoresizingMaskIntoConstraints = false }
    fileprivate let imageView: UIImageView = UIImageView(frame: .zero)
    fileprivate lazy var scrollView: UIScrollView = UIScrollView.constrained().with {
        $0.delegate = self
        $0.maximumZoomScale = 2
        $0.showsVerticalScrollIndicator = false
        $0.showsHorizontalScrollIndicator = false
        $0.isScrollEnabled = true
    }

    init(image: UIImage, side: Card.Side) {
        imageView.image = UIImage(cgImage: image.cgImage!, scale: 1, orientation: .right)
        backgroundView.image = imageView.image
        self.side = side
        super.init(nibName: nil, bundle: nil)
    }
