feat(frontend): 설정 › 정보 › 업데이트 내역(목록 → 글)을 더한다

- 설정 메뉴 셋째 묶음 "정보", 목록은 게시판 표(줄 전체 링크 · [더 보기]), 글은 [← 목록으로] · 다음 글 · 이전 글 줄 · [목록]
- 글을 보는 동안에도 메뉴 항목이 고른 상태다(aria-current 는 목록 page · 글 true)
- 문서가 스크롤하는 좁은 폭에서도 글 · 목록이 맨 위부터 보이고(라우터 전역 scrollBehavior 없이), 위에 붙은 줄에 초점이 가리지 않는다
- 날짜는 달력 날짜 글이라 시간대를 거치지 않는다, /settings/info 는 목록으로 바꿔 끼운다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-10 19:37:00 +09:00
parent 1d01130c9d
commit def96e833b
24 changed files with 2719 additions and 16 deletions
+14
View File
@@ -89,4 +89,18 @@ describe('router 가드', () => {
await router.push('/login?redirect=/settings/account/two-factor')
expect(router.currentRoute.value.fullPath).toBe('/settings/account/two-factor')
})
// 업데이트 내역 (2026-11-10 — 디자인 README "업데이트 내역") — 목록 · 글 모두 탭 제목 "업데이트 내역"
it('업데이트 내역의 목록 · 글은 로그인해야 열리고, 탭 제목은 둘 다 "업데이트 내역 · ARA SYSTEM"', async () => {
installMockApi(() => ok(USER))
useAuthStore().markAuthenticated(USER)
await router.push('/settings/info/release-notes')
expect(router.currentRoute.value.name).toBe('settings-info-release-notes')
expect(document.title).toBe('업데이트 내역 · ARA SYSTEM')
await router.push('/settings/info/release-notes/2026-11-18')
expect(router.currentRoute.value.name).toBe('settings-info-release-note')
expect(document.title).toBe('업데이트 내역 · ARA SYSTEM')
})
})
+25 -1
View File
@@ -9,6 +9,7 @@ import {
MOBILE_APP_ROUTE,
MOBILE_APP_SETTINGS_TEXT,
} from '@/shared/constants/mobile-app'
import { RELEASE_NOTES_TEXT } from '@/shared/constants/release-notes'
import { SETTINGS_ROUTES } from '@/shared/constants/settings-menu'
import {
MAIL_SCHEDULED_MESSAGE_ROUTE,
@@ -112,7 +113,7 @@ export const routes: RouteRecordRaw[] = [
},
{
// 설정 — 왼쪽 메뉴(계정 › 비밀번호 · 2단계 인증 · 앱 비밀번호 · 메일 프로그램 연결 · 휴대폰 앱 · 로그인 기록 / 메일 › 서명 · 부재중 자동 응답 · 필터 · 보내기 · 읽기 ·
// 차단한 주소 · 대용량 첨부 · 알림) + 하위 화면. /settings 는 첫 메뉴(계정 › 비밀번호)로 바꿔 끼운다 (앱 레일의 "설정")
// 차단한 주소 · 대용량 첨부 · 알림 / 정보 › 업데이트 내역) + 하위 화면. /settings 는 첫 메뉴(계정 › 비밀번호)로 바꿔 끼운다 (앱 레일의 "설정")
path: '/settings',
component: () => import('@/pages/settings/SettingsLayout.vue'),
meta: { requiresAuth: true, title: '설정' },
@@ -201,6 +202,29 @@ export const routes: RouteRecordRaw[] = [
component: () => import('@/pages/settings/MailNotifyPage.vue'),
meta: { title: '메일 알림' },
},
{
// 업데이트 내역 (2026-11-10 — 디자인 README "업데이트 내역", 계약 7절) — 목록 /settings/info/release-notes · 글 /settings/info/release-notes/<글 id>.
// 둘을 화면 없는 상위 라우트로 묶었다 — 글을 보는 동안에도 메뉴의 업데이트 내역이 고른 상태다(메뉴 링크가 목록 라우트 = 빈 하위 경로라
// RouterLink 가 같은 상위의 다른 하위(글)도 고른 것으로 본다). 탭 제목은 둘 다 "업데이트 내역"
path: 'info/release-notes',
meta: { title: RELEASE_NOTES_TEXT.title },
// 주소창에 …/release-notes/.. (%2E%2E 도)를 치면 브라우저가 /settings/info/ 로 다듬는다 — 아래 'info' 가 목록으로 바꿔 끼운다
children: [
{
path: '',
name: SETTINGS_ROUTES.releaseNotes,
component: () => import('@/pages/settings/InfoReleaseNotesPage.vue'),
},
{
path: ':id',
name: SETTINGS_ROUTES.releaseNote,
component: () => import('@/pages/settings/InfoReleaseNotePage.vue'),
},
],
},
// /settings/info — 정보 묶음의 화면은 업데이트 내역 하나라 목록으로 바꿔 끼운다(글 주소의 ".." 를 브라우저가 다듬은 주소이기도 하다).
// 다른 묶음의 주소(/settings/account · /settings/mail)는 그대로다
{ path: 'info', redirect: { name: SETTINGS_ROUTES.releaseNotes } },
],
},
{