   }
 
   func updateScrollViewWithKeyboardNotificationUserInfo(userInfo: [AnyHashable: Any]) {
-    guard let endFrame = userInfo[AnyHashable("UIKeyboardFrameEndUserInfoKey")] as? CGRect
-    else { return }
-    let endKeyboardFrameOriginInWindow = view.convert(endFrame.origin, from: nil)
-    let tableViewMaxY = tableView.frame.maxY
-    let baseInset = tableViewMaxY - endKeyboardFrameOriginInWindow.y
-    let scrollIndicatorInset = baseInset
-    var contentInset = baseInset
-    if #available(iOS 11, *) {
-      if endKeyboardFrameOriginInWindow.y < tableViewMaxY {
-        contentInset -= view.safeAreaInsets.bottom
-      }
-    }
-    tableView.contentInset.bottom = contentInset
-    tableView.scrollIndicatorInsets.bottom = scrollIndicatorInset
-  }
+    if #available(iOS 14.0, *) {
+    } else {
+      guard let endFrame = userInfo[AnyHashable("UIKeyboardFrameEndUserInfoKey")] as? CGRect
+      else { return }
+      let endKeyboardFrameOriginInWindow = view.convert(endFrame.origin, from: nil)
+      let tableViewMaxY = tableView.frame.maxY
+      let baseInset = tableViewMaxY - endKeyboardFrameOriginInWindow.y
+      let scrollIndicatorInset = baseInset
+      var contentInset = baseInset
+      if #available(iOS 11, *) {
+        if endKeyboardFrameOriginInWindow.y < tableViewMaxY {
+          contentInset -= view.safeAreaInsets.bottom
+        }
+      }
+      tableView.contentInset.bottom = contentInset
+      tableView.scrollIndicatorInsets.bottom = scrollIndicatorInset
+    }
+  }
+
+  #if compiler(>=5.3)
+    @available(iOS 14.0, *)
+    func configureCollectionView() {
+      let collectionView = UICollectionView(
+        frame: view.bounds, collectionViewLayout: generateLayout())
+      view.addSubview(collectionView)
+      collectionView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
+      collectionView.backgroundColor = .white
+      self.collectionView = collectionView
+      collectionView.delegate = self
+    }
+
+    @available(iOS 14.0, *)
+    func configureDataSource() {
+      let containerCellRegistration =
+        UICollectionView.CellRegistration<
+          UICollectionViewListCell,
+          CBCNode
+        > { (cell, indexPath, menuItem) in
+          // Populate the cell with our item description.
+          var contentConfiguration = cell.defaultContentConfiguration()
+          contentConfiguration.text = menuItem.title
+          contentConfiguration.textProperties.color = Constants.titleColor
+          cell.contentConfiguration = contentConfiguration
+
+          let disclosureOptions = UICellAccessory.OutlineDisclosureOptions(style: .header)
+          cell.accessories = [.outlineDisclosure(options: disclosureOptions)]
+          cell.backgroundConfiguration = UIBackgroundConfiguration.clear()
+        }
+
+      let cellRegistration =
+        UICollectionView.CellRegistration<
+          UICollectionViewListCell,
+          CBCNode
+        > { cell, indexPath, menuItem in
+          // Populate the cell with our item description.
+          var contentConfiguration = cell.defaultContentConfiguration()
+          contentConfiguration.text = menuItem.title
+          contentConfiguration.textProperties.color = Constants.subtitleColor
+          cell.contentConfiguration = contentConfiguration
+          cell.backgroundConfiguration = UIBackgroundConfiguration.clear()
+        }
+
+      dataSource =
+        UICollectionViewDiffableDataSource<Section, CBCNode>(collectionView: collectionView) {
+          (
+            collectionView: UICollectionView,
+            indexPath: IndexPath,
+            item: CBCNode
+          ) -> UICollectionViewCell? in
+          // Return the cell.
+          if item.children.isEmpty {
+            return collectionView.dequeueConfiguredReusableCell(
+              using: cellRegistration,
+              for: indexPath,
+              item: item)
+          } else {
+            return collectionView.dequeueConfiguredReusableCell(
+              using: containerCellRegistration,
+              for: indexPath,
+              item: item)
+          }
+        }
+      // load our initial data
+      applySnapshot(animatingDifferences: false)
+    }
+
+    @available(iOS 14.0, *)
+    func generateLayout() -> UICollectionViewLayout {
+      let listConfiguration = UICollectionLayoutListConfiguration(appearance: .plain)
+      let layout = UICollectionViewCompositionalLayout.list(using: listConfiguration)
+      return layout
+    }
+
+    @available(iOS 14.0, *)
+    func applySnapshot(animatingDifferences: Bool = true) {
+      let sectionSnapshot =
+        createSectionSnapshot(section: isSearchActive ? searched.map { $0.node } : nodes)
+      self.dataSource.apply(sectionSnapshot, to: .main, animatingDifferences: animatingDifferences)
+    }
+
+    @available(iOS 14.0, *)
+    func createSectionSnapshot(section: [CBCNode]) -> NSDiffableDataSourceSectionSnapshot<CBCNode> {
+      var snapshot = NSDiffableDataSourceSectionSnapshot<CBCNode>()
+
+      func addItems(_ menuItems: [CBCNode], to parent: CBCNode?) {
+        snapshot.append(menuItems, to: parent)
+        for menuItem in menuItems where !menuItem.children.isEmpty {
+          addItems(menuItem.children, to: menuItem)
+        }
+      }
+
+      addItems(section, to: nil)
+      return snapshot
+    }
+  #endif
+
 }
+
+extension MDCDragonsController: UICollectionViewDelegate {
+  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
+    if #available(iOS 14.0, *) {
+      guard let menuItem = self.dataSource.itemIdentifier(for: indexPath) else { return }
+      collectionView.deselectItem(at: indexPath, animated: true)
+
+      if menuItem.isExample() || isSearchActive {
+        setupTransition(nodeData: DragonCell(node: menuItem))
+      }
+    }
+  }
+}

      filteredPresentable.map { DragonCell(node: $0) },
    ]
    cellsBySection = cellsBySection.map { $0.sorted { $0.node.title < $1.node.title } }
    super.init(nibName: nil, bundle: nil)
    results = getLeafNodes(node: node)
    searched = results

    -> Bool
  {
    if gestureRecognizer is UITapGestureRecognizer {
      if #available(iOS 14.0, *) {
        let location = touch.location(in: collectionView)
        return (collectionView.indexPathForItem(at: location) == nil)
      } else {
        let location = touch.location(in: tableView)
        return (tableView.indexPathForRow(at: location) == nil)
      }
    }
    return true
  }
