anchor.diff:    }
   
     State getState(Element step) =>
  -    new State(step.attributes, winScale(), mCfg.perspective);
  +    new State(step.attributes, winScale(), mCfg);
   
     void goto(int step) {
       // Iterate over attributes of the step jumped to and apply CSS
  
positive.code: class State {
    Vector rot;
    Vector pos;
    num scale;
    num targetScale;
    num perspective;
    bool zoomin;
  
    State(attributes, winScale, perspective) :
        rot = new Vector(),
        pos = new Vector() {
      num getAttribute(String a, [num def = 0]) =>
        (attributes[a] == null) ?
          def : Math.parseDouble(attributes[a]);
  
negative.code:     // Allows using only data-rotate for pure 2D rotation
      rot.z = getAttribute('data-rotate-z', getAttribute('data-rotate'));
      this.targetScale = winScale / scale;
      bool zoomin = targetScale >= scale;
      this.rootDelay = (zoomin ? cfg.transitionDuration/2 : 0);
      this.canvasDelay = (zoomin ? 0 : cfg.transitionDuration/2);
    }
  
    String toCSS() =>
        "translate3d(${pos.x}px, ${pos.y}px, ${pos.z}px) rotateX(${rot.x}deg) rotateY(${rot.y}deg) rotateZ(${rot.z}deg) scale(${scale})";
  
    String canvasCSS() =>
        "position: absolute; -webkit-transform-origin: 0% 0%; -webkit-transition: all ${cfg.transitionDuration}ms ease-in-out ${canvasDelay}ms; -webkit-transform-style: preserve-3d; -webkit-transform: rotateZ(${-rot.z}deg) rotateY(${-rot.y}deg) rotateX(${-rot.x}deg) translate3d(${-pos.x}px, ${-pos.y}px, ${-pos.z}px);";
  
    String scaleCSS() {
        var t="position: absolute; -webkit-transform-origin: 0% 0%; -webkit-transition: all ${cfg.transitionDuration}ms ease-in-out ${rootDelay}ms; -webkit-transform-style: preserve-3d; top: 50%; left: 50%; -webkit-transform: perspective(${cfg.perspective / targetScale}) scale(${targetScale});";
        return t;
    }
  }
  