fix: render PDF previews in framed viewer #1839

Merged
hongming merged 1 commits from fix/pdf-preview-visible into main 2026-05-25 08:14:20 +00:00
2 changed files with 14 additions and 13 deletions
@@ -145,15 +145,13 @@ export function AttachmentPDF({ workspaceId, attachment, onDownload, tone }: Pro
onClose={() => setOpen(false)}
ariaLabel={`Preview of ${attachment.name}`}
>
<embed
src={state.blobUrl}
type="application/pdf"
// The lightbox's content slot caps at 95vw / 90vh, so size
// 100% within that and let the user scroll inside the PDF
// viewer.
style={{ width: "95vw", height: "90vh" }}
aria-label={attachment.name}
/>
<div className="h-[90vh] w-[95vw] overflow-hidden rounded-lg border border-white/20 bg-white shadow-2xl">
<iframe
src={`${state.blobUrl}#view=FitH`}
title={attachment.name}
className="h-full w-full bg-white"
/>
</div>
</AttachmentLightbox>
</>
);
@@ -13,7 +13,7 @@
* Covers:
* - Renders loading skeleton with PdfGlyph + filename text
* - Renders preview button with PDF glyph, filename, and "PDF" label
* - Opens lightbox with <embed> on button click
* - Opens lightbox with a framed <iframe> viewer on button click
* - Lightbox closes on Escape
* - tone=user applies blue/accent classes on button
* - tone=agent applies neutral border on button
@@ -136,7 +136,7 @@ describe("AttachmentPDF — ready", () => {
expect(btn?.textContent).toContain("PDF");
});
it("opens lightbox with <embed> on button click", async () => {
it("opens lightbox with a framed iframe viewer on button click", async () => {
mockFetchOk("data");
const att = makeAttachment("report.pdf");
render(
@@ -158,8 +158,11 @@ describe("AttachmentPDF — ready", () => {
});
const dialog = document.querySelector('[role="dialog"]');
expect(dialog?.getAttribute("aria-label")).toContain("report.pdf");
// Lightbox contains an <embed>
expect(dialog?.querySelector("embed")).toBeTruthy();
const frame = dialog?.querySelector("iframe") as HTMLIFrameElement | null;
expect(frame).toBeTruthy();
expect(frame?.getAttribute("title")).toBe("report.pdf");
expect(frame?.className).toContain("bg-white");
expect(dialog?.querySelector("embed")).toBeNull();
});
it("closes lightbox on Escape key", async () => {