Download packages/client/src/components/layout/PanelLayout.tsx from E5K7/asipilot: direct link, hf CLI and curl.
- Browser
- Download file 2.3 kB
-
https://huggingface.co/spaces/E5K7/asipilot/resolve/main/packages/client/src/components/layout/PanelLayout.tsx
- Command line
-
hf download hf://spaces/E5K7/asipilot/packages/client/src/components/layout/PanelLayout.tsx
-
curl -L -o PanelLayout.tsx https://huggingface.co/spaces/E5K7/asipilot/resolve/main/packages/client/src/components/layout/PanelLayout.tsx
2.3 kB
| import { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels'; | |
| import Sidebar from './Sidebar'; | |
| import MultiFileEditor from '@/components/editor/MultiFileEditor'; | |
| import LivePreview from '@/components/preview/LivePreview'; | |
| import TerminalPanel from '@/components/terminal/TerminalPanel'; | |
| import AIChatPanel from '@/components/ai/AIChatPanel'; | |
| import { useEnvStore } from '@/stores/envStore'; | |
| interface PanelLayoutProps { | |
| layout: 'editor' | 'split' | 'preview'; | |
| } | |
| function ResizeHandle({ direction = 'vertical' }: { direction?: 'vertical' | 'horizontal' }) { | |
| return ( | |
| <PanelResizeHandle | |
| className={`group relative ${direction === 'vertical' ? 'w-1 hover:w-1.5' : 'h-1 hover:h-1.5'} bg-border/50 hover:bg-primary/30 transition-all`} | |
| > | |
| <div className={`absolute ${direction === 'vertical' ? 'inset-y-0 -left-0.5 -right-0.5' : 'inset-x-0 -top-0.5 -bottom-0.5'}`} /> | |
| </PanelResizeHandle> | |
| ); | |
| } | |
| export default function PanelLayout({ layout }: PanelLayoutProps) { | |
| const environment = useEnvStore((s) => s.environment); | |
| const renderSecondaryPanel = () => { | |
| if (environment === 'java' || environment === 'python') { | |
| return <TerminalPanel />; | |
| } | |
| return <LivePreview />; | |
| }; | |
| return ( | |
| <PanelGroup direction="horizontal" className="flex-1 min-h-0"> | |
| {/* Left: Sidebar */} | |
| <Panel defaultSize={18} minSize={10} maxSize={25} collapsible> | |
| <Sidebar /> | |
| </Panel> | |
| <ResizeHandle direction="vertical" /> | |
| {/* Center: Editor + Preview */} | |
| <Panel defaultSize={52} minSize={30} className="flex flex-col overflow-hidden"> | |
| {layout === 'editor' && <MultiFileEditor />} | |
| {layout === 'preview' && renderSecondaryPanel()} | |
| {layout === 'split' && ( | |
| <PanelGroup direction="horizontal"> | |
| <Panel defaultSize={50}> | |
| <MultiFileEditor /> | |
| </Panel> | |
| <ResizeHandle direction="vertical" /> | |
| <Panel defaultSize={50}> | |
| {renderSecondaryPanel()} | |
| </Panel> | |
| </PanelGroup> | |
| )} | |
| </Panel> | |
| <ResizeHandle direction="vertical" /> | |
| {/* Right: AI Chat */} | |
| <Panel defaultSize={30} minSize={20} maxSize={40} collapsible> | |
| <AIChatPanel /> | |
| </Panel> | |
| </PanelGroup> | |
| ); | |
| } | |