allow note toolbar to scroll

https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#accessibility
This commit is contained in:
Hazelnoot 2025-06-04 15:03:01 -04:00
parent 4d024d1165
commit 25174e837a
9 changed files with 34 additions and 31 deletions

4
locales/index.d.ts vendored
View file

@ -13233,6 +13233,10 @@ export interface Locale extends ILocale {
* Enabled (copy CW and prepend "RE:") * Enabled (copy CW and prepend "RE:")
*/ */
"keepCwPrependRe": string; "keepCwPrependRe": string;
/**
* Note controls
*/
"noteFooterLabel": string;
} }
declare const locales: { declare const locales: {
[lang: string]: Locale; [lang: string]: Locale;

View file

@ -113,7 +113,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkA :to="`/notes/${appearNote.id}/reactions`" :class="[$style.reactionOmitted]">{{ i18n.ts.more }}</MkA> <MkA :to="`/notes/${appearNote.id}/reactions`" :class="[$style.reactionOmitted]">{{ i18n.ts.more }}</MkA>
</template> </template>
</MkReactionsViewer> </MkReactionsViewer>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<button :class="$style.footerButton" class="_button" @click.stop @click="reply()"> <button :class="$style.footerButton" class="_button" @click.stop @click="reply()">
<i class="ti ti-arrow-back-up"></i> <i class="ti ti-arrow-back-up"></i>
<p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ number(appearNote.repliesCount) }}</p> <p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ number(appearNote.repliesCount) }}</p>
@ -913,11 +913,11 @@ function emitUpdReaction(emoji: string, delta: number) {
.footer { .footer {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: flex-start;
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
max-width: 400px; overflow-x: auto;
} }
&:hover > .article > .main > .footer > .footerButton { &:hover > .article > .main > .footer > .footerButton {

View file

@ -118,7 +118,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
<MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ti ti-device-tv"></i> {{ appearNote.channel.name }}</MkA> <MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ti ti-device-tv"></i> {{ appearNote.channel.name }}</MkA>
</div> </div>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<div :class="$style.noteFooterInfo"> <div :class="$style.noteFooterInfo">
<div v-if="appearNote.updatedAt"> <div v-if="appearNote.updatedAt">
{{ i18n.ts.edited }}: <MkTime :time="appearNote.updatedAt" mode="detail"/> {{ i18n.ts.edited }}: <MkTime :time="appearNote.updatedAt" mode="detail"/>
@ -889,9 +889,7 @@ function animatedMFM() {
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
width: max-content; overflow-x: auto;
min-width: min-content;
max-width: fit-content;
} }
.replyTo { .replyTo {

View file

@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkSubNoteContent :class="$style.text" :note="note" :translating="translating" :translation="translation" :expandAllCws="props.expandAllCws"/> <MkSubNoteContent :class="$style.text" :note="note" :translating="translating" :translation="translation" :expandAllCws="props.expandAllCws"/>
</div> </div>
</div> </div>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<MkReactionsViewer ref="reactionsViewer" :note="note"/> <MkReactionsViewer ref="reactionsViewer" :note="note"/>
<button class="_button" :class="$style.noteFooterButton" @click="reply()"> <button class="_button" :class="$style.noteFooterButton" @click="reply()">
<i class="ph-arrow-u-up-left ph-bold ph-lg"></i> <i class="ph-arrow-u-up-left ph-bold ph-lg"></i>
@ -422,9 +422,7 @@ if (props.detail) {
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
width: max-content; overflow-x: auto;
min-width: min-content;
max-width: fit-content;
} }
.main { .main {

View file

@ -114,7 +114,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkA :to="`/notes/${appearNote.id}/reactions`" :class="[$style.reactionOmitted]">{{ i18n.ts.more }}</MkA> <MkA :to="`/notes/${appearNote.id}/reactions`" :class="[$style.reactionOmitted]">{{ i18n.ts.more }}</MkA>
</template> </template>
</MkReactionsViewer> </MkReactionsViewer>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<button :class="$style.footerButton" class="_button" @click.stop @click="reply()"> <button :class="$style.footerButton" class="_button" @click.stop @click="reply()">
<i class="ti ti-arrow-back-up"></i> <i class="ti ti-arrow-back-up"></i>
<p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ number(appearNote.repliesCount) }}</p> <p v-if="appearNote.repliesCount > 0" :class="$style.footerButtonCount">{{ number(appearNote.repliesCount) }}</p>
@ -921,11 +921,11 @@ function emitUpdReaction(emoji: string, delta: number) {
.footer { .footer {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: flex-start;
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
max-width: 400px; overflow-x: auto;
} }
&:hover > .article > .main > .footer > .footerButton { &:hover > .article > .main > .footer > .footerButton {

View file

@ -132,7 +132,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkA> </MkA>
</div> </div>
<MkReactionsViewer v-if="appearNote.reactionAcceptance !== 'likeOnly'" ref="reactionsViewer" style="margin-top: 6px;" :note="appearNote"/> <MkReactionsViewer v-if="appearNote.reactionAcceptance !== 'likeOnly'" ref="reactionsViewer" style="margin-top: 6px;" :note="appearNote"/>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<button class="_button" :class="$style.noteFooterButton" @click="reply()"> <button class="_button" :class="$style.noteFooterButton" @click="reply()">
<i class="ti ti-arrow-back-up"></i> <i class="ti ti-arrow-back-up"></i>
<p v-if="appearNote.repliesCount > 0" :class="$style.noteFooterButtonCount">{{ number(appearNote.repliesCount) }}</p> <p v-if="appearNote.repliesCount > 0" :class="$style.noteFooterButtonCount">{{ number(appearNote.repliesCount) }}</p>
@ -918,13 +918,13 @@ onUnmounted(() => {
} }
.footer { .footer {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: flex-start;
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
max-width: 400px; overflow-x: auto;
} }
.replyTo { .replyTo {

View file

@ -28,7 +28,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
</div> </div>
<MkReactionsViewer ref="reactionsViewer" :note="note"/> <MkReactionsViewer ref="reactionsViewer" :note="note"/>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<button class="_button" :class="$style.noteFooterButton" @click="reply()"> <button class="_button" :class="$style.noteFooterButton" @click="reply()">
<i class="ph-arrow-u-up-left ph-bold ph-lg"></i> <i class="ph-arrow-u-up-left ph-bold ph-lg"></i>
<p v-if="note.repliesCount > 0" :class="$style.noteFooterButtonCount">{{ note.repliesCount }}</p> <p v-if="note.repliesCount > 0" :class="$style.noteFooterButtonCount">{{ note.repliesCount }}</p>
@ -449,11 +449,11 @@ if (props.detail) {
.footer { .footer {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: flex-start;
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
max-width: 400px; overflow-x: auto;
} }
.main { .main {

View file

@ -52,7 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
</div> </div>
<MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ph-television ph-bold ph-lg"></i> {{ appearNote.channel.name }}</MkA> <MkA v-if="appearNote.channel && !inChannel" :class="$style.channel" :to="`/channels/${appearNote.channel.id}`"><i class="ph-television ph-bold ph-lg"></i> {{ appearNote.channel.name }}</MkA>
</div> </div>
<footer :class="$style.footer" class="_gaps _h_gaps"> <footer :class="$style.footer" class="_gaps _h_gaps" tabindex="0" role="group" :aria-label="i18n.ts.noteFooterLabel">
<div :class="$style.noteFooterInfo"> <div :class="$style.noteFooterInfo">
<MkTime :time="appearNote.createdAt" mode="detail"/> <MkTime :time="appearNote.createdAt" mode="detail"/>
</div> </div>
@ -163,11 +163,12 @@ const showTicker = (prefer.s.instanceTicker === 'always') || (prefer.s.instanceT
} }
.footer { .footer {
position: relative; position: relative;
z-index: 1; z-index: 1;
margin-top: 0.4em; margin-top: 0.4em;
width: max-content; width: max-content;
min-width: max-content; min-width: max-content;
overflow-x: auto;
} }
.note { .note {

View file

@ -619,3 +619,5 @@ keepCwDescription: "When replying to a post with a Content Warning, automaticall
keepCwDisabled: "Disabled (do not copy CWs)" keepCwDisabled: "Disabled (do not copy CWs)"
keepCwEnabled: "Enabled (copy CWs verbatim)" keepCwEnabled: "Enabled (copy CWs verbatim)"
keepCwPrependRe: "Enabled (copy CW and prepend \"RE:\")" keepCwPrependRe: "Enabled (copy CW and prepend \"RE:\")"
noteFooterLabel: "Note controls"