Merge branch 'dev' into feat/model-spec-group-icons

This commit is contained in:
Odrec 2025-12-14 03:48:49 +01:00 committed by GitHub
commit 917f60c83d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
175 changed files with 340 additions and 183 deletions

View file

@ -142,7 +142,7 @@ const AgentDetail: React.FC<AgentDetailProps> = ({ agent, isOpen, onClose }) =>
onClick={handleCopyLink} onClick={handleCopyLink}
title={localize('com_agents_copy_link')} title={localize('com_agents_copy_link')}
> >
<Link /> <Link aria-hidden="true" />
</Button> </Button>
{/* Agent avatar - top center */} {/* Agent avatar - top center */}

View file

@ -99,6 +99,7 @@ const SearchBar: React.FC<SearchBarProps> = ({ value, onSearch, className = '' }
<X <X
className="size-5 text-text-secondary transition-colors duration-200 group-hover:text-text-primary" className="size-5 text-text-secondary transition-colors duration-200 group-hover:text-text-primary"
strokeWidth={2.5} strokeWidth={2.5}
aria-hidden="true"
/> />
</button> </button>
)} )}

View file

@ -257,7 +257,11 @@ export default function Artifacts() {
{isRefreshing ? ( {isRefreshing ? (
<Spinner size={16} /> <Spinner size={16} />
) : ( ) : (
<RefreshCw size={16} className="transition-transform duration-200" /> <RefreshCw
size={16}
className="transition-transform duration-200"
aria-hidden="true"
/>
)} )}
</Button> </Button>
)} )}
@ -284,7 +288,7 @@ export default function Artifacts() {
onClick={closeArtifacts} onClick={closeArtifacts}
aria-label={localize('com_ui_close')} aria-label={localize('com_ui_close')}
> >
<X size={16} /> <X size={16} aria-hidden="true" />
</Button> </Button>
</div> </div>
</div> </div>

View file

@ -114,7 +114,11 @@ export const CopyCodeButton: React.FC<{ content: string }> = ({ content }) => {
onClick={handleCopy} onClick={handleCopy}
aria-label={isCopied ? localize('com_ui_copied') : localize('com_ui_copy_code')} aria-label={isCopied ? localize('com_ui_copied') : localize('com_ui_copy_code')}
> >
{isCopied ? <CircleCheckBig size={16} /> : <Copy size={16} />} {isCopied ? (
<CircleCheckBig size={16} aria-hidden="true" />
) : (
<Copy size={16} aria-hidden="true" />
)}
</Button> </Button>
); );
}; };

View file

@ -41,7 +41,11 @@ const DownloadArtifact = ({ artifact }: { artifact: Artifact }) => {
onClick={handleDownload} onClick={handleDownload}
aria-label={localize('com_ui_download_artifact')} aria-label={localize('com_ui_download_artifact')}
> >
{isDownloaded ? <CircleCheckBig size={16} /> : <Download size={16} />} {isDownloaded ? (
<CircleCheckBig size={16} aria-hidden="true" />
) : (
<Download size={16} aria-hidden="true" />
)}
</Button> </Button>
); );
}; };

View file

@ -41,7 +41,7 @@ export const Banner = ({ onHeightChange }: { onHeightChange?: (height: number) =
className="h-8 w-8 opacity-80 hover:opacity-100" className="h-8 w-8 opacity-80 hover:opacity-100"
onClick={onClick} onClick={onClick}
> >
<XIcon className="mx-auto h-4 w-4" /> <XIcon className="mx-auto h-4 w-4" aria-hidden="true" />
</button> </button>
</div> </div>
); );

View file

@ -43,7 +43,7 @@ function AddMultiConvo() {
data-testid="parameters-button" data-testid="parameters-button"
className="inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary" className="inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary"
> >
<PlusCircle size={16} aria-label="Plus Icon" /> <PlusCircle size={16} aria-hidden="true" />
</TooltipAnchor> </TooltipAnchor>
); );
} }

View file

@ -66,7 +66,7 @@ function Artifacts() {
setValue={handleToggle} setValue={handleToggle}
label={localize('com_ui_artifacts')} label={localize('com_ui_artifacts')}
isCheckedClassName="border-amber-600/40 bg-amber-500/10 hover:bg-amber-700/10" isCheckedClassName="border-amber-600/40 bg-amber-500/10 hover:bg-amber-700/10"
icon={<WandSparkles className="icon-md" />} icon={<WandSparkles className="icon-md" aria-hidden="true" />}
/> />
{isEnabled && ( {isEnabled && (
@ -79,7 +79,7 @@ function Artifacts() {
)} )}
onClick={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}
> >
<ChevronDown className="ml-1 h-4 w-4 text-text-secondary md:ml-0" /> <ChevronDown className="ml-1 h-4 w-4 text-text-secondary md:ml-0" aria-hidden="true" />
</Ariakit.MenuButton> </Ariakit.MenuButton>
<Ariakit.Menu <Ariakit.Menu

View file

@ -62,9 +62,9 @@ const ArtifactsSubMenu = React.forwardRef<HTMLDivElement, ArtifactsSubMenuProps>
} }
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<WandSparkles className="icon-md" /> <WandSparkles className="icon-md" aria-hidden="true" />
<span>{localize('com_ui_artifacts')}</span> <span>{localize('com_ui_artifacts')}</span>
{isEnabled && <ChevronRight className="ml-auto h-3 w-3" />} {isEnabled && <ChevronRight className="ml-auto h-3 w-3" aria-hidden="true" />}
</div> </div>
<button <button
type="button" type="button"

View file

@ -29,7 +29,7 @@ function CodeInterpreter() {
setValue={debouncedChange} setValue={debouncedChange}
label={localize('com_assistants_code_interpreter')} label={localize('com_assistants_code_interpreter')}
isCheckedClassName="border-purple-600/40 bg-purple-500/10 hover:bg-purple-700/10" isCheckedClassName="border-purple-600/40 bg-purple-500/10 hover:bg-purple-700/10"
icon={<TerminalSquareIcon className="icon-md" />} icon={<TerminalSquareIcon className="icon-md" aria-hidden="true" />}
/> />
) )
); );

View file

@ -41,9 +41,9 @@ const CollapseChat = ({
)} )}
> >
{isCollapsed ? ( {isCollapsed ? (
<ChevronUp className="h-full w-full" /> <ChevronUp className="h-full w-full" aria-hidden="true" />
) : ( ) : (
<ChevronDown className="h-full w-full" /> <ChevronDown className="h-full w-full" aria-hidden="true" />
)} )}
</button> </button>
} }

View file

@ -33,7 +33,7 @@ export default function SourceIcon({
return ( return (
<div className={cn(className, sourceToClassname[FileSources.execute_code] ?? '')}> <div className={cn(className, sourceToClassname[FileSources.execute_code] ?? '')}>
<span className="flex items-center justify-center"> <span className="flex items-center justify-center">
<Terminal className="h-3 w-3" /> <Terminal className="h-3 w-3" aria-hidden="true" />
</span> </span>
</div> </div>
); );
@ -43,7 +43,7 @@ export default function SourceIcon({
return ( return (
<div className={cn(className, sourceToClassname[source] ?? '')}> <div className={cn(className, sourceToClassname[source] ?? '')}>
<span className="flex items-center justify-center"> <span className="flex items-center justify-center">
<Type className="h-3 w-3" /> <Type className="h-3 w-3" aria-hidden="true" />
</span> </span>
</div> </div>
); );
@ -53,7 +53,7 @@ export default function SourceIcon({
return ( return (
<div className={cn(className, sourceToClassname[source] ?? '')}> <div className={cn(className, sourceToClassname[source] ?? '')}>
<span className="flex items-center justify-center"> <span className="flex items-center justify-center">
<Database className="h-3 w-3" /> <Database className="h-3 w-3" aria-hidden="true" />
</span> </span>
</div> </div>
); );

View file

@ -68,7 +68,7 @@ export const columns: ColumnDef<TFile>[] = [
onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')} onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
> >
{localize('com_ui_name')} {localize('com_ui_name')}
<ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" /> <ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" aria-hidden="true" />
</Button> </Button>
); );
}, },
@ -107,7 +107,7 @@ export const columns: ColumnDef<TFile>[] = [
className="px-2 py-0 text-xs hover:bg-surface-hover sm:px-2 sm:py-2 sm:text-sm" className="px-2 py-0 text-xs hover:bg-surface-hover sm:px-2 sm:py-2 sm:text-sm"
> >
{localize('com_ui_date')} {localize('com_ui_date')}
<ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" /> <ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" aria-hidden="true" />
</Button> </Button>
); );
}, },
@ -160,7 +160,7 @@ export const columns: ColumnDef<TFile>[] = [
} }
return ( return (
<div className="flex flex-wrap items-center gap-2"> <div className="flex flex-wrap items-center gap-2">
<Database className="icon-sm text-cyan-700" /> <Database className="icon-sm text-cyan-700" aria-hidden="true" />
{localize('com_ui_host')} {localize('com_ui_host')}
</div> </div>
); );
@ -204,7 +204,7 @@ export const columns: ColumnDef<TFile>[] = [
onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')} onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
> >
{localize('com_ui_size')} {localize('com_ui_size')}
<ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" /> <ArrowUpDown className="ml-2 h-3 w-4 sm:h-4 sm:w-4" aria-hidden="true" />
</Button> </Button>
); );
}, },

View file

@ -127,7 +127,7 @@ export default function DataTable<TData, TValue>({ columns, data }: DataTablePro
aria-label={localize('com_files_filter_by')} aria-label={localize('com_files_filter_by')}
className={cn('min-w-[40px]', isSmallScreen && 'px-2 py-1')} className={cn('min-w-[40px]', isSmallScreen && 'px-2 py-1')}
> >
<ListFilter className="size-3.5 sm:size-4" /> <ListFilter className="size-3.5 sm:size-4" aria-hidden="true" />
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent <DropdownMenuContent

View file

@ -41,9 +41,9 @@ export function SortFilterHeader<TData, TValue>({
> >
<span>{title}</span> <span>{title}</span>
{column.getIsFiltered() ? ( {column.getIsFiltered() ? (
<ListFilter className="icon-sm ml-2 text-muted-foreground/70" /> <ListFilter className="icon-sm ml-2 text-muted-foreground/70" aria-hidden="true" />
) : ( ) : (
<ListFilter className="icon-sm ml-2 opacity-30" /> <ListFilter className="icon-sm ml-2 opacity-30" aria-hidden="true" />
)} )}
{(() => { {(() => {
const sortState = column.getIsSorted(); const sortState = column.getIsSorted();
@ -95,7 +95,10 @@ export function SortFilterHeader<TData, TValue>({
column.setFilterValue(value); column.setFilterValue(value);
}} }}
> >
<ListFilter className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" /> <ListFilter
className="mr-2 h-3.5 w-3.5 text-muted-foreground/70"
aria-hidden="true"
/>
{filterValue} {filterValue}
</DropdownMenuItem> </DropdownMenuItem>
); );
@ -112,7 +115,7 @@ export function SortFilterHeader<TData, TValue>({
column.setFilterValue(undefined); column.setFilterValue(undefined);
}} }}
> >
<FilterX className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" /> <FilterX className="mr-2 h-3.5 w-3.5 text-muted-foreground/70" aria-hidden="true" />
{localize('com_ui_show_all')} {localize('com_ui_show_all')}
</DropdownMenuItem> </DropdownMenuItem>
)} )}

