"use client"; /** * Layout 메타 컴포넌트 렌더러 * - config.mode에 따라 children 배치: * - columns: CSS Grid (grid-cols-{n}) * - rows: flex flex-col * - tabs: shadcn Tabs 사용 * - card: shadcn Card 사용 * - children은 props.children으로 받음 (React.ReactNode) * - config.gap으로 간격 설정 * - 디자인 모드: 점선 border + 레이아웃 모드 라벨 표시 */ import React from "react"; import { cn } from "@/lib/utils"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; interface LayoutArea { id: string; label?: string; size?: string; // "1fr", "2fr", "auto", "200px" } interface LayoutTab { id: string; label: string; } interface LayoutRendererProps { id: string; config: { mode: "columns" | "rows" | "tabs" | "card"; areas?: LayoutArea[]; tabs?: LayoutTab[]; gap?: number; title?: string; }; children?: React.ReactNode; // 자식 컴포넌트들 isDesignMode?: boolean; className?: string; } export function LayoutRenderer({ id, config, children, isDesignMode = false, className, }: LayoutRendererProps) { const { mode, areas = [], tabs = [], gap = 4, title } = config; // columns 모드: CSS Grid 가로 분할 if (mode === "columns") { const gridCols = areas.length || 2; const gridTemplateColumns = areas .map((a) => a.size || "1fr") .join(" "); return (