diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..fd66996 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.png b/public/favicon.png deleted file mode 100644 index e29071a..0000000 Binary files a/public/favicon.png and /dev/null differ diff --git a/src/app/globals.css b/src/app/globals.css index 98b12c8..ac6b730 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -40,6 +40,9 @@ body { .Border-column { @apply border-r border-[#EEEEEE] dark:border-[#262626]; } +.Border-bottom { + @apply border-b border-[#D9D9D9] dark:border-[#707070]; +} .BG-addPhoto { @apply bg-[#F5F5F5] dark:bg-[#2E2E2E]; } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 34d7e4c..7c46216 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -9,7 +9,7 @@ export const metadata: Metadata = { title: 'Coplan', description: 'Generated by create next app', icons: { - icon: '/favicon.png', + icon: '/favicon.ico', }, } diff --git a/src/app/shared/components/common/Dropdown/Dropdown.tsx b/src/app/shared/components/common/Dropdown/Dropdown.tsx new file mode 100644 index 0000000..5dbd836 --- /dev/null +++ b/src/app/shared/components/common/Dropdown/Dropdown.tsx @@ -0,0 +1,59 @@ +'use client' + +import { cn } from '@lib/cn' // 클래스 이름 병합 유틸리티 +import { ReactNode, useEffect, useRef, useState } from 'react' + +type DropdownProps = { + trigger: ReactNode + children: ReactNode + align?: 'left' | 'right' | 'center' + width?: string +} + +export default function Dropdown({ + trigger, + children, + align = 'center', + width = 'w-40', +}: DropdownProps) { + const [isOpen, setIsOpen] = useState(false) + const ref = useRef(null) + + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if (ref.current && !ref.current.contains(e.target as Node)) { + setIsOpen(false) + } + } + + document.addEventListener('mousedown', handleClickOutside) + return () => document.removeEventListener('mousedown', handleClickOutside) + }, []) + + return ( +
+
setIsOpen((prev) => !prev)} + className="cursor-pointer" + > + {trigger} +
+ + {isOpen && ( +
+ {children} +
+ )} +
+ ) +} diff --git a/src/app/shared/components/common/Profile.tsx b/src/app/shared/components/common/Profile.tsx index f4e6d29..ece3024 100644 --- a/src/app/shared/components/common/Profile.tsx +++ b/src/app/shared/components/common/Profile.tsx @@ -58,7 +58,7 @@ export function Profile({ nickname, imageUrl, size = 36 }: ProfileProps) { className="size-full object-cover" /> - 사용자 + {nickname} ) : ( // 프로필 이미지가 없을 때 diff --git a/src/app/shared/components/common/header/Header.tsx b/src/app/shared/components/common/header/Header.tsx index 691a166..c7ebc89 100644 --- a/src/app/shared/components/common/header/Header.tsx +++ b/src/app/shared/components/common/header/Header.tsx @@ -1,20 +1,18 @@ 'use client' -import { usePathname, useRouter } from 'next/navigation' import { cn } from '@lib/cn' // 클래스 이름 병합 유틸리티 -import Link from 'next/link' import Image from 'next/image' -import { Profile } from '@components/common/Profile' +import Link from 'next/link' +import { usePathname } from 'next/navigation' + +import ThemeToggle from '../../ThemeToggle' +import UserDropdown from './UserDropdown' export default function Header() { const pathname = usePathname() - const router = useRouter() - const goToMypage = () => { - router.push('/mypage') - } return ( -
+
{/* 좌측 대시보드명 */}
대시보드 명
@@ -25,52 +23,48 @@ export default function Header() { {/* 우측 사용자 정보/다크모드 */}
- <> - - {/* 공동작업자 프로필 이미지 */} -
- 초대된 사용자 -
- |{/* 내 프로필 이미지 */} - + + {/* 공동작업자 프로필 이미지 */} +
+ 초대된 사용자 +
+ | +
{/* 드롭다운 메뉴 */} - - - + + {/* 다크모드 토글 버튼 */} + +
) diff --git a/src/app/shared/components/common/header/UserDropdown.tsx b/src/app/shared/components/common/header/UserDropdown.tsx new file mode 100644 index 0000000..361be56 --- /dev/null +++ b/src/app/shared/components/common/header/UserDropdown.tsx @@ -0,0 +1,42 @@ +'use client' + +import Dropdown from '@components/common/Dropdown/Dropdown' +import { Profile } from '@components/common/Profile' +import { useRouter } from 'next/navigation' + +export default function UserDropdown() { + const router = useRouter() + + const goToMypage = () => { + router.push('/mypage') + } + + const handleLogout = () => { + console.log('로그아웃 처리') + } + + return ( + + + + } + width="w-80" + align="right" + > + + + + ) +}