diff --git a/src/assets/right-arrow.svg b/src/assets/right-arrow.svg
new file mode 100644
index 0000000..400f9cb
--- /dev/null
+++ b/src/assets/right-arrow.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/components/shared/ContextMenu.tsx b/src/components/shared/ContextMenu.tsx
new file mode 100644
index 0000000..fb12e44
--- /dev/null
+++ b/src/components/shared/ContextMenu.tsx
@@ -0,0 +1,116 @@
+import { Dispatch, SetStateAction, useRef, useState } from 'react'
+import RightArrow from '../../assets/right-arrow.svg'
+
+function Item({
+ name,
+ isDropdown,
+ isWarning,
+ onClick,
+ children,
+}: {
+ name: string
+ isDropdown?: boolean
+ isWarning?: boolean
+ onClick?: () => void
+ children?: React.ReactNode
+}) {
+ return (
+
+
+ {name}
+
+ {isDropdown && (
+
+

+
+ )}
+ {children}
+
+ )
+}
+
+function SubMenu({
+ name,
+ list,
+ openSubMenu,
+ setOpenSubMenu,
+}: {
+ name: string
+ list: string[]
+ openSubMenu: string | null
+ setOpenSubMenu: Dispatch>
+}) {
+ const timeoutRef = useRef(null)
+
+ const handleMouseEnter = () => {
+ if (timeoutRef.current) {
+ clearTimeout(timeoutRef.current)
+ }
+ setOpenSubMenu(name)
+ }
+
+ const handleMouseLeave = () => {
+ timeoutRef.current = setTimeout(() => {
+ setOpenSubMenu((prevOpenSubMenu: string | null) => {
+ return prevOpenSubMenu === name ? null : prevOpenSubMenu
+ })
+ }, 300)
+ }
+
+ return (
+
+
+
+ {openSubMenu === name && (
+
+ {list.map((item, index) => (
+
+ ))}
+
+ )}
+
+ )
+}
+
+export default function ContextMenu() {
+ const [openSubMenu, setOpenSubMenu] = useState(null)
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}