diff --git a/.claude/skills/vue3/SKILL.md b/.claude/skills/vue3/SKILL.md index 71cbdb9..f21bf64 100644 --- a/.claude/skills/vue3/SKILL.md +++ b/.claude/skills/vue3/SKILL.md @@ -81,7 +81,7 @@ description: Vue 3 프론트엔드(frontend/) 개발 규칙 — Composition API > 두 포트 모두 `vite.config.ts` 가 **루트 `.env.{mode}` 에서 직접 읽는다** — 프론트 쪽에 포트를 중복 작성하지 않는다. > **확장 시 따르는 규칙:** -> - **새 사내 모듈**(캘린더·파일·ERP 등): `app-modules.ts` 에 항목을 활성화하고, 라우트 + `AppShell` 안의 모듈 패널을 메일 모듈처럼 만든다. 셸을 새로 만들지 않는다. +> - **새 사내 모듈**(캘린더·파일 등): `app-modules.ts` 에 항목을 활성화하고, 라우트 + `AppShell` 안의 모듈 패널을 메일 모듈처럼 만든다. 셸을 새로 만들지 않는다. > - **새 화면**: 구현 전에 디자인 캔버스로 먼저 확인받고, 확정본을 `docs/design/` 에 둔 뒤 그 기준으로 만든다. 뱃지(안 읽음 점·개수 알약·태그)는 쓰지 않는다. > - **공통 컴포넌트**: `BaseButton` 패턴을 따라 `src/components/` 에 추가 diff --git a/docs/design/webmail/README.md b/docs/design/webmail/README.md index 4ffb152..ba61c07 100644 --- a/docs/design/webmail/README.md +++ b/docs/design/webmail/README.md @@ -29,7 +29,8 @@ ## 디자인 원칙 (사용자 확정) - 안 읽음 점·개수 알약·코드 태그 같은 **뱃지를 쓰지 않는다** — 굵은 글자와 평범한 숫자로 구분한다. -- 왼쪽 **전역 앱 레일**(메일·캘린더·파일·ERP·주소록·설정)에 모듈을 계속 붙인다. 지금은 메일만 동작한다. +- 왼쪽 **전역 앱 레일**(메일·캘린더·파일·주소록·설정)에 모듈을 계속 붙인다. 지금은 메일 · 주소록 · 설정이 동작하고 캘린더 · 파일은 "준비 중"이다. + ERP 는 2026-11-04 사용자 요청으로 레일과 로그인 소개 글에서 뺐다 — 그 전에 그린 캔버스(`*.dc.html`)에는 남아 있다. - 정보 밀도가 높은 데스크톱 화면 — 기본 13px. 목록에 본문 미리보기를 넣지 않는다. - 분할 보기 행: 2줄(보낸 사람·시간 / 제목+첨부 클립), 약 50px - 목록 보기 행: 1줄 표, 38px. 칸 = 별 32 · 보낸 사람 168 · 제목(나머지) · 날짜 84 · 크기 64 (px, 칸 사이 12). diff --git a/frontend/src/components/shell/AppRail.spec.ts b/frontend/src/components/shell/AppRail.spec.ts index 0474762..f57e6ba 100644 --- a/frontend/src/components/shell/AppRail.spec.ts +++ b/frontend/src/components/shell/AppRail.spec.ts @@ -13,11 +13,13 @@ describe('AppRail', () => { return mount(AppRail, { props: { activeModule: 'mail' }, global: { plugins: [router] } }) } - it('모듈 목록 하나로 그린다 — 메일 · 캘린더 · 파일 · ERP · 주소록 · 설정', async () => { + it('모듈 목록 하나로 그린다 — 메일 · 캘린더 · 파일 · 주소록 · 설정', async () => { const wrapper = await mountRail() const labels = wrapper.findAll('.rail-item').map((item) => item.text().replace('(준비 중)', '').trim()) expect(labels).toEqual(APP_MODULES.map((module) => module.label)) + // 실제 목록도 그대로 본다 — ERP 칸은 2026-11-04 사용자 요청으로 뺐다(다시 넣으면 이 목록도 함께 고친다) + expect(labels).toEqual(['메일', '캘린더', '파일', '주소록', '설정']) }) it('메일 · 주소록(8단계) · 설정이 링크이고, 지금 모듈이 현재로 표시된다', async () => { diff --git a/frontend/src/pages/LoginPage.vue b/frontend/src/pages/LoginPage.vue index b25e02a..b78ff78 100644 --- a/frontend/src/pages/LoginPage.vue +++ b/frontend/src/pages/LoginPage.vue @@ -376,7 +376,7 @@ void supportContactStore.ensureLoaded() 사내 업무를
한 계정으로

- 메일부터 시작해 캘린더, 파일 저장소, ERP까지 같은 계정으로 이어집니다. + 메일부터 시작해 캘린더와 파일 저장소까지 같은 계정으로 이어집니다.

diff --git a/frontend/src/shared/constants/app-modules.ts b/frontend/src/shared/constants/app-modules.ts index c392074..8ed6e15 100644 --- a/frontend/src/shared/constants/app-modules.ts +++ b/frontend/src/shared/constants/app-modules.ts @@ -7,7 +7,7 @@ import type { IconName } from '@/shared/constants/icons' -export type AppModuleId = 'mail' | 'calendar' | 'files' | 'erp' | 'contacts' | 'settings' +export type AppModuleId = 'mail' | 'calendar' | 'files' | 'contacts' | 'settings' export interface AppModule { id: AppModuleId @@ -24,7 +24,6 @@ export const APP_MODULES: readonly AppModule[] = [ { id: 'mail', label: '메일', icon: 'mail', routeName: 'mail', placement: 'main' }, { id: 'calendar', label: '캘린더', icon: 'calendar', routeName: null, placement: 'main' }, { id: 'files', label: '파일', icon: 'folder', routeName: null, placement: 'main' }, - { id: 'erp', label: 'ERP', icon: 'briefcase', routeName: null, placement: 'main' }, // 8단계 — 주소록 (첫 화면은 전체 연락처, constants/contacts.ts 의 CONTACTS_ROUTES.all) { id: 'contacts', label: '주소록', icon: 'users', routeName: 'contacts', placement: 'main' }, { id: 'settings', label: '설정', icon: 'settings', routeName: 'settings', placement: 'end' },