feat(viewer,ui04): E05 realtime hearts + effect-demo alignment (initial offset, heart params, decode gate, bidirectional manual scroll)

- reactions.ts pure fns: delta->hearts sampling, burstId dedupe (TTL/capacity), pending-visible cache (5s/50), 250ms emission throttle with merge
- useEmbedReactions: read-only RealtimeClient subscription on album.publicToken (no viewer-page side effects, A15), rebind teardown, 10s grace disconnect, no fake bubbles on WS failure
- ReactionLayer: demo-frozen heart effect (12/16/20 sizes, two colors, 110px rise, 1.6s ease-out, 300ms stagger, max 8, drop-shadow) in unscoped block (created elements lack scoped hash)
- demo alignment: initial offset 32px, decode+500ms startup gate, 1:1 drag, arrows +-40, focus-tip, bidirectional manual scroll (manualScroll), loader handle 100x44 exact styles, <=599px offset default 12
- tests: +8 reactions unit (244 viewer), e2e E05: real cross-context like -> heart on correct photo (EMB-A09), zero likes/visits submission (EMB-A15), 16s hearts recording

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-22 17:38:02 +08:00
parent f6ff1d44f2
commit 91c85e196a
15 changed files with 667 additions and 120 deletions
+1
View File
@@ -38,6 +38,7 @@ export default {
collapseWindow: 'Collapse photo window',
streamPaused: 'Photo scrolling paused',
streamResumed: 'Photo scrolling resumed',
streamKeyHint: 'Space pause · ↑↓ scroll · Esc collapse',
},
download: {
action: 'Download photo',
+1
View File
@@ -39,6 +39,7 @@ export default {
collapseWindow: '收起照片窗',
streamPaused: '照片滚动已暂停',
streamResumed: '照片滚动继续',
streamKeyHint: '空格 暂停 · ↑↓ 滚动 · Esc 收起',
},
download: {
action: '下载图片',