-
+
+ ◈
{{ t('viewer.brand') }}
@@ -133,7 +130,7 @@ body {
display: flex;
align-items: center;
justify-content: space-between;
- height: 50px;
+ height: 52px;
padding: 0 var(--viewer-pad-info);
border-bottom: 1px solid var(--viewer-divider);
background: var(--viewer-surface);
@@ -144,15 +141,24 @@ body {
gap: 8px;
min-width: 0;
}
+/* 参考稿品牌印记:26px 主色圆 + 白 ◈ */
.brand-logo {
- width: 24px;
- height: 24px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 26px;
+ height: 26px;
flex: none;
+ border-radius: 50%;
+ background: var(--viewer-primary);
+ color: #ffffff;
+ font-size: 15px;
+ line-height: 1;
}
.brand-name {
- font-size: 1.0625rem;
- font-weight: 700;
- letter-spacing: 0.01em;
+ font-size: 1.3125rem;
+ font-weight: 750;
+ letter-spacing: -0.7px;
color: var(--viewer-text);
}
.topbar-actions {
diff --git a/apps/viewer/src/__tests__/activity.spec.ts b/apps/viewer/src/__tests__/activity.spec.ts
index 08ffa44..3e50f3a 100644
--- a/apps/viewer/src/__tests__/activity.spec.ts
+++ b/apps/viewer/src/__tests__/activity.spec.ts
@@ -93,8 +93,9 @@ describe('activity page (Task 6)', () => {
expect(wrapper.find('.empty-notice').text()).toBe('照片即将上线');
// 无 banner 资产 → 不渲染 img;viewCount 未知(null)→ 浏览项显示「—」而非 0(UI-02 §4.1)。
+ // (参考稿:浏览项前置 ◉ Unicode 图标,属渲染内容的一部分。)
expect(wrapper.find('img.banner').exists()).toBe(false);
- expect(wrapper.find('.view-count').text()).toBe('—');
+ expect(wrapper.find('.view-count').text()).toBe('◉—');
expect(document.title).toBe('2026 公司年会');
});
diff --git a/apps/viewer/src/__tests__/album-header.spec.ts b/apps/viewer/src/__tests__/album-header.spec.ts
index 39bafbe..c80907d 100644
--- a/apps/viewer/src/__tests__/album-header.spec.ts
+++ b/apps/viewer/src/__tests__/album-header.spec.ts
@@ -73,8 +73,8 @@ describe('album header info area (UI-02 V02)', () => {
expect(wrapper.find('h1.title').text()).toBe('2026 公司年会');
// pre-line:换行保留;文本插值(非 HTML 注入)。
expect(wrapper.find('.description').text()).toBe('年度盛会\n多行介绍');
- // Intl.NumberFormat 分组 + 词条拼接(§4.1)。
- expect(wrapper.find('.view-count').text()).toBe('1,286 次浏览');
+ // Intl.NumberFormat 分组 + 词条拼接(§4.1);参考稿:浏览项前置 ◉ Unicode 图标。
+ expect(wrapper.find('.view-count').text()).toBe('◉1,286 次浏览');
expect(wrapper.find('.meta').text()).toContain('大宴会厅 · 上海市浦东新区世纪大道 100 号');
// Asia/Shanghai(夹具时区):UTC 10-01 → 本地 10月1日。
expect(wrapper.find('.meta').text()).toContain('10月1日');
@@ -98,7 +98,7 @@ describe('album header info area (UI-02 V02)', () => {
expect(wrapper.find('img.banner').exists()).toBe(false);
expect(wrapper.find('.description').exists()).toBe(false);
expect(wrapper.findAll('.meta-item')).toHaveLength(2); // 浏览(—)+ 日期;地点整项省略
- expect(wrapper.find('.view-count').text()).toBe('—');
+ expect(wrapper.find('.view-count').text()).toBe('◉—');
expect(wrapper.find('.categories').exists()).toBe(false);
});
diff --git a/apps/viewer/src/__tests__/viewer-shell.spec.ts b/apps/viewer/src/__tests__/viewer-shell.spec.ts
index a451611..6ea2430 100644
--- a/apps/viewer/src/__tests__/viewer-shell.spec.ts
+++ b/apps/viewer/src/__tests__/viewer-shell.spec.ts
@@ -59,7 +59,8 @@ describe('viewer shell tokens and embed isolation (UI-02 V01)', () => {
'--viewer-like-accent': '#FF667D',
'--viewer-font-family': "system-ui, -apple-system, 'Segoe UI', 'PingFang SC', sans-serif",
'--viewer-radius-img': '4px',
- '--viewer-radius-pill': '20px',
+ '--viewer-radius-pill': '22px',
+ '--viewer-chip-bg': '#F5F7FA',
'--viewer-pad-info': '16px',
'--viewer-pad-photo': '4px',
'--viewer-touch-target': '44px',
diff --git a/apps/viewer/src/components/PhotoFeed.vue b/apps/viewer/src/components/PhotoFeed.vue
index ae22f70..f79a457 100644
--- a/apps/viewer/src/components/PhotoFeed.vue
+++ b/apps/viewer/src/components/PhotoFeed.vue
@@ -311,23 +311,26 @@ onBeforeUnmount(() => {
white-space: nowrap;
}
-/* —— 新照片提示 pill:白底蓝字蓝icon,悬浮照片区顶部 —— */
+/* —— 新照片提示 pill(参考稿):顶部 8px 居中悬浮、白底蓝字、34px 高、
+ * 22px 圆角、轻投影 0 3px 15px —— */
.new-photo-bar {
position: sticky;
- top: 10px;
+ top: 8px;
z-index: 2;
display: flex;
align-items: center;
+ justify-content: center;
gap: 6px;
width: fit-content;
+ min-height: 34px;
margin: 0 auto 12px;
border: none;
- border-radius: var(--viewer-radius-pill, 20px);
+ border-radius: var(--viewer-radius-pill, 22px);
background: var(--viewer-surface, #fff);
- box-shadow: 0 2px 10px rgba(23, 32, 51, 0.16);
+ box-shadow: 0 3px 15px rgba(23, 32, 51, 0.14);
color: var(--viewer-primary, #1a73e8);
- padding: 8px 16px;
- font-size: 0.8125rem;
+ padding: 0 17px;
+ font-size: 0.75rem;
font-weight: 600;
cursor: pointer;
}
@@ -357,6 +360,18 @@ onBeforeUnmount(() => {
background: var(--viewer-divider, #e5eaf1);
cursor: pointer;
}
+/* 参考稿:底部 40% 高度的轻渐变(transparent → rgba(0,0,0,.25)),
+ * 承托右下角白色点赞角标;不拦截指针(点击仍开大图)。 */
+.cell::after {
+ content: '';
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ height: 40%;
+ background: linear-gradient(transparent, rgba(0, 0, 0, 0.25));
+ pointer-events: none;
+}
.cell-img {
display: block;
width: 100%;
@@ -364,32 +379,36 @@ onBeforeUnmount(() => {
object-fit: cover;
}
-/* —— 点赞角标:右下角半透明暗底(明亮照片上可读),白心 + 白色计数 —— */
+/* —— 点赞角标(参考稿):右下 3px 贴边、无底色胶囊——白心 19px + 白色计数,
+ * 仅靠 text-shadow 保证明亮照片上的可读性 —— */
.cell-like {
position: absolute;
- right: 6px;
- bottom: 6px;
+ right: 3px;
+ bottom: 3px;
+ z-index: 1;
display: inline-flex;
align-items: center;
gap: 4px;
border: none;
- border-radius: var(--viewer-radius-pill, 20px);
- background: linear-gradient(to right, rgba(14, 18, 24, 0.42), rgba(14, 18, 24, 0.62));
+ background: transparent;
color: #fff;
- padding: 3px 8px;
+ padding: 2px 3px;
font-size: 0.75rem;
line-height: 1;
+ text-shadow: 0 1px 4px #222;
cursor: pointer;
}
.cell-like .heart {
- width: 16px;
- height: 16px;
+ width: 19px;
+ height: 19px;
fill: #fff;
+ filter: drop-shadow(0 1px 4px #222);
animation: heart-pop 400ms ease-out;
}
.cell-like .count {
color: #fff;
font-variant-numeric: tabular-nums;
+ text-shadow: 0 1px 4px #222;
}
@keyframes heart-pop {
0% {
@@ -459,11 +478,12 @@ onBeforeUnmount(() => {
text-align: center;
padding: 8px 0;
}
+/* 参考稿:到底提示 #96a0b0、12px、24px 16px 收底 */
.end-note {
text-align: center;
- color: var(--viewer-text-secondary, #647084);
- font-size: 0.875rem;
- padding: 12px 0;
+ color: #96a0b0;
+ font-size: 0.75rem;
+ padding: 24px 16px;
margin: 0;
}
.sentinel {
diff --git a/apps/viewer/src/components/PhotoLightbox.vue b/apps/viewer/src/components/PhotoLightbox.vue
index 8b43174..132d82d 100644
--- a/apps/viewer/src/components/PhotoLightbox.vue
+++ b/apps/viewer/src/components/PhotoLightbox.vue
@@ -602,6 +602,7 @@ onBeforeUnmount(() => {