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

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 (86) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +8 -0
  3. package/README_EN.md +8 -0
  4. package/_config.yml +25 -25
  5. package/_data/icons.yml +3 -5
  6. package/layout/_partial/components/collection-item.ejs +1 -0
  7. package/layout/_partial/cover/wiki_cover.ejs +9 -3
  8. package/layout/_partial/head.ejs +5 -30
  9. package/layout/_partial/main/article/share.ejs +2 -9
  10. package/layout/_partial/main/listing_nav/wiki.ejs +0 -2
  11. package/layout/_partial/main/navbar/article_banner.ejs +13 -11
  12. package/layout/_partial/main/pin_slider.ejs +0 -230
  13. package/layout/_partial/main/post_list/post_card.ejs +1 -1
  14. package/layout/_partial/main/post_list/wiki_card.ejs +1 -1
  15. package/layout/_partial/primitives/navigation.ejs +3 -2
  16. package/layout/_partial/regions/widgets.ejs +1 -1
  17. package/layout/_partial/scripts/defines.ejs +12 -66
  18. package/layout/_partial/scripts.ejs +1 -1
  19. package/layout/_partial/search/shortcut.ejs +1 -1
  20. package/layout/_partial/sidebar/brand.ejs +14 -10
  21. package/layout/_partial/sidebar/menu.ejs +3 -42
  22. package/layout/index_wiki.ejs +0 -38
  23. package/layout/layout.ejs +3 -21
  24. package/legal/THIRD-PARTY-NOTICES.md +2 -2
  25. package/package.json +1 -1
  26. package/scripts/filters/lib/img_onerror.js +5 -2
  27. package/scripts/filters/runtime-minify.js +17 -0
  28. package/scripts/generators/stellar-icons.js +10 -23
  29. package/scripts/helpers/extension_assets.js +8 -0
  30. package/scripts/helpers/json_ld.js +0 -1
  31. package/scripts/helpers/ui_classes.js +1 -5
  32. package/scripts/lib/client-assets.js +74 -0
  33. package/scripts/lib/config-schema.js +6 -20
  34. package/scripts/lib/contribution-registry.js +28 -0
  35. package/scripts/lib/hero-effect-registry.js +50 -1
  36. package/scripts/lib/image-fallback.js +24 -0
  37. package/scripts/lib/internal-constants.js +1 -0
  38. package/scripts/lib/menu.js +1 -1
  39. package/scripts/lib/models/notebook.js +0 -1
  40. package/scripts/lib/models/post.js +0 -1
  41. package/scripts/lib/models/shared.js +3 -8
  42. package/scripts/lib/models/topic.js +0 -1
  43. package/scripts/lib/models/wiki.js +4 -4
  44. package/scripts/lib/regions.js +8 -1
  45. package/scripts/lib/seo.js +1 -5
  46. package/scripts/lib/share-services.js +5 -20
  47. package/scripts/lib/widget-registry.js +3 -2
  48. package/scripts/schema/config-rules.js +14 -3
  49. package/scripts/schema/content-config-rules.js +6 -9
  50. package/scripts/schema/content-config-schema.js +3 -1
  51. package/scripts/schema/model-schema.js +9 -7
  52. package/scripts/tags/lib/dropdown.js +1 -1
  53. package/scripts/tags/lib/image.js +0 -1
  54. package/source/css/_appearances/_mixins.styl +29 -19
  55. package/source/css/_appearances/glass.styl +5 -0
  56. package/source/css/_appearances/minimal.styl +12 -3
  57. package/source/css/_common/dropdown.styl +4 -3
  58. package/source/css/_common/loading.styl +17 -0
  59. package/source/css/_common/title.styl +14 -7
  60. package/source/css/_components/collection.styl +3 -0
  61. package/source/css/_components/layout.styl +57 -5
  62. package/source/css/_components/list.styl +1 -1
  63. package/source/css/_components/pages/article-story.styl +15 -5
  64. package/source/css/_components/pages/article-tech.styl +1 -11
  65. package/source/css/_components/partial/article-banner.styl +4 -2
  66. package/source/css/_components/partial/article-share.styl +7 -7
  67. package/source/css/_components/partial/cover.styl +20 -0
  68. package/source/css/_components/pin-slider.styl +1 -4
  69. package/source/css/_components/sidebar/brand.styl +8 -0
  70. package/source/css/_components/sidebar/nav-area.styl +10 -0
  71. package/source/css/_components/sidebar/search.styl +7 -4
  72. package/source/css/_components/sidebar/sidebar.styl +4 -2
  73. package/source/css/_components/tag-plugins/banner.styl +1 -1
  74. package/source/css/_components/tag-plugins/frame.styl +1 -0
  75. package/source/css/_components/widgets/toc.styl +90 -18
  76. package/source/css/_defines/theme_colorful.styl +5 -2
  77. package/source/js/main.js +56 -21
  78. package/source/js/profile.js +1 -1
  79. package/source/js/runtime/extensions/adaptive-text.js +22 -0
  80. package/source/js/runtime/extensions/comments.js +54 -63
  81. package/source/js/runtime/extensions/hero-parallax.js +70 -0
  82. package/source/js/runtime/extensions/partial-navigation.js +18 -1
  83. package/source/js/runtime/extensions/pin-slider.js +220 -0
  84. package/source/js/runtime/extensions/reveal.js +15 -11
  85. package/source/js/runtime/hero-effects/strands.js +302 -0
  86. package/source/js/search/shortcut.js +0 -15
package/CHANGELOG.md CHANGED
@@ -1,5 +1,60 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.0-rc.6
4
+
5
+ > 发布日期:2026-09-18
6
+
7
+ 本节记录从公开候选 `2.0.0-rc.5` 到 `2.0.0-rc.6` 最终文件树的净变化。
8
+
9
+ ### 新功能
10
+
11
+ - Wiki Hero 新增视频背景 `hero.background.video`,静音循环自动播放,图片可用作 poster;设置视频时不加载动态效果。
12
+ - Hero 新增滚动视差 `hero.background.parallax`,范围 0–1、默认 0.2,设为 0 关闭位移;图片与视频背景随滚动淡出,减少动态效果偏好下关闭视差位移。
13
+ - 新增 Strands WebGL 背景效果,支持光带配色、形态、发光及玻璃折射参数。
14
+ - Leftbar 新增 `menu_columns`,支持 1–5 列,默认 1;1–2 列显示图标与标题,3–5 列仅显示图标并保留无障碍名称。支持 Profile、Collection、Page 覆盖。
15
+ - 新增 `services.gravatar.base_url`,侧栏与设置页共享访客头像镜像地址,默认 `https://gravatar.com/avatar/`;自定义服务需兼容 SHA-256 并包含 `/avatar/` 路径。
16
+
17
+ ### 修复与改进
18
+
19
+ - 同集合页面切换等待超过 150ms 时显示加载反馈,完成、失败或取消后清理,快速切换不闪烁。
20
+ - 修复目录活动指示条在 CSS 压缩后高度丢失的问题。
21
+ - 中英文安装说明补充 Windows PowerShell Blueprint 安装命令。
22
+
23
+ ### 升级注意
24
+
25
+ - 现有 Hero 背景默认启用 0.2 强度视差;如需关闭位移,显式设置 `hero.background.parallax: 0`。
26
+
27
+ Full Changelog: [2.0.0-rc.5...2.0.0-rc.6](https://github.com/xaoxuu/hexo-theme-stellar/compare/2.0.0-rc.5...2.0.0-rc.6)
28
+
29
+ ## 2.0.0-rc.5
30
+
31
+ > 发布日期:2026-09-12
32
+
33
+ 本节记录从公开候选 `2.0.0-rc.4` 到 `2.0.0-rc.5` 最终文件树的净变化。
34
+
35
+ ### 新功能
36
+
37
+ - Leftbar Brand 支持 `ghrepo: owner/repo` 仓库统计,优先于 `ghuser`;搜索按钮移入 Brand,由 `leftbar.brand.search` 控制,默认开启。
38
+ - 完善侧栏初始折叠状态,Tree、Linklist、Related 支持折叠栏;右栏随左栏收起显示紧凑目录,支持悬停和键盘焦点展开,目录活动指示条平滑跟随当前条目。
39
+ - Reveal 支持 `duration/interval/distance/blur`,默认分别为 800ms、200ms、8px、4px,可配置依次播放、位移和模糊。
40
+
41
+ ### 修复与改进
42
+
43
+ - 共享客户端配置、图标样式与置顶轮播脚本改为外部资源,集中处理图片失败回退,减少逐页重复 HTML;为 hexo-minify 排除原生 Runtime ESM,保留模块语义。
44
+ - 评论在页面挂载时立即开始加载,第三方资源加载不再阻塞页面初始化;保留页面卸载时取消与清理。
45
+ - 横幅统一使用页面 `cover`,作者页使用作者 `cover`,同步 SEO 图片来源;改进背景文字自适应与头像边框。
46
+ - 调整标题装饰、导航下划线、搜索图标与快捷键提示、侧栏间距、移动正文顶部留白和长目录标题;修复 frame 媒体比例,mark 默认使用主题色并改进暗色配色。
47
+
48
+ ### 升级注意(配置变更与破坏性改动)
49
+
50
+ - 删除 Menu 中的 `type: search` 项,改用 `leftbar.brand.search`;搜索需要启用 Provider 且 Brand 有图片或名称。该字段支持主题、Profile、Collection 和 Page 覆盖。
51
+ - 分享服务 `wechat` 改为通用 `qrcode`,移除 `link` 与 `system`;检查 `article.footer.share` 及内容 `footer.share`,当前支持 qrcode、weibo、x、telegram、whatsapp、email。
52
+ - 页面 `banner.image` 改用顶层 `cover`;Collection 不再声明 `banner`,页面 `banner` 仅保留 enabled/avatar/headline/tagline。移除 `article.banner.ratio`,横幅不再使用独立比例配置。
53
+ - 移除 `appearance.typography.heading_prefixes`,标题装饰由主题样式维护。
54
+ - Site Info、Rating、Vote 的服务 endpoint 默认留空,需要自行部署并填写地址;升级后如依赖这些服务,请显式配置对应 endpoint。
55
+
56
+ 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)
57
+
3
58
  ## 2.0.0-rc.4
