- 5 templates
+ {stats.templates}{' '}
+ templates
·
- 8 extensions
+ {stats.extensions}{' '}
+ extensions
·
- 9 categories
+ {stats.categories}{' '}
+ categories
·
MIT licensed
diff --git a/src/components/stats-bar.tsx b/src/components/stats-bar.tsx
index 2f9b9b6..df3df01 100644
--- a/src/components/stats-bar.tsx
+++ b/src/components/stats-bar.tsx
@@ -8,7 +8,7 @@ interface Stat {
suffix?: string;
}
-const STATS: Stat[] = [
+const DEFAULT_STATS: Stat[] = [
{ value: 5, label: 'Templates' },
{ value: 12, label: 'Extensions' },
{ value: 9, label: 'Categories' },
@@ -47,11 +47,26 @@ function Counter({ target, duration = 1200 }: { target: number; duration?: numbe
return
{count};
}
-export function StatsBar() {
+export function StatsBar({
+ templates,
+ extensions,
+ categories,
+}: {
+ templates?: number;
+ extensions?: number;
+ categories?: number;
+} = {}) {
+ const stats: Stat[] = [
+ { value: templates ?? (DEFAULT_STATS[0].value as number), label: 'Templates' },
+ { value: extensions ?? (DEFAULT_STATS[1].value as number), label: 'Extensions' },
+ { value: categories ?? (DEFAULT_STATS[2].value as number), label: 'Categories' },
+ { value: 'MIT', label: 'Licensed' },
+ ];
+
return (
- {STATS.map((stat) => (
+ {stats.map((stat) => (
{typeof stat.value === 'number' ? : stat.value}
diff --git a/src/lib/data.ts b/src/lib/data.ts
index 50bddc8..8447a6c 100644
--- a/src/lib/data.ts
+++ b/src/lib/data.ts
@@ -3,6 +3,21 @@ import { type TemplatesData, templatesDataSchema } from './schemas';
const TEMPLATES_URL = 'https://raw.githubusercontent.com/Create-Python-App/cpa-templates/main/templates.json';
+/** Catalog counts for footer / stats bar — single source of truth. */
+export type CatalogStats = {
+ templates: number;
+ extensions: number;
+ categories: number;
+};
+
+export function catalogStatsFrom(data: TemplatesData): CatalogStats {
+ return {
+ templates: data.templates.length,
+ extensions: data.extensions.length,
+ categories: data.categories.length,
+ };
+}
+
export async function getTemplatesData(): Promise {
try {
const response = await fetch(TEMPLATES_URL, { next: { revalidate: 3600 } }); // Revalidate every hour