"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();
};