This commit is contained in:
zyxkad 2022-08-20 21:34:51 -06:00
parent 9c2494777d
commit 73fb1b250b
No known key found for this signature in database
GPG Key ID: 75D46E883711CD87
6 changed files with 125 additions and 89 deletions

View File

@ -1,16 +1,16 @@
<template> <template>
<div class="body" v-bind:style="{'height': appHeight + 'px'}"> <div class="body" :style="{'height': appHeight + 'px'}">
<div class="side-nav" v-bind:[navExpandedAttr]="''"> <div class="side-nav" :class="navExpandedAni ?'-side-nav-expand' :'-side-nav-expand-reverse'" :[navExpandedAttr]="''">
<div class="logo" v-on:click="triggerNavExpand"> <div class="logo" v-on:click="toggleNavExpand">
<img alt="Vue logo" src="@/assets/logo.svg" width="100" height="100" /> <img alt="Vue logo" src="@/assets/logo.svg" width="100" height="100" />
</div> </div>
<nav> <nav>
<RouterLink to="/"> <RouterLink to="/">Index</RouterLink>
<span class="nav-text">Index</span> <div v-for="item in accounts">
</RouterLink> <span class='nav-account'>{{item.email}}</span>
<RouterLink to="/about"> <RouterLink :to="`/${item.email}/`">All</RouterLink>
<span class="nav-text">About</span> <RouterLink v-for="box in item.boxes" :to="`/${item.email}/${box}`">{{box}}</RouterLink>
</RouterLink> </div>
</nav> </nav>
</div> </div>
<div class="content"> <div class="content">
@ -19,36 +19,33 @@
</div> </div>
</template> </template>
<script> <script setup>
import { ref, computed } from 'vue'
import { RouterLink, RouterView } from 'vue-router' import { RouterLink, RouterView } from 'vue-router'
export default {
data(){ const navExpanded = ref(true)
return { const navExpandedAni = ref(true)
navExpanded: true,
} const accounts = ref([
}, {'email': 'user@example.com', 'boxes': ['Inbox', 'Sent', 'Junk', 'Trash']},
computed: { ])
appHeight: {
get(){ const appHeight = computed(()=>window.innerHeight)
return window.innerHeight; const navExpandedAttr = computed(()=>navExpanded.value ?'expanded-nav' :null)
}
}, var toggleNavExpanding = false;
navExpandedAttr: { function toggleNavExpand(){
get(){ if(toggleNavExpanding){
return this.navExpanded ?'expanded-nav' :null; return;
}
}
},
methods: {
triggerNavExpand(){
this.navExpanded = !this.navExpanded;
}
},
components: {
RouterLink,
RouterView
} }
toggleNavExpanding = true;
navExpandedAni.value = !navExpandedAni.value;
setTimeout(()=>{
navExpanded.value = navExpandedAni.value;
toggleNavExpanding = false;
}, 350);
} }
</script> </script>
<style scoped> <style scoped>
@ -58,27 +55,54 @@ export default {
} }
.side-nav { .side-nav {
width: 3rem; width: 3.8rem;
padding: 0.5rem 0; padding: 0.5rem 0;
margin-right: 1rem; margin-right: 1rem;
box-shadow: 1px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
overflow: hidden;
border-right: 1px solid var(--color-border);
} }
.side-nav[expanded-nav] { .side-nav[expanded-nav] {
/*width: fit-content;*/ width: 15rem;
width: 12rem;
box-shadow: #000 0px 0px 20px 0px;
} }
.logo { .-side-nav-expand {
animation: -side-nav-expand 0.5s ease-out;
}
.-side-nav-expand-reverse {
animation: -side-nav-expand-reverse 0.4s;
}
@keyframes -side-nav-expand {
from {
width: 3.8rem;
}
to {
width: 15rem;
}
}
@keyframes -side-nav-expand-reverse {
from {
width: 15rem;
}
to {
width: 3.8rem;
}
}
.side-nav .logo {
box-sizing: content-box; box-sizing: content-box;
display: block; display: block;
width: 2rem; width: 2rem;
height: 2rem; height: 2rem;
padding: 0.5rem 0.7rem 0.5rem 0.8rem; padding: 0.5rem 0.7rem 0.5rem calc(100% - 3rem);
margin-right: 0.2rem;
border: 1px solid var(--color-border); border: 1px solid var(--color-border);
border-left: none; border-left: none;
border-radius: 0 1.5rem 1.5rem 0; border-radius: 0 1.5rem 1.5rem 0;
@ -97,30 +121,36 @@ export default {
flex-direction: column; flex-direction: column;
} }
.nav-account {
display: block;
height: 1.7rem;
padding: 0 0.6rem;
font-size: 1rem;
font-weight: 300;
overflow-x: hidden;
text-overflow: ellipsis;
}
.side-nav nav a { .side-nav nav a {
display: block; display: block;
height: 1.7rem; height: 1.7rem;
padding: 0 0.5rem; padding: 0 0.5rem;
margin-left: 0.75rem; margin-left: 0.5rem;
border-left: 1px solid var(--color-border); border-left: 1px solid var(--color-border);
} display: block;
font-size: 1rem;
.side-nav nav .nav-text { font-weight: 450;
font-size: 1.1rem; overflow-x: hidden;
font-weight: 700; text-overflow: ellipsis;
} text-decoration: none;
color: var(--color-text);
.side-nav:not([expanded-nav]) nav .nav-text { transition: 0.4s;
display: none;
} }
.side-nav nav a.router-link-exact-active { .side-nav nav a.router-link-exact-active {
padding-left: 0.7rem; padding-left: 0.7rem;
} color: hsla(160, 100%, 37%, 1);
font-weight: 600;
.side-nav nav a.router-link-exact-active .nav-text {
color: var(--color-text);
font-weight: 900;
} }
.side-nav nav a.router-link-exact-active:hover { .side-nav nav a.router-link-exact-active:hover {

View File

@ -9,10 +9,8 @@
</div> </div>
</template> </template>
<script> <script setup>
export default { defineProps(['msg'])
props: ['msg']
}
</script> </script>
<style scoped> <style scoped>

View File

@ -0,0 +1,20 @@
<template>
<div class="mailbox">
<h2>{{account}}</h2>
<h3 v-if="!isentire">- {{box}}:</h3>
<table></table>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const props = defineProps(['account', 'box'])
const isentire = computed(()=>!props.box)
</script>
<style scoped>
</style>

View File

@ -1,23 +1,28 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHashHistory } from 'vue-router'
import IndexView from '../views/IndexView.vue' import Index from '@/components/Index.vue'
import MailBox from '@/components/MailBox.vue'
const router = createRouter({ const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL), history: createWebHashHistory(),
routes: [ routes: [
{ {
path: '/', path: '/',
name: 'index', name: 'index',
component: IndexView component: Index,
}, },
{ {
path: '/about', path: '/:account/',
name: 'about', name: 'mailbox-all',
// route level code-splitting component: MailBox,
// this generates a separate chunk (About.[hash].js) for this route props: true,
// which is lazy-loaded when the route is visited. },
component: () => import('../views/AboutView.vue') {
path: '/:account/:box',
name: 'mailbox',
component: MailBox,
props: true,
} }
] ]
}) })

View File

@ -1,8 +0,0 @@
<template>
<div class="about">
<h1>This is an about page</h1>
</div>
</template>
<style>
</style>

View File

@ -1,9 +0,0 @@
<template>
<main>
<Index msg="You did it!"/>
</main>
</template>
<script setup>
import Index from '@/components/Index.vue'
</script>