Files
menav/templates/components/site-card.hbs
coolzr aa264cc727 feat(icons): 添加favicon模式,自动匹配图标
- 新增配置 icons.mode(manual | favicon),默认 favicon,未配置场景下自动生效
- 模板调用 t3.gstatic.com/faviconV2 获取站点图标;加载中显示旋转占位,失败回退至 Font Awesome 图标
- 新增 ifHttpUrl 与 encodeURIComponent,提升模板安全性与可读性
- 搜索索引优先读取 .icon-fallback,保证 favicon 模式下图标类名一致
- 样式新增 .favicon-icon 与 hover 效果,维持卡片观感一致性
2025-10-18 23:50:53 +08:00

33 lines
1.5 KiB
Handlebars

{{#if url}}
<a href="{{url}}" class="site-card{{#if style}} site-card-{{style}}{{/if}}"
title="{{name}} - {{#if description}}{{description}}{{else}}{{url}}{{/if}}"
{{#if external}}target="_blank" rel="noopener"{{/if}}
data-type="site"
data-name="{{name}}"
data-url="{{url}}"
data-icon="{{#if icon}}{{icon}}{{else}}fas fa-link{{/if}}"
data-description="{{#if description}}{{description}}{{else}}{{url}}{{/if}}">
{{#ifEquals @root.icons.mode "favicon"}}
{{#ifHttpUrl url}}
<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"
style="opacity:0;"
onload="this.style.opacity='1'; this.previousElementSibling.style.display='none';"
onerror="this.style.display='none'; this.previousElementSibling.style.display='none'; this.nextElementSibling.style.display='inline-block';"
/>
<i class="fas fa-link icon-fallback" aria-hidden="true" style="display:none;"></i>
{{else}}
<i class="{{#if icon}}{{icon}}{{else}}fas fa-link{{/if}}"></i>
{{/ifHttpUrl}}
{{else}}
<i class="{{#if icon}}{{icon}}{{else}}fas fa-link{{/if}}"></i>
{{/ifEquals}}
<h3>{{#if name}}{{name}}{{else}}未命名站点{{/if}}</h3>
<p>{{#if description}}{{description}}{{else}}{{url}}{{/if}}</p>
</a>
{{/if}}