Merge branch 'tusooa/reaction-accessibility' into 'develop'

Reaction accessibility

See merge request pleroma/pleroma-fe!1827
This commit is contained in:
HJ 2023-05-23 08:24:56 +00:00
commit b6cef856f9
4 changed files with 137 additions and 22 deletions

View File

@ -1,5 +1,17 @@
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import UserListPopover from '../user_list_popover/user_list_popover.vue' import UserListPopover from '../user_list_popover/user_list_popover.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faPlus,
faMinus,
faCheck
} from '@fortawesome/free-solid-svg-icons'
library.add(
faPlus,
faMinus,
faCheck
)
const EMOJI_REACTION_COUNT_CUTOFF = 12 const EMOJI_REACTION_COUNT_CUTOFF = 12
@ -33,6 +45,9 @@ const EmojiReactions = {
}, },
loggedIn () { loggedIn () {
return !!this.$store.state.users.currentUser return !!this.$store.state.users.currentUser
},
remoteInteractionLink () {
return this.$store.getters.remoteInteractionLink({ statusId: this.status.id })
} }
}, },
methods: { methods: {
@ -62,6 +77,17 @@ const EmojiReactions = {
} else { } else {
this.reactWith(emoji) this.reactWith(emoji)
} }
},
counterTriggerAttrs (reaction) {
return {
class: [
'btn',
'button-default',
'emoji-reaction-count-button',
{ '-picked-reaction': this.reactedWith(reaction.name) }
],
'aria-label': this.$tc('status.reaction_count_label', reaction.count, { num: reaction.count })
}
} }
} }
} }

View File