4
59
 
5
60
  > 发布日期:2026-09-10
package/README.md CHANGED
@@ -49,10 +49,18 @@
49
49
 
50
50
  准备好 Git 和 npm 后,一条命令即可启动交互式蓝图安装器:
51
51
 
52
+ macOS / Linux:
53
+
52
54
  ```bash
53
55
  sh -c "$(curl -fsSL https://github.com/xaoxuu/hexo-theme-stellar-examples/raw/main/install.sh)"
54
56
  ```
55
57
 
58
+ Windows PowerShell 7+(`pwsh`):
59
+
60
+ ```powershell
61
+ & ([scriptblock]::Create((Invoke-RestMethod https://github.com/xaoxuu/hexo-theme-stellar-examples/raw/main/install.ps1)))
62
+ ```
63
+
56
64
  安装器会读取示例仓库的 [`blueprints.json`](https://github.com/xaoxuu/hexo-theme-stellar-examples/blob/main/blueprints.json),展示当前可用的蓝图,并依次确认蓝图、项目目录、依赖安装和创建计划。
57
65
 
58
66
  ### 从 npm 安装
package/README_EN.md CHANGED
@@ -49,10 +49,18 @@ Your writing preserves ideas while external data stays current. Remote content,
49
49
 
50
50
  With Git and npm available, launch the interactive Blueprint installer with one command:
51
51
 
52
+ macOS / Linux:
53
+
52
54
  ```bash
53
55
  sh -c "$(curl -fsSL https://github.com/xaoxuu/hexo-theme-stellar-examples/raw/main/install.sh)"
54
56
  ```
55
57
 
58
+ Windows PowerShell 7+ (`pwsh`):
59
+
60
+ ```powershell
61
+ & ([scriptblock]::Create((Invoke-RestMethod https://github.com/xaoxuu/hexo-theme-stellar-examples/raw/main/install.ps1)))
62
+ ```
63
+
56
64
  The installer reads the example repository's [`blueprints.json`](https://github.com/xaoxuu/hexo-theme-stellar-examples/blob/main/blueprints.json), presents the available Blueprints, then confirms the Blueprint, project directory, dependency installation, and creation plan.
57
65
 
58
66
  ### Install from npm
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:
@@ -54,6 +58,8 @@ leftbar:
54
58
  tagline: null
55
59
  # 设置品牌链接。
56
60
  href: /
61
+ # 设置 Leftbar 菜单列数(1–5);1–2 列显示图标与标题,3–5 列仅显示居中的图标。
62
+ menu_columns: 1
57
63
  # 设置 Leftbar 菜单项;数组会整体替换,空数组表示不显示菜单项。
58
64
  menu:
59
65
  # 声明默认的博客入口。
@@ -112,8 +118,6 @@ leftbar:
112
118
  icon: default:profile
113
119
  # 设置菜单链接。
114
120
  url: /about/
115
- # 声明默认的搜索入口。
116
- - type: search
117
121
  # 设置 Leftbar 内容 Widget;空数组表示清空内容区。
118
122
  widgets: []
119
123
  # 配置 Leftbar 固定底部区域。
@@ -472,10 +476,6 @@ article:
472
476
  category_colors:
473
477
  # 设置“探索号”分类的颜色。
474
478
  探索号: '#f44336'
475
- # 配置文章页横幅。
476
- banner:
477
- # 设置文章页横幅宽高比,数值必须大于 0。
478
- ratio: 2.5
479
479
  # 控制是否显示预计阅读时间。
480
480
  show_reading_time: false
481
481
  # 设置相关文章最大数量,0 表示不显示相关文章。
@@ -485,16 +485,14 @@ article:
485
485
  # 设置文章许可协议;false 表示不显示许可信息。
486
486
  license: 本文采用 [署名-非商业性使用-相同方式共享 4.0 国际](https://creativecommons.org/licenses/by-nc-sa/4.0/) 许可协议,转载请注明出处。
487
487
  # 设置文章分享服务;普通博客与 Topic 专栏博客默认全部启用,Wiki 与 Notebook 默认关闭,可通过 footer.share 显式开启。
488
- # 支持 wechat、weibo、x、telegram、whatsapp、email、link、system;空数组表示不显示分享入口。
488
+ # 支持 qrcode、weibo、x、telegram、whatsapp、email;空数组表示不显示分享入口。
489
489
  share:
490
- - wechat
490
+ - qrcode
491
491
  - weibo
492
492
  - x
493
493
  - telegram
494
494
  - whatsapp
495
495
  - email
496
- - link
497
- - system
498
496
  # 控制文章页页脚是否显示标签。
499
497
  show_tags: true
500
498
 
@@ -557,16 +555,6 @@ appearance:
557
555
  code_block: 0.8125rem
558
556
  # 设置正文对齐方式;可选值为 left、center、right 或 justify。
559
557
  content_align: left
560
- # 配置各级标题的前缀字符。
561
- heading_prefixes:
562
- # 设置二级标题前缀。
563
- h2: '#'
564
- # 设置三级标题前缀。
565
- h3: '='
566
- # 设置四级标题前缀。
567
- h4: '|'
568
- # 设置五级标题前缀。
569
- h5: ':'
570
558
 
571
559
  # 配置组件形状。
572
560
  shape:
@@ -832,7 +820,7 @@ tags:
832
820
  # 配置 mark 标签插件。
833
821
  mark:
834
822
  # 设置 mark 默认颜色。
835
- default_color: yellow
823
+ default_color: theme
836
824
  # 配置 hashtag 标签插件。
837
825
  hashtag:
838
826
  # 设置 hashtag 默认颜色;null 表示使用主题默认色。
@@ -891,6 +879,14 @@ features:
891
879
  reveal:
892
880
  # 控制是否启用滚动揭示动画。
893
881
  enabled: true
882
+ # 动画持续时间,单位毫秒,须大于或等于 0。
883
+ duration: 800
884
+ # 连续进入视口的元素依次开始播放的间隔,单位毫秒,须大于或等于 0;0 同时播放。
885
+ interval: 200
886
+ # 垂直移动距离,单位像素;正数从下方进入,负数从上方进入,0 仅淡入。
887
+ distance: 8
888
+ # 初始模糊半径,单位像素,须大于或等于 0;0 关闭模糊,较大值会增加渲染开销。
889
+ blur: 4
894
890
  # 配置卡片悬停效果。
895
891
  card_hover:
896
892
  # 控制是否启用鼠标跟随光照。
@@ -936,6 +932,10 @@ features:
936
932
 
937
933
  # 配置主题使用的数据服务。
938
934
  services:
935
+ # 配置访客身份头像使用的 Gravatar 服务(侧边栏与设置页共享)。
936
+ gravatar:
937
+ # 设置兼容 SHA-256 的头像镜像地址,包含 /avatar/ 路径;末尾斜杠可省略。
938
+ base_url: https://gravatar.com/avatar/
939
939
  # 配置所有动态 Markdown 内容共享的 Marked 客户端。
940
940
  markdown:
941
941
  # 自定义脚本地址;null 使用默认资源。
@@ -947,7 +947,7 @@ services:
947
947
  # 配置 site_info_api Provider。
948
948
  site_info_api:
949
949
  # 设置站点信息查询接口,{href} 会替换为目标网址。
950
- endpoint: https://api.xaox.cc/site_info/v1?url={href}
950
+ endpoint: # https://api.xaox.cc/site_info/v1?url={href} 需要自行部署服务:https://github.com/xaoxuu/site-info-api
951
951
  # 配置评分服务。
952
952
  rating:
953
953
  # 设置评分 Provider;可选值为 star_vote 或 null。
@@ -955,7 +955,7 @@ services:
955
955
  # 配置评分使用的 star_vote Provider。
956
956
  star_vote:
957
957
  # 设置评分接口地址。
958
- endpoint: https://star-vote.xaox.cc/api/rating
958
+ endpoint: # https://star-vote.xaox.cc/api/rating 需要自行部署服务:https://github.com/xaoxuu/star-vote
959
959
  # 配置投票服务。
960
960
  vote:
961
961
  # 设置投票 Provider;可选值为 star_vote 或 null。
@@ -963,7 +963,7 @@ services:
963
963
  # 配置投票使用的 star_vote Provider。
964
964
  star_vote:
965
965
  # 设置投票接口地址。
966
- endpoint: https://star-vote.xaox.cc/api/vote
966
+ endpoint: # https://star-vote.xaox.cc/api/vote 需要自行部署服务:https://github.com/xaoxuu/star-vote
967
967
  # 配置内容贡献者服务。
968
968
  contributors:
969
969
  # 设置贡献者 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><% } %>
@@ -13,6 +13,7 @@ function layoutWikiCover() {
13
13
  }
14
14
  var backgroundConfig = cover.background || {};
15
15
  var background = typeof backgroundConfig.image === 'string' && backgroundConfig.image.length > 0 ? backgroundConfig.image : '';
16
+ var video = typeof backgroundConfig.video === 'string' ? backgroundConfig.video.trim() : '';
16
17
  var effect = backgroundConfig.effect || {};
17
18
  var preview = cover.preview || {};
18
19
  var commands = Array.isArray(preview.commands) ? preview.commands.filter(function (item) {
@@ -25,7 +26,7 @@ function layoutWikiCover() {
25
26
  var actions = Array.isArray(cover.actions) ? cover.actions.filter(function (item) {
26
27
  return item && item.title && item.url;
27
28
  }) : [];
28
- var hasEffect = typeof effect.type === 'string' && effect.type.length > 0;
29
+ var hasEffect = !video && typeof effect.type === 'string' && effect.type.length > 0;
29
30
  var isImageBackground = background.length > 0;
30
31
  var effectOptions = effect.options && typeof effect.options === 'object' && !Array.isArray(effect.options) ? effect.options : {};
31
32
  var effectRuntime = effect.runtime && typeof effect.runtime === 'object' && !Array.isArray(effect.runtime) ? effect.runtime : {};
@@ -37,18 +38,23 @@ function layoutWikiCover() {
37
38
  var effectRuntimeJson = escape_html(JSON.stringify(effectRuntime));
38
39
  var projectName = cover.projectName;
39
40
  var adaptiveTextAttr = '';
40
- if (isImageBackground) {
41
+ if (video) {
42
+ adaptiveTextAttr = ' data-text-adaptive="split" style="--adaptive-background:#000000"';
43
+ } else if (isImageBackground) {
41
44
  adaptiveTextAttr = ' data-text-adaptive="split" style="--cover-url:url(\'' + escape_html(background.replace(/'/g, '%27')) + '\')"';
42
45
  } else if (hasEffect) {
43
46
  adaptiveTextAttr = ' data-text-adaptive="split" style="--adaptive-background:' + escape_html(effectBackground) + '"';
44
47
  }
45
48
 
46
49
  el += '<div class="cover-content wiki wiki-hero' + (hasPreview ? '' : ' without-preview') + '">';
47
- el += '<div class="wiki-cover-background' + (hasEffect ? ' has-effect' : '') + (respectsReducedMotion ? ' respect-reduced-motion' : '') + (isImageBackground ? ' image' : '') + '"' + (hasEffect ? ' style="--hero-effect-background:' + escape_html(effectBackground) + '"' : '') + ' aria-hidden="true">';
50
+ el += '<div class="wiki-cover-background' + (hasEffect ? ' has-effect' : '') + (respectsReducedMotion ? ' respect-reduced-motion' : '') + (isImageBackground ? ' image' : '') + (video ? ' has-video' : '') + '" data-parallax="' + escape_html(String(backgroundConfig.parallax)) + '"' + (hasEffect ? ' style="--hero-effect-background:' + escape_html(effectBackground) + '"' : '') + ' aria-hidden="true">';
48
51
  if (isImageBackground) {
49
52
  el += '<img class="wiki-cover-background-image" src="' + escape_html(background) + '" alt="" />';
50
53
  el += '<img class="wiki-cover-background-blur" src="' + escape_html(background) + '" alt="" />';
51
54
  }
55
+ if (video) {
56
+ el += '<video class="wiki-cover-background-video" src="' + escape_html(video) + '"' + (isImageBackground ? ' poster="' + escape_html(background) + '"' : '') + ' autoplay muted loop playsinline preload="metadata" disablepictureinpicture tabindex="-1"></video>';
57
+ }
52
58
  if (hasEffect) {
53
59
  el += '<canvas data-hero-effect="' + escape_html(effect.type) + '" data-effect-resource="' + effectResourceJson + '" data-effect-options="' + effectOptionsJson + '" data-effect-runtime="' + effectRuntimeJson + '"></canvas>';
54
60
  }
@@ -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 += `