mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-16 16:30:15 +01:00
Merge branch 'dev' into feat/model-spec-group-icons
This commit is contained in:
commit
917f60c83d
175 changed files with 340 additions and 183 deletions
|
|
@ -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 */}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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" />}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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" />}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 && (
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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} />,
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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]: {
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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')}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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')}
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
) : (
|
) : (
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
</>
|
</>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 && (
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 && (
|
||||||
|
|
|
||||||
|
|
@ -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') +
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
)}
|
)}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
))}
|
))}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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={{
|
||||||
|
|
|
||||||
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue