"use client"; import React, { useState } from "react"; import { BaseLayoutRenderer, LayoutRendererProps } from "./BaseLayoutRenderer"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { X } from "lucide-react"; export default class TabsLayoutRenderer extends BaseLayoutRenderer { render(): React.ReactElement { const { layout, isDesignMode, isSelected, onClick, className } = this.props; if (!layout.layoutConfig.tabs) { return
탭 레이아웃 설정이 없습니다.
; } return ( ); } } interface TabsLayoutComponentProps { layout: any; isDesignMode?: boolean; isSelected?: boolean; onClick?: (e: React.MouseEvent) => void; className?: string; renderer: TabsLayoutRenderer; } const TabsLayoutComponent: React.FC = ({ layout, isDesignMode, isSelected, onClick, className, renderer, }) => { const tabsConfig = layout.layoutConfig.tabs; const [activeTab, setActiveTab] = useState(tabsConfig.defaultTab || layout.zones[0]?.id || ""); const containerStyle = renderer.getLayoutContainerStyle(); // 탭 컨테이너 스타일 const tabsStyle: React.CSSProperties = { ...containerStyle, display: "flex", flexDirection: tabsConfig.position === "left" || tabsConfig.position === "right" ? "row" : "column", }; // 디자인 모드 스타일 if (isDesignMode) { tabsStyle.border = isSelected ? "2px solid #3b82f6" : "1px solid #e2e8f0"; tabsStyle.borderRadius = "8px"; } // 탭 사이즈 클래스 const sizeClass = tabsConfig.size === "sm" ? "text-sm" : tabsConfig.size === "lg" ? "text-lg" : ""; return (
{layout.zones.length === 0 ? ( /* 디자인 모드에서 존이 없을 때 안내 메시지 */ isDesignMode && (
탭 레이아웃에 존을 추가하세요
) ) : ( {/* 탭 목록 */} {layout.zones.map((zone: any) => (
{zone.name} {/* 닫기 버튼 (설정에서 허용한 경우) */} {tabsConfig.closable && isDesignMode && layout.zones.length > 1 && ( )}
))}
{/* 탭 컨텐츠 */}
{layout.zones.map((zone: any) => { const zoneChildren = renderer.getZoneChildren(zone.id); return ( {renderer.renderZone(zone, zoneChildren, { style: { height: "100%", minHeight: "100px", }, className: "tab-panel", })} ); })}
)}
); }; // React 컴포넌트로 래핑 export const TabsLayout: React.FC = (props) => { const renderer = new TabsLayoutRenderer(props); return renderer.render(); };