Skip to content

Commit 4afcb85

Browse files
Add comprehensive SEO lander templates to all 17 tool pages
- Created modular ToolPageTemplate system with 6 sections: video, FAQ, about formats, changelog, blog, and tools link hub - Added ToolCard component with random color border hover effects - Centralized all tool content in config/tool-content.ts (2600+ lines of SEO content) - Updated all tool pages to use new template system - Reduced hero section spacing for better UX - Added comprehensive content for: CSV Combiner, JSON to CSV, Character Counter, HEIC/PDF/WebP/JPEG/GIF/JPG/AVIF/JFIF converters 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 3afe08f commit 4afcb85

File tree

29 files changed

+3045
-1368
lines changed

29 files changed

+3045
-1368
lines changed

.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,12 @@ next-env.d.ts
3939
.codersinflow
4040
.vscode
4141
.env
42+
43+
# Coders in Flow
44+
.venv
45+
.codex
46+
out
47+
dist
48+
*.vsix
49+
.claude
50+
CLAUDE.md

app/page.tsx

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import { useState } from "react";
44
import { Navbar } from "@/components/Navbar";
55
import { Button } from "@/components/ui/button";
6-
import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
76
import { Badge } from "@/components/ui/badge";
87
import { Input } from "@/components/ui/input";
8+
import { ToolCard } from "@/components/ToolCard";
99
import {
1010
Search,
1111
FileText,
@@ -22,7 +22,6 @@ import {
2222
Image,
2323
FileImage
2424
} from "lucide-react";
25-
import Link from "next/link";
2625

2726
// Define tool categories
2827
const categories = [
@@ -305,26 +304,9 @@ export default function HomePage() {
305304

306305
{/* Tools Grid */}
307306
<div className="grid gap-5 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
308-
{filteredTools.map((tool) => {
309-
const Icon = tool.icon;
310-
return (
311-
<Link key={tool.id} href={tool.href}>
312-
<Card className="group h-full transition-all hover:shadow-lg hover:-translate-y-1 cursor-pointer">
313-
<CardHeader>
314-
<div className="flex items-start gap-3 mb-2">
315-
<Icon className="h-6 w-6 text-primary mt-0.5" />
316-
<CardTitle className="text-lg group-hover:text-primary transition-colors">
317-
{tool.name}
318-
</CardTitle>
319-
</div>
320-
<CardDescription className="line-clamp-2">
321-
{tool.description}
322-
</CardDescription>
323-
</CardHeader>
324-
</Card>
325-
</Link>
326-
);
327-
})}
307+
{filteredTools.map((tool) => (
308+
<ToolCard key={tool.id} tool={tool} />
309+
))}
328310
</div>
329311

330312
{filteredTools.length === 0 && (

app/tools/avif-to-png/page.tsx

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
"use client";
22

3-
import HeroConverter from "@/components/HeroConverter";
4-
import { Navbar } from "@/components/Navbar";
3+
import ToolPageTemplate from "@/components/ToolPageTemplate";
4+
import { toolContent } from "@/config/tool-content";
55

66
export default function Page() {
7+
const content = toolContent["avif-to-png"];
8+
9+
if (!content) {
10+
return <div>Tool not found</div>;
11+
}
12+
713
return (
8-
<>
9-
<Navbar />
10-
<main className="min-h-screen bg-background">
11-
<HeroConverter title="AVIF to PNG" subtitle="No upload. Just convert and download." from="avif" to="png" />
12-
</main>
13-
</>
14+
<ToolPageTemplate
15+
tool={content.tool}
16+
videoSection={content.videoSection}
17+
faqs={content.faqs}
18+
aboutSection={content.aboutSection}
19+
changelog={content.changelog}
20+
relatedTools={content.relatedTools}
21+
blogPosts={content.blogPosts}
22+
/>
1423
);
1524
}

0 commit comments

Comments
 (0)