feat(admin,viewer,ui04): E06 management preview and v2 integration — real-component preview page, form mode fields, README

- viewer /embed-preview route: real EmbedStream with sample photography (picsum seeds), zero requests/WS (preview mode), postMessage config + simulated bursts through the real validation pipeline
- EmbedStream: preview prop (disables real WS subscription per §8.2 isolation) + exposed simulateBurst
- admin form: displayMode radio (new default), fixed 195x280 readonly, speed slider, reactions switch; v1 layout fields hidden in v2 (not silently effective)
- admin preview: v2 branch embeds the real preview iframe, white v2 handle, simulate-like tool button with sample-data note
- README-embed: v2 section (integration, hard sizing/docking, interactions/limits, artifact/version caching)
- tests: admin vitest 83 (+1 v2 placement), admin e2e 5 (v1 pinned carousel regression + full v2 chain incl. preview WYSIWYG heart and ov settings projection), viewer 244, v2 e2e 16

Note: part of the admin-side E06 changes (form/preview/utils/locales, mid-state of e2e spec) was swept into parallel commit eebf3b3 by a concurrent session's git add; this commit carries the final state of the remaining files and completes the set.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-22 18:20:50 +08:00
parent eebf3b3334
commit 3bba8d1dc5
7 changed files with 248 additions and 7 deletions
+9
View File
@@ -1,11 +1,14 @@
import { createRouter, createWebHistory } from 'vue-router';
import ActivityPage from '../pages/ActivityPage.vue';
import EmbedPage from '../pages/EmbedPage.vue';
import EmbedPreviewPage from '../pages/EmbedPreviewPage.vue';
import HomePage from '../pages/HomePage.vue';
// 单图深链复用活动页组件(Task 8 起在此路由加载目标照片并进入大图模式)。
// /embed/:slotToken(P4b Task 4):宿主 loader iframe 载入的轮播页——meta.layout
// 'embed' 使 App.vue 裸渲染(无顶栏/页脚/内边距,iframe 小视口精简布局)。
// /embed-preview(UI-04 E06):管理后台预览 iframe 目标——真实 EmbedStream +
// 内置样例数据 + postMessage 配置/模拟点赞(零请求零订阅,§8.2 隔离)。
export const router = createRouter({
history: createWebHistory(),
routes: [
@@ -13,5 +16,11 @@ export const router = createRouter({
{ path: '/a/:token', name: 'activity', component: ActivityPage },
{ path: '/a/:token/p/:photoId', name: 'activity-photo', component: ActivityPage },
{ path: '/embed/:slotToken', name: 'embed', component: EmbedPage, meta: { layout: 'embed' } },
{
path: '/embed-preview',
name: 'embed-preview',
component: EmbedPreviewPage,
meta: { layout: 'embed' },
},
],
});