From be31deb4b104e44fbb4aae91d04debce12babaf4 Mon Sep 17 00:00:00 2001 From: Pavel <32868631+pabik@users.noreply.github.com> Date: Sat, 30 May 2026 18:29:50 +0300 Subject: [PATCH] Unify nav bar icons (lucide) and fix sidebar alignment (#2513) * Icons-audit * fix: linting --------- Co-authored-by: Alex --- frontend/src/Hero.tsx | 8 +- frontend/src/Navigation.tsx | 208 ++++++++++-------- frontend/src/agents/AgentsList.tsx | 7 +- frontend/src/assets/add.svg | 10 - frontend/src/assets/hamburger.svg | 3 - frontend/src/assets/openNewChat.svg | 4 - frontend/src/assets/panel-left-close.svg | 1 - frontend/src/assets/panel-left-open.svg | 1 - frontend/src/assets/search.svg | 3 - frontend/src/assets/settingGear.svg | 3 - frontend/src/assets/share.svg | 3 - frontend/src/assets/spark.svg | 3 - frontend/src/components/ActionButtons.tsx | 25 +-- frontend/src/components/Chunks.tsx | 8 +- frontend/src/components/FilePicker.tsx | 7 +- frontend/src/components/Help.tsx | 8 +- .../src/conversation/ConversationTile.tsx | 25 +-- .../src/modals/SearchConversationsModal.tsx | 8 +- frontend/src/settings/CustomModels.tsx | 8 +- frontend/src/settings/Sources.tsx | 7 +- frontend/src/settings/Tools.tsx | 10 +- 21 files changed, 176 insertions(+), 184 deletions(-) delete mode 100644 frontend/src/assets/add.svg delete mode 100644 frontend/src/assets/hamburger.svg delete mode 100644 frontend/src/assets/openNewChat.svg delete mode 100644 frontend/src/assets/panel-left-close.svg delete mode 100644 frontend/src/assets/panel-left-open.svg delete mode 100644 frontend/src/assets/search.svg delete mode 100644 frontend/src/assets/settingGear.svg delete mode 100644 frontend/src/assets/share.svg delete mode 100644 frontend/src/assets/spark.svg diff --git a/frontend/src/Hero.tsx b/frontend/src/Hero.tsx index 3e07b02c..3ebf46ef 100644 --- a/frontend/src/Hero.tsx +++ b/frontend/src/Hero.tsx @@ -99,12 +99,16 @@ function HeroModelSelect() { {hasModels ? ( availableModels?.map((model: Model) => ( - + {model.display_name} )) ) : ( -
+
No models available
)} diff --git a/frontend/src/Navigation.tsx b/frontend/src/Navigation.tsx index 1776e503..a31f7090 100644 --- a/frontend/src/Navigation.tsx +++ b/frontend/src/Navigation.tsx @@ -2,24 +2,25 @@ import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; import { NavLink, useNavigate } from 'react-router-dom'; +import { + LayoutGrid, + Menu, + PanelLeftClose, + PanelLeftOpen, + Plus, + Search as SearchIcon, + Settings as SettingsIcon, +} from 'lucide-react'; import { Agent } from './agents/types'; import conversationService from './api/services/conversationService'; import userService from './api/services/userService'; -import Add from './assets/add.svg'; import DocsGPT3 from './assets/cute_docsgpt3.svg'; import Discord from './assets/discord.svg'; -import PanelLeftClose from './assets/panel-left-close.svg'; -import PanelLeftOpen from './assets/panel-left-open.svg'; import Github from './assets/git_nav.svg'; -import Hamburger from './assets/hamburger.svg'; -import openNewChat from './assets/openNewChat.svg'; import Pin from './assets/pin.svg'; -import SearchIcon from './assets/search.svg'; import { Avatar } from './components/ui/avatar'; import { Button } from './components/ui/button'; -import SettingGear from './assets/settingGear.svg'; -import Spark from './assets/spark.svg'; import Spinner from './components/Spinner'; import Twitter from './assets/TwitterX.svg'; import UnPin from './assets/unpin.svg'; @@ -324,12 +325,9 @@ export default function Navigation({ navOpen, setNavOpen }: NavigationProps) { size="icon" onClick={() => setNavOpen(true)} aria-label="Open navigation menu" + className="text-muted-foreground hover:text-foreground" > - + {queries?.length > 0 && ( )} -
+ {conversations?.data && conversations.data.length > 0 && ( + )} +
@@ -395,36 +391,46 @@ export default function Navigation({ navOpen, setNavOpen }: NavigationProps) { } bg-sidebar dark:border-r-sidebar-border fixed top-0 z-20 flex h-full w-72 flex-col border-r border-b-0 transition-all duration-300 ease-in-out dark:text-white`} >
{ if (isMobile) { setNavOpen(!navOpen); } }} > - - DocsGPT Logo -

DocsGPT

+
+ DocsGPT Logo +

+ DocsGPT +

`${ isActive ? 'bg-transparent' : '' - } group border-sidebar-border hover:border-sidebar-border sticky mx-4 mt-4 flex cursor-pointer gap-2.5 rounded-3xl border p-3 hover:bg-transparent dark:text-white` + } group border-sidebar-border hover:border-sidebar-border sticky mx-4 mt-4 flex cursor-pointer items-center gap-2.5 rounded-3xl border p-3 hover:bg-transparent dark:text-white` } > - Create new chat -

+

{t('newChat')}

@@ -519,69 +525,77 @@ export default function Navigation({ navOpen, setNavOpen }: NavigationProps) {
))} -
{ dispatch(setSelectedAgent(null)); if (isMobile || isTablet) { setNavOpen(false); } - navigate('/agents'); }} + className={({ isActive }) => + `hover:bg-sidebar-accent mx-4 my-auto mt-2 flex h-9 cursor-pointer items-center gap-2 rounded-3xl pl-4 ${ + isActive ? 'bg-sidebar-accent' : '' + }` + } >
- manage-agents

{t('manageAgents')}

-
+ ) : ( -
{ if (isMobile || isTablet) { setNavOpen(false); } dispatch(setSelectedAgent(null)); - navigate('/agents'); }} + className={({ isActive }) => + `hover:bg-sidebar-accent mx-4 my-auto mt-2 flex h-9 cursor-pointer items-center gap-2.5 rounded-3xl pl-3 ${ + isActive ? 'bg-sidebar-accent' : '' + }` + } > -
- manage-agents -
+

{t('manageAgents')}

-
+ )} {conversations?.data && conversations.data.length > 0 ? (
-
+

{t('chats')}

@@ -619,17 +633,15 @@ export default function Navigation({ navOpen, setNavOpen }: NavigationProps) { }} to="/settings" className={({ isActive }) => - `hover:bg-sidebar-accent mx-4 my-auto flex h-9 cursor-pointer items-center gap-4 rounded-3xl ${ + `hover:bg-sidebar-accent mx-4 my-auto flex h-9 cursor-pointer items-center gap-2.5 rounded-3xl pl-3 ${ isActive ? 'bg-sidebar-accent' : '' }` } > - Settings

{t('settings.label')} @@ -686,24 +698,30 @@ export default function Navigation({ navOpen, setNavOpen }: NavigationProps) {

-
+
-
- DocsGPT -
+ + DocsGPT Logo +

+ DocsGPT +

+
+ } />
diff --git a/frontend/src/assets/add.svg b/frontend/src/assets/add.svg deleted file mode 100644 index d38c815e..00000000 --- a/frontend/src/assets/add.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/frontend/src/assets/hamburger.svg b/frontend/src/assets/hamburger.svg deleted file mode 100644 index cfed15f4..00000000 --- a/frontend/src/assets/hamburger.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/src/assets/openNewChat.svg b/frontend/src/assets/openNewChat.svg deleted file mode 100644 index 0749ff17..00000000 --- a/frontend/src/assets/openNewChat.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/frontend/src/assets/panel-left-close.svg b/frontend/src/assets/panel-left-close.svg deleted file mode 100644 index c134cae0..00000000 --- a/frontend/src/assets/panel-left-close.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/frontend/src/assets/panel-left-open.svg b/frontend/src/assets/panel-left-open.svg deleted file mode 100644 index c9935f7a..00000000 --- a/frontend/src/assets/panel-left-open.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/frontend/src/assets/search.svg b/frontend/src/assets/search.svg deleted file mode 100644 index 0cdd9ea9..00000000 --- a/frontend/src/assets/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/src/assets/settingGear.svg b/frontend/src/assets/settingGear.svg deleted file mode 100644 index 37a5893e..00000000 --- a/frontend/src/assets/settingGear.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/src/assets/share.svg b/frontend/src/assets/share.svg deleted file mode 100644 index 4699e16b..00000000 --- a/frontend/src/assets/share.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/src/assets/spark.svg b/frontend/src/assets/spark.svg deleted file mode 100644 index b6123b74..00000000 --- a/frontend/src/assets/spark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/frontend/src/components/ActionButtons.tsx b/frontend/src/components/ActionButtons.tsx index 687d12d2..4a1e609d 100644 --- a/frontend/src/components/ActionButtons.tsx +++ b/frontend/src/components/ActionButtons.tsx @@ -1,7 +1,6 @@ +import { ExternalLink, Plus } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; -import newChatIcon from '../assets/openNewChat.svg'; -import ShareIcon from '../assets/share.svg'; import { ShareConversationModal } from '../modals/ShareConversationModal'; import { useState } from 'react'; import { selectConversationId } from '../preferences/preferenceSlice'; @@ -57,15 +56,9 @@ export default function ActionButtons({ size="icon" title={t('actionButtons.openNewChat')} onClick={newChat} - className="rounded-full lg:hidden" + className="text-muted-foreground hover:text-foreground rounded-full lg:hidden" > - NewChat + )} @@ -77,14 +70,12 @@ export default function ActionButtons({ size="icon" title={t('actionButtons.share')} onClick={() => setShareModalState(true)} - className="rounded-full" + className="text-muted-foreground hover:text-foreground rounded-full" > - share {isShareModalOpen && ( diff --git a/frontend/src/components/Chunks.tsx b/frontend/src/components/Chunks.tsx index 9f969def..7b0dfad3 100644 --- a/frontend/src/components/Chunks.tsx +++ b/frontend/src/components/Chunks.tsx @@ -1,3 +1,4 @@ +import { Search as SearchIcon } from 'lucide-react'; import React, { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; @@ -8,7 +9,6 @@ import FileIcon from '../assets/file.svg'; import FolderIcon from '../assets/folder.svg'; import NoFilesDarkIcon from '../assets/no-files-dark.svg'; import NoFilesIcon from '../assets/no-files.svg'; -import SearchIcon from '../assets/search.svg'; import { useDarkTheme, useDebouncedValue, @@ -493,7 +493,11 @@ const Chunks: React.FC = ({
- Search +
= ({ onChange={(e) => handleSearchChange(e.target.value)} labelBgClassName="bg-[#EEE6FF78] dark:bg-muted" leftIcon={ - Search + } />
diff --git a/frontend/src/components/Help.tsx b/frontend/src/components/Help.tsx index aafc64ed..ef5ae1cb 100644 --- a/frontend/src/components/Help.tsx +++ b/frontend/src/components/Help.tsx @@ -39,9 +39,13 @@ const Help = () => { variant="ghost" ref={buttonRef} onClick={toggleDropdown} - className="hover:bg-sidebar-accent mx-4 my-auto w-full justify-start gap-4 rounded-3xl px-0" + className="hover:bg-sidebar-accent mx-4 my-auto w-full justify-start gap-2.5 rounded-3xl pr-0 pl-3" > - info + info {t('help')} {isOpen && ( diff --git a/frontend/src/conversation/ConversationTile.tsx b/frontend/src/conversation/ConversationTile.tsx index 230d0b6f..f5ead293 100644 --- a/frontend/src/conversation/ConversationTile.tsx +++ b/frontend/src/conversation/ConversationTile.tsx @@ -1,10 +1,11 @@ -import { X } from 'lucide-react'; +import { ExternalLink, X } from 'lucide-react'; import { SyntheticEvent, useCallback, useEffect, useRef, useState, + type ReactNode, } from 'react'; import { useSelector } from 'react-redux'; import Edit from '../assets/edit.svg'; @@ -12,7 +13,6 @@ import { useDarkTheme } from '../hooks'; import ConfirmationModal from '../modals/ConfirmationModal'; import CheckMark2 from '../assets/checkMark2.svg'; import Trash from '../assets/red-trash.svg'; -import Share from '../assets/share.svg'; import threeDots from '../assets/three-dots.svg'; import { selectConversationId } from '../preferences/preferenceSlice'; import { ActiveState } from '../models/misc'; @@ -127,17 +127,15 @@ export default function ConversationTile({ }; type ConversationMenuOption = { - icon: string; + icon: ReactNode; label: string; onClick: (event: SyntheticEvent) => void; variant: 'default' | 'destructive'; - iconWidth?: number; - iconHeight?: number; }; const menuOptions: ConversationMenuOption[] = [ { - icon: Share, + icon: , label: t('convTile.share'), onClick: (event: SyntheticEvent) => { event.stopPropagation(); @@ -145,25 +143,21 @@ export default function ConversationTile({ setOpen(false); }, variant: 'default', - iconWidth: 14, - iconHeight: 14, }, { - icon: Edit, + icon: , label: t('convTile.rename'), onClick: handleEditConversation, variant: 'default', }, { - icon: Trash, + icon: , label: t('convTile.delete'), onClick: (event: SyntheticEvent) => { event.stopPropagation(); setDeleteModalState('ACTIVE'); setOpen(false); }, - iconWidth: 18, - iconHeight: 18, variant: 'destructive', }, ]; @@ -274,12 +268,7 @@ export default function ConversationTile({ option.onClick(event as unknown as SyntheticEvent); }} > - + {option.icon} {option.label} ))} diff --git a/frontend/src/modals/SearchConversationsModal.tsx b/frontend/src/modals/SearchConversationsModal.tsx index 3fc191d6..7ecb37b9 100644 --- a/frontend/src/modals/SearchConversationsModal.tsx +++ b/frontend/src/modals/SearchConversationsModal.tsx @@ -1,3 +1,4 @@ +import { Search as SearchIcon } from 'lucide-react'; import { useEffect, useMemo, @@ -7,7 +8,6 @@ import { } from 'react'; import { useTranslation } from 'react-i18next'; -import SearchIcon from '../assets/search.svg'; import { Button } from '../components/ui/button'; import { Input } from '../components/ui/input'; import { Modal } from '../components/ui/modal'; @@ -163,7 +163,11 @@ export default function SearchConversationsModal({ >
- search + + } />
diff --git a/frontend/src/settings/Sources.tsx b/frontend/src/settings/Sources.tsx index 219f2354..0e384b12 100644 --- a/frontend/src/settings/Sources.tsx +++ b/frontend/src/settings/Sources.tsx @@ -1,3 +1,4 @@ +import { Search as SearchIcon } from 'lucide-react'; import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useDispatch, useSelector } from 'react-redux'; @@ -8,7 +9,6 @@ import EyeView from '../assets/eye-view.svg'; import NoFilesIcon from '../assets/no-files.svg'; import NoFilesDarkIcon from '../assets/no-files-dark.svg'; import Trash from '../assets/red-trash.svg'; -import SearchIcon from '../assets/search.svg'; import SyncIcon from '../assets/sync.svg'; import ThreeDots from '../assets/three-dots.svg'; import CalendarIcon from '../assets/calendar.svg'; @@ -434,7 +434,10 @@ export default function Sources({ labelBgClassName="bg-background" className="rounded-full" leftIcon={ - + } />
diff --git a/frontend/src/settings/Tools.tsx b/frontend/src/settings/Tools.tsx index bc50fa20..e3ade6c5 100644 --- a/frontend/src/settings/Tools.tsx +++ b/frontend/src/settings/Tools.tsx @@ -1,4 +1,4 @@ -import { RefreshCcw, Trash } from 'lucide-react'; +import { RefreshCcw, Search as SearchIcon, Trash } from 'lucide-react'; import type { LucideIcon } from 'lucide-react'; import React from 'react'; import { useTranslation } from 'react-i18next'; @@ -9,7 +9,6 @@ import userService from '../api/services/userService'; import Edit from '../assets/edit.svg'; import NoFilesDarkIcon from '../assets/no-files-dark.svg'; import NoFilesIcon from '../assets/no-files.svg'; -import SearchIcon from '../assets/search.svg'; import ThreeDotsIcon from '../assets/three-dots.svg'; import SkeletonLoader from '../components/SkeletonLoader'; import ToolIcon from '../components/ToolIcon'; @@ -282,10 +281,9 @@ export default function Tools() { labelBgClassName="bg-background" className="rounded-full" leftIcon={ - } />