From 777b1065a92044723d3324e5676c79e7cc886bfd Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Sun, 3 May 2026 18:57:00 -0400 Subject: [PATCH 01/12] fix: make the medal badges circles --- app/pages/leaderboard/likes.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index 63208cfbce..ce16813173 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -119,7 +119,7 @@ function formatCompactStat(value: number | null): string | null {
  • #{{ rank }} @@ -170,7 +170,7 @@ function formatCompactStat(value: number | null): string | null { >
    #{{ rank }} @@ -282,7 +282,7 @@ function formatCompactStat(value: number | null): string | null {
  • #{{ entry.rank }} @@ -377,7 +377,7 @@ function formatCompactStat(value: number | null): string | null { >
    #{{ entry.rank }} From 07af261eed3b8ddf39d2b1c7b683a08924b356a9 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Sun, 3 May 2026 18:58:01 -0400 Subject: [PATCH 02/12] fix: mute the likes count --- app/pages/leaderboard/likes.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index ce16813173..bbbd28a5de 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -255,7 +255,7 @@ function formatCompactStat(value: number | null): string | null {
    -

    +

    {{ $t('leaderboard.likes.likes') }}

    @@ -551,7 +551,7 @@ function formatCompactStat(value: number | null): string | null {
    -

    +

    {{ $t('leaderboard.likes.likes') }}

    From d3212f3a4ed3f0c9c40d3392e9138b0cb0f143c0 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Sun, 3 May 2026 18:58:27 -0400 Subject: [PATCH 03/12] fix: fix style issues when no image is available --- app/pages/leaderboard/likes.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index bbbd28a5de..17806c31cb 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -479,11 +479,11 @@ function formatCompactStat(value: number | null): string | null { #{{ entry.rank }}

    Date: Sun, 3 May 2026 19:01:24 -0400 Subject: [PATCH 04/12] fix: add rounded corners to 4-10 package logos --- app/pages/leaderboard/likes.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index 17806c31cb..e280f361af 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -489,7 +489,7 @@ function formatCompactStat(value: number | null): string | null { loading="lazy" :width="entry.homepageLogoWidth ?? undefined" :height="entry.homepageLogoHeight ?? undefined" - class="max-h-full max-w-full object-contain" + class="max-h-full max-w-full rounded-sm object-contain" />

    @@ -506,7 +506,7 @@ function formatCompactStat(value: number | null): string | null { loading="lazy" :width="entry.homepageLogoWidth ?? undefined" :height="entry.homepageLogoHeight ?? undefined" - class="max-h-full max-w-full object-contain" + class="max-h-full max-w-full rounded-sm object-contain" />
    From a70f897e168dd2d39f181f974e61fac92a5d058b Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Wed, 6 May 2026 21:09:46 -0400 Subject: [PATCH 05/12] fix: improve mobile likes podium layout --- app/pages/leaderboard/likes.vue | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index e280f361af..f900d42aaa 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -79,6 +79,15 @@ function getPodiumItemClass(rank: number): string { } } +function getResponsivePodiumItemClass(rank: number): string { + switch (rank) { + case 1: + return 'md:col-span-2' + default: + return 'md:max-w-none' + } +} + function getPodiumCardClass(rank: number): string { switch (rank) { case 1: @@ -163,10 +172,10 @@ function formatCompactStat(value: number | null): string | null { class="hidden list-none m-0 gap-4 p-0 pb-4 lg:grid lg:grid-cols-[minmax(0,0.96fr)_minmax(0,1.08fr)_minmax(0,0.96fr)] lg:items-end lg:gap-6 lg:pb-16" >
  • Date: Wed, 6 May 2026 21:12:32 -0400 Subject: [PATCH 06/12] fix: cache likes leaderboard API with ISR --- nuxt.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 13b4bbeb4a..17ac34033f 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -141,10 +141,10 @@ export default defineNuxtConfig({ '/oauth-client-metadata.json': { prerender: true }, '/.well-known/jwks.json': { prerender: true }, '/.well-known/site.standard.publication': { prerender: true }, + '/api/leaderboard/likes': { isr: 900 }, // never cache '/api/auth/**': { isr: false, cache: false }, '/api/social/**': { isr: false, cache: false }, - '/api/leaderboard/likes': { isr: false, cache: false }, '/api/atproto/bluesky-comments': { isr: { expiration: 60 * 60 /* one hour */, From 1ca54b1ac62833c02d7c90de570d4f122c8ce9d1 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Wed, 6 May 2026 21:16:38 -0400 Subject: [PATCH 07/12] fix: polish likes leaderboard loading and card layout - Move leaderboard fetch to SSR data - Add staggered entry animation - Fill the 1-3 card banners - Tighten the podium card body layout and likes count alignment --- app/pages/leaderboard/likes.vue | 472 +++++++++++--------------------- 1 file changed, 160 insertions(+), 312 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index f900d42aaa..a70839ae93 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -12,31 +12,10 @@ useSeoMeta({ const compactNumberFormatter = useCompactNumberFormatter() -const { data: leaderboardEntries, status: leaderboardStatus } = useFetch( - '/api/leaderboard/likes', - { - default: () => [], - server: false, - }, -) - -const hasResolvedLeaderboardRequest = shallowRef(false) - -// Only show the skeleton for the first unresolved request. If this fetch runs -// again after content is already on screen, keep the current UI to avoid -// collapsing back to placeholders and causing layout shift. -watchEffect(() => { - if (leaderboardStatus.value === 'success' || leaderboardStatus.value === 'error') { - hasResolvedLeaderboardRequest.value = true - } +const { data: leaderboardEntries } = useFetch('/api/leaderboard/likes', { + default: () => [], }) -const isLoadingLeaderboard = computed( - () => - !hasResolvedLeaderboardRequest.value && - (leaderboardStatus.value === 'pending' || leaderboardStatus.value === 'idle'), -) - const highlightedEntries = computed(() => leaderboardEntries.value.slice(0, 3)) const remainingEntries = computed(() => leaderboardEntries.value.slice(3)) @@ -101,6 +80,12 @@ function formatCompactStat(value: number | null): string | null { if (value == null) return null return compactNumberFormatter.value.format(value) } + +function getEntryAnimationStyle(index: number): Record { + return { + animationDelay: `${Math.min(index * 60, 420)}ms`, + } +} + + From ef94bb1736804fed28fe113089814526ff192bc1 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Thu, 7 May 2026 07:06:42 -0400 Subject: [PATCH 10/12] fix: try a less subtle entry animation --- app/pages/leaderboard/likes.vue | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index 9ebb641754..41a1aee0c6 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -83,7 +83,7 @@ function formatCompactStat(value: number | null): string | null { function getEntryAnimationStyle(index: number): Record { return { - animationDelay: `${Math.min(index * 60, 420)}ms`, + animationDelay: `${Math.min(index * 100, 600)}ms`, } } @@ -431,22 +431,33 @@ function getEntryAnimationStyle(index: number): Record { From b216bbb5bff5768d1f3adadd280b399f1fc3fe3a Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Thu, 7 May 2026 21:47:04 -0400 Subject: [PATCH 11/12] fix: defer entry animations until initial render --- app/pages/leaderboard/likes.vue | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index 41a1aee0c6..d62b1b98d7 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -16,9 +16,14 @@ const { data: leaderboardEntries } = useFetch('/api/lea default: () => [], }) +const shouldAnimateEntries = ref(false) const highlightedEntries = computed(() => leaderboardEntries.value.slice(0, 3)) const remainingEntries = computed(() => leaderboardEntries.value.slice(3)) +onMounted(() => { + shouldAnimateEntries.value = true +}) + function getPreviewFallbackClass(rank: number): string { switch (rank) { case 1: @@ -126,7 +131,8 @@ function getEntryAnimationStyle(index: number): Record { :class="getResponsivePodiumItemClass(entry.rank)" >
  • Date: Thu, 7 May 2026 21:57:18 -0400 Subject: [PATCH 12/12] fix: improve keyboard focus styles for podium cards --- app/pages/leaderboard/likes.vue | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/app/pages/leaderboard/likes.vue b/app/pages/leaderboard/likes.vue index d62b1b98d7..60e309c294 100644 --- a/app/pages/leaderboard/likes.vue +++ b/app/pages/leaderboard/likes.vue @@ -146,10 +146,10 @@ function getEntryAnimationStyle(index: number): Record {
    @@ -247,10 +247,10 @@ function getEntryAnimationStyle(index: number): Record {
    @@ -334,9 +334,11 @@ function getEntryAnimationStyle(index: number): Record { > - +