Skip to content

Commit a025d09

Browse files
Asset 3/15: Implement interactive Technical SEO Audit Checklist
1 parent d50e85c commit a025d09

2 files changed

Lines changed: 174 additions & 0 deletions

File tree

app/tools/page.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const tools = [
2424
{ name: 'Sitemap XML Validator', description: 'Verify XML sitemaps for Google Search Console compliance', icon: Layers, href: '/tools/sitemap-validator', color: 'from-blue-600 to-blue-800', category: 'SEO', releaseDate: '2026-05-06' },
2525
{ name: 'JSON-LD Schema Generator', description: 'Build structured data schema for Google Rich Results', icon: Code, href: '/tools/schema-generator', color: 'from-emerald-600 to-emerald-800', category: 'SEO', releaseDate: '2026-05-07' },
2626
{ name: 'API Latency Cost Calculator', description: 'Calculate the financial impact of network latency on your revenue', icon: TrendingDown, href: '/tools/api-latency-calculator', color: 'from-red-600 to-red-800', category: 'SEO' },
27+
{ name: 'Technical SEO Audit Checklist', description: 'Interactive checklist for comprehensive search engine optimization', icon: ClipboardList, href: '/tools/seo-audit-checklist', color: 'from-blue-600 to-blue-800', category: 'SEO' },
2728
{ name: 'WCAG Color Contrast Checker', description: 'Verify ADA and WCAG 2.1 accessibility compliance', icon: Palette, href: '/tools/color-contrast', color: 'from-pink-500 to-pink-700', category: 'Design', releaseDate: '2026-05-08' },
2829
{ name: 'Markdown to HTML Converter', description: 'Convert documentation to clean, semantic HTML code', icon: FileCode, href: '/tools/markdown-converter', color: 'from-violet-500 to-violet-700', category: 'Formatters', releaseDate: '2026-05-09' },
2930

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
'use client'
2+
3+
import React, { useState, useEffect, useMemo } from 'react'
4+
import { CheckCircle2, Circle, ClipboardList, Download, Share2, Search, Zap, Shield, Smartphone, Globe, FileCode, Check } from 'lucide-react'
5+
import BreadcrumbSchema from '@/components/seo/BreadcrumbSchema'
6+
7+
const checklistData = [
8+
{
9+
category: 'Crawlability & Indexing',
10+
icon: Globe,
11+
items: [
12+
{ id: 'xml-sitemap', text: 'XML Sitemap is present and submitted to Google Search Console', detail: 'Ensures Google can find all your pages.' },
13+
{ id: 'robots-txt', text: 'Robots.txt is optimized and not blocking critical resources', detail: 'Prevents crawling of sensitive or low-value areas.' },
14+
{ id: 'canonical-tags', text: 'Self-referencing canonical tags are present on all pages', detail: 'Prevents duplicate content issues.' },
15+
{ id: 'noindex-check', text: 'Noindex tags are only used on intended private pages', detail: 'Prevents accidental de-indexing of key pages.' },
16+
{ id: 'broken-links', text: 'Check for 404 errors and broken internal links', detail: 'Improves user experience and crawl efficiency.' }
17+
]
18+
},
19+
{
20+
category: 'Core Web Vitals & Speed',
21+
icon: Zap,
22+
items: [
23+
{ id: 'lcp-check', text: 'Largest Contentful Paint (LCP) is under 2.5 seconds', detail: 'Measures perceived loading speed.' },
24+
{ id: 'inp-check', text: 'Interaction to Next Paint (INP) is under 200ms', detail: 'Measures site responsiveness.' },
25+
{ id: 'cls-check', text: 'Cumulative Layout Shift (CLS) is under 0.1', detail: 'Measures visual stability.' },
26+
{ id: 'image-optimization', text: 'All images are compressed and use Next-Gen formats (WebP/AVIF)', detail: 'Reduces payload and improves speed.' },
27+
{ id: 'lazy-loading', text: 'Lazy loading is implemented for off-screen images', detail: 'Saves bandwidth and improves initial load time.' }
28+
]
29+
},
30+
{
31+
category: 'On-Page & Content',
32+
icon: Search,
33+
items: [
34+
{ id: 'title-length', text: 'Titles are between 50-60 characters and contain keywords', detail: 'Optimal length for search result snippets.' },
35+
{ id: 'meta-desc', text: 'Meta descriptions are between 120-160 characters', detail: 'Drives click-through rate (CTR).' },
36+
{ id: 'heading-hierarchy', text: 'Pages have exactly one H1 and a logical H2-H3 hierarchy', detail: 'Helps Google understand content structure.' },
37+
{ id: 'alt-text', text: 'All images have descriptive, keyword-rich Alt text', detail: 'Critical for accessibility and Image Search SEO.' },
38+
{ id: 'internal-linking', text: 'Strategic internal links connect related content', detail: 'Distributes "link equity" across the site.' }
39+
]
40+
},
41+
{
42+
category: 'Architecture & Security',
43+
icon: Shield,
44+
items: [
45+
{ id: 'https-check', text: 'Site is served over HTTPS with a valid SSL certificate', detail: 'A core ranking signal and trust factor.' },
46+
{ id: 'mobile-friendly', text: 'Site passes the Google Mobile-Friendly test', detail: 'Google uses mobile-first indexing.' },
47+
{ id: 'structured-data', text: 'JSON-LD Schema is implemented (Breadcrumbs, FAQ, etc.)', detail: 'Enables Rich Snippets in search results.' },
48+
{ id: 'social-meta', text: 'Open Graph (OG) and Twitter card tags are configured', detail: 'Ensures links look professional when shared.' },
49+
{ id: 'site-security', text: 'Security headers (CSP, HSTS, X-Frame-Options) are active', detail: 'Protects users and site reputation.' }
50+
]
51+
}
52+
]
53+
54+
export default function SeoAuditChecklist() {
55+
const [checkedItems, setCheckedItems] = useState<string[]>([])
56+
const [copied, setCopied] = useState(false)
57+
58+
useEffect(() => {
59+
const saved = localStorage.getItem('wtk_seo_checklist')
60+
if (saved) setCheckedItems(JSON.parse(saved))
61+
}, [])
62+
63+
const toggleItem = (id: string) => {
64+
const newItems = checkedItems.includes(id)
65+
? checkedItems.filter(i => i !== id)
66+
: [...checkedItems, id]
67+
setCheckedItems(newItems)
68+
localStorage.setItem('wtk_seo_checklist', JSON.stringify(newItems))
69+
}
70+
71+
const totalItems = checklistData.reduce((acc, cat) => acc + cat.items.length, 0)
72+
const progress = Math.round((checkedItems.length / totalItems) * 100)
73+
74+
const copyAsMarkdown = () => {
75+
let md = '# Technical SEO Audit Checklist\n\n'
76+
checklistData.forEach(cat => {
77+
md += `## ${cat.category}\n`
78+
cat.items.forEach(item => {
79+
const isChecked = checkedItems.includes(item.id) ? '[x]' : '[ ]'
80+
md += `${isChecked} ${item.text}\n`
81+
})
82+
md += '\n'
83+
})
84+
md += '---\n*Generated by WebToolkit Pro SEO Audit Tool*'
85+
navigator.clipboard.writeText(md)
86+
setCopied(true)
87+
setTimeout(() => setCopied(false), 2000)
88+
}
89+
90+
return (
91+
<div className="min-h-screen bg-gray-50 dark:bg-slate-950 py-12 px-4 sm:px-6 lg:px-8 transition-colors duration-300">
92+
<BreadcrumbSchema name="Technical SEO Audit Checklist" slug="seo-audit-checklist" />
93+
94+
<div className="max-w-4xl mx-auto">
95+
<div className="flex flex-col md:flex-row md:items-center justify-between gap-6 mb-12">
96+
<div className="flex items-center gap-4">
97+
<div className="p-4 bg-blue-600 rounded-2xl shadow-lg shadow-blue-600/20 text-white">
98+
<ClipboardList className="w-8 h-8" />
99+
</div>
100+
<div>
101+
<h1 className="text-3xl font-extrabold text-gray-900 dark:text-white tracking-tight">Technical SEO Audit</h1>
102+
<p className="text-gray-500 dark:text-slate-400">The ultimate checklist for perfect search engine visibility</p>
103+
</div>
104+
</div>
105+
106+
<button
107+
onClick={copyAsMarkdown}
108+
className="flex items-center gap-2 px-6 py-3 bg-white dark:bg-slate-900 text-gray-700 dark:text-slate-300 font-bold rounded-xl border border-gray-200 dark:border-slate-800 hover:shadow-md transition-all whitespace-nowrap"
109+
>
110+
{copied ? <Check className="w-5 h-5 text-green-500" /> : <FileCode className="w-5 h-5" />}
111+
<span>{copied ? 'Markdown Copied' : 'Copy as Markdown'}</span>
112+
</button>
113+
</div>
114+
115+
{/* Progress Bar */}
116+
<div className="bg-white dark:bg-slate-900 rounded-3xl p-8 border border-gray-100 dark:border-slate-800 mb-12 shadow-sm">
117+
<div className="flex items-center justify-between mb-4">
118+
<span className="text-sm font-bold text-gray-400 dark:text-slate-500 uppercase tracking-widest">Audit Progress</span>
119+
<span className="text-2xl font-black text-blue-600 dark:text-blue-400">{progress}%</span>
120+
</div>
121+
<div className="w-full h-4 bg-gray-100 dark:bg-slate-800 rounded-full overflow-hidden">
122+
<div
123+
className="h-full bg-gradient-to-r from-blue-500 to-blue-700 transition-all duration-500 ease-out"
124+
style={{ width: `${progress}%` }}
125+
/>
126+
</div>
127+
</div>
128+
129+
{/* Checklist Categories */}
130+
<div className="space-y-8">
131+
{checklistData.map((cat, catIdx) => (
132+
<div key={catIdx} className="bg-white dark:bg-slate-900 rounded-3xl border border-gray-100 dark:border-slate-800 overflow-hidden shadow-sm">
133+
<div className="p-6 border-b border-gray-50 dark:border-slate-800 bg-gray-50/50 dark:bg-slate-900/50 flex items-center gap-3">
134+
<cat.icon className="w-6 h-6 text-blue-600 dark:text-blue-400" />
135+
<h2 className="text-lg font-bold text-gray-900 dark:text-white">{cat.category}</h2>
136+
</div>
137+
<div className="p-6 space-y-4">
138+
{cat.items.map((item) => (
139+
<div
140+
key={item.id}
141+
onClick={() => toggleItem(item.id)}
142+
className="flex items-start gap-4 p-4 rounded-2xl hover:bg-gray-50 dark:hover:bg-slate-800/50 cursor-pointer transition-all border border-transparent hover:border-gray-100 dark:hover:border-slate-700 group"
143+
>
144+
<div className="mt-1 shrink-0">
145+
{checkedItems.includes(item.id) ? (
146+
<CheckCircle2 className="w-6 h-6 text-green-500 fill-green-50 dark:fill-green-900/10" />
147+
) : (
148+
<Circle className="w-6 h-6 text-gray-300 dark:text-slate-600 group-hover:text-blue-500" />
149+
)}
150+
</div>
151+
<div>
152+
<h3 className={`font-bold leading-snug transition-colors ${checkedItems.includes(item.id) ? 'text-gray-400 dark:text-slate-600 line-through' : 'text-gray-900 dark:text-white'}`}>
153+
{item.text}
154+
</h3>
155+
<p className="text-sm text-gray-500 dark:text-slate-400 mt-1">
156+
{item.detail}
157+
</p>
158+
</div>
159+
</div>
160+
))}
161+
</div>
162+
</div>
163+
))}
164+
</div>
165+
166+
{/* Informational Footer */}
167+
<div className="mt-16 text-center text-gray-400 dark:text-slate-600 text-sm">
168+
<p>This checklist is designed for technical SEO audits in 2026. Regularly updated based on Google Search algorithm changes.</p>
169+
</div>
170+
</div>
171+
</div>
172+
)
173+
}

0 commit comments

Comments
 (0)