diff --git a/src/components/shared/ImageLightbox.tsx b/src/components/shared/ImageLightbox.tsx
index d82ecf0..fc9bbff 100644
--- a/src/components/shared/ImageLightbox.tsx
+++ b/src/components/shared/ImageLightbox.tsx
@@ -60,12 +60,12 @@ export function ImageLightbox({ images, index, onClose, onNavigate }: ImageLight
)}
- {/* Image */}
+ {/* Image — click to close (same gesture as clicking the backdrop) */}

e.stopPropagation()}
+ className="max-w-[90vw] max-h-[90vh] object-contain select-none cursor-zoom-out"
+ onClick={onClose}
draggable={false}
/>
diff --git a/src/index.css b/src/index.css
index 9b7a94a..7adefc0 100644
--- a/src/index.css
+++ b/src/index.css
@@ -104,7 +104,10 @@ html.font-readable body {
.prose-article a { color: var(--color-accent); text-decoration: underline; text-underline-offset: 3px; }
.prose-article hr { border: none; border-top: 1px solid var(--color-border); margin: 2em 0; }
.prose-article strong { color: var(--color-text); font-weight: 600; }
-.prose-article img { max-width: 100%; border-radius: 2px; margin: 1em 0; }
+/* WebKitGTK scroll-lock workaround: body
![]()
sometimes collapses to 0 height on re-decode,
+ shrinking scrollHeight and clamping the scroll. A fixed aspect-ratio reserves a layout box
+ that survives the collapse. object-fit: contain preserves the image's own ratio inside it. */
+.prose-article img { display: block; width: 100%; max-width: 100%; aspect-ratio: 16 / 9; object-fit: contain; background: var(--color-bg-raised); border-radius: 2px; margin: 1em 0; cursor: zoom-in; }
/* View transition fade-in */
@keyframes fade-in {