diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 01eec46e8..02fb00339 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 3b00a8f90..1b673bbaa 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 08eb42352..ee59de450 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 661fe1490..09c601ef2 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 45775ff7a..ccddc21dd 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 0240a17f4..e4684be7e 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 8e79e00b8..8cac52f4c 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 */}