make custom router-link for nav-entry to un-nest the interactive elements

This commit is contained in:
Henry Jameson 2022-08-31 00:48:38 +03:00
parent 8b25febe36
commit 8ecb67230c
4 changed files with 100 additions and 68 deletions

View File

@ -121,7 +121,6 @@
border-bottom: 1px solid; border-bottom: 1px solid;
border-color: $fallback--border; border-color: $fallback--border;
border-color: var(--border, $fallback--border); border-color: var(--border, $fallback--border);
padding: 0;
} }
> li { > li {
@ -150,12 +149,6 @@
font-size: 1.1em; font-size: 1.1em;
} }
.menu-item {
.timelines-chevron {
margin-right: 0;
}
}
.timelines-background { .timelines-background {
padding: 0 0 0 0.6em; padding: 0 0 0 0.6em;
background-color: $fallback--lightBg; background-color: $fallback--lightBg;

View File

@ -1,5 +1,6 @@
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { USERNAME_ROUTES } from 'src/components/navigation/navigation.js' import { USERNAME_ROUTES } from 'src/components/navigation/navigation.js'
import OptionalRouterLink from 'src/components/optional_router_link/optional_router_link.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faThumbtack } from '@fortawesome/free-solid-svg-icons' import { faThumbtack } from '@fortawesome/free-solid-svg-icons'
@ -7,6 +8,9 @@ library.add(faThumbtack)
const NavigationEntry = { const NavigationEntry = {
props: ['item', 'showPin'], props: ['item', 'showPin'],
components: {
OptionalRouterLink
},
methods: { methods: {
isPinned (value) { isPinned (value) {
return this.pinnedItems.has(value) return this.pinnedItems.has(value)

View File

@ -1,9 +1,19 @@
<template> <template>
<li class="NavigationEntry"> <OptionalRouterLink
<component ass="ass"
:is="routeTo ? 'router-link' : 'button'"
class="menu-item button-unstyled"
:to="routeTo" :to="routeTo"
v-slot="{ isActive, href, navigate } = {}"
>
<li
class="NavigationEntry menu-item"
:class="{ '-active': isActive }"
v-bind="$attrs"
>
<component
class="main-link button-unstyled"
:is="routeTo ? 'a' : 'button'"
:href="href"
@click="navigate"
> >
<span> <span>
<FAIcon <FAIcon
@ -21,6 +31,7 @@
<span class="label"> <span class="label">
{{ item.labelRaw || $t(item.label) }} {{ item.labelRaw || $t(item.label) }}
</span> </span>
</component>
<slot /> <slot />
<div <div
v-if="item.badgeGetter && getters[item.badgeGetter]" v-if="item.badgeGetter && getters[item.badgeGetter]"
@ -45,8 +56,8 @@
icon="thumbtack" icon="thumbtack"
/> />
</button> </button>
</component>
</li> </li>
</OptionalRouterLink>
</template> </template>
<script src="./navigation_entry.js"></script> <script src="./navigation_entry.js"></script>
@ -55,7 +66,21 @@
@import '../../_variables.scss'; @import '../../_variables.scss';
.NavigationEntry { .NavigationEntry {
.label { display: flex;
box-sizing: border-box;
align-items: baseline;
height: 3.5em;
line-height: 3.5em;
padding: 0 1em;
width: 100%;
color: $fallback--link;
color: var(--link, $fallback--link);
.timelines-chevron {
margin-right: 0;
}
.main-link {
flex: 1; flex: 1;
} }
@ -72,17 +97,6 @@
} }
} }
.menu-item {
display: flex;
box-sizing: border-box;
align-items: baseline;
height: 3.5em;
line-height: 3.5em;
padding: 0 1em;
width: 100%;
color: $fallback--link;
color: var(--link, $fallback--link);
&:hover { &:hover {
background-color: $fallback--lightBg; background-color: $fallback--lightBg;
background-color: var(--selectedMenu, $fallback--lightBg); background-color: var(--selectedMenu, $fallback--lightBg);
@ -97,7 +111,7 @@
} }
} }
&.router-link-active { &.-active {
font-weight: bolder; font-weight: bolder;
background-color: $fallback--lightBg; background-color: $fallback--lightBg;
background-color: var(--selectedMenu, $fallback--lightBg); background-color: var(--selectedMenu, $fallback--lightBg);
@ -116,5 +130,4 @@
} }
} }
} }
}
</style> </style>

View File

@ -0,0 +1,22 @@
<template>
<router-link
v-if="to"
:to="to"
custom
v-slot="props"
>
<slot
v-bind="props"
/>
</router-link>
<slot
v-else
v-bind="{}"
/>
</template>
<script>
export default {
props: ['to']
}
</script>