2018-02-18 12:35:18 +09:00
|
|
|
<template>
|
2018-02-20 07:58:21 +09:00
|
|
|
<ul class="menu">
|
2018-06-08 11:46:45 +09:00
|
|
|
<li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
|
|
|
|
<template v-if="item">
|
|
|
|
<template v-if="item.type == null || item.type == 'item'">
|
|
|
|
<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
|
|
|
|
</template>
|
|
|
|
<template v-else-if="item.type == 'link'">
|
|
|
|
<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
|
|
|
|
</template>
|
|
|
|
<template v-else-if="item.type == 'nest'">
|
|
|
|
<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
|
|
|
|
<me-nu :menu="item.menu" @x="click"/>
|
|
|
|
</template>
|
2018-02-18 12:35:18 +09:00
|
|
|
</template>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
|
|
import Vue from 'vue';
|
|
|
|
export default Vue.extend({
|
|
|
|
name: 'me-nu',
|
|
|
|
props: ['menu'],
|
|
|
|
methods: {
|
|
|
|
click(item) {
|
|
|
|
this.$emit('x', item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="stylus" scoped>
|
2018-03-03 13:47:55 +09:00
|
|
|
@import '~const.styl'
|
|
|
|
|
2018-04-20 07:45:37 +09:00
|
|
|
root(isDark)
|
2018-02-18 12:35:18 +09:00
|
|
|
$width = 240px
|
|
|
|
$item-height = 38px
|
|
|
|
$padding = 10px
|
|
|
|
|
2018-02-18 13:48:40 +09:00
|
|
|
margin 0
|
|
|
|
padding $padding 0
|
|
|
|
list-style none
|
2018-02-18 12:35:18 +09:00
|
|
|
|
|
|
|
li
|
|
|
|
display block
|
|
|
|
|
2018-02-18 15:27:06 +09:00
|
|
|
&.divider
|
2018-02-18 12:35:18 +09:00
|
|
|
margin-top $padding
|
|
|
|
padding-top $padding
|
2018-04-20 07:45:37 +09:00
|
|
|
border-top solid 1px isDark ? #1c2023 : #eee
|
2018-02-18 12:35:18 +09:00
|
|
|
|
|
|
|
&.nest
|
|
|
|
> p
|
|
|
|
cursor default
|
|
|
|
|
|
|
|
> .caret
|
2018-02-18 15:27:06 +09:00
|
|
|
position absolute
|
|
|
|
top 0
|
|
|
|
right 8px
|
|
|
|
|
2018-02-18 12:35:18 +09:00
|
|
|
> *
|
|
|
|
line-height $item-height
|
2018-02-18 15:27:06 +09:00
|
|
|
width 28px
|
|
|
|
text-align center
|
2018-02-18 12:35:18 +09:00
|
|
|
|
|
|
|
&:hover > ul
|
|
|
|
visibility visible
|
|
|
|
|
|
|
|
&:active
|
|
|
|
> p, a
|
|
|
|
background $theme-color
|
|
|
|
|
|
|
|
> p, a
|
|
|
|
display block
|
|
|
|
z-index 1
|
|
|
|
margin 0
|
|
|
|
padding 0 32px 0 38px
|
|
|
|
line-height $item-height
|
2018-04-20 07:45:37 +09:00
|
|
|
color isDark ? #c8cece : #868C8C
|
2018-02-18 12:35:18 +09:00
|
|
|
text-decoration none
|
|
|
|
cursor pointer
|
|
|
|
|
|
|
|
&:hover
|
|
|
|
text-decoration none
|
|
|
|
|
|
|
|
*
|
|
|
|
pointer-events none
|
|
|
|
|
|
|
|
&:hover
|
|
|
|
> p, a
|
|
|
|
text-decoration none
|
|
|
|
background $theme-color
|
|
|
|
color $theme-color-foreground
|
|
|
|
|
|
|
|
&:active
|
|
|
|
> p, a
|
|
|
|
text-decoration none
|
|
|
|
background darken($theme-color, 10%)
|
|
|
|
color $theme-color-foreground
|
|
|
|
|
|
|
|
li > ul
|
|
|
|
visibility hidden
|
|
|
|
position absolute
|
|
|
|
top 0
|
|
|
|
left $width
|
|
|
|
margin-top -($padding)
|
|
|
|
width $width
|
2018-04-20 07:45:37 +09:00
|
|
|
background isDark ? #282c37 :#fff
|
2018-02-18 12:35:18 +09:00
|
|
|
border-radius 0 4px 4px 4px
|
2018-04-29 08:51:17 +09:00
|
|
|
box-shadow 2px 2px 8px rgba(#000, 0.2)
|
2018-02-18 12:35:18 +09:00
|
|
|
transition visibility 0s linear 0.2s
|
|
|
|
|
2018-04-20 07:45:37 +09:00
|
|
|
.menu[data-darkmode]
|
|
|
|
root(true)
|
|
|
|
|
|
|
|
.menu:not([data-darkmode])
|
|
|
|
root(false)
|
|
|
|
|
2018-02-18 12:35:18 +09:00
|
|
|
</style>
|
|
|
|
|
2018-02-18 15:27:06 +09:00
|
|
|
<style lang="stylus" module>
|
|
|
|
.icon
|
|
|
|
> *
|
|
|
|
width 28px
|
|
|
|
margin-left -28px
|
|
|
|
text-align center
|
|
|
|
</style>
|
|
|
|
|