anchor.diff:  // TODO(mpcomplete): The curve must be linear if we want the drawer to track
   // the user's finger. Odeon remedies this by attaching spring forces to the
   // initial timeline when animating (so it doesn't look linear).
  +const Point _kOpenPosition = Point.origin;
  +const Point _kClosedPosition = const Point(-_kWidth, 0.0);
   const Curve _kAnimationCurve = linear;
   
   typedef void DrawerStatusChangeHandler (bool showing);
  
positive.code:     _performance.play();
    }
  
    void syncFields(Drawer source) {
      children = source.children;
      level = source.level;
      navigator = source.navigator;
      if (showing != source.showing) {
        showing = source.showing;
        if (showing) {
          _show();
        } else {
          _performance.reverse();
        }
      }
      onStatusChanged = source.onStatusChanged;
      super.syncFields(source);
    }
  
    // TODO(mpcomplete): the animation system should handle building, maybe? Or
    // at least setting the transform. Figure out how this could work for things
    // like fades, slides, rotates, pinch, etc.
    Widget build() {
      // TODO(mpcomplete): animate as a fade-in.
      double scaler = _performance.progress;
      Color maskColor = new Color.fromARGB((0x7F * scaler).floor(), 0, 0, 0);
  
      var mask = new Listener(
        child: new Container(decoration: new BoxDecoration(backgroundColor: maskColor)),
        onGestureTap: handleMaskTap
      );
  
      Widget content = _builder.build(
        new Container(
          decoration: new BoxDecoration(
            backgroundColor: Theme.of(this).canvasColor,
            boxShadow: shadows[level]),
  
negative.code: import 'package:sky/animation/animation_performance.dart';
  import 'package:sky/animation/curves.dart';
  import 'package:sky/theme/shadows.dart';
  import 'package:sky/theme/colors.dart' as colors;
  import 'package:sky/widgets/animated_component.dart';
  import 'package:sky/widgets/animation_builder.dart';
  import 'package:sky/widgets/basic.dart';
  import 'package:sky/widgets/navigator.dart';
  import 'package:sky/widgets/scrollable_viewport.dart';
  import 'package:sky/widgets/theme.dart';
  import 'package:vector_math/vector_math.dart';
  
  // TODO(eseidel): Draw width should vary based on device size:
  // http://www.google.com/design/spec/layout/structure.html#structure-side-nav
  