{isImage(media.mime_type) ? (
- // eslint-disable-next-line @next/next/no-img-element
-

) : (
diff --git a/src/features/media/components/MediaImage.client.js b/src/features/media/components/MediaImage.client.js
new file mode 100644
index 0000000..e98c784
--- /dev/null
+++ b/src/features/media/components/MediaImage.client.js
@@ -0,0 +1,64 @@
+'use client';
+
+/**
+ * Affiche un média image en optimisant via next/image quand c'est sûr.
+ *
+ * - visibility === 'public' → next/image (srcset AVIF/WebP, lazy, cache CDN).
+ * - sinon →
![]()
natif. Les médias privés ne doivent JAMAIS passer par
+ * /_next/image : l'optimiseur cache la réponse par URL et la servirait
+ * ensuite à n'importe quel visiteur, contournant la vérification de session
+ * faite par /zen/api/media/file/:slug.
+ */
+
+import NextImage from 'next/image';
+
+export default function MediaImage({
+ media,
+ alt,
+ width,
+ height,
+ className,
+ sizes,
+ fill = false,
+ priority = false,
+}) {
+ const url = `/zen/api/media/file/${media.slug}`;
+ const altText = alt ?? media.alt_text ?? media.original_name ?? '';
+
+ if (media.visibility !== 'public') {
+ // eslint-disable-next-line @next/next/no-img-element
+ return (
+

+ );
+ }
+
+ if (fill) {
+ return (
+
+ );
+ }
+
+ return (
+
+ );
+}
diff --git a/src/features/media/pages/MediaPage.client.js b/src/features/media/pages/MediaPage.client.js
index 84ffb9a..b4856a5 100644
--- a/src/features/media/pages/MediaPage.client.js
+++ b/src/features/media/pages/MediaPage.client.js
@@ -16,6 +16,7 @@ import { CloudUploadIcon, Delete02Icon, Copy01Icon } from '@zen/core/shared/icon
import AdminHeader from '../../admin/components/AdminHeader.js';
import MediaGrid from '../components/MediaGrid.client.js';
import MediaFilters from '../components/MediaFilters.client.js';
+import MediaImage from '../components/MediaImage.client.js';
const MEDIA_API = '/zen/api/media';
@@ -121,8 +122,13 @@ function MediaDetails({ media, onClose, onUpdated, onDeleted, canDelete, canEdit
{isImage ? (
- // eslint-disable-next-line @next/next/no-img-element
-

+
) : (
{media.mime_type}