hexo-theme-stellar 2.0.0-rc.4 → 2.0.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/_config.yml +19 -25
  3. package/_data/icons.yml +3 -5
  4. package/layout/_partial/components/collection-item.ejs +1 -0
  5. package/layout/_partial/head.ejs +5 -30
  6. package/layout/_partial/main/article/share.ejs +2 -9
  7. package/layout/_partial/main/listing_nav/wiki.ejs +0 -2
  8. package/layout/_partial/main/navbar/article_banner.ejs +13 -11
  9. package/layout/_partial/main/pin_slider.ejs +0 -230
  10. package/layout/_partial/main/post_list/post_card.ejs +1 -1
  11. package/layout/_partial/main/post_list/wiki_card.ejs +1 -1
  12. package/layout/_partial/scripts/defines.ejs +12 -66
  13. package/layout/_partial/scripts.ejs +1 -1
  14. package/layout/_partial/search/shortcut.ejs +1 -1
  15. package/layout/_partial/sidebar/brand.ejs +14 -10
  16. package/layout/_partial/sidebar/menu.ejs +0 -42
  17. package/layout/index_wiki.ejs +0 -38
  18. package/layout/layout.ejs +3 -21
  19. package/package.json +1 -1
  20. package/scripts/filters/lib/img_onerror.js +5 -2
  21. package/scripts/filters/runtime-minify.js +17 -0
  22. package/scripts/generators/stellar-icons.js +10 -23
  23. package/scripts/helpers/extension_assets.js +8 -0
  24. package/scripts/helpers/json_ld.js +0 -1
  25. package/scripts/helpers/ui_classes.js +1 -5
  26. package/scripts/lib/client-assets.js +73 -0
  27. package/scripts/lib/config-schema.js +4 -18
  28. package/scripts/lib/contribution-registry.js +14 -0
  29. package/scripts/lib/image-fallback.js +24 -0
  30. package/scripts/lib/menu.js +1 -1
  31. package/scripts/lib/models/notebook.js +0 -1
  32. package/scripts/lib/models/post.js +0 -1
  33. package/scripts/lib/models/shared.js +3 -8
  34. package/scripts/lib/models/topic.js +0 -1
  35. package/scripts/lib/models/wiki.js +2 -4
  36. package/scripts/lib/seo.js +1 -5
  37. package/scripts/lib/share-services.js +5 -20
  38. package/scripts/lib/widget-registry.js +3 -2
  39. package/scripts/schema/config-rules.js +11 -3
  40. package/scripts/schema/content-config-rules.js +3 -9
  41. package/scripts/schema/content-config-schema.js +1 -1
  42. package/scripts/schema/model-schema.js +6 -7
  43. package/scripts/tags/lib/dropdown.js +1 -1
  44. package/scripts/tags/lib/image.js +0 -1
  45. package/source/css/_appearances/_mixins.styl +29 -19
  46. package/source/css/_appearances/glass.styl +5 -0
  47. package/source/css/_appearances/minimal.styl +12 -3
  48. package/source/css/_common/dropdown.styl +4 -3
  49. package/source/css/_common/title.styl +14 -7
  50. package/source/css/_components/collection.styl +3 -0
  51. package/source/css/_components/layout.styl +57 -5
  52. package/source/css/_components/list.styl +1 -1
  53. package/source/css/_components/pages/article-story.styl +15 -5
  54. package/source/css/_components/pages/article-tech.styl +1 -11
  55. package/source/css/_components/partial/article-banner.styl +4 -2
  56. package/source/css/_components/partial/article-share.styl +7 -7
  57. package/source/css/_components/pin-slider.styl +1 -4
  58. package/source/css/_components/sidebar/brand.styl +8 -0
  59. package/source/css/_components/sidebar/search.styl +7 -4
  60. package/source/css/_components/sidebar/sidebar.styl +4 -2
  61. package/source/css/_components/tag-plugins/banner.styl +1 -1
  62. package/source/css/_components/tag-plugins/frame.styl +1 -0
  63. package/source/css/_components/widgets/toc.styl +90 -18
  64. package/source/css/_defines/theme_colorful.styl +5 -2
  65. package/source/js/main.js +56 -21
  66. package/source/js/runtime/extensions/adaptive-text.js +22 -0
  67. package/source/js/runtime/extensions/comments.js +54 -63
  68. package/source/js/runtime/extensions/pin-slider.js +220 -0
  69. package/source/js/runtime/extensions/reveal.js +15 -11
  70. package/source/js/search/shortcut.js +0 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.0-rc.5
