Skip to content

Commit a320046

Browse files
committed
added blog and minor fixes
1 parent 751c4e0 commit a320046

14 files changed

+417
-73
lines changed

bun.lockb

2.5 KB
Binary file not shown.

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
"format": "prettier . --write"
1313
},
1414
"dependencies": {
15-
"@astrojs/mdx": "^3.1.5",
15+
"@astrojs/mdx": "3.1.7",
1616
"@astrojs/react": "^3.6.2",
1717
"@astrojs/sitemap": "^3.1.6",
18-
"@astrojs/tailwind": "^5.1.0",
18+
"@astrojs/tailwind": "5.1.1",
1919
"@fontsource-variable/bricolage-grotesque": "^5.0.7",
2020
"@fontsource-variable/inter": "^5.0.20",
2121
"@iconify-json/bx": "^1.2.0",
@@ -26,7 +26,7 @@
2626
"@tailwindcss/typography": "^0.5.15",
2727
"@types/react": "^18.3.5",
2828
"@types/react-dom": "^18.3.0",
29-
"astro": "^4.15.2",
29+
"astro": "4.15.8",
3030
"astro-icon": "^1.1.1",
3131
"astro-navbar": "^2.3.3",
3232
"astro-seo": "^0.8.4",

src/components/SoftwareListing.tsx

+54-52
Original file line numberDiff line numberDiff line change
@@ -193,62 +193,64 @@ const SoftwareListing = ({ softwareEntries }: { softwareEntries: any[] }) => {
193193
</div>
194194
</div>
195195
</div>
196-
<ul className="grid lg:grid-cols-3 md:grid-cols-2 grid-cols-1 gap-10 mx-auto px-4">
196+
<div className="grid lg:grid-cols-3 md:grid-cols-2 grid-cols-1 gap-10 mx-auto px-4">
197197
{filteredEntries.map((toolName: any, index: number) => (
198-
<Card
199-
key={toolName.id}
200-
className="h-full hover:shadow-md group shadow transition-all duration-300 mb-1 overflow-hidden">
201-
<img
202-
src={toolName.data.Images[0]}
203-
alt={toolName.data.Name}
204-
sizes="(max-width: 800px) 100vw, 800px"
205-
width={800}
206-
height={300}
207-
loading={index <= 2 ? "eager" : "lazy"}
208-
decoding={index <= 2 ? "sync" : "async"}
209-
className="w-full h-52 rounded-md group-hover:scale-105 transition-all duration-300 object-cover object-center bg-white"
210-
/>
211-
<CardContent className="mt-4">
212-
<div className="flex justify-between">
213-
<span className="text-blue-600 dark:text-blue-500 bg-blue-100 dark:bg-blue-500/15 py-1 px-3 rounded-full text-sm">
214-
{toolName.data.Category}
215-
</span>
216-
<span
217-
className={cn(
218-
"py-1 px-3 rounded-full text-sm",
219-
toolName.data.pricing === "Free"
220-
? "text-green-600 bg-green-100/70 dark:bg-green-900/25"
221-
: toolName.data.pricing === "Paid plans"
222-
? "text-red-600 bg-red-100/70 dark:bg-red-900/25"
223-
: "text-yellow-600 bg-yellow-100/70 dark:bg-yellow-900/25",
224-
)}>
225-
{toolName.data.pricing}
226-
</span>
227-
</div>
228-
<h2 className="text-3xl font-semibold leading-snug tracking-tight mt-1">
229-
{toolName.data.Name}
230-
</h2>
198+
<a href={"/software/" + toolName.id}>
199+
<Card
200+
key={toolName.id}
201+
className="h-full flex flex-col hover:shadow-md group shadow transition-all duration-300 mb-1 overflow-hidden">
202+
<img
203+
src={toolName.data.Images[0]}
204+
alt={toolName.data.Name}
205+
sizes="(max-width: 800px) 100vw, 800px"
206+
width={800}
207+
height={300}
208+
loading={index <= 2 ? "eager" : "lazy"}
209+
decoding={index <= 2 ? "sync" : "async"}
210+
className="w-full h-52 rounded-md group-hover:scale-105 transition-all duration-300 object-cover object-center bg-white"
211+
/>
212+
<CardContent className="mt-4 flex-1">
213+
<div className="flex justify-between">
214+
<span className="text-blue-600 dark:text-blue-500 bg-blue-100 dark:bg-blue-500/15 py-1 px-3 rounded-full text-sm">
215+
{toolName.data.Category}
216+
</span>
217+
<span
218+
className={cn(
219+
"py-1 px-3 rounded-full text-sm",
220+
toolName.data.pricing === "Free"
221+
? "text-green-600 bg-green-100/70 dark:bg-green-900/25"
222+
: toolName.data.pricing === "Paid plans"
223+
? "text-red-600 bg-red-100/70 dark:bg-red-900/25"
224+
: "text-yellow-600 bg-yellow-100/70 dark:bg-yellow-900/25",
225+
)}>
226+
{toolName.data.pricing}
227+
</span>
228+
</div>
229+
<h2 className="text-3xl font-semibold leading-snug tracking-tight mt-1">
230+
{toolName.data.Name}
231+
</h2>
231232

232-
<span className="text-muted-foreground line-clamp-3">
233-
{toolName.data.Description}
234-
</span>
233+
<span className="text-muted-foreground line-clamp-3">
234+
{toolName.data.Description}
235+
</span>
235236

236-
<ul className="flex gap-3 flex-wrap mt-4 mb-2">
237-
{toolName.data.Tags.map((tag: string) => (
238-
<li key={tag} className="text-xs text-muted-foreground/75">
239-
#{tag}
240-
</li>
241-
))}
242-
</ul>
243-
</CardContent>
244-
<CardFooter className="flex justify-between">
245-
<Button asChild>
246-
<a href={`/software/${toolName.id}`}>More Details</a>
247-
</Button>
248-
</CardFooter>
249-
</Card>
237+
<ul className="flex gap-3 flex-wrap mt-4 mb-2">
238+
{toolName.data.Tags.map((tag: string) => (
239+
<li key={tag} className="text-xs text-muted-foreground/75">
240+
#{tag}
241+
</li>
242+
))}
243+
</ul>
244+
</CardContent>
245+
<CardFooter className="flex">
246+
<Button asChild>
247+
<a href={`/software/${toolName.id}`}>More Details</a>
248+
</Button>
249+
</CardFooter>
250+
</Card>
251+
</a>
250252
))}
251-
</ul>
253+
</div>
252254
</main>
253255
);
254256
};

