feat: Add new blog section, marketing landing page, dashboard, SEO documentation, and supporting image assets.

This commit is contained in:
Timo
2026-01-05 22:14:49 +01:00
parent b628930d55
commit 170c2e9c80
26 changed files with 1703 additions and 44 deletions

View File

@@ -109,27 +109,53 @@ export default function DashboardPage() {
];
const blogPosts = [
// NEW POSTS
{
title: 'How to Create a QR Code for Restaurant Menu',
excerpt: 'Step-by-step guide to creating digital menu QR codes for your restaurant. Best practices for touchless menus.',
readTime: '12 Min',
slug: 'qr-code-restaurant-menu',
},
{
title: 'Free vCard QR Code Generator: Digital Business Cards',
excerpt: 'Create professional vCard QR codes for digital business cards. Share contact info instantly.',
readTime: '10 Min',
slug: 'vcard-qr-code-generator',
},
{
title: 'Best QR Code Generator for Small Business',
excerpt: 'Find the best QR code solution for your small business. Compare features, pricing, and use cases.',
readTime: '14 Min',
slug: 'qr-code-small-business',
},
{
title: 'QR Code Print Size Guide',
excerpt: 'Complete guide to QR code print sizes. Minimum dimensions for business cards, posters, and more.',
readTime: '8 Min',
slug: 'qr-code-print-size-guide',
},
// EXISTING POSTS
{
title: 'QR Code Tracking: Complete Guide 2025',
excerpt: 'Learn how to track QR code scans with real-time analytics. Compare free vs paid tracking tools, setup Google Analytics, and measure ROI.',
excerpt: 'Learn how to track QR code scans with real-time analytics. Compare free vs paid tracking tools.',
readTime: '12 Min',
slug: 'qr-code-tracking-guide-2025',
},
{
title: 'Dynamic vs Static QR Codes: Which Should You Use?',
excerpt: 'Understand the difference between static and dynamic QR codes. Learn when to use each type, pros/cons, and how dynamic QR codes save money.',
excerpt: 'Understand the difference between static and dynamic QR codes. Pros, cons, and when to use each.',
readTime: '10 Min',
slug: 'dynamic-vs-static-qr-codes',
},
{
title: 'How to Generate Bulk QR Codes from Excel',
excerpt: 'Generate hundreds of QR codes from Excel or CSV files in minutes. Step-by-step guide with templates, best practices, and free tools.',
excerpt: 'Generate hundreds of QR codes from Excel or CSV files in minutes. Step-by-step guide.',
readTime: '13 Min',
slug: 'bulk-qr-code-generator-excel',
},
{
title: 'QR Code Analytics: Track, Measure & Optimize Campaigns',
excerpt: 'Learn how to leverage scan analytics, campaign tracking, and dashboard insights to maximize QR code ROI.',
title: 'QR Code Analytics: Track, Measure & Optimize',
excerpt: 'Learn how to leverage scan analytics and dashboard insights to maximize QR code ROI.',
readTime: '15 Min',
slug: 'qr-code-analytics',
},
@@ -433,29 +459,31 @@ export default function DashboardPage() {
)}
</div>
{/* Blog & Resources */}
{/* Blog & Resources - Horizontal Scroll */}
<div>
<h2 className="text-xl font-semibold text-gray-900 mb-6">{t('dashboard.blog_resources')}</h2>
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
{blogPosts.map((post) => (
<Card key={post.slug} hover>
<CardHeader>
<div className="flex items-center justify-between mb-2">
<Badge variant="info">{post.readTime}</Badge>
</div>
<CardTitle className="text-lg">{post.title}</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-600 text-sm">{post.excerpt}</p>
<Link
href={`/blog/${post.slug}`}
className="text-primary-600 hover:text-primary-700 text-sm font-medium mt-3 inline-block"
>
Read more
</Link>
</CardContent>
</Card>
))}
<div className="overflow-x-auto pb-4 -mx-4 px-4">
<div className="flex gap-6" style={{ minWidth: 'max-content' }}>
{blogPosts.map((post) => (
<Card key={post.slug} hover className="flex-shrink-0" style={{ width: '300px' }}>
<CardHeader>
<div className="flex items-center justify-between mb-2">
<Badge variant="info">{post.readTime}</Badge>
</div>
<CardTitle className="text-lg line-clamp-2">{post.title}</CardTitle>
</CardHeader>
<CardContent>
<p className="text-gray-600 text-sm line-clamp-2">{post.excerpt}</p>
<Link
href={`/blog/${post.slug}`}
className="text-primary-600 hover:text-primary-700 text-sm font-medium mt-3 inline-block"
>
Read more
</Link>
</CardContent>
</Card>
))}
</div>
</div>
</div>