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}
title={localize('com_agents_copy_link')}
>
<Link />
<Link aria-hidden="true" />
</Button>
{/* Agent avatar - top center */}

View file

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

View file

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

View file

@ -114,7 +114,11 @@ export const CopyCodeButton: React.FC<{ content: string }> = ({ content }) => {
onClick={handleCopy}
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>
);
};

View file

@ -41,7 +41,11 @@ const DownloadArtifact = ({ artifact }: { artifact: Artifact }) => {
onClick={handleDownload}
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>
);
};

View file

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

View file

@ -43,7 +43,7 @@ function AddMultiConvo() {
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"
>
<PlusCircle size={16} aria-label="Plus Icon" />
<PlusCircle size={16} aria-hidden="true" />
</TooltipAnchor>
);
}

View file

@ -66,7 +66,7 @@ function Artifacts() {
setValue={handleToggle}
label={localize('com_ui_artifacts')}
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 && (
@ -79,7 +79,7 @@ function Artifacts() {
)}
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.Menu

View file

@ -62,9 +62,9 @@ const ArtifactsSubMenu = React.forwardRef<HTMLDivElement, ArtifactsSubMenuProps>
}
>
<div className="flex items-center gap-2">
<WandSparkles className="icon-md" />
<WandSparkles className="icon-md" aria-hidden="true" />
<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>
<button
type="button"

View file

@ -29,7 +29,7 @@ function CodeInterpreter() {
setValue={debouncedChange}
label={localize('com_assistants_code_interpreter')}
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 ? (
<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>
}

View file

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

View file

@ -68,7 +68,7 @@ export const columns: ColumnDef<TFile>[] = [
onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
>
{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>
);
},
@ -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"
>
{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>
);
},
@ -160,7 +160,7 @@ export const columns: ColumnDef<TFile>[] = [
}
return (
<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')}
</div>
);
@ -204,7 +204,7 @@ export const columns: ColumnDef<TFile>[] = [
onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}
>
{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>
);
},

View file

