@@ -1,42 +1,83 @@
{{ # if url }}
<a href=" {{ url }} " class="site-card {{ # if style }} site-card- {{ style }} {{ / if }} "
{{ # if external }} target="_blank" rel="noopener" {{ / if }}
data-type=" {{ # if type }} {{ type }} {{ else }} site {{ / if }} "
data-name=" {{ name }} "
data-url=" {{ url }} "
data-icon=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} "
data-description=" {{ # if description }} {{ description }} {{ else }} {{ extractDomain u rl }} {{ / if }} "
{{ # if publishedAt }} data-published-at=" {{ publishedAt }} " {{ / if }}
{{ # if source }} data-source=" {{ source }} " {{ / if }} >
<a href="{{ url }} " class="site-card {{ # if style }} site-card- {{ style }} {{ / if }} "
{{ # if external }} target="_blank" rel="noopener" {{ / if }}
data-type="{{ # if type }} {{ type }} {{ else }} site {{ / if }} "
data-name="{{ name }} "
data-url="{{ url }} "
data-icon="{{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} "
{{ # if faviconUrl }} data-favicon-url=" {{ faviconU rl}} " {{ / if }}
{{ # if forceIconMode }} data-force-icon-mode=" {{ forceIconMode }} " {{ / if }}
data-description=" {{ # if description }} {{ description }} {{ else }} {{ extractDomain url }} {{ / if }} "
{{ # if publishedAt }} data-published-at=" {{ publishedAt }} " {{ / if }}
{{ # if source }} data-source=" {{ source }} " {{ / if }} >
{{!-- articles: 首行图标+标题;下方“时间/来源 + 简介”全宽对齐,不被图标列缩进 --}}
{{ # if Equals type "article" }}
<div class="article-card-header">
<div class="site-card-icon" aria-hidden="true">
{{# if Equals @ root . icons .mode "favicon" }}
{{ # if HttpUrl u rl}}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32 "
alt="{{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class="{{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if Equals }}
</div >
<div class="article-card-title" >
<h3> {{ # if name }} {{ name }} {{ else }} 未命名站点 {{ / if }} </h3>
</div>
</div>
<div class="article-card-header">
<div class="site-card-icon" aria-hidden="true">
{{!-- 站点图标优先级: faviconUrl > forceIconMode > 全局 icons.mode -- }}
{{ # if faviconU rl }}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="{{ faviconUrl }} "
alt="{{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class="{{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
{{ # if Equals forceIconMode "manual" }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ else }}
{{ # if Equals forceIconMode "favicon" }}
{{ # if HttpUrl url }}
<div class="icon-container" >
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i >
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32"
alt=" {{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="if (!this.dataset.faviconFallbackTried) { this.dataset.faviconFallbackTried = '1'; var next = this.src.replace('t3.gstatic.com', 't3.gstatic.cn'); if (next !== this.src) { this.src = next; return; } } this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
{{ # if Equals @ root .icons .mode "favicon" }}
{{ # if HttpUrl url }}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32"
alt=" {{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="if (!this.dataset.faviconFallbackTried) { this.dataset.faviconFallbackTried = '1'; var next = this.src.replace('t3.gstatic.com', 't3.gstatic.cn'); if (next !== this.src) { this.src = next; return; } } this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if Equals }}
{{ / if Equals }}
{{ / if Equals }}
{{ / if }}
</div>
<div class="article-card-title">
<h3> {{ # if name }} {{ name }} {{ else }} 未命名站点 {{ / if }} </h3>
</div>
</div>
<div class="article-card-body">
{{ # if Cond publishedAt '||' source }}
@@ -89,29 +130,68 @@
{{ / if }}
</div>
{{ / if Cond }}
{{ else }}
<div class="site-card-icon" aria-hidden="true">
{{# if Equals @ root . icons .mode "favicon" }}
{{ # if HttpUrl u rl}}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32 "
alt="{{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class="{{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if Equals }}
</div >
{{ else }}
<div class="site-card-icon" aria-hidden="true">
{{!-- 站点图标优先级: faviconUrl > forceIconMode > 全局 icons.mode -- }}
{{ # if faviconU rl }}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="{{ faviconUrl }} "
alt="{{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class="{{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
{{ # if Equals forceIconMode "manual" }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ else }}
{{ # if Equals forceIconMode "favicon" }}
{{ # if HttpUrl url }}
<div class="icon-container" >
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32"
alt=" {{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="if (!this.dataset.faviconFallbackTried) { this.dataset.faviconFallbackTried = '1'; var next = this.src.replace('t3.gstatic.com', 't3.gstatic.cn'); if (next !== this.src) { this.src = next; return; } } this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
{{ # if Equals @ root .icons .mode "favicon" }}
{{ # if HttpUrl url }}
<div class="icon-container">
<i class="fas fa-circle-notch fa-spin icon-placeholder" aria-hidden="true"></i>
<img
class="favicon-icon"
src="https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url= {{ encodeURIComponent url }} &size=32"
alt=" {{ name }} favicon"
loading="lazy"
onload="this.classList.add('loaded'); this.previousElementSibling.classList.add('hidden');"
onerror="if (!this.dataset.faviconFallbackTried) { this.dataset.faviconFallbackTried = '1'; var next = this.src.replace('t3.gstatic.com', 't3.gstatic.cn'); if (next !== this.src) { this.src = next; return; } } this.classList.add('error'); this.previousElementSibling.classList.add('hidden'); this.nextElementSibling.classList.add('visible');"
/>
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} icon-fallback" aria-hidden="true"></i>
</div>
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if HttpUrl }}
{{ else }}
<i class=" {{ # if icon }} {{ icon }} {{ else }} fas fa-link {{ / if }} site-icon" aria-hidden="true"></i>
{{ / if Equals }}
{{ / if Equals }}
{{ / if Equals }}
{{ / if }}
</div>
<div class="site-card-content">
<h3> {{ # if name }} {{ name }} {{ else }} 未命名站点 {{ / if }} </h3>