Ctrl K
ComunidadGuías…

templates/_feed_properties_modal.html

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

Archivo original ↗Preguntar a KiBot
  <div id="feed-properties-modal" class="action-modal" hidden>
    <div class="action-modal-panel feed-properties-panel" role="dialog" aria-modal="true" aria-labelledby="feed-properties-title">
      <div class="feed-properties-header-row">
        <h3 id="feed-properties-title" class="action-modal-title">Feed Properties</h3>
        <a id="feed-prop-view-posts" href="#" class="feed-prop-inline-btn feed-prop-view-posts-btn" hidden title="View this feed's posts in the reader"><span class="material-symbols-rounded" aria-hidden="true">list_alt</span> View posts</a>
        <button type="button" id="feed-properties-close" class="feed-properties-close" aria-label="Close"><span class="material-symbols-rounded" aria-hidden="true">close</span></button>
      </div>
      <div class="hl-tab-bar feed-prop-tab-bar" role="tablist">
        <button type="button" class="hl-tab-btn hl-tab-btn--active" data-feed-prop-tab="info" role="tab" aria-selected="true">Info</button>
        {# Split from one overloaded "Tuning" tab: what arrives / how it looks / upkeep were three unrelated jobs sharing a panel. #}
        <button type="button" class="hl-tab-btn" data-feed-prop-tab="content" role="tab" aria-selected="false">Content</button>
        <button type="button" class="hl-tab-btn" data-feed-prop-tab="tuning" role="tab" aria-selected="false">Tuning</button>
        <button type="button" class="hl-tab-btn" data-feed-prop-tab="maint" role="tab" aria-selected="false">Maintenance</button>
        <button type="button" class="hl-tab-btn" data-feed-prop-tab="history" role="tab" aria-selected="false">History</button>
        <button type="button" class="hl-tab-btn" data-feed-prop-tab="automations" role="tab" aria-selected="false">Automations</button>
      </div>
      <div id="feed-prop-tab-info" class="feed-prop-tab-panel">
        <dl class="feed-properties-grid">


          <dt>Display name</dt>
          <dd>
            <span class="feed-prop-name-wrap">
              <input type="text" id="feed-prop-user-title" class="feed-prop-title-input" placeholder="" autocomplete="off" />
              <button type="button" id="feed-prop-reset-title-btn" class="feed-prop-reset-title" title="Reset to feed title" hidden>×</button>
            </span>
          </dd>
          <dt>Original title</dt><dd id="feed-prop-real-title">-</dd>


          <dt>Website</dt>
          <dd id="feed-prop-website-row">
            <span id="feed-prop-website">-</span>
            <a id="feed-prop-website-open" href="#" target="_blank" rel="noopener noreferrer" class="feed-prop-inline-btn feed-prop-open-btn" hidden title="Open in new tab">&#x2197;</a>
            <button type="button" id="feed-prop-change-website-btn" class="feed-prop-inline-btn" title="Repoint this feed to a new site domain and rewrite its post links">Edit</button>
            <span id="feed-prop-change-website-wrap" hidden>
              <input type="url" id="feed-prop-change-website-input" class="feed-prop-url-input" placeholder="New site URL (e.g. https://newdomain.com/)" autocomplete="off" />
              <button type="button" id="feed-prop-change-website-save" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Save</button>
              <button type="button" id="feed-prop-change-website-cancel" class="feed-prop-inline-btn">Cancel</button>
              <span id="feed-prop-change-website-status" class="feed-prop-inline-status"></span>
            </span>
          </dd>
          {# Declared domain migrations. Without this the rules act invisibly — they rewrite at ingest and feed the global dedupe alias map, but nothing rendered them and only an inferrable host could be added. #}
          <dt>Other domains</dt>
          <dd id="feed-prop-aliases-row">
            <ul id="feed-prop-alias-list" class="feed-prop-alias-list"></ul>
            <span id="feed-prop-alias-empty" class="feed-prop-alias-empty">None declared.</span>
            <span id="feed-prop-alias-add-wrap">
              <input type="text" id="feed-prop-alias-input" class="feed-prop-url-input" placeholder="Old domain (e.g. olddomain.com)" autocomplete="off" /> 
              <button type="button" id="feed-prop-alias-add" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Add</button>
              <span id="feed-prop-alias-status" class="feed-prop-inline-status"></span>
            </span>
          </dd>


          <dt>XML address</dt>
          <dd id="feed-prop-xml-row">
            <span id="feed-prop-xml">-</span>
            <a id="feed-prop-xml-open" href="#" target="_blank" rel="noopener noreferrer" class="feed-prop-inline-btn feed-prop-open-btn" hidden title="Open in new tab">&#x2197;</a>
            <button type="button" id="feed-prop-change-url-btn" class="feed-prop-inline-btn" title="Change feed URL">Edit</button>
            <span id="feed-prop-change-url-wrap" hidden>
              <input type="url" id="feed-prop-change-url-input" class="feed-prop-url-input" placeholder="New feed URL" autocomplete="off" />
              <button type="button" id="feed-prop-change-url-save" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Save</button>
              <button type="button" id="feed-prop-change-url-cancel" class="feed-prop-inline-btn">Cancel</button>
              <span id="feed-prop-change-url-status" class="feed-prop-inline-status"></span>
            </span>
          </dd>


          


          <dt>Folder</dt>
          <dd id="feed-prop-folder-row">
            <select id="feed-prop-folder-select" class="feed-prop-strategy-select" style="width:auto" aria-label="Feed folder">
              <option value="-1">Uncategorized (no folder)</option>
              {% for opt in folder_options if opt.depth > 0 %}
              <option value="{{ opt.id }}">{{ opt.name }}</option>
              {% endfor %}
            </select>
            <span id="feed-prop-folder-status" class="feed-prop-inline-status"></span>
          </dd>

          


          {# Tags this feed's posts usually want. Feed-provided chips only exist when the publisher ships them, and a feed with a stable subject ships none — a guitar blog doesn't tag posts "guitar" — so filing meant typing the same word every time. These are offered as chips on every post in the feed, pinned to the front. A suggestion, never applied automatically: a tag rule already does that. #}
          <dt>Suggested tags</dt>
          <dd id="feed-prop-suggested-tags-row">
            <div id="feed-prop-suggested-tags-chips" class="entry-tag-chip-row"></div>
            <input type="text" id="feed-prop-suggested-tags-input" class="feed-prop-url-input" placeholder="e.g. guitar bass" autocomplete="off" aria-describedby="feed-prop-suggested-tags-hint" />
            <button type="button" id="feed-prop-suggested-tags-save" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Add</button>
            <span id="feed-prop-suggested-tags-status" class="feed-prop-inline-status"></span>
            <div id="feed-prop-suggested-tags-hint" class="feed-prop-hint">Offered as chips on every post in this feed, before the feed's own tags.</div>
          </dd>
          {# Undo for dismissed suggestion chips. A mis-click on the × must not be permanent, and this is the only place the decision is visible. #}
          <dt>Hidden suggested tags</dt>
          <dd id="feed-prop-hidden-tags-row">
            {# One switch for a feed whose tags are never wanted. Dismissing them one at a time is whack-a-mole: a webcomic tagged "Comics" and "Cartoons" says nothing about the strip, and each new tag the publisher invents needs dismissing again. Stored as the "*" row in the same table, so it is the same mechanism, listed and undone in the same place. #}
            <label class="feed-prop-checkbox-label" for="feed-prop-ignore-all-tags">
              <input type="checkbox" id="feed-prop-ignore-all-tags" class="feed-prop-checkbox" />
              <span>Ignore all suggested tags from this feed</span>
            </label>
            <ul id="feed-prop-hidden-tag-list" class="feed-prop-alias-list"></ul>
            <span id="feed-prop-hidden-tag-empty" class="feed-prop-alias-empty">None hidden — every tag this feed provides is offered as a suggestion.</span>
          </dd>


          {# Linked files worth keeping with the post. guitar-pro links .gp tabs and .pdf lyric sheets that disappear along with the article, so keeping the text without them keeps the wrong half. Extensions only — no wildcard, deliberately: the list is what makes this a capture of named file types rather than a crawl of every link. #}
          <dt>Keep linked files</dt>
          <dd id="feed-prop-attachments-row">
            <input type="text" id="feed-prop-attachments-input" class="feed-prop-url-input" placeholder="none — nothing kept" autocomplete="off" aria-describedby="feed-prop-attachments-hint" />
            <button type="button" id="feed-prop-attachments-save" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Save</button>
            <span id="feed-prop-attachments-status" class="feed-prop-inline-status"></span>
            {# What THIS feed actually links to, counted from its stored posts — the field used to carry a fixed example, which advised every feed in the library to keep Guitar Pro tabs. #}
            <div id="feed-prop-attachments-candidates" class="feed-prop-ext-candidates" hidden></div>
            <div id="feed-prop-attachments-hint" class="feed-prop-hint">Saved with the post when you star or tag it. <code>gp*</code> covers gp/gp3/gp5/gpx. Page types (html, php…) are always ignored, and there is no bare <code>*</code>.</div>
          </dd>

          
          <dt>Health</dt>
            <dd>
              <span id="feed-prop-health">-</span> - <span id="feed-prop-health-detail">-</span>
            </dd>

          <dt>Updates</dt>
          <dd id="feed-prop-updates-row">
            <span id="feed-prop-updates-label">-</span>
          </dd>

          <dt>Total posts</dt>
          <dd>
            <span id="feed-prop-total">-</span> (<span id="feed-prop-unread">-</span> unread)
          </dd>

          <dt>Date followed</dt><dd id="feed-prop-added">-</dd>
          <dt>Last post</dt><dd id="feed-prop-last-post">-</dd>
          <dt>Last crawled</dt><dd id="feed-prop-updated">-</dd>
          <dt id="feed-prop-cooldown-label" hidden>Crawl hold</dt><dd id="feed-prop-cooldown" hidden>-</dd>
          <dt>Last received</dt><dd id="feed-prop-received">-</dd>
          
        </dl>
        <div class="feed-prop-footer">
          <button type="button" id="feed-prop-disable-btn" class="feed-prop-inline-btn" title="Stop fetching this feed without unsubscribing"></button>
          <span id="feed-prop-disable-status" class="feed-prop-inline-status"></span>
          <button type="button" id="feed-prop-unsubscribe-btn" class="feed-prop-unsubscribe-btn" hidden>Unsubscribe from feed</button>
        </div>
      </div>
      <div id="feed-prop-tab-content" class="feed-prop-tab-panel" hidden>
        <!-- dev.to filtered feeds: filter config -->
        <div id="feed-prop-devto-section" hidden>
          <h4 class="feed-prop-section-title">dev.to filters</h4>
          <dl class="feed-properties-grid">
            <dt>Tags</dt>
            <dd><input type="text" id="feed-prop-devto-tag" class="feed-prop-title-input" placeholder="comma-separated, any match; blank = front page" autocomplete="off" /></dd>
            <dt>Top window</dt>
            <dd><input type="number" id="feed-prop-devto-top" class="feed-prop-title-input" min="1" placeholder="days; blank = latest posts" /></dd>
            <dt>Min reactions</dt>
            <dd><input type="number" id="feed-prop-devto-minreact" class="feed-prop-title-input" min="1" placeholder="blank = no minimum" /></dd>
            <dt>Exclude tags</dt>
            <dd><input type="text" id="feed-prop-devto-exclude" class="feed-prop-title-input" placeholder="comma-separated" autocomplete="off" /></dd>
          </dl>
          <div class="feed-prop-toggles">
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-devto-english" class="feed-prop-checkbox" />
              <span>English-only (uses dev.to's own language label)</span>
            </label>
          </div>
          <div class="feed-prop-footer">
            <button type="button" id="feed-prop-devto-save" class="feed-prop-inline-btn feed-prop-inline-btn--primary">Save &amp; refetch</button>
            <span id="feed-prop-devto-status" class="feed-prop-inline-status"></span>
          </div>
        </div>
        <!-- YouTube feeds: simplified controls -->
        <div id="feed-prop-yt-section" hidden>
          <h4 class="feed-prop-section-title">YouTube options</h4>
          <div class="feed-prop-toggles">
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-hide-shorts" class="feed-prop-checkbox" />
              <span>Hide Shorts (auto-mark as read at fetch time)</span>
            </label>
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-hide-unpremiered" class="feed-prop-checkbox" />
              <span>Hide upcoming videos until they premiere</span>
            </label>
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-hide-members-only" class="feed-prop-checkbox" />
              <span>Hide members-only videos (auto-mark as read at fetch time)</span>
            </label>
          </div>
        </div>
          <h4 class="feed-prop-section-title">Content</h4>
          <div class="feed-prop-toggles">
            {# Full-article fetch at ingest for thin (teaser-only) new posts. Inherit = the folder's setting. #}
            <label class="feed-prop-toggle-row">
              <span>Fetch full article for thin new posts</span>
              <select id="feed-prop-full-content" class="feed-prop-strategy-select" style="width:auto">
                <option value="-1" id="feed-prop-full-content-inherit">Folder setting</option>
                <option value="1">On</option>
                <option value="0">Off</option>
              </select>
            </label>
            {# New posts dated older than this are marked read at fetch, so a quiet site that finally updates doesn't flood unread. #}
            <label class="feed-prop-toggle-row">
              <span>Auto-read old posts</span>
              <select id="feed-prop-auto-read" class="feed-prop-strategy-select" style="width:auto">
                <option value="0" id="feed-prop-auto-read-inherit">Off</option>
                <option value="7">Older than 7 days</option>
                <option value="14">Older than 14 days</option>
                <option value="30">Older than 30 days</option>
                <option value="60">Older than 60 days</option>
                <option value="90">Older than 90 days</option>
              </select>
            </label>
            {# The publisher's own article tags (article:tag metas — PC Gamer's "Topics") as tag suggestions, fetched for each new
               post (first 64KB of the page only). Inherit = the folder's setting. #}
            <label class="feed-prop-toggle-row">
              <span>Capture page topics as tag suggestions</span>
              <select id="feed-prop-page-topics" class="feed-prop-strategy-select" style="width:auto">
                <option value="-1" id="feed-prop-page-topics-inherit">Folder setting</option>
                <option value="1">On</option>
                <option value="0">Off</option>
              </select>
            </label>
            {# Opt-in per feed: a *partial* feed is all stubs by design, so
               enabling this there would empty it. #}
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-hide-paywalled" class="feed-prop-checkbox" />
              <span>Hide subscriber-only posts (auto-mark as read at fetch time)</span>
            </label>
            {# For a webcomic gated behind a supporter tier (cad-comic.com and
               the like) until a stated unlock date -- shown here rather than
               under YouTube options above since it isn't YouTube-specific. #}
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-hide-locked-comics" class="feed-prop-checkbox" />
              <span>Hide strips locked behind a supporter tier until their unlock date</span>
            </label>
            {# Off by default: a bare $...$ pair is common in ordinary text
               ("between $50 and $100") and would render as broken math on any
               feed that isn't actually LaTeX-flavored -- opt in per feed. #}
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-katex-dollar-math" class="feed-prop-checkbox" />
              <span>Render $...$ as inline math, not just $$...$$ / \(...\) (only enable for a feed that actually writes LaTeX this way)</span>
            </label>
          </div>
      </div>
      <div id="feed-prop-tab-tuning" class="feed-prop-tab-panel" hidden>
        <!-- Non-YouTube feeds: image strategy + display controls -->
        <div id="feed-prop-img-section">
          <h4 class="feed-prop-section-title">
            Strategy comparison
            <button type="button" id="feed-prop-refresh-btn" class="feed-prop-refresh-btn" title="Re-run strategy comparison for the current entry">
              <span class="material-symbols-rounded" aria-hidden="true">refresh</span> Refresh
            </button>
          </h4>
          <p id="feed-prop-strat-empty" class="feed-prop-strat-empty muted">No cached results yet — click Refresh to compare.</p>
          <div id="feed-prop-strat-grid" class="feed-prop-strat-grid" hidden></div>
          <div id="feed-prop-strat-captions" class="feed-prop-strat-captions" hidden></div>

          <h4 class="feed-prop-section-title">Feed type</h4>
          <div class="feed-prop-preset-row" id="feed-prop-preset-row">
            <button type="button" class="feed-prop-preset-btn" data-preset="webcomic">Webcomic</button>
            <button type="button" class="feed-prop-preset-btn" data-preset="artwork">Artwork</button>
          </div>

          <h4 class="feed-prop-section-title">Image</h4>
          <dl class="feed-properties-grid">
            <dt>Source</dt>
            <dd>
              <select id="feed-prop-strategy" class="feed-prop-strategy-select">
                <option value="auto">Auto-detect</option>
                <option value="inline">Feed content — first image from feed HTML</option>
                <option value="og_scrape">Source page — og:image / article hero</option>
                <option value="media_rss">Media RSS — media:thumbnail from feed XML</option>
                <option value="enclosure">Enclosure — per-post image already in reader DB</option>
                <option value="none">None</option>
              </select>
              <div id="feed-prop-strategy-hint" class="feed-prop-strategy-hint"></div>
            </dd>
          </dl>
          <div class="feed-prop-toggles">
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-show-in-article" class="feed-prop-checkbox" />
              <span>Show image at top of article</span>
            </label>
            <label class="feed-prop-toggle-row">
              <input type="checkbox" id="feed-prop-inject-source-images" class="feed-prop-checkbox" />
              <span>Use the source article for image-less bodies (recovers pictures in place, e.g. paizo)</span>
            </label>
          </div>
          <div class="feed-prop-caption-source-row" id="feed-prop-caption-source-row">
            <span class="feed-prop-caption-source-label">Caption</span>
            <span class="feed-prop-caption-checks">
              <label class="feed-prop-caption-check-label"><input type="checkbox" id="feed-prop-caption-alt"> Alt: <span id="feed-prop-caption-alt-preview" class="feed-prop-caption-preview"></span></label>
              <label class="feed-prop-caption-check-label"><input type="checkbox" id="feed-prop-caption-title"> Title: <span id="feed-prop-caption-title-preview" class="feed-prop-caption-preview"></span></label>
              <button type="button" id="feed-prop-caption-auto-btn" class="feed-prop-refresh-btn feed-prop-caption-auto-btn" title="Decide per post (prefers Title, and hides a caption that only restates the headline)">↺ Auto</button>
            </span>
          </div>
          <h4 class="feed-prop-section-title">Post thumbnail</h4>
          <div class="feed-prop-thumb-override">
            <select id="feed-prop-thumb-source" class="feed-prop-strategy-select">
              <option value="__disabled__">Disabled</option>
              <optgroup label="Per-entry">
                <option value="">Auto (same as article image source)</option>
                <option value="__per_entry_inline__">Inline — first image from feed content</option>
                <option value="__per_entry_media_rss__">Media RSS — per-post media thumbnail</option>
              </optgroup>
              <optgroup id="feed-prop-thumb-strategies-group" label="Pin image from this entry (same URL for all posts)"></optgroup>
              <option value="__custom__">Custom URL…</option>
            </select>
            <div id="feed-prop-thumb-custom-row" style="display:none;margin-top:0.4rem;">
              <input type="url" id="feed-prop-thumbnail-url" class="feed-prop-thumbnail-input" placeholder="https://…" autocomplete="off" />
              <button type="button" id="feed-prop-thumbnail-url-save" class="feed-prop-thumbnail-save">Save</button>
            </div>
            <div id="feed-prop-thumb-preview" class="feed-prop-thumb-preview" style="display:none;">
              <div id="feed-prop-thumb-preview-tile" class="post-thumbnail feed-prop-thumb-preview-tile crop-cover">
                <img id="feed-prop-thumb-preview-img" class="post-thumbnail-image" src="" alt="" />
              </div>
            </div>
          </div>
          <div class="feed-prop-thumb-crop-row" id="feed-prop-thumb-crop-row">
            <div class="feed-prop-crop-section" id="feed-prop-crop-pos-section">
              <span class="feed-prop-thumb-crop-label">Position</span>
              <div class="feed-prop-crop-grid">
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="top-left" aria-label="Top left" title="Top left"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="top" aria-label="Top" title="Top center"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="top-right" aria-label="Top right" title="Top right"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="left" aria-label="Left" title="Middle left"></button>
                <button type="button" class="feed-prop-crop-pos-btn active" data-pos="center" aria-label="Center" title="Center"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="right" aria-label="Right" title="Middle right"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="bottom-left" aria-label="Bottom left" title="Bottom left"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="bottom" aria-label="Bottom" title="Bottom center"></button>
                <button type="button" class="feed-prop-crop-pos-btn" data-pos="bottom-right" aria-label="Bottom right" title="Bottom right"></button>
              </div>
            </div>
            <div class="feed-prop-crop-section">
              <span class="feed-prop-thumb-crop-label">Mode</span>
              <div class="feed-prop-crop-mode-btns">
                <button type="button" class="feed-prop-crop-mode-btn active" data-mode="cover" title="Fill — crop to fill thumbnail; position sets which part shows">Fill</button>
                <button type="button" class="feed-prop-crop-mode-btn" data-mode="contain" title="Fit — show full image with blank bars">Fit</button>
                <button type="button" class="feed-prop-crop-mode-btn" data-mode="smart" title="Smart — content-aware crop; trims the least interesting sides">Smart</button>
              </div>
            </div>
            <div class="feed-prop-crop-section" id="feed-prop-smart-ms-section" style="display:none;">
              <span class="feed-prop-thumb-crop-label">Smart crop sensitivity</span>
              <input type="number" id="feed-prop-smart-min-scale" class="settings-input settings-input--short"
                min="0.5" max="1.0" step="0.05" placeholder="0.9"
                title="Minimum fraction of the image the smart crop must keep (0.5–1.0); lower values crop more aggressively" />
            </div>
            <div class="feed-prop-crop-section" id="feed-prop-fill-zoom-section" style="display:none;">
              <span class="feed-prop-thumb-crop-label">Fill zoom</span>
              <input type="number" id="feed-prop-fill-zoom" class="settings-input settings-input--short"
                min="0.5" max="2.0" step="0.05" placeholder="1.0"
                title="Zoom multiplier for Fill crop (1.0 = tight fill; &lt;1.0 shows more image with black bars; &gt;1.0 crops more aggressively)" />
            </div>
          </div>
        </div>
      </div>
      <div id="feed-prop-tab-maint" class="feed-prop-tab-panel" hidden>
        <!-- Maintenance: backfill embeds (re-parse) -->
        <div id="feed-prop-maint-section">
          <h4 class="feed-prop-section-title">Maintenance</h4>
          <button type="button" id="feed-prop-reparse-btn" class="feed-prop-refresh-btn" title="Force a full re-fetch to restore embeds (videos, players) stripped from older posts">Backfill embeds</button>
          <span id="feed-prop-reparse-status" class="feed-prop-strategy-hint"></span>
          <div id="feed-prop-browser-ua-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">🌐 This feed fetches with a browser identity (its server refused the default client).</span>
            <button type="button" id="feed-prop-browser-ua-reset" class="feed-prop-inline-btn" title="Go back to the honest default identity for this feed">Reset to default identity</button>
          </div>
          <div id="feed-prop-browser-ua-force-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">Server returns a valid feed in a browser but fails with the default client? Force browser identity:</span>
            <button type="button" id="feed-prop-browser-ua-force" class="feed-prop-inline-btn" title="Fetch this feed using a browser User-Agent and headers">Use browser identity</button>
          </div>
          <div id="feed-prop-proxy-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">🔒 This feed fetches through the outbound proxy (browser identity alone still wasn't enough).</span>
            <button type="button" id="feed-prop-proxy-reset" class="feed-prop-inline-btn" title="Stop routing this feed through the proxy">Stop proxying</button>
          </div>
          <div id="feed-prop-proxy-force-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">Still failing? Force this feed through the outbound proxy (only takes effect when your Network setting is "As needed"):</span>
            <button type="button" id="feed-prop-proxy-force" class="feed-prop-inline-btn" title="Fetch this feed through the configured outbound proxy">Force proxy</button>
          </div>
          <div id="feed-prop-flaresolverr-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">🧩 This feed fetches through FlareSolverr (a real challenge page, not just a block — the proxy alone couldn't solve it).</span>
            <button type="button" id="feed-prop-flaresolverr-reset" class="feed-prop-inline-btn" title="Stop routing this feed through FlareSolverr">Stop FlareSolverr</button>
          </div>
          <div id="feed-prop-flaresolverr-force-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">Still failing with a challenge page even proxied? Force this feed through FlareSolverr (only takes effect when your Network setting is "As needed" and FlareSolverr is configured):</span>
            <button type="button" id="feed-prop-flaresolverr-force" class="feed-prop-inline-btn" title="Fetch this feed through FlareSolverr">Force FlareSolverr</button>
          </div>
          <div id="feed-prop-tailscale-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">🏠 This feed fetches through the last-resort backend (the proxy alone still wasn't enough).</span>
            <button type="button" id="feed-prop-tailscale-reset" class="feed-prop-inline-btn" title="Stop routing this feed through the last-resort backend">Stop last-resort</button>
          </div>
          <div id="feed-prop-tailscale-force-row" hidden style="margin-top:0.5rem;">
            <span class="feed-prop-strategy-hint">Still failing even proxied? Force this feed through the last-resort backend (only takes effect when your Network setting is "As needed" and a last-resort backend is configured):</span>
            <button type="button" id="feed-prop-tailscale-force" class="feed-prop-inline-btn" title="Fetch this feed through the configured last-resort backend">Force last-resort</button>
          </div>
        </div>
        <!-- Dev feed: manual batch flush -->
        <div id="feed-prop-dev-section" hidden>
          <h4 class="feed-prop-section-title">Dev tools</h4>
          <button type="button" id="feed-prop-flush-batch-btn" class="feed-prop-refresh-btn">Flush email batch queue</button>
          <span id="feed-prop-flush-batch-status" class="feed-prop-strategy-hint"></span>
        </div>
      </div>
      <div id="feed-prop-tab-history" class="feed-prop-tab-panel" hidden>
        <h4 class="feed-prop-section-title">Recent fetches</h4>
        <p class="feed-prop-strategy-hint">Each refresh attempt for this feed — newest first. Use it to see why a feed is stale or flagged problematic.</p>
        <div class="feed-prop-history-filter" role="group" aria-label="Filter fetch history">
          <button type="button" class="feed-prop-history-filter-btn feed-prop-history-filter-btn--active" data-history-filter="all">All</button>
          <button type="button" class="feed-prop-history-filter-btn" data-history-filter="new">New entries</button>
          <button type="button" class="feed-prop-history-filter-btn" data-history-filter="error">Errors</button>
        </div>
        <p id="feed-prop-history-empty" class="feed-prop-strat-empty muted" hidden>No fetch history recorded yet.</p>
        <ul id="feed-prop-history-list" class="feed-prop-history-list"></ul>
      </div>
      <div id="feed-prop-tab-automations" class="feed-prop-tab-panel" hidden>
        <h4 class="feed-prop-section-title">Rules in effect</h4>
        <p class="feed-prop-strategy-hint">Automations that act on this feed because they're scoped to it, its folder, or all feeds. Manage rules in Settings → Rules.</p>
        <p id="feed-prop-automations-rules-empty" class="feed-prop-strat-empty muted" hidden>No rules apply to this feed.</p>
        <ul id="feed-prop-automations-rules" class="feed-prop-automations-list"></ul>

        <h4 class="feed-prop-section-title">Recent activity</h4>
        <p id="feed-prop-automations-runs-empty" class="feed-prop-strat-empty muted" hidden>No automation has run on this feed yet.</p>
        <ul id="feed-prop-automations-runs" class="feed-prop-automations-list"></ul>
      </div>
    </div>
  </div>