@ -127,7 +127,7 @@ export default function DataTable<TData, TValue>({ columns, data }: DataTablePro
aria-label={localize('com_files_filter_by')}
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>
</DropdownMenuTrigger>
<DropdownMenuContent

View file

@ -41,9 +41,9 @@ export function SortFilterHeader<TData, TValue>({
>
<span>{title}</span>
{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();
@ -95,7 +95,10 @@ export function SortFilterHeader<TData, TValue>({
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}
</DropdownMenuItem>
);
@ -112,7 +115,7 @@ export function SortFilterHeader<TData, TValue>({
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')}
</DropdownMenuItem>
)}

View file

@ -58,7 +58,7 @@ export default function HeaderOptions({
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"
>
<Settings2 size={16} aria-label="Settings/Parameters Icon" />
<Settings2 size={16} aria-hidden="true" />
</TooltipAnchor>
)}
</div>

View file

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

View file

@ -29,7 +29,7 @@ function WebSearch() {
setValue={debouncedChange}
label={localize('com_ui_search')}
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}`}
>
<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">
{text}
</span>

View file

@ -51,7 +51,10 @@ export function EndpointModelItem({ modelId, endpoint, isSelected }: EndpointMod
) : null}
<span className="truncate text-left">{modelName}</span>
{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>
{isSelected && (

View file

@ -172,7 +172,9 @@ export function SearchResults({ results, localize, searchValue }: SearchResultsP
)}
<span>{modelName}</span>
</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 && (
<svg
width="16"

View file

@ -32,7 +32,7 @@ const PresetsMenu: FC = () => {
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"
>
<BookCopy size={16} aria-label="Preset Icon" />
<BookCopy size={16} aria-hidden="true" />
</TooltipAnchor>
</Trigger>
<Portal>

View file

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

View file

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

View file

@ -3,7 +3,7 @@ import { X } from 'lucide-react';
export default function CancelledIcon() {
return (
<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>
);
}

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

View file

@ -157,7 +157,7 @@ const EditTextPart = ({
{part.type === ContentTypes.THINK && (
<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">
<Lightbulb className="size-3.5" />
<Lightbulb className="size-3.5" aria-hidden="true" />
{localize('com_ui_thoughts')}
</span>
</div>
@ -165,7 +165,7 @@ const EditTextPart = ({
{part.type !== ContentTypes.THINK && (
<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">
<MessageSquare className="size-3.5" />
<MessageSquare className="size-3.5" aria-hidden="true" />
{localize('com_ui_response')}
</span>
</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">
<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
className={cn(
'icon-sm absolute transform-gpu text-text-primary opacity-0 transition-all duration-300 group-hover/button:opacity-100',
isExpanded && 'rotate-180',
)}
aria-hidden="true"
/>
</span>
{label}

View file

@ -98,9 +98,9 @@ export default function ProgressText({
<span className={showShimmer ? 'shimmer' : ''}>{text}</span>
{hasInput &&
(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>
</Wrapper>

View file

@ -236,7 +236,7 @@ export default function ToolCall({
</Button>
</div>
<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')}
</p>
</div>

View file

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

View file

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

View file

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

View file

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

View file

@ -133,7 +133,7 @@ function ConvoOptions({
{
label: localize('com_ui_share'),
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,
hideOnClick: false,
ref: shareButtonRef,
@ -142,7 +142,7 @@ function ConvoOptions({
{
label: localize('com_ui_rename'),
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'),
@ -151,7 +151,7 @@ function ConvoOptions({
icon: isDuplicateLoading ? (
<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 ? (
<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'),
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,
ref: deleteButtonRef,
render: (props) => <button {...props} />,

View file

@ -102,7 +102,11 @@ export default function ShareButton({
}}
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>
</div>
)}

View file

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

View file

@ -119,7 +119,7 @@ const MessageEndpointIcon: React.FC<IconProps> = (props) => {
) : (
<div className="h-6 w-6">
<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>
),

View file

@ -47,7 +47,7 @@ const MinimalIcon: React.FC<IconProps> = (props) => {
[EModelEndpoint.assistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
[EModelEndpoint.azureAssistants]: { icon: <Sparkles className="icon-sm" />, name: 'Assistant' },
[EModelEndpoint.agents]: {
icon: <Feather className="icon-sm" />,
icon: <Feather className="icon-sm" aria-hidden="true" />,
name: props.modelLabel ?? alternateName[EModelEndpoint.agents],
},
[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"
onClick={removeExample}
>
<Minus className="w-[16px]" />
<Minus className="w-[16px]" aria-hidden="true" />
</Button>
<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"
onClick={addExample}
>
<Plus className="w-[16px]" />
<Plus className="w-[16px]" aria-hidden="true" />
</Button>
</div>
</>

View file

@ -38,7 +38,7 @@ export const URLIcon = memo(
className="absolute flex items-center justify-center rounded-full bg-red-500"
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>

View file

@ -150,12 +150,12 @@ export default function FileSidePanel() {
return (
<div className="w-30">
<h2 className="m-3 text-lg">
<strong>Files</strong>
<strong>{localize('com_ui_files')}</strong>
</h2>
<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">
<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>
<Input
placeholder={localize('com_files_filter')}

View file

@ -65,14 +65,14 @@ export default function MCPConfigDialog({
if (requiresOAuth) {
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">
<KeyRound className="h-3 w-3" />
<KeyRound className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_oauth')}</span>
</div>
);
} else {
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">
<PlugZap className="h-3 w-3" />
<PlugZap className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_offline')}</span>
</div>
);
@ -82,7 +82,7 @@ export default function MCPConfigDialog({
if (connectionState === 'error') {
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">
<AlertTriangle className="h-3 w-3" />
<AlertTriangle className="h-3 w-3" aria-hidden="true" />
<span>{localize('com_ui_error')}</span>
</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"
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>
);
}
@ -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"
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>
);
}
@ -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"
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>
);
}
@ -185,7 +185,10 @@ function AuthenticatedStatusIcon({
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 })}
>
<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>
);
}

View file

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

View file

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

View file

@ -93,7 +93,7 @@ function AccountSettings() {
value="logout"
className="select-item text-sm"
>
<LogOut className="icon-md" />
<LogOut className="icon-md" aria-hidden="true" />
{localize('com_nav_log_out')}
</Select.SelectItem>
</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"
onClick={handleAgentMarketplace}
>
<LayoutGrid className="icon-lg text-text-primary" />
<LayoutGrid className="icon-lg text-text-primary" aria-hidden="true" />
</Button>
}
/>

View file

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

View file

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

View file

@ -170,7 +170,7 @@ function Avatar() {
<span>{localize('com_nav_profile_picture')}</span>
<OGDialogTrigger asChild>
<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>
</Button>
</OGDialogTrigger>
@ -211,7 +211,7 @@ function Avatar() {
{!isDragging && (
<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">
<Move className="h-6 w-6 text-white" />
<Move className="h-6 w-6 text-white" aria-hidden="true" />
</div>
</div>
)}
@ -236,7 +236,7 @@ function Avatar() {
aria-label={localize('com_ui_zoom_out')}
className="shrink-0"
>
<ZoomOut className="h-4 w-4" />
<ZoomOut className="h-4 w-4" aria-hidden="true" />
</Button>
<Slider
id="zoom-slider"
@ -257,7 +257,7 @@ function Avatar() {
aria-label={localize('com_ui_zoom_in')}
className="shrink-0"
>
<ZoomIn className="h-4 w-4" />
<ZoomIn className="h-4 w-4" aria-hidden="true" />
</Button>
</div>
</div>
@ -270,7 +270,7 @@ function Avatar() {
className="flex items-center space-x-2"
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>
</Button>
<Button
@ -280,7 +280,7 @@ function Avatar() {
className="flex items-center space-x-2"
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>
</Button>
</div>
@ -312,7 +312,7 @@ function Avatar() {
{isUploading ? (
<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')}
</Button>

View file

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

View file

@ -123,12 +123,12 @@ const renderDeleteButton = (
<>
{isLocked ? (
<>
<LockIcon className="size-5" />
<LockIcon className="size-5" aria-hidden="true" />
<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>
</>
)}

View file

@ -216,7 +216,7 @@ const TwoFactorAuthentication: React.FC = () => {
>
<OGDialogHeader>
<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
? localize('com_ui_2fa_disable')
: localize('com_ui_2fa_setup')}

View file

@ -48,7 +48,7 @@ export const BackupPhase: React.FC<BackupPhaseProps> = ({
</div>
<div className="flex gap-4">
<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>
</Button>
<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}
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>
</div>
</div>

View file

@ -33,7 +33,11 @@ export const SetupPhase: React.FC<SetupPhaseProps> = ({ isGenerating, onGenerate
className="flex w-full"
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')}
</Button>
</div>

View file

@ -55,7 +55,7 @@ const DangerButton = (props: TDangerButtonProps, ref: ForwardedRef<HTMLButtonEle
id={`${id}-text`}
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)}
</div>
) : (

View file

@ -120,7 +120,7 @@ function ImportConversations() {
{isUploading ? (
<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>
</Button>

View file

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

View file

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

View file

@ -93,7 +93,7 @@ function PluginAuthForm({ plugin, onSubmit, isEntityTool }: TPluginAuthFormProps
>
<div className="flex items-center justify-center gap-2">
{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>
</button>
</form>

View file

@ -181,14 +181,13 @@ function PluginStoreDialog({ isOpen, setIsOpen }: TPluginStoreDialogProps) {
<div className="mt-4 flex flex-col gap-4">
<div className="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
type="text"
value={searchValue}
onChange={handleSearch}
placeholder={localize('com_nav_plugin_search')}
className="
text-token-text-primary flex rounded-md border border-border-heavy bg-surface-tertiary py-2 pl-10 pr-2"
className="text-token-text-primary flex rounded-md border border-border-heavy bg-surface-tertiary py-2 pl-10 pr-2"
/>
</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">
{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>
</button>
) : (
@ -56,7 +59,7 @@ function PluginStoreItem({ plugin, onInstall, onUninstall, isInstalled }: TPlugi
>
<div className="flex w-full items-center justify-center gap-2">
{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>
</button>
)}

View file

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

View file

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

View file

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

View file

@ -36,7 +36,7 @@ export default function List({
onClick={() => navigate('/d/prompts/new')}
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')}
</Button>
</div>

View file

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

View file

@ -80,7 +80,7 @@ export default function AccessRolesPicker({
<span className="font-medium">
{selectedRoleInfo?.name || localize('com_ui_select')}
</span>
<ChevronDown className="h-4 w-4 text-text-secondary" />
<ChevronDown className="h-4 w-4 text-text-secondary" aria-hidden="true" />
</Ariakit.MenuButton>
}
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">
<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>
{totalCurrentShares > 0 && (
<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">
<OGDialogTitle>
<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', {
0: config?.getShareMessage(resourceName),
})}
@ -270,7 +270,7 @@ export default function GenericGrantAccessDialog({
{hasPeoplePickerAccess && (
<div className="space-y-2">
<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} )
</h4>
@ -295,7 +295,7 @@ export default function GenericGrantAccessDialog({
if (allShares.length === 0 && !hasChanges) {
return (
<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">
{localize('com_ui_no_individual_access')}
</p>
@ -311,7 +311,7 @@ export default function GenericGrantAccessDialog({
{!hasAtLeastOneOwner && hasChanges && (
<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">
<UserX className="h-4 w-4" />
<UserX className="h-4 w-4" aria-hidden="true" />
{localize('com_ui_at_least_one_owner_required')}
</div>
</div>
@ -363,7 +363,11 @@ export default function GenericGrantAccessDialog({
: 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>
)}
</div>

View file

@ -85,7 +85,10 @@ export function SearchPicker<TOption extends { key: string; value: string }>({
{isLoading ? (
<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
ref={inputRef}

View file

@ -38,7 +38,7 @@ export default function SelectedPrincipalsList({
return (
<div className={`space-y-3 ${className}`}>
<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>
</div>
</div>
@ -64,7 +64,7 @@ export default function SelectedPrincipalsList({
<span>{subtitle}</span>
{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>
</>
)}
@ -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"
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>
</div>
</div>

View file

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

View file

@ -150,7 +150,7 @@ const AgentChain: React.FC<AgentChainProps> = ({ field, currentAgentId }) => {
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>
</div>
{idx < agentIds.length - 1 && (

View file

@ -512,7 +512,7 @@ export default function AgentPanel() {
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_new') +

View file

@ -87,7 +87,7 @@ export default function Action({ authType = '', isToolAuthenticated = false }) {
onClick={() => setIsDialogOpen(true)}
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>
)}
<HoverCardTrigger>

View file

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

View file

@ -114,9 +114,15 @@ export default function InputSection({
>
<div className="relative h-4 w-4">
{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>
</button>

View file

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

View file

@ -118,7 +118,7 @@ const AssistantConversationStarters: React.FC<AssistantConversationStartersProps
onClick={handleAddStarter}
disabled={hasReachedMax}
>
<Plus className="size-4" />
<Plus className="size-4" aria-hidden="true" />
</TooltipAnchor>
</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"
onClick={() => handleDeleteStarter(index)}
>
<X className="size-4" />
<X className="size-4" aria-hidden="true" />
</TooltipAnchor>
</div>
))}

View file

@ -20,7 +20,7 @@ export const columns: ColumnDef<TFile | undefined>[] = [
aria-label={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>
);
},

View file

@ -133,7 +133,7 @@ function MCPPanelContent() {
size="sm"
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')}
</Button>
@ -173,7 +173,7 @@ function MCPPanelContent() {
onClick={() => handleConfigRevoke(selectedServerNameForEditing)}
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')}
</Button>
)}

View file

@ -310,7 +310,7 @@ export default function MemoryViewer() {
className="w-full bg-transparent"
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')}
</Button>
</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)}
{link.label != null && link.label && (
<span

View file

@ -37,7 +37,7 @@ function MCPToolItem({
if (isInstalled) {
return {
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:
'btn relative bg-gray-300 hover:bg-gray-400 dark:bg-gray-50 dark:hover:bg-gray-200',
disabled: false,
@ -47,7 +47,7 @@ function MCPToolItem({
if (isConfiguring) {
return {
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',
disabled: false,
};
@ -56,7 +56,7 @@ function MCPToolItem({
if (isInitializing) {
return {
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',
disabled: true,
};
@ -64,7 +64,7 @@ function MCPToolItem({
return {
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',
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">
{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>
</button>
) : (
@ -69,7 +69,7 @@ function ToolItem({ tool, onAddTool, onRemoveTool, isInstalled = false }: ToolIt
>
<div className="flex w-full items-center justify-center gap-2">
{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>
</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">
<VisuallyHidden>{localize('com_citation_more_details', { label })}</VisuallyHidden>
<ChevronDown className="icon-sm" />
<ChevronDown className="icon-sm" aria-hidden="true" />
</Ariakit.HovercardDisclosure>
<Ariakit.Hovercard

View file

@ -84,7 +84,7 @@ function SourceItem({ source, expanded = false }: SourceItemProps) {
<VisuallyHidden>
{localize('com_citation_more_details', { label: domain })}
</VisuallyHidden>
<ChevronDown className="icon-sm" />
<ChevronDown className="icon-sm" aria-hidden="true" />
</Ariakit.HovercardDisclosure>
<Ariakit.Hovercard
@ -298,7 +298,7 @@ const FileItem = React.memo(function FileItem({
<span className="truncate text-xs font-medium text-text-secondary">
{localize('com_sources_agent_file')}
</span>
{!isLocalFile && <Download className="ml-auto h-3 w-3" />}
{!isLocalFile && <Download className="ml-auto h-3 w-3" aria-hidden="true" />}
</div>
<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">
@ -337,7 +337,7 @@ const FileItem = React.memo(function FileItem({
<span className="truncate text-xs font-medium text-text-secondary">
{localize('com_sources_agent_file')}
</span>
{!isLocalFile && <Download className="ml-auto h-3 w-3" />}
{!isLocalFile && <Download className="ml-auto h-3 w-3" aria-hidden="true" />}
</div>
<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">
@ -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"
aria-label={localize('com_ui_close')}
>
<X className="h-4 w-4" />
<X className="h-4 w-4" aria-hidden="true" />
</OGDialogClose>
</div>
<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"
aria-label={localize('com_ui_close')}
>
<X className="h-4 w-4" />
<X className="h-4 w-4" aria-hidden="true" />
</OGDialogClose>
</div>
<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 }) {
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">
{React.cloneElement(icon as React.ReactElement, { size: 14 })}
{React.cloneElement(icon as React.ReactElement, { size: 14, 'aria-hidden': true })}
<span>{label}</span>
</div>
);

View file

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

View file

@ -68,7 +68,7 @@ const DialogContent = React.forwardRef<
{children}
{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">
<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>
</DialogPrimitive.Close>
)}

View file

@ -80,7 +80,7 @@ const DialogContent = React.forwardRef<
{children}
{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">
<X className="h-4 w-4" />
<X className="h-4 w-4" aria-hidden="true" />
{/* eslint-disable-next-line i18next/no-literal-string */}
<span className="sr-only">Close</span>
</DialogPrimitive.Close>

View file

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

View file

@ -102,7 +102,11 @@ const Radio = memo(function Radio({
currentValue === option.value ? 'text-foreground' : 'text-foreground'
} ${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>
</button>
))}

View file

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

View file

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

View file

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

View file

@ -13,6 +13,7 @@ export default function AnthropicMinimalIcon() {
height="1em"
width="1em"
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" />
</svg>

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