From 0a5bc503b07d68aed9c42923dfb9b5581c081f7d Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Fri, 13 Dec 2024 15:44:22 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=99=8C=20a11y:=20Accessibility=20Improvem?= =?UTF-8?q?ents=20(#4978)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🔃 fix: Safeguard against null token in SSE refresh token handling * 🔃 fix: Update import path for AnnounceOptions in LiveAnnouncer component * 🔃 a11y: Add aria-live attribute for accessibility in error messages * fix: prevent double screen reader notification for toast * 🔃 a11y: Enhance accessibility for main menus and buttons with ARIA roles and labels * refactor: better alt text for logo on login page #4095 * refactor: remove unused import for DropdownNoState in Voices component * fix: Focus management issue in the Export Options Modal #4100 --- client/src/a11y/LiveAnnouncer.tsx | 2 +- client/src/components/Audio/Voices.tsx | 1 - client/src/components/Auth/AuthLayout.tsx | 16 +++++++++---- client/src/components/Auth/ErrorMessage.tsx | 3 ++- .../components/Chat/ExportAndShareMenu.tsx | 9 +++++--- .../components/Chat/Menus/EndpointsMenu.tsx | 5 ++++ .../Chat/Menus/Models/MenuButton.tsx | 11 ++++++++- .../Chat/Menus/Models/ModelSpec.tsx | 4 +++- .../Chat/Menus/Models/ModelSpecs.tsx | 4 ++-- .../Chat/Menus/Models/ModelSpecsMenu.tsx | 6 ++++- .../src/components/Chat/Menus/UI/MenuItem.tsx | 4 +++- .../components/Chat/Menus/UI/TitleButton.tsx | 10 +++++--- .../Chat/Messages/Content/MessageContent.tsx | 2 ++ .../Nav/ExportConversation/ExportModal.tsx | 12 ++++++++-- client/src/components/ui/OriginalDialog.tsx | 23 ++++++++++++++++++- client/src/components/ui/Toast.tsx | 1 - client/src/hooks/SSE/useSSE.ts | 9 ++++++-- client/src/localization/languages/Eng.ts | 6 +++++ 18 files changed, 102 insertions(+), 26 deletions(-) diff --git a/client/src/a11y/LiveAnnouncer.tsx b/client/src/a11y/LiveAnnouncer.tsx index 9df48bf2e9..29912b49af 100644 --- a/client/src/a11y/LiveAnnouncer.tsx +++ b/client/src/a11y/LiveAnnouncer.tsx @@ -1,6 +1,6 @@ // client/src/a11y/LiveAnnouncer.tsx import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react'; -import type { AnnounceOptions } from '~/Providers/AnnouncerContext'; +import type { AnnounceOptions } from '~/common'; import AnnouncerContext from '~/Providers/AnnouncerContext'; import useLocalize from '~/hooks/useLocalize'; import Announcer from './Announcer'; diff --git a/client/src/components/Audio/Voices.tsx b/client/src/components/Audio/Voices.tsx index ab6b0a8609..963ff250d8 100644 --- a/client/src/components/Audio/Voices.tsx +++ b/client/src/components/Audio/Voices.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { useRecoilState } from 'recoil'; import type { Option } from '~/common'; -import DropdownNoState from '~/components/ui/DropdownNoState'; import { useLocalize, useTTSBrowser, useTTSEdge, useTTSExternal } from '~/hooks'; import { Dropdown } from '~/components/ui'; import { logger } from '~/utils'; diff --git a/client/src/components/Auth/AuthLayout.tsx b/client/src/components/Auth/AuthLayout.tsx index 0ff99f357c..6df73d2cf9 100644 --- a/client/src/components/Auth/AuthLayout.tsx +++ b/client/src/components/Auth/AuthLayout.tsx @@ -9,8 +9,9 @@ import Footer from './Footer'; const ErrorRender = ({ children }: { children: React.ReactNode }) => (
{children}
@@ -36,8 +37,9 @@ function AuthLayout({ }) { const localize = useLocalize(); + const hasStartupConfigError = startupConfigError !== null && startupConfigError !== undefined; const DisplayError = () => { - if (startupConfigError !== null && startupConfigError !== undefined) { + if (hasStartupConfigError) { return {localize('com_auth_error_login_server')}; } else if (error === 'com_auth_error_invalid_reset_token') { return ( @@ -49,7 +51,7 @@ function AuthLayout({ {localize('com_auth_to_try_again')} ); - } else if (error) { + } else if (error != null && error) { return {localize(error)}; } return null; @@ -60,7 +62,11 @@ function AuthLayout({
- Logo + {localize('com_ui_logo',
@@ -70,7 +76,7 @@ function AuthLayout({
- {!startupConfigError && !isFetching && ( + {!hasStartupConfigError && !isFetching && (

(
{children}
diff --git a/client/src/components/Chat/ExportAndShareMenu.tsx b/client/src/components/Chat/ExportAndShareMenu.tsx index 420c753310..349658a41e 100644 --- a/client/src/components/Chat/ExportAndShareMenu.tsx +++ b/client/src/components/Chat/ExportAndShareMenu.tsx @@ -1,11 +1,11 @@ -import { useState, useId } from 'react'; +import { useState, useId, useRef } from 'react'; import { useRecoilValue } from 'recoil'; import * as Ariakit from '@ariakit/react'; import { Upload, Share2 } from 'lucide-react'; import { ShareButton } from '~/components/Conversations/ConvoOptions'; import { useMediaQuery, useLocalize } from '~/hooks'; +import ExportModal from '~/components/Nav/ExportConversation/ExportModal'; import { DropdownPopup } from '~/components/ui'; -import { ExportModal } from '../Nav'; import store from '~/store'; export default function ExportAndShareMenu({ @@ -19,6 +19,7 @@ export default function ExportAndShareMenu({ const [showShareDialog, setShowShareDialog] = useState(false); const menuId = useId(); + const exportButtonRef = useRef(null); const isSmallScreen = useMediaQuery('(max-width: 768px)'); const conversation = useRecoilValue(store.conversationByIndex(0)); @@ -68,6 +69,7 @@ export default function ExportAndShareMenu({ setIsOpen={setIsPopoverActive} trigger={ )} diff --git a/client/src/components/Chat/Menus/EndpointsMenu.tsx b/client/src/components/Chat/Menus/EndpointsMenu.tsx index f4ac27ccc4..fc92c89d98 100644 --- a/client/src/components/Chat/Menus/EndpointsMenu.tsx +++ b/client/src/components/Chat/Menus/EndpointsMenu.tsx @@ -5,6 +5,7 @@ import type { FC } from 'react'; import { useChatContext, useAgentsMapContext, useAssistantsMapContext } from '~/Providers'; import { mapEndpoints, getEntity } from '~/utils'; import EndpointItems from './Endpoints/MenuItems'; +import useLocalize from '~/hooks/useLocalize'; import TitleButton from './UI/TitleButton'; const EndpointsMenu: FC = () => { @@ -12,6 +13,7 @@ const EndpointsMenu: FC = () => { select: mapEndpoints, }); + const localize = useLocalize(); const agentsMap = useAgentsMapContext(); const assistantMap = useAssistantsMapContext(); const { conversation } = useChatContext(); @@ -51,6 +53,9 @@ const EndpointsMenu: FC = () => { diff --git a/client/src/components/Chat/Menus/Models/MenuButton.tsx b/client/src/components/Chat/Menus/Models/MenuButton.tsx index aa568231e4..24ef1e9452 100644 --- a/client/src/components/Chat/Menus/Models/MenuButton.tsx +++ b/client/src/components/Chat/Menus/Models/MenuButton.tsx @@ -1,3 +1,4 @@ +import { useState } from 'react'; import { Trigger } from '@radix-ui/react-popover'; import type { TModelSpec, TEndpointsConfig } from 'librechat-data-provider'; import { useLocalize } from '~/hooks'; @@ -20,6 +21,8 @@ export default function MenuButton({ endpointsConfig: TEndpointsConfig; }) { const localize = useLocalize(); + const [isExpanded, setIsExpanded] = useState(false); + return (