@zoyth/simple-site-framework 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +572 -0
  3. package/bin/create-simple-site.js +390 -0
  4. package/bin/simple-site.js +664 -0
  5. package/dist/client.js +135 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/client.mjs +107 -0
  8. package/dist/client.mjs.map +1 -0
  9. package/dist/components/index.d.mts +3936 -0
  10. package/dist/components/index.d.ts +3936 -0
  11. package/dist/components/index.js +38265 -0
  12. package/dist/components/index.js.map +1 -0
  13. package/dist/components/index.mjs +38173 -0
  14. package/dist/components/index.mjs.map +1 -0
  15. package/dist/config/index.d.mts +298 -0
  16. package/dist/config/index.d.ts +298 -0
  17. package/dist/config/index.js +19 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/config/index.mjs +1 -0
  20. package/dist/config/index.mjs.map +1 -0
  21. package/dist/index.d.mts +2184 -0
  22. package/dist/index.d.ts +2184 -0
  23. package/dist/index.js +1713 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.mjs +1605 -0
  26. package/dist/index.mjs.map +1 -0
  27. package/dist/lib/i18n/index.js +665 -0
  28. package/dist/lib/i18n/index.js.map +1 -0
  29. package/dist/lib/i18n/index.mjs +621 -0
  30. package/dist/lib/i18n/index.mjs.map +1 -0
  31. package/docs/DOCUMENTATION-STRUCTURE.md +1156 -0
  32. package/docs/EXPORTS.md +125 -0
  33. package/docs/PERFORMANCE.md +757 -0
  34. package/docs/POLICY-PAGES.md +867 -0
  35. package/docs/ROADMAP.md +334 -0
  36. package/docs/SEO.md +455 -0
  37. package/docs/SITEMAP.md +708 -0
  38. package/docs/STRUCTURED-DATA.md +671 -0
  39. package/docs/accessibility/common-patterns.md +529 -0
  40. package/docs/accessibility/keyboard-navigation.md +263 -0
  41. package/docs/accessibility/overview.md +122 -0
  42. package/docs/accessibility/screen-readers.md +311 -0
  43. package/docs/accessibility/wcag-compliance.md +159 -0
  44. package/docs/api/README.md +164 -0
  45. package/docs/api/components/Accessibility.md +356 -0
  46. package/docs/api/components/Button.md +240 -0
  47. package/docs/api/components/HeroSection.md +306 -0
  48. package/docs/architecture/decisions.md +449 -0
  49. package/docs/components/AnalyticsTracker.md +58 -0
  50. package/docs/components/AnimatedCounter.md +48 -0
  51. package/docs/components/AnimatedSection.md +56 -0
  52. package/docs/components/BlogCard.md +42 -0
  53. package/docs/components/Checkbox.md +56 -0
  54. package/docs/components/CodeBlock.md +52 -0
  55. package/docs/components/ComparisonTable.md +40 -0
  56. package/docs/components/ComponentDemo.md +38 -0
  57. package/docs/components/CountdownTimer.md +51 -0
  58. package/docs/components/ExitIntentModal.md +56 -0
  59. package/docs/components/FAQAccordion.md +66 -0
  60. package/docs/components/FeaturesGrid.md +55 -0
  61. package/docs/components/FileUpload.md +54 -0
  62. package/docs/components/I18nMetaTags.md +55 -0
  63. package/docs/components/Icon.md +53 -0
  64. package/docs/components/LazySection.md +46 -0
  65. package/docs/components/LiveProof.md +53 -0
  66. package/docs/components/LoadingSpinner.md +46 -0
  67. package/docs/components/MultiStepForm.md +48 -0
  68. package/docs/components/PolicyLayout.md +55 -0
  69. package/docs/components/PricingTable.md +49 -0
  70. package/docs/components/Radio.md +59 -0
  71. package/docs/components/SEOMetaTags.md +58 -0
  72. package/docs/components/ScriptInjector.md +50 -0
  73. package/docs/components/Select.md +72 -0
  74. package/docs/components/Skeleton.md +47 -0
  75. package/docs/components/StatsSection.md +48 -0
  76. package/docs/components/StickyBar.md +62 -0
  77. package/docs/components/StructuredData.md +99 -0
  78. package/docs/components/StyleGuide.md +46 -0
  79. package/docs/components/TableOfContents.md +47 -0
  80. package/docs/components/TestimonialCarousel.md +42 -0
  81. package/docs/components/Timeline.md +51 -0
  82. package/docs/components/Toast.md +59 -0
  83. package/docs/components/TrackedLink.md +62 -0
  84. package/docs/components/TrustBadges.md +44 -0
  85. package/docs/components/conversion/MobileCTA.md +363 -0
  86. package/docs/components/forms/ContactForm.md +75 -0
  87. package/docs/components/forms/FormField.md +74 -0
  88. package/docs/components/layout/Footer.md +601 -0
  89. package/docs/components/layout/Header.md +549 -0
  90. package/docs/components/layout/LanguageSelector.md +54 -0
  91. package/docs/components/layout/LanguageSwitcher.md +24 -0
  92. package/docs/components/overview.md +447 -0
  93. package/docs/components/sections/AboutSection.md +48 -0
  94. package/docs/components/sections/CTASection.md +596 -0
  95. package/docs/components/sections/CaseStudySection.md +47 -0
  96. package/docs/components/sections/ContactSection.md +599 -0
  97. package/docs/components/sections/FeatureSection.md +44 -0
  98. package/docs/components/sections/HeroSection.md +404 -0
  99. package/docs/components/sections/LogosSection.md +47 -0
  100. package/docs/components/sections/PersonalTaxesSection.md +23 -0
  101. package/docs/components/sections/RecruitingSection.md +23 -0
  102. package/docs/components/sections/SecurePortalSection.md +23 -0
  103. package/docs/components/sections/ServicePageLayout.md +52 -0
  104. package/docs/components/sections/ServicesSection.md +49 -0
  105. package/docs/components/sections/TestimonialSection.md +44 -0
  106. package/docs/components/sections/WhyChooseUsSection.md +54 -0
  107. package/docs/components/ui/Breadcrumb.md +70 -0
  108. package/docs/components/ui/Button.md +514 -0
  109. package/docs/components/ui/Card.md +501 -0
  110. package/docs/components/ui/Input.md +54 -0
  111. package/docs/components/ui/MobileLinks.md +43 -0
  112. package/docs/components/ui/Modal.md +60 -0
  113. package/docs/components/ui/Tabs.md +62 -0
  114. package/docs/components/ui/Textarea.md +52 -0
  115. package/docs/core-concepts/configuration-driven.md +552 -0
  116. package/docs/core-concepts/overview.md +351 -0
  117. package/docs/features/accessibility/README.md +73 -0
  118. package/docs/features/accessibility/aria-support.md +177 -0
  119. package/docs/features/accessibility/color-contrast.md +155 -0
  120. package/docs/features/accessibility/focus-management.md +187 -0
  121. package/docs/features/accessibility/testing.md +196 -0
  122. package/docs/features/analytics/README.md +51 -0
  123. package/docs/features/analytics/ab-testing.md +171 -0
  124. package/docs/features/analytics/conversion-tracking.md +207 -0
  125. package/docs/features/analytics/custom-events.md +219 -0
  126. package/docs/features/analytics/privacy.md +198 -0
  127. package/docs/features/analytics/setup.md +114 -0
  128. package/docs/features/analytics/tracking-events.md +224 -0
  129. package/docs/features/i18n/README.md +51 -0
  130. package/docs/features/i18n/best-practices.md +273 -0
  131. package/docs/features/i18n/configuration.md +84 -0
  132. package/docs/features/i18n/formatting.md +133 -0
  133. package/docs/features/i18n/locale-detection.md +122 -0
  134. package/docs/features/i18n/routing.md +99 -0
  135. package/docs/features/i18n/rtl-support.md +191 -0
  136. package/docs/features/i18n/translations.md +129 -0
  137. package/docs/features/internationalization.md +595 -0
  138. package/docs/features/performance/README.md +77 -0
  139. package/docs/features/performance/bundle-size.md +134 -0
  140. package/docs/features/performance/caching.md +131 -0
  141. package/docs/features/performance/code-splitting.md +121 -0
  142. package/docs/features/performance/image-optimization.md +110 -0
  143. package/docs/features/performance/lazy-loading.md +92 -0
  144. package/docs/features/performance/monitoring.md +148 -0
  145. package/docs/features/seo/README.md +51 -0
  146. package/docs/features/seo/best-practices.md +184 -0
  147. package/docs/features/seo/canonical-urls.md +182 -0
  148. package/docs/features/seo/meta-tags.md +126 -0
  149. package/docs/features/seo/open-graph.md +166 -0
  150. package/docs/features/seo/robots-txt.md +146 -0
  151. package/docs/features/seo/sitemaps.md +162 -0
  152. package/docs/features/seo/structured-data.md +166 -0
  153. package/docs/getting-started/installation.md +292 -0
  154. package/docs/getting-started/introduction.md +195 -0
  155. package/docs/getting-started/quick-start.md +460 -0
  156. package/docs/guides/analytics-setup.md +616 -0
  157. package/docs/i18n/CONFIGURATION.md +353 -0
  158. package/docs/i18n/EXAMPLES.md +402 -0
  159. package/docs/i18n/MIGRATION.md +260 -0
  160. package/docs/i18n/SEO.md +392 -0
  161. package/docs/i18n/STATIC-GENERATION-FIX.md +71 -0
  162. package/docs/migration/changelog.md +136 -0
  163. package/docs/migration/overview.md +233 -0
  164. package/docs/recipes/adding-animations.md +475 -0
  165. package/docs/recipes/forms-with-validation.md +393 -0
  166. package/package.json +152 -0
