feat(manual): add the illustrated Web Blender HTML user manual

A single-page 28-chapter manual generated from manual.json covers the
11 workspaces, all React editors, OPFS save/reopen, explicit local
downloads, import/export routes, preferences/keymap and the capability
matrix. It reuses verified course screenshots and adds 14 fresh
Chromium captures for shell, storage, area, camera, preferences, IO and
troubleshooting chapters.

Manual-driven fixes: Save As now states OPFS-only, GLTF import is
restored, quick toolbar honors its preference, startup workspace is
applied, Properties tabs jump to sections, Outliner fallback search
filters, and the editor-header ⋮ opens the area menu. Help and the
tutorial landing link the new manual; the PDF remains as an archive.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
mes123456
2026-11-13 11:58:40 +08:00
parent aa8cc1313e
commit b932db7642
37 changed files with 1996 additions and 16 deletions

View File

@@ -63,3 +63,20 @@ test("Keymap conflict is rejected and unsupported preference rows are marked", a
await page.getByRole("button", { name: "视口", exact: true }).click();
await expect(page.locator('.preference-row[data-setting="viewport.gizmoSize"]')).toHaveAttribute("data-unsupported", "true");
});
test("Quick toolbar and startup workspace preferences take effect", async ({ page }) => {
test.setTimeout(240_000);
await page.goto("/?ui=web");
await page.locator("main.blender-app").waitFor({ timeout: 120_000 });
await expect(page.locator(".legacy-quick-toolbar")).toBeVisible();
await openPreferences(page);
await page.getByLabel("显示 Web 快捷操作栏", { exact: true }).uncheck();
await page.getByLabel("启动工作区", { exact: true }).selectOption("Animation");
await page.getByRole("button", { name: "保存偏好", exact: true }).click();
await page.getByRole("button", { name: "关闭偏好设置", exact: true }).click();
await expect(page.locator(".legacy-quick-toolbar")).toBeHidden();
await page.reload();
await page.locator("main.blender-app").waitFor({ timeout: 120_000 });
await expect.poll(async () => page.locator("main.blender-app").getAttribute("data-workspace"), { timeout: 60_000 }).toBe("Animation");
await expect(page.locator(".legacy-quick-toolbar")).toBeHidden();
});