feat: pipeline templates, analytics opt-out, 83 conversion presets, positioning + e2e modernization

Lands five integrated branches: pipeline templates (#355), analytics opt-out (#354), 83 conversion presets bringing the catalog to 240 tools (#356), self-hosted positioning (#353), and e2e modernization (#351).

Integration fixes: aligned stale web analytics tests with the opt-out/allow-list model, closed 3 CodeQL incomplete-sanitization alerts in the i18n generator, resolved settings/index/docs/format-matrix conflicts, and corrected tool counts to 240.
This commit is contained in:
SnapOtter
2026-06-28 18:57:53 +08:00
committed by GitHub
parent 88af8d46fb
commit 63a03d26f2
421 changed files with 17308 additions and 2540 deletions
+6 -3
View File
@@ -38,15 +38,18 @@ test.describe("All tool pages render", () => {
if (NO_DROPZONE_MODES.has(displayMode)) {
// Custom-input tools (meme-generator, qr-generate, collage, html-to-image,
// pdf-to-image) render their own input UI; just require the settings panel.
// pdf-to-image) render their own input UI immediately, so the settings
// panel is present before any upload.
await expect(page.locator(".settings-container").first()).toBeVisible();
return;
}
// Standard dropzone tools
// Standard dropzone tools: before a file is loaded the page renders the
// full-width dropzone (tool-page.tsx renders the dropzone-only layout when
// !hasFile). The settings panel appears only after upload, which the
// per-tool gui-tools-*.spec.ts suites cover. Here, assert the dropzone.
await expect(page.getByText("Upload from computer")).toBeVisible();
await expect(page.getByText("Files").first()).toBeVisible();
await expect(page.locator(".settings-container").first()).toBeVisible();
});
}
});