package/docs/SEO.md ADDED
@@ -0,0 +1,455 @@
1
+ # SEO Optimization Guide
2
+
3
+ Complete guide to implementing SEO best practices with the Simple Site Framework.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Overview](#overview)
8
+ - [SEOMetaTags Component](#seometatags-component)
9
+ - [Open Graph Protocol](#open-graph-protocol)
10
+ - [Twitter Cards](#twitter-cards)
11
+ - [Best Practices](#best-practices)
12
+ - [Common Patterns](#common-patterns)
13
+ - [Integration with I18n](#integration-with-i18n)
14
+
15
+ ## Overview
16
+
17
+ The framework provides comprehensive SEO utilities to help your site rank well in search engines and look great when shared on social media:
18
+
19
+ - **SEOMetaTags**: Page-level metadata component
20
+ - **I18nMetaTags**: Multi-language SEO tags with hreflang
21
+ - **Structured Data**: JSON-LD helpers for rich snippets (see [STRUCTURED-DATA.md](./STRUCTURED-DATA.md))
22
+ - **Sitemap Generation**: Automatic sitemap creation (see [SITEMAP.md](./SITEMAP.md))
23
+
24
+ ## SEOMetaTags Component
25
+
26
+ The `<SEOMetaTags>` component generates all essential meta tags for a page.
27
+
28
+ ### Basic Usage
29
+
30
+ ```tsx
31
+ import { SEOMetaTags } from 'simple-site-framework/components';
32
+
33
+ export default function Page() {
34
+ return (
35
+ <>
36
+ <SEOMetaTags
37
+ title="Best Email Marketing Platform | Acme"
38
+ description="Send beautiful email campaigns that convert. Start free today."
39
+ />
40
+ <main>
41
+ {/* Page content */}
42
+ </main>
43
+ </>
44
+ );
45
+ }
46
+ ```
47
+
48
+ This generates:
49
+
50
+ ```html
51
+ <title>Best Email Marketing Platform | Acme</title>
52
+ <meta name="description" content="Send beautiful email campaigns that convert. Start free today." />
53
+ <meta property="og:title" content="Best Email Marketing Platform | Acme" />
54
+ <meta property="og:description" content="Send beautiful email campaigns that convert. Start free today." />
55
+ <meta name="twitter:title" content="Best Email Marketing Platform | Acme" />
56
+ <meta name="twitter:description" content="Send beautiful email campaigns that convert. Start free today." />
57
+ ```
58
+
59
+ ### Full Example with All Options
60
+
61
+ ```tsx
62
+ <SEOMetaTags
63
+ // Basic meta tags
64
+ title="How to Build High-Converting Landing Pages"
65
+ description="Learn proven strategies to create landing pages that convert visitors into customers. Includes examples and templates."
66
+ keywords={['landing pages', 'conversion optimization', 'marketing']}
67
+
68
+ // Canonical URL (prevents duplicate content issues)
69
+ canonical="https://example.com/blog/landing-pages"
70
+
71
+ // Robots directives
72
+ noIndex={false}
73
+ noFollow={false}
74
+
75
+ // Open Graph (Facebook, LinkedIn)
76
+ openGraph={{
77
+ title: "How to Build High-Converting Landing Pages",
78
+ description: "Learn proven strategies to create landing pages that convert.",
79
+ image: "https://example.com/images/blog/landing-pages-og.jpg",
80
+ imageAlt: "Landing page design mockup",
81
+ type: "article",
82
+ url: "https://example.com/blog/landing-pages",
83
+ siteName: "Acme Blog",
84
+ locale: "en_US",
85
+ alternateLocales: ["fr_FR", "es_ES"],
86
+ // Article-specific fields
87
+ publishedTime: "2024-01-15T10:00:00Z",
88
+ modifiedTime: "2024-01-20T14:30:00Z",
89
+ authors: ["https://example.com/authors/jane-doe"],
90
+ section: "Marketing",
91
+ tags: ["conversion", "landing pages", "optimization"]
92
+ }}
93
+
94
+ // Twitter Card
95
+ twitter={{
96
+ card: "summary_large_image",
97
+ site: "@acme",
98
+ creator: "@janedoe",
99
+ image: "https://example.com/images/blog/landing-pages-twitter.jpg",
100
+ imageAlt: "Landing page design mockup"
101
+ }}
102
+
103
+ // Additional custom meta tags
104
+ additionalMetaTags={[
105
+ { name: "author", content: "Jane Doe" },
106
+ { property: "fb:app_id", content: "123456789" }
107
+ ]}
108
+
109
+ // Additional link tags
110
+ additionalLinkTags={[
111
+ { rel: "alternate", href: "https://example.com/fr/blog/landing-pages", hreflang: "fr" }
112
+ ]}
113
+ />
114
+ ```
115
+
116
+ ## Open Graph Protocol
117
+
118
+ Open Graph tags control how your pages appear when shared on Facebook, LinkedIn, and other social platforms.
119
+
120
+ ### Page Types
121
+
122
+ ```tsx
123
+ // Website (default)
124
+ <SEOMetaTags
125
+ title="Acme - Email Marketing Platform"
126
+ description="..."
127
+ openGraph={{
128
+ type: "website",
129
+ siteName: "Acme"
130
+ }}
131
+ />
132
+
133
+ // Article/Blog Post
134
+ <SEOMetaTags
135
+ title="10 Email Marketing Tips"
136
+ description="..."
137
+ openGraph={{
138
+ type: "article",
139
+ publishedTime: "2024-01-15T10:00:00Z",
140
+ modifiedTime: "2024-01-20T14:30:00Z",
141
+ authors: ["https://example.com/authors/jane-doe"],
142
+ section: "Marketing",
143
+ tags: ["email", "marketing", "tips"]
144
+ }}
145
+ />
146
+
147
+ // Product
148
+ <SEOMetaTags
149
+ title="Premium Email Plan - $99/month"
150
+ description="..."
151
+ openGraph={{
152
+ type: "product",
153
+ image: "https://example.com/products/premium-plan.jpg"
154
+ }}
155
+ />
156
+ ```
157
+
158
+ ### Image Recommendations
159
+
160
+ - **Minimum size**: 1200×630 pixels
161
+ - **Aspect ratio**: 1.91:1 (Facebook) or 2:1 (LinkedIn)
162
+ - **Format**: JPG or PNG
163
+ - **Max file size**: 8 MB
164
+ - **Always use absolute URLs**: `https://example.com/image.jpg`
165
+
166
+ ```tsx
167
+ <SEOMetaTags
168
+ title="..."
169
+ description="..."
170
+ openGraph={{
171
+ image: "https://example.com/og-image.jpg", // Absolute URL
172
+ imageAlt: "Descriptive alt text for accessibility"
173
+ }}
174
+ />
175
+ ```
176
+
177
+ ## Twitter Cards
178
+
179
+ Twitter Cards enhance how your links appear on Twitter/X.
180
+
181
+ ### Card Types
182
+
183
+ **Summary Card** (Small image, good for text-focused content):
184
+
185
+ ```tsx
186
+ <SEOMetaTags
187
+ title="..."
188
+ description="..."
189
+ twitter={{
190
+ card: "summary",
191
+ site: "@yourcompany",
192
+ creator: "@author"
193
+ }}
194
+ />
195
+ ```
196
+
197
+ **Summary Large Image** (Large image, good for visual content):
198
+
199
+ ```tsx
200
+ <SEOMetaTags
201
+ title="..."
202
+ description="..."
203
+ twitter={{
204
+ card: "summary_large_image",
205
+ site: "@yourcompany",
206
+ image: "https://example.com/twitter-card.jpg",
207
+ imageAlt: "Descriptive alt text"
208
+ }}
209
+ />
210
+ ```
211
+
212
+ ### Image Recommendations
213
+
214
+ - **Summary card**: 1:1 aspect ratio (e.g., 400×400)
215
+ - **Large image card**: 2:1 aspect ratio (e.g., 1200×600)
216
+ - **Max file size**: 5 MB
217
+
218
+ ## Best Practices
219
+
220
+ ### Title Tags
221
+
222
+ **Length**: 50-60 characters (longer titles get truncated in search results)
223
+
224
+ ```tsx
225
+ // ✅ Good
226
+ title="Email Marketing Platform | Acme"
227
+
228
+ // ❌ Too long
229
+ title="Acme - The Best Email Marketing Platform for Small Businesses and Enterprises"
230
+ ```
231
+
232
+ **Format**: `Page Title | Brand Name` or `Page Title - Brand Name`
233
+
234
+ ```tsx
235
+ // Homepage
236
+ title="Acme - Email Marketing Platform"
237
+
238
+ // Product page
239
+ title="Pricing Plans | Acme"
240
+
241
+ // Blog post
242
+ title="10 Email Tips | Acme Blog"
243
+ ```
244
+
245
+ ### Meta Descriptions
246
+
247
+ **Length**: 150-160 characters (longer descriptions get truncated)
248
+
249
+ ```tsx
250
+ // ✅ Good - Clear, actionable, within limit
251
+ description="Send beautiful email campaigns that convert. Easy drag-and-drop builder, powerful automation, detailed analytics. Start free today."
252
+
253
+ // ❌ Too short - Doesn't use available space
254
+ description="Email marketing platform."
255
+
256
+ // ❌ Too long - Gets truncated
257
+ description="Acme is the world's leading email marketing platform trusted by over 100,000 businesses worldwide to send beautiful campaigns..."
258
+ ```
259
+
260
+ **Include**:
261
+ - Clear value proposition
262
+ - Call to action
263
+ - Relevant keywords (naturally)
264
+
265
+ ### Keywords
266
+
267
+ **Note**: The `keywords` meta tag has minimal impact on modern SEO. Focus on:
268
+ 1. Using keywords naturally in title and description
269
+ 2. Structuring content with proper headings
270
+ 3. Creating quality content
271
+
272
+ ```tsx
273
+ // Optional - use sparingly
274
+ keywords={['email marketing', 'marketing automation', 'email campaigns']}
275
+ ```
276
+
277
+ ### Canonical URLs
278
+
279
+ Always use **absolute URLs** for canonical tags:
280
+
281
+ ```tsx
282
+ // ✅ Correct
283
+ canonical="https://example.com/products/premium"
284
+
285
+ // ❌ Wrong
286
+ canonical="/products/premium"
287
+ ```
288
+
289
+ **When to use**:
290
+ - Prevent duplicate content issues
291
+ - Consolidate similar pages (e.g., paginated content)
292
+ - Specify preferred URL for search engines
293
+
294
+ ### Robots Directives
295
+
296
+ ```tsx
297
+ // Allow indexing and following links (default)
298
+ <SEOMetaTags noIndex={false} noFollow={false} />
299
+
300
+ // Prevent indexing (e.g., private pages, duplicate content)
301
+ <SEOMetaTags noIndex={true} noFollow={false} />
302
+
303
+ // Prevent following links (rare - use with caution)
304
+ <SEOMetaTags noIndex={false} noFollow={true} />
305
+ ```
306
+
307
+ **Common use cases for noIndex**:
308
+ - Thank you pages
309
+ - Confirmation pages
310
+ - Internal search results
311
+ - Duplicate content variations
312
+
313
+ ## Common Patterns
314
+
315
+ ### Homepage
316
+
317
+ ```tsx
318
+ <SEOMetaTags
319
+ title="Acme - Email Marketing Platform"
320
+ description="Send beautiful email campaigns that convert. Trusted by 100,000+ businesses worldwide. Start free today."
321
+ canonical="https://acme.com"
322
+ openGraph={{
323
+ type: "website",
324
+ siteName: "Acme",
325
+ image: "https://acme.com/og-homepage.jpg",
326
+ locale: "en_US"
327
+ }}
328
+ twitter={{
329
+ card: "summary_large_image",
330
+ site: "@acme"
331
+ }}
332
+ />
333
+ ```
334
+
335
+ ### Product/Service Page
336
+
337
+ ```tsx
338
+ <SEOMetaTags
339
+ title="Premium Email Plan - $99/month | Acme"
340
+ description="Unlimited emails, advanced automation, priority support. Perfect for growing businesses. 30-day money-back guarantee."
341
+ canonical="https://acme.com/pricing/premium"
342
+ openGraph={{
343
+ type: "product",
344
+ image: "https://acme.com/images/premium-plan.jpg"
345
+ }}
346
+ />
347
+ ```
348
+
349
+ ### Blog Post
350
+
351
+ ```tsx
352
+ <SEOMetaTags
353
+ title="10 Email Marketing Tips for 2024 | Acme Blog"
354
+ description="Boost your email ROI with these proven strategies. Learn from industry experts and real case studies."
355
+ canonical="https://acme.com/blog/email-marketing-tips-2024"
356
+ openGraph={{
357
+ type: "article",
358
+ publishedTime: "2024-01-15T10:00:00Z",
359
+ authors: ["https://acme.com/authors/jane-doe"],
360
+ section: "Email Marketing",
361
+ tags: ["email marketing", "tips", "2024"]
362
+ }}
363
+ twitter={{
364
+ card: "summary_large_image",
365
+ creator: "@janedoe"
366
+ }}
367
+ />
368
+ ```
369
+
370
+ ### Landing Page
371
+
372
+ ```tsx
373
+ <SEOMetaTags
374
+ title="Free Email Marketing Webinar | Acme"
375
+ description="Join our live webinar: How to Triple Your Email ROI. Jan 25, 2024 at 2pm EST. Limited spots available!"
376
+ canonical="https://acme.com/webinar/triple-email-roi"
377
+ openGraph={{
378
+ type: "website",
379
+ image: "https://acme.com/images/webinar-og.jpg"
380
+ }}
381
+ // Consider noIndex for time-sensitive or conversion-focused pages
382
+ noIndex={false}
383
+ />
384
+ ```
385
+
386
+ ## Integration with I18n
387
+
388
+ Combine `SEOMetaTags` with `I18nMetaTags` for multi-language sites:
389
+
390
+ ```tsx
391
+ import { SEOMetaTags, I18nMetaTags } from 'simple-site-framework/components';
392
+
393
+ export default function Page({ params }: { params: { locale: string } }) {
394
+ return (
395
+ <>
396
+ {/* Page-specific SEO */}
397
+ <SEOMetaTags
398
+ title="Email Marketing Platform | Acme"
399
+ description="Send beautiful email campaigns that convert."
400
+ canonical="https://acme.com/features"
401
+ openGraph={{
402
+ locale: params.locale === 'fr' ? 'fr_FR' : 'en_US',
403
+ alternateLocales: params.locale === 'fr' ? ['en_US'] : ['fr_FR']
404
+ }}
405
+ />
406
+
407
+ {/* Multi-language SEO */}
408
+ <I18nMetaTags
409
+ currentLocale={params.locale}
410
+ pathname="/features"
411
+ baseUrl="https://acme.com"
412
+ />
413
+
414
+ <main>...</main>
415
+ </>
416
+ );
417
+ }
418
+ ```
419
+
420
+ ## Testing Your SEO
421
+
422
+ ### Tools
423
+
424
+ 1. **Google Search Console**: Monitor search performance
425
+ 2. **Facebook Sharing Debugger**: https://developers.facebook.com/tools/debug/
426
+ 3. **Twitter Card Validator**: https://cards-dev.twitter.com/validator
427
+ 4. **LinkedIn Post Inspector**: https://www.linkedin.com/post-inspector/
428
+ 5. **Chrome DevTools**: View generated `<head>` tags
429
+
430
+ ### Checklist
431
+
432
+ - [ ] Every page has unique `title` and `description`
433
+ - [ ] Titles are 50-60 characters
434
+ - [ ] Descriptions are 150-160 characters
435
+ - [ ] Canonical URLs are absolute
436
+ - [ ] Open Graph images are 1200×630+ pixels
437
+ - [ ] Twitter card images are appropriate size
438
+ - [ ] All image URLs are absolute (https://)
439
+ - [ ] Locale tags match your i18n setup
440
+ - [ ] No duplicate meta tags
441
+ - [ ] robots directives are intentional
442
+
443
+ ## Next Steps
444
+
445
+ - **Structured Data**: Add JSON-LD for rich snippets → [STRUCTURED-DATA.md](./STRUCTURED-DATA.md)
446
+ - **Sitemap**: Generate XML sitemap → [SITEMAP.md](./SITEMAP.md)
447
+ - **Performance**: Optimize Core Web Vitals → [PERFORMANCE.md](./PERFORMANCE.md)
448
+ - **Accessibility**: Improve WCAG compliance → [ACCESSIBILITY.md](./ACCESSIBILITY.md)
449
+
450
+ ## Resources
451
+
452
+ - [Google Search Central](https://developers.google.com/search)
453
+ - [Open Graph Protocol](https://ogp.me/)
454
+ - [Twitter Cards Documentation](https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards)
455
+ - [Next.js Metadata API](https://nextjs.org/docs/app/building-your-application/optimizing/metadata)