From 44bca5c9def44355f94a3b2150643c4d46ed274e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B5=9C=EC=A7=80=EC=B2=A0?= Date: Mon, 15 Dec 2025 19:35:10 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=98=EC=9D=91=ED=98=95=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/pages/dashboard/ui/dashboard-page.tsx | 32 +++-- .../common/components/src/ui/header/index.tsx | 130 +++++++++++++----- 2 files changed, 113 insertions(+), 49 deletions(-) diff --git a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx index b19c0d0c6..327689474 100644 --- a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx +++ b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx @@ -110,12 +110,12 @@ function DashboardPage() { }; return ( -
+
{/* 첫번째 라인 */} -
+
{/* 첫번쨰 열 */} -
+
{/* 전국 하수처리시설 개소수 및 가동률 */} @@ -127,7 +127,7 @@ function DashboardPage() {
{/* 두번쨰 열 */} -
+
{/* 수계별 유입ㆍ방류수질 분석 */} @@ -139,14 +139,16 @@ function DashboardPage() {
{/* 지도영역 */} - +
+ +
{/* 사용자 정보 카드 */} -
+
{error &&
{error}
} {userInfo ? ( -
-
+
+
프로필 { const target = e.target as HTMLImageElement; @@ -156,15 +158,15 @@ function DashboardPage() {
{userInfo.userName || "-"}
온라인
-
+
2FA 활성화:{" "} {userInfo.twoFactorEnabled ? "예" : "아니오"}
-
- - +
+ +
) : ( @@ -172,7 +174,7 @@ function DashboardPage() { )}
-

일정 알림

+

일정 알림

@@ -180,7 +182,7 @@ function DashboardPage() {
-

내 작성글

+

내 작성글

@@ -190,7 +192,7 @@ function DashboardPage() {
{/* 두번째 라인 */} -
+
diff --git a/packages/common/components/src/ui/header/index.tsx b/packages/common/components/src/ui/header/index.tsx index 920e29316..5408cbc4e 100644 --- a/packages/common/components/src/ui/header/index.tsx +++ b/packages/common/components/src/ui/header/index.tsx @@ -30,6 +30,7 @@ const isLoggedIn = !!userId; export function Header({ viewOnly }: { viewOnly?: boolean }) { const [mounted, setMounted] = useState(false); const [logoWidth, setLogoWidth] = useState(0); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const logoRef = useRef(null); const { data: userInfo } = useQuery({ @@ -146,65 +147,126 @@ export function Header({ viewOnly }: { viewOnly?: boolean }) { }, []); return ( -
-
- -

- {mounted ? ( - logo { - if (logoRef.current) { - setLogoWidth(logoRef.current.offsetWidth); - } - }} - /> - ) : ( - - )} +
+
+
+ +

+ {mounted ? ( + logo { + if (logoRef.current) { + setLogoWidth(logoRef.current.offsetWidth); + } + }} + /> + ) : ( + + )} 0 ? `${(logoWidth - 120) / (siteInfo?.siteNm?.length || 1)}px` : '0.05em' - }} + className="text-xs sm:text-sm md:text-[1.2rem] font-semibold text-foreground" + style={{ + letterSpacing: logoWidth > 0 ? `${(logoWidth - 120) / (siteInfo?.siteNm?.length || 1)}px` : '0.05em' + }} > - {siteInfo?.siteNm} - -

+ {siteInfo?.siteNm} + +

+
+ {/* 모바일에서 오른쪽 요소들 */} +
+ {/* 모바일 메뉴 토글 버튼 */} + {mounted && ( + + )} + {mounted && isLoggedIn && ( + + + + + +
    +
  • + +
  • +
  • + 로그아웃 +
  • +
+
+
+ )} +
-
+ {/* 모바일에서 네비게이션 (토글 시 표시) */} + {isMobileMenuOpen && ( +
+ {mounted && userSiteList?.content && userSiteList.content.length > 0 && ( + + )} +
+ )} + {/* 데스크톱에서 중간 네비게이션 */} +
{mounted && userSiteList?.content && userSiteList.content.length > 0 && ( -
-
+ {/* 데스크톱에서 오른쪽 요소들 */} +
{mounted ? ( isLoggedIn && ( -