Skip to content

Instantly share code, notes, and snippets.

@imCorfitz
Created October 14, 2019 12:59
Show Gist options
  • Save imCorfitz/bc8ce1ab2548a0dde0bbd822f7598b93 to your computer and use it in GitHub Desktop.
Save imCorfitz/bc8ce1ab2548a0dde0bbd822f7598b93 to your computer and use it in GitHub Desktop.
Transition for Sapper Navigation
<script>
import Nav from '../components/Nav.svelte';
import Fly from '../components/Fly.svelte';
export let segment;
let active = false;
function triggerNav() {
active = false;
setTimeout(() => {active = true}, 1000);
}
setTimeout(() => {active = true}, 1000);
</script>
<style>
main {
position: relative;
max-width: 56em;
background-color: white;
padding: 2em;
margin: 0 auto;
box-sizing: border-box;
}
</style>
<Nav on:nav={triggerNav} {segment}/>
<main>
<Fly {active}>
<slot></slot>
</Fly>
</main>
<script>
import { fly } from 'svelte/transition';
export let active = false;
</script>
{#if active}
<div transition:fly={{ y: 50, duration: 300 }}>
<slot></slot>
</div>
{/if}
<script>
export let segment;
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
function navigationHappened() {
if(event.target.tagName.toLowerCase() === 'a')
{
dispatch('nav');
}
}
</script>
<style>
nav {
border-bottom: 1px solid rgba(255,62,0,0.1);
font-weight: 300;
padding: 0 1em;
}
ul {
margin: 0;
padding: 0;
}
/* clearfix */
ul::after {
content: '';
display: block;
clear: both;
}
li {
display: block;
float: left;
}
.selected {
position: relative;
display: inline-block;
}
.selected::after {
position: absolute;
content: '';
width: calc(100% - 1em);
height: 2px;
background-color: rgb(255,62,0);
display: block;
bottom: -1px;
}
a {
text-decoration: none;
padding: 1em 0.5em;
display: block;
}
</style>
<nav on:click={navigationHappened}>
<ul>
<li><a class='{segment === undefined ? "selected" : ""}' href='.'>home</a></li>
<li><a class='{segment === "about" ? "selected" : ""}' href='about'>about</a></li>
<!-- for the blog link, we're using rel=prefetch so that Sapper prefetches
the blog data when we hover over the link or tap it on a touchscreen -->
<li><a rel=prefetch class='{segment === "blog" ? "selected" : ""}' href='blog'>blog</a></li>
</ul>
</nav>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment