Choosing Transition Animations

Each transition rule must have exactly one use() statement. It determines what we'll do if the rule matches.

Each transition may also have one reverse() statement. It determines what we'll do if the opposite rule matches, where the opposite rule swaps fromRoute with toRoute and swaps fromModel with toModel.

For situations where use() is the same as reverse(), we can use the useAndReverse shortcut. This is the same as having the identical rules for both use() and reverse()

// The simplest 'use' just calls a named transition.
this.transition(this.withinRoute('foo'), this.use('fade'));

// Named transitions may take arguments. For example, the predefined
// 'fade' transition accepts an `opts` hash that's passed through to
// Velocity, so you can say:
this.transition(this.withinRoute('foo'), this.use('fade', { duration: 3000 }));

// This declares two symmetric rules: "from foo to bar use toLeft" and
// "from bar to foo use toRight".
this.transition(
  this.fromRoute('foo'),
  this.toRoute('bar'),
  this.use('toLeft'),
  this.reverse('toRight'),
);

// You can also provide an implementation instead of a name, though
// it's probably better to keep implementations in separate files. We
// talk more about transition implementations in the next section.
import { animate, stop } from 'liquid-fire';
this.transition(
  this.withinRoute('foo'),
  this.use(function (oldView, insertNewView, opts) {
    stop(oldView);
    return animate(oldView, { opacity: 0 }, opts)
      .then(insertNewView)
      .then(function (newView) {
        return animate(newView, { opacity: [1, 0] }, opts);
      });
  }),
);

// This declares two equivalent rules: "from foo to bar use fade" and
// "from bar to foo use fade".
this.transition(
  this.fromRoute('foo'),
  this.toRoute('bar'),
  this.useAndReverse('fade'),
);