From a729777cb8cb162c4e60b53f3f11738b0fbec197 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 31 Dec 2025 10:33:16 +0330 Subject: [PATCH] add layer panel --- src/pages/editor/Editor.tsx | 12 +- src/pages/editor/components/LayersPanel.tsx | 140 ++++++++++++++++++++ 2 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 src/pages/editor/components/LayersPanel.tsx diff --git a/src/pages/editor/Editor.tsx b/src/pages/editor/Editor.tsx index 6246a5c..987fc41 100644 --- a/src/pages/editor/Editor.tsx +++ b/src/pages/editor/Editor.tsx @@ -1,10 +1,18 @@ -import { type FC } from 'react' +import { type FC, useState } from 'react' +import { clx } from '@/helpers/utils' import EditorSidebar from './components/EditorSidebar' import EditorCanvas from './components/EditorCanvas' +import LayersPanel from './components/LayersPanel' const Editor: FC = () => { + const [isLayersPanelOpen, setIsLayersPanelOpen] = useState(false) + return ( -
+
+
diff --git a/src/pages/editor/components/LayersPanel.tsx b/src/pages/editor/components/LayersPanel.tsx new file mode 100644 index 0000000..9ef52d2 --- /dev/null +++ b/src/pages/editor/components/LayersPanel.tsx @@ -0,0 +1,140 @@ +import { DocumentText, Layer, Eye, EyeSlash, Lock1, Lock, Trash, ArrowRight2, Text, Shapes } from 'iconsax-react' +import { useEditorStore } from '../store/editorStore' +import { clx } from '@/helpers/utils' + +type LayersPanelProps = { + isOpen: boolean + setIsOpen: (isOpen: boolean) => void +} + +const LayersPanel = ({ isOpen, setIsOpen }: LayersPanelProps) => { + const { objects, selectedObjectId, setSelectedObjectId, deleteObject } = useEditorStore() + + const getLayerIcon = (type: string) => { + switch (type) { + case 'text': + return + case 'rectangle': + case 'image': + case 'grid': + return + default: + return + } + } + + const getLayerLabel = (type: string) => { + switch (type) { + case 'text': + return 'متن' + case 'rectangle': + case 'image': + case 'grid': + return 'اشکال هندسی' + default: + return 'لایه' + } + } + + if (!isOpen) { + return ( +
+
+ + +
+
+ ) + } + + return ( +
+
+
+
+ +

لایه ها

+
+
+ +
+
+ {objects.length === 0 ? ( +
+ لایه‌ای وجود ندارد +
+ ) : ( + objects.map((obj) => { + const isSelected = selectedObjectId === obj.id + return ( +
setSelectedObjectId(obj.id)} + className={clx( + 'flex items-center gap-3 p-3 rounded-lg cursor-pointer transition-colors', + isSelected ? 'bg-blue-50 border border-blue-200' : 'bg-gray-50 hover:bg-gray-100' + )} + > +
+ {getLayerIcon(obj.type)} +
+
+ {getLayerLabel(obj.type)} +
+
+ + + +
+
+ ) + }) + )} +
+
+
+
+ ) +} + +export default LayersPanel +