@ -1,15 +1,19 @@
<template> <template>
<div class="EmojiReactions"> <div class="EmojiReactions">
<UserListPopover <span
v-for="(reaction) in emojiReactions" v-for="(reaction) in emojiReactions"
:key="reaction.url || reaction.name" :key="reaction.url || reaction.name"
:users="accountsForEmoji[reaction.name]" class="emoji-reaction-container btn-group"
> >
<button <component
:is="loggedIn ? 'button' : 'a'"
v-bind="!loggedIn ? { href: remoteInteractionLink } : {}"
role="button"
class="emoji-reaction btn button-default" class="emoji-reaction btn button-default"
:class="{ '-picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }" :class="{ '-picked-reaction': reactedWith(reaction.name) }"
:title="reaction.url ? reaction.name : undefined"
:aria-pressed="reactedWith(reaction.name)"
@click="emojiOnClick(reaction.name, $event)" @click="emojiOnClick(reaction.name, $event)"
@mouseenter="fetchEmojiReactionsByIfMissing()"
> >
<span <span
class="reaction-emoji" class="reaction-emoji"
@ -17,7 +21,6 @@
<img <img
v-if="reaction.url" v-if="reaction.url"
:src="reaction.url" :src="reaction.url"
:title="reaction.name"
class="reaction-emoji-content" class="reaction-emoji-content"
width="1em" width="1em"
> >
@ -26,9 +29,36 @@
class="reaction-emoji reaction-emoji-content" class="reaction-emoji reaction-emoji-content"
>{{ reaction.name }}</span> >{{ reaction.name }}</span>
</span> </span>
<span>{{ reaction.count }}</span> <FALayers>
</button> <FAIcon
v-if="reactedWith(reaction.name)"
class="active-marker"
transform="shrink-6 up-9"
icon="check"
/>
<FAIcon
v-if="!reactedWith(reaction.name)"
class="focus-marker"
transform="shrink-6 up-9"
icon="plus"
/>
<FAIcon
v-else
class="focus-marker"
transform="shrink-6 up-9"
icon="minus"
/>
</FALayers>
</component>
<UserListPopover
:users="accountsForEmoji[reaction.name]"
class="emoji-reaction-popover"
:trigger-attrs="counterTriggerAttrs(reaction)"
@show="fetchEmojiReactionsByIfMissing()"
>
<span class="emoji-reaction-counts">{{ reaction.count }}</span>
</UserListPopover> </UserListPopover>
</span>
<a <a
v-if="tooManyReactions" v-if="tooManyReactions"
class="emoji-reaction-expand faint" class="emoji-reaction-expand faint"
@ -43,6 +73,7 @@
<script src="./emoji_reactions.js"></script> <script src="./emoji_reactions.js"></script>
<style lang="scss"> <style lang="scss">
@import "../../variables"; @import "../../variables";
@import "../../mixins";
.EmojiReactions { .EmojiReactions {
display: flex; display: flex;
@ -51,14 +82,44 @@
--emoji-size: calc(1.25em * var(--emojiReactionsScale, 1)); --emoji-size: calc(1.25em * var(--emojiReactionsScale, 1));
.emoji-reaction { .emoji-reaction-container {
padding: 0 0.5em; display: flex;
margin-right: 0.5em; align-items: stretch;
margin-top: 0.5em; margin-top: 0.5em;
margin-right: 0.5em;
.emoji-reaction-popover {
padding: 0;
.emoji-reaction-count-button {
background-color: var(--btn);
height: 100%;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
box-sizing: border-box;
min-width: 2em;
display: inline-flex;
justify-content: center;
align-items: center;
color: $fallback--text;
color: var(--btnText, $fallback--text);
&.-picked-reaction {
border: 1px solid var(--accent, $fallback--link);
margin-right: -1px;
}
}
}
}
.emoji-reaction {
padding-left: 0.5em;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
box-sizing: border-box; box-sizing: border-box;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
.reaction-emoji { .reaction-emoji {
width: var(--emoji-size); width: var(--emoji-size);
@ -85,19 +146,45 @@
outline: none; outline: none;
} }
&.not-clickable { .svg-inline--fa {
cursor: default; color: $fallback--text;
color: var(--btnText, $fallback--text);
&:hover {
box-shadow: $fallback--buttonShadow;
box-shadow: var(--buttonShadow);
}
} }
&.-picked-reaction { &.-picked-reaction {
border: 1px solid var(--accent, $fallback--link); border: 1px solid var(--accent, $fallback--link);
margin-left: -1px; // offset the border, can't use inset shadows either margin-left: -1px; // offset the border, can't use inset shadows either
margin-right: calc(0.5em - 1px); margin-right: -1px;
.svg-inline--fa {
color: $fallback--link;
color: var(--accent, $fallback--link);
}
}
@include unfocused-style {
.focus-marker {
visibility: hidden;
}
.active-marker {
visibility: visible;
}
}
@include focused-style {
.svg-inline--fa {
color: $fallback--link;
color: var(--accent, $fallback--link);
}
.focus-marker {
visibility: visible;
}
.active-marker {
visibility: hidden;
}
} }
} }

View File

@ -125,7 +125,8 @@
v-if="notification.emoji_url" v-if="notification.emoji_url"
class="emoji-reaction-emoji emoji-reaction-emoji-image" class="emoji-reaction-emoji emoji-reaction-emoji-image"
:src="notification.emoji_url" :src="notification.emoji_url"
:name="notification.emoji" :alt="notification.emoji"
:title="notification.emoji"
> >
<span <span
v-else v-else

View File

@ -933,7 +933,8 @@
"show_all_conversation_with_icon": "{icon} {text}", "show_all_conversation_with_icon": "{icon} {text}",
"show_all_conversation": "Show full conversation ({numStatus} other status) | Show full conversation ({numStatus} other statuses)", "show_all_conversation": "Show full conversation ({numStatus} other status) | Show full conversation ({numStatus} other statuses)",
"show_only_conversation_under_this": "Only show replies to this status", "show_only_conversation_under_this": "Only show replies to this status",
"status_history": "Status history" "status_history": "Status history",
"reaction_count_label": "{num} person reacted | {num} people reacted"
}, },
"user_card": { "user_card": {
"approve": "Approve", "approve": "Approve",