Ctrl K
ComunidadGuías…

templates/_entry_pane.html

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
<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>