527 lines
11 KiB
Markdown
527 lines
11 KiB
Markdown
# 🎨 Arquitectura MCP - Nexus AI
|
|
|
|
## Basado en ChatGPT UI Kit (Figma) + Lobe UI
|
|
|
|
**Referencia Figma**: https://www.figma.com/design/e0F6ZXsMuseZpKbc6IU3jR/ChatGPT-UI-Kit--AI-Chat--Community-?node-id=676-342
|
|
|
|
---
|
|
|
|
## 📐 Estructura MCP (Model-Context-Pattern)
|
|
|
|
### Model (Datos y Lógica)
|
|
- **`useChat.ts`** - Hook principal con lógica de negocio
|
|
- Gestión de mensajes
|
|
- Estado de conversaciones
|
|
- Socket.IO communication
|
|
- State management
|
|
|
|
### Context (Tema y Configuración)
|
|
- **`theme.ts`** - Tokens de diseño basados en Figma
|
|
- Colores ChatGPT UI Kit
|
|
- Gradientes Lobe UI
|
|
- Espaciado sistema
|
|
- Z-index layers
|
|
|
|
### Pattern (Componentes y Estilos)
|
|
- **Layout Components** - Estructura visual
|
|
- **UI Components** - Elementos interactivos
|
|
- **Style Components** - CSS-in-JS con antd-style
|
|
|
|
---
|
|
|
|
## 🏗️ Arquitectura de Componentes
|
|
|
|
```
|
|
App (ThemeProvider)
|
|
├── Layout
|
|
│ ├── Sidebar
|
|
│ │ ├── Header
|
|
│ │ │ ├── CloseButton (mobile)
|
|
│ │ │ └── NewChatButton
|
|
│ │ ├── Conversations
|
|
│ │ │ ├── SectionTitle
|
|
│ │ │ └── ConversationItem[]
|
|
│ │ └── Footer
|
|
│ │ └── UserProfile
|
|
│ │
|
|
│ └── MainContent
|
|
│ ├── ChatHeader (mobile)
|
|
│ │ ├── MenuButton
|
|
│ │ ├── Title
|
|
│ │ └── Actions
|
|
│ │
|
|
│ └── ChatArea
|
|
│ ├── MessagesContainer
|
|
│ │ ├── WelcomeScreen
|
|
│ │ └── ChatMessage[]
|
|
│ │ ├── Avatar
|
|
│ │ └── Content
|
|
│ │
|
|
│ └── InputArea
|
|
│ └── ChatInput
|
|
│ ├── AttachButton
|
|
│ ├── Textarea
|
|
│ └── SendButton
|
|
│
|
|
└── Overlay (mobile)
|
|
```
|
|
|
|
---
|
|
|
|
## 🎨 Sistema de Diseño
|
|
|
|
### Colores Base (Figma ChatGPT UI Kit)
|
|
|
|
```typescript
|
|
// Backgrounds
|
|
colorBgBase: '#0a0a0a' // Dark base
|
|
colorBgContainer: '#171717' // Container
|
|
colorBgElevated: '#202020' // Elevated
|
|
|
|
// Text
|
|
colorTextBase: '#ececf1' // Primary text
|
|
colorTextSecondary: '#c5c5d2' // Secondary
|
|
colorTextTertiary: '#8e8ea0' // Tertiary
|
|
|
|
// Borders
|
|
colorBorder: 'rgba(255, 255, 255, 0.06)'
|
|
```
|
|
|
|
### Gradientes (Lobe UI Style)
|
|
|
|
```typescript
|
|
// Primary - Purple
|
|
linear-gradient(135deg, #667eea 0%, #764ba2 100%)
|
|
|
|
// Accent - Cyan
|
|
linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)
|
|
|
|
// Success - Green
|
|
linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)
|
|
```
|
|
|
|
### Glassmorphism
|
|
|
|
```css
|
|
background: rgba(17, 17, 17, 0.7);
|
|
backdrop-filter: blur(20px);
|
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
```
|
|
|
|
---
|
|
|
|
## 📁 Estructura de Archivos
|
|
|
|
```
|
|
client/src/
|
|
├── App.tsx # App principal con layout MCP
|
|
├── App.css # Estilos globales mínimos
|
|
│
|
|
├── components/ # Componentes UI
|
|
│ ├── SidebarNew.tsx # ✨ Sidebar rediseñado
|
|
│ ├── ChatHeader.tsx # ✨ Header mobile
|
|
│ ├── ChatContainer.tsx # Container de chat
|
|
│ ├── ChatMessage.tsx # Mensaje individual
|
|
│ ├── ChatInput.tsx # Input personalizado
|
|
│ └── WelcomeScreen.tsx # Pantalla bienvenida
|
|
│
|
|
├── hooks/ # Custom hooks
|
|
│ └── useChat.ts # Hook principal de chat
|
|
│
|
|
├── styles/ # ✨ Sistema de estilos
|
|
│ ├── theme.ts # Tema ChatGPT + Lobe UI
|
|
│ └── appLayout.styles.ts # Estilos de layout
|
|
│
|
|
└── types/ # TypeScript types
|
|
└── index.ts # Tipos globales
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Características Implementadas
|
|
|
|
### Layout Principal
|
|
- ✅ **Sidebar glassmorphism** - Blur 20px + transparencia
|
|
- ✅ **Layout responsive** - Desktop + Mobile
|
|
- ✅ **Overlay mobile** - Backdrop blur al abrir sidebar
|
|
- ✅ **Smooth transitions** - 0.3s ease
|
|
|
|
### Sidebar (Basado en Figma)
|
|
- ✅ **Header con botón nuevo chat** - Gradiente purple
|
|
- ✅ **Lista de conversaciones** - Con sección "Recientes"
|
|
- ✅ **User profile** - Avatar + info
|
|
- ✅ **Scroll personalizado** - 4px thin purple
|
|
- ✅ **Hover effects** - Transform translateX(4px)
|
|
- ✅ **Active state** - Purple tint + border
|
|
|
|
### Chat Header (Mobile)
|
|
- ✅ **Menu toggle** - Abre/cierra sidebar
|
|
- ✅ **Title** - Nombre de la app
|
|
- ✅ **Actions** - Settings + Profile
|
|
- ✅ **Glassmorphism** - Blur 12px
|
|
|
|
### Chat Container
|
|
- ✅ **Messages area** - Scroll infinito
|
|
- ✅ **Welcome screen** - Logo + sugerencias
|
|
- ✅ **Typing indicator** - 3 dots animados
|
|
- ✅ **Custom input** - Auto-resize + Enter send
|
|
|
|
---
|
|
|
|
## 🔧 Configuración del Tema
|
|
|
|
### ThemeProvider Setup
|
|
|
|
```tsx
|
|
import { ThemeProvider } from 'antd-style';
|
|
import { chatGPTTheme } from './styles/theme';
|
|
|
|
<ThemeProvider theme={chatGPTTheme}>
|
|
<App />
|
|
</ThemeProvider>
|
|
```
|
|
|
|
### Usando Tokens en Componentes
|
|
|
|
```tsx
|
|
import { createStyles } from 'antd-style';
|
|
|
|
const useStyles = createStyles(({ css, token }) => ({
|
|
container: css`
|
|
background: ${token.colorBgContainer};
|
|
color: ${token.colorTextBase};
|
|
border-radius: ${token.borderRadius}px;
|
|
`,
|
|
}));
|
|
```
|
|
|
|
### Usando Colores Custom (Lobe UI)
|
|
|
|
```tsx
|
|
import { lobeUIColors } from '../styles/theme';
|
|
|
|
const useStyles = createStyles(({ css }) => ({
|
|
button: css`
|
|
background: ${lobeUIColors.gradient.primary};
|
|
`,
|
|
}));
|
|
```
|
|
|
|
---
|
|
|
|
## 📱 Responsive Design
|
|
|
|
### Breakpoints
|
|
|
|
```css
|
|
/* Desktop First */
|
|
@media (max-width: 768px) {
|
|
/* Mobile styles */
|
|
}
|
|
```
|
|
|
|
### Mobile Behavior
|
|
|
|
#### Sidebar
|
|
```css
|
|
/* Desktop */
|
|
width: 260px;
|
|
position: relative;
|
|
|
|
/* Mobile */
|
|
position: fixed;
|
|
left: -260px; /* Hidden by default */
|
|
z-index: 1000;
|
|
|
|
&.open {
|
|
left: 0; /* Slide in */
|
|
}
|
|
```
|
|
|
|
#### Header
|
|
```css
|
|
/* Desktop */
|
|
display: none;
|
|
|
|
/* Mobile */
|
|
display: flex;
|
|
height: 48px;
|
|
```
|
|
|
|
---
|
|
|
|
## 🎨 Componentes Clave
|
|
|
|
### 1. Sidebar
|
|
|
|
**Props**:
|
|
```typescript
|
|
interface SidebarProps {
|
|
conversations: Conversation[];
|
|
activeConversationId: string;
|
|
onNewChat: () => void;
|
|
onSelectConversation: (id: string) => void;
|
|
onClose?: () => void; // Para mobile
|
|
}
|
|
```
|
|
|
|
**Características**:
|
|
- Header con botón gradiente
|
|
- Lista scrollable con sección titles
|
|
- User profile en footer
|
|
- Close button para mobile
|
|
|
|
### 2. ChatHeader
|
|
|
|
**Props**:
|
|
```typescript
|
|
interface ChatHeaderProps {
|
|
onMenuClick?: () => void;
|
|
onSettingsClick?: () => void;
|
|
onProfileClick?: () => void;
|
|
title?: string;
|
|
}
|
|
```
|
|
|
|
**Características**:
|
|
- Solo visible en mobile
|
|
- Menu toggle para sidebar
|
|
- Actions buttons (settings, profile)
|
|
- Glassmorphism style
|
|
|
|
### 3. ChatContainer
|
|
|
|
**Props**:
|
|
```typescript
|
|
interface ChatContainerProps {
|
|
messages: Message[];
|
|
isTyping: boolean;
|
|
onSendMessage: (content: string) => void;
|
|
}
|
|
```
|
|
|
|
**Características**:
|
|
- Messages scrollable area
|
|
- Welcome screen cuando vacío
|
|
- Typing indicator
|
|
- Custom input area
|
|
|
|
---
|
|
|
|
## 🎯 Patrón de Estado
|
|
|
|
### useChat Hook (Model)
|
|
|
|
```typescript
|
|
const {
|
|
messages, // Message[]
|
|
conversations, // Conversation[]
|
|
activeConversationId, // string
|
|
isTyping, // boolean
|
|
sendMessage, // (content: string) => void
|
|
createNewConversation, // () => void
|
|
selectConversation, // (id: string) => void
|
|
} = useChat();
|
|
```
|
|
|
|
### Flujo de Datos
|
|
|
|
```
|
|
Usuario → Acción
|
|
↓
|
|
useChat Hook
|
|
↓
|
|
Socket.IO → Backend
|
|
↓
|
|
Backend responde
|
|
↓
|
|
useChat actualiza estado
|
|
↓
|
|
Componentes re-renderizan
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Cómo Usar
|
|
|
|
### 1. Iniciar Aplicación
|
|
```bash
|
|
npm run dev:all
|
|
```
|
|
|
|
### 2. Abrir en Navegador
|
|
```
|
|
http://localhost:3001
|
|
```
|
|
|
|
### 3. Probar Features
|
|
- ✅ Click "Nuevo chat" → Crea conversación
|
|
- ✅ Escribir mensaje → Enter envía
|
|
- ✅ Ver respuesta AI → Con typing indicator
|
|
- ✅ Mobile: Menu button → Abre sidebar
|
|
- ✅ Mobile: Overlay → Cierra sidebar
|
|
|
|
---
|
|
|
|
## 🎨 Estilos Destacados
|
|
|
|
### Sidebar Container
|
|
```css
|
|
background: rgba(13, 13, 13, 0.8);
|
|
backdrop-filter: blur(20px);
|
|
border-right: 1px solid rgba(255, 255, 255, 0.06);
|
|
```
|
|
|
|
### Nuevo Chat Button
|
|
```css
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.4),
|
|
0 0 20px rgba(102, 126, 234, 0.3);
|
|
|
|
&:hover {
|
|
transform: translateY(-2px);
|
|
box-shadow:
|
|
0 8px 32px rgba(0, 0, 0, 0.5),
|
|
0 0 30px rgba(102, 126, 234, 0.5);
|
|
}
|
|
```
|
|
|
|
### Conversation Item (Active)
|
|
```css
|
|
background: rgba(102, 126, 234, 0.1);
|
|
border-color: #667eea;
|
|
color: white;
|
|
|
|
svg {
|
|
opacity: 1;
|
|
}
|
|
```
|
|
|
|
### User Profile
|
|
```css
|
|
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
background: transparent;
|
|
|
|
&:hover {
|
|
background: rgba(255, 255, 255, 0.05);
|
|
border-color: rgba(102, 126, 234, 0.4);
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Comparación
|
|
|
|
### Antes
|
|
```
|
|
App
|
|
└── Container
|
|
├── Sidebar (fijo)
|
|
└── Chat
|
|
```
|
|
|
|
### Ahora (MCP)
|
|
```
|
|
App (ThemeProvider)
|
|
├── Theme Config (chatGPTTheme)
|
|
├── Layout (appLayout.styles)
|
|
│ ├── Sidebar (glassmorphism)
|
|
│ ├── MainContent
|
|
│ │ ├── Header (mobile)
|
|
│ │ └── ChatArea
|
|
│ └── Overlay (mobile)
|
|
└── State (useChat hook)
|
|
```
|
|
|
|
**Ventajas**:
|
|
- ✅ Separación clara de responsabilidades
|
|
- ✅ Tema centralizado y reutilizable
|
|
- ✅ Estilos organizados por contexto
|
|
- ✅ Mobile-first responsive
|
|
- ✅ Más escalable y mantenible
|
|
|
|
---
|
|
|
|
## 🔮 Extensiones Futuras
|
|
|
|
### Fácil de Agregar
|
|
|
|
#### 1. Settings Panel
|
|
```tsx
|
|
<SettingsPanel
|
|
theme={theme}
|
|
onThemeChange={setTheme}
|
|
/>
|
|
```
|
|
|
|
#### 2. Search Conversations
|
|
```tsx
|
|
<SearchBar
|
|
onSearch={filterConversations}
|
|
/>
|
|
```
|
|
|
|
#### 3. Conversation Actions
|
|
```tsx
|
|
<ConversationActions
|
|
onRename={handleRename}
|
|
onDelete={handleDelete}
|
|
onArchive={handleArchive}
|
|
/>
|
|
```
|
|
|
|
#### 4. Themes Switcher
|
|
```tsx
|
|
const themes = ['dark', 'light', 'auto'];
|
|
|
|
<ThemeProvider theme={themes[selected]}>
|
|
<App />
|
|
</ThemeProvider>
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ Checklist de Implementación
|
|
|
|
### Estructura
|
|
- [x] Crear `styles/theme.ts`
|
|
- [x] Crear `styles/appLayout.styles.ts`
|
|
- [x] Crear `components/SidebarNew.tsx`
|
|
- [x] Crear `components/ChatHeader.tsx`
|
|
- [x] Actualizar `App.tsx` con layout MCP
|
|
|
|
### Estilos
|
|
- [x] Colores Figma ChatGPT UI Kit
|
|
- [x] Gradientes Lobe UI
|
|
- [x] Glassmorphism effects
|
|
- [x] Responsive mobile
|
|
- [x] Animations y transitions
|
|
|
|
### Funcionalidad
|
|
- [x] Sidebar toggle mobile
|
|
- [x] Overlay con backdrop blur
|
|
- [x] Scroll personalizado
|
|
- [x] Active states
|
|
- [x] Hover effects
|
|
|
|
---
|
|
|
|
## 📚 Referencias
|
|
|
|
- **Figma Design**: ChatGPT UI Kit (node-id=676-342)
|
|
- **Lobe UI**: https://ui.lobehub.com
|
|
- **antd-style**: https://ant-design.github.io/antd-style
|
|
- **Pattern**: MCP (Model-Context-Pattern)
|
|
|
|
---
|
|
|
|
**Fecha de implementación**: 14 de Febrero, 2026
|
|
**Arquitectura**: MCP (Model-Context-Pattern)
|
|
**Design System**: ChatGPT UI Kit + Lobe UI
|
|
**Estado**: ✅ Implementado y Funcional
|
|
**Responsive**: ✅ Desktop + Mobile
|
|
|