-
-
-
-
-
-
-
Site snapshot
-
- {report.analysis.analyzedUrl || report.site?.base_url || '—'}
-
-
- {report.analysis.pageTitle || 'No page title found for the analyzed page yet.'}
-
-
-
-
-
-
-
Platform
-
- {report.analysis.platform?.label || 'Unknown platform'}
-
-
-
-
Last updated
-
- {analyzedTimestamp || 'Just now'}
-
-
-
-
-
-
- {overviewStats.map((stat) => (
-
-
-
-
{stat.label}
-
- {stat.value}
-
-
{stat.helper}
-
-
-
-
-
-
- ))}
-
+
+
+
Analyzed URL
+
+ {report.analysis.analyzedUrl || report.site?.base_url || '—'}
+
+
+
Page title
+
+ {report.analysis.pageTitle || 'No title found'}
+
+
+
+
Pages with structured data
+
+ {report.analysis.crawlSummary?.pagesWithStructuredData ?? (report.analysis.schema?.hasStructuredData ? 1 : 0)}
+
+
+
+
JSON-LD blocks found
+
+ {report.analysis.schema?.jsonLd?.count || 0}
+
+
+
- {crawlPlan && (
-
-
-
Crawl summary
-
- Focused for mobile review
-
-
-
-
-
Requested
-
{crawlPlan.requestedPages || 1}
-
-
-
Plan limit
-
{crawlPlan.allowedPages || maxPagesPerCrawl}
-
-
-
Analyzed
-
{crawlPlan.actualPagesAnalyzed || 0}
-
-
-
Failed
-
{report.analysis.crawlSummary?.failedPages ?? failedPages.length}
-
-
- {report.analysis.notice &&
{report.analysis.notice}
}
-
- )}
-
- {report.analysis.crawlSummary && (
-
-
-
Pages without structured data
-
- {report.analysis.crawlSummary.pagesWithoutStructuredData ?? 0}
-
-
-
-
Discovered internal pages
-
- {report.analysis.crawlSummary.discoveredInternalPages ?? analyzedPages.length}
-
-
-
- )}
-
- {hasTargetingRules && (
-
-
Applied targeting
-
- {appliedIncludeTargets.length > 0 && (
-
-
Included
-
- {appliedIncludeTargets.map((target) => (
-
- {target}
-
- ))}
-
-
- )}
- {appliedExcludeTargets.length > 0 && (
-
-
Excluded
-
- {appliedExcludeTargets.map((target) => (
-
- {target}
-
- ))}
-
-
- )}
-
-
- )}
-
- {jsonLdTypes.length > 0 && (
-
-
Detected JSON-LD types
-
- {jsonLdTypes.map((typeName) => (
-
- {typeName}
-
- ))}
-
-
- )}
-
- {invalidJsonLdBlocks.length > 0 && (
-
-
Invalid JSON-LD detected
-
- {invalidJsonLdBlocks.map((block) => (
-
- Block {block.index + 1}: {block.message}
-
- ))}
-
-
- )}
-
- {report.analysis.error && (
-
- {report.analysis.error}
-
- )}
+ {crawlPlan && (
+
+
Crawl summary
+
+ Requested pages: {crawlPlan.requestedPages || 1}
+ Plan limit: {crawlPlan.allowedPages || maxPagesPerCrawl}
+ Pages analyzed: {crawlPlan.actualPagesAnalyzed || 0}
+
+ {report.analysis.notice &&
{report.analysis.notice}
}
)}
- {activeResultsTab === 'pages' && (
-
-
-
-
-
Quick filters
-
- Narrow the page list to the pages that need attention most on mobile.
-
-
-
- {pageFilterOptions.map((filterOption) => (
-
setActivePageFilter(filterOption.id)}
- />
- ))}
-
-
-
- {pageFilterOptions.map((filterOption) => (
-
setActivePageFilter(filterOption.id)}
- />
- ))}
+ {report.analysis.crawlSummary && (
+
+
+
Pages without structured data
+
+ {report.analysis.crawlSummary.pagesWithoutStructuredData ?? 0}
-
- {filteredAnalyzedPages.length === 0 && !shouldShowFailedSection && (
-
- {emptyPagesStateMessage}
+
+
Failed page fetches
+
+ {report.analysis.crawlSummary.failedPages ?? 0}
- )}
+
+
+ )}
- {filteredAnalyzedPages.length > 0 && (
-
-
-
- {activePageFilter === 'withSchema'
- ? 'Pages with structured data'
- : activePageFilter === 'missingSchema'
- ? 'Pages missing structured data'
- : 'Analyzed pages'}
-
-
- {filteredAnalyzedPages.length} result{filteredAnalyzedPages.length === 1 ? '' : 's'}
-
-
-
- {filteredAnalyzedPages.map((page) => (
-
-
-
-
- {page.title || 'Untitled page'}
-
-
- {page.url}
-
-
-
-
- Status {page.statusCode || '—'}
-
-
- {page.hasStructuredData ? 'Structured data found' : 'Needs schema'}
-
-
-
-
-
-
-
Page status
-
- {page.hasStructuredData
- ? 'Structured data was detected on this page.'
- : 'No structured data was detected yet for this page.'}
-
-
-
-
Schema types
- {(page.jsonLdTypes || []).length > 0 ? (
-
- {(page.jsonLdTypes || []).slice(0, 4).map((typeName) => (
-
- {typeName}
-
- ))}
-
- ) : (
-
No JSON-LD types were detected on this page.
- )}
-
-
-
- ))}
-
-
- )}
-
- {shouldShowFailedSection && (
-
-
setIsFailedPagesExpanded((currentValue) => !currentValue)}
- aria-expanded={isFailedPagesExpanded}
+ {(report.analysis.pages || []).length > 0 && (
+
+
Analyzed pages
+
+ {(report.analysis.pages || []).map((page) => (
+
-
-
Failed page fetches
-
- {failedPages.length} internal page{failedPages.length === 1 ? '' : 's'} could not be fetched
-
-
- Keep this section collapsed until you need the troubleshooting details.
-
+
{page.url}
+
+ {page.title || 'Untitled page'}
-
-
-
- {isFailedPagesExpanded && (
-
- {failedPages.map((page) => (
-
+
+ Status {page.statusCode || '—'}
+
+
+ {page.hasStructuredData ? 'Structured data found' : 'No structured data'}
+
+ {(page.jsonLdTypes || []).slice(0, 3).map((typeName) => (
+
- {page.url}
- {page.error}
-
+ {typeName}
+
))}
- )}
-
- )}
-
- )}
-
- {activeResultsTab === 'recommendations' && (
-
-
-
-
- {recommendations.length} recommendation{recommendations.length === 1 ? '' : 's'} generated from the latest analysis.
-
- Fix-first order puts higher priority and broader-scope recommendations at the top.
-
-
-
- {
- const combined = exportableRecommendations
- .map((recommendation) => recommendation.suggested_schema)
- .filter(Boolean)
- .join('\n\n');
- navigator.clipboard
- .writeText(combined)
- .then(() => notify('success', 'All schema code copied to clipboard.'))
- .catch((error) => {
- console.error('Copy all code failed:', error);
- notify('error', 'Unable to copy the combined code.');
- });
- }}
- />
-
+ ))}
-
- {recommendations.length > 0 && (
-
-
- {recommendationQuickFilters.map((filterOption) => (
-
setActiveRecommendationFilter(filterOption.id)}
- />
- ))}
-
-
- Showing {filteredRecommendations.length} item{filteredRecommendations.length === 1 ? '' : 's'} in the {activeRecommendationFilterLabel} view.
-
-
- )}
-
- {filteredRecommendations.length === 0 && (
-
- {recommendationEmptyStateMessage}
-
- )}
-
- {recommendationGroups.map((recommendationGroup) => (
-
-
-
-
-
-
-
-
-
-
{recommendationGroup.meta.sectionTitle}
-
{recommendationGroup.meta.sectionDescription}
-
-
-
-
- {recommendationGroup.recommendations.length} item{recommendationGroup.recommendations.length === 1 ? '' : 's'}
-
-
-
-
-
- {recommendationGroup.recommendations.map((recommendation) => {
- const isCodeExpanded = !!expandedRecommendationIds[recommendation.id];
- const suggestedSchema = recommendation.suggested_schema || '';
- const codePreview = suggestedSchema.split('\n').slice(0, 4).join('\n');
- const codeLineCount = suggestedSchema ? suggestedSchema.split('\n').length : 0;
- const priorityMeta = getRecommendationPriorityMeta(recommendation.priority);
-
- return (
-
-
-
-
-
- {priorityMeta.label}
-
- {recommendation.schema_type && (
-
- {recommendation.schema_type}
-
- )}
- {recommendation.page_scope && (
-
- {recommendation.page_scope}
-
- )}
-
- {recommendation.suggested_schema ? 'Code ready' : 'Needs code'}
-
-
-
- {recommendation.title}
-
-
- {recommendation.reason}
-
- {recommendation.expected_impact && (
-
- Expected impact: {' '}
- {recommendation.expected_impact}
-
- )}
-
-
-
- {
- handleCopyCode(recommendation).catch(() => null);
- }}
- />
- {
- handleExportRecommendation(recommendation).catch(() => null);
- }}
- />
- {
- handleEmailCode(recommendation.id).catch(() => null);
- }}
- />
-
-
-
-
-
-
-
Suggested code
-
- {suggestedSchema
- ? isCodeExpanded
- ? 'Expanded for review and copy/paste.'
- : `Collapsed for mobile reading${codeLineCount > 4 ? ` · ${codeLineCount} lines available` : ''}.`
- : 'No code snippet generated for this recommendation yet.'}
-
-
- {suggestedSchema && (
-
toggleRecommendationCode(recommendation.id)}
- />
- )}
-
-
- {suggestedSchema ? (
- isCodeExpanded ? (
-
- {suggestedSchema}
-
- ) : (
-
-
{codePreview}
-
- {codeLineCount > 4 ? `Show code to view ${codeLineCount - 4} more line${codeLineCount - 4 === 1 ? '' : 's'}.` : 'Show code to expand this snippet.'}
-
-
- )
- ) : (
-
- No code snippet generated for this recommendation.
-
- )}
-
-
- );
- })}
-
-
- ))}
)}
- {activeResultsTab === 'delivery' && (
-
-
-
+ {(report.analysis.failedPages || []).length > 0 && (
+
+
Some internal pages could not be fetched
+
+ {(report.analysis.failedPages || []).map((page) => (
+
+ {page.url} : {page.error}
+
+ ))}
+
+
+ )}
+
+ {(report.analysis.schema?.jsonLd?.types || []).length > 0 && (
+
+
Detected JSON-LD types
+
+ {(report.analysis.schema?.jsonLd?.types || []).map((typeName) => (
+
+ {typeName}
+
+ ))}
+
+
+ )}
+
+ {(report.analysis.schema?.jsonLd?.invalidBlocks || []).length > 0 && (
+
+
Invalid JSON-LD detected
+
+ {(report.analysis.schema?.jsonLd?.invalidBlocks || []).map((block) => (
+
+ Block {block.index + 1}: {block.message}
+
+ ))}
+
+
+ )}
+
+ {report.analysis.error && (
+
+ {report.analysis.error}
+
+ )}
+
+
+
+
+
+
Recommendations
+
+ Prioritized next actions with ready-to-copy schema where possible.
+
+
+
+ {recommendations.length} recommendation{recommendations.length === 1 ? '' : 's'}
+
+
+
+
+ {recommendations.length === 0 && (
+
+ No recommendations were generated for this page yet.
+
+ )}
+
+ {recommendations.map((recommendation) => (
+
+
-
Delivery actions
+
+
+ {recommendation.priority || 'priority'}
+
+ {recommendation.schema_type && (
+
+ {recommendation.schema_type}
+
+ )}
+ {recommendation.page_scope && (
+
+ {recommendation.page_scope}
+
+ )}
+
+
+ {recommendation.title}
+
- Package the latest recommendations for your developer, email a handoff, or verify Step 4 output for the selected platform.
+ {recommendation.reason}
-
-
-
- Mobile handoff
-
-
-
-
- {deliverySummaryCards.map((card) => (
-
- ))}
-
-
-
-
-
-
- {exportableRecommendations.length} code ready
-
- )}
- >
-
-
- Best for quick sharing when you want one downloadable file instead of opening each recommendation card.
-
-
{
- handleExportAll().catch(() => null);
- }}
- />
-
-
-
-
- {hasEmailRecipient ? 'Recipient ready' : 'Recipient needed'}
-
- )}
- >
-
-
- setEmailTo(event.target.value)}
- />
-
-
- Use this when you want to send the full recommendation set straight from your phone.
-
-
{
- handleEmailCode().catch(() => null);
- }}
- />
-
-
-
-
- {entitlements?.canPlatformOutput ? 'Premium unlocked' : 'Premium feature'}
-
- )}
- >
-
-
-
-
Selected platform
-
{selectedPlatformLabel}
-
-
-
Access
-
- {entitlements?.canPlatformOutput ? 'Premium access detected' : 'Premium required for Step 4 output'}
-
-
-
-
{
- handlePlatformOutputCheck().catch(() => null);
- }}
- />
-
-
-
-
-
-
-
-
-
-
-
Handoff checklist
-
- A quick mobile-friendly checklist before you export or email the report.
+ {recommendation.expected_impact && (
+
+ Expected impact: {' '}
+ {recommendation.expected_impact}
-
+ )}
-
- {deliveryChecklist.map((item) => (
-
-
-
-
{item.label}
-
{item.value}
-
-
-
- {item.isReady ? 'Ready' : 'Needs attention'}
-
-
-
- ))}
-
+
+ {
+ handleCopyCode(recommendation).catch(() => null);
+ }}
+ />
+ {
+ handleExportRecommendation(recommendation).catch(() => null);
+ }}
+ />
+ {
+ handleEmailCode(recommendation.id).catch(() => null);
+ }}
+ />
+
+
+
+
+
Suggested code
+
+ {recommendation.suggested_schema || 'No code snippet generated for this recommendation.'}
+
-
- )}
-
+ ))}
+
)}