2025-09-30 13:23:22 +09:00
|
|
|
|
'use client';
|
|
|
|
|
|
|
2025-10-14 10:34:18 +09:00
|
|
|
|
import React, { useState } from 'react';
|
2025-09-30 13:23:22 +09:00
|
|
|
|
|
|
|
|
|
|
interface DashboardToolbarProps {
|
|
|
|
|
|
onClearCanvas: () => void;
|
|
|
|
|
|
onSaveLayout: () => void;
|
2025-10-14 10:34:18 +09:00
|
|
|
|
canvasBackgroundColor: string;
|
|
|
|
|
|
onCanvasBackgroundColorChange: (color: string) => void;
|
2025-09-30 13:23:22 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 대시보드 툴바 컴포넌트
|
|
|
|
|
|
* - 전체 삭제, 레이아웃 저장 등 주요 액션 버튼
|
|
|
|
|
|
*/
|
2025-10-14 10:34:18 +09:00
|
|
|
|
export function DashboardToolbar({ onClearCanvas, onSaveLayout, canvasBackgroundColor, onCanvasBackgroundColorChange }: DashboardToolbarProps) {
|
|
|
|
|
|
const [showColorPicker, setShowColorPicker] = useState(false);
|
2025-09-30 13:23:22 +09:00
|
|
|
|
return (
|
|
|
|
|
|
<div className="absolute top-5 left-5 bg-white p-3 rounded-lg shadow-lg z-50 flex gap-3">
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={onClearCanvas}
|
|
|
|
|
|
className="
|
|
|
|
|
|
px-4 py-2 border border-gray-300 bg-white rounded-md
|
|
|
|
|
|
text-sm font-medium text-gray-700
|
|
|
|
|
|
hover:bg-gray-50 hover:border-gray-400
|
|
|
|
|
|
transition-colors duration-200
|
|
|
|
|
|
"
|
|
|
|
|
|
>
|
|
|
|
|
|
🗑️ 전체 삭제
|
|
|
|
|
|
</button>
|
|
|
|
|
|
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={onSaveLayout}
|
|
|
|
|
|
className="
|
|
|
|
|
|
px-4 py-2 border border-gray-300 bg-white rounded-md
|
|
|
|
|
|
text-sm font-medium text-gray-700
|
|
|
|
|
|
hover:bg-gray-50 hover:border-gray-400
|
|
|
|
|
|
transition-colors duration-200
|
|
|
|
|
|
"
|
|
|
|
|
|
>
|
|
|
|
|
|
💾 레이아웃 저장
|
|
|
|
|
|
</button>
|
2025-10-14 10:34:18 +09:00
|
|
|
|
|
|
|
|
|
|
{/* 캔버스 배경색 변경 버튼 */}
|
|
|
|
|
|
<div className="relative">
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={() => setShowColorPicker(!showColorPicker)}
|
|
|
|
|
|
className="
|
|
|
|
|
|
px-4 py-2 border border-gray-300 bg-white rounded-md
|
|
|
|
|
|
text-sm font-medium text-gray-700
|
|
|
|
|
|
hover:bg-gray-50 hover:border-gray-400
|
|
|
|
|
|
transition-colors duration-200
|
|
|
|
|
|
flex items-center gap-2
|
|
|
|
|
|
"
|
|
|
|
|
|
>
|
|
|
|
|
|
🎨 캔버스 색상
|
|
|
|
|
|
<div
|
|
|
|
|
|
className="w-4 h-4 rounded border border-gray-300"
|
|
|
|
|
|
style={{ backgroundColor: canvasBackgroundColor }}
|
|
|
|
|
|
/>
|
|
|
|
|
|
</button>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 색상 선택 패널 */}
|
|
|
|
|
|
{showColorPicker && (
|
|
|
|
|
|
<div className="absolute top-full left-0 mt-2 bg-white p-4 rounded-lg shadow-xl z-50 border border-gray-200 w-[280px]">
|
|
|
|
|
|
<div className="flex items-center gap-3 mb-3">
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="color"
|
|
|
|
|
|
value={canvasBackgroundColor}
|
|
|
|
|
|
onChange={(e) => onCanvasBackgroundColorChange(e.target.value)}
|
|
|
|
|
|
className="h-10 w-16 border border-gray-300 rounded cursor-pointer"
|
|
|
|
|
|
/>
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="text"
|
|
|
|
|
|
value={canvasBackgroundColor}
|
|
|
|
|
|
onChange={(e) => onCanvasBackgroundColorChange(e.target.value)}
|
|
|
|
|
|
placeholder="#ffffff"
|
|
|
|
|
|
className="flex-1 px-2 py-1 text-sm border border-gray-300 rounded"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{/* 프리셋 색상 */}
|
|
|
|
|
|
<div className="grid grid-cols-6 gap-2 mb-3">
|
|
|
|
|
|
{[
|
|
|
|
|
|
'#ffffff', '#f9fafb', '#f3f4f6', '#e5e7eb',
|
|
|
|
|
|
'#3b82f6', '#8b5cf6', '#ec4899', '#f59e0b',
|
|
|
|
|
|
'#10b981', '#06b6d4', '#6366f1', '#84cc16',
|
|
|
|
|
|
].map((color) => (
|
|
|
|
|
|
<button
|
|
|
|
|
|
key={color}
|
|
|
|
|
|
onClick={() => onCanvasBackgroundColorChange(color)}
|
|
|
|
|
|
className={`h-8 rounded border-2 ${canvasBackgroundColor === color ? 'border-blue-500 ring-2 ring-blue-200' : 'border-gray-300'}`}
|
|
|
|
|
|
style={{ backgroundColor: color }}
|
|
|
|
|
|
title={color}
|
|
|
|
|
|
/>
|
|
|
|
|
|
))}
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<button
|
|
|
|
|
|
onClick={() => setShowColorPicker(false)}
|
|
|
|
|
|
className="w-full px-3 py-1.5 text-sm text-gray-600 border border-gray-300 rounded hover:bg-gray-50"
|
|
|
|
|
|
>
|
|
|
|
|
|
닫기
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
)}
|
|
|
|
|
|
</div>
|
2025-09-30 13:23:22 +09:00
|
|
|
|
</div>
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|