CE-WP-0006/0007: Capture view polish, workplans, and UX refinements

- Blob URL stability, scroll centre, strip-only visual guide
- Focus-gated linking, unlink clears overlay, field badge tooltips
- Capture layout (viewer centre), grey guide lines, Add field button
- Workplans CE-WP-0006 (done) and CE-WP-0007 (T01-T09 done, T10-T12 todo)
- Integration tests and viewer-url helpers
This commit is contained in:
2026-06-08 00:37:34 +02:00
parent d25b01f6d5
commit 2fd085b65e
26 changed files with 1767 additions and 356 deletions

View File

@@ -7,6 +7,7 @@ import {
createEngine,
restoreFromStorage,
restoreSnapshot,
sanitizeDocumentForPersistence,
type Engine,
type EngineEvent,
type EngineSnapshot,
@@ -170,6 +171,31 @@ describe("restoreFromStorage", () => {
expect(dst.documents.list()).toHaveLength(1);
});
it("strips blob: URIs from persisted documents", () => {
const engine = createEngine();
const docId = "doc_blob" as DocumentId;
engine.documents.register({
document: {
id: docId,
mediaType: "application/pdf",
title: "upload.pdf",
uri: "blob:http://localhost/dead",
createdAt: "2026-06-07T00:00:00.000Z",
updatedAt: "2026-06-07T00:00:00.000Z",
},
representation: fakeDocAndRep("blob").representation,
});
const snap = captureSnapshot(engine);
expect(snap.documents[0]?.uri).toBeUndefined();
expect(sanitizeDocumentForPersistence({
id: docId,
mediaType: "application/pdf",
uri: "blob:x",
createdAt: "x",
updatedAt: "x",
}).uri).toBeUndefined();
});
it("ignores malformed JSON without throwing", () => {
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
const storage = memoryStorage();