src/components/navbar/navbar.astro

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ const menuitems = [
2525
path: "/about",
2626
},
2727
{
28-
title: "Guest Posts",
29-
path: "/guestposts",
28+
title: "Blogs",
29+
path: "/blogs",
3030
},
3131
];
3232
---
+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
---
2+
title: How to Do Developer Marketing
3+
description: How to Developer Marketing
4+
pubDate: "2024-09-18T00:00:00+05:30"
5+
heroImage: "/opengraph.png"
6+
author: "Anish"
7+
---
8+
9+
# How to Develop a Marketing Strategy
10+
11+
Developing a marketing strategy is crucial for any business seeking to reach and engage its target audience, drive sales, and ultimately achieve its goals. A well-crafted marketing strategy helps you understand your customers, differentiate your brand, and make informed decisions about resource allocation.
12+
13+
### I. Identify Your Target Audience
14+
15+
Understanding your ideal customer is the foundation of an effective marketing strategy.
16+
17+
#### 1. Conduct Market Research
18+
19+
- Analyze demographics, needs, preferences, and pain points
20+
- Use surveys, focus groups, and online analytics tools
21+
22+
#### 2. Create Buyer Personas
23+
24+
- Develop detailed profiles of your ideal customers
25+
- Outline their goals, challenges, and behaviors
26+
27+
### II. Define Your Unique Value Proposition (UVP)
28+
29+
Clearly articulate your brand's unique benefits and differentiators.
30+
31+
#### 1. Identify Key Competitors
32+
33+
- Research their strengths, weaknesses, and market positioning
34+
35+
#### 2. Craft Your UVP Statement
36+
37+
- Concise, compelling, and differentiated messaging
38+
39+
### III. Set Marketing Objectives
40+
41+
Establish specific, measurable, achievable, relevant, and time-bound (SMART) goals.
42+
43+
#### 1. Define Key Performance Indicators (KPIs)
44+
45+
- Website traffic, social media engagement, lead generation, conversion rates
46+
47+
#### 2. Align Objectives with Business Goals
48+
49+
- Revenue growth, market share increase, brand awareness
50+
51+
### IV. Choose Marketing Channels
52+
53+
Select the most effective channels to reach your target audience.
54+
55+
#### 1. Digital Marketing
56+
57+
- Social media, email, search engine optimization (SEO), paid advertising
58+
59+
#### 2. Traditional Marketing
60+
61+
- Print, radio, television, event marketing
62+
63+
### V. Develop a Content Strategy
64+
65+
Create valuable, relevant, and consistent content.
66+
67+
#### 1. Content Types
68+
69+
- Blog posts, videos, podcasts, infographics, eBooks
70+
71+
#### 2. Content Calendar
72+
73+
- Plan and schedule content in advance
74+
75+
### VI. Measure and Optimize
76+
77+
Continuously monitor and improve your marketing strategy.
78+
79+
#### 1. Track KPIs
80+
81+
- Use analytics tools to monitor performance
82+
83+
#### 2. Adjust and Refine
84+
85+
- Based on data-driven insights and customer feedback
86+
87+
### Conclusion
88+
89+
Developing a marketing strategy requires ongoing effort and refinement. By following these steps, you'll be well on your way to creating a tailored plan that drives business success.

