templates/_entry_pane.html
Rama main · réplica de lectura del repositorio original.
<section class="pane pane-entry"
{%- if selected_entry and selected_entry.video_id %} data-own-video-id="{{ selected_entry.video_id }}"{% endif %}>
{% if selected_entry %}
<div class="entry-pane-header">
<div class="entry-pane-title-row">
<h2
class="entry-pane-title"
data-post-feed-url="{{ selected_entry.feed_url }}"
data-post-entry-id="{{ selected_entry.id }}"
data-post-read="{{ 1 if selected_entry.read else 0 }}"
data-post-captured="{{ 1 if selected_entry.captured else 0 }}"
data-post-saved="{{ 1 if selected_entry.saved else 0 }}"
data-post-kept="{{ 1 if selected_entry.kept else 0 }}"
data-post-link="{{ selected_entry.link or '' }}"
data-post-title="{{ selected_entry.title or '' }}"
data-post-folder-id="{{ feed_to_folder.get(selected_entry.feed_url, selected_folder_id) }}"
{# Orphan archives (feed fully unsubscribed) have no home in the Feeds
tree at all — "Open in Feeds" would land on an empty page. #}
data-post-orphan="{{ 1 if selected_entry.is_orphan_archive else 0 }}"
data-post-lead-image-url="{{ (selected_entry.lead_image_url or '') if (selected_entry.show_as_thumb and selected_entry.sync_list_thumb and not selected_entry.is_locked) else '' }}"
data-post-katex-dollar-math="{{ 1 if selected_entry.katex_dollar_math else 0 }}"
>
{% set _dur = selected_entry.duration_display %}
{% set _title_text = selected_entry.title_plain or selected_entry.title or "(untitled)" %}
{% set _display_title = ("[" ~ _dur ~ "] " ~ _title_text) if _dur else _title_text %}
{# title_html renders the feed's inline formatting; the title= attribute
and every other plain context use the tag-stripped text. #}
{% set _title_markup = selected_entry.title_html or (selected_entry.title or "(untitled)") %}
{% set _display_markup = (("[" ~ _dur ~ "] ") | e ~ _title_markup) if _dur else _title_markup %}
{# The title is the way out to the article itself. Opens in a new tab:
nothing outside Lectio should replace the Lectio tab, and on a phone
this replaces the open-in-new-tab glyph entirely. #}
{% if selected_entry.link %}<a
class="entry-pane-title-link"
href="{{ selected_entry.link }}"
target="_blank"
rel="noopener noreferrer"
title="{{ _display_title }}"
>{{ _display_markup | safe }}</a
>{% else %}<span class="entry-pane-title-link"
title="{{ _display_title }}"
>{{ _display_markup | safe }}</span
>{% endif %}
</h2>
</div>
<div class="entry-pane-bottom-row">
<div class="entry-meta entry-pane-meta">
<span class="entry-meta-left">
{% if selected_entry.feed_icon_url %}<img
class="feed-favicon"
src="{{ selected_entry.feed_icon_url }}"
onerror="this.style.display = 'none'"
/>{% endif %}
{% set entry_feed_folder_id = feed_to_folder.get(selected_entry.feed_url, selected_folder_id) %}
<a
class="entry-feed-link"
data-feed-url="{{ selected_entry.feed_url }}"
data-folder-id="{{ entry_feed_folder_id }}"
href="/?folder_id={{ entry_feed_folder_id }}&list_feed_url={{ selected_entry.feed_url | urlencode }}&sort_by={{ selected_sort_by }}&sort_dir={{ selected_sort_dir }}&read_filter={{ selected_read_filter }}{% if selected_star_only %}&star_only=1{% else %}&star_only=0{% endif %}&resume_read_filter={{ selected_resume_read_filter }}"
>{{ selected_entry.feed_title }}</a
>{% if selected_entry.feed_url in unsubscribed_feed_urls %}<span class="feed-unsubscribed-tag" title="No longer subscribed — this is a kept copy">(unsubscribed)</span>{% endif %}
{% if selected_entry.author %}
<span class="entry-meta-separator" aria-hidden="true">·</span>
<span class="entry-author-inline">by {% if selected_entry.da_watch_artist %}<a
class="entry-author-link"
title="Show {{ selected_entry.da_watch_artist }}'s posts in this feed"
href="/?folder_id={{ entry_feed_folder_id }}&list_feed_url={{ selected_entry.feed_url | urlencode }}&sort_by={{ selected_sort_by }}&sort_dir={{ selected_sort_dir }}&read_filter={{ selected_read_filter }}{% if selected_star_only %}&star_only=1{% else %}&star_only=0{% endif %}&resume_read_filter={{ selected_resume_read_filter }}&q={{ ('deviantart.com/' ~ (selected_entry.da_watch_artist | lower) ~ '/') | urlencode }}"
>{{ selected_entry.author }}</a>{% else %}{{ selected_entry.author }}{% endif %}{% if selected_entry.da_watch_artist %}
<button
type="button"
class="feed-tag-filter-sign da-unwatch"
data-da-unwatch="{{ selected_entry.da_watch_artist }}"
title="Unwatch {{ selected_entry.da_watch_artist }} on DeviantArt"
aria-label="Unwatch {{ selected_entry.da_watch_artist }} on DeviantArt"
>✕</button>
{% elif selected_entry.author_filter_token %}
{% set author_sign = selected_entry.feed_tag_filter_signs.get(selected_entry.author_filter_token) %}
{% set author_inherited = (selected_entry.feed_tag_inherited_signs or {}).get(selected_entry.author_filter_token) if not author_sign else none %}
{% set author_inherited_note = " (set by a broader rule; clicking edits this feed's own rule; the broader rule still applies)" %}
<span class="author-filter-signs">
<button
type="button"
class="feed-tag-filter-sign include{% if author_sign == '+' %} active{% elif author_inherited == '+' %} inherited{% endif %}"
data-tag-filter-tag="{{ selected_entry.author_filter_token }}"
data-tag-filter-sign="+"
title="Feed filter: good author — rescues posts by {{ selected_entry.author }} from drops{% if author_inherited == '+' %}{{ author_inherited_note }}{% endif %}"
aria-label="Feed filter: good author — rescues posts by {{ selected_entry.author }} from drops{% if author_inherited == '+' %}{{ author_inherited_note }}{% endif %}"
aria-pressed="{{ 'true' if author_sign == '+' else 'false' }}"
>▲</button>
<button
type="button"
class="feed-tag-filter-sign exclude{% if author_sign == '-' %} active{% elif author_inherited == '-' %} inherited{% endif %}"
data-tag-filter-tag="{{ selected_entry.author_filter_token }}"
data-tag-filter-sign="-"
title="Feed filter: drop posts by {{ selected_entry.author }} (unless a good tag rescues them){% if author_inherited == '-' %}{{ author_inherited_note }}{% endif %}"
aria-label="Feed filter: drop posts by {{ selected_entry.author }} (unless a good tag rescues them){% if author_inherited == '-' %}{{ author_inherited_note }}{% endif %}"
aria-pressed="{{ 'true' if author_sign == '-' else 'false' }}"
>▼</button>
</span>
{% endif %}</span>
{% endif %}
{% if selected_entry.post_timestamp %}
<time
class="js-local-time-absolute entry-meta-time"
data-post-iso="{{ selected_entry.post_timestamp or '' }}"
data-received-iso="{{ selected_entry.received_timestamp or '' }}"
data-post-display="{{ selected_entry.post_display or '' }}"
data-received-display="{{ selected_entry.received_display or '' }}"
data-time-format="long"
datetime="{{ selected_entry.post_timestamp or '' }}"
>{{ selected_entry.post_display or '—' }}</time
>
{% endif %}
</div>
</div>
<div class="entry-tags-row">
{# Phone only: step back to the post list, and it lives in THIS row so the
phone's whole action bar is one line. CSS hides it at desktop widths. #}
<button type="button" class="single-back-btn" data-single-back="1"
aria-label="Back to posts">
<span class="material-symbols-rounded" aria-hidden="true">chevron_left</span>Posts
</button>
{# Grouped so the phone layout can centre these three as one unit. The
wrapper is display:contents everywhere else, so desktop layout is exactly
as it was — the three controls stay direct flex children of the row. #}
<span class="entry-primary-actions">
<form method="post" action="/entries/read" class="entry-read-toggle-form">
<input
type="hidden"
name="folder_id"
value="{{ selected_folder_id }}"
/>
<input
type="hidden"
name="feed_url"
value="{{ selected_entry.feed_url }}"
/>
<input type="hidden" name="entry_id" value="{{ selected_entry.id }}" />
<input
type="hidden"
name="read"
value="{{ 0 if selected_entry.read else 1 }}"
/>
<input type="hidden" name="select_entry" value="1" />
{% if selected_feed_url %}
<input
type="hidden"
name="list_feed_url"
value="{{ selected_feed_url }}"
/>
{% endif %} {% if selected_tag %}
<input type="hidden" name="tag" value="{{ selected_tag }}" />
{% endif %}
<input type="hidden" name="sort_by" value="{{ selected_sort_by }}" />
<input type="hidden" name="sort_dir" value="{{ selected_sort_dir }}" />
<input
type="hidden"
name="read_filter"
value="{{ selected_read_filter }}"
/>
<input
type="hidden"
name="star_only"
value="{{ 1 if selected_star_only else 0 }}"
/>
<input
type="hidden"
name="resume_read_filter"
value="{{ selected_resume_read_filter }}"
/>
<button
type="submit"
class="entry-read-toggle"
data-read-state="{{ 1 if selected_entry.read else 0 }}"
title="Mark as {{ 'Unread' if selected_entry.read else 'Read' }}"
aria-label="Mark as {{ 'Unread' if selected_entry.read else 'Read' }}"
>
<span class="entry-read-indicator material-symbols-rounded" aria-hidden="true">circle</span>
</button>
</form>
<form
method="post"
action="/entries/saved"
class="entry-save-toggle-form"
>
<input
type="hidden"
name="folder_id"
value="{{ selected_folder_id }}"
/>
<input
type="hidden"
name="feed_url"
value="{{ selected_entry.feed_url }}"
/>
<input type="hidden" name="entry_id" value="{{ selected_entry.id }}" />
<input
type="hidden"
name="saved"
value="{{ 0 if selected_entry.saved else 1 }}"
/>
<input type="hidden" name="select_entry" value="1" />
{% if selected_feed_url %}
<input
type="hidden"
name="list_feed_url"
value="{{ selected_feed_url }}"
/>
{% endif %} {% if selected_tag %}
<input type="hidden" name="tag" value="{{ selected_tag }}" />
{% endif %}
<input type="hidden" name="sort_by" value="{{ selected_sort_by }}" />
<input type="hidden" name="sort_dir" value="{{ selected_sort_dir }}" />
<input
type="hidden"
name="read_filter"
value="{{ selected_read_filter }}"
/>
<input
type="hidden"
name="star_only"
value="{{ 1 if selected_star_only else 0 }}"
/>
<input
type="hidden"
name="resume_read_filter"
value="{{ selected_resume_read_filter }}"
/>
<button
type="submit"
class="entry-save-toggle"
title="{{ 'Remove from saved' if selected_entry.saved else 'Save for later' }} (f)"
aria-label="{{ 'Remove from saved' if selected_entry.saved else 'Save for later' }}"
>
<span
class="entry-save-indicator material-symbols-rounded"
aria-hidden="true"
>{{ 'star' if selected_entry.saved else 'star_outline' }}</span
>
</button>
</form>
<button
type="button"
class="entry-tag-add-button"
id="entry-tag-add-btn"
title="Add tags"
aria-label="Add tags"
aria-controls="entry-tags-form"
aria-expanded="false"
>
<span class="material-symbols-rounded" aria-hidden="true">sell</span>
</button>
</span>
{# Chips, suggestions and the add-tags form, grouped so the phone layout can
drop them onto their own line beneath the buttons. display:contents
everywhere else, so the desktop row is unchanged. #}
<span class="entry-tags-extra">
<span class="entry-tags-row-sep" aria-hidden="true"></span>
{% if selected_entry.manual_tags %} {% for tag in
selected_entry.manual_tags %}
<span class="entry-tag-chip-wrap">
<a
class="entry-tag-link {% if selected_tag == tag %}active{% endif %}"
href="/?folder_id={{ selected_folder_id }}{% if selected_entry.feed_url %}&list_feed_url={{ selected_entry.feed_url | urlencode }}{% endif %}&tag={{ tag | urlencode }}&sort_by={{ selected_sort_by }}&sort_dir={{ selected_sort_dir }}&read_filter=all&star_only=0&resume_read_filter={{ selected_resume_read_filter }}"
>#{{ tag }}</a
><button
type="button"
class="entry-tag-remove"
data-tag-remove="{{ tag }}"
title="Remove #{{ tag }} from this post"
aria-label="Remove #{{ tag }} from this post"
>×</button>
</span>
{% endfor %} {% endif %}
{% if selected_entry.feed_tag_suggestions %}
<span class="entry-tag-suggestions" aria-label="Feed tags — filter this feed">
{% set collapse_after = selected_entry.feed_tag_chips_collapsed or 8 %}
{% for tag in selected_entry.feed_tag_suggestions %}
{% set active_sign = selected_entry.feed_tag_filter_signs.get(tag) %}
{# Set by an enabled broader (folder/global/multi-feed) rule, shown only where the feed's own rule is silent on the tag. #}
{% set inherited_sign = (selected_entry.feed_tag_inherited_signs or {}).get(tag) if not active_sign else none %}
{% set inherited_note = " (set by a broader rule; clicking edits this feed's own rule; the broader rule still applies)" %}
{# Past the collapse point the chip is present but hidden, not omitted:
a publisher's platform tags sort late (RPS puts "PC" 10th of 28), and
an absent chip cannot be filtered on at all. #}
{# A pinned tag is never collapsed: it is pinned precisely so it stays
reachable, and a feed shipping 28 tags would bury it behind "+N more". #}
{% set is_pinned = tag in (selected_entry.pinned_feed_tags or []) %}
{% set is_pinned_only = tag in (selected_entry.pinned_only_feed_tags or []) %}
{% set is_extra = loop.index0 >= collapse_after and not is_pinned %}
<span class="entry-tag-chip suggestion feed-tag-filter-chip{% if is_pinned %} is-pinned-tag{% endif %}{% if is_extra %} is-extra-feed-tag{% endif %}"{% if is_extra %} hidden{% endif %}>
{% if tag not in selected_entry.manual_tags %}
<button
type="button"
class="feed-tag-filter-sign add-tag"
data-tag-suggestion="{{ tag }}"
data-tag-input="entry-tags-input"
title="Add #{{ tag }} to this post"
aria-label="Add #{{ tag }} to this post"
>+</button>
{% endif %}
<button
type="button"
class="feed-tag-filter-name"
data-feed-tag-filter="{{ tag }}"
title="Filter this view to posts tagged #{{ tag }}"
aria-label="Filter this view to posts tagged #{{ tag }}"
>{{ tag }}</button>
{# The arrows toggle the feed's tag_filter rule, which keys off tags
the PUBLISHER ships. For a tag pinned by hand that this feed never
publishes, filtering on it can never match anything — so the
controls are omitted rather than offered and inert. A pinned tag
the publisher does also ship keeps them: it is an ordinary feed tag
that happens to be pinned. #}
{% if not is_pinned_only %}
<button
type="button"
class="feed-tag-filter-sign include{% if active_sign == '+' %} active{% elif inherited_sign == '+' %} inherited{% endif %}"
data-tag-filter-tag="{{ tag }}"
data-tag-filter-sign="+"
title="Feed filter: good tag — rescues #{{ tag }} posts from drops{% if inherited_sign == '+' %}{{ inherited_note }}{% endif %}"
aria-label="Feed filter: good tag — rescues #{{ tag }} posts from drops{% if inherited_sign == '+' %}{{ inherited_note }}{% endif %}"
aria-pressed="{{ 'true' if active_sign == '+' else 'false' }}"
>▲</button>
<button
type="button"
class="feed-tag-filter-sign exclude{% if active_sign == '-' %} active{% elif inherited_sign == '-' %} inherited{% endif %}"
data-tag-filter-tag="{{ tag }}"
data-tag-filter-sign="-"
title="Feed filter: drop #{{ tag }} posts (unless a good tag rescues them){% if inherited_sign == '-' %}{{ inherited_note }}{% endif %}"
aria-label="Feed filter: drop #{{ tag }} posts (unless a good tag rescues them){% if inherited_sign == '-' %}{{ inherited_note }}{% endif %}"
aria-pressed="{{ 'true' if active_sign == '-' else 'false' }}"
>▼</button>
{% endif %}
{# Dismiss this suggestion for this feed. Manual because no automatic
rule can tell a useless tag ("VinylDeals" — the subreddit) from a
wanted one ("Lessons" — what the post IS); both look like boilerplate
to a frequency or feed-name test. Undo lives in Feed Properties. #}
<button
type="button"
class="feed-tag-filter-sign dismiss-feed-tag"
data-dismiss-feed-tag="{{ tag }}"
title="Never suggest #{{ tag }} for this feed"
aria-label="Never suggest #{{ tag }} for this feed"
>×</button>
</span>
{% endfor %}
{% set hidden_count = (selected_entry.feed_tag_suggestions|length) - collapse_after %}
{% if hidden_count > 0 %}
<button
type="button"
class="feed-tag-more"
data-feed-tag-more="1"
>+{{ hidden_count }} more</button>
{% endif %}
</span>
{% endif %}
<form
method="post"
action="/entries/tags"
class="entry-tags-form"
id="entry-tags-form"
hidden
>
<input
type="hidden"
name="folder_id"
value="{{ selected_folder_id }}"
/>
<input
type="hidden"
name="feed_url"
value="{{ selected_entry.feed_url }}"
/>
<input type="hidden" name="entry_id" value="{{ selected_entry.id }}" />
<input type="hidden" name="select_entry" value="1" />
<input type="hidden" name="append_mode" value="1" />
{% if selected_feed_url %}
<input
type="hidden"
name="list_feed_url"
value="{{ selected_feed_url }}"
/>
{% endif %} {% if selected_tag %}
<input type="hidden" name="tag" value="{{ selected_tag }}" />
{% endif %}
<input type="hidden" name="sort_by" value="{{ selected_sort_by }}" />
<input type="hidden" name="sort_dir" value="{{ selected_sort_dir }}" />
<input
type="hidden"
name="read_filter"
value="{{ selected_read_filter }}"
/>
<input
type="hidden"
name="star_only"
value="{{ 1 if selected_star_only else 0 }}"
/>
<input
type="hidden"
name="resume_read_filter"
value="{{ selected_resume_read_filter }}"
/>
<input
id="entry-tags-input-merged"
name="tags_text"
type="hidden"
value="{{ selected_entry.manual_tags_text }}"
/>
<input
id="entry-tags-input"
class="entry-tags-input"
autocomplete="off"
placeholder="python ai"
value=""
/>
<button type="submit" class="entry-tags-submit">Apply</button>
{# Straight to Settings -> Tags. This row is where a duplicate spelling is
noticed — typing "c++" while the chips above show "cpp" — so the fix
belongs one click away, not four levels into Settings. Right-clicking
any chip gets there too, with the tag filled in. #}
<button type="button" class="entry-tags-aliases-btn" id="entry-tags-aliases-btn"
title="Manage tag aliases" aria-label="Manage tag aliases">Aliases…</button>
</form>
</span>
<div class="entry-pane-alt-actions">
{% if selected_entry.link %}
<span
id="entry-source-mode-indicator"
class="entry-source-mode-indicator"
hidden
>Direct</span
>
<a
id="entry-readability-button"
class="entry-source-button"
href="{{ selected_entry.link }}"
data-source-url="{{ selected_entry.link }}"
data-feed-url="{{ selected_entry.feed_url }}"
data-entry-id="{{ selected_entry.id }}"
title="Reader view (w)"
aria-label="Reader view"
><span class="material-symbols-rounded" aria-hidden="true"
>chrome_reader_mode</span
></a
>
<a
id="entry-source-button"
class="entry-source-button"
href="{{ selected_entry.link }}"
data-source-url="{{ selected_entry.link }}"
title="Web view (v)"
aria-label="Web view"
><span class="material-symbols-rounded" aria-hidden="true"
>language</span
></a
>
<a
id="entry-open-tab-button"
class="entry-source-button"
href="{{ selected_entry.link }}"
target="_blank"
rel="noopener"
title="Open in new tab (b)"
aria-label="Open in new tab"
><span class="material-symbols-rounded" aria-hidden="true"
>open_in_new</span
></a
>
{% if email_configured or instapaper_configured or pinterest_connected or quire_configured %}
<div class="entry-share-wrap">
<button
type="button"
id="entry-share-btn"
class="entry-source-button"
title="Share / send"
aria-label="Share / send"
aria-haspopup="menu"
aria-expanded="false"
><span class="material-symbols-rounded" aria-hidden="true">ios_share</span></button>
<div id="entry-share-menu" class="entry-share-menu" role="menu" hidden>
<button
type="button"
id="entry-email-button"
class="share-menu-item{% if not email_configured %} share-menu-item--unavail{% endif %}"
{% if email_configured %}data-open-email-modal data-email-feed-url="{{ selected_entry.feed_url }}" data-email-entry-id="{{ selected_entry.id }}"{% else %}disabled{% endif %}
title="{% if email_configured %}Email this article{% else %}Configure email in Settings{% endif %}"
role="menuitem"
><span class="material-symbols-rounded" aria-hidden="true">forward_to_inbox</span> Email</button>
<button
type="button"
id="entry-instapaper-button"
class="share-menu-item{% if not instapaper_configured %} share-menu-item--unavail{% endif %}"
{% if instapaper_configured %}data-instapaper-feed-url="{{ selected_entry.feed_url }}" data-instapaper-entry-id="{{ selected_entry.id }}"{% else %}disabled{% endif %}
title="{% if instapaper_configured %}Save to Instapaper{% else %}Connect Instapaper in Settings{% endif %}"
role="menuitem"
><span class="material-symbols-rounded" aria-hidden="true">bookmark_add</span> Instapaper</button>
<button
type="button"
id="entry-pinterest-button"
class="share-menu-item{% if not pinterest_connected %} share-menu-item--unavail{% endif %}"
{% if pinterest_connected %}data-pinterest-feed-url="{{ selected_entry.feed_url }}" data-pinterest-entry-id="{{ selected_entry.id }}"{% else %}disabled{% endif %}
title="{% if pinterest_connected %}Pin to Pinterest{% else %}Connect Pinterest in Settings{% endif %}"
role="menuitem"
><span class="material-symbols-rounded" aria-hidden="true">push_pin</span> Pinterest</button>
<button
type="button"
id="entry-quire-button"
class="share-menu-item{% if not quire_configured %} share-menu-item--unavail{% endif %}"
{% if quire_configured %}data-quire-feed-url="{{ selected_entry.feed_url }}" data-quire-entry-id="{{ selected_entry.id }}"{% else %}disabled{% endif %}
title="{% if quire_configured %}Add to Quire (right-click to pick a project){% else %}Connect Quire in Settings{% endif %}"
role="menuitem"
><span class="material-symbols-rounded" aria-hidden="true">add_task</span> Quire</button>
<button
type="button"
id="entry-reddit-button"
class="share-menu-item{% if not reddit_connected %} share-menu-item--unavail{% endif %}"
{% if reddit_connected %}data-reddit-feed-url="{{ selected_entry.feed_url }}" data-reddit-entry-id="{{ selected_entry.id }}" data-reddit-title="{{ selected_entry.title | e }}" data-reddit-url="{{ selected_entry.link | e }}"{% else %}disabled{% endif %}
title="{% if reddit_connected %}Submit to Reddit{% else %}Connect Reddit in Settings{% endif %}"
role="menuitem"
><span class="material-symbols-rounded" aria-hidden="true">forum</span> Reddit</button>
</div>
</div>
{% endif %}
{% endif %}
<button
type="button"
id="entry-add-link-to-note-button"
class="entry-source-button"
title="Add this Lectio page's link to Note"
aria-label="Add this Lectio page's link to Note"
><span class="material-symbols-rounded" aria-hidden="true">sticky_note_2</span></button>
{% if selected_entry.content_html %}
<button
type="button"
id="entry-cleanup-button"
class="entry-source-button"
data-feed-url="{{ selected_entry.feed_url }}"
data-entry-id="{{ selected_entry.id }}"
data-edited="{{ 1 if selected_entry.content_edited else 0 }}"
title="Clean up article (hover to select, click to remove)"
aria-label="Clean up article"
><span class="material-symbols-rounded" aria-hidden="true">cleaning_services</span></button>
{% endif %}
</div>
</div>
</div>
<article class="entry">
<div id="entry-body" class="entry-body"
{% if selected_entry.pending_lead_image %}
data-lead-image-pending="1"
data-lead-image-feed-url="{{ selected_entry.feed_url }}"
data-lead-image-entry-id="{{ selected_entry.id }}"
{% endif %}
>
{% set _lead_image_shown = selected_entry.lead_image_url and selected_entry.show_lead_in_article and not selected_entry.is_locked %}
{% if selected_entry.is_locked %}
{# A supporter-locked webcomic strip: the resolved lead image is
stale/unresolvable while locked, so show the unlock date instead of a
broken image, same fallback the post-list thumbnail uses. Shown
regardless of show_lead_in_article -- otherwise a locked entry with
that preference off and no text content renders a blank pane instead
of any explanation (Sourcery finding on PR #325). #}
<div class="entry-lead-image-locked" role="img" aria-label="Locked until {{ selected_entry.locked_until_display }}">
<span class="material-symbols-rounded entry-lead-image-locked-icon" aria-hidden="true">lock</span>
<span class="entry-lead-image-locked-text">Locked until {{ selected_entry.locked_until_display }}</span>
</div>
{% elif _lead_image_shown %}
<img
class="entry-lead-image{% if selected_entry.lead_image_url.startswith('data:image/svg') %} entry-lead-image--vector{% endif %}"
src="{{ selected_entry.lead_image_url }}"
alt="{{ selected_entry.image_title_text or '' }}"
{% if selected_entry.image_title_text %}title="{{ selected_entry.image_title_text }}"{% endif %}
loading="lazy"
referrerpolicy="no-referrer"
onerror="var _s=this.getAttribute('src');if(!_s||_s.startsWith('/api/img?')||_s.startsWith('data:')){this.style.display='none'}else{this.setAttribute('src','/api/img?u='+encodeURIComponent(this.src))}"
/>
{% if selected_entry.image_title_text %}
<p class="entry-image-title-text">{{ selected_entry.image_title_text }}</p>
{% endif %}
{% endif %}
{% if selected_entry.audio_feed_suggestion %}
<div class="audio-feed-suggestion">
<span class="audio-feed-suggestion-icon" aria-hidden="true">🎧</span>
<span class="audio-feed-suggestion-text">This podcast’s audio is published in a separate feed.</span>
<form method="post" action="/feeds" style="margin:0">
{{ csrf_input(request) | safe }}
<input type="hidden" name="feed_url" value="{{ selected_entry.audio_feed_suggestion }}" />
<input type="hidden" name="folder_id" value="{{ entry_feed_folder_id }}" />
<button type="submit" class="audio-feed-suggestion-btn">Subscribe to the audio feed</button>
</form>
</div>
{% endif %}
{% if selected_entry.content_html %}
<div class="entry-content">{{ selected_entry.content_html | safe }}</div>
{% elif selected_entry.summary %}
<pre class="entry-text">{{ selected_entry.summary }}</pre>
{% elif not _lead_image_shown and not selected_entry.is_locked %}
<div class="muted">No content available.</div>
{% endif %}
{% if not _lead_image_shown and not selected_entry.is_locked and selected_entry.image_title_text %}
<p class="entry-image-title-text">{{ selected_entry.image_title_text }}</p>
{% endif %}
</div>
<div id="entry-readability-container" class="entry-readability-container" hidden></div>
<iframe
id="entry-source-frame"
class="entry-source-frame"
title="Source page"
loading="lazy"
referrerpolicy="no-referrer-when-downgrade"
hidden
></iframe>
<div id="entry-source-fallback" class="entry-source-fallback" hidden>
<div class="entry-source-fallback-title">Page not visible?</div>
<div class="entry-source-fallback-text">
Some sites block embedded previews.
</div>
<div class="entry-source-fallback-actions">
<a
id="entry-source-open-external"
class="entry-source-open-external"
href="#"
target="_blank"
rel="noopener noreferrer"
>Open in new tab</a
>
<button
type="button"
id="entry-source-dismiss"
class="entry-source-dismiss"
>
Dismiss
</button>
</div>
</div>
</article>
{% else %}
<div class="empty-state">
<div class="empty-state-message muted">
Select a post from the middle pane.
</div>
</div>
{% endif %}
</section>