   
   open override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     let isExpanded = cellStatesDictionary[indexPath] ?? false
-    let apperance = ElongationConfig.shared
-    let frontViewHeight = apperance.topViewHeight
-    let expandedCellHeight = apperance.bottomViewHeight + frontViewHeight - apperance.bottomViewOffset
+    let frontViewHeight = config.topViewHeight
+    let expandedCellHeight = config.bottomViewHeight + frontViewHeight - config.bottomViewOffset
     return isExpanded ? expandedCellHeight : frontViewHeight
   }
   
+  /// Must call `super` if you override this method in subclass.
   open override func scrollViewDidScroll(_ scrollView: UIScrollView) {
-    guard scrollView === tableView else { return }
+    guard scrollView === tableView, config.parallaxEnabled else { return }
     for case let cell as ElongationCell in tableView.visibleCells {
-      changeOffset(of: cell)
+      cell.parallaxOffset(offsetY: tableView.contentOffset.y, height: tableView.bounds.height)
     }
   }
  

// MARK: - TableView 📚
extension ElongationViewController {
  
  open override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard let cell = cell as? ElongationCell else { return }
    let expanded = state == .expanded
    cell.dim(expanded, animated: expanded)
    changeOffset(of: cell)
  }
  
  open override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    
    // Scroll to calculated rect only if it's not going to collapse whole tableView
    if force == nil {
      switch config.expandingBehaviour {
      case .centerInView:
        tableView.scrollToRow(at: indexPath, at: .middle, animated: animated)
      case .scrollToBottom:
        tableView.scrollToRow(at: indexPath, at: .bottom, animated: animated)
      case .scrollToTop:
        tableView.scrollToRow(at: indexPath, at: .top, animated: animated)
      default: break
      }
      
    }
  }
  
}
