| <template> |
| <div |
| class="dropdown-wrapper" |
| :class="{ open }" |
| > |
| <a |
| class="dropdown-title" |
| @click="toggle" |
| > |
| <span class="title">{{ item.text }}</span> |
| <span |
| class="arrow" |
| :class="open ? 'down' : 'right'" |
| ></span> |
| </a> |
| |
| <DropdownTransition> |
| <ul |
| class="nav-dropdown" |
| v-show="open" |
| > |
| <li |
| class="dropdown-item" |
| :key="subItem.link || index" |
| v-for="(subItem, index) in item.items" |
| > |
| <h4 v-if="subItem.type === 'links'">{{ subItem.text }}</h4> |
| |
| <ul |
| class="dropdown-subitem-wrapper" |
| v-if="subItem.type === 'links'" |
| > |
| <li |
| class="dropdown-subitem" |
| :key="childSubItem.link" |
| v-for="childSubItem in subItem.items" |
| > |
| <NavLink :item="childSubItem"/> |
| </li> |
| </ul> |
| |
| <NavLink |
| v-else |
| :item="subItem" |
| /> |
| </li> |
| </ul> |
| </DropdownTransition> |
| </div> |
| </template> |
| |
| <script> |
| import NavLink from './NavLink.vue' |
| import DropdownTransition from './DropdownTransition.vue' |
| |
| export default { |
| components: { NavLink, DropdownTransition }, |
| |
| data () { |
| return { |
| open: false |
| } |
| }, |
| |
| props: { |
| item: { |
| required: true |
| } |
| }, |
| |
| methods: { |
| toggle () { |
| this.open = !this.open |
| } |
| } |
| } |
| </script> |
| |
| <style lang="stylus"> |
| @import './styles/config.styl' |
| |
| .dropdown-wrapper |
| cursor pointer |
| .dropdown-title |
| display block |
| &:hover |
| border-color transparent |
| .arrow |
| vertical-align middle |
| margin-top -1px |
| margin-left 0.4rem |
| .nav-dropdown |
| .dropdown-item |
| color inherit |
| line-height 1.7rem |
| h4 |
| margin 0.45rem 0 0 |
| border-top 1px solid #eee |
| padding 0.45rem 1.5rem 0 1.25rem |
| .dropdown-subitem-wrapper |
| padding 0 |
| list-style none |
| .dropdown-subitem |
| font-size 0.9em |
| a |
| display block |
| line-height 1.7rem |
| position relative |
| border-bottom none |
| font-weight 400 |
| margin-bottom 0 |
| padding 0 1.5rem 0 1.25rem |
| &:hover |
| color $accentColor |
| &.router-link-active |
| color $accentColor |
| &::after |
| content "" |
| width 0 |
| height 0 |
| border-left 5px solid $accentColor |
| border-top 3px solid transparent |
| border-bottom 3px solid transparent |
| position absolute |
| top calc(50% - 2px) |
| left 9px |
| &:first-child h4 |
| margin-top 0 |
| padding-top 0 |
| border-top 0 |
| |
| @media (max-width: $MQMobile) |
| .dropdown-wrapper |
| &.open .dropdown-title |
| margin-bottom 0.5rem |
| .nav-dropdown |
| transition height .1s ease-out |
| overflow hidden |
| .dropdown-item |
| h4 |
| border-top 0 |
| margin-top 0 |
| padding-top 0 |
| h4, & > a |
| font-size 15px |
| line-height 2rem |
| .dropdown-subitem |
| font-size 14px |
| padding-left 1rem |
| |
| @media (min-width: $MQMobile) |
| .dropdown-wrapper |
| height 1.8rem |
| &:hover .nav-dropdown |
| // override the inline style. |
| display block !important |
| .dropdown-title .arrow |
| // make the arrow always down at desktop |
| border-left 4px solid transparent |
| border-right 4px solid transparent |
| border-top 6px solid $arrowBgColor |
| border-bottom 0 |
| .nav-dropdown |
| display none |
| // Avoid height shaked by clicking |
| height auto !important |
| box-sizing border-box; |
| max-height calc(100vh - 2.7rem) |
| overflow-y auto |
| position absolute |
| top 100% |
| right 0 |
| background-color #fff |
| padding 0.6rem 0 |
| border 1px solid #ddd |
| border-bottom-color #ccc |
| text-align left |
| border-radius 0.25rem |
| white-space nowrap |
| margin 0 |
| </style> |