From 422b92ba7ae05873d092e8f62984fdbbdf4a54f2 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:55:56 +0200 Subject: [PATCH 01/16] add tabindex to clickable elements (dismiss notification/s & go to profile link) #1781 --- customize.dist/messages.js | 2 +- www/common/sframe-common-mailbox.js | 11 ++++++++++- www/notifications/inner.js | 7 ++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/customize.dist/messages.js b/customize.dist/messages.js index a28190005..467b6dcca 100755 --- a/customize.dist/messages.js +++ b/customize.dist/messages.js @@ -135,7 +135,7 @@ define(req, function(AppConfig, Default, Language) { }; - + Messages.user_profile = 'Go to user profile'; return Messages; }); diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index bf05bdd18..9800e6124 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -81,8 +81,16 @@ define([ Common.openURL(Hash.hashToHref('', 'calendar')); }); } else if (userData && typeof(userData) === "object" && userData.profile) { - avatar = h('span.cp-avatar'); + avatar = h('span.cp-avatar',{ + tabindex: 0, + title: Messages.user_profile + }); Common.displayAvatar($(avatar), userData.avatar, userData.displayName || userData.name); + $(avatar).keydown(function (e) { + if (e.which === 13 || e.which === 32) { + $(avatar).click(); + } + }); $(avatar).click(function (e) { e.stopPropagation(); Common.openURL(Hash.hashToHref(userData.profile, 'profile')); @@ -136,6 +144,7 @@ define([ if (data.content.isDismissible) { var dismissIcon = h('span.fa.fa-times'); var dismiss = h('div.cp-notification-dismiss', { + tabindex: 0, title: Messages.notifications_dismiss, }, dismissIcon); $(dismiss).addClass("cp-clickable") diff --git a/www/notifications/inner.js b/www/notifications/inner.js index 8228f73c5..50eac3b5d 100644 --- a/www/notifications/inner.js +++ b/www/notifications/inner.js @@ -74,7 +74,7 @@ define([ h("h5.cp-app-notifications-panel-title", (Messages.notificationsPage || "Notifications") + " - " + categoryName), h("div.cp-app-notifications-panel-titlebar-buttons", [ - dismissAll = h("div.cp-app-notifications-dismissall.cp-clickable", { title: Messages.notifications_dismissAll || "Dismiss All" }, h("span.fa.fa-trash")), + dismissAll = h("div.cp-app-notifications-dismissall.cp-clickable", { tabindex: 0, title: Messages.notifications_dismissAll || "Dismiss All" }, h("span.fa.fa-trash")), ]), ]), notifsList = h("div.cp-app-notifications-panel-list", [ @@ -154,6 +154,11 @@ define([ } }); + $(dismissAll).keydown(function (e) { + if (e.keyCode === 13 || e.keyCode === 32) { + $(dismissAll).click(); + } + }); $(dismissAll).click(function () { notifsData.forEach(function (data) { if (data.content.isDismissible) { From 681fd4854a40eb50a8f5313be54b70afda1c8372 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Wed, 26 Mar 2025 14:15:15 +0200 Subject: [PATCH 02/16] add tabindex to clickable notifications #1781 --- www/common/sframe-common-mailbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index 9800e6124..4e8b62b05 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -99,7 +99,7 @@ define([ avatar = h('span.cp-avatar-image', h('img', { src:'/customize/CryptPad_logo.svg' })); } var order = -Math.floor((Util.find(data, ['content', 'msg', 'ctime']) || 0) / 1000); - const tabIndexValue = undefined;//data.content.isDismissible ? undefined : '0'; + const tabIndexValue = data.content.isClickable ? '0': 'undefined'; notif = h('li.cp-notification', { role: 'menuitem', tabindex: '0', From aac051d79baacc251a1be0cbc897215dac7b05e6 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:31:16 +0200 Subject: [PATCH 03/16] refine notification UI for keyboard users #1781 --- www/common/sframe-common-mailbox.js | 4 +++- www/notifications/app-notifications.less | 18 +++++++++++++++++- www/notifications/inner.js | 2 ++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index 4e8b62b05..d475a1ab6 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -131,7 +131,9 @@ define([ $(notif).mouseenter((e) => { e.stopPropagation(); - $(notif).focus(); + if($(notif).find('li[tabindex="0"]').length) { + $(notif).focus(); + }; }); if (data.content.isClickable) { diff --git a/www/notifications/app-notifications.less b/www/notifications/app-notifications.less index b3dcf439c..c7a040a81 100644 --- a/www/notifications/app-notifications.less +++ b/www/notifications/app-notifications.less @@ -21,6 +21,10 @@ &:hover { background-color: @cp_notif-hover; } + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } .cp-app-notifications-panel { @@ -59,6 +63,8 @@ justify-content: center; align-items: center; width: 3rem; + border-radius: @variables_radius; + margin: 0.2rem; } } } @@ -90,11 +96,16 @@ } .cp-avatar { .avatar_main(48px); - padding: 0 10px; + padding: 5px; + margin: 0.2rem; cursor: pointer; &:hover { background-color: @cp_notif-hover; } + &:focus-visible { + outline: @variables_focus_style; + border-radius: @variables_radius; + } } .cp-avatar-calendar { font-size: 45px; @@ -114,6 +125,7 @@ flex-direction: row; justify-content: flex-start; align-items: center; + margin: 0.2rem; p { display: inline-block; margin: 1rem 1rem; @@ -136,6 +148,10 @@ align-items: center; border-left: 1px solid @cp_notif-table-border; width: 3rem; + margin: 0.2rem; + &:focus-visible{ + border-radius: @variables_radius; + } } } } diff --git a/www/notifications/inner.js b/www/notifications/inner.js index 50eac3b5d..2ecec5a31 100644 --- a/www/notifications/inner.js +++ b/www/notifications/inner.js @@ -89,6 +89,7 @@ define([ notifsData.push(data); var icon = $(el).find(".cp-reminder"); $(icon).addClass('cp-avatar-calendar'); + $(el).attr('tabindex', -1); $(notifsList).prepend(el); } }; @@ -107,6 +108,7 @@ define([ var time = new Date(data.content.time); $(el).find(".cp-notification-content").append(h("span.notification-time", time.toLocaleString())); $(el).addClass("cp-app-notification-archived"); + $(el).attr('tabindex', -1); if (isDataUnread) { $(el).hide(); } else { From f3d63c252413e15a9ecf9885161f2ff499e58cca Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Wed, 26 Mar 2025 15:49:25 +0200 Subject: [PATCH 04/16] change div to button #1781 --- www/notifications/inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/notifications/inner.js b/www/notifications/inner.js index 2ecec5a31..04969969c 100644 --- a/www/notifications/inner.js +++ b/www/notifications/inner.js @@ -124,7 +124,7 @@ define([ var loadmore; var lastKnownHash; $(dismissAll).remove(); - loadmore = h("div.cp-app-notification-loadmore.cp-clickable", Messages.history_loadMore); + loadmore = h("button.cp-app-notification-loadmore.cp-clickable", Messages.history_loadMore); $(loadmore).click(function () { common.mailbox.getNotificationsHistory('notifications', 10, lastKnownHash, function (err, messages, end) { if (!Array.isArray(messages)) { return; } From 92f3c1399f11fccff696b2dd4ab30f8318cbe729 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:46:10 +0200 Subject: [PATCH 05/16] fix notifications responsiveness #1781 --- customize.dist/src/less2/include/avatar.less | 1 - www/notifications/app-notifications.less | 8 ++------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index 7b7b35986..1cdf0cb52 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -26,7 +26,6 @@ & { .avatar_vars(); &.cp-avatar { - overflow: hidden; text-overflow: ellipsis; font-size: 16px; display: flex; diff --git a/www/notifications/app-notifications.less b/www/notifications/app-notifications.less index c7a040a81..ab7d9560c 100644 --- a/www/notifications/app-notifications.less +++ b/www/notifications/app-notifications.less @@ -109,8 +109,7 @@ } .cp-avatar-calendar { font-size: 45px; - padding: 0 12px; - overflow: hidden; + padding: 12px; } &.cp-app-notification-archived { background-color: @cp_notif-bg; @@ -125,17 +124,14 @@ flex-direction: row; justify-content: flex-start; align-items: center; - margin: 0.2rem; p { display: inline-block; margin: 1rem 1rem; flex: 1; - min-width: 0; } .notification-time { - margin: 1rem 1rem; color: grey; - margin-left: auto; + margin: 1rem 1rem 1rem auto; } } From 9f11a1301e4424e65be44142afadeb9bec743dc5 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:57:29 +0200 Subject: [PATCH 06/16] add margin for notification content #1781 --- www/notifications/app-notifications.less | 1 + 1 file changed, 1 insertion(+) diff --git a/www/notifications/app-notifications.less b/www/notifications/app-notifications.less index ab7d9560c..338773867 100644 --- a/www/notifications/app-notifications.less +++ b/www/notifications/app-notifications.less @@ -124,6 +124,7 @@ flex-direction: row; justify-content: flex-start; align-items: center; + margin: 0.1rem; p { display: inline-block; margin: 1rem 1rem; From 94a4a445670769a96f1204b759980e2b5401c327 Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:00:01 +0300 Subject: [PATCH 07/16] add `aria-label` to focusable elements --- www/common/sframe-common-mailbox.js | 4 +++- www/notifications/inner.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/www/common/sframe-common-mailbox.js b/www/common/sframe-common-mailbox.js index d475a1ab6..f80434e9a 100644 --- a/www/common/sframe-common-mailbox.js +++ b/www/common/sframe-common-mailbox.js @@ -83,7 +83,8 @@ define([ } else if (userData && typeof(userData) === "object" && userData.profile) { avatar = h('span.cp-avatar',{ tabindex: 0, - title: Messages.user_profile + title: Messages.user_profile, + 'aria-label': Messages.user_profile }); Common.displayAvatar($(avatar), userData.avatar, userData.displayName || userData.name); $(avatar).keydown(function (e) { @@ -148,6 +149,7 @@ define([ var dismiss = h('div.cp-notification-dismiss', { tabindex: 0, title: Messages.notifications_dismiss, + 'aria-label': Messages.notifications_dismiss }, dismissIcon); $(dismiss).addClass("cp-clickable") .on('click keypress', function (event) { diff --git a/www/notifications/inner.js b/www/notifications/inner.js index 04969969c..d4991406a 100644 --- a/www/notifications/inner.js +++ b/www/notifications/inner.js @@ -74,7 +74,7 @@ define([ h("h5.cp-app-notifications-panel-title", (Messages.notificationsPage || "Notifications") + " - " + categoryName), h("div.cp-app-notifications-panel-titlebar-buttons", [ - dismissAll = h("div.cp-app-notifications-dismissall.cp-clickable", { tabindex: 0, title: Messages.notifications_dismissAll || "Dismiss All" }, h("span.fa.fa-trash")), + dismissAll = h("div.cp-app-notifications-dismissall.cp-clickable", { tabindex: 0, title: Messages.notifications_dismissAll || "Dismiss All", 'aria-label': Messages.notifications_dismissAll || "Dismiss All" }, h("span.fa.fa-trash")), ]), ]), notifsList = h("div.cp-app-notifications-panel-list", [ From 29f6706a50d62287c754f696b692c33f386fa2da Mon Sep 17 00:00:00 2001 From: daria <95225431+dariiing@users.noreply.github.com> Date: Fri, 25 Apr 2025 14:14:44 +0300 Subject: [PATCH 08/16] add `aria-hidden` to icons --- www/notifications/inner.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/www/notifications/inner.js b/www/notifications/inner.js index d4991406a..887f821d0 100644 --- a/www/notifications/inner.js +++ b/www/notifications/inner.js @@ -213,10 +213,10 @@ define([ common.setHash(active); Object.keys(categories).forEach(function (key) { var $category = $('