diff --git a/apps/viewer/src/App.vue b/apps/viewer/src/App.vue
index 7236cf7..f606b31 100644
--- a/apps/viewer/src/App.vue
+++ b/apps/viewer/src/App.vue
@@ -1,9 +1,8 @@
@@ -63,34 +34,6 @@ onBeforeUnmount(() => {
-
@@ -166,72 +109,6 @@ body {
align-items: center;
gap: 4px;
}
-.prefs-menu {
- position: relative;
-}
-.icon-btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: var(--viewer-touch-target);
- height: var(--viewer-touch-target);
- border: none;
- border-radius: 50%;
- background: transparent;
- color: var(--viewer-text-secondary);
- cursor: pointer;
-}
-.icon-btn:hover {
- background: var(--viewer-page-bg);
-}
-.icon-btn:focus-visible {
- outline: 2px solid var(--viewer-primary);
- outline-offset: -2px;
-}
-.icon-btn svg {
- width: 22px;
- height: 22px;
-}
-.prefs-popover {
- position: absolute;
- top: calc(100% + 2px);
- right: 0;
- z-index: 130;
- min-width: 176px;
- border: 1px solid var(--viewer-divider);
- border-radius: 12px;
- background: var(--viewer-surface);
- box-shadow: 0 8px 24px rgba(23, 32, 51, 0.12);
- padding: 4px;
- display: grid;
-}
-.prefs-item {
- display: flex;
- align-items: center;
- gap: 8px;
- min-height: var(--viewer-touch-target);
- border: none;
- border-radius: 8px;
- background: transparent;
- color: var(--viewer-text);
- padding: 0 12px;
- font-size: 0.875rem;
- text-align: left;
- cursor: pointer;
-}
-.prefs-item:hover {
- background: var(--viewer-page-bg);
-}
-.prefs-item:focus-visible {
- outline: 2px solid var(--viewer-primary);
- outline-offset: -2px;
-}
-.prefs-check {
- display: inline-block;
- width: 1em;
- color: var(--viewer-primary);
- font-weight: 700;
-}
/* V01 §3.2:内容页不再有全局 16px 包围——宣传图/照片边到边,内边距由
* 信息区(AlbumHeader)与照片区(PhotoFeed,Task 3)各自负责。 */
.viewer-main {
diff --git a/apps/viewer/src/__tests__/viewer-shell.spec.ts b/apps/viewer/src/__tests__/viewer-shell.spec.ts
index 6ea2430..ca8b463 100644
--- a/apps/viewer/src/__tests__/viewer-shell.spec.ts
+++ b/apps/viewer/src/__tests__/viewer-shell.spec.ts
@@ -73,7 +73,7 @@ describe('viewer shell tokens and embed isolation (UI-02 V01)', () => {
expect(css).toContain('.viewer-shell');
});
- it('normal routes render .viewer-shell with PhotoLive brand top bar and prefs menu', async () => {
+ it('normal routes render .viewer-shell with PhotoLive brand top bar (locale only, no prefs menu)', async () => {
await router.push('/');
await router.isReady();
const app = mountApp();
@@ -86,17 +86,9 @@ describe('viewer shell tokens and embed isolation (UI-02 V01)', () => {
expect(topbar.find('.brand-name').text()).toBe('PhotoLive');
expect(topbar.find('.locale-trigger').exists()).toBe(true);
- // 「⋯」轻量菜单(§3.2):减少动画入口可发现、可切换。
- const more = topbar.find('.icon-btn');
- expect(more.attributes('aria-haspopup')).toBe('menu');
- await more.trigger('click');
- const item = app.find('.prefs-item');
- expect(item.text()).toBe('减少动画');
- const before = item.attributes('aria-checked');
- await item.trigger('click');
- expect(app.find('.prefs-item').attributes('aria-checked')).toBe(before === 'true' ? 'false' : 'true');
- // 还原模块级偏好单例,避免影响后续用例。
- await app.find('.prefs-item').trigger('click');
+ // 设置菜单已按用户要求移除(2026-09-23):顶栏仅保留语言切换。
+ expect(topbar.find('.prefs-menu').exists()).toBe(false);
+ expect(topbar.find('.icon-btn').exists()).toBe(false);
});
it('embed routes keep the bare shell: no .viewer-shell, no top bar, no outer padding wrapper', async () => {