node
This commit is contained in:
parent
9c2494777d
commit
73fb1b250b
146
src/App.vue
146
src/App.vue
@ -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 {
|
||||||
|
@ -9,10 +9,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
export default {
|
defineProps(['msg'])
|
||||||
props: ['msg']
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
20
src/components/MailBox.vue
Normal file
20
src/components/MailBox.vue
Normal 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>
|
@ -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,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="about">
|
|
||||||
<h1>This is an about page</h1>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
</style>
|
|
@ -1,9 +0,0 @@
|
|||||||
<template>
|
|
||||||
<main>
|
|
||||||
<Index msg="You did it!"/>
|
|
||||||
</main>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import Index from '@/components/Index.vue'
|
|
||||||
</script>
|
|
Loading…
x
Reference in New Issue
Block a user