feat: merge Bluesky thread replies into webmention replies section
Build & Deploy / build-and-deploy (push) Failing after 1m29s

This commit is contained in:
svemagie
2026-04-20 17:25:39 +02:00
parent 4ca6c36bb3
commit 9c8fb2a341
+53 -10
View File
@@ -110,15 +110,30 @@
</div>
{% endif %}
{# Replies #}
{% set replies = mentions | webmentionsByType('replies') %}
{% if replies.length %}
<div class="webmention-replies">
<h3 class="text-sm font-semibold text-surface-600 dark:text-surface-400 uppercase tracking-wide mb-4">
{{ replies.length }} Repl{% if replies.length != 1 %}ies{% else %}y{% endif %}
{# Replies — webmention replies merged with Bluesky thread (deduplicated) #}
{% set wm_replies = mentions | webmentionsByType('replies') %}
{% set bskySyndUrl = "" %}
{% if syndication %}
{% for url in syndication %}
{% if "bsky.app" in url %}{% set bskySyndUrl = url %}{% endif %}
{% endfor %}
{% endif %}
{# Filter out Bluesky-sourced webmention replies when a direct thread is available #}
{% set filtered_replies = [] %}
{% for reply in wm_replies %}
{% set src = reply['wm-source'] | default('') %}
{% if not bskySyndUrl or ('bsky.app' not in src and 'brid.gy' not in src and 'bridgy' not in src) %}
{% set filtered_replies = (filtered_replies.push(reply), filtered_replies) %}
{% endif %}
{% endfor %}
{% if filtered_replies.length or bskySyndUrl %}
<div class="webmention-replies"{% if bskySyndUrl %} x-data="bskyThread('{{ bskySyndUrl }}')"{% endif %}>
<h3 class="text-sm font-semibold text-surface-600 dark:text-surface-400 uppercase tracking-wide mb-4"
{% if bskySyndUrl %}x-text="`${{{ filtered_replies.length }} + replies.length} Repl${({{ filtered_replies.length }} + replies.length) !== 1 ? 'ies' : 'y'}`"{% endif %}>
{% if not bskySyndUrl %}{{ filtered_replies.length }} Repl{% if filtered_replies.length != 1 %}ies{% else %}y{% endif %}{% endif %}
</h3>
<ul class="space-y-4">
{% for reply in replies %}
{% for reply in filtered_replies %}
<li class="p-4 bg-surface-50 dark:bg-surface-800 rounded-lg border border-surface-200 dark:border-surface-700 shadow-sm"
data-wm-url="{{ reply.url }}"
data-wm-source="{{ reply['wm-source'] if reply['wm-source'] else '' }}"
@@ -173,6 +188,37 @@
<div class="wm-owner-reply-slot ml-13 mt-2"></div>
</li>
{% endfor %}
{% if bskySyndUrl %}
<template x-for="reply in replies" :key="reply.uri">
<li class="p-4 bg-surface-50 dark:bg-surface-800 rounded-lg border border-surface-200 dark:border-surface-700 shadow-sm"
:class="reply.depth > 0 ? 'ml-4 sm:ml-8' : ''">
<div class="flex gap-3">
<a :href="reply.author.url" target="_blank" rel="noopener" class="flex-shrink-0">
<img :src="reply.author.avatar || '/images/default-avatar.svg'"
:alt="reply.author.name"
class="w-10 h-10 rounded-full"
loading="lazy">
</a>
<div class="flex-1 min-w-0">
<div class="flex items-center gap-2 mb-1 flex-wrap">
<a :href="reply.author.url"
class="font-semibold text-surface-900 dark:text-surface-100 hover:underline"
target="_blank" rel="noopener"
x-text="reply.author.name"></a>
<span class="wm-provenance-badge" data-source="bluesky"></span>
<a :href="reply.url"
class="text-xs text-surface-600 dark:text-surface-400 hover:underline"
target="_blank" rel="noopener">
<time :datetime="reply.published" x-text="formatDate(reply.published)"></time>
</a>
</div>
<div class="text-surface-700 dark:text-surface-300 prose dark:prose-invert prose-sm max-w-none"
x-text="reply.text"></div>
</div>
</div>
</li>
</template>
{% endif %}
</ul>
</div>
{% endif %}
@@ -201,9 +247,6 @@
</section>
{% endif %}
{# Bluesky Thread — AT Protocol replies from syndicated post #}
{% include "components/bluesky-thread.njk" %}
{# Webmention send form — collapsed by default #}
<details class="webmention-form mt-8">
<summary class="text-sm font-semibold text-surface-600 dark:text-surface-400 cursor-pointer hover:text-surface-700 dark:hover:text-surface-300 transition-colors list-none [&::-webkit-details-marker]:hidden flex items-center gap-1.5">