anchor.diff:    /// Checks if the touch point of the given [details] is overlapping with
     /// a cell in [positionedCells].
     ///
  -  /// If so, reroot to the matching cell if the cell has children to show.
  -  void _onTapDown(
  -    TapDownDetails details,
  +  /// If so, saves the matching hoveredNode.
  +  void _onHover(
  +    PointerHoverEvent event,
       List<PositionedCell> positionedCells,
     ) {
  -    final x = details.localPosition.dx;
  -    final y = details.localPosition.dy;
  +    final x = event.localPosition.dx;
  +    final y = event.localPosition.dy;
       final touchPoint = Offset(x, y);
       // TODO(peterdjlee): Optimize with more efficient algorithm to find the overlapping cell.
       //                   Currently O(positionedCells.length) but an optimized algorithm with
       //                   O(log(positionedCells.length)) is possible.
  -
       for (final cell in positionedCells) {
         if (cell.rect.contains(touchPoint)) {
  -        onRootChangedCallback(cell.node);
  +        setState(() {
  +          hoveredNode = cell.node;
  +        });
         }
       }
     }
  
positive.code:   }
  
    Widget buildTitleText(BuildContext context) {
      if (isOutermostLevel) {
        return buildBreadcrumbsNavigator();
      } else {
        return buildSelectable(
          child: Container(
            height: treeMapHeaderHeight,
            width: double.infinity,
            decoration: BoxDecoration(
              border: Border.all(color: Colors.black87),
  
negative.code: // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  import 'package:flutter/gestures.dart';
  import 'package:flutter/material.dart';
  import 'package:flutter/rendering.dart';
  
  