diff --git a/src/lib/cards/index.ts b/src/lib/cards/index.ts
index 708d743..7e3b663 100644
--- a/src/lib/cards/index.ts
+++ b/src/lib/cards/index.ts
@@ -41,6 +41,7 @@ import { GitHubContributorsCardDefinition } from './social/GitHubContributorsCar
import { ProductHuntCardDefinition } from './social/ProductHuntCard';
import { KickstarterCardDefinition } from './social/KickstarterCard';
import { NpmxLikesCardDefinition } from './social/NpmxLikesCard';
+import { NpmxLikesLeaderboardCardDefinition } from './social/NpmxLikesLeaderboardCard';
// import { Model3DCardDefinition } from './visual/Model3DCard';
export const AllCardDefinitions = [
@@ -86,7 +87,8 @@ export const AllCardDefinitions = [
GitHubContributorsCardDefinition,
ProductHuntCardDefinition,
KickstarterCardDefinition,
- NpmxLikesCardDefinition
+ NpmxLikesCardDefinition,
+ NpmxLikesLeaderboardCardDefinition
] as const;
export const CardDefinitionsByType = AllCardDefinitions.reduce(
diff --git a/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte b/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte
new file mode 100644
index 0000000..c7e3b6e
--- /dev/null
+++ b/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte
@@ -0,0 +1,116 @@
+
+
+{#snippet leaderboardRow(entry: LeaderboardEntry, index: number)}
+
+
+ #{index + 1}
+
+
+
+
+ {getPackageName(entry)}
+
+
+
+ {entry.totalLikes}
+
+
+
+
+{/snippet}
+
+
+ {#if leaderboard && leaderboard.leaderBoard.length > 0}
+
+
+
+ {leaderboard.totalLikes} likes
+ ·
+ {leaderboard.totalUniqueLikers} unique likers
+
+ {:else if leaderboard}
+
+ No leaderboard data.
+
+ {:else}
+
+ Loading leaderboard...
+
+ {/if}
+
diff --git a/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts b/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts
new file mode 100644
index 0000000..167ab1f
--- /dev/null
+++ b/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts
@@ -0,0 +1,26 @@
+import type { CardDefinition } from '../../types';
+import NpmxLikesLeaderboardCard from './NpmxLikesLeaderboardCard.svelte';
+
+export const NpmxLikesLeaderboardCardDefinition = {
+ type: 'npmxLikesLeaderboard',
+ contentComponent: NpmxLikesLeaderboardCard,
+ createNew: (card) => {
+ card.w = 4;
+ card.mobileW = 8;
+ card.h = 4;
+ card.mobileH = 6;
+ },
+ loadData: async () => {
+ const res = await fetch('https://blento.app/api/npmx-leaderboard');
+ const data = await res.json();
+ return data;
+ },
+ minW: 3,
+ canHaveLabel: true,
+
+ keywords: ['npm', 'package', 'npmx', 'likes', 'leaderboard', 'ranking'],
+ name: 'npmx Likes Leaderboard',
+
+ //groups: ['Social'],
+ icon: ``
+} as CardDefinition & { type: 'npmxLikesLeaderboard' };
diff --git a/src/routes/api/npmx-leaderboard/+server.ts b/src/routes/api/npmx-leaderboard/+server.ts
index 52456a6..068e80c 100644
--- a/src/routes/api/npmx-leaderboard/+server.ts
+++ b/src/routes/api/npmx-leaderboard/+server.ts
@@ -2,7 +2,7 @@ import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
const LEADERBOARD_API_URL =
- 'https://npmx-likes-leaderboard-api-production.up.railway.app/api/leaderboard/likes';
+ 'https://npmx-likes-leaderboard-api-production.up.railway.app/api/leaderboard/likes?limit=20';
export const GET: RequestHandler = async ({ platform }) => {
const cacheKey = '#npmx-leaderboard:likes';