View file

@ -58,7 +58,7 @@ export default function HeaderOptions({
data-testid="parameters-button" data-testid="parameters-button"
className="inline-flex size-10 items-center justify-center rounded-lg border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary" className="inline-flex size-10 items-center justify-center rounded-lg border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary"
> >
<Settings2 size={16} aria-label="Settings/Parameters Icon" /> <Settings2 size={16} aria-hidden="true" />
</TooltipAnchor> </TooltipAnchor>
)} )}
</div> </div>

View file

@ -168,7 +168,7 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
render: (props) => ( render: (props) => (
<div {...props}> <div {...props}>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Globe className="icon-md" /> <Globe className="icon-md" aria-hidden="true" />
<span>{localize('com_ui_web_search')}</span> <span>{localize('com_ui_web_search')}</span>
</div> </div>
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
@ -188,7 +188,7 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
ref={searchMenuTriggerRef} ref={searchMenuTriggerRef}
> >
<div className="h-4 w-4"> <div className="h-4 w-4">
<Settings className="h-4 w-4" /> <Settings className="h-4 w-4" aria-hidden="true" />
</div> </div>
</button> </button>
)} )}
@ -222,7 +222,7 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
render: (props) => ( render: (props) => (
<div {...props}> <div {...props}>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<TerminalSquareIcon className="icon-md" /> <TerminalSquareIcon className="icon-md" aria-hidden="true" />
<span>{localize('com_assistants_code_interpreter')}</span> <span>{localize('com_assistants_code_interpreter')}</span>
</div> </div>
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
@ -242,7 +242,7 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
aria-label="Configure code interpreter" aria-label="Configure code interpreter"
> >
<div className="h-4 w-4"> <div className="h-4 w-4">
<Settings className="h-4 w-4" /> <Settings className="h-4 w-4" aria-hidden="true" />
</div> </div>
</button> </button>
)} )}
@ -310,7 +310,7 @@ const ToolsDropdown = ({ disabled }: ToolsDropdownProps) => {
)} )}
> >
<div className="flex w-full items-center justify-center gap-2"> <div className="flex w-full items-center justify-center gap-2">
<Settings2 className="icon-md" /> <Settings2 className="icon-md" aria-hidden="true" />
</div> </div>
</Ariakit.MenuButton> </Ariakit.MenuButton>
} }

View file

@ -29,7 +29,7 @@ function WebSearch() {
setValue={debouncedChange} setValue={debouncedChange}
label={localize('com_ui_search')} label={localize('com_ui_search')}
isCheckedClassName="border-blue-600/40 bg-blue-500/10 hover:bg-blue-700/10" isCheckedClassName="border-blue-600/40 bg-blue-500/10 hover:bg-blue-700/10"
icon={<Globe className="icon-md" />} icon={<Globe className="icon-md" aria-hidden="true" />}
/> />
) )
); );

View file

