anchor.diff:    num perspective;
     num transitionDuration;
   
  -  num getAttribute(Element root, String a, num def) =>
  -      (root.attributes[a] == null) ?
  -        def : Math.parseDouble(root.dataset[a]);
  -
     Config(Element root)
     {
  -    height = getAttribute(root,"height",768);
  -    width = getAttribute(root,"width",1024);
  -    maxScale = getAttribute(root,"maxScale",1);
  -    minScale = getAttribute(root,"minScale",0);
  -    perspective = getAttribute(root,"perspective",1000);
  -    transitionDuration = getAttribute(root,"transitionDuration",1000);
  +    num getAttribute(String a, num def) =>
  +        (root.attributes[a] == null) ?
  +          def : Math.parseDouble(root.dataset[a]);
  +
  +    height = getAttribute("height",768);
  +    width = getAttribute("width",1024);
  +    maxScale = getAttribute("maxScale",1);
  +    minScale = getAttribute("minScale",0);
  +    perspective = getAttribute("perspective",1000);
  +    transitionDuration = getAttribute("transitionDuration",1000);
     }
   }
   
  
positive.code:     );
  
      // Create Canvas
      mCanvas.style.cssText = canvasCSS(getState(mSteps[0]));
      mCanvas.elements.first.remove();
  
      // Scale and perspective
      mImpress.style.cssText = scaleCSS(getState(mSteps[0]));
    }
  
    /**
  
negative.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]);
  
      scale = getAttribute('data-scale', 1);
      pos.x = getAttribute('data-x');
      pos.y = getAttribute('data-y');
      pos.z = getAttribute('data-z');
      rot.x = getAttribute('data-rotate-x');
      rot.y = getAttribute('data-rotate-y');
      // Treat data-rotate as data-rotate-z:
      // Allows using only data-rotate for pure 2D rotation
      rot.z = getAttribute('data-rotate-z', getAttribute('data-rotate'));
      this.targetScale = winScale / scale;
      this.perspective = perspective / targetScale;
      this.zoomin = targetScale >= scale;
    }
  
    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 500ms ease-in-out 0ms; -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 500ms ease-in-out 250ms; -webkit-transform-style: preserve-3d; top: 50%; left: 50%; -webkit-transform: perspective(${perspective}) scale(${targetScale});";
        return t;
    }
  }
  
  class Config {
  