src/content/config.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
// 1. Import utilities from `astro:content`
21
import { z, defineCollection } from "astro:content";
32

4-
// 2. Define your collection(s)
53
const softwareCollection = defineCollection({
64
type: "data",
75
schema: z.object({
@@ -33,19 +31,32 @@ const softwareCollection = defineCollection({
3331
}),
3432
});
3533

34+
const blogCollection = defineCollection({
35+
type: "content",
36+
schema: z.object({
37+
title: z.string(),
38+
description: z.string(),
39+
author: z.string(),
40+
pubDate: z.coerce.date(),
41+
heroImage: z.string(),
42+
}),
43+
});
44+
3645
const teamCollection = defineCollection({
46+
type: "content",
3747
schema: z.object({
3848
name: z.string(),
3949
link: z.string().url(),
4050
title: z.string(),
4151
avatar: z.object({
4252
src: z.string(),
4353
alt: z.string(),
44-
})
54+
}),
4555
}),
4656
});
4757

4858
export const collections = {
4959
software: softwareCollection,
5060
team: teamCollection,
61+
blog: blogCollection,
5162
};

src/pages/blogs/[slug].astro

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
import { getCollection } from "astro:content";
3+
import Layout from "@layouts/Layout.astro";
4+
import Container from "@components/container.astro";
5+
6+
export async function getStaticPaths() {
7+
const blogEntries = await getCollection("blogs");
8+
return blogEntries.map((entry: any) => ({
9+
params: { slug: entry.slug },
10+
props: { entry },
11+
}));
12+
}
13+
14+
const { entry } = Astro.props;
15+
const { Content } = await entry.render();
16+
console.log(entry);
17+
---
18+
19+
<Layout title={entry.data.title}>
20+
<Container>
21+
<Content />
22+
</Container>
23+
</Layout>

0 commit comments

Comments
 (0)