From 510eb0f4f83a427a2c67d020e031a8a67a9f6678 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Sun, 31 May 2026 18:46:57 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20UI=20(=ED=97=A4=EB=8D=94=20=EC=9E=A0?= =?UTF-8?q?=EA=B8=88=20=EC=95=84=EC=9D=B4=EC=BD=98=20+=20=EB=AA=A8?= =?UTF-8?q?=EB=8B=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- src/App.vue | 2 + src/api/authApi.js | 3 + src/components/ChangePasswordModal.vue | 174 +++++++++++++++++++++++++ src/components/layout/AppHeader.vue | 1 + src/components/ui/IconBtn.vue | 1 + src/stores/ui.js | 10 ++ 6 files changed, 191 insertions(+) create mode 100644 src/components/ChangePasswordModal.vue diff --git a/src/App.vue b/src/App.vue index f93bcb8..533575f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,6 +6,7 @@ import AppSidebar from '@/components/layout/AppSidebar.vue' import AppFooter from '@/components/layout/AppFooter.vue' import LoginModal from '@/components/LoginModal.vue' import SignupModal from '@/components/SignupModal.vue' +import ChangePasswordModal from '@/components/ChangePasswordModal.vue' import { useAuthStore } from '@/stores/auth' import { useUiStore } from '@/stores/ui' @@ -38,6 +39,7 @@ watch(() => route.fullPath, () => ui.closeSidebar()) + diff --git a/src/components/layout/AppHeader.vue b/src/components/layout/AppHeader.vue index 4b98762..2d566dc 100644 --- a/src/components/layout/AppHeader.vue +++ b/src/components/layout/AppHeader.vue @@ -38,6 +38,7 @@ async function handleLogout() {
diff --git a/src/components/ui/IconBtn.vue b/src/components/ui/IconBtn.vue index a0cfe55..8c9fdde 100644 --- a/src/components/ui/IconBtn.vue +++ b/src/components/ui/IconBtn.vue @@ -33,6 +33,7 @@ const ICONS = { cart: ['M9 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z', 'M20 22a1 1 0 1 0 0-2 1 1 0 0 0 0 2z', 'M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6'], send: ['M22 2L11 13', 'M22 2l-7 20-4-9-9-4 20-7z'], save: ['M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z', 'M17 21v-8H7v8', 'M7 3v5h8'], + lock: ['M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z', 'M8 11V7a4 4 0 0 1 8 0v4'], } const paths = computed(() => ICONS[props.icon] || ICONS.plus) diff --git a/src/stores/ui.js b/src/stores/ui.js index 50b747a..f78aa18 100644 --- a/src/stores/ui.js +++ b/src/stores/ui.js @@ -16,6 +16,15 @@ export const useUiStore = defineStore('ui', () => { sidebarOpen.value = false } + // 비밀번호 변경 모달 + const passwordOpen = ref(false) + function openPassword() { + passwordOpen.value = true + } + function closePassword() { + passwordOpen.value = false + } + // 로그인 팝업 (회원가입 팝업은 닫고 전환) function openLogin(redirect = '') { redirectPath.value = redirect || '' @@ -39,5 +48,6 @@ export const useUiStore = defineStore('ui', () => { return { loginOpen, signupOpen, redirectPath, openLogin, closeLogin, openSignup, closeSignup, sidebarOpen, toggleSidebar, closeSidebar, + passwordOpen, openPassword, closePassword, } })