From: Xuan-Son Nguyen Date: Fri, 16 May 2025 19:49:01 +0000 (+0200) Subject: webui : improve accessibility for visually impaired people (#13551) X-Git-Url: https://git.djapps.eu/?a=commitdiff_plain;h=aea9f8b4e73876739bf88fb705502f291294e469;p=pkg%2Fggml%2Fsources%2Fllama.cpp webui : improve accessibility for visually impaired people (#13551) * webui : improve accessibility for visually impaired people * add a11y for extra contents * fix some labels being read twice * add skip to main content --- diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 01eec46e..02fb0033 100644 Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ diff --git a/tools/server/webui/src/App.tsx b/tools/server/webui/src/App.tsx index 3b00a8f9..1b673bba 100644 --- a/tools/server/webui/src/App.tsx +++ b/tools/server/webui/src/App.tsx @@ -28,13 +28,13 @@ function AppLayout() { return ( <> -
-
+ { +
{items.map((item, i) => (
clickToShow && setShow(i)} + tabIndex={0} + aria-description={ + clickToShow ? `Click to show: ${item.name}` : undefined + } + role={clickToShow ? 'button' : 'menuitem'} > {removeItem && (
{showingItem.type === 'imageFile' ? ( - {showingItem.name} + {`Preview ) : (
diff --git a/tools/server/webui/src/components/ChatMessage.tsx b/tools/server/webui/src/components/ChatMessage.tsx
index 08eb4235..ee59de45 100644
--- a/tools/server/webui/src/components/ChatMessage.tsx
+++ b/tools/server/webui/src/components/ChatMessage.tsx
@@ -83,13 +83,20 @@ export default function ChatMessage({
 
   if (!viewingChat) return null;
 
+  const isUser = msg.role === 'user';
+
   return (
-    
+
{msg.extra && msg.extra.length > 0 && ( @@ -99,7 +106,7 @@ export default function ChatMessage({
{/* textarea for editing message */} @@ -142,7 +149,7 @@ export default function ChatMessage({ ) : ( <> {/* render message as markdown */} -
+
{thought && ( {siblingLeafNodeIds && siblingLeafNodeIds.length > 1 && ( -
+
@@ -215,6 +227,7 @@ export default function ChatMessage({ 'opacity-20': !nextSibling, })} onClick={() => nextSibling && onChangeSibling(nextSibling)} + aria-label="Next message version" > @@ -223,7 +236,7 @@ export default function ChatMessage({ {/* user message */} {msg.role === 'user' && ( setEditingContent(msg.content)} disabled={msg.content === null} tooltipsContent="Edit message" @@ -236,7 +249,7 @@ export default function ChatMessage({ <> {!isPending && ( { if (msg.content !== null) { onRegenerateMessage(msg as Message); @@ -250,10 +263,7 @@ export default function ChatMessage({ )} )} - +
)}
@@ -271,6 +281,8 @@ function ThoughtProcess({ }) { return (
-
+
diff --git a/tools/server/webui/src/components/ChatScreen.tsx b/tools/server/webui/src/components/ChatScreen.tsx index 661fe149..09c601ef 100644 --- a/tools/server/webui/src/components/ChatScreen.tsx +++ b/tools/server/webui/src/components/ChatScreen.tsx @@ -279,7 +279,11 @@ export default function ChatScreen() { function ServerInfo() { const { serverProps } = useAppContext(); return ( -
+
Server Info

@@ -311,6 +315,8 @@ function ChatInput({ return (

diff --git a/tools/server/webui/src/components/Header.tsx b/tools/server/webui/src/components/Header.tsx index 45775ff7..ccddc21d 100644 --- a/tools/server/webui/src/components/Header.tsx +++ b/tools/server/webui/src/components/Header.tsx @@ -38,8 +38,12 @@ export default function Header() { {/* action buttons (top right) */}
-
- diff --git a/tools/server/webui/src/components/SettingDialog.tsx b/tools/server/webui/src/components/SettingDialog.tsx index 0240a17f..e4684be7 100644 --- a/tools/server/webui/src/components/SettingDialog.tsx +++ b/tools/server/webui/src/components/SettingDialog.tsx @@ -335,14 +335,22 @@ export default function SettingDialog({ }; return ( - +

Settings

{/* Left panel, showing sections - Desktop version */} -
+
{SETTING_SECTIONS.map((section, idx) => ( -
{section.title} -
+ ))}
{/* Left panel, showing sections - Mobile version */} -
+ {/* This menu is skipped on a11y, otherwise it's repeated the desktop version */} +
{SETTING_SECTIONS[sectionIdx].title} diff --git a/tools/server/webui/src/components/Sidebar.tsx b/tools/server/webui/src/components/Sidebar.tsx index 8e79e00b..8cac52f4 100644 --- a/tools/server/webui/src/components/Sidebar.tsx +++ b/tools/server/webui/src/components/Sidebar.tsx @@ -50,44 +50,72 @@ export default function Sidebar() { id="toggle-drawer" type="checkbox" className="drawer-toggle" + aria-label="Toggle sidebar" defaultChecked /> -
+
+ + + Skip to main content + +
-

Conversations

+

+ Conversations +

{/* close sidebar button */} -
{/* new conversation button */} -
navigate('/')} + aria-label="New conversation" > New conversation -
+ {/* list of conversations */} {groupedConv.map((group, i) => ( -
+
{/* group name (by date) */} {group.title ? ( // we use btn class here to make sure that the padding/margin are aligned with the other items - + {group.title} ) : ( @@ -184,20 +212,23 @@ function ConversationItem({ }) { return (
-
{conv.name} -
+
{/* dropdown menu */}