From fadeeaa59dae63ff6bed8e422e793e692d7d4932 Mon Sep 17 00:00:00 2001
From: Philipinho <16838612+Philipinho@users.noreply.github.com>
Date: Sat, 18 Apr 2026 13:07:16 +0100
Subject: [PATCH] feat(client): improve accessibility with ARIA labels and
semantics - Add aria-label to icon-only ActionIcon triggers across tree,
comments, share, group, breadcrumbs, templates, AI chat, API keys, and
spaces - Give custom clickable divs/spans (color swatches, status swatches,
load-more, PDF error, comment selection) role="button", tabIndex, and
keyboard handlers - Add listbox/combobox semantics (role, aria-selected,
aria-activedescendant) to slash menu, emoji menu, mention list, and link
editor results - Add aria-haspopup/aria-expanded to bubble-menu triggers
(node, text align, color) and status badge - Add aria-label to
Modal.Root/Dialog instances that lack a title prop (page history, template
preview, trash preview, drawio, comment, find-and-replace, page
verification) - Add en-US translations for new aria-label strings
---
.../public/locales/en-US/translation.json | 21 ++++-
apps/client/src/components/common/copy.tsx | 1 +
.../ui/destination-picker/page-children.tsx | 13 ++-
.../client/src/components/ui/emoji-picker.tsx | 9 +-
.../components/ai-chat-sidebar-item.tsx | 1 +
.../ee/api-key/components/api-key-table.tsx | 6 +-
.../components/page-verification-modal.tsx | 1 +
.../ee/template/components/template-card.tsx | 1 +
.../components/template-preview-modal.tsx | 2 +-
.../comment/components/comment-dialog.tsx | 1 +
.../comment/components/comment-list-item.tsx | 9 ++
.../comment/components/comment-menu.tsx | 6 +-
.../components/bubble-menu/color-selector.tsx | 83 +++++++++++++------
.../components/bubble-menu/node-selector.tsx | 3 +
.../bubble-menu/text-alignment-selector.tsx | 3 +
.../editor/components/drawio/drawio-view.tsx | 8 +-
.../components/emoji-menu/emoji-list.tsx | 16 +++-
.../components/link/link-editor-panel.tsx | 17 ++++
.../components/mention/mention-list.tsx | 27 +++++-
.../editor/components/pdf/pdf-view.tsx | 15 +++-
.../search-and-replace-dialog.tsx | 1 +
.../components/slash-menu/command-list.tsx | 17 +++-
.../editor/components/status/status-view.tsx | 19 +++++
.../group/components/group-action-menu.tsx | 2 +-
.../page-history/components/history-modal.tsx | 2 +
.../components/breadcrumbs/breadcrumb.tsx | 16 +++-
.../components/header/page-header-menu.tsx | 6 +-
.../components/trash-page-content-modal.tsx | 2 +-
.../page/tree/components/space-tree.tsx | 8 ++
.../share/components/share-action-menu.tsx | 2 +-
.../features/share/components/share-shell.tsx | 2 +
.../spaces-page/all-spaces-list.tsx | 6 +-
32 files changed, 274 insertions(+), 52 deletions(-)
diff --git a/apps/client/public/locales/en-US/translation.json b/apps/client/public/locales/en-US/translation.json
index 3bfe7c9f..5e2e5135 100644
--- a/apps/client/public/locales/en-US/translation.json
+++ b/apps/client/public/locales/en-US/translation.json
@@ -880,5 +880,24 @@
"Try a different search term.": "Try a different search term.",
"Try again": "Try again",
"Untitled chat": "Untitled chat",
- "What can I help you with?": "What can I help you with?"
+ "What can I help you with?": "What can I help you with?",
+ "Page menu": "Page menu",
+ "Expand": "Expand",
+ "Collapse": "Collapse",
+ "Comment menu": "Comment menu",
+ "Group menu": "Group menu",
+ "Show hidden breadcrumbs": "Show hidden breadcrumbs",
+ "Breadcrumbs": "Breadcrumbs",
+ "Page actions": "Page actions",
+ "Pick emoji": "Pick emoji",
+ "Template menu": "Template menu",
+ "Chat menu": "Chat menu",
+ "API key menu": "API key menu",
+ "Jump to comment selection": "Jump to comment selection",
+ "Slash commands": "Slash commands",
+ "Mention suggestions": "Mention suggestions",
+ "Link suggestions": "Link suggestions",
+ "Diagram editor": "Diagram editor",
+ "Add comment": "Add comment",
+ "Find and replace": "Find and replace"
}
diff --git a/apps/client/src/components/common/copy.tsx b/apps/client/src/components/common/copy.tsx
index 745fc4ba..2144417b 100644
--- a/apps/client/src/components/common/copy.tsx
+++ b/apps/client/src/components/common/copy.tsx
@@ -25,6 +25,7 @@ export default function CopyTextButton({ text, size }: CopyProps) {
variant="subtle"
onClick={copy}
size={size}
+ aria-label={copied ? t("Copied") : t("Copy")}
>
{copied ? : }
diff --git a/apps/client/src/components/ui/destination-picker/page-children.tsx b/apps/client/src/components/ui/destination-picker/page-children.tsx
index 9db5fd71..c3e84718 100644
--- a/apps/client/src/components/ui/destination-picker/page-children.tsx
+++ b/apps/client/src/components/ui/destination-picker/page-children.tsx
@@ -74,7 +74,18 @@ export function PageChildren({
/>
))}
{hasNextPage && (
-
fetchNextPage()}>
+
fetchNextPage()}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" || e.key === " ") {
+ e.preventDefault();
+ fetchNextPage();
+ }
+ }}
+ role="button"
+ tabIndex={0}
+ >
{t("Load more")}
)}
diff --git a/apps/client/src/components/ui/emoji-picker.tsx b/apps/client/src/components/ui/emoji-picker.tsx
index 112c2d9c..804d1b0f 100644
--- a/apps/client/src/components/ui/emoji-picker.tsx
+++ b/apps/client/src/components/ui/emoji-picker.tsx
@@ -70,11 +70,14 @@ function EmojiPicker({
closeOnEscape={true}
>
-
{icon}
diff --git a/apps/client/src/ee/ai-chat/components/ai-chat-sidebar-item.tsx b/apps/client/src/ee/ai-chat/components/ai-chat-sidebar-item.tsx
index abaf4277..e2bd553c 100644
--- a/apps/client/src/ee/ai-chat/components/ai-chat-sidebar-item.tsx
+++ b/apps/client/src/ee/ai-chat/components/ai-chat-sidebar-item.tsx
@@ -132,6 +132,7 @@ export default function AiChatSidebarItem({
size="xs"
color="gray"
onClick={(e) => e.preventDefault()}
+ aria-label={t("Chat menu")}
>
diff --git a/apps/client/src/ee/api-key/components/api-key-table.tsx b/apps/client/src/ee/api-key/components/api-key-table.tsx
index 48757acc..2c55b36f 100644
--- a/apps/client/src/ee/api-key/components/api-key-table.tsx
+++ b/apps/client/src/ee/api-key/components/api-key-table.tsx
@@ -106,7 +106,11 @@ export function ApiKeyTable({