@ -45,7 +45,7 @@ const SettingsButton = ({
aria-label={`${text} ${endpoint.label}`} aria-label={`${text} ${endpoint.label}`}
> >
<div className="flex w-[28px] items-center gap-1 whitespace-nowrap transition-all duration-300 ease-in-out group-hover:w-auto group-focus/button:w-auto"> <div className="flex w-[28px] items-center gap-1 whitespace-nowrap transition-all duration-300 ease-in-out group-hover:w-auto group-focus/button:w-auto">
<SettingsIcon className="h-4 w-4 flex-shrink-0" /> <SettingsIcon className="h-4 w-4 flex-shrink-0" aria-hidden="true" />
<span className="max-w-0 overflow-hidden whitespace-nowrap opacity-0 transition-all duration-300 ease-in-out group-hover:max-w-[100px] group-hover:opacity-100 group-focus/button:max-w-[100px] group-focus/button:opacity-100"> <span className="max-w-0 overflow-hidden whitespace-nowrap opacity-0 transition-all duration-300 ease-in-out group-hover:max-w-[100px] group-hover:opacity-100 group-focus/button:max-w-[100px] group-focus/button:opacity-100">
{text} {text}
</span> </span>

View file

@ -51,7 +51,10 @@ export function EndpointModelItem({ modelId, endpoint, isSelected }: EndpointMod
) : null} ) : null}
<span className="truncate text-left">{modelName}</span> <span className="truncate text-left">{modelName}</span>
{isGlobal && ( {isGlobal && (
<EarthIcon className="ml-auto size-4 flex-shrink-0 self-center text-green-400" /> <EarthIcon
className="ml-auto size-4 flex-shrink-0 self-center text-green-400"
aria-hidden="true"
/>
)} )}
</div> </div>
{isSelected && ( {isSelected && (

View file

@ -172,7 +172,9 @@ export function SearchResults({ results, localize, searchValue }: SearchResultsP
)} )}
<span>{modelName}</span> <span>{modelName}</span>
</div> </div>
{isGlobal && <EarthIcon className="ml-auto size-4 text-green-400" />} {isGlobal && (
<EarthIcon className="ml-auto size-4 text-green-400" aria-hidden="true" />
)}
{selectedEndpoint === endpoint.value && selectedModel === modelId && ( {selectedEndpoint === endpoint.value && selectedModel === modelId && (
<svg <svg
width="16" width="16"

View file

@ -32,7 +32,7 @@ const PresetsMenu: FC = () => {
data-testid="presets-button" data-testid="presets-button"
className="inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary" className="inline-flex size-10 flex-shrink-0 items-center justify-center rounded-xl border border-border-light bg-transparent text-text-primary transition-all ease-in-out hover:bg-surface-tertiary disabled:pointer-events-none disabled:opacity-50 radix-state-open:bg-surface-tertiary"
> >
<BookCopy size={16} aria-label="Preset Icon" /> <BookCopy size={16} aria-hidden="true" />
</TooltipAnchor> </TooltipAnchor>
</Trigger> </Trigger>
<Portal> <Portal>

View file

@ -22,7 +22,7 @@ export default function TitleButton({ primaryText = '', secondaryText = '' }) {
<span className="text-text-primary"> {primaryText} </span> <span className="text-text-primary"> {primaryText} </span>
{!!secondaryText && <span className="text-token-text-secondary">{secondaryText}</span>} {!!secondaryText && <span className="text-token-text-secondary">{secondaryText}</span>}
</div> </div>
<ChevronDown className="text-token-text-secondary size-4" /> <ChevronDown className="text-token-text-secondary size-4" aria-hidden="true" />
</button> </button>
</Trigger> </Trigger>
); );

View file

@ -74,6 +74,7 @@ const AgentHandoff: React.FC<AgentHandoffProps> = ({ name, args: _args = '' }) =
{hasInfo && ( {hasInfo && (
<ChevronDown <ChevronDown
className={cn('ml-1 h-3 w-3 transition-transform', showInfo && 'rotate-180')} className={cn('ml-1 h-3 w-3 transition-transform', showInfo && 'rotate-180')}
aria-hidden="true"
/> />
)} )}
</div> </div>

View file

@ -3,7 +3,7 @@ import { X } from 'lucide-react';
export default function CancelledIcon() { export default function CancelledIcon() {
return ( return (
<div className="flex h-full w-full items-center justify-center rounded-full bg-transparent text-text-secondary"> <div className="flex h-full w-full items-center justify-center rounded-full bg-transparent text-text-secondary">
<X className="size-4" /> <X className="size-4" aria-hidden="true" />
</div> </div>
); );
} }

View file

@ -204,7 +204,7 @@ export default function DialogImage({ isOpen, onOpenChange, src = '', downloadIm
className="h-10 w-10 p-0 hover:bg-surface-hover" className="h-10 w-10 p-0 hover:bg-surface-hover"
aria-label={localize('com_ui_close')} aria-label={localize('com_ui_close')}
> >
<X className="size-7 sm:size-6" /> <X className="size-7 sm:size-6" aria-hidden="true" />
</Button> </Button>
} }
/> />
@ -219,7 +219,7 @@ export default function DialogImage({ isOpen, onOpenChange, src = '', downloadIm
className="h-10 w-10 p-0" className="h-10 w-10 p-0"
aria-label={localize('com_ui_reset_zoom')} aria-label={localize('com_ui_reset_zoom')}
> >
<RotateCcw className="size-6" /> <RotateCcw className="size-6" aria-hidden="true" />
</Button> </Button>
} }
/> />
@ -233,7 +233,7 @@ export default function DialogImage({ isOpen, onOpenChange, src = '', downloadIm
className="h-10 w-10 p-0" className="h-10 w-10 p-0"
aria-label={localize('com_ui_download')} aria-label={localize('com_ui_download')}
> >
<ArrowDownToLine className="size-6" /> <ArrowDownToLine className="size-6" aria-hidden="true" />
</Button> </Button>
} }
/> />
@ -247,9 +247,9 @@ export default function DialogImage({ isOpen, onOpenChange, src = '', downloadIm
aria-label={imageDetailsLabel} aria-label={imageDetailsLabel}
> >
{isPromptOpen ? ( {isPromptOpen ? (
<PanelLeftOpen className="size-7 sm:size-6" /> <PanelLeftOpen className="size-7 sm:size-6" aria-hidden="true" />
) : ( ) : (
<PanelLeftClose className="size-7 sm:size-6" /> <PanelLeftClose className="size-7 sm:size-6" aria-hidden="true" />
)} )}
</Button> </Button>
} }
@ -322,7 +322,7 @@ export default function DialogImage({ isOpen, onOpenChange, src = '', downloadIm
variant="ghost" variant="ghost"
className="h-12 w-12 p-0" className="h-12 w-12 p-0"
> >
<X className="size-6" /> <X className="size-6" aria-hidden="true" />
</Button> </Button>
</div> </div>

View file

@ -157,7 +157,7 @@ const EditTextPart = ({
{part.type === ContentTypes.THINK && ( {part.type === ContentTypes.THINK && (
<div className="mt-2 flex items-center gap-1.5 text-xs text-text-secondary"> <div className="mt-2 flex items-center gap-1.5 text-xs text-text-secondary">
<span className="flex gap-2 rounded-lg bg-surface-tertiary px-1.5 py-1 font-medium"> <span className="flex gap-2 rounded-lg bg-surface-tertiary px-1.5 py-1 font-medium">
<Lightbulb className="size-3.5" /> <Lightbulb className="size-3.5" aria-hidden="true" />
{localize('com_ui_thoughts')} {localize('com_ui_thoughts')}
</span> </span>
</div> </div>
@ -165,7 +165,7 @@ const EditTextPart = ({
{part.type !== ContentTypes.THINK && ( {part.type !== ContentTypes.THINK && (
<div className="mt-2 flex items-center gap-1.5 text-xs text-text-secondary"> <div className="mt-2 flex items-center gap-1.5 text-xs text-text-secondary">
<span className="flex gap-2 rounded-lg bg-surface-tertiary px-1.5 py-1 font-medium"> <span className="flex gap-2 rounded-lg bg-surface-tertiary px-1.5 py-1 font-medium">
<MessageSquare className="size-3.5" /> <MessageSquare className="size-3.5" aria-hidden="true" />
{localize('com_ui_response')} {localize('com_ui_response')}
</span> </span>
</div> </div>

View file

@ -71,12 +71,16 @@ export const ThinkingButton = memo(
)} )}
> >
<span className="relative mr-1.5 inline-flex h-[18px] w-[18px] items-center justify-center"> <span className="relative mr-1.5 inline-flex h-[18px] w-[18px] items-center justify-center">
<Lightbulb className="icon-sm absolute text-text-secondary opacity-100 transition-opacity group-hover/button:opacity-0" /> <Lightbulb
className="icon-sm absolute text-text-secondary opacity-100 transition-opacity group-hover/button:opacity-0"
aria-hidden="true"
/>
<ChevronDown <ChevronDown
className={cn( className={cn(
'icon-sm absolute transform-gpu text-text-primary opacity-0 transition-all duration-300 group-hover/button:opacity-100', 'icon-sm absolute transform-gpu text-text-primary opacity-0 transition-all duration-300 group-hover/button:opacity-100',
isExpanded && 'rotate-180', isExpanded && 'rotate-180',
)} )}
aria-hidden="true"
/> />
</span> </span>
{label} {label}

View file

@ -98,9 +98,9 @@ export default function ProgressText({
<span className={showShimmer ? 'shimmer' : ''}>{text}</span> <span className={showShimmer ? 'shimmer' : ''}>{text}</span>
{hasInput && {hasInput &&
(isExpanded ? ( (isExpanded ? (
<ChevronUp className="size-4 shrink-0 translate-y-[1px]" /> <ChevronUp className="size-4 shrink-0 translate-y-[1px]" aria-hidden="true" />
) : ( ) : (
<ChevronDown className="size-4 shrink-0 translate-y-[1px]" /> <ChevronDown className="size-4 shrink-0 translate-y-[1px]" aria-hidden="true" />
))} ))}
</button> </button>
</Wrapper> </Wrapper>

View file

@ -236,7 +236,7 @@ export default function ToolCall({
</Button> </Button>
</div> </div>
<p className="flex items-center text-xs text-text-warning"> <p className="flex items-center text-xs text-text-warning">
<TriangleAlert className="mr-1.5 inline-block h-4 w-4" /> <TriangleAlert className="mr-1.5 inline-block h-4 w-4" aria-hidden="true" />
{localize('com_assistants_allow_sites_you_trust')} {localize('com_assistants_allow_sites_you_trust')}
</p> </p>
</div> </div>

View file

@ -65,7 +65,7 @@ function FeedbackOptionButton({
aria-label={label} aria-label={label}
aria-pressed={active} aria-pressed={active}
> >
<Icon size="19" bold={active} /> <Icon size="19" bold={active} aria-hidden="true" />
<span>{label}</span> <span>{label}</span>
</button> </button>
); );

View file

@ -273,10 +273,10 @@ export default function Fork({
{ {
setting: ForkOptions.DIRECT_PATH, setting: ForkOptions.DIRECT_PATH,
label: localize(optionLabels[ForkOptions.DIRECT_PATH]), label: localize(optionLabels[ForkOptions.DIRECT_PATH]),
icon: <GitCommit className="h-full w-full rotate-90 p-2" />, icon: <GitCommit className="h-full w-full rotate-90 p-2" aria-hidden="true" />,
hoverTitle: ( hoverTitle: (
<> <>
<GitCommit className="h-5 w-5 rotate-90" /> <GitCommit className="h-5 w-5 rotate-90" aria-hidden="true" />
{localize(optionLabels[ForkOptions.DIRECT_PATH])} {localize(optionLabels[ForkOptions.DIRECT_PATH])}
</> </>
), ),
@ -285,10 +285,10 @@ export default function Fork({
{ {
setting: ForkOptions.INCLUDE_BRANCHES, setting: ForkOptions.INCLUDE_BRANCHES,
label: localize(optionLabels[ForkOptions.INCLUDE_BRANCHES]), label: localize(optionLabels[ForkOptions.INCLUDE_BRANCHES]),
icon: <GitBranchPlus className="h-full w-full rotate-180 p-2" />, icon: <GitBranchPlus className="h-full w-full rotate-180 p-2" aria-hidden="true" />,
hoverTitle: ( hoverTitle: (
<> <>
<GitBranchPlus className="h-4 w-4 rotate-180" /> <GitBranchPlus className="h-4 w-4 rotate-180" aria-hidden="true" />
{localize(optionLabels[ForkOptions.INCLUDE_BRANCHES])} {localize(optionLabels[ForkOptions.INCLUDE_BRANCHES])}
</> </>
), ),
@ -297,10 +297,10 @@ export default function Fork({
{ {
setting: ForkOptions.TARGET_LEVEL, setting: ForkOptions.TARGET_LEVEL,
label: localize(optionLabels[ForkOptions.TARGET_LEVEL]), label: localize(optionLabels[ForkOptions.TARGET_LEVEL]),
icon: <ListTree className="h-full w-full p-2" />, icon: <ListTree className="h-full w-full p-2" aria-hidden="true" />,
hoverTitle: ( hoverTitle: (
<> <>
<ListTree className="h-5 w-5" /> <ListTree className="h-5 w-5" aria-hidden="true" />
{`${localize(optionLabels[ForkOptions.TARGET_LEVEL])} (${localize('com_endpoint_default')})`} {`${localize(optionLabels[ForkOptions.TARGET_LEVEL])} (${localize('com_endpoint_default')})`}
</> </>
), ),
@ -333,7 +333,7 @@ export default function Fork({
type="button" type="button"
aria-label={localize('com_ui_fork')} aria-label={localize('com_ui_fork')}
> >
<GitFork size="19" /> <GitFork size="19" aria-hidden="true" />
</button> </button>
} }
/> />
@ -360,7 +360,7 @@ export default function Fork({
className="flex h-5 w-5 cursor-help items-center rounded-full text-text-secondary" className="flex h-5 w-5 cursor-help items-center rounded-full text-text-secondary"
aria-label={localize('com_ui_fork_info_button_label')} aria-label={localize('com_ui_fork_info_button_label')}
> >
<InfoIcon /> <InfoIcon aria-hidden="true" />
</button> </button>
} }
/> />

View file

@ -61,7 +61,7 @@ export default function SearchButtons({ message }: { message: TMessage }) {
onClick={clickHandler} onClick={clickHandler}
title={localize('com_ui_go_to_conversation')} title={localize('com_ui_go_to_conversation')}
> >
<Link className="icon-sm" /> <Link className="icon-sm" aria-hidden="true" />
{message.title} {message.title}
</button> </button>
</div> </div>

View file

@ -1,5 +1,4 @@
import React from 'react'; import React from 'react';
import { motion } from 'framer-motion';
import { TooltipAnchor } from '@librechat/client'; import { TooltipAnchor } from '@librechat/client';
import { MessageCircleDashed } from 'lucide-react'; import { MessageCircleDashed } from 'lucide-react';
import { useRecoilState, useRecoilCallback } from 'recoil'; import { useRecoilState, useRecoilCallback } from 'recoil';
@ -54,6 +53,7 @@ export function TemporaryChat() {
{temporaryBadge.icon && ( {temporaryBadge.icon && (
<temporaryBadge.icon <temporaryBadge.icon
className={cn('relative h-5 w-5 md:h-4 md:w-4', !temporaryBadge.label && 'mx-auto')} className={cn('relative h-5 w-5 md:h-4 md:w-4', !temporaryBadge.label && 'mx-auto')}
aria-hidden="true"
/> />
)} )}
</button> </button>

View file

@ -133,7 +133,7 @@ function ConvoOptions({
{ {
label: localize('com_ui_share'), label: localize('com_ui_share'),
onClick: handleShareClick, onClick: handleShareClick,
icon: <Share2 className="icon-sm mr-2 text-text-primary" />, icon: <Share2 className="icon-sm mr-2 text-text-primary" aria-hidden="true" />,
show: startupConfig && startupConfig.sharedLinksEnabled, show: startupConfig && startupConfig.sharedLinksEnabled,
hideOnClick: false, hideOnClick: false,
ref: shareButtonRef, ref: shareButtonRef,
@ -142,7 +142,7 @@ function ConvoOptions({
{ {
label: localize('com_ui_rename'), label: localize('com_ui_rename'),
onClick: renameHandler, onClick: renameHandler,
icon: <Pen className="icon-sm mr-2 text-text-primary" />, icon: <Pen className="icon-sm mr-2 text-text-primary" aria-hidden="true" />,
}, },
{ {
label: localize('com_ui_duplicate'), label: localize('com_ui_duplicate'),
@ -151,7 +151,7 @@ function ConvoOptions({
icon: isDuplicateLoading ? ( icon: isDuplicateLoading ? (
<Spinner className="size-4" /> <Spinner className="size-4" />
) : ( ) : (
<CopyPlus className="icon-sm mr-2 text-text-primary" /> <CopyPlus className="icon-sm mr-2 text-text-primary" aria-hidden="true" />
), ),
}, },
{ {
@ -161,13 +161,13 @@ function ConvoOptions({
icon: isArchiveLoading ? ( icon: isArchiveLoading ? (
<Spinner className="size-4" /> <Spinner className="size-4" />
) : ( ) : (
<Archive className="icon-sm mr-2 text-text-primary" /> <Archive className="icon-sm mr-2 text-text-primary" aria-hidden="true" />
), ),
}, },
{ {
label: localize('com_ui_delete'), label: localize('com_ui_delete'),
onClick: handleDeleteClick, onClick: handleDeleteClick,
icon: <Trash className="icon-sm mr-2 text-text-primary" />, icon: <Trash className="icon-sm mr-2 text-text-primary" aria-hidden="true" />,
hideOnClick: false, hideOnClick: false,
ref: deleteButtonRef, ref: deleteButtonRef,
render: (props) => <button {...props} />, render: (props) => <button {...props} />,

View file

@ -102,7 +102,11 @@ export default function ShareButton({
}} }}
className={cn('shrink-0', isCopying ? 'cursor-default' : '')} className={cn('shrink-0', isCopying ? 'cursor-default' : '')}
> >
{isCopying ? <CopyCheck className="size-4" /> : <Copy className="size-4" />} {isCopying ? (
<CopyCheck className="size-4" aria-hidden="true" />
) : (
<Copy className="size-4" aria-hidden="true" />
)}
</Button> </Button>
</div> </div>
)} )}

View file

@ -139,7 +139,7 @@ export default function SharedLinkButton({
{isUpdateLoading ? ( {isUpdateLoading ? (
<Spinner className="size-4" /> <Spinner className="size-4" />
) : ( ) : (
<RotateCw className="size-4" /> <RotateCw className="size-4" aria-hidden="true" />
)} )}
</Button> </Button>
)} )}
@ -154,7 +154,7 @@ export default function SharedLinkButton({
variant="outline" variant="outline"
aria-label={qrCodeLabel} aria-label={qrCodeLabel}
> >
<QrCode className="size-4" /> <QrCode className="size-4" aria-hidden="true" />
</Button> </Button>
)} )}
/> />
@ -168,7 +168,7 @@ export default function SharedLinkButton({
variant="destructive" variant="destructive"
aria-label={localize('com_ui_delete')} aria-label={localize('com_ui_delete')}
> >
<Trash2 className="size-4" /> <Trash2 className="size-4" aria-hidden="true" />
</Button> </Button>
)} )}
/> />

View file

@ -119,7 +119,7 @@ const MessageEndpointIcon: React.FC<IconProps> = (props) => {
) : ( ) : (
<div className="h-6 w-6"> <div className="h-6 w-6">
<div className="shadow-stroke flex h-6 w-6 items-center justify-center overflow-hidden rounded-full"> <div className="shadow-stroke flex h-6 w-6 items-center justify-center overflow-hidden rounded-full">
<Feather className="h-2/3 w-2/3 text-gray-400" /> <Feather className="h-2/3 w-2/3 text-gray-400" aria-hidden="true" />
</div> </div>
</div> </div>
), ),

View file

@ -47,7 +47,7 @@ const MinimalIcon: React.FC<IconProps> = (props) => {
[EModelEndpoint.assistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' }, [EModelEndpoint.assistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
[EModelEndpoint.azureAssistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' }, [EModelEndpoint.azureAssistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
[EModelEndpoint.agents]: { [EModelEndpoint.agents]: {
icon: <Feather className="icon-sm" />, icon: <Feather className="icon-sm" aria-hidden="true" />,
name: props.modelLabel ?? alternateName[EModelEndpoint.agents], name: props.modelLabel ?? alternateName[EModelEndpoint.agents],
}, },
[EModelEndpoint.bedrock]: { [EModelEndpoint.bedrock]: {

View file

@ -81,14 +81,14 @@ function Examples({ readonly, examples, setExample, addExample, removeExample }:
className="mr-2 mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0" className="mr-2 mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
onClick={removeExample} onClick={removeExample}
> >
<Minus className="w-[16px]" /> <Minus className="w-[16px]" aria-hidden="true" />
</Button> </Button>
<Button <Button
type="button" type="button"
className="mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0" className="mt-1 h-auto items-center justify-center bg-transparent px-3 py-2 text-xs font-medium font-normal text-black hover:bg-gray-100 hover:text-black focus:ring-0 focus:ring-offset-0 dark:bg-transparent dark:text-white dark:hover:bg-gray-700 dark:hover:text-white dark:focus:outline-none dark:focus:ring-offset-0"
onClick={addExample} onClick={addExample}
> >
<Plus className="w-[16px]" /> <Plus className="w-[16px]" aria-hidden="true" />
</Button> </Button>
</div> </div>
</> </>

View file

@ -38,7 +38,7 @@ export const URLIcon = memo(
className="absolute flex items-center justify-center rounded-full bg-red-500" className="absolute flex items-center justify-center rounded-full bg-red-500"
style={{ width: '14px', height: '14px', top: 0, right: 0 }} style={{ width: '14px', height: '14px', top: 0, right: 0 }}
> >
<AlertCircle size={10} className="text-white" /> <AlertCircle size={10} className="text-white" aria-hidden="true" />
</div> </div>
)} )}
</div> </div>

View file

@ -150,12 +150,12 @@ export default function FileSidePanel() {
return ( return (
<div className="w-30"> <div className="w-30">
<h2 className="m-3 text-lg"> <h2 className="m-3 text-lg">
<strong>Files</strong> <strong>{localize('com_ui_files')}</strong>
</h2> </h2>
<div className="m-3 mt-2 flex w-full flex-row justify-between gap-x-2 lg:m-0"> <div className="m-3 mt-2 flex w-full flex-row justify-between gap-x-2 lg:m-0">
<div className="flex w-2/3 flex-row"> <div className="flex w-2/3 flex-row">
<Button variant="ghost" className="m-0 mr-2 p-0"> <Button variant="ghost" className="m-0 mr-2 p-0">
<ListFilter className="h-4 w-4" /> <ListFilter className="h-4 w-4" aria-hidden="true" />
</Button> </Button>
<Input <Input
placeholder={localize('com_files_filter')} placeholder={localize('com_files_filter')}

View file

@ -65,14 +65,14 @@ export default function MCPConfigDialog({
if (requiresOAuth) { if (requiresOAuth) {
return ( return (
<div className="flex items-center gap-2 rounded-full bg-amber-50 px-2 py-0.5 text-xs font-medium text-amber-600 dark:bg-amber-950 dark:text-amber-400"> <div className="flex items-center gap-2 rounded-full bg-amber-50 px-2 py-0.5 text-xs font-medium text-amber-600 dark:bg-amber-950 dark:text-amber-400">
<KeyRound className="h-3 w-3" /> <KeyRound className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_oauth')}</span> <span>{localize('com_ui_oauth')}</span>
</div> </div>
); );
} else { } else {
return ( return (
<div className="flex items-center gap-2 rounded-full bg-orange-50 px-2 py-0.5 text-xs font-medium text-orange-600 dark:bg-orange-950 dark:text-orange-400"> <div className="flex items-center gap-2 rounded-full bg-orange-50 px-2 py-0.5 text-xs font-medium text-orange-600 dark:bg-orange-950 dark:text-orange-400">
<PlugZap className="h-3 w-3" /> <PlugZap className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_offline')}</span> <span>{localize('com_ui_offline')}</span>
</div> </div>
); );
@ -82,7 +82,7 @@ export default function MCPConfigDialog({
if (connectionState === 'error') { if (connectionState === 'error') {
return ( return (
<div className="flex items-center gap-2 rounded-full bg-red-50 px-2 py-0.5 text-xs font-medium text-red-600 dark:bg-red-950 dark:text-red-400"> <div className="flex items-center gap-2 rounded-full bg-red-50 px-2 py-0.5 text-xs font-medium text-red-600 dark:bg-red-950 dark:text-red-400">
<AlertTriangle className="h-3 w-3" /> <AlertTriangle className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_error')}</span> <span>{localize('com_ui_error')}</span>
</div> </div>
); );

View file

@ -138,7 +138,7 @@ function DisconnectedOAuthStatusIcon({ serverName, onConfigClick }: StatusIconPr
className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary" className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary"
aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })} aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })}
> >
<KeyRound className="h-4 w-4 text-amber-500" /> <KeyRound className="h-4 w-4 text-amber-500" aria-hidden="true" />
</button> </button>
); );
} }
@ -151,7 +151,7 @@ function DisconnectedStatusIcon({ serverName, onConfigClick }: StatusIconProps)
className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary" className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary"
aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })} aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })}
> >
<PlugZap className="h-4 w-4 text-orange-500" /> <PlugZap className="h-4 w-4 text-orange-500" aria-hidden="true" />
</button> </button>
); );
} }
@ -164,7 +164,7 @@ function ErrorStatusIcon({ serverName, onConfigClick }: StatusIconProps) {
className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary" className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary"
aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })} aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })}
> >
<AlertTriangle className="h-4 w-4 text-red-500" /> <AlertTriangle className="h-4 w-4 text-red-500" aria-hidden="true" />
</button> </button>
); );
} }
@ -185,7 +185,10 @@ function AuthenticatedStatusIcon({
className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary" className="flex h-6 w-6 items-center justify-center rounded p-1 hover:bg-surface-secondary"
aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })} aria-label={localize('com_nav_mcp_configure_server', { 0: serverName })}
> >
<SettingsIcon className={`h-4 w-4 ${isAuthenticated ? 'text-green-500' : 'text-gray-400'}`} /> <SettingsIcon
className={`h-4 w-4 ${isAuthenticated ? 'text-green-500' : 'text-gray-400'}`}
aria-hidden="true"
/>
</button> </button>
); );
} }

View file

@ -85,7 +85,7 @@ export default function ServerInitializationSection({
const icon = isServerInitializing ? ( const icon = isServerInitializing ? (
<Spinner className="h-4 w-4" /> <Spinner className="h-4 w-4" />
) : ( ) : (
<RefreshCw className="h-4 w-4" /> <RefreshCw className="h-4 w-4" aria-hidden="true" />
); );
return ( return (

View file

@ -93,7 +93,7 @@ const RunCode: React.FC<CodeBarProps> = React.memo(({ lang, codeRef, blockIndex
{execute.isLoading ? ( {execute.isLoading ? (
<Spinner className="animate-spin" size={18} /> <Spinner className="animate-spin" size={18} />
) : ( ) : (
<TerminalSquareIcon size={18} /> <TerminalSquareIcon size={18} aria-hidden="true" />
)} )}
{localize('com_ui_run_code')} {localize('com_ui_run_code')}
</button> </button>

View file

@ -93,7 +93,7 @@ function AccountSettings() {
value="logout" value="logout"
className="select-item text-sm" className="select-item text-sm"
> >
<LogOut className="icon-md" /> <LogOut className="icon-md" aria-hidden="true" />
{localize('com_nav_log_out')} {localize('com_nav_log_out')}
</Select.SelectItem> </Select.SelectItem>
</Select.SelectPopover> </Select.SelectPopover>

View file

@ -58,7 +58,7 @@ export default function AgentMarketplaceButton({
className="rounded-full border-none bg-transparent p-2 hover:bg-surface-hover md:rounded-xl" className="rounded-full border-none bg-transparent p-2 hover:bg-surface-hover md:rounded-xl"
onClick={handleAgentMarketplace} onClick={handleAgentMarketplace}
> >
<LayoutGrid className="icon-lg text-text-primary" /> <LayoutGrid className="icon-lg text-text-primary" aria-hidden="true" />
</Button> </Button>
} }
/> />

View file

@ -144,7 +144,7 @@ const SearchBar = forwardRef((props: SearchBarProps, ref: React.Ref<HTMLDivEleme
tabIndex={showClearIcon ? 0 : -1} tabIndex={showClearIcon ? 0 : -1}
disabled={!showClearIcon} disabled={!showClearIcon}
> >
<X className="h-5 w-5 cursor-pointer" /> <X className="h-5 w-5 cursor-pointer" aria-hidden="true" />
</button> </button>
</div> </div>
); );

View file

@ -80,17 +80,17 @@ export default function Settings({ open, onOpenChange }: TDialogProps) {
}, },
{ {
value: SettingsTabValues.CHAT, value: SettingsTabValues.CHAT,
icon: <MessageSquare className="icon-sm" />, icon: <MessageSquare className="icon-sm" aria-hidden="true" />,
label: 'com_nav_setting_chat', label: 'com_nav_setting_chat',
}, },
{ {
value: SettingsTabValues.COMMANDS, value: SettingsTabValues.COMMANDS,
icon: <Command className="icon-sm" />, icon: <Command className="icon-sm" aria-hidden="true" />,
label: 'com_nav_commands', label: 'com_nav_commands',
}, },
{ {
value: SettingsTabValues.SPEECH, value: SettingsTabValues.SPEECH,
icon: <SpeechIcon className="icon-sm" />, icon: <SpeechIcon className="icon-sm" aria-hidden="true" />,
label: 'com_nav_setting_speech', label: 'com_nav_setting_speech',
}, },
...(hasAnyPersonalizationFeature ...(hasAnyPersonalizationFeature

View file

@ -170,7 +170,7 @@ function Avatar() {
<span>{localize('com_nav_profile_picture')}</span> <span>{localize('com_nav_profile_picture')}</span>
<OGDialogTrigger asChild> <OGDialogTrigger asChild>
<Button variant="outline"> <Button variant="outline">
<FileImage className="mr-2 flex w-[22px] items-center" /> <FileImage className="mr-2 flex w-[22px] items-center" aria-hidden="true" />
<span>{localize('com_nav_change_picture')}</span> <span>{localize('com_nav_change_picture')}</span>
</Button> </Button>
</OGDialogTrigger> </OGDialogTrigger>
@ -211,7 +211,7 @@ function Avatar() {
{!isDragging && ( {!isDragging && (
<div className="pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 transition-opacity hover:opacity-100"> <div className="pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 transition-opacity hover:opacity-100">
<div className="rounded-full bg-black/50 p-2"> <div className="rounded-full bg-black/50 p-2">
<Move className="h-6 w-6 text-white" /> <Move className="h-6 w-6 text-white" aria-hidden="true" />
</div> </div>
</div> </div>
)} )}
@ -236,7 +236,7 @@ function Avatar() {
aria-label={localize('com_ui_zoom_out')} aria-label={localize('com_ui_zoom_out')}
className="shrink-0" className="shrink-0"
> >
<ZoomOut className="h-4 w-4" /> <ZoomOut className="h-4 w-4" aria-hidden="true" />
</Button> </Button>
<Slider <Slider
id="zoom-slider" id="zoom-slider"
@ -257,7 +257,7 @@ function Avatar() {
aria-label={localize('com_ui_zoom_in')} aria-label={localize('com_ui_zoom_in')}
className="shrink-0" className="shrink-0"
> >
<ZoomIn className="h-4 w-4" /> <ZoomIn className="h-4 w-4" aria-hidden="true" />
</Button> </Button>
</div> </div>
</div> </div>
@ -270,7 +270,7 @@ function Avatar() {
className="flex items-center space-x-2" className="flex items-center space-x-2"
aria-label={localize('com_ui_rotate_90')} aria-label={localize('com_ui_rotate_90')}
> >
<RotateCw className="h-4 w-4" /> <RotateCw className="h-4 w-4" aria-hidden="true" />
<span className="text-sm">{localize('com_ui_rotate')}</span> <span className="text-sm">{localize('com_ui_rotate')}</span>
</Button> </Button>
<Button <Button
@ -280,7 +280,7 @@ function Avatar() {
className="flex items-center space-x-2" className="flex items-center space-x-2"
aria-label={localize('com_ui_reset_adjustments')} aria-label={localize('com_ui_reset_adjustments')}
> >
<X className="h-4 w-4" /> <X className="h-4 w-4" aria-hidden="true" />
<span className="text-sm">{localize('com_ui_reset')}</span> <span className="text-sm">{localize('com_ui_reset')}</span>
</Button> </Button>
</div> </div>
@ -312,7 +312,7 @@ function Avatar() {
{isUploading ? ( {isUploading ? (
<Spinner className="icon-sm mr-2" /> <Spinner className="icon-sm mr-2" />
) : ( ) : (
<Upload className="mr-2 h-4 w-4" /> <Upload className="mr-2 h-4 w-4" aria-hidden="true" />
)} )}
{localize('com_ui_upload')} {localize('com_ui_upload')}
</Button> </Button>

View file

@ -171,7 +171,7 @@ const BackupCodesItem: React.FC = () => {
{isLoading ? ( {isLoading ? (
<Spinner className="mr-2" /> <Spinner className="mr-2" />
) : ( ) : (
<RefreshCcw className="mr-2 h-4 w-4" /> <RefreshCcw className="mr-2 h-4 w-4" aria-hidden="true" />
)} )}
{isLoading {isLoading
? localize('com_ui_regenerating') ? localize('com_ui_regenerating')

View file

@ -123,12 +123,12 @@ const renderDeleteButton = (
<> <>
{isLocked ? ( {isLocked ? (
<> <>
<LockIcon className="size-5" /> <LockIcon className="size-5" aria-hidden="true" />
<span className="ml-2">{localize('com_ui_locked')}</span> <span className="ml-2">{localize('com_ui_locked')}</span>
</> </>
) : ( ) : (
<> <>
<Trash className="size-5" /> <Trash className="size-5" aria-hidden="true" />
<span className="ml-2">{localize('com_nav_delete_account_button')}</span> <span className="ml-2">{localize('com_nav_delete_account_button')}</span>
</> </>
)} )}

View file

@ -216,7 +216,7 @@ const TwoFactorAuthentication: React.FC = () => {
> >
<OGDialogHeader> <OGDialogHeader>
<OGDialogTitle className="mb-2 flex items-center gap-3 text-2xl font-bold"> <OGDialogTitle className="mb-2 flex items-center gap-3 text-2xl font-bold">
<SmartphoneIcon className="h-6 w-6 text-primary" /> <SmartphoneIcon className="h-6 w-6 text-primary" aria-hidden="true" />
{user?.twoFactorEnabled {user?.twoFactorEnabled
? localize('com_ui_2fa_disable') ? localize('com_ui_2fa_disable')
: localize('com_ui_2fa_setup')} : localize('com_ui_2fa_setup')}

View file

@ -48,7 +48,7 @@ export const BackupPhase: React.FC<BackupPhaseProps> = ({
</div> </div>
<div className="flex gap-4"> <div className="flex gap-4">
<Button variant="outline" onClick={onDownload} className="flex-1 gap-2"> <Button variant="outline" onClick={onDownload} className="flex-1 gap-2">
<Download className="h-4 w-4" /> <Download className="h-4 w-4" aria-hidden="true" />
<span className="hidden sm:inline">{localize('com_ui_download_backup')}</span> <span className="hidden sm:inline">{localize('com_ui_download_backup')}</span>
</Button> </Button>
<Button onClick={onNext} disabled={!downloaded} className="flex-1"> <Button onClick={onNext} disabled={!downloaded} className="flex-1">

View file

@ -53,7 +53,11 @@ export const QRPhase: React.FC<QRPhaseProps> = ({ secret, otpauthUrl, onNext })
onClick={handleCopy} onClick={handleCopy}
className={cn('h-auto shrink-0', isCopying ? 'cursor-default' : '')} className={cn('h-auto shrink-0', isCopying ? 'cursor-default' : '')}
> >
{isCopying ? <Check className="size-4" /> : <Copy className="size-4" />} {isCopying ? (
<Check className="size-4" aria-hidden="true" />
) : (
<Copy className="size-4" aria-hidden="true" />
)}
</Button> </Button>
</div> </div>
</div> </div>

View file

@ -33,7 +33,11 @@ export const SetupPhase: React.FC<SetupPhaseProps> = ({ isGenerating, onGenerate
className="flex w-full" className="flex w-full"
disabled={isGenerating} disabled={isGenerating}
> >
{isGenerating ? <Spinner className="size-5" /> : <QrCode className="size-5" />} {isGenerating ? (
<Spinner className="size-5" />
) : (
<QrCode className="size-5" aria-hidden="true" />
)}
{isGenerating ? localize('com_ui_generating') : localize('com_ui_generate_qrcode')} {isGenerating ? localize('com_ui_generating') : localize('com_ui_generate_qrcode')}
</Button> </Button>
</div> </div>

View file

@ -55,7 +55,7 @@ const DangerButton = (props: TDangerButtonProps, ref: ForwardedRef<HTMLButtonEle
id={`${id}-text`} id={`${id}-text`}
data-testid={dataTestIdConfirm} data-testid={dataTestIdConfirm}
> >
{renderMutation(<CheckIcon className="h-5 w-5" />)} {renderMutation(<CheckIcon className="h-5 w-5" aria-hidden="true" />)}
{mutation && mutation.isLoading ? null : localize(confirmActionTextCode)} {mutation && mutation.isLoading ? null : localize(confirmActionTextCode)}
</div> </div>
) : ( ) : (

View file

@ -120,7 +120,7 @@ function ImportConversations() {
{isUploading ? ( {isUploading ? (
<Spinner className="mr-1 w-4" /> <Spinner className="mr-1 w-4" />
) : ( ) : (
<Import className="mr-1 flex h-4 w-4 items-center stroke-1" /> <Import className="mr-1 flex h-4 w-4 items-center stroke-1" aria-hidden="true" />
)} )}
<span>{localize('com_ui_import')}</span> <span>{localize('com_ui_import')}</span>
</Button> </Button>

View file

@ -234,7 +234,7 @@ export default function ArchivedChatsTable({
{unarchiveMutation.isLoading ? ( {unarchiveMutation.isLoading ? (
<Spinner /> <Spinner />
) : ( ) : (
<ArchiveRestore className="size-4" /> <ArchiveRestore className="size-4" aria-hidden="true" />
)} )}
</Button> </Button>
} }
@ -251,7 +251,7 @@ export default function ArchivedChatsTable({
}} }}
title={localize('com_ui_delete')} title={localize('com_ui_delete')}
> >
<TrashIcon className="size-4" /> <TrashIcon className="size-4" aria-hidden="true" />
</Button> </Button>
} }
/> />

View file

@ -167,7 +167,7 @@ function Speech() {
value="simple" value="simple"
style={{ userSelect: 'none' }} style={{ userSelect: 'none' }}
> >
<Lightbulb /> <Lightbulb aria-hidden="true" />
{localize('com_ui_simple')} {localize('com_ui_simple')}
</Tabs.Trigger> </Tabs.Trigger>
<Tabs.Trigger <Tabs.Trigger
@ -180,7 +180,7 @@ function Speech() {
value="advanced" value="advanced"
style={{ userSelect: 'none' }} style={{ userSelect: 'none' }}
> >
<Cog /> <Cog aria-hidden="true" />
{localize('com_ui_advanced')} {localize('com_ui_advanced')}
</Tabs.Trigger> </Tabs.Trigger>
</Tabs.List> </Tabs.List>

View file

@ -93,7 +93,7 @@ function PluginAuthForm({ plugin, onSubmit, isEntityTool }: TPluginAuthFormProps
> >
<div className="flex items-center justify-center gap-2"> <div className="flex items-center justify-center gap-2">
{localize('com_ui_save')} {localize('com_ui_save')}
<Save className="flex h-4 w-4 items-center stroke-2" /> <Save className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />
</div> </div>
</button> </button>
</form> </form>

View file

@ -181,14 +181,13 @@ function PluginStoreDialog({ isOpen, setIsOpen }: TPluginStoreDialogProps) {
<div className="mt-4 flex flex-col gap-4"> <div className="mt-4 flex flex-col gap-4">
<div className="flex items-center"> <div className="flex items-center">
<div className="relative flex items-center"> <div className="relative flex items-center">
<Search className="absolute left-2 h-6 w-6 text-gray-500" /> <Search className="absolute left-2 h-6 w-6 text-gray-500" aria-hidden="true" />
<input <input
type="text" type="text"
value={searchValue} value={searchValue}
onChange={handleSearch} onChange={handleSearch}
placeholder={localize('com_nav_plugin_search')} placeholder={localize('com_nav_plugin_search')}
className=" className="text-token-text-primary flex rounded-md border border-border-heavy bg-surface-tertiary py-2 pl-10 pr-2"
text-token-text-primary flex rounded-md border border-border-heavy bg-surface-tertiary py-2 pl-10 pr-2"
/> />
</div> </div>
</div> </div>

View file

@ -45,7 +45,10 @@ function PluginStoreItem({ plugin, onInstall, onUninstall, isInstalled }: TPlugi
> >
<div className="flex w-full items-center justify-center gap-2"> <div className="flex w-full items-center justify-center gap-2">
{localize('com_nav_plugin_install')} {localize('com_nav_plugin_install')}
<DownloadCloud className="flex h-4 w-4 items-center stroke-2" /> <DownloadCloud
className="flex h-4 w-4 items-center stroke-2"
aria-hidden="true"
/>
</div> </div>
</button> </button>
) : ( ) : (
@ -56,7 +59,7 @@ function PluginStoreItem({ plugin, onInstall, onUninstall, isInstalled }: TPlugi
> >
<div className="flex w-full items-center justify-center gap-2"> <div className="flex w-full items-center justify-center gap-2">
{localize('com_nav_plugin_uninstall')} {localize('com_nav_plugin_uninstall')}
<XCircle className="flex h-4 w-4 items-center stroke-2" /> <XCircle className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />
</div> </div>
</button> </button>
)} )}

View file

@ -208,7 +208,7 @@ const AdminSettings = () => {
className="inline-flex items-center text-blue-500 underline" className="inline-flex items-center text-blue-500 underline"
> >
{localize('com_ui_more_info')} {localize('com_ui_more_info')}
<ExternalLink size={16} className="ml-1" /> <ExternalLink size={16} className="ml-1" aria-hidden="true" />
</a> </a>
</div> </div>
</> </>

View file

@ -19,7 +19,7 @@ export default function BackToChat({ className }: { className?: string }) {
href="/" href="/"
onClick={clickHandler} onClick={clickHandler}
> >
<ArrowLeft className="icon-xs mr-2" /> <ArrowLeft className="icon-xs mr-2" aria-hidden="true" />
{localize('com_ui_back_to_chat')} {localize('com_ui_back_to_chat')}
</a> </a>
); );

View file

@ -28,7 +28,7 @@ const DeleteConfirmDialog = ({
e.stopPropagation(); e.stopPropagation();
}} }}
> >
<Trash2 className="size-5 cursor-pointer text-white" /> <Trash2 className="size-5 cursor-pointer text-white" aria-hidden="true" />
</Button> </Button>
</OGDialogTrigger> </OGDialogTrigger>
<OGDialogTemplate <OGDialogTemplate

View file

@ -36,7 +36,7 @@ export default function List({
onClick={() => navigate('/d/prompts/new')} onClick={() => navigate('/d/prompts/new')}
aria-label={localize('com_ui_create_prompt')} aria-label={localize('com_ui_create_prompt')}
> >
<Plus className="size-4" aria-hidden /> <Plus className="size-4" aria-hidden="true" />
{localize('com_ui_create_prompt')} {localize('com_ui_create_prompt')}
</Button> </Button>
</div> </div>

View file

@ -130,7 +130,7 @@ const RightPanel = React.memo(
!canEdit !canEdit
} }
> >
<Rocket className="size-5 cursor-pointer text-white" /> <Rocket className="size-5 cursor-pointer text-white" aria-hidden="true" />
</Button> </Button>
)} )}
<DeleteVersion <DeleteVersion
@ -422,7 +422,7 @@ const PromptForm = () => {
onClick={() => setShowSidePanel(true)} onClick={() => setShowSidePanel(true)}
aria-label={localize('com_endpoint_open_menu')} aria-label={localize('com_endpoint_open_menu')}
> >
<Menu className="size-5" /> <Menu className="size-5" aria-hidden="true" />
</Button> </Button>
<div className="hidden lg:block"> <div className="hidden lg:block">
{editorMode === PromptsEditorMode.SIMPLE && ( {editorMode === PromptsEditorMode.SIMPLE && (

View file

@ -60,7 +60,7 @@ const SharePrompt = React.memo(
className="h-10 w-10 border border-transparent bg-blue-500/90 p-0.5 transition-all hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-800" className="h-10 w-10 border border-transparent bg-blue-500/90 p-0.5 transition-all hover:bg-blue-600 dark:bg-blue-600 dark:hover:bg-blue-800"
disabled={disabled} disabled={disabled}
> >
<Share2Icon className="size-5 cursor-pointer text-white" /> <Share2Icon className="size-5 cursor-pointer text-white" aria-hidden="true" />
</Button> </Button>
</GenericGrantAccessDialog> </GenericGrantAccessDialog>
); );

View file

@ -80,7 +80,7 @@ export default function AccessRolesPicker({
<span className="font-medium"> <span className="font-medium">
{selectedRoleInfo?.name || localize('com_ui_select')} {selectedRoleInfo?.name || localize('com_ui_select')}
</span> </span>
<ChevronDown className="h-4 w-4 text-text-secondary" /> <ChevronDown className="h-4 w-4 text-text-secondary" aria-hidden="true" />
</Ariakit.MenuButton> </Ariakit.MenuButton>
} }
items={dropdownItems} items={dropdownItems}

View file

@ -241,7 +241,7 @@ export default function GenericGrantAccessDialog({
> >
<div className="flex min-w-[32px] items-center justify-center gap-2 text-blue-500"> <div className="flex min-w-[32px] items-center justify-center gap-2 text-blue-500">
<span className="flex h-6 w-6 items-center justify-center"> <span className="flex h-6 w-6 items-center justify-center">
<Share2Icon className="icon-md h-4 w-4" /> <Share2Icon className="icon-md h-4 w-4" aria-hidden="true" />
</span> </span>
{totalCurrentShares > 0 && ( {totalCurrentShares > 0 && (
<Label className="text-sm font-medium text-text-secondary">{totalCurrentShares}</Label> <Label className="text-sm font-medium text-text-secondary">{totalCurrentShares}</Label>
@ -256,7 +256,7 @@ export default function GenericGrantAccessDialog({
<OGDialogContent className="max-h-[90vh] w-11/12 overflow-y-auto md:max-w-3xl"> <OGDialogContent className="max-h-[90vh] w-11/12 overflow-y-auto md:max-w-3xl">
<OGDialogTitle> <OGDialogTitle>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<Users className="h-5 w-5" /> <Users className="h-5 w-5" aria-hidden="true" />
{localize('com_ui_share_var', { {localize('com_ui_share_var', {
0: config?.getShareMessage(resourceName), 0: config?.getShareMessage(resourceName),
})} })}
@ -270,7 +270,7 @@ export default function GenericGrantAccessDialog({
{hasPeoplePickerAccess && ( {hasPeoplePickerAccess && (
<div className="space-y-2"> <div className="space-y-2">
<h4 className="mb-2 flex items-center gap-2 text-sm font-medium text-text-primary"> <h4 className="mb-2 flex items-center gap-2 text-sm font-medium text-text-primary">
<UserCheck className="h-4 w-4" /> <UserCheck className="h-4 w-4" aria-hidden="true" />
{localize('com_ui_user_group_permissions')} ( {allShares.length} ) {localize('com_ui_user_group_permissions')} ( {allShares.length} )
</h4> </h4>
@ -295,7 +295,7 @@ export default function GenericGrantAccessDialog({
if (allShares.length === 0 && !hasChanges) { if (allShares.length === 0 && !hasChanges) {
return ( return (
<div className="rounded-lg border-2 border-dashed border-border-light p-8 text-center"> <div className="rounded-lg border-2 border-dashed border-border-light p-8 text-center">
<Users className="mx-auto h-8 w-8 text-text-primary" /> <Users className="mx-auto h-8 w-8 text-text-primary" aria-hidden="true" />
<p className="mt-2 text-sm text-text-primary"> <p className="mt-2 text-sm text-text-primary">
{localize('com_ui_no_individual_access')} {localize('com_ui_no_individual_access')}
</p> </p>
@ -311,7 +311,7 @@ export default function GenericGrantAccessDialog({
{!hasAtLeastOneOwner && hasChanges && ( {!hasAtLeastOneOwner && hasChanges && (
<div className="rounded-lg border border-destructive/30 bg-destructive/10 p-3 text-center"> <div className="rounded-lg border border-destructive/30 bg-destructive/10 p-3 text-center">
<div className="flex items-center justify-center gap-2 text-sm text-red-600 dark:text-red-400"> <div className="flex items-center justify-center gap-2 text-sm text-red-600 dark:text-red-400">
<UserX className="h-4 w-4" /> <UserX className="h-4 w-4" aria-hidden="true" />
{localize('com_ui_at_least_one_owner_required')} {localize('com_ui_at_least_one_owner_required')}
</div> </div>
</div> </div>
@ -363,7 +363,11 @@ export default function GenericGrantAccessDialog({
: localize('com_ui_copy_url_to_clipboard') : localize('com_ui_copy_url_to_clipboard')
} }
> >
{isCopying ? <CopyCheck className="h-4 w-4" /> : <Link className="h-4 w-4" />} {isCopying ? (
<CopyCheck className="h-4 w-4" aria-hidden="true" />
) : (
<Link className="h-4 w-4" aria-hidden="true" />
)}
</Button> </Button>
)} )}
</div> </div>

View file

@ -85,7 +85,10 @@ export function SearchPicker<TOption extends { key: string; value: string }>({
{isLoading ? ( {isLoading ? (
<Spinner className="absolute left-3 h-4 w-4" /> <Spinner className="absolute left-3 h-4 w-4" />
) : ( ) : (
<Search className="absolute left-3 h-4 w-4 text-text-secondary group-focus-within:text-text-primary group-hover:text-text-primary" /> <Search
className="absolute left-3 h-4 w-4 text-text-secondary group-focus-within:text-text-primary group-hover:text-text-primary"
aria-hidden="true"
/>
)} )}
<Ariakit.Combobox <Ariakit.Combobox
ref={inputRef} ref={inputRef}

View file

@ -38,7 +38,7 @@ export default function SelectedPrincipalsList({
return ( return (
<div className={`space-y-3 ${className}`}> <div className={`space-y-3 ${className}`}>
<div className="rounded-lg border border-dashed border-border-medium py-8 text-center text-muted-foreground"> <div className="rounded-lg border border-dashed border-border-medium py-8 text-center text-muted-foreground">
<Users className="mx-auto mb-2 h-8 w-8 opacity-50" /> <Users className="mx-auto mb-2 h-8 w-8 opacity-50" aria-hidden="true" />
<p className="mt-1 text-xs">{localize('com_ui_search_above_to_add_all')}</p> <p className="mt-1 text-xs">{localize('com_ui_search_above_to_add_all')}</p>
</div> </div>
</div> </div>
@ -64,7 +64,7 @@ export default function SelectedPrincipalsList({
<span>{subtitle}</span> <span>{subtitle}</span>
{share.source === 'entra' && ( {share.source === 'entra' && (
<> <>
<ExternalLink className="h-3 w-3" /> <ExternalLink className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_azure_ad')}</span> <span>{localize('com_ui_azure_ad')}</span>
</> </>
)} )}
@ -89,7 +89,7 @@ export default function SelectedPrincipalsList({
className="h-9 w-9 p-0 hover:border-destructive/10 hover:bg-destructive/10 hover:text-destructive" className="h-9 w-9 p-0 hover:border-destructive/10 hover:bg-destructive/10 hover:text-destructive"
aria-label={localize('com_ui_remove_user', { 0: displayName })} aria-label={localize('com_ui_remove_user', { 0: displayName })}
> >
<X className="h-4 w-4" /> <X className="h-4 w-4" aria-hidden="true" />
</Button> </Button>
</div> </div>
</div> </div>

View file

@ -35,7 +35,7 @@ export default function AdvancedPanel() {
aria-label={localize('com_ui_back_to_builder')} aria-label={localize('com_ui_back_to_builder')}
> >
<div className="advanced-panel-content flex w-full items-center justify-center gap-2"> <div className="advanced-panel-content flex w-full items-center justify-center gap-2">
<ChevronLeft /> <ChevronLeft aria-hidden="true" />
</div> </div>
</button> </button>
</div> </div>

View file

@ -150,7 +150,7 @@ const AgentChain: React.FC<AgentChainProps> = ({ field, currentAgentId }) => {
0: getAgentDetails(agentId)?.name || localize('com_ui_agent'), 0: getAgentDetails(agentId)?.name || localize('com_ui_agent'),
})} })}
> >
<X size={18} className="text-text-secondary" /> <X size={18} className="text-text-secondary" aria-hidden="true" />
</button> </button>
</div> </div>
{idx < agentIds.length - 1 && ( {idx < agentIds.length - 1 && (

View file

@ -512,7 +512,7 @@ export default function AgentPanel() {
localize('com_ui_agent') localize('com_ui_agent')
} }
> >
<Plus className="mr-1 h-4 w-4" /> <Plus className="mr-1 h-4 w-4" aria-hidden="true" />
{localize('com_ui_create') + {localize('com_ui_create') +
' ' + ' ' +
localize('com_ui_new') + localize('com_ui_new') +

View file

@ -87,7 +87,7 @@ export default function Action({ authType = '', isToolAuthenticated = false }) {
onClick={() => setIsDialogOpen(true)} onClick={() => setIsDialogOpen(true)}
aria-label={localize('com_ui_add_api_key')} aria-label={localize('com_ui_add_api_key')}
> >
<KeyRoundIcon className="h-5 w-5 text-text-primary" /> <KeyRoundIcon className="h-5 w-5 text-text-primary" aria-hidden="true" />
</button> </button>
)} )}
<HoverCardTrigger> <HoverCardTrigger>

View file

@ -291,7 +291,7 @@ export default function MCPTool({ serverInfo }: { serverInfo?: MCPServerInfo })
<Ariakit.VisuallyHidden> <Ariakit.VisuallyHidden>
{localize('com_ui_tool_more_info')} {localize('com_ui_tool_more_info')}
</Ariakit.VisuallyHidden> </Ariakit.VisuallyHidden>
<ChevronDown className="h-4 w-4" /> <ChevronDown className="h-4 w-4" aria-hidden="true" />
</Ariakit.HovercardDisclosure> </Ariakit.HovercardDisclosure>
</div> </div>
<Ariakit.Hovercard <Ariakit.Hovercard

View file

@ -114,9 +114,15 @@ export default function InputSection({
> >
<div className="relative h-4 w-4"> <div className="relative h-4 w-4">
{passwordVisibility[name] ? ( {passwordVisibility[name] ? (
<EyeOff className="absolute inset-0 h-4 w-4 duration-200 animate-in fade-in" /> <EyeOff
className="absolute inset-0 h-4 w-4 duration-200 animate-in fade-in"
aria-hidden="true"
/>
) : ( ) : (
<Eye className="absolute inset-0 h-4 w-4 duration-200 animate-in fade-in" /> <Eye
className="absolute inset-0 h-4 w-4 duration-200 animate-in fade-in"
aria-hidden="true"
/>
)} )}
</div> </div>
</button> </button>

View file

@ -115,7 +115,7 @@ const BookmarkTable = () => {
aria-label={localize('com_ui_bookmarks_new')} aria-label={localize('com_ui_bookmarks_new')}
onClick={() => setOpen(!open)} onClick={() => setOpen(!open)}
> >
<BookmarkPlusIcon className="size-4" /> <BookmarkPlusIcon className="size-4" aria-hidden="true" />
<div className="break-all">{localize('com_ui_bookmarks_new')}</div> <div className="break-all">{localize('com_ui_bookmarks_new')}</div>
</Button> </Button>
</OGDialogTrigger> </OGDialogTrigger>

View file

@ -52,7 +52,11 @@ export default function ActionCallback({ action_id }: { action_id?: string }) {
className={cn('h-8 rounded-md px-2', isCopying ? 'cursor-default' : '')} className={cn('h-8 rounded-md px-2', isCopying ? 'cursor-default' : '')}
aria-label={localize('com_ui_copy_link')} aria-label={localize('com_ui_copy_link')}
> >
{isCopying ? <CopyCheck className="size-4" /> : <Copy className="size-4" />} {isCopying ? (
<CopyCheck className="size-4" aria-hidden="true" />
) : (
<Copy className="size-4" aria-hidden="true" />
)}
</Button> </Button>
</div> </div>
</div> </div>

View file

@ -118,7 +118,7 @@ const AssistantConversationStarters: React.FC<AssistantConversationStartersProps
onClick={handleAddStarter} onClick={handleAddStarter}
disabled={hasReachedMax} disabled={hasReachedMax}
> >
<Plus className="size-4" /> <Plus className="size-4" aria-hidden="true" />
</TooltipAnchor> </TooltipAnchor>
</div> </div>
)} )}
@ -145,7 +145,7 @@ const AssistantConversationStarters: React.FC<AssistantConversationStartersProps
className="absolute right-1 top-1 flex size-7 items-center justify-center rounded-lg transition-colors duration-200 hover:bg-surface-hover" className="absolute right-1 top-1 flex size-7 items-center justify-center rounded-lg transition-colors duration-200 hover:bg-surface-hover"
onClick={() => handleDeleteStarter(index)} onClick={() => handleDeleteStarter(index)}
> >
<X className="size-4" /> <X className="size-4" aria-hidden="true" />
</TooltipAnchor> </TooltipAnchor>
</div> </div>
))} ))}

View file

@ -20,7 +20,7 @@ export const columns: ColumnDef<TFile | undefined>[] = [
aria-label={localize('com_ui_name')} aria-label={localize('com_ui_name')}
> >
{localize('com_ui_name')} {localize('com_ui_name')}
<ArrowUpDown className="ml-2 h-4 w-4" /> <ArrowUpDown className="ml-2 h-4 w-4" aria-hidden="true" />
</Button> </Button>
); );
}, },

View file

@ -133,7 +133,7 @@ function MCPPanelContent() {
size="sm" size="sm"
aria-label={localize('com_ui_back')} aria-label={localize('com_ui_back')}
> >
<ChevronLeft className="mr-1 h-4 w-4" /> <ChevronLeft className="mr-1 h-4 w-4" aria-hidden="true" />
{localize('com_ui_back')} {localize('com_ui_back')}
</Button> </Button>
@ -173,7 +173,7 @@ function MCPPanelContent() {
onClick={() => handleConfigRevoke(selectedServerNameForEditing)} onClick={() => handleConfigRevoke(selectedServerNameForEditing)}
aria-label={localize('com_ui_oauth_revoke')} aria-label={localize('com_ui_oauth_revoke')}
> >
<Trash2 className="h-4 w-4" /> <Trash2 className="h-4 w-4" aria-hidden="true" />
{localize('com_ui_oauth_revoke')} {localize('com_ui_oauth_revoke')}
</Button> </Button>
)} )}

View file

@ -310,7 +310,7 @@ export default function MemoryViewer() {
className="w-full bg-transparent" className="w-full bg-transparent"
aria-label={localize('com_ui_create_memory')} aria-label={localize('com_ui_create_memory')}
> >
<Plus className="size-4" aria-hidden /> <Plus className="size-4" aria-hidden="true" />
{localize('com_ui_create_memory')} {localize('com_ui_create_memory')}
</Button> </Button>
</OGDialogTrigger> </OGDialogTrigger>

View file

@ -74,7 +74,7 @@ function NavContent({ links, isCollapsed, resize }: Omit<NavProps, 'defaultActiv
} }
}} }}
> >
<link.icon className="mr-2 h-4 w-4" /> <link.icon className="mr-2 h-4 w-4" aria-hidden="true" />
{localize(link.title)} {localize(link.title)}
{link.label != null && link.label && ( {link.label != null && link.label && (
<span <span

View file

@ -37,7 +37,7 @@ function MCPToolItem({
if (isInstalled) { if (isInstalled) {
return { return {
text: localize('com_nav_tool_remove'), text: localize('com_nav_tool_remove'),
icon: <XCircle className="flex h-4 w-4 items-center stroke-2" />, icon: <XCircle className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />,
className: className:
'btn relative bg-gray-300 hover:bg-gray-400 dark:bg-gray-50 dark:hover:bg-gray-200', 'btn relative bg-gray-300 hover:bg-gray-400 dark:bg-gray-50 dark:hover:bg-gray-200',
disabled: false, disabled: false,
@ -47,7 +47,7 @@ function MCPToolItem({
if (isConfiguring) { if (isConfiguring) {
return { return {
text: localize('com_ui_confirm'), text: localize('com_ui_confirm'),
icon: <PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" />, icon: <PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />,
className: 'btn btn-primary relative', className: 'btn btn-primary relative',
disabled: false, disabled: false,
}; };
@ -56,7 +56,7 @@ function MCPToolItem({
if (isInitializing) { if (isInitializing) {
return { return {
text: localize('com_ui_initializing'), text: localize('com_ui_initializing'),
icon: <Wrench className="flex h-4 w-4 items-center stroke-2" />, icon: <Wrench className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />,
className: 'btn btn-primary relative opacity-75 cursor-not-allowed', className: 'btn btn-primary relative opacity-75 cursor-not-allowed',
disabled: true, disabled: true,
}; };
@ -64,7 +64,7 @@ function MCPToolItem({
return { return {
text: localize('com_ui_add'), text: localize('com_ui_add'),
icon: <PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" />, icon: <PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />,
className: 'btn btn-primary relative', className: 'btn btn-primary relative',
disabled: false, disabled: false,
}; };

View file

@ -58,7 +58,7 @@ function ToolItem({ tool, onAddTool, onRemoveTool, isInstalled = false }: ToolIt
> >
<div className="flex w-full items-center justify-center gap-2"> <div className="flex w-full items-center justify-center gap-2">
{localize('com_ui_add')} {localize('com_ui_add')}
<PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" /> <PlusCircleIcon className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />
</div> </div>
</button> </button>
) : ( ) : (
@ -69,7 +69,7 @@ function ToolItem({ tool, onAddTool, onRemoveTool, isInstalled = false }: ToolIt
> >
<div className="flex w-full items-center justify-center gap-2"> <div className="flex w-full items-center justify-center gap-2">
{localize('com_nav_tool_remove')} {localize('com_nav_tool_remove')}
<XCircle className="flex h-4 w-4 items-center stroke-2" /> <XCircle className="flex h-4 w-4 items-center stroke-2" aria-hidden="true" />
</div> </div>
</button> </button>
)} )}

View file

@ -91,7 +91,7 @@ export function SourceHovercard({
/> />
<Ariakit.HovercardDisclosure className="ml-0.5 rounded-full text-text-primary focus:outline-none focus:ring-2 focus:ring-ring"> <Ariakit.HovercardDisclosure className="ml-0.5 rounded-full text-text-primary focus:outline-none focus:ring-2 focus:ring-ring">
<VisuallyHidden>{localize('com_citation_more_details', { label })}</VisuallyHidden> <VisuallyHidden>{localize('com_citation_more_details', { label })}</VisuallyHidden>
<ChevronDown className="icon-sm" /> <ChevronDown className="icon-sm" aria-hidden="true" />
</Ariakit.HovercardDisclosure> </Ariakit.HovercardDisclosure>
<Ariakit.Hovercard <Ariakit.Hovercard

View file

@ -84,7 +84,7 @@ function SourceItem({ source, expanded = false }: SourceItemProps) {
<VisuallyHidden> <VisuallyHidden>
{localize('com_citation_more_details', { label: domain })} {localize('com_citation_more_details', { label: domain })}
</VisuallyHidden> </VisuallyHidden>
<ChevronDown className="icon-sm" /> <ChevronDown className="icon-sm" aria-hidden="true" />
</Ariakit.HovercardDisclosure> </Ariakit.HovercardDisclosure>
<Ariakit.Hovercard <Ariakit.Hovercard
@ -298,7 +298,7 @@ const FileItem = React.memo(function FileItem({
<span className="truncate text-xs font-medium text-text-secondary"> <span className="truncate text-xs font-medium text-text-secondary">
{localize('com_sources_agent_file')} {localize('com_sources_agent_file')}
</span> </span>
{!isLocalFile && <Download className="ml-auto h-3 w-3" />} {!isLocalFile && <Download className="ml-auto h-3 w-3" aria-hidden="true" />}
</div> </div>
<div className="mt-1 min-w-0"> <div className="mt-1 min-w-0">
<span className="line-clamp-2 break-all text-left text-sm font-medium text-text-primary md:line-clamp-3"> <span className="line-clamp-2 break-all text-left text-sm font-medium text-text-primary md:line-clamp-3">
@ -337,7 +337,7 @@ const FileItem = React.memo(function FileItem({
<span className="truncate text-xs font-medium text-text-secondary"> <span className="truncate text-xs font-medium text-text-secondary">
{localize('com_sources_agent_file')} {localize('com_sources_agent_file')}
</span> </span>
{!isLocalFile && <Download className="ml-auto h-3 w-3" />} {!isLocalFile && <Download className="ml-auto h-3 w-3" aria-hidden="true" />}
</div> </div>
<div className="mt-1 min-w-0"> <div className="mt-1 min-w-0">
<span className="line-clamp-2 break-all text-left text-sm font-medium text-text-primary md:line-clamp-3"> <span className="line-clamp-2 break-all text-left text-sm font-medium text-text-primary md:line-clamp-3">
@ -428,7 +428,7 @@ const SourcesGroup = React.memo(function SourcesGroup({
className="rounded-full p-1 text-text-secondary hover:bg-surface-tertiary hover:text-text-primary" className="rounded-full p-1 text-text-secondary hover:bg-surface-tertiary hover:text-text-primary"
aria-label={localize('com_ui_close')} aria-label={localize('com_ui_close')}
> >
<X className="h-4 w-4" /> <X className="h-4 w-4" aria-hidden="true" />
</OGDialogClose> </OGDialogClose>
</div> </div>
<div className="flex-1 overflow-y-auto px-3 py-2"> <div className="flex-1 overflow-y-auto px-3 py-2">
@ -524,7 +524,7 @@ function FilesGroup({ files, messageId, conversationId, limit = 3 }: FilesGroupP
className="rounded-full p-1 text-text-secondary hover:bg-surface-tertiary hover:text-text-primary" className="rounded-full p-1 text-text-secondary hover:bg-surface-tertiary hover:text-text-primary"
aria-label={localize('com_ui_close')} aria-label={localize('com_ui_close')}
> >
<X className="h-4 w-4" /> <X className="h-4 w-4" aria-hidden="true" />
</OGDialogClose> </OGDialogClose>
</div> </div>
<div className="flex-1 overflow-y-auto px-3 py-2"> <div className="flex-1 overflow-y-auto px-3 py-2">
@ -549,7 +549,7 @@ function FilesGroup({ files, messageId, conversationId, limit = 3 }: FilesGroupP
function TabWithIcon({ label, icon }: { label: string; icon: React.ReactNode }) { function TabWithIcon({ label, icon }: { label: string; icon: React.ReactNode }) {
return ( return (
<div className="flex items-center gap-2 rounded-md px-3 py-1 text-sm transition-colors hover:bg-surface-tertiary hover:text-text-primary"> <div className="flex items-center gap-2 rounded-md px-3 py-1 text-sm transition-colors hover:bg-surface-tertiary hover:text-text-primary">
{React.cloneElement(icon as React.ReactElement, { size: 14 })} {React.cloneElement(icon as React.ReactElement, { size: 14, 'aria-hidden': true })}
<span>{label}</span> <span>{label}</span>
</div> </div>
); );

View file

@ -92,6 +92,7 @@ export default function Badge({
'@container-[600px]:h-4 @container-[600px]:w-4 relative h-5 w-5', '@container-[600px]:h-4 @container-[600px]:w-4 relative h-5 w-5',
!label && 'mx-auto', !label && 'mx-auto',
)} )}
aria-hidden="true"
/> />
)} )}
<span className="@container-[600px]:inline relative hidden">{label}</span> <span className="@container-[600px]:inline relative hidden">{label}</span>

View file

@ -68,7 +68,7 @@ const DialogContent = React.forwardRef<
{children} {children}
{showCloseButton && ( {showCloseButton && (
<DialogPrimitive.Close className="absolute right-6 top-[1.6rem] rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100 dark:focus:ring-white dark:focus:ring-offset-gray-700 dark:data-[state=open]:bg-gray-800"> <DialogPrimitive.Close className="absolute right-6 top-[1.6rem] rounded-sm opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-gray-100 dark:focus:ring-white dark:focus:ring-offset-gray-700 dark:data-[state=open]:bg-gray-800">
<X className="h-5 w-5 text-black dark:text-white" /> <X className="h-5 w-5 text-black dark:text-white" aria-hidden="true" />
<span className="sr-only">Close</span> <span className="sr-only">Close</span>
</DialogPrimitive.Close> </DialogPrimitive.Close>
)} )}

View file

@ -80,7 +80,7 @@ const DialogContent = React.forwardRef<
{children} {children}
{showCloseButton && ( {showCloseButton && (
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-ring-primary ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground"> <DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-ring-primary ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" /> <X className="h-4 w-4" aria-hidden="true" />
{/* eslint-disable-next-line i18next/no-literal-string */} {/* eslint-disable-next-line i18next/no-literal-string */}
<span className="sr-only">Close</span> <span className="sr-only">Close</span>
</DialogPrimitive.Close> </DialogPrimitive.Close>

View file

@ -63,7 +63,7 @@ const PaginationPrevious = ({
className={cn('gap-1 pl-2.5', className)} className={cn('gap-1 pl-2.5', className)}
{...props} {...props}
> >
<ChevronLeft className="h-4 w-4" /> <ChevronLeft className="h-4 w-4" aria-hidden="true" />
<span>Previous</span> <span>Previous</span>
</PaginationLink> </PaginationLink>
); );
@ -77,7 +77,7 @@ const PaginationNext = ({ className, ...props }: React.ComponentProps<typeof Pag
{...props} {...props}
> >
<span>Next</span> <span>Next</span>
<ChevronRight className="h-4 w-4" /> <ChevronRight className="h-4 w-4" aria-hidden="true" />
</PaginationLink> </PaginationLink>
); );
PaginationNext.displayName = 'PaginationNext'; PaginationNext.displayName = 'PaginationNext';
@ -88,7 +88,7 @@ const PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'
className={cn('flex h-9 w-9 items-center justify-center', className)} className={cn('flex h-9 w-9 items-center justify-center', className)}
{...props} {...props}
> >
<MoreHorizontal className="h-4 w-4" /> <MoreHorizontal className="h-4 w-4" aria-hidden="true" />
<span className="sr-only">More pages</span> <span className="sr-only">More pages</span>
</span> </span>
); );

View file

@ -102,7 +102,11 @@ const Radio = memo(function Radio({
currentValue === option.value ? 'text-foreground' : 'text-foreground' currentValue === option.value ? 'text-foreground' : 'text-foreground'
} ${disabled ? 'cursor-not-allowed opacity-50' : ''} ${fullWidth ? 'flex-1' : ''}`} } ${disabled ? 'cursor-not-allowed opacity-50' : ''} ${fullWidth ? 'flex-1' : ''}`}
> >
{option.icon && <span className="flex-shrink-0">{option.icon}</span>} {option.icon && (
<span className="flex-shrink-0" aria-hidden="true">
{option.icon}
</span>
)}
<span className="whitespace-nowrap">{option.label}</span> <span className="whitespace-nowrap">{option.label}</span>
</button> </button>
))} ))}

View file

@ -38,7 +38,7 @@ const TagPrimitiveRoot = React.forwardRef<HTMLDivElement, TagProps>(
className="rounded-full bg-green-600/50" className="rounded-full bg-green-600/50"
aria-label={`Remove ${label}`} aria-label={`Remove ${label}`}
> >
<X className="m-[1.5px] p-1" /> <X className="m-[1.5px] p-1" aria-hidden="true" />
</button> </button>
)} )}
</div> </div>

View file

@ -12,9 +12,9 @@ type ThemeType = 'system' | 'dark' | 'light';
const Theme = ({ theme, onChange }: { theme: string; onChange: (value: string) => void }) => { const Theme = ({ theme, onChange }: { theme: string; onChange: (value: string) => void }) => {
const themeIcons: Record<ThemeType, JSX.Element> = { const themeIcons: Record<ThemeType, JSX.Element> = {
system: <Monitor />, system: <Monitor aria-hidden="true" />,
dark: <Moon color="white" />, dark: <Moon color="white" aria-hidden="true" />,
light: <Sun />, light: <Sun aria-hidden="true" />,
}; };
const nextTheme = isDark(theme) ? 'light' : 'dark'; const nextTheme = isDark(theme) ? 'light' : 'dark';

View file

@ -13,6 +13,7 @@ export default function AnthropicIcon({
width={size} width={size}
height={size} height={size}
className={cn('fill-current text-black', className)} className={cn('fill-current text-black', className)}
aria-hidden="true"
> >
<g <g
style={{ style={{

View file

@ -13,6 +13,7 @@ export default function AnthropicMinimalIcon() {
height="1em" height="1em"
width="1em" width="1em"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
aria-hidden="true"
> >
<path d="m17.304 3.5472h-3.6718l6.6959 16.906h3.6718zm-10.608 0-6.6959 16.906h3.7442l1.3693-3.5502h7.0052l1.3693 3.5502h3.7442l-6.6959-16.906zm-0.37114 10.216 2.2914-5.9413 2.2914 5.9413z" /> <path d="m17.304 3.5472h-3.6718l6.6959 16.906h3.6718zm-10.608 0-6.6959 16.906h3.7442l1.3693-3.5502h7.0052l1.3693 3.5502h3.7442l-6.6959-16.906zm-0.37114 10.216 2.2914-5.9413 2.2914 5.9413z" />
</svg> </svg>

Some files were not shown because too many files have changed in this diff Show more