+
+
Analysis results
+
+ Review the latest crawl summary, page-level findings, prioritized recommendations, and delivery actions from one mobile-friendly workspace.
+
+
+
+
+ {report.analysis.platform?.label || 'Unknown platform'}
+
+ {analyzedTimestamp && (
+
+ {analyzedTimestamp}
+
+ )}
+
+
+
+
+ {activeResultsTab === 'overview' && (
+
+
+
+
+
+
+
+
+
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}
+
+
+
+
+
+
+ ))}
+
+
+
+ {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}
+
+ )}
+
+ )}
+
+ {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)}
+ />
+ ))}
+
+
+
+ {filteredAnalyzedPages.length === 0 && !shouldShowFailedSection && (
+
+ {emptyPagesStateMessage}
+
+ )}
+
+ {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}
+ >
+
+
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.
+
+
+
+
+
+ {isFailedPagesExpanded && (
+
+ {failedPages.map((page) => (
+
+
{page.url}
+
{page.error}
+
+ ))}
+
+ )}
+
+ )}
+
+ )}
+
+ {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' && (
+
+
+
+
+
Delivery actions
+
+ Package the latest recommendations for your developer, email a handoff, or verify Step 4 output for the selected platform.
+
+
+
+
+ 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.
+
+
+
+
+
+ {deliveryChecklist.map((item) => (
+
+
+
+
{item.label}
+
{item.value}
+
+
+
+ {item.isReady ? 'Ready' : 'Needs attention'}
+
+
+
+ ))}
+
+
+
+
+ )}
+