4
+
5
+ > 发布日期:2026-09-12
6
+
7
+ 本节记录从公开候选 `2.0.0-rc.4` 到 `2.0.0-rc.5` 最终文件树的净变化。
8
+
9
+ ### 新功能
10
+
11
+ - Leftbar Brand 支持 `ghrepo: owner/repo` 仓库统计,优先于 `ghuser`;搜索按钮移入 Brand,由 `leftbar.brand.search` 控制,默认开启。
12
+ - 完善侧栏初始折叠状态,Tree、Linklist、Related 支持折叠栏;右栏随左栏收起显示紧凑目录,支持悬停和键盘焦点展开,目录活动指示条平滑跟随当前条目。
13
+ - Reveal 支持 `duration/interval/distance/blur`,默认分别为 800ms、200ms、8px、4px,可配置依次播放、位移和模糊。
14
+
15
+ ### 修复与改进
16
+
17
+ - 共享客户端配置、图标样式与置顶轮播脚本改为外部资源,集中处理图片失败回退,减少逐页重复 HTML;为 hexo-minify 排除原生 Runtime ESM,保留模块语义。
18
+ - 评论在页面挂载时立即开始加载,第三方资源加载不再阻塞页面初始化;保留页面卸载时取消与清理。
19
+ - 横幅统一使用页面 `cover`,作者页使用作者 `cover`,同步 SEO 图片来源;改进背景文字自适应与头像边框。
20
+ - 调整标题装饰、导航下划线、搜索图标与快捷键提示、侧栏间距、移动正文顶部留白和长目录标题;修复 frame 媒体比例,mark 默认使用主题色并改进暗色配色。
21
+
22
+ ### 升级注意(配置变更与破坏性改动)
23
+
24
+ - 删除 Menu 中的 `type: search` 项,改用 `leftbar.brand.search`;搜索需要启用 Provider 且 Brand 有图片或名称。该字段支持主题、Profile、Collection 和 Page 覆盖。
25
+ - 分享服务 `wechat` 改为通用 `qrcode`,移除 `link` 与 `system`;检查 `article.footer.share` 及内容 `footer.share`,当前支持 qrcode、weibo、x、telegram、whatsapp、email。
26
+ - 页面 `banner.image` 改用顶层 `cover`;Collection 不再声明 `banner`,页面 `banner` 仅保留 enabled/avatar/headline/tagline。移除 `article.banner.ratio`,横幅不再使用独立比例配置。
27
+ - 移除 `appearance.typography.heading_prefixes`,标题装饰由主题样式维护。
28
+ - Site Info、Rating、Vote 的服务 endpoint 默认留空,需要自行部署并填写地址;升级后如依赖这些服务,请显式配置对应 endpoint。
29
+
30
+ Full Changelog: [2.0.0-rc.4...2.0.0-rc.5](https://github.com/xaoxuu/hexo-theme-stellar/compare/2.0.0-rc.4...2.0.0-rc.5)
31
+
3
32
  ## 2.0.0-rc.4
4
33
 
5
34
  > 发布日期:2026-09-10
package/_config.yml CHANGED
@@ -38,9 +38,13 @@ leftbar:
38
38
  default_state: expanded
39
39
  # 配置 Leftbar 固定 Brand 内容。
40
40
  brand:
41
+ # 控制 Brand 区域的搜索按钮;需要配置 search.provider。
42
+ search: true
41
43
  # 设置 Leftbar Brand 的视觉样式;可选值为 regular 或 compact。
42
44
  style: regular
43
- # 设置站点 Brand 数据区的 GitHub 用户名;留空不显示。
45
+ # 设置 Brand 数据区的 GitHub 仓库(owner/repo);留空不显示仓库统计。
46
+ ghrepo: null
47
+ # 设置 Brand 数据区的 GitHub 用户名;未设置 ghrepo 时使用,留空不显示。
44
48
  ghuser: null
45
49
  # 配置品牌图片。
46
50
  image:
@@ -112,8 +116,6 @@ leftbar:
112
116
  icon: default:profile
113
117
  # 设置菜单链接。
114
118
  url: /about/
115
- # 声明默认的搜索入口。
116
- - type: search
117
119
  # 设置 Leftbar 内容 Widget;空数组表示清空内容区。
118
120
  widgets: []
119
121
  # 配置 Leftbar 固定底部区域。
@@ -472,10 +474,6 @@ article:
472
474
  category_colors:
473
475
  # 设置“探索号”分类的颜色。
474
476
  探索号: '#f44336'
475
- # 配置文章页横幅。
476
- banner:
477
- # 设置文章页横幅宽高比,数值必须大于 0。
478
- ratio: 2.5
479
477
  # 控制是否显示预计阅读时间。
480
478
  show_reading_time: false
481
479
  # 设置相关文章最大数量,0 表示不显示相关文章。
@@ -485,16 +483,14 @@ article:
485
483
  # 设置文章许可协议;false 表示不显示许可信息。
486
484
  license: 本文采用 [署名-非商业性使用-相同方式共享 4.0 国际](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可协议,转载请注明出处。
487
485
  # 设置文章分享服务;普通博客与 Topic 专栏博客默认全部启用,Wiki 与 Notebook 默认关闭,可通过 footer.share 显式开启。
488
- # 支持 wechat、weibo、x、telegram、whatsapp、email、link、system;空数组表示不显示分享入口。
486
+ # 支持 qrcode、weibo、x、telegram、whatsapp、email;空数组表示不显示分享入口。
489
487
  share:
490
- - wechat
488
+ - qrcode
491
489
  - weibo
492
490
  - x
493
491
  - telegram
494
492
  - whatsapp
495
493
  - email
496
- - link
497
- - system
498
494
  # 控制文章页页脚是否显示标签。
499
495
  show_tags: true
500
496
 
@@ -557,16 +553,6 @@ appearance:
557
553
  code_block: 0.8125rem
558
554
  # 设置正文对齐方式;可选值为 left、center、right 或 justify。
559
555
  content_align: left
560
- # 配置各级标题的前缀字符。
561
- heading_prefixes:
562
- # 设置二级标题前缀。
563
- h2: '#'
564
- # 设置三级标题前缀。
565
- h3: '='
566
- # 设置四级标题前缀。
567
- h4: '|'
568
- # 设置五级标题前缀。
569
- h5: ':'
570
556
 
571
557
  # 配置组件形状。
572
558
  shape:
@@ -832,7 +818,7 @@ tags:
832
818
  # 配置 mark 标签插件。
833
819
  mark:
834
820
  # 设置 mark 默认颜色。
835
- default_color: yellow
821
+ default_color: theme
836
822
  # 配置 hashtag 标签插件。
837
823
  hashtag:
838
824
  # 设置 hashtag 默认颜色;null 表示使用主题默认色。
@@ -891,6 +877,14 @@ features:
891
877
  reveal:
892
878
  # 控制是否启用滚动揭示动画。
893
879
  enabled: true
880
+ # 动画持续时间,单位毫秒,须大于或等于 0。
881
+ duration: 800
882
+ # 连续进入视口的元素依次开始播放的间隔,单位毫秒,须大于或等于 0;0 同时播放。
883
+ interval: 200
884
+ # 垂直移动距离,单位像素;正数从下方进入,负数从上方进入,0 仅淡入。
885
+ distance: 8
886
+ # 初始模糊半径,单位像素,须大于或等于 0;0 关闭模糊,较大值会增加渲染开销。
887
+ blur: 4
894
888
  # 配置卡片悬停效果。
895
889
  card_hover:
896
890
  # 控制是否启用鼠标跟随光照。
@@ -947,7 +941,7 @@ services:
947
941
  # 配置 site_info_api Provider。
948
942
  site_info_api:
949
943
  # 设置站点信息查询接口,{href} 会替换为目标网址。
950
- endpoint: https://api.xaox.cc/site_info/v1?url={href}
944
+ endpoint: # https://api.xaox.cc/site_info/v1?url={href} 需要自行部署服务:https://github.com/xaoxuu/site-info-api
951
945
  # 配置评分服务。
952
946
  rating:
953
947
  # 设置评分 Provider;可选值为 star_vote 或 null。
@@ -955,7 +949,7 @@ services:
955
949
  # 配置评分使用的 star_vote Provider。
956
950
  star_vote:
957
951
  # 设置评分接口地址。
958
- endpoint: https://star-vote.xaox.cc/api/rating
952
+ endpoint: # https://star-vote.xaox.cc/api/rating 需要自行部署服务:https://github.com/xaoxuu/star-vote
959
953
  # 配置投票服务。
960
954
  vote:
961
955
  # 设置投票 Provider;可选值为 star_vote 或 null。
@@ -963,7 +957,7 @@ services:
963
957
  # 配置投票使用的 star_vote Provider。
964
958
  star_vote:
965
959
  # 设置投票接口地址。
966
- endpoint: https://star-vote.xaox.cc/api/vote
960
+ endpoint: # https://star-vote.xaox.cc/api/vote 需要自行部署服务:https://github.com/xaoxuu/star-vote
967
961
  # 配置内容贡献者服务。
968
962
  contributors:
969
963
  # 设置贡献者 Provider。
package/_data/icons.yml CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # 通用入口、Shell 与设置
5
5
  default:rss: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="currentColor" d="M5 21q-.825 0-1.412-.587T3 19q0-.825.588-1.412T5 17q.825 0 1.413.588T7 19q0 .825-.587 1.413T5 21m13.5 0q-.65 0-1.088-.475T16.9 19.4q-.275-2.425-1.312-4.537T12.9 11.1q-1.65-1.65-3.762-2.687T4.6 7.1q-.65-.075-1.125-.512T3 5.5q0-.65.45-1.062t1.075-.363q3.075.275 5.763 1.563t4.737 3.337q2.05 2.05 3.338 4.738t1.562 5.762q.05.625-.363 1.075T18.5 21m-6 0q-.625 0-1.075-.437T10.85 19.5q-.225-1.225-.787-2.262T8.65 15.35q-.85-.85-1.888-1.412T4.5 13.15q-.625-.125-1.062-.575T3 11.5q0-.65.45-1.075t1.075-.325q1.825.25 3.413 1.063t2.837 2.062q1.25 1.25 2.063 2.838t1.062 3.412q.1.625-.325 1.075T12.5 21"/></svg>
6
- default:search: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><path fill="currentColor" d="M6 9H3c-.55 0-1-.45-1-1s.45-1 1-1h3c.55 0 1 .45 1 1s-.45 1-1 1m0 3H3c-.55 0-1 .45-1 1s.45 1 1 1h3c.55 0 1-.45 1-1s-.45-1-1-1m13.88 6.29l-3.12-3.12c-.86.56-1.89.88-3 .82c-2.37-.11-4.4-1.96-4.72-4.31a5.013 5.013 0 0 1 5.83-5.61c1.95.33 3.57 1.85 4 3.78c.33 1.46.01 2.82-.7 3.9l3.13 3.13c.39.39.39 1.02 0 1.41s-1.03.39-1.42 0M17 11c0-1.65-1.35-3-3-3s-3 1.35-3 3s1.35 3 3 3s3-1.35 3-3M3 19h8c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1"/></svg>
6
+ default:search: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Adapted from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE --><g fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 8h3M3 13h3M3 18h8M16.83 13.83l3.76 3.76"/><circle cx="14" cy="11" r="4"/></g></svg>
7
7
  default:leftbar: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-width="1.5"><path d="M2 11c0-3.771 0-5.657 1.172-6.828C4.343 3 6.229 3 10 3h4c3.771 0 5.657 0 6.828 1.172C22 5.343 22 7.229 22 11v2c0 3.771 0 5.657-1.172 6.828C19.657 21 17.771 21 14 21h-4c-3.771 0-5.657 0-6.828-1.172C2 18.657 2 16.771 2 13z"/><path id="sep" stroke-linecap="round" d="M5.5 10h6m-5 4h4m4.5 7V3"/></g></svg>
8
8
  default:leftbar-toggle: <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M3.172 4.172C2 5.343 2 7.229 2 11v2c0 3.771 0 5.657 1.172 6.828S6.229 21 10 21h5V3h-5C6.229 3 4.343 3 3.172 4.172" clip-rule="evenodd" opacity=".5"/><path fill="currentColor" d="M5.5 9.25a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5zm1 4a.75.75 0 0 0 0 1.5h4a.75.75 0 0 0 0-1.5zM22 13v-2c0-3.771 0-5.657-1.172-6.828c-.974-.975-3.192-1.139-5.828-1.166v17.988c2.636-.027 4.854-.191 5.828-1.166C22 18.657 22 16.771 22 13"/></svg>
9
9
  default:settings: <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><g fill="currentColor"><path fill-rule="evenodd" d="M12.4277 2C11.3139 2 10.2995 2.6007 8.27081 3.80211L7.58466 4.20846C5.55594 5.40987 4.54158 6.01057 3.98466 7C3.42773 7.98943 3.42773 9.19084 3.42773 11.5937V12.4063C3.42773 14.8092 3.42773 16.0106 3.98466 17C4.54158 17.9894 5.55594 18.5901 7.58466 19.7915L8.27081 20.1979C10.2995 21.3993 11.3139 22 12.4277 22C13.5416 22 14.5559 21.3993 16.5847 20.1979L17.2708 19.7915C19.2995 18.5901 20.3139 17.9894 20.8708 17C21.4277 16.0106 21.4277 14.8092 21.4277 12.4063V11.5937C21.4277 9.19084 21.4277 7.98943 20.8708 7C20.3139 6.01057 19.2995 5.40987 17.2708 4.20846L16.5847 3.80211C14.5559 2.6007 13.5416 2 12.4277 2Z" clip-rule="evenodd" opacity=".5"/><path d="M12.4277 8.25C10.3567 8.25 8.67773 9.92893 8.67773 12C8.67773 14.0711 10.3567 15.75 12.4277 15.75C14.4988 15.75 16.1777 14.0711 16.1777 12C16.1777 9.92893 14.4988 8.25 12.4277 8.25Z"/></g></svg>
@@ -18,7 +18,7 @@ default:github: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" v
18
18
  default:monitor: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="currentColor" d="M3 7c0-1.886 0-2.828.586-3.414C4.172 3 5.114 3 7 3h10c1.886 0 2.828 0 3.414.586C21 4.172 21 5.114 21 7v6c0 1.886 0 2.828-.586 3.414C19.828 17 18.886 17 17 17H7c-1.886 0-2.828 0-3.414-.586C3 15.828 3 14.886 3 13z" opacity=".5"/><path fill="currentColor" d="M12.75 17.75h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V17h1.5zM7 6.25h10a.75.75 0 0 1 0 1.5H7a.75.75 0 0 1 0-1.5"/></svg>
19
19
 
20
20
  # 内容标识与翻页
21
- default:back: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m15 5l-6 7l6 7"/></svg>
21
+ default:chevron-left: <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="m15 4-8 8 8 8"/></svg>
22
22
  default:arrow-left: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" fill-rule="evenodd" d="M22 6.426v11.148c0 1.847-1.6 3.015-2.903 2.118L13 15.232V8.768l6.097-4.46C20.399 3.411 22 4.58 22 6.426" clip-rule="evenodd" opacity=".5"/><path fill="currentColor" d="M13 7.123v9.754c0 1.616-1.467 2.638-2.661 1.853L2.92 13.853c-1.228-.807-1.228-2.899 0-3.706l7.42-4.877c1.193-.785 2.66.237 2.66 1.853"/></svg>
23
23
  default:arrow-right: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" fill-rule="evenodd" d="M2 6.426v11.148c0 1.847 1.6 3.015 2.903 2.118L11 15.232V8.768l-6.097-4.46C3.601 3.411 2 4.58 2 6.426" clip-rule="evenodd" opacity=".5"/><path fill="currentColor" d="M11 7.123v9.754c0 1.616 1.467 2.638 2.661 1.853l7.418-4.877c1.228-.807 1.228-2.899 0-3.706L13.66 5.27C12.467 4.485 11 5.507 11 7.123"/></svg>
24
24
  default:documents: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M5.879 2.879C5 3.757 5 5.172 5 8v8c0 2.828 0 4.243.879 5.121C6.757 22 8.172 22 11 22h2c2.828 0 4.243 0 5.121-.879C19 20.243 19 18.828 19 16V8c0-2.828 0-4.243-.879-5.121C17.243 2 15.828 2 13 2h-2c-2.828 0-4.243 0-5.121.879M8.25 17a.75.75 0 0 1 .75-.75h3a.75.75 0 0 1 0 1.5H9a.75.75 0 0 1-.75-.75M9 12.25a.75.75 0 0 0 0 1.5h6a.75.75 0 0 0 0-1.5zM8.25 9A.75.75 0 0 1 9 8.25h6a.75.75 0 0 1 0 1.5H9A.75.75 0 0 1 8.25 9" clip-rule="evenodd"/><path fill="currentColor" d="M5.235 4.058C5 4.941 5 6.177 5 8v8c0 1.823 0 3.058.235 3.942L5 19.924c-.975-.096-1.631-.313-2.121-.803C2 18.243 2 16.828 2 14v-4c0-2.829 0-4.243.879-5.121c.49-.49 1.146-.707 2.121-.803zm13.53 15.884C19 19.058 19 17.822 19 16V8c0-1.823 0-3.059-.235-3.942l.235.018c.975.096 1.631.313 2.121.803C22 5.757 22 7.17 22 9.999v4c0 2.83 0 4.243-.879 5.122c-.49.49-1.146.707-2.121.803z" opacity=".5"/></svg>
@@ -59,14 +59,12 @@ github:fork: <svg aria-hidden="true" role="img" class="color-icon-primary" viewB
59
59
  github:tag: <svg aria-hidden="true" role="img" class="color-icon-primary" viewBox="0 0 16 16" width="1em" height="1em" fill="currentColor" style="user-select:none;overflow:visible"><path fill-rule="evenodd" d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z"></path></svg>
60
60
 
61
61
  # 分享按钮
62
- share:wechat: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Simple Icons - https://creativecommons.org/publicdomain/zero/1.0/ --><path fill="currentColor" d="M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z"/></svg>
62
+ share:qrcode: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M10.553 13.447c-.424-.424-.95-.596-1.535-.675c-.553-.074-1.25-.074-2.086-.074H5.827c-.58 0-1.065 0-1.459.037c-.411.04-.795.124-1.146.34c-.345.21-.634.5-.845.844c-.216.352-.3.735-.34 1.147C2 15.459 2 15.944 2 16.525v.068c0 .884 0 1.597.055 2.17c.056.592.175 1.108.459 1.571c.288.47.682.864 1.152 1.152c.463.284.979.403 1.57.46C5.81 22 6.524 22 7.407 22h.07c.58 0 1.064 0 1.458-.037c.412-.04.795-.124 1.147-.34c.344-.21.633-.5.844-.844c.216-.352.3-.736.34-1.147c.037-.394.037-.879.037-1.46v-1.104c0-.836 0-1.533-.074-2.086c-.079-.584-.251-1.111-.675-1.535m-1.62-11.41c.412.04.795.124 1.147.34c.344.21.633.5.844.845c.216.351.3.735.34 1.146c.037.394.037.879.037 1.46v1.104c0 .836 0 1.533-.074 2.086c-.079.584-.251 1.111-.675 1.535s-.95.596-1.535.675c-.553.074-1.25.074-2.086.074H5.827c-.58 0-1.065 0-1.459-.037c-.411-.04-.795-.124-1.146-.34a2.56 2.56 0 0 1-.845-.844c-.216-.352-.3-.735-.34-1.147C2 8.54 2 8.056 2 7.475v-.068c0-.884 0-1.597.055-2.17c.056-.592.175-1.108.459-1.571c.288-.47.682-.864 1.152-1.152c.463-.284.979-.403 1.57-.46C5.81 2 6.524 2 7.407 2h.07c.58 0 1.064 0 1.458.037M16.593 2h-.068c-.58 0-1.065 0-1.46.037c-.41.04-.794.124-1.146.34c-.344.21-.633.5-.844.845c-.216.351-.3.735-.34 1.146c-.037.394-.037.879-.037 1.46v1.104c0 .836 0 1.533.074 2.086c.079.584.251 1.111.675 1.535s.95.596 1.535.675c.553.074 1.25.074 2.086.074h1.105c.58 0 1.065 0 1.459-.037c.411-.04.795-.124 1.146-.34c.345-.21.634-.5.845-.844c.216-.352.3-.735.34-1.147C22 8.54 22 8.056 22 7.475v-.068c0-.884 0-1.597-.055-2.17c-.056-.592-.175-1.108-.459-1.571a3.5 3.5 0 0 0-1.152-1.152c-.463-.284-.979-.403-1.57-.46C18.19 2 17.477 2 16.594 2" opacity=".5"/><path fill="currentColor" d="M14.093 21.302a.698.698 0 1 1-1.396 0v-2.79h1.396z" opacity=".4"/><path fill="currentColor" d="M21.302 12.698a.7.7 0 0 0-.697.697v3.256H22v-3.256a.7.7 0 0 0-.698-.697" opacity=".5"/><path fill="currentColor" d="M16.076 16.617c-.076.184-.076.417-.076.883s0 .699.076.883a1 1 0 0 0 .541.54c.184.077.417.077.883.077s.699 0 .883-.076a1 1 0 0 0 .54-.541c.077-.184.077-.417.077-.883s0-.699-.076-.883a1 1 0 0 0-.541-.54C18.199 16 17.966 16 17.5 16s-.699 0-.883.076a1 1 0 0 0-.54.541"/><path fill="currentColor" d="M22 18.535v-.023h-1.396c0 .443 0 .74-.016.97c-.015.224-.043.333-.073.405a1.16 1.16 0 0 1-.629.63c-.072.029-.18.056-.405.072c-.23.015-.527.016-.97.016h-1.86V22h1.883c.414 0 .759 0 1.042-.02a2.6 2.6 0 0 0 .844-.175a2.56 2.56 0 0 0 1.384-1.384c.112-.27.156-.549.176-.844c.02-.283.02-.628.02-1.042" opacity=".7"/><path fill="currentColor" d="M12.697 16.616v.035h1.396c0-.668 0-1.116.035-1.458c.034-.33.093-.482.16-.583a1.2 1.2 0 0 1 .321-.32c.101-.068.254-.128.584-.161c.342-.035.79-.036 1.458-.036h1.86v-1.395h-1.896c-.623 0-1.142 0-1.563.043c-.44.044-.85.142-1.218.388c-.28.187-.519.426-.706.706c-.246.368-.343.777-.388 1.217c-.043.421-.043.94-.043 1.564" opacity=".6"/><path fill="currentColor" d="M5.508 18.69c.219.155.528.155 1.146.155c.619 0 .928 0 1.146-.155a.8.8 0 0 0 .2-.199c.154-.218.154-.527.154-1.146s0-.927-.155-1.146A.8.8 0 0 0 7.8 16c-.218-.155-.527-.155-1.146-.155s-.927 0-1.146.155a.8.8 0 0 0-.199.2c-.155.218-.155.527-.155 1.145c0 .619 0 .928.155 1.146a.8.8 0 0 0 .2.2M6.654 8.155c-.618 0-.927 0-1.146-.155a.8.8 0 0 1-.199-.2c-.155-.217-.155-.527-.155-1.145c0-.619 0-.928.155-1.146a.8.8 0 0 1 .2-.2c.218-.154.527-.154 1.145-.154c.619 0 .928 0 1.146.155a.8.8 0 0 1 .2.199c.154.218.154.527.154 1.146s0 .928-.155 1.146A.8.8 0 0 1 7.8 8c-.218.155-.527.155-1.146.155M16.2 8c.218.155.527.155 1.146.155s.927 0 1.146-.155a.8.8 0 0 0 .199-.199c.155-.218.155-.528.155-1.146c0-.619 0-.928-.155-1.146a.8.8 0 0 0-.2-.2c-.218-.154-.527-.154-1.145-.154c-.619 0-.928 0-1.146.155a.8.8 0 0 0-.2.199c-.154.218-.154.527-.154 1.146s0 .928.155 1.146A.8.8 0 0 0 16.2 8"/></svg>
63
63
  share:weibo: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Simple Icons - https://creativecommons.org/publicdomain/zero/1.0/ --><path fill="currentColor" d="M10.098 20.323c-3.977.391-7.414-1.406-7.672-4.02-.259-2.609 2.759-5.047 6.74-5.441 3.979-.394 7.413 1.404 7.671 4.018.259 2.6-2.759 5.049-6.737 5.439l-.002.004zM9.05 17.219c-.384.616-1.208.884-1.829.602-.612-.279-.793-.991-.406-1.593.379-.595 1.176-.861 1.793-.601.622.263.82.972.442 1.592zm1.27-1.627c-.141.237-.449.353-.689.253-.236-.09-.313-.361-.177-.586.138-.227.436-.346.672-.24.239.09.315.36.18.601l.014-.028zm.176-2.719c-1.893-.493-4.033.45-4.857 2.118-.836 1.704-.026 3.591 1.886 4.21 1.983.64 4.318-.341 5.132-2.179.8-1.793-.201-3.642-2.161-4.149zm7.563-1.224c-.346-.105-.57-.18-.405-.615.375-.977.42-1.804 0-2.404-.781-1.112-2.915-1.053-5.364-.03 0 0-.766.331-.571-.271.376-1.217.315-2.224-.27-2.809-1.338-1.337-4.869.045-7.888 3.08C1.309 10.87 0 13.273 0 15.348c0 3.981 5.099 6.395 10.086 6.395 6.536 0 10.888-3.801 10.888-6.82 0-1.822-1.547-2.854-2.915-3.284v.01zm1.908-5.092c-.766-.856-1.908-1.187-2.96-.962-.436.09-.706.511-.616.932.09.42.511.691.932.602.511-.105 1.067.044 1.442.465.376.421.466.977.316 1.473-.136.406.089.856.51.992.405.119.857-.105.992-.512.33-1.021.12-2.178-.646-3.035l.03.045zm2.418-2.195c-1.576-1.757-3.905-2.419-6.054-1.968-.496.104-.812.587-.706 1.081.104.496.586.813 1.082.707 1.532-.331 3.185.15 4.296 1.383 1.112 1.246 1.429 2.943.947 4.416-.165.48.106 1.007.586 1.157.479.165.991-.104 1.157-.586.675-2.088.241-4.478-1.338-6.235l.03.045z"/></svg>
64
64
  share:x: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Simple Icons - https://creativecommons.org/publicdomain/zero/1.0/ --><path fill="currentColor" d="M14.234 10.162L22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299l-.929-1.329L3.076 1.56h3.182l5.965 8.532l.929 1.329l7.754 11.09h-3.182z"/></svg>
65
65
  share:telegram: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Simple Icons - https://creativecommons.org/publicdomain/zero/1.0/ --><path fill="currentColor" d="M11.944 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12a12 12 0 0 0 12-12A12 12 0 0 0 12 0zm4.962 7.224c.1-.002.321.023.465.14a.5.5 0 0 1 .171.325c.016.093.036.306.02.472c-.18 1.898-.962 6.502-1.36 8.627c-.168.9-.499 1.201-.82 1.23c-.696.065-1.225-.46-1.9-.902c-1.056-.693-1.653-1.124-2.678-1.8c-1.185-.78-.417-1.21.258-1.91c.177-.184 3.247-2.977 3.307-3.23c.007-.032.014-.15-.056-.212s-.174-.041-.249-.024q-.159.037-5.061 3.345q-.72.495-1.302.48c-.428-.008-1.252-.241-1.865-.44c-.752-.245-1.349-.374-1.297-.789q.04-.324.893-.663q5.247-2.286 6.998-3.014c3.332-1.386 4.025-1.627 4.476-1.635"/></svg>
66
66
  share:whatsapp: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Simple Icons - https://creativecommons.org/publicdomain/zero/1.0/ --><path fill="currentColor" d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967c-.273-.099-.471-.148-.67.15c-.197.297-.767.966-.94 1.164c-.173.199-.347.223-.644.075c-.297-.15-1.255-.463-2.39-1.475c-.883-.788-1.48-1.761-1.653-2.059c-.173-.297-.018-.458.13-.606c.134-.133.298-.347.446-.52s.198-.298.298-.497c.099-.198.05-.371-.025-.52s-.669-1.612-.916-2.207c-.242-.579-.487-.5-.669-.51a13 13 0 0 0-.57-.01c-.198 0-.52.074-.792.372c-.272.297-1.04 1.016-1.04 2.479c0 1.462 1.065 2.875 1.213 3.074s2.096 3.2 5.077 4.487c.709.306 1.262.489 1.694.625c.712.227 1.36.195 1.871.118c.571-.085 1.758-.719 2.006-1.413s.248-1.289.173-1.413c-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214l-3.741.982l.998-3.648l-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884c2.64 0 5.122 1.03 6.988 2.898a9.82 9.82 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.82 11.82 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.9 11.9 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.82 11.82 0 0 0-3.48-8.413"/></svg>
67
67
  share:email: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" fill-rule="evenodd" d="M3.172 5.172C2 6.343 2 8.229 2 12s0 5.657 1.172 6.828C4.343 20 6.229 20 10 20h4c3.771 0 5.657 0 6.828-1.172C22 17.657 22 15.771 22 12s0-5.657-1.172-6.828C19.657 4 17.771 4 14 4h-4C6.229 4 4.343 4 3.172 5.172m15.404 2.348a.75.75 0 0 1-.096 1.056l-2.196 1.83c-.887.739-1.605 1.338-2.24 1.746-.66.424-1.303.693-2.044.693s-1.384-.269-2.045-.693c-.634-.408-1.352-1.007-2.239-1.745L5.52 8.576a.75.75 0 1 1 .96-1.152l2.159 1.799c.933.777 1.58 1.315 2.128 1.667.529.34.888.455 1.233.455s.704-.115 1.233-.455c.547-.352 1.195-.89 2.128-1.667l2.159-1.8a.75.75 0 0 1 1.056.097" clip-rule="evenodd"/></svg>
68
- share:link: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M19.739 4.261a6.867 6.867 0 0 0-9.711 0l-.72.721a.75.75 0 0 0 1.06 1.06l.72-.72a5.367 5.367 0 1 1 7.59 7.59l-.72.72a.75.75 0 0 0 1.06 1.06l.72-.72a6.867 6.867 0 0 0 0-9.71M6.043 9.307a.75.75 0 0 1 0 1.06l-.721.722a5.367 5.367 0 1 0 7.59 7.59l.72-.722a.75.75 0 0 1 1.06 1.06l-.72.722a6.867 6.867 0 0 1-9.71-9.711l.72-.72a.75.75 0 0 1 1.06 0"/><path fill="currentColor" d="M14.693 9.307a.75.75 0 0 1 0 1.06l-4.325 4.326a.75.75 0 1 1-1.06-1.06l4.324-4.326a.75.75 0 0 1 1.06 0"/></svg>
69
- share:system: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M1 13.529c0-4.667 0-7 1.45-8.45s3.783-1.45 8.45-1.45s7 0 8.45 1.45s1.45 3.783 1.45 8.45s0 7-1.45 8.45s-3.783 1.45-8.45 1.45s-7 0-8.45-1.45S1 18.196 1 13.53" opacity=".5"/><path fill="currentColor" d="m17.67 1.907l2.593 2.248c1.785 1.546 2.678 2.32 2.678 3.325c0 1.004-.893 1.778-2.678 3.325l-2.593 2.247c-.785.68-1.177 1.02-1.498.873c-.322-.146-.322-.666-.322-1.704v-1.677c-2.65 0-5.477.988-7.2 2.7c-.525.52-.788.781-.927.715c-.14-.066-.107-.403-.042-1.076c.648-6.721 5.061-8.468 8.169-8.468V2.74c0-1.04 0-1.558.322-1.705c.321-.147.713.193 1.498.873"/></svg>
70
68
 
71
69
  # 标签插件:通用
72
70
  copy:copy: <svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --><g fill="currentColor"><path d="M6.59961 11.3974C6.59961 8.67119 6.59961 7.3081 7.44314 6.46118C8.28667 5.61426 9.64432 5.61426 12.3596 5.61426H15.2396C17.9549 5.61426 19.3125 5.61426 20.1561 6.46118C20.9996 7.3081 20.9996 8.6712 20.9996 11.3974V16.2167C20.9996 18.9429 20.9996 20.306 20.1561 21.1529C19.3125 21.9998 17.9549 21.9998 15.2396 21.9998H12.3596C9.64432 21.9998 8.28667 21.9998 7.44314 21.1529C6.59961 20.306 6.59961 18.9429 6.59961 16.2167V11.3974Z"/><path d="M4.17157 3.17157C3 4.34315 3 6.22876 3 10V12C3 15.7712 3 17.6569 4.17157 18.8284C4.78913 19.446 5.6051 19.738 6.79105 19.8761C6.59961 19.0353 6.59961 17.8796 6.59961 16.2167V11.3974C6.59961 8.6712 6.59961 7.3081 7.44314 6.46118C8.28667 5.61426 9.64432 5.61426 12.3596 5.61426H15.2396C16.8915 5.61426 18.0409 5.61426 18.8777 5.80494C18.7403 4.61146 18.4484 3.79154 17.8284 3.17157C16.6569 2 14.7712 2 11 2C7.22876 2 5.34315 2 4.17157 3.17157Z" opacity=".5"/></g></svg>
@@ -48,6 +48,7 @@ if (entryStyle.length > 0) primaryAttrs += ` style="${escape_html(entryStyle)}"`
48
48
  <%- `<${tagName} class="${escape_html(entryClasses)}"${primaryAttrs}${safeAttrs}>` %>
49
49
  <%- typeof entry.before === 'string' ? entry.before : '' %>
50
50
  <% if (entry.icon) { %><span class="ui-icon"><%- icon(entry.icon, 'no-lazy', true) %></span><% } %>
51
+ <% if (!entry.icon && showTitle) { %><span class="ui-collection__initial" aria-hidden="true"><%= (Array.from(entryTitle.trim())[0] || '').replace(/[a-z]/, function(letter) { return letter.toUpperCase() }) %></span><% } %>
51
52
  <% if (hasContent) { %>
52
53
  <span class="ui-collection__content">
53
54
  <% if (entryPrefix.length > 0) { %><span class="ui-collection__prefix"><%= entryPrefix %></span><% } %>
@@ -97,7 +97,7 @@ function og_args() {
97
97
  if (page.layout == 'post' && pageConfig.cover) {
98
98
  args.twitter_card = 'summary_large_image';
99
99
  }
100
- args.image = pageConfig.cover || pageConfig.banner?.image || first_content_image(page.content) || config.avatar || (config.email ? gravatar(config.email) : null);
100
+ args.image = pageConfig.cover || first_content_image(page.content) || config.avatar || (config.email ? gravatar(config.email) : null);
101
101
  return Object.assign(args, pageConfig.seo?.openGraph || {});
102
102
  }
103
103
 
@@ -256,33 +256,8 @@ function generate_canonical() {
256
256
  <%- page_meta(json_ld(pageViewModel || undefined)) %>
257
257
  <%- custom_inject('headEnd') %>
258
258
 
259
- <!-- icons.yml 驱动的 CSS 装饰图标 -->
260
- <%
261
- const iconCssVars = (() => {
262
- const map = {
263
- '--icon-h3-left': 'default:arrow-left',
264
- '--icon-h3-right': 'default:arrow-right',
265
- '--icon-quote-left': 'quot:quote-left',
266
- '--icon-quote-right': 'quot:quote-right'
267
- };
268
- let vars = [];
269
- for (const [name, key] of Object.entries(map)) {
270
- var raw = stellar_data('icons') && stellar_data('icons')[key];
271
- if (raw) vars.push(` ${name}: url("data:image/svg+xml,${encodeURIComponent(raw)}");`);
272
- }
273
- // 加载占位:由 icons.yml 的 default:loading 提供(内联 SVG 编码为 data URI,URL 直用)
274
- var loadingRaw = stellar_data('icons') && stellar_data('icons')['default:loading'];
275
- if (loadingRaw) {
276
- if (loadingRaw.trim().startsWith('<svg')) {
277
- vars.push(` --icon-loading: url("data:image/svg+xml,${encodeURIComponent(loadingRaw)}");`);
278
- } else {
279
- vars.push(` --icon-loading: url("${loadingRaw}");`);
280
- }
281
- }
282
- return vars.length > 0 ? `:root {\n${vars.join('\n')}\n}` : '';
283
- })();
284
- %>
285
- <% if (iconCssVars) { %>
286
- <style><%- iconCssVars %></style>
287
- <% } %>
259
+ <link rel="stylesheet" href="<%- stellar_client_assets().css.href %>">
260
+ <link rel="preload" as="script" href="<%- stellar_client_assets().js.href %>">
261
+ <% var inlineIconCss = stellar_client_assets().css.inline %>
262
+ <% if (inlineIconCss) { %><style><%- inlineIconCss %></style><% } %>
288
263
  </head>
@@ -22,12 +22,6 @@ function renderAction(service) {
22
22
  if (action.kind === 'toggle') {
23
23
  return `<a class="${classes}" onclick="util.toggle(&quot;${escape_html(action.target)}&quot;)" aria-label="${escape_html(label)}" title="${escape_html(label)}">${iconHtml}</a>`
24
24
  }
25
- if (action.kind === 'copy') {
26
- return `<a class="${classes}" data-copy-message="${escape_html(__('message.copied'))}" onclick="util.copy(&quot;${escape_html(action.target)}&quot;, this.dataset.copyMessage)" aria-label="${escape_html(label)}" title="${escape_html(label)}">${iconHtml}</a>`
27
- }
28
- if (action.kind === 'native') {
29
- return `<button type="button" class="${classes}" data-share-title="${escape_html(action.data.title)}" data-share-text="${escape_html(action.data.text)}" data-share-url="${escape_html(action.data.url)}" data-copy-target="${escape_html(action.target)}" data-copy-message="${escape_html(__('message.copied'))}" onclick="util.share(this)" aria-label="${escape_html(label)}" title="${escape_html(label)}">${iconHtml}</button>`
30
- }
31
25
  return ''
32
26
  }
33
27
 
@@ -39,13 +33,12 @@ function layoutDiv() {
39
33
  if (!share || !Array.isArray(share.services) || share.services.length === 0) return ''
40
34
  var buttons = share.services.map(renderAction).join('')
41
35
  if (buttons.length === 0) return ''
42
- var qrcode = share.services.includes('wechat')
43
- ? `<div class="qrcode" id="qrcode-wechat" style="opacity:0;height:0"><img src="https://api.qrserver.com/v1/create-qr-code/?size=256x256&amp;data=${urlenc(share.permalink)}"/></div>`
36
+ var qrcode = share.services.includes('qrcode')
37
+ ? `<div class="share-qrcode" id="share-qrcode" style="opacity:0;height:0"><img src="https://api.qrserver.com/v1/create-qr-code/?size=256x256&amp;data=${urlenc(share.permalink)}"/></div>`
44
38
  : ''
45
39
  return `
46
40
  <div class="article-share${scrollreveal(' ')}" id="share">
47
41
  <div class="body">
48
- <div class="link"><input class="copy-area" readonly="true" id="copy-link" value="${escape_html(share.permalink)}" /></div>
49
42
  <div class="social-wrap dis-select">${buttons}</div>
50
43
  ${qrcode}
51
44
  </div>
@@ -21,7 +21,6 @@ function layoutDiv() {
21
21
  el += ' class="active"';
22
22
  }
23
23
  el += ' href="' + pretty_url(wikiIndex.path) + '">' + __("btn.all_wiki") + '</a>';
24
- el += '</a>';
25
24
  // 项目分类
26
25
  for (var tag of wikiIndex.tags) {
27
26
  var projects = tag.itemIds.filter(id => wikiIndex.allItems.some(item => item.id === id))
@@ -31,7 +30,6 @@ function layoutDiv() {
31
30
  el += ' class="active"';
32
31
  }
33
32
  el += ' href="' + escape_html(pretty_url(tag.path)) + '">' + escape_html(tag.name) + '</a>';
34
- el += '</a>';
35
33
  }
36
34
  }
37
35
 
@@ -8,7 +8,7 @@ var wikiViewModel = renderViewModel?.collection?.profile === 'wiki' ? renderView
8
8
  var notebookViewModel = renderViewModel?.collection?.profile === 'notebook' ? renderViewModel : null
9
9
  var pageConfig = content_config(page)
10
10
  var banner = Object.assign({}, page.author
11
- ? { image: page.author.banner, avatar: page.author.avatar, tagline: page.author.description }
11
+ ? { avatar: page.author.avatar, tagline: page.author.description }
12
12
  : wikiViewModel
13
13
  ? wikiViewModel.render.article.banner
14
14
  : notebookViewModel
@@ -17,6 +17,8 @@ var banner = Object.assign({}, page.author
17
17
  ? postViewModel.render.article.banner
18
18
  : postViewModel ? postViewModel.item.presentation.banner : pageConfig.banner || {})
19
19
 
20
+ var bannerImage = page.author ? page.author.cover : renderViewModel ? renderViewModel.item.cover : pageConfig.cover
21
+
20
22
  // 标题
21
23
  if (banner.headline == null) {
22
24
  banner.headline = renderViewModel ? renderViewModel.item.title : page.title
@@ -57,7 +59,7 @@ function layoutTop() {
57
59
  }
58
60
  // AI 成分标签:置于第一行最右(阅读时长右侧);
59
61
  // banner 含图片时不用配置色,继承默认文字色(--text-banner)
60
- const bannerHasImage = banner.image && banner.image.length > 0
62
+ var bannerHasImage = bannerImage && bannerImage.length > 0
61
63
  rightHtml += ai_label(renderViewModel ? renderViewModel.item.presentation.article?.aiLabel : pageConfig.article?.aiLabel, 'cap', bannerHasImage)
62
64
  if (rightHtml.length > 0) {
63
65
  el += `<div class="right">${rightHtml}</div>`
@@ -98,9 +100,9 @@ function layoutIcon() {
98
100
  }
99
101
 
100
102
  function layoutBottom() {
101
- const el_icon = layoutIcon()
102
- const el_title = layoutTitle()
103
- const el_subtitle = layoutSubtitle()
103
+ var el_icon = layoutIcon()
104
+ var el_title = layoutTitle()
105
+ var el_subtitle = layoutSubtitle()
104
106
  var cls = ''
105
107
  if (el_title.length > 0 && el_subtitle.length == 0) {
106
108
  cls += ' only-title'
@@ -124,8 +126,8 @@ function layoutDiv() {
124
126
  if (banner.enabled === false) {
125
127
  return ``
126
128
  }
127
- const bottom = layoutBottom()
128
- const top = layoutTop()
129
+ var bottom = layoutBottom()
130
+ var top = layoutTop()
129
131
  if (top.length == 0 && bottom.length == 0) {
130
132
  return ``
131
133
  }
@@ -133,15 +135,15 @@ function layoutDiv() {
133
135
  var adaptiveAttr = ``
134
136
  var maskHtml = ``
135
137
  var el = ``
136
- if (banner.image?.length > 0) {
137
- bannerStyle += ` style="--bg-url:url('${banner.image.replace(/'/g, '%27')}')"`
138
+ if (bannerImage?.length > 0) {
139
+ bannerStyle += ` style="--bg-url:url('${bannerImage.replace(/'/g, '%27')}')"`
138
140
  // 背景图上方文字颜色自适应
139
141
  adaptiveAttr = ` data-text-adaptive="split"`
140
142
  }
141
143
  el += `<div class="article-banner-wrap${scrollreveal(' ')}">`
142
144
  el += `<div class="article banner top"${bannerStyle}>`
143
- if (banner.image?.length > 0) {
144
- el += `<img class="lazy bg" data-src="${banner.image}">`
145
+ if (bannerImage?.length > 0) {
146
+ el += `<img class="lazy bg" data-src="${bannerImage}">`
145
147
  maskHtml = `<div class="banner-mask banner-mask-top" aria-hidden="true"></div><div class="banner-mask banner-mask-bottom" aria-hidden="true"></div>`
146
148
  }
147
149
  el += `