diff --git a/web/components/doc-renderer-v2.tsx b/web/components/doc-renderer-v2.tsx index c31b176..54af0e2 100644 --- a/web/components/doc-renderer-v2.tsx +++ b/web/components/doc-renderer-v2.tsx @@ -141,6 +141,33 @@ function ChunkCard({ // Image chunks: render crop inline if (fm.type === "image" || fm.image_type) { + const hasValidBbox = + bbox && + typeof bbox.w === "number" && typeof bbox.h === "number" && + typeof bbox.x === "number" && typeof bbox.y === "number" && + bbox.w > 0 && bbox.h > 0; + + // No crop coordinates → don't request a broken crop (400). Render the + // image's textual description so the content is still surfaced. + if (!hasValidBbox) { + const descEn = fm.image_description_en || content_en; + const descPt = fm.image_description_pt_br || content_pt; + if (!descEn && !descPt) return null; + return ( +
+ {anchor} +
+
+ 🖼 {fm.chunk_id} · p{fm.page} + {fm.image_type ? ` · ${fm.image_type}` : ""} · descrição (sem recorte) +
+ {showEn && descEn &&

EN: {descEn}

} + {showPt && descPt &&

PT-BR: {descPt}

} +
+
+ ); + } + const cropUrl = `/api/crop?doc=${encodeURIComponent(docId)}` + `&page=${fm.page}&x=${bbox.x}&y=${bbox.y}&w=${bbox.w}&h=${bbox.h}&w_px=800`;