# VSCode Layout con DockView Una implementación completa de un sistema de layout similar a Visual Studio Code, con zonas redimensionables y capacidad de mover paneles de DockView entre diferentes áreas de la aplicación. ## 🎯 Características Principales ### ✅ **Zonas Redimensionables** - **Navbar**: Barra superior fija - **Sidebar**: Panel lateral izquierdo redimensionable - **Asidebar**: Panel lateral derecho redimensionable - **Bottom**: Panel inferior redimensionable - **Center**: Área central principal ### ✅ **Sistema de Drag & Drop** - Arrastra paneles entre cualquier zona - Indicadores visuales durante el arrastre - Soporte completo para pestañas de DockView ### ✅ **Gestión de Estado** - Persistencia automática en localStorage - Exportar/importar configuraciones de layout - Sistema de versionado para compatibilidad ### ✅ **Integración con DockView** - Cada zona puede contener múltiples paneles de DockView - Comunicación entre paneles preservada - Soporte para todos los componentes de dock existentes ## 🚀 Uso Rápido ```typescript import { VSCodeDockView } from '@/components/VSCodeLayout'; function App() { return ; } ``` ## 📁 Arquitectura del Sistema ### Componentes Principales ``` VSCodeLayout/ ├── VSCodeLayout.tsx # Layout base con zonas redimensionables ├── ZoneManager.tsx # Gestión de paneles y zonas ├── ZoneDockView.tsx # Integración DockView por zona ├── VSCodeDockView.tsx # Componente principal completo ├── LayoutPersistence.tsx # Persistencia y exportación ├── VSCodeLayout.css # Estilos del layout └── index.ts # Exportaciones ``` ### Flujo de Datos ``` VSCodeDockView (Provider) ↓ ZoneManagerContext (Estado global) ↓ VSCodeLayout (UI Layout) ↓ ZoneDockView (DockView por zona) ↓ Componentes de Dock individuales ``` ## 🎨 Personalización ### Configurar Zonas Iniciales ```typescript } sidebar={ } onLayoutChange={(layout) => console.log('Layout changed:', layout)} > ``` ### Agregar Componentes Personalizados ```typescript const customComponents = { myDock: MyCustomDockComponent, tasks: TaskDock, properties: PropertiesDock, }; ``` ### Gestión Programática de Paneles ```typescript function MyComponent() { const { movePanel, addPanel, removePanel } = useZoneManager(); const handleMovePanel = () => { movePanel('panel-id', 'sidebar', 'center'); }; const handleAddPanel = () => { addPanel('bottom', { id: 'new-panel', title: 'Nuevo Panel', component: MyPanelComponent, }); }; return ( ); } ``` ## 🔧 Configuración Avanzada ### Persistencia Personalizada ```typescript import { useLayoutPersistence } from '@/components/VSCodeLayout'; function LayoutManager() { const { saveLayout, loadLayout, clearLayout } = useLayoutPersistence(); useEffect(() => { const savedLayout = loadLayout(); if (savedLayout) { // Aplicar layout guardado applyLayout(savedLayout); } }, []); return ( ); } ``` ### Auto-guardado ```typescript import { useAutoSaveLayout } from '@/components/VSCodeLayout'; function AutoSaveExample() { const [layout, setLayout] = useState(defaultLayout); const [panels, setPanels] = useState(defaultPanels); // Auto-guardar cada 2 segundos después de cambios useAutoSaveLayout(layout, panels, 2000); return ; } ``` ## 🎮 Controles de Usuario ### Atajos de Teclado (Futuro) - `Ctrl+Shift+E`: Toggle sidebar - `Ctrl+Shift+F`: Toggle asidebar - `Ctrl+J`: Toggle bottom panel - `Ctrl+Shift+P`: Abrir panel de comandos ### Gestos del Mouse - **Arrastrar bordes**: Redimensionar zonas - **Arrastrar pestañas**: Mover paneles entre zonas - **Doble click bordes**: Auto-ajustar tamaño - **Click derecho pestañas**: Menú contextual ## 🔍 API de Zonas ### ZoneManager Context ```typescript interface ZoneManagerContextType { zones: Record; movePanel: (panelId: string, fromZone: ZoneType, toZone: ZoneType) => void; addPanel: (zone: ZoneType, panel: Panel) => void; removePanel: (zone: ZoneType, panelId: string) => void; setActivePanel: (zone: ZoneType, panelId: string) => void; toggleZone: (zone: ZoneType) => void; } ``` ### Panel Interface ```typescript interface Panel { id: string; title: string; component: React.ComponentType; props?: any; closable?: boolean; icon?: React.ReactNode; } ``` ### Zone Interface ```typescript interface Zone { id: string; name: string; panels: Panel[]; activePanel?: string; visible: boolean; } ``` ## 🎨 Temas y Estilos ### Variables CSS Disponibles ```css :root { --vscode-navbar-height: 40px; --vscode-sidebar-width: 250px; --vscode-asidebar-width: 300px; --vscode-bottom-height: 200px; --vscode-border-color: #d0d7de; --vscode-bg-primary: #ffffff; --vscode-bg-secondary: #f6f8fa; --vscode-text-primary: #24292f; --vscode-text-secondary: #656d76; --vscode-resize-handle-color: #0078d4; --vscode-resize-handle-hover: #106ebe; } ``` ### Clases CSS Personalizables ```css .vscode-layout { /* Layout principal */ } .layout-zone { /* Cualquier zona */ } .layout-zone.navbar { /* Navbar específica */ } .layout-zone.sidebar { /* Sidebar específica */ } .resize-handle { /* Manejadores de redimensión */ } .zone-content { /* Contenido de zona */ } .zone-tabs { /* Pestañas de zona */ } .drop-zone-active { /* Zona con drop activo */ } ``` ## 🚨 Troubleshooting ### Problemas Comunes 1. **Paneles no se mueven entre zonas** ```typescript // Verificar que el componente esté registrado const components = { myComponent: MyComponent, // ✅ Registrado }; ``` 2. **Layout no se guarda** ```typescript // Verificar localStorage disponible if (typeof Storage !== "undefined") { // localStorage disponible } ``` 3. **Redimensión no funciona** ```css /* Verificar que no haya CSS conflictivo */ .vscode-layout { position: relative; /* Requerido */ overflow: hidden; /* Requerido */ } ``` ### Debug Mode ```typescript // Habilitar logs de debug localStorage.setItem('vscode-layout-debug', 'true'); // En el código const debug = localStorage.getItem('vscode-layout-debug') === 'true'; if (debug) { console.log('Zone state:', zones); console.log('Layout state:', layout); } ``` ## 📊 Métricas y Performance ### Optimizaciones Implementadas - **Debounce en redimensión**: Evita re-renders excesivos - **Lazy loading**: Paneles se cargan cuando son visibles - **Memoización**: Componentes memorizados para mejor performance - **Virtual scrolling**: En listas largas de paneles ### Monitoreo de Performance ```typescript // Medir tiempo de operaciones console.time('panel-move'); movePanel('panel-1', 'sidebar', 'center'); console.timeEnd('panel-move'); // Memory usage console.log('Memory:', (performance as any).memory); ``` ## 🔮 Roadmap ### Próximas Características - [ ] Múltiples instancias de DockView por zona - [ ] Atajos de teclado configurables - [ ] Temas personalizables por zona - [ ] Animaciones de transición - [ ] Modo fullscreen para paneles - [ ] Búsqueda global de paneles - [ ] Workspaces personalizados - [ ] Integración con React Router - [ ] API REST para layouts remotos - [ ] Colaboración en tiempo real ### Mejoras Técnicas - [ ] Testing completo (Jest + RTL) - [ ] Storybook para componentes - [ ] Performance profiling - [ ] A11y compliance - [ ] Mobile responsiveness - [ ] PWA support ## 📄 Licencia Este proyecto usa la misma licencia que el proyecto principal. --- ## 🤝 Contribuir Para agregar nuevas funcionalidades al VSCode Layout: 1. **Nuevas Zonas**: Extender `ZoneType` y `ZoneManager` 2. **Nuevos Paneles**: Crear componente y registrar en `components` 3. **Nuevas Características**: Seguir la arquitectura de contexto/hooks 4. **Estilos**: Usar variables CSS para consistencia ¡El VSCode Layout está diseñado para ser extensible y modular!