- {/* Sidebar */}
-
+
+
+ {/* Left Sidebar */}
+
- {/* Main Content Area */}
-
- {/* Mobile Header */}
- console.log('Settings')}
- onProfileClick={() => console.log('Profile')}
- />
+ {/* Main Chat Area */}
+
- {/* Chat Area */}
-
-
-
-
-
- {/* Mobile Overlay */}
- {sidebarOpen && (
-
- )}
+ {/* Right Topic Panel */}
+
);
diff --git a/client/src/components/LobeChatArea.tsx b/client/src/components/LobeChatArea.tsx
new file mode 100644
index 0000000..f19fe5a
--- /dev/null
+++ b/client/src/components/LobeChatArea.tsx
@@ -0,0 +1,370 @@
+import { Copy, Check, RotateCcw, MoreHorizontal } from 'lucide-react';
+import { createStyles } from 'antd-style';
+import { LobeChatInput } from './LobeChatInput';
+import type { Message } from '../types';
+import { lobeChatColors, lobeChatSpacing } from '../styles/lobeChatTheme';
+
+const useStyles = createStyles(({ css }) => ({
+ container: css`
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ background: ${lobeChatColors.chat.background};
+ `,
+
+ header: css`
+ height: 56px;
+ padding: 0 ${lobeChatSpacing.xl}px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ border-bottom: 1px solid ${lobeChatColors.sidebar.border};
+ flex-shrink: 0;
+ `,
+
+ headerLeft: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.md}px;
+ `,
+
+ headerAvatar: css`
+ width: 32px;
+ height: 32px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
+ `,
+
+ headerInfo: css`
+ display: flex;
+ flex-direction: column;
+ `,
+
+ headerTitle: css`
+ font-size: 14px;
+ font-weight: 600;
+ color: white;
+ `,
+
+ headerSubtitle: css`
+ font-size: 12px;
+ color: ${lobeChatColors.icon.default};
+ `,
+
+ headerActions: css`
+ display: flex;
+ gap: ${lobeChatSpacing.sm}px;
+ `,
+
+ iconButton: css`
+ width: 32px;
+ height: 32px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ messagesArea: css`
+ flex: 1;
+ overflow-y: auto;
+ overflow-x: hidden;
+ padding: ${lobeChatSpacing.xl}px;
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: ${lobeChatColors.sidebar.hover};
+ border-radius: 3px;
+ }
+ `,
+
+ messagesContainer: css`
+ max-width: 900px;
+ margin: 0 auto;
+ `,
+
+ message: css`
+ display: flex;
+ gap: ${lobeChatSpacing.lg}px;
+ margin-bottom: ${lobeChatSpacing.xl}px;
+ animation: fadeIn 0.3s ease-in;
+
+ @keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+ `,
+
+ messageAvatar: css`
+ width: 36px;
+ height: 36px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ flex-shrink: 0;
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
+ `,
+
+ messageContent: css`
+ flex: 1;
+ min-width: 0;
+ `,
+
+ messageHeader: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ margin-bottom: ${lobeChatSpacing.sm}px;
+ `,
+
+ messageName: css`
+ font-size: 13px;
+ font-weight: 600;
+ color: white;
+ `,
+
+ messageTime: css`
+ font-size: 12px;
+ color: ${lobeChatColors.icon.default};
+ `,
+
+ messageText: css`
+ font-size: 14px;
+ line-height: 1.7;
+ color: #e5e5e5;
+ margin-bottom: ${lobeChatSpacing.sm}px;
+ word-wrap: break-word;
+
+ p {
+ margin: 0 0 ${lobeChatSpacing.md}px 0;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ ul, ol {
+ margin: ${lobeChatSpacing.md}px 0;
+ padding-left: ${lobeChatSpacing.xl}px;
+ }
+
+ li {
+ margin: ${lobeChatSpacing.xs}px 0;
+ }
+
+ strong {
+ font-weight: 600;
+ color: white;
+ }
+
+ code {
+ background: ${lobeChatColors.sidebar.hover};
+ padding: 2px 6px;
+ border-radius: 4px;
+ font-size: 13px;
+ font-family: 'Monaco', 'Courier New', monospace;
+ }
+ `,
+
+ messageActions: css`
+ display: flex;
+ gap: ${lobeChatSpacing.xs}px;
+ margin-top: ${lobeChatSpacing.sm}px;
+ `,
+
+ actionButton: css`
+ padding: 6px ${lobeChatSpacing.sm}px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ font-size: 12px;
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ inputArea: css`
+ padding: ${lobeChatSpacing.xl}px;
+ border-top: 1px solid ${lobeChatColors.sidebar.border};
+ background: ${lobeChatColors.chat.background};
+ flex-shrink: 0;
+ `,
+
+ inputContainer: css`
+ max-width: 900px;
+ margin: 0 auto;
+ `,
+
+ userMessage: css`
+ .messageAvatar {
+ background: linear-gradient(135deg, #8b5cf6, #7c3aed);
+ }
+ `,
+}));
+
+interface LobeChatAreaProps {
+ messages: Message[];
+ isTyping: boolean;
+ onSendMessage: (content: string) => void;
+}
+
+export const LobeChatArea: React.FC
= ({
+ messages,
+ isTyping,
+ onSendMessage,
+}) => {
+ const { styles } = useStyles();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {messages.length === 0 ? (
+
+
π€
+
+ NexusChat
+
+
+ Activate the brain cluster and spark creative thinking. Your virtual assistant is here to communicate with you about everything.
+
+
+ ) : (
+ messages.map((message) => (
+
+
+ {message.role === 'user' ? 'π€' : 'π€'}
+
+
+
+
+ {message.role === 'user' ? 'You' : 'NexusChat'}
+
+
+ {new Date(message.timestamp).toLocaleTimeString('en-US', {
+ hour: '2-digit',
+ minute: '2-digit'
+ })}
+
+
+
+ {message.content}
+
+ {message.role === 'assistant' && (
+
+
+
+
+
+ )}
+
+
+ ))
+ )}
+
+ {isTyping && (
+
+
π€
+
+
+ NexusChat
+ typing...
+
+
+ βββ
+
+
+
+ )}
+
+
+
+
+
+ );
+};
+
diff --git a/client/src/components/LobeChatInput.tsx b/client/src/components/LobeChatInput.tsx
new file mode 100644
index 0000000..ae83a72
--- /dev/null
+++ b/client/src/components/LobeChatInput.tsx
@@ -0,0 +1,305 @@
+import React from 'react';
+import {
+ Paperclip,
+ Image,
+ FileText,
+ Link2,
+ Mic,
+ Grid3x3,
+ Smile,
+ Send,
+ Maximize2
+} from 'lucide-react';
+import { createStyles } from 'antd-style';
+import { lobeChatColors, lobeChatSpacing } from '../styles/lobeChatTheme';
+
+const useStyles = createStyles(({ css }) => ({
+ container: css`
+ display: flex;
+ flex-direction: column;
+ gap: ${lobeChatSpacing.md}px;
+ `,
+
+ inputWrapper: css`
+ background: ${lobeChatColors.input.background};
+ border: 1px solid ${lobeChatColors.input.border};
+ border-radius: 12px;
+ padding: ${lobeChatSpacing.md}px;
+ transition: all 0.2s;
+
+ &:focus-within {
+ border-color: ${lobeChatColors.input.focus};
+ }
+ `,
+
+ textareaContainer: css`
+ display: flex;
+ align-items: flex-start;
+ gap: ${lobeChatSpacing.sm}px;
+ margin-bottom: ${lobeChatSpacing.sm}px;
+ `,
+
+ textarea: css`
+ flex: 1;
+ background: transparent;
+ border: none;
+ color: white;
+ font-size: 14px;
+ line-height: 1.5;
+ resize: none;
+ outline: none;
+ min-height: 24px;
+ max-height: 200px;
+ font-family: inherit;
+
+ &::placeholder {
+ color: ${lobeChatColors.icon.default};
+ }
+ `,
+
+ sendButton: css`
+ width: 32px;
+ height: 32px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+ flex-shrink: 0;
+
+ &:not(:disabled) {
+ background: #8b5cf6;
+ color: white;
+
+ &:hover {
+ background: #7c3aed;
+ }
+ }
+
+ &:disabled {
+ cursor: not-allowed;
+ opacity: 0.5;
+ }
+ `,
+
+ toolbar: css`
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-top: ${lobeChatSpacing.xs}px;
+ border-top: 1px solid ${lobeChatColors.input.border};
+ `,
+
+ toolbarLeft: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+ `,
+
+ toolbarRight: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ `,
+
+ toolButton: css`
+ width: 28px;
+ height: 28px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ tokenCounter: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+ padding: 4px ${lobeChatSpacing.sm}px;
+ background: ${lobeChatColors.tag.background};
+ border-radius: 6px;
+ font-size: 12px;
+ color: ${lobeChatColors.tag.text};
+ `,
+
+ emoji: css`
+ font-size: 14px;
+ `,
+
+ actions: css`
+ display: flex;
+ gap: ${lobeChatSpacing.sm}px;
+ font-size: 12px;
+ color: ${lobeChatColors.icon.default};
+ `,
+
+ action: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+ cursor: pointer;
+ transition: color 0.2s;
+
+ &:hover {
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ newLineButton: css`
+ padding: 4px ${lobeChatSpacing.sm}px;
+ background: transparent;
+ border: 1px solid ${lobeChatColors.input.border};
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ font-size: 12px;
+ cursor: pointer;
+ transition: all 0.2s;
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ sendButtonLarge: css`
+ padding: ${lobeChatSpacing.sm}px ${lobeChatSpacing.lg}px;
+ background: #8b5cf6;
+ border: none;
+ border-radius: 8px;
+ color: white;
+ font-size: 13px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+
+ &:hover {
+ background: #7c3aed;
+ }
+
+ &:active {
+ transform: scale(0.98);
+ }
+ `,
+}));
+
+interface LobeChatInputProps {
+ onSend: (message: string) => void;
+ placeholder?: string;
+}
+
+export const LobeChatInput: React.FC = ({
+ onSend,
+ placeholder = 'Type your message here...',
+}) => {
+ const { styles } = useStyles();
+ const [value, setValue] = React.useState('');
+
+ const handleSend = () => {
+ if (value.trim()) {
+ onSend(value.trim());
+ setValue('');
+ }
+ };
+
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if (e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault();
+ handleSend();
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ β΅ Send
+
+
+ / β β΅ New Line
+
+
+
+
+
+ );
+};
+
+
diff --git a/client/src/components/LobeChatSidebar.tsx b/client/src/components/LobeChatSidebar.tsx
new file mode 100644
index 0000000..5f2b03d
--- /dev/null
+++ b/client/src/components/LobeChatSidebar.tsx
@@ -0,0 +1,330 @@
+import { Search, Plus, MessageSquare, ChevronDown } from 'lucide-react';
+import { createStyles } from 'antd-style';
+import type { Conversation } from '../types';
+import { lobeChatColors, lobeChatSpacing } from '../styles/lobeChatTheme';
+
+const useStyles = createStyles(({ css }) => ({
+ sidebar: css`
+ width: 320px;
+ height: 100vh;
+ background: ${lobeChatColors.sidebar.background};
+ border-right: 1px solid ${lobeChatColors.sidebar.border};
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ `,
+
+ header: css`
+ padding: ${lobeChatSpacing.lg}px;
+ border-bottom: 1px solid ${lobeChatColors.sidebar.border};
+ `,
+
+ logo: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ margin-bottom: ${lobeChatSpacing.lg}px;
+ `,
+
+ logoIcon: css`
+ width: 32px;
+ height: 32px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 20px;
+ `,
+
+ logoText: css`
+ font-size: 18px;
+ font-weight: 600;
+ color: white;
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ `,
+
+ actions: css`
+ display: flex;
+ gap: ${lobeChatSpacing.sm}px;
+ `,
+
+ iconButton: css`
+ width: 32px;
+ height: 32px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ searchBox: css`
+ position: relative;
+ margin-bottom: ${lobeChatSpacing.md}px;
+ `,
+
+ searchInput: css`
+ width: 100%;
+ height: 36px;
+ background: ${lobeChatColors.sidebar.hover};
+ border: 1px solid transparent;
+ border-radius: 6px;
+ padding: 0 ${lobeChatSpacing.md}px 0 36px;
+ color: white;
+ font-size: 13px;
+ outline: none;
+ transition: all 0.2s;
+
+ &::placeholder {
+ color: ${lobeChatColors.icon.default};
+ }
+
+ &:focus {
+ border-color: ${lobeChatColors.input.focus};
+ background: ${lobeChatColors.input.background};
+ }
+ `,
+
+ searchIcon: css`
+ position: absolute;
+ left: ${lobeChatSpacing.md}px;
+ top: 50%;
+ transform: translateY(-50%);
+ color: ${lobeChatColors.icon.default};
+ pointer-events: none;
+ `,
+
+ searchShortcut: css`
+ position: absolute;
+ right: ${lobeChatSpacing.md}px;
+ top: 50%;
+ transform: translateY(-50%);
+ color: ${lobeChatColors.icon.default};
+ font-size: 11px;
+ pointer-events: none;
+ `,
+
+ conversationsArea: css`
+ flex: 1;
+ overflow-y: auto;
+ overflow-x: hidden;
+
+ &::-webkit-scrollbar {
+ width: 4px;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: ${lobeChatColors.sidebar.hover};
+ border-radius: 2px;
+ }
+ `,
+
+ listHeader: css`
+ padding: ${lobeChatSpacing.md}px ${lobeChatSpacing.lg}px ${lobeChatSpacing.sm}px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ `,
+
+ listTitle: css`
+ font-size: 13px;
+ font-weight: 500;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.xs}px;
+ cursor: pointer;
+ user-select: none;
+
+ &:hover {
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ conversationsList: css`
+ padding: 0 ${lobeChatSpacing.sm}px;
+ `,
+
+ conversationItem: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.md}px;
+ padding: ${lobeChatSpacing.md}px;
+ margin-bottom: ${lobeChatSpacing.xs}px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: background 0.2s;
+ position: relative;
+
+ &:hover {
+ background: ${lobeChatColors.sidebar.hover};
+ }
+
+ &.active {
+ background: ${lobeChatColors.sidebar.active};
+ }
+ `,
+
+ conversationIcon: css`
+ width: 36px;
+ height: 36px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+ flex-shrink: 0;
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
+ `,
+
+ conversationContent: css`
+ flex: 1;
+ min-width: 0;
+ `,
+
+ conversationTitle: css`
+ font-size: 14px;
+ font-weight: 500;
+ color: white;
+ margin-bottom: 2px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ `,
+
+ conversationMeta: css`
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ font-size: 12px;
+ color: ${lobeChatColors.icon.default};
+ `,
+
+ conversationTag: css`
+ background: ${lobeChatColors.tag.background};
+ padding: 2px 6px;
+ border-radius: 4px;
+ font-size: 11px;
+ color: ${lobeChatColors.tag.text};
+ `,
+
+ conversationDate: css`
+ font-size: 12px;
+ color: ${lobeChatColors.icon.default};
+ `,
+}));
+
+interface LobeChatSidebarProps {
+ conversations: Conversation[];
+ activeConversationId: string;
+ onNewChat: () => void;
+ onSelectConversation: (id: string) => void;
+}
+
+export const LobeChatSidebar: React.FC = ({
+ conversations,
+ activeConversationId,
+ onNewChat,
+ onSelectConversation,
+}) => {
+ const { styles } = useStyles();
+
+ return (
+
+
+
+
+
+
+
+ {/* Active conversation */}
+
+
π€
+
+
NexusChat
+
+ gpt-4o-mini
+
+
+
+
+ {/* Example conversations from screenshot */}
+ {[
+ { emoji: 'π»', title: 'Full-stack Developer', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π¦', title: 'Rust Programming Assi...', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'βοΈ', title: 'React Native Coding G...', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π', title: 'JS to TS Expert', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π', title: 'TailwindHelper', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π³', title: 'Healthy Recipe Recom...', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π»', title: 'GhostWriter Pro', tag: 'gpt-4o-mini', date: '08-29' },
+ { emoji: 'π', title: 'Emotional Companion', tag: 'gpt-4o-mini', date: '08-29' },
+ ].map((conv, index) => (
+
onSelectConversation(conv.title)}
+ >
+
{conv.emoji}
+
+
{conv.title}
+
+ {conv.tag}
+
+
+
{conv.date}
+
+ ))}
+
+
+
+ );
+};
+
diff --git a/client/src/components/TopicPanel.tsx b/client/src/components/TopicPanel.tsx
new file mode 100644
index 0000000..fa49793
--- /dev/null
+++ b/client/src/components/TopicPanel.tsx
@@ -0,0 +1,217 @@
+import { Star, MoreHorizontal, Search } from 'lucide-react';
+import { createStyles } from 'antd-style';
+import { lobeChatColors, lobeChatSpacing } from '../styles/lobeChatTheme';
+
+const useStyles = createStyles(({ css }) => ({
+ panel: css`
+ width: 320px;
+ height: 100vh;
+ background: ${lobeChatColors.topic.background};
+ border-left: 1px solid ${lobeChatColors.topic.border};
+ display: flex;
+ flex-direction: column;
+ flex-shrink: 0;
+ `,
+
+ header: css`
+ padding: ${lobeChatSpacing.lg}px;
+ border-bottom: 1px solid ${lobeChatColors.topic.border};
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ `,
+
+ title: css`
+ font-size: 14px;
+ font-weight: 600;
+ color: white;
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ `,
+
+ count: css`
+ font-size: 13px;
+ color: ${lobeChatColors.icon.default};
+ `,
+
+ actions: css`
+ display: flex;
+ gap: ${lobeChatSpacing.xs}px;
+ `,
+
+ iconButton: css`
+ width: 28px;
+ height: 28px;
+ background: transparent;
+ border: none;
+ border-radius: 6px;
+ color: ${lobeChatColors.icon.default};
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+
+ &:hover {
+ background: ${lobeChatColors.topic.itemHover};
+ color: ${lobeChatColors.icon.hover};
+ }
+ `,
+
+ topicsList: css`
+ flex: 1;
+ overflow-y: auto;
+ padding: ${lobeChatSpacing.sm}px;
+
+ &::-webkit-scrollbar {
+ width: 4px;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: ${lobeChatColors.topic.border};
+ border-radius: 2px;
+ }
+ `,
+
+ topicItem: css`
+ padding: ${lobeChatSpacing.md}px;
+ margin-bottom: ${lobeChatSpacing.xs}px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: background 0.2s;
+ display: flex;
+ align-items: flex-start;
+ gap: ${lobeChatSpacing.sm}px;
+
+ &:hover {
+ background: ${lobeChatColors.topic.itemHover};
+ }
+ `,
+
+ topicIcon: css`
+ color: ${lobeChatColors.icon.default};
+ flex-shrink: 0;
+ margin-top: 2px;
+ `,
+
+ topicContent: css`
+ flex: 1;
+ min-width: 0;
+ `,
+
+ topicTitle: css`
+ font-size: 13px;
+ font-weight: 500;
+ color: white;
+ margin-bottom: 4px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ `,
+
+ topicTag: css`
+ display: inline-block;
+ padding: 2px 8px;
+ background: ${lobeChatColors.tag.background};
+ border-radius: 4px;
+ font-size: 11px;
+ color: ${lobeChatColors.tag.text};
+ `,
+
+ defaultTopic: css`
+ padding: ${lobeChatSpacing.md}px;
+ margin-bottom: ${lobeChatSpacing.md}px;
+ border-radius: 8px;
+ background: ${lobeChatColors.topic.itemHover};
+ display: flex;
+ align-items: center;
+ gap: ${lobeChatSpacing.sm}px;
+ `,
+
+ defaultTopicIcon: css`
+ width: 32px;
+ height: 32px;
+ border-radius: 6px;
+ background: linear-gradient(135deg, #3b82f6, #8b5cf6);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 16px;
+ flex-shrink: 0;
+ `,
+
+ defaultTopicContent: css`
+ flex: 1;
+ `,
+
+ defaultTopicTitle: css`
+ font-size: 13px;
+ font-weight: 600;
+ color: white;
+ margin-bottom: 2px;
+ `,
+
+ defaultTopicTag: css`
+ display: inline-block;
+ padding: 2px 8px;
+ background: ${lobeChatColors.tag.background};
+ border-radius: 4px;
+ font-size: 11px;
+ color: ${lobeChatColors.tag.text};
+ `,
+}));
+
+export const TopicPanel: React.FC = () => {
+ const { styles } = useStyles();
+
+ const topics = [
+ { title: 'Health Differences in Multiple S...', tag: null },
+ { title: 'Tool Use Mechanisms in LLMs', tag: null },
+ { title: 'Tool Use Mechanism in LLMs', tag: null },
+ ];
+
+ return (
+
+
+
+ Topic List 4
+
+
+
+
+
+
+
+
+ {/* Default Topic */}
+
+
π
+
+
Default Topic
+
Temporary
+
+
+
+ {/* Topics list */}
+ {topics.map((topic, index) => (
+
+ ))}
+
+
+ );
+};
+
diff --git a/client/src/index.css b/client/src/index.css
index 8f8e7a7..d85ad21 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -5,15 +5,50 @@
}
body {
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
+ background: #000000;
+ color: #ffffff;
height: 100vh;
overflow: hidden;
}
#root {
height: 100vh;
+ width: 100vw;
overflow: hidden;
}
+/* Custom scrollbar for webkit browsers */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background: #27272a;
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #3f3f46;
+}
+
+/* Selection color */
+::selection {
+ background: rgba(139, 92, 246, 0.3);
+ color: white;
+}
+
+/* Focus outline */
+*:focus-visible {
+ outline: 2px solid #8b5cf6;
+ outline-offset: 2px;
+}
+
+
diff --git a/client/src/styles/lobeChatTheme.ts b/client/src/styles/lobeChatTheme.ts
new file mode 100644
index 0000000..fb77e66
--- /dev/null
+++ b/client/src/styles/lobeChatTheme.ts
@@ -0,0 +1,121 @@
+import { createStyles } from 'antd-style';
+
+// LobeChat exact colors from the screenshot
+export const lobeChatTheme = {
+ token: {
+ // Background colors - LobeChat dark theme
+ colorBgBase: '#000000', // Pure black
+ colorBgContainer: '#1a1a1a', // Chat items background
+ colorBgElevated: '#2a2a2a', // Elevated elements
+ colorBgLayout: '#000000', // Layout background
+ colorBgSpotlight: '#18181b', // Sidebar background
+
+ // Text colors - LobeChat style
+ colorTextBase: '#ffffff', // Pure white text
+ colorText: '#e5e5e5', // Primary text
+ colorTextSecondary: '#a1a1aa', // Secondary text
+ colorTextTertiary: '#71717a', // Tertiary text
+ colorTextQuaternary: '#52525b', // Disabled text
+
+ // Border colors
+ colorBorder: '#27272a', // Subtle borders
+ colorBorderSecondary: '#1f1f23', // Very subtle
+
+ // Primary colors - LobeChat purple accent
+ colorPrimary: '#8b5cf6', // Purple
+ colorPrimaryHover: '#a78bfa', // Lighter purple
+ colorPrimaryActive: '#7c3aed', // Darker purple
+
+ // Functional colors
+ colorSuccess: '#10b981',
+ colorInfo: '#3b82f6',
+ colorWarning: '#f59e0b',
+ colorError: '#ef4444',
+
+ // Border radius - LobeChat uses consistent 8px
+ borderRadius: 8,
+ borderRadiusLG: 12,
+ borderRadiusSM: 6,
+ borderRadiusXS: 4,
+
+ // Spacing
+ padding: 16,
+ paddingLG: 24,
+ paddingSM: 12,
+ paddingXS: 8,
+
+ // Font
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
+ fontSize: 14,
+ fontSizeLG: 16,
+ fontSizeSM: 12,
+ },
+};
+
+// LobeChat specific color system
+export const lobeChatColors = {
+ // Sidebar
+ sidebar: {
+ background: '#18181b',
+ border: '#27272a',
+ hover: '#27272a',
+ active: '#2a2a2a',
+ },
+
+ // Chat area
+ chat: {
+ background: '#000000',
+ messageBg: '#18181b',
+ userMessageBg: '#2563eb', // Blue for user messages
+ assistantMessageBg: '#18181b',
+ },
+
+ // Topic panel
+ topic: {
+ background: '#0a0a0a',
+ itemHover: '#18181b',
+ border: '#27272a',
+ },
+
+ // Input area
+ input: {
+ background: '#18181b',
+ border: '#27272a',
+ focus: '#8b5cf6',
+ },
+
+ // Icons and badges
+ icon: {
+ default: '#71717a',
+ hover: '#a1a1aa',
+ active: '#e5e5e5',
+ },
+
+ // Models/Tags
+ tag: {
+ background: '#27272a',
+ text: '#a1a1aa',
+ },
+};
+
+// LobeChat spacing system (from screenshot)
+export const lobeChatSpacing = {
+ xs: 4,
+ sm: 8,
+ md: 12,
+ lg: 16,
+ xl: 20,
+ xxl: 24,
+ xxxl: 32,
+};
+
+// LobeChat z-index system
+export const lobeChatZIndex = {
+ base: 0,
+ sidebar: 10,
+ header: 20,
+ topicPanel: 15,
+ modal: 1000,
+ tooltip: 1100,
+};
+