From b07916309e69e2a127b9ef62920e46611e9d4704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oriol=20G=C3=B3mez?= Date: Fri, 22 Aug 2025 06:47:08 +0200 Subject: [PATCH] fix/a11y: fix focus server input, double focus on messsages view and show only active channel info button --- .../src/components/chat/MessageItem.vue | 2 +- .../src/components/chat/MessagesContainer.vue | 67 +++++++------------ .../components/sidebar/ChannelListItem.vue | 2 +- frontend-vue/src/views/AuthView.vue | 7 +- 4 files changed, 31 insertions(+), 47 deletions(-) diff --git a/frontend-vue/src/components/chat/MessageItem.vue b/frontend-vue/src/components/chat/MessageItem.vue index 54a8ef1..eed3e07 100644 --- a/frontend-vue/src/components/chat/MessageItem.vue +++ b/frontend-vue/src/components/chat/MessageItem.vue @@ -5,7 +5,7 @@ { 'message--unsent': isUnsent } ]" :data-message-id="message.id" - :tabindex="tabindex || 0" + :tabindex="tabindex || -1" :aria-label="messageAriaLabel" role="listitem" @keydown="handleKeydown" diff --git a/frontend-vue/src/components/chat/MessagesContainer.vue b/frontend-vue/src/components/chat/MessagesContainer.vue index a7da484..891e4b3 100644 --- a/frontend-vue/src/components/chat/MessagesContainer.vue +++ b/frontend-vue/src/components/chat/MessagesContainer.vue @@ -1,33 +1,16 @@ @@ -59,13 +42,13 @@ const totalMessages = computed(() => allMessages.value.length) const messagesAriaLabel = computed(() => { const total = totalMessages.value const current = focusedMessageIndex.value + 1 - + if (total === 0) { return 'Messages list, no messages' } else if (total === 1) { return 'Messages list, 1 message' } else { - return `Messages list, ${total} messages, currently focused on message ${current} of ${total}` + return `Messages list, ${total} messages` } }) @@ -74,50 +57,50 @@ const navigationHint = 'Use arrow keys to navigate, Page Up/Down to jump 10 mess // Keyboard navigation const handleKeydown = (event: KeyboardEvent) => { if (totalMessages.value === 0) return - + let newIndex = focusedMessageIndex.value - + switch (event.key) { case 'ArrowUp': event.preventDefault() newIndex = Math.max(0, focusedMessageIndex.value - 1) break - + case 'ArrowDown': event.preventDefault() newIndex = Math.min(totalMessages.value - 1, focusedMessageIndex.value + 1) break - + case 'PageUp': event.preventDefault() newIndex = Math.max(0, focusedMessageIndex.value - 10) break - + case 'PageDown': event.preventDefault() newIndex = Math.min(totalMessages.value - 1, focusedMessageIndex.value + 10) break - + case 'Home': event.preventDefault() newIndex = 0 break - + case 'End': event.preventDefault() newIndex = totalMessages.value - 1 break - + case 'Enter': case ' ': event.preventDefault() selectCurrentMessage() return - + default: return } - + if (newIndex !== focusedMessageIndex.value) { focusMessage(newIndex) } @@ -229,19 +212,19 @@ defineExpose({ .messages-container { background: #111827; } - + .messages-container:focus { outline-color: #60a5fa; } - + .messages-container::-webkit-scrollbar-track { background: #1f2937; } - + .messages-container::-webkit-scrollbar-thumb { background: #4b5563; } - + .messages-container::-webkit-scrollbar-thumb:hover { background: #6b7280; } diff --git a/frontend-vue/src/components/sidebar/ChannelListItem.vue b/frontend-vue/src/components/sidebar/ChannelListItem.vue index ba4f68a..430c06a 100644 --- a/frontend-vue/src/components/sidebar/ChannelListItem.vue +++ b/frontend-vue/src/components/sidebar/ChannelListItem.vue @@ -23,7 +23,7 @@ -