/viewtransitions

Primary LanguageAstroMIT LicenseMIT

Morphull - Astro Starter Kit

A morphing or full page transition enabled slide creation starter kit that uses View Transitions to do all the work.

Until View Transitions are supported across all browsers, this API and starter kit only works in Chrome Canary with chrome://flags/#view-transition-on-navigation enabled.

🚀 Project Structure

Inside the /pages folder you create your slides, each slide is it's own Astro component that uses the /src/layouts/Slide.astro layout.

There's one component called Controls.astro that handles making and placing the next arrow.

How to get morphing slide pages

It's all generally handled for you! Just use <h1> elements, or images or links. Inside the /src/styles/transitions.css you'll find the unique names given to the elements that tells the browser which shared elements should morph. Like if you have a code snippet on one page, and the next page also has one, the browser will transition between those snippets.

Enabling page transitions

Full page transitions can be enabled on a per slide basis, by simply passing animation="page" as a property to the Layout / Slide component. This will on the other hand will automatically disable slide page morphing.

Writing custom page transitions

To write custom page transitions, you can simply hook into the functionality already provided by morphull. Currently, there are two data attributes that are written to the <html> when the page is initialized that form the basis for all animations.

Attribute Values Description
data-view-transition-direction 'forward', 'back', 'reload' The direction of navigation. Reload means that a page refresh is initiated.
data-view-transition 'page', 'element', Custom Default: 'element'.
Animation identifier used within CSS

With the help of these attributes and open-props custom page transitions can be written as easy as:

  html:not([data-view-transition-direction="reload"])[data-view-transition="slide"] {
    &::view-transition-new(root) {
      animation: var(--animation-slide-in-left) forwards;
    }

    &::view-transition-old(root) {
      animation: var(--animation-slide-out-left) forwards;
    }

    &[data-view-transition-direction="back"] {
      &::view-transition-new(root) {
        animation: var(--animation-slide-in-right) forwards;
      }

      &::view-transition-old(root) {
        animation: var(--animation-slide-out-right) forwards;
      }
    }
  }

In particular, we use :not([data-view-transition-direction="reload"]) in this example to prevent transitions from being replayed on page refresh. There is currently an ongoing discussion about this behavior right here. A working example identical to the code above can be found in src/pages/example-3.astro.