<template> <span class="stash-container"> <Tooltip class="stash-trigger"> <Icon v-show="me" icon="menu" class="stash noselect" :class="{ stashed }" /> <template v-slot:tooltip> <StashMenu :stashed-by="stashedBy" @stash="(stashId) => $emit('stash', stashId)" @unstash="(stashId) => $emit('unstash', stashId)" /> </template> </Tooltip> <Icon v-show="me && favorited" icon="heart7" class="stash stashed noselect" @click.native="() => $emit('unstash', favorites.id)" /> <Icon v-show="me && !favorited" icon="heart8" class="stash unstashed noselect" @click.native="() => $emit('stash', favorites.id)" /> </span> </template> <script> import StashMenu from './menu.vue'; function favorited() { return this.stashedBy.some(stash => stash.primary); } function stashed() { return this.stashedBy.some(stash => !stash.primary); } function favorites() { return this.$store.getters.favorites; } function me() { return this.$store.state.auth.user; } export default { components: { StashMenu, }, props: { stashedBy: { type: Array, default: () => [], }, }, emits: ['stash', 'unstash'], computed: { me, favorites, favorited, stashed, }, }; </script> <style lang="scss" scoped> @import 'breakpoints'; .stash-container { flex-shrink: 0; &.light .icon { fill: var(--lighten); } } .stash.icon { width: 1.5rem; height: 1.5rem; padding: 0 .5rem; fill: var(--shadow); &.stashed { fill: var(--primary); } &:hover { fill: var(--primary); cursor: pointer; } } .stash-trigger { display: inline-block; } @media(max-width: $breakpoint) { .stash.icon { width: 1.25rem; height: 1.25rem; } } </style>