diff --git a/package.json b/package.json index c3de9ce1..8c8facdd 100644 --- a/package.json +++ b/package.json @@ -87,12 +87,10 @@ "fs-extra": "^11.2.0", "got-scraping": "^4.1.1", "jsdom": "^26.0.0", - "lucide-react": "^0.487.0", "markdown-it": "^14.1.0", "officeparser": "^4.1.1", "proxy-agent": "^6.5.0", "tar": "^7.4.3", - "tiny-pinyin": "^1.3.2", "turndown": "^7.2.0", "turndown-plugin-gfm": "^1.0.2", "undici": "^7.4.0", @@ -161,6 +159,7 @@ "lint-staged": "^15.5.0", "lodash": "^4.17.21", "lru-cache": "^11.1.0", + "lucide-react": "^0.487.0", "mime": "^4.0.4", "npx-scope-finder": "^1.2.0", "openai": "patch:openai@npm%3A4.87.3#~/.yarn/patches/openai-npm-4.87.3-2b30a7685f.patch", @@ -190,6 +189,7 @@ "shiki": "^3.2.1", "string-width": "^7.2.0", "styled-components": "^6.1.11", + "tiny-pinyin": "^1.3.2", "tinycolor2": "^1.6.0", "tokenx": "^0.4.1", "typescript": "^5.6.2", diff --git a/src/renderer/src/assets/styles/index.scss b/src/renderer/src/assets/styles/index.scss index 13eb0f9a..6be8133f 100644 --- a/src/renderer/src/assets/styles/index.scss +++ b/src/renderer/src/assets/styles/index.scss @@ -281,3 +281,7 @@ body, color: var(--color-text); } } + +.lucide { + color: var(--color-icon); +} diff --git a/src/renderer/src/components/ListItem/index.tsx b/src/renderer/src/components/ListItem/index.tsx index 2cd3aa21..b3d41328 100644 --- a/src/renderer/src/components/ListItem/index.tsx +++ b/src/renderer/src/components/ListItem/index.tsx @@ -52,7 +52,7 @@ const ListItemContainer = styled.div` const ListItemContent = styled.div` display: flex; align-items: center; - gap: 5px; + gap: 2px; overflow: hidden; font-size: 13px; ` diff --git a/src/renderer/src/components/Popups/AddAssistantPopup.tsx b/src/renderer/src/components/Popups/AddAssistantPopup.tsx index 7d3ec6a0..d964e028 100644 --- a/src/renderer/src/components/Popups/AddAssistantPopup.tsx +++ b/src/renderer/src/components/Popups/AddAssistantPopup.tsx @@ -1,4 +1,3 @@ -import { SearchOutlined } from '@ant-design/icons' import { TopView } from '@renderer/components/TopView' import { useAgents } from '@renderer/hooks/useAgents' import { useAssistants, useDefaultAssistant } from '@renderer/hooks/useAssistant' @@ -9,6 +8,7 @@ import { Agent, Assistant } from '@renderer/types' import { uuid } from '@renderer/utils' import { Divider, Input, InputRef, Modal, Tag } from 'antd' import { take } from 'lodash' +import { Search } from 'lucide-react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -163,7 +163,7 @@ const PopupContainer: React.FC = ({ resolve }) => { - + } ref={inputRef} @@ -177,7 +177,7 @@ const PopupContainer: React.FC = ({ resolve }) => { size="middle" /> - + {take(agents, 100).map((agent, index) => ( = ({ model, resolve }) => { - + } ref={inputRef} @@ -403,7 +404,7 @@ const PopupContainer: React.FC = ({ model, resolve }) => { }} /> - + {processedItems.length > 0 ? ( @@ -510,8 +511,8 @@ const EmptyState = styled.div` ` const SearchIcon = styled.div` - width: 36px; - height: 36px; + width: 32px; + height: 32px; border-radius: 50%; display: flex; flex-direction: row; diff --git a/src/renderer/src/components/QuickPanel/view.tsx b/src/renderer/src/components/QuickPanel/view.tsx index 08b91b02..b431c69b 100644 --- a/src/renderer/src/components/QuickPanel/view.tsx +++ b/src/renderer/src/components/QuickPanel/view.tsx @@ -603,6 +603,7 @@ const QuickPanelItem = styled.div` cursor: pointer; transition: background-color 0.1s ease; margin-bottom: 1px; + font-family: Ubuntu; &.selected { background-color: var(--selected-color); &.focused { diff --git a/src/renderer/src/components/TranslateButton.tsx b/src/renderer/src/components/TranslateButton.tsx index afd153bb..fd8d97c0 100644 --- a/src/renderer/src/components/TranslateButton.tsx +++ b/src/renderer/src/components/TranslateButton.tsx @@ -1,10 +1,11 @@ -import { LoadingOutlined, TranslationOutlined } from '@ant-design/icons' +import { LoadingOutlined } from '@ant-design/icons' import { useDefaultModel } from '@renderer/hooks/useAssistant' import { useSettings } from '@renderer/hooks/useSettings' import { fetchTranslate } from '@renderer/services/ApiService' import { getDefaultTopic, getDefaultTranslateAssistant } from '@renderer/services/AssistantService' import { getUserMessage } from '@renderer/services/MessagesService' import { Button, Tooltip } from 'antd' +import { Languages } from 'lucide-react' import { FC, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -82,7 +83,7 @@ const TranslateButton: FC = ({ text, onTranslated, disabled, style, isLoa title={t('chat.input.translate', { target_language: t(`languages.${targetLanguage.toString()}`) })} arrow> - {isTranslating ? : } + {isTranslating ? : } ) diff --git a/src/renderer/src/components/app/Sidebar.tsx b/src/renderer/src/components/app/Sidebar.tsx index 25409fda..6e23133e 100644 --- a/src/renderer/src/components/app/Sidebar.tsx +++ b/src/renderer/src/components/app/Sidebar.tsx @@ -1,10 +1,3 @@ -import { - FileSearchOutlined, - FolderOutlined, - PictureOutlined, - QuestionCircleOutlined, - TranslationOutlined -} from '@ant-design/icons' import { isMac } from '@renderer/config/constant' import { AppLogo, UserAvatar } from '@renderer/config/env' import { useTheme } from '@renderer/context/ThemeProvider' @@ -17,6 +10,19 @@ import { useSettings } from '@renderer/hooks/useSettings' import { isEmoji } from '@renderer/utils' import type { MenuProps } from 'antd' import { Avatar, Dropdown, Tooltip } from 'antd' +import { + CircleHelp, + Folder, + Languages, + LayoutGrid, + LibraryBig, + MessageSquareQuote, + Moon, + Palette, + Settings, + Sparkle, + Sun +} from 'lucide-react' import { FC, useEffect } from 'react' import { useTranslation } from 'react-i18next' import { useLocation, useNavigate } from 'react-router-dom' @@ -84,7 +90,7 @@ const Sidebar: FC = () => { - + { mouseEnterDelay={0.8} placement="right"> toggleTheme()}> - {theme === 'dark' ? ( - - ) : ( - - )} + {theme === 'dark' ? : } { hideMinappPopup() - await modelGenerating() await to('/settings/provider') }}> - + @@ -129,13 +130,13 @@ const MainMenus: FC = () => { const isRoutes = (path: string): string => (pathname.startsWith(path) && !minappShow ? 'active' : '') const iconMap = { - assistants: , - agents: , - paintings: , - translate: , - minapp: , - knowledge: , - files: + assistants: , + agents: , + paintings: , + translate: , + minapp: , + knowledge: , + files: } const pathMap = { diff --git a/src/renderer/src/context/AntdProvider.tsx b/src/renderer/src/context/AntdProvider.tsx index 3e230931..93dcbf2c 100644 --- a/src/renderer/src/context/AntdProvider.tsx +++ b/src/renderer/src/context/AntdProvider.tsx @@ -33,7 +33,11 @@ const AntdProvider: FC = ({ children }) => { boxShadowSecondary: 'none', defaultShadow: 'none', dangerShadow: 'none', - primaryShadow: 'none' + primaryShadow: 'none', + borderRadius: 20 + }, + Select: { + borderRadius: 20 } }, token: { diff --git a/src/renderer/src/pages/agents/AgentsPage.tsx b/src/renderer/src/pages/agents/AgentsPage.tsx index 9aa1d878..162177e8 100644 --- a/src/renderer/src/pages/agents/AgentsPage.tsx +++ b/src/renderer/src/pages/agents/AgentsPage.tsx @@ -1,4 +1,4 @@ -import { PlusOutlined, SearchOutlined } from '@ant-design/icons' +import { PlusOutlined } from '@ant-design/icons' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import CustomTag from '@renderer/components/CustomTag' import ListItem from '@renderer/components/ListItem' @@ -9,6 +9,7 @@ import { Agent } from '@renderer/types' import { uuid } from '@renderer/utils' import { Button, Empty, Flex, Input } from 'antd' import { omit } from 'lodash' +import { Search } from 'lucide-react' import { FC, useCallback, useEffect, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import ReactMarkdown from 'react-markdown' @@ -150,7 +151,7 @@ const AgentsPage: FC = () => { variant="filled" allowClear onClear={handleSearchClear} - suffix={} + suffix={} value={searchInput} maxLength={50} onChange={(e) => setSearchInput(e.target.value)} diff --git a/src/renderer/src/pages/apps/AppsPage.tsx b/src/renderer/src/pages/apps/AppsPage.tsx index aef66daf..e61def49 100644 --- a/src/renderer/src/pages/apps/AppsPage.tsx +++ b/src/renderer/src/pages/apps/AppsPage.tsx @@ -1,9 +1,9 @@ -import { SearchOutlined } from '@ant-design/icons' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import { Center } from '@renderer/components/Layout' import { useMinapps } from '@renderer/hooks/useMinapps' import { Empty, Input } from 'antd' import { isEmpty } from 'lodash' +import { Search } from 'lucide-react' import React, { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -40,10 +40,10 @@ const AppsPage: FC = () => { } + suffix={} value={search} onChange={(e) => setSearch(e.target.value)} /> diff --git a/src/renderer/src/pages/files/FilesPage.tsx b/src/renderer/src/pages/files/FilesPage.tsx index 3e4c8723..49cfb442 100644 --- a/src/renderer/src/pages/files/FilesPage.tsx +++ b/src/renderer/src/pages/files/FilesPage.tsx @@ -2,24 +2,21 @@ import { DeleteOutlined, EditOutlined, ExclamationCircleOutlined, - FileImageOutlined, - FilePdfOutlined, - FileTextOutlined, SortAscendingOutlined, SortDescendingOutlined } from '@ant-design/icons' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' +import ListItem from '@renderer/components/ListItem' import TextEditPopup from '@renderer/components/Popups/TextEditPopup' import db from '@renderer/databases' -import { useProviders } from '@renderer/hooks/useProvider' import FileManager from '@renderer/services/FileManager' import store from '@renderer/store' import { FileType, FileTypes } from '@renderer/types' import { formatFileSize } from '@renderer/utils' -import type { MenuProps } from 'antd' -import { Button, Empty, Flex, Menu, Popconfirm } from 'antd' +import { Button, Empty, Flex, Popconfirm } from 'antd' import dayjs from 'dayjs' import { useLiveQuery } from 'dexie-react-hooks' +import { File as FileIcon, FileImage, FileText, FileType as FileTypeIcon } from 'lucide-react' import { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -34,9 +31,6 @@ const FilesPage: FC = () => { const [fileType, setFileType] = useState('document') const [sortField, setSortField] = useState('created_at') const [sortOrder, setSortOrder] = useState('desc') - const { providers } = useProviders() - - const geminiProviders = providers.filter((provider) => provider.type === 'gemini') const tempFilesSort = (files: FileType[]) => { return files.sort((a, b) => { @@ -144,16 +138,11 @@ const FilesPage: FC = () => { }) const menuItems = [ - { key: FileTypes.DOCUMENT, label: t('files.document'), icon: }, - { key: FileTypes.IMAGE, label: t('files.image'), icon: }, - { key: FileTypes.TEXT, label: t('files.text'), icon: }, - ...geminiProviders.map((provider) => ({ - key: 'gemini_' + provider.id, - label: provider.name, - icon: - })), - { key: 'all', label: t('files.all'), icon: } - ].filter(Boolean) as MenuProps['items'] + { key: FileTypes.DOCUMENT, label: t('files.document'), icon: }, + { key: FileTypes.IMAGE, label: t('files.image'), icon: }, + { key: FileTypes.TEXT, label: t('files.text'), icon: }, + { key: 'all', label: t('files.all'), icon: } + ] return ( @@ -162,7 +151,15 @@ const FilesPage: FC = () => { - setFileType(key as FileTypes)} /> + {menuItems.map((item) => ( + setFileType(item.key as FileTypes)} + /> + ))} @@ -223,10 +220,13 @@ const ContentContainer = styled.div` ` const SideNav = styled.div` + display: flex; + flex-direction: column; width: var(--settings-width); border-right: 0.5px solid var(--color-border); - padding: 7px 12px; + padding: 12px 10px; user-select: none; + gap: 6px; .ant-menu { border-inline-end: none !important; diff --git a/src/renderer/src/pages/history/HistoryPage.tsx b/src/renderer/src/pages/history/HistoryPage.tsx index 6bb035e9..cde7c34b 100644 --- a/src/renderer/src/pages/history/HistoryPage.tsx +++ b/src/renderer/src/pages/history/HistoryPage.tsx @@ -1,7 +1,8 @@ -import { ArrowLeftOutlined, EnterOutlined, SearchOutlined } from '@ant-design/icons' +import { ArrowLeftOutlined, EnterOutlined } from '@ant-design/icons' import { Message, Topic } from '@renderer/types' import { Input, InputRef } from 'antd' import { last } from 'lodash' +import { Search } from 'lucide-react' import { FC, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -83,7 +84,7 @@ const TopicsPage: FC = () => { allowClear ref={inputRef} onChange={(e) => setSearch(e.target.value.trimStart())} - suffix={search.length >= 2 ? : } + suffix={search.length >= 2 ? : } onPressEnter={onSearch} /> diff --git a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx index 5f130d58..051f5a57 100644 --- a/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/AttachmentButton.tsx @@ -1,8 +1,8 @@ -import { PaperClipOutlined } from '@ant-design/icons' import { isVisionModel } from '@renderer/config/models' import { FileType, Model } from '@renderer/types' import { documentExts, imageExts, textExts } from '@shared/config/constant' import { Tooltip } from 'antd' +import { Paperclip } from 'lucide-react' import { FC, useCallback, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -57,9 +57,7 @@ const AttachmentButton: FC = ({ ref, model, files, setFiles, ToolbarButto title={isVisionModel(model) ? t('chat.input.upload') : t('chat.input.upload.document')} arrow> - + ) diff --git a/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx b/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx index 41b6ccc5..297ebc97 100644 --- a/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/GenerateImageButton.tsx @@ -1,7 +1,7 @@ -import { PictureOutlined } from '@ant-design/icons' import { isGenerateImageModel } from '@renderer/config/models' import { Assistant, Model } from '@renderer/types' import { Tooltip } from 'antd' +import { Image } from 'lucide-react' import { FC } from 'react' import { useTranslation } from 'react-i18next' @@ -27,7 +27,7 @@ const GenerateImageButton: FC = ({ model, ToolbarButton, assistant, onEna } arrow> - + ) diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 232b66a2..b64e37bc 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -1,11 +1,6 @@ import { - ClearOutlined, CodeOutlined, FileSearchOutlined, - FormOutlined, - FullscreenExitOutlined, - FullscreenOutlined, - GlobalOutlined, HolderOutlined, PaperClipOutlined, PauseCircleOutlined, @@ -44,6 +39,7 @@ import TextArea, { TextAreaRef } from 'antd/es/input/TextArea' import dayjs from 'dayjs' import Logger from 'electron-log/renderer' import { debounce, isEmpty } from 'lodash' +import { Globe, Maximize, MessageSquareDiff, Minimize, PaintbrushVertical } from 'lucide-react' import React, { CSSProperties, FC, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router-dom' @@ -935,7 +931,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic, topic }) = - + = ({ assistant: _assistant, setActiveTopic, topic }) = /> - @@ -989,12 +986,12 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic, topic }) = /> - + - {isExpended ? : } + {isExpended ? : } diff --git a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx index dbe87345..1377bff9 100644 --- a/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/KnowledgeBaseButton.tsx @@ -4,6 +4,7 @@ import { QuickPanelListItem, useQuickPanel } from '@renderer/components/QuickPan import { useAppSelector } from '@renderer/store' import { KnowledgeBase } from '@renderer/types' import { Tooltip } from 'antd' +import { LibraryBig } from 'lucide-react' import { FC, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' @@ -88,7 +89,7 @@ const KnowledgeBaseButton: FC = ({ ref, selectedBases, onSelect, disabled return ( - + ) diff --git a/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx b/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx index 11914c6a..8d20b91c 100644 --- a/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/MCPToolsButton.tsx @@ -3,6 +3,7 @@ import { QuickPanelListItem, useQuickPanel } from '@renderer/components/QuickPan import { useMCPServers } from '@renderer/hooks/useMCPServers' import { MCPPrompt, MCPServer } from '@renderer/types' import { Form, Input, Modal, Tooltip } from 'antd' +import { SquareTerminal } from 'lucide-react' import { FC, useCallback, useImperativeHandle, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' @@ -303,7 +304,7 @@ const MCPToolsButton: FC = ({ return ( - + ) diff --git a/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx b/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx index f8bec57c..2328c002 100644 --- a/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/MentionModelsButton.tsx @@ -9,6 +9,7 @@ import { getModelUniqId } from '@renderer/services/ModelService' import { Model } from '@renderer/types' import { Avatar, Tooltip } from 'antd' import { first, sortBy } from 'lodash' +import { AtSign } from 'lucide-react' import { FC, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' @@ -104,7 +105,7 @@ const MentionModelsButton: FC = ({ ref, mentionModels, onMentionModel, To return ( - + ) diff --git a/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx b/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx index e0d6454f..0dcdbc2f 100644 --- a/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/NewContextButton.tsx @@ -1,6 +1,6 @@ -import { PicCenterOutlined } from '@ant-design/icons' import { useShortcut, useShortcutDisplay } from '@renderer/hooks/useShortcuts' import { Tooltip } from 'antd' +import { CircleFadingPlus } from 'lucide-react' import { FC } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -20,7 +20,7 @@ const NewContextButton: FC = ({ onNewContext, ToolbarButton }) => { - + diff --git a/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx b/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx index 1025c2af..7fd9a2ea 100644 --- a/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/QuickPhrasesButton.tsx @@ -4,6 +4,7 @@ import { QuickPanelListItem, QuickPanelOpenOptions } from '@renderer/components/ import QuickPhraseService from '@renderer/services/QuickPhraseService' import { QuickPhrase } from '@renderer/types' import { Tooltip } from 'antd' +import { Zap } from 'lucide-react' import { memo, useCallback, useEffect, useImperativeHandle, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' @@ -99,7 +100,7 @@ const QuickPhrasesButton = ({ ref, setInputValue, resizeTextArea, ToolbarButton return ( - + ) diff --git a/src/renderer/src/pages/home/Messages/MessageContent.tsx b/src/renderer/src/pages/home/Messages/MessageContent.tsx index a0c6ea21..036b4300 100644 --- a/src/renderer/src/pages/home/Messages/MessageContent.tsx +++ b/src/renderer/src/pages/home/Messages/MessageContent.tsx @@ -1,4 +1,4 @@ -import { SearchOutlined, SyncOutlined, TranslationOutlined } from '@ant-design/icons' +import { SyncOutlined, TranslationOutlined } from '@ant-design/icons' import { isOpenAIWebSearch } from '@renderer/config/models' import { getModelUniqId } from '@renderer/services/ModelService' import { Message, Model } from '@renderer/types' @@ -6,6 +6,7 @@ import { getBriefInfo } from '@renderer/utils' import { withMessageThought } from '@renderer/utils/formats' import { Divider, Flex } from 'antd' import { clone } from 'lodash' +import { Search } from 'lucide-react' import React, { Fragment, useMemo } from 'react' import { useTranslation } from 'react-i18next' import BarLoader from 'react-spinners/BarLoader' @@ -182,7 +183,7 @@ const MessageContent: React.FC = ({ message: _message, model }) => { if (message.status === 'searching') { return ( - + {t('message.searching')} diff --git a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx index 6a0d8d6d..7ea2bc4c 100644 --- a/src/renderer/src/pages/home/Messages/MessageMenubar.tsx +++ b/src/renderer/src/pages/home/Messages/MessageMenubar.tsx @@ -1,17 +1,4 @@ -import { - CheckOutlined, - DeleteOutlined, - EditOutlined, - ForkOutlined, - LikeFilled, - LikeOutlined, - MenuOutlined, - QuestionCircleOutlined, - SaveOutlined, - SyncOutlined, - TranslationOutlined -} from '@ant-design/icons' -import { UploadOutlined } from '@ant-design/icons' +import { CheckOutlined, EditOutlined, QuestionCircleOutlined, SyncOutlined } from '@ant-design/icons' import ObsidianExportPopup from '@renderer/components/Popups/ObsidianExportPopup' import SelectModelPopup from '@renderer/components/Popups/SelectModelPopup' import TextEditPopup from '@renderer/components/Popups/TextEditPopup' @@ -37,6 +24,20 @@ import { withMessageThought } from '@renderer/utils/formats' import { Button, Dropdown, Popconfirm, Tooltip } from 'antd' import dayjs from 'dayjs' import { clone } from 'lodash' +import { + AtSign, + Copy, + FilePenLine, + Languages, + Menu, + RefreshCw, + Save, + Share, + Split, + ThumbsDown, + ThumbsUp, + Trash +} from 'lucide-react' import { FC, memo, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' @@ -148,35 +149,42 @@ const MessageMenubar: FC = (props) => { const imageUrls: string[] = [] let match let content = editedText - + while ((match = imageRegex.exec(editedText)) !== null) { imageUrls.push(match[1]) content = content.replace(match[0], '') } - + // 更新消息内容,保留图片信息 - await editMessage(message.id, { + await editMessage(message.id, { content: content.trim(), metadata: { ...message.metadata, - generateImage: imageUrls.length > 0 ? { - type: 'url', - images: imageUrls - } : undefined - } - }) - - resendMessage && handleResendUserMessage({ - ...message, - content: content.trim(), - metadata: { - ...message.metadata, - generateImage: imageUrls.length > 0 ? { - type: 'url', - images: imageUrls - } : undefined + generateImage: + imageUrls.length > 0 + ? { + type: 'url', + images: imageUrls + } + : undefined } }) + + resendMessage && + handleResendUserMessage({ + ...message, + content: content.trim(), + metadata: { + ...message.metadata, + generateImage: + imageUrls.length > 0 + ? { + type: 'url', + images: imageUrls + } + : undefined + } + }) } }, [message, editMessage, handleResendUserMessage, t]) @@ -213,18 +221,28 @@ const MessageMenubar: FC = (props) => { { label: t('chat.save'), key: 'save', - icon: , + icon: , onClick: () => { const fileName = dayjs(message.createdAt).format('YYYYMMDDHHmm') + '.md' window.api.file.save(fileName, message.content) } }, - { label: t('common.edit'), key: 'edit', icon: , onClick: onEdit }, - { label: t('chat.message.new.branch'), key: 'new-branch', icon: , onClick: onNewBranch }, + { + label: t('common.edit'), + key: 'edit', + icon: , + onClick: onEdit + }, + { + label: t('chat.message.new.branch'), + key: 'new-branch', + icon: , + onClick: onNewBranch + }, { label: t('chat.topics.export.title'), key: 'export', - icon: , + icon: , children: [ exportMenuOptions.image && { label: t('chat.topics.copy.image'), @@ -361,7 +379,7 @@ const MessageMenubar: FC = (props) => { )} - {!copied && } + {!copied && } {copied && } @@ -378,7 +396,7 @@ const MessageMenubar: FC = (props) => { open={showRegenerateTooltip} onOpenChange={setShowRegenerateTooltip}> - + @@ -386,7 +404,7 @@ const MessageMenubar: FC = (props) => { {isAssistantMessage && ( - + )} @@ -412,7 +430,7 @@ const MessageMenubar: FC = (props) => { arrow> e.stopPropagation()}> - + @@ -420,7 +438,7 @@ const MessageMenubar: FC = (props) => { {isAssistantMessage && isGrouped && ( - {message.useful ? : } + {message.useful ? : } )} @@ -436,7 +454,7 @@ const MessageMenubar: FC = (props) => { mouseEnterDelay={1} open={showDeleteTooltip} onOpenChange={setShowDeleteTooltip}> - + @@ -447,7 +465,7 @@ const MessageMenubar: FC = (props) => { placement="topRight" arrow> e.stopPropagation()}> - + )} diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index ede880be..b492d533 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -29,7 +29,6 @@ import ChatNavigation from './ChatNavigation' import MessageAnchorLine from './MessageAnchorLine' import MessageGroup from './MessageGroup' import NarrowLayout from './NarrowLayout' -import NewTopicButton from './NewTopicButton' import Prompt from './Prompt' interface MessagesProps { @@ -225,7 +224,6 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic }) ref={containerRef} $right={topicPosition === 'left'}> - {messages.length >= 2 && !loading && } = ({ activeAssistant }) => { - + - EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)}> - + EventEmitter.emit(EVENT_NAMES.ADD_NEW_TOPIC)} style={{ marginRight: 5 }}> + @@ -78,7 +78,7 @@ const HeaderNavbar: FC = ({ activeAssistant }) => { toggleShowAssistants()} style={{ marginRight: 8, marginLeft: isMac ? 4 : -12 }}> - + )} @@ -88,7 +88,7 @@ const HeaderNavbar: FC = ({ activeAssistant }) => { SearchPopup.show()}> - + @@ -100,14 +100,14 @@ const HeaderNavbar: FC = ({ activeAssistant }) => { - + )} {topicPosition === 'right' && ( - + {showTopics ? : } )} diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index d930bc98..80a29bbf 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -1,4 +1,4 @@ -import { CheckOutlined, QuestionCircleOutlined, ReloadOutlined, SettingOutlined } from '@ant-design/icons' +import { CheckOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import Scrollbar from '@renderer/components/Scrollbar' import { @@ -44,6 +44,7 @@ import { import { Assistant, AssistantSettings, CodeStyleVarious, ThemeMode, TranslateLanguageVarious } from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { Button, Col, InputNumber, Row, Segmented, Select, Slider, Switch, Tooltip } from 'antd' +import { CircleHelp, RotateCcw, Settings2 } from 'lucide-react' import { FC, useCallback, useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -179,13 +180,13 @@ const SettingsTab: FC = (props) => { {t('assistants.settings.title')}{' '} - + @@ -286,7 +277,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { size="small" shape="circle" onClick={() => setExpandAll(!expandAll)} - icon={expandAll ? : } + icon={expandAll ? : } disabled={disabled} /> @@ -306,7 +297,7 @@ const KnowledgeContent: FC = ({ selectedBase }) => { extra={ @@ -189,7 +189,7 @@ const AboutSettings: FC = () => { - + {t('settings.about.website.title')} @@ -197,7 +197,7 @@ const AboutSettings: FC = () => { - + {t('settings.about.feedback.title')} @@ -215,7 +215,8 @@ const AboutSettings: FC = () => { - {t('settings.about.contact.title')} + + {t('settings.about.contact.title')} diff --git a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx index db314e30..2263651d 100644 --- a/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx +++ b/src/renderer/src/pages/settings/DisplaySettings/SidebarIconsManager.tsx @@ -1,5 +1,4 @@ import { CloseOutlined } from '@ant-design/icons' -import { FileSearchOutlined, FolderOutlined, PictureOutlined, TranslationOutlined } from '@ant-design/icons' import { DragDropContext, Draggable, @@ -11,6 +10,7 @@ import { import { useAppDispatch } from '@renderer/store' import { setSidebarIcons } from '@renderer/store/settings' import { message } from 'antd' +import { Folder, Languages, LayoutGrid, LibraryBig, MessageSquareQuote, Palette, Sparkle } from 'lucide-react' import { FC, useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -109,13 +109,13 @@ const SidebarIconsManager: FC = ({ // 使用useMemo缓存图标映射 const iconMap = useMemo( () => ({ - assistants: , - agents: , - paintings: , - translate: , - minapp: , - knowledge: , - files: + assistants: , + agents: , + paintings: , + translate: , + minapp: , + knowledge: , + files: }), [] ) diff --git a/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx b/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx index 44c8f70c..dbd0e8ad 100644 --- a/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/McpSettingsNavbar.tsx @@ -1,8 +1,9 @@ -import { EditOutlined, ExportOutlined, SearchOutlined } from '@ant-design/icons' +import { EditOutlined, ExportOutlined } from '@ant-design/icons' import { NavbarRight } from '@renderer/components/app/Navbar' import { HStack } from '@renderer/components/Layout' import { isWindows } from '@renderer/config/constant' import { Button } from 'antd' +import { Search } from 'lucide-react' import { useTranslation } from 'react-i18next' import { useNavigate } from 'react-router' @@ -21,7 +22,7 @@ export const McpSettingsNavbar = () => { size="small" type="text" onClick={() => navigate('/settings/mcp/npx-search')} - icon={} + icon={} className="nodrag" style={{ fontSize: 13, height: 28, borderRadius: 20 }}> {t('settings.mcp.searchNpx')} diff --git a/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx b/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx index 79d1fc39..e5586eb9 100644 --- a/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings/ModelSettings.tsx @@ -1,4 +1,4 @@ -import { EditOutlined, MessageOutlined, RedoOutlined, SettingOutlined, TranslationOutlined } from '@ant-design/icons' +import { RedoOutlined } from '@ant-design/icons' import { HStack } from '@renderer/components/Layout' import PromptPopup from '@renderer/components/Popups/PromptPopup' import { isEmbeddingModel } from '@renderer/config/models' @@ -13,6 +13,7 @@ import { setTranslateModelPrompt } from '@renderer/store/settings' import { Model } from '@renderer/types' import { Button, Select, Tooltip } from 'antd' import { find, sortBy } from 'lodash' +import { FolderPen, Languages, MessageSquareMore, Settings2 } from 'lucide-react' import { FC, useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -82,10 +83,10 @@ const ModelSettings: FC = () => { -
- + + {t('settings.models.default_assistant_model')} -
+
{ showSearch placeholder={t('settings.models.empty')} /> - @@ -304,11 +297,11 @@ const TranslatePage: FC = () => { -