From 50960d0556e0a42ac473f6e1a4489ebb9a6bb6b3 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sun, 22 Mar 2026 19:18:03 +0100 Subject: [PATCH] feat(pagespeed): render element screenshots in expandable audit items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Shows node screenshots, labels, HTML snippets, and URLs in audit detail rows — matching pagespeed.web.dev's failing elements display. --- app/sites/[id]/pagespeed/page.tsx | 89 ++++++++++++++++++------------- 1 file changed, 53 insertions(+), 36 deletions(-) diff --git a/app/sites/[id]/pagespeed/page.tsx b/app/sites/[id]/pagespeed/page.tsx index df1f307..843a396 100644 --- a/app/sites/[id]/pagespeed/page.tsx +++ b/app/sites/[id]/pagespeed/page.tsx @@ -552,43 +552,60 @@ function AuditRow({ audit }: { audit: AuditSummary }) { {audit.description && (

{audit.description}

)} - {/* Items table */} + {/* Items list */} {audit.details && Array.isArray(audit.details) && audit.details.length > 0 && ( -
- - - {audit.details.slice(0, 10).map((item: Record, idx: number) => ( - - {/* URL or label */} - - {/* Wasted bytes */} - {item.wastedBytes != null && ( - - )} - {/* Total bytes */} - {item.totalBytes != null && !item.wastedBytes && ( - - )} - {/* Wasted ms */} - {item.wastedMs != null && ( - - )} - - ))} - -
- {item.url ? ( - {item.url} - ) : item.node?.snippet ? ( - {item.node.snippet} - ) : item.label || item.groupLabel || item.statistic || ''} - - {item.wastedBytes < 1024 ? `${item.wastedBytes} B` : `${(item.wastedBytes / 1024).toFixed(1)} KiB`} - - {item.totalBytes < 1024 ? `${item.totalBytes} B` : `${(item.totalBytes / 1024).toFixed(1)} KiB`} - - {item.wastedMs < 1000 ? `${Math.round(item.wastedMs)}ms` : `${(item.wastedMs / 1000).toFixed(1)}s`} -
+
+ {audit.details.slice(0, 10).map((item: Record, idx: number) => ( +
+ {/* Element screenshot */} + {item.node?.screenshot?.data && ( + + )} + {/* Content */} +
+ {/* Label / node explanation */} + {(item.node?.nodeLabel || item.label || item.groupLabel) && ( +
+ {item.node?.nodeLabel || item.label || item.groupLabel} +
+ )} + {/* URL */} + {item.url && ( +
{item.url}
+ )} + {/* HTML snippet */} + {item.node?.snippet && ( + {item.node.snippet} + )} + {/* Statistic-type items */} + {!item.url && !item.node && item.statistic && ( + {item.statistic} + )} +
+ {/* Metrics on the right */} +
+ {item.wastedBytes != null && ( +
+ {item.wastedBytes < 1024 ? `${item.wastedBytes} B` : `${(item.wastedBytes / 1024).toFixed(1)} KiB`} +
+ )} + {item.totalBytes != null && !item.wastedBytes && ( +
+ {item.totalBytes < 1024 ? `${item.totalBytes} B` : `${(item.totalBytes / 1024).toFixed(1)} KiB`} +
+ )} + {item.wastedMs != null && ( +
+ {item.wastedMs < 1000 ? `${Math.round(item.wastedMs)}ms` : `${(item.wastedMs / 1000).toFixed(1)}s`} +
+ )} +
+
+ ))} {audit.details.length > 10 && (

+ {audit.details.length - 10} more items

)}