hexo-theme-stellar 1.42.0 → 1.43.0

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 (122) hide show
  1. package/.claude/skills/stellar-theme-dev/SKILL.md +2 -0
  2. package/CHANGELOG.md +42 -0
  3. package/THIRD-PARTY-NOTICES.md +28 -0
  4. package/_config.yml +20 -10
  5. package/_data/icons.yml +10 -9
  6. package/languages/en.yml +11 -0
  7. package/languages/zh-CN.yml +11 -0
  8. package/languages/zh-TW.yml +11 -0
  9. package/layout/_partial/comments/artalk/layout.ejs +1 -1
  10. package/layout/_partial/comments/beaudar/layout.ejs +1 -1
  11. package/layout/_partial/comments/giscus/layout.ejs +1 -1
  12. package/layout/_partial/comments/twikoo/layout.ejs +1 -1
  13. package/layout/_partial/comments/utterances/layout.ejs +1 -1
  14. package/layout/_partial/comments/waline/layout.ejs +1 -1
  15. package/layout/_partial/components/collection-item.ejs +44 -0
  16. package/layout/_partial/components/collection.ejs +26 -0
  17. package/layout/_partial/components/widget-frame.ejs +35 -0
  18. package/layout/_partial/cover/wiki_cover.ejs +82 -26
  19. package/layout/_partial/dropdown.ejs +62 -0
  20. package/layout/_partial/head.ejs +9 -0
  21. package/layout/_partial/main/navbar/breadcrumb/blog.ejs +1 -1
  22. package/layout/_partial/main/post_list/archive_item.ejs +12 -0
  23. package/layout/_partial/main/post_list/topic_card.ejs +21 -9
  24. package/layout/_partial/main/post_list/wiki_card.ejs +49 -10
  25. package/layout/_partial/scripts/bootstrap.ejs +3 -1
  26. package/layout/_partial/scripts/defines.ejs +2 -8
  27. package/layout/_partial/scripts/lazyload.ejs +0 -3
  28. package/layout/_partial/scripts.ejs +1 -0
  29. package/layout/_partial/sidebar/index_leftbar.ejs +12 -2
  30. package/layout/_partial/sidebar/logo.ejs +1 -1
  31. package/layout/_partial/sidebar/menu.ejs +21 -23
  32. package/layout/_partial/widgets/components/linklist.ejs +23 -21
  33. package/layout/_partial/widgets/linklist.ejs +7 -12
  34. package/layout/_partial/widgets/recent.ejs +52 -41
  35. package/layout/_partial/widgets/related.ejs +47 -36
  36. package/layout/_partial/widgets/tagtree.ejs +70 -54
  37. package/layout/_partial/widgets/toc.ejs +37 -62
  38. package/layout/_partial/widgets/tree.ejs +38 -51
  39. package/layout/_plugins/index.ejs +25 -0
  40. package/layout/_plugins/mermaid.ejs +3 -4
  41. package/layout/archive.ejs +11 -20
  42. package/layout/collection-preview.ejs +60 -0
  43. package/layout/index_topic.ejs +12 -6
  44. package/layout/index_wiki.ejs +49 -3
  45. package/layout/layout.ejs +4 -3
  46. package/package.json +1 -1
  47. package/scripts/events/index.js +0 -2
  48. package/scripts/filters/lib/img_lazyload.js +184 -40
  49. package/scripts/generators/stellar-icons.js +1 -1
  50. package/scripts/lib/subtitle.js +5 -1
  51. package/scripts/tags/index.js +1 -0
  52. package/scripts/tags/lib/about.js +1 -1
  53. package/scripts/tags/lib/albums.js +1 -1
  54. package/scripts/tags/lib/banner.js +1 -1
  55. package/scripts/tags/lib/dropdown.js +64 -0
  56. package/scripts/tags/lib/friends.js +1 -1
  57. package/scripts/tags/lib/gallery.js +3 -3
  58. package/scripts/tags/lib/image.js +1 -1
  59. package/scripts/tags/lib/posters.js +1 -1
  60. package/scripts/tags/lib/sites.js +8 -4
  61. package/source/css/_common/base.styl +4 -4
  62. package/source/css/_common/blockquote.styl +2 -2
  63. package/source/css/_common/dropdown.styl +132 -0
  64. package/source/css/_common/html.styl +1 -1
  65. package/source/css/_common/loading.styl +5 -2
  66. package/source/css/_common/title.styl +8 -8
  67. package/source/css/_components/collection.styl +188 -0
  68. package/source/css/_components/layout.styl +1 -1
  69. package/source/css/_components/list.styl +44 -46
  70. package/source/css/_components/md.styl +3 -3
  71. package/source/css/_components/page-transition.styl +22 -0
  72. package/source/css/_components/pages/archives.styl +19 -18
  73. package/source/css/_components/pages/article-indent.styl +2 -2
  74. package/source/css/_components/pages/article-story.styl +9 -5
  75. package/source/css/_components/pages/collection-preview.styl +68 -0
  76. package/source/css/_components/pages/notebook.styl +11 -9
  77. package/source/css/_components/partial/article-footer.styl +7 -4
  78. package/source/css/_components/partial/cover.styl +280 -1
  79. package/source/css/_components/partial/related.styl +10 -6
  80. package/source/css/_components/sidebar/footer.styl +65 -12
  81. package/source/css/_components/sidebar/nav-area.styl +6 -1
  82. package/source/css/_components/sidebar/search.styl +6 -2
  83. package/source/css/_components/tag-plugins/chat.styl +1 -1
  84. package/source/css/_components/tag-plugins/folders.styl +4 -4
  85. package/source/css/_components/tag-plugins/folding.styl +3 -3
  86. package/source/css/_components/tag-plugins/hashtag.styl +2 -3
  87. package/source/css/_components/tag-plugins/mdrender.styl +1 -1
  88. package/source/css/_components/tag-plugins/note.styl +4 -4
  89. package/source/css/_components/tag-plugins/poetry.styl +5 -5
  90. package/source/css/_components/tag-plugins/quot.styl +1 -2
  91. package/source/css/_components/tag-plugins/quote.styl +1 -1
  92. package/source/css/_components/tag-plugins/tabs.styl +2 -2
  93. package/source/css/_components/tag-plugins/timeline.styl +4 -4
  94. package/source/css/_components/widgets/ghrepo.styl +4 -0
  95. package/source/css/_components/widgets/markdown.styl +1 -14
  96. package/source/css/_components/widgets/timeline.styl +2 -2
  97. package/source/css/_components/widgets/toc.styl +22 -20
  98. package/source/css/_components/widgets/widgets.styl +13 -1
  99. package/source/css/_components/wiki-card.styl +209 -0
  100. package/source/css/_custom.styl +22 -20
  101. package/source/css/_plugins/lazyload.styl +8 -5
  102. package/source/css/comments/utterances.styl +2 -2
  103. package/source/css/comments/waline.styl +24 -0
  104. package/source/css/plugins/mermaid.styl +31 -12
  105. package/source/js/icons.js +1 -1
  106. package/source/js/main.js +62 -6
  107. package/source/js/plugins/adaptive-text.js +46 -2
  108. package/source/js/plugins/dropdown.js +435 -0
  109. package/source/js/plugins/galaxy.js +423 -0
  110. package/source/js/search/algolia-search.js +1 -1
  111. package/source/js/search/local-search.js +1 -1
  112. package/source/js/services/ghinfo.js +31 -3
  113. package/source/js/services/siteinfo.js +26 -0
  114. package/source/js/services/sites.js +6 -2
  115. package/source/js/services.js +5 -2
  116. package/source/js/tagtree.js +7 -7
  117. package/source/js/utils.js +1 -1
  118. package/layout/_partial/widgets/components/link.ejs +0 -21
  119. package/source/css/_components/sidebar/menu.styl +0 -77
  120. package/source/css/_components/widgets/components.styl +0 -68
  121. package/source/css/_components/widgets/list.styl +0 -46
  122. package/source/css/_components/widgets/related.styl +0 -40
@@ -118,13 +118,17 @@
118
118
  list-style-type: none
119
119
  li a
120
120
  display: block
121
- background: var(--bg-a20)
121
+ background: var(--ui-summary-item-bg)
122
122
  line-height: 1.2
123
123
  padding: 0.75rem 1rem
124
124
  border-radius: $border-card-s
125
125
  trans1 background
126
126
  &:hover
127
- background: var(--bg-a50)
127
+ background: var(--ui-adapter-bg-hover)
128
+ box-shadow: var(--ui-adapter-shadow-hover)
129
+ &:focus-visible
130
+ outline: 2px solid var(--theme)
131
+ outline-offset: 2px
128
132
  li+li
129
133
  margin-top: 8px
130
134
  .search-result-title
@@ -314,7 +314,7 @@ chat_dark()
314
314
  align-items: center
315
315
  >svg,
316
316
  >span
317
- height: $fs-12 + .05rem
317
+ height: 'calc(%s * 0.8)' % var(--fs-content-base)
318
318
 
319
319
  &.voice
320
320
  display: flex
@@ -1,7 +1,7 @@
1
1
  .tag-plugin.folders
2
2
  margin: var(--gap-p) 0
3
- --fsp: $fsp2
4
- font-size: var(--fsp)
3
+ --fs-content: $fs-content-2
4
+ font-size: var(--fs-content)
5
5
  border-top: 1px solid var(--block-border)
6
6
  overflow: hidden
7
7
  .folder
@@ -43,8 +43,8 @@
43
43
  content: '-'
44
44
 
45
45
  >div.body
46
- --fsp: $fsp1
46
+ --fs-content: $fs-content-1
47
47
  >:first-child
48
48
  margin-top: 1rem
49
49
  >:last-child
50
- margin-bottom: 0
50
+ margin-bottom: 0
@@ -11,8 +11,8 @@ details.folding
11
11
  margin: -1rem
12
12
  color: var(--text-p2)
13
13
  font-weight: 500
14
- --fsp: $fsp2
15
- font-size: var(--fsp)
14
+ --fs-content: $fs-content-2
15
+ font-size: var(--fs-content)
16
16
  position: relative
17
17
  line-height: 1.2
18
18
  outline: none
@@ -45,7 +45,7 @@ details.folding[open]
45
45
  padding: 0 1rem 1rem
46
46
  margin: 0 -1rem -1rem
47
47
  color: var(--text-p1)
48
- --fsp: $fsp1
48
+ --fs-content: $fs-content-1
49
49
  >:first-child
50
50
  margin-top: 1rem
51
51
  >:last-child
@@ -6,8 +6,8 @@
6
6
  margin: 2px 0
7
7
  display: inline-flex
8
8
  align-items: center
9
- --fsp: $fsp2
10
- font-size: var(--fsp)
9
+ --fs-content: $fs-content-2
10
+ font-size: var(--fs-content)
11
11
  font-weight: 500
12
12
  trans2 background color
13
13
  span
@@ -15,4 +15,3 @@
15
15
  &:hover
16
16
  background: var(--text-p2)
17
17
  color: var(--theme-block)
18
-
@@ -1,6 +1,6 @@
1
1
  .ds-mdrender
2
2
  p strong
3
- font-size: $fs-body
3
+ font-size: var(--fs-content)
4
4
  font-weight: 500
5
5
  color: var(--text)
6
6
 
@@ -8,16 +8,16 @@
8
8
  border: 1px solid var(--theme-border)
9
9
  color: var(--text-p1)
10
10
  >.title
11
- --fsp: $fsp1
12
- font-size: var(--fsp)
11
+ --fs-content: $fs-content-1
12
+ font-size: var(--fs-content)
13
13
  line-height: 1.5
14
14
  margin-top: var(--gap-p-compact)
15
15
  font-weight: 500
16
16
  color: var(--text)
17
17
  >.body
18
18
  &,p
19
- --fsp: $fsp2
20
- font-size: var(--fsp)
19
+ --fs-content: $fs-content-2
20
+ font-size: var(--fs-content)
21
21
  line-height: 1.5
22
22
  margin-top: var(--gap-p-compact)
23
23
  margin-bottom: var(--gap-p-compact)
@@ -3,15 +3,15 @@
3
3
  flex-direction: column
4
4
  align-items: center
5
5
  text-align: left
6
- --fsp: $fs-body
6
+ --fs-content: var(--fs-content-base)
7
7
  .content
8
8
  >.title
9
9
  font-weight: 500
10
10
  margin-top: var(--gap-p)
11
11
  >.meta
12
12
  color: var(--text-p2)
13
- --fsp: $fsp3
14
- font-size: var(--fsp)
13
+ --fs-content: $fs-content-3
14
+ font-size: var(--fs-content)
15
15
  font-weight: 500
16
16
  span+span
17
17
  margin-left: 4px
@@ -24,8 +24,8 @@
24
24
  font-style: italic
25
25
  color: var(--text-p4)
26
26
  margin: var(--gap-p) 0
27
- --fsp: $fsp3
28
- font-size: var(--fsp)
27
+ --fs-content: $fs-content-3
28
+ font-size: var(--fs-content)
29
29
 
30
30
  // 描边修饰
31
31
  .md-text .tag-plugin.poetry .content
@@ -29,7 +29,7 @@
29
29
  h3,h4,h5,h6
30
30
  font-size: $fsh3
31
31
  p
32
- font-size: calc(var(--fsp) + 2px)
32
+ font-size: calc(var(--fs-content) + 2px)
33
33
  color: var(--text)
34
34
 
35
35
  // type=icon
@@ -71,4 +71,3 @@
71
71
  opacity: 0.2
72
72
  filter: blur(8px)
73
73
  transform: translateY(4px) scale(1.2, 1.5)
74
-
@@ -4,4 +4,4 @@
4
4
  text-indent: 0 !important
5
5
  &[indent='true']
6
6
  p:not([class])
7
- text-indent: 'calc(%s * 2)' % var(--fsp) !important
7
+ text-indent: 'calc(%s * 2)' % var(--fs-content) !important
@@ -44,8 +44,8 @@
44
44
  display: block
45
45
  cursor: pointer
46
46
  padding: .25rem .75rem
47
- --fsp: $fsp3
48
- font-size: var(--fsp)
47
+ --fs-content: $fs-content-3
48
+ font-size: var(--fs-content)
49
49
  line-height: inherit
50
50
  font-weight: 500
51
51
  color: var(--text-p3)
@@ -96,7 +96,7 @@
96
96
  margin-top: 4px
97
97
  box-shadow: $boxshadow-block
98
98
  p
99
- --fsp: $fsp1
99
+ --fs-content: $fs-content-1
100
100
  img
101
101
  display: block
102
102
  &:empty
@@ -112,8 +112,8 @@
112
112
  color: var(--text-p1)
113
113
  line-height: 1.25
114
114
  padding: 0.75rem 1rem
115
- --fsp: $fsp1
116
- font-size: var(--fsp)
115
+ --fs-content: $fs-content-1
116
+ font-size: var(--fs-content)
117
117
  &.ds-artalk .body
118
118
  img
119
119
  max-height: 1.5em
@@ -218,7 +218,7 @@ aside .tag-plugin.timeline[data-api] .body .lazy-box
218
218
  padding: 0 0.5rem
219
219
  margin: 0.75rem 0
220
220
  p
221
- --fsp: $fsp2
221
+ --fs-content: $fs-content-2
222
222
  margin: 0.25rem
223
223
 
224
224
  .tag-plugin.timeline .body
@@ -28,3 +28,7 @@
28
28
  display: grid
29
29
  grid-gap: 2px
30
30
  grid-template-columns: repeat(auto-fill, "calc((100% - 2 * %s) / 3)" % 2px)
31
+ .flex-row
32
+ min-width: 0
33
+ span
34
+ txt-ellipsis()
@@ -6,18 +6,5 @@
6
6
  >*:first-child
7
7
  margin-top: .75rem
8
8
 
9
- .widget-wrapper.markdown .linklist
9
+ .widget-wrapper.markdown .ui-collection
10
10
  margin: 1em 0
11
- .link
12
- background: var(--bg-a50)
13
- .link:hover
14
- background: var(--bg-a100)
15
-
16
- .l_left .widget-wrapper.markdown .linklist .link:hover
17
- sidebar-light()
18
-
19
- .l_right .widget-wrapper.markdown .linklist
20
- .link
21
- background: var(--block)
22
- .link:hover
23
- background: var(--theme-a20)
@@ -9,7 +9,7 @@
9
9
  a
10
10
  trans1 all
11
11
  word-break: break-all
12
- --fsp: $fsp2
12
+ --fs-content: $fs-content-2
13
13
  .tag-plugin.timeline .timenode
14
14
  z-index 1
15
15
  margin-top: 0.25rem
@@ -27,7 +27,7 @@
27
27
  border-radius: $border-card
28
28
  padding: 0.5rem 1rem
29
29
  p,li
30
- --fsp: $fsp3
30
+ --fs-content: $fs-content-3
31
31
  code
32
32
  background: none
33
33
  padding: 0
@@ -5,8 +5,8 @@
5
5
  &:before
6
6
  content: ''
7
7
  position absolute
8
- top: 6px
9
- bottom: 6px
8
+ top: 8px
9
+ bottom: 8px
10
10
  left: 0
11
11
  width: 4px
12
12
  background: var(--block)
@@ -16,13 +16,14 @@
16
16
  @media screen and (min-width: $device-laptop)
17
17
  background: var(--background)
18
18
 
19
- .l_left .widget-wrapper.toc
19
+ [data-ui-surface='glass'] .widget-wrapper.toc,
20
+ [data-ui-surface='card'] .widget-wrapper.toc
20
21
  @media screen and (min-width: $device-laptop)
21
22
  background: none
22
23
 
23
24
  // 目录基本样式
24
25
  .widget-wrapper.toc .toc
25
- --fsp: $fsp2
26
+ --fs-content: $fs-content-2
26
27
  padding: 0
27
28
  margin: 0
28
29
  position relative
@@ -35,7 +36,7 @@
35
36
  --padding-offset: calc(0 - var(--padding))
36
37
  padding: 4px var(--padding)
37
38
  margin: 0 var(--padding)
38
- color: var(--text-p3)
39
+ color: var(--ui-item-muted)
39
40
  display: block
40
41
  position relative
41
42
  border-radius: $border-bar
@@ -43,18 +44,19 @@
43
44
  &.active:before
44
45
  content: ''
45
46
  position absolute
46
- top: 6px
47
- bottom: 6px
47
+ top: 4px
48
+ bottom: 4px
48
49
  left: -8px
49
50
  width: 4px
50
51
  background: var(--theme)
51
52
  border-radius: 4px
52
53
  &:hover
53
- background: var(--block-border)
54
- color: var(--text)
54
+ background: var(--ui-adapter-bg-hover)
55
+ box-shadow: var(--ui-adapter-shadow-hover)
56
+ color: var(--ui-item-title)
55
57
 
56
58
  // 固定位置
57
- .l_right .widgets .widget-wrapper.toc
59
+ [data-ui-surface='sidebar'] .widgets .widget-wrapper.toc
58
60
  margin-top: 1rem
59
61
  position: sticky
60
62
  position: -webkit-sticky
@@ -78,22 +80,22 @@
78
80
  .widget-wrapper.toc .toc
79
81
  .toc-item
80
82
  font-weight: 500
81
- --fsp: $fsp1
83
+ --fs-content: $fs-content-1
82
84
  .toc-item .toc-item
83
85
  font-weight: 400
84
- --fsp: $fsp2
86
+ --fs-content: $fs-content-2
85
87
  ol
86
88
  padding-left: 0
87
89
  .toc-child .toc-link
88
- padding-left: 1.5rem
90
+ padding-left: calc(var(--gap-base) * 1)
89
91
  .toc-child .toc-child .toc-link
90
- padding-left: 2.5rem
92
+ padding-left: calc(var(--gap-base) * 2)
91
93
  .toc-child .toc-child .toc-child .toc-link
92
- padding-left: 3.5rem
94
+ padding-left: calc(var(--gap-base) * 3)
93
95
  .toc-child .toc-child .toc-child .toc-child .toc-link
94
- padding-left: 4.5rem
96
+ padding-left: calc(var(--gap-base) * 4)
95
97
  .toc-child .toc-child .toc-child .toc-child .toc-child .toc-link
96
- padding-left: 5rem
98
+ padding-left: calc(var(--gap-base) * 5)
97
99
 
98
100
  // 高亮样式
99
101
  .widget-wrapper.toc .toc a.toc-link.active
@@ -133,9 +135,9 @@
133
135
  grid-template-rows: 1fr
134
136
  trans1 all
135
137
  overflow hidden
136
- .l_right .widgets .widget-wrapper.toc .widget-header .cap-action:hover
138
+ [data-ui-surface='sidebar'] .widgets .widget-wrapper.toc .widget-header .cap-action:hover
137
139
  sidebar-light(var(--bg-a50))
138
- .l_right .widgets .widget-wrapper.toc.collapse
140
+ [data-ui-surface='sidebar'] .widgets .widget-wrapper.toc.collapse
139
141
  .widget-header .cap-action
140
142
  sidebar-light(var(--bg-a50))
141
143
  .widget-body
@@ -181,7 +183,7 @@
181
183
  padding-top: 32px
182
184
 
183
185
  @media screen and (max-width: $device-laptop)
184
- .l_right
186
+ [data-ui-surface='sidebar']
185
187
  blur-effect()
186
188
  .widgets
187
189
  .widget-wrapper.toc
@@ -44,7 +44,8 @@
44
44
  fill: var(--text-p2)
45
45
  &:hover
46
46
  color: var(--accent)
47
- sidebar-light(var(--bg-a50))
47
+ background: var(--ui-item-bg-hover)
48
+ box-shadow: var(--ui-item-shadow-hover)
48
49
  opacity 1
49
50
  svg
50
51
  fill: var(--accent)
@@ -55,11 +56,22 @@
55
56
  margin-top: .5em
56
57
  margin-bottom: .5em
57
58
  line-height: 1.5
59
+ >.ui-collection,
60
+ >.widget-section>.ui-collection
61
+ min-width: 0
58
62
 
59
63
 
60
64
  .widget-wrapper
61
65
  display: block
62
66
  margin-top: 32px
67
+ .widget-section+.widget-section
68
+ margin-top: 24px
69
+
70
+ .widget-wrapper.markdown
71
+ --ui-item-bg: var(--block)
72
+
73
+ [data-ui-surface='glass'] .widget-wrapper.markdown
74
+ --ui-item-bg: var(--bg-a10)
63
75
 
64
76
  .l_left .widgets
65
77
  padding-bottom: 64px
@@ -0,0 +1,209 @@
1
+ // Wiki 列表卡片独立组件:不复用文章 Hero 的 .cover 或 cover-overlay()。
2
+ .post-list.wiki
3
+ display: grid
4
+ // Nested min() in minmax() is dropped by older WebKit, which leaves only
5
+ // the grid's implicit single column.
6
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))
7
+ gap: 1rem
8
+ .post-card-wrap
9
+ width: 100%
10
+ margin: 0
11
+ border-radius: $border-card-l
12
+ box-shadow: $boxshadow-card
13
+ @media screen and (max-width: $device-mobile)
14
+ grid-template-columns: minmax(0, 1fr)
15
+
16
+ .post-list.wiki .wiki-card
17
+ display: block
18
+ position: relative
19
+ z-index: 0
20
+ overflow: hidden
21
+ border-radius: $border-card-l
22
+ background: var(--card)
23
+ --wiki-img-br: 100%
24
+ --wiki-img-sat: 100%
25
+ --wiki-blur-sat: 150%
26
+ --wiki-overlay-color: var(--theme, #4f7cff)
27
+ // 边框与底部蒙版同源,但额外提高 20 个明度点,悬浮反馈更清晰。
28
+ --wiki-border-color: var(--theme, #4f7cff)
29
+ &.no-cover
30
+ --wiki-border-color: var(--block-border)
31
+ @supports not (corner-shape: superellipse(1))
32
+ clip-path: 'inset(0 round %s)' % $border-card-l
33
+ &:after
34
+ content: ''
35
+ position: absolute
36
+ inset: 0
37
+ z-index: 3
38
+ border: 2px solid transparent
39
+ border-radius: inherit
40
+ corner-shape: $corner-shape
41
+ pointer-events: none
42
+ transition: border-color .2s ease-out
43
+ &:hover
44
+ --wiki-img-br: 75%
45
+ --wiki-img-sat: 120%
46
+ --wiki-blur-sat: 200%
47
+ &:after
48
+ border-color: var(--wiki-border-color)
49
+ .wiki-card-cover > img
50
+ transform: scale(1.05)
51
+ .wiki-card-cover:before
52
+ transform: translateZ(0) scale(1.05)
53
+
54
+ .wiki-card-content
55
+ padding: 0
56
+
57
+ .wiki-card-cover
58
+ position: relative
59
+ min-height: 240px
60
+ overflow: hidden
61
+ aspect-ratio: 3 / 4
62
+ background-image: var(--cover-url)
63
+ background-size: cover
64
+ background-position: center
65
+ // Today 内容层:同图模糊覆盖下半部,主题色从中部开始渐显,到最底部才完全不透明。
66
+ > img
67
+ position: absolute
68
+ inset: 0
69
+ z-index: 0
70
+ width: 100%
71
+ height: 100%
72
+ object-fit: cover
73
+ filter: brightness(var(--wiki-img-br)) saturate(var(--wiki-img-sat))
74
+ transform: translateZ(0)
75
+ transition: all .2s ease-out, transform 1.5s ease-out
76
+ &:before
77
+ content: ''
78
+ position: absolute
79
+ inset: 0
80
+ z-index: 1
81
+ background-image: var(--cover-url)
82
+ background-size: cover
83
+ background-position: center
84
+ filter: brightness(var(--wiki-img-br)) saturate(var(--wiki-img-sat)) blur(1.5rem) saturate(var(--wiki-blur-sat))
85
+ mask: linear-gradient(to top, black, rgba(black, .75) 26%, transparent 52%)
86
+ -webkit-mask: linear-gradient(to top, black, rgba(black, .75) 26%, transparent 52%)
87
+ transform: translateZ(0)
88
+ pointer-events: none
89
+ opacity: 0
90
+ transition: opacity .2s ease-out, filter .2s ease-out, transform .5s ease-out
91
+ &:after
92
+ content: ''
93
+ position: absolute
94
+ inset: 0
95
+ z-index: 1
96
+ pointer-events: none
97
+ background-image: linear-gradient(to bottom, transparent 50%, var(--wiki-overlay-color) 100%)
98
+ opacity: 0
99
+ transition: opacity .2s ease-out
100
+ &.no-cover
101
+ background: var(--card)
102
+ &:before, &:after
103
+ display: none
104
+ &.cover-error > img
105
+ display: none
106
+
107
+ .post-list.wiki .wiki-card.cover-loaded .wiki-card-cover:not(.no-cover)
108
+ &:before, &:after
109
+ opacity: 1
110
+
111
+ .wiki-card-info
112
+ display: flex
113
+ position: absolute
114
+ z-index: 2
115
+ right: 0
116
+ bottom: 0
117
+ left: 0
118
+ flex-direction: column
119
+ justify-content: flex-end
120
+ box-sizing: border-box
121
+ color: var(--text-banner, white)
122
+ @media screen and (max-width: $device-mobile)
123
+ .wiki-card-summary
124
+ padding: .75rem
125
+
126
+ .wiki-card-cover.no-cover .wiki-card-info
127
+ color: var(--text)
128
+ .wiki-meta, .project-subtitle
129
+ color: var(--text-p2)
130
+
131
+ .wiki-card-info
132
+ .wiki-card-summary
133
+ padding: 1rem
134
+ .headline
135
+ margin: .5rem 0
136
+ font-weight: 700
137
+ line-height: 1.2
138
+ color: inherit
139
+ @media screen and (max-width: $device-mobile)
140
+ .headline
141
+ margin: .375rem 0
142
+ .wiki-meta
143
+ display: flex
144
+ flex-wrap: wrap
145
+ align-items: center
146
+ gap: .5rem 1rem
147
+ min-height: 1.25rem
148
+ color: var(--text-banner-theme, inherit)
149
+ font-size: $fs-13
150
+ line-height: 1.2
151
+ .wiki-available
152
+ display: inline-flex
153
+ flex-wrap: wrap
154
+ align-items: center
155
+ gap: 4px
156
+ .wiki-available, .wiki-stars
157
+ svg
158
+ flex: none
159
+ width: 1em
160
+ height: 1em
161
+ vertical-align: middle
162
+ .wiki-stars
163
+ display: none
164
+ align-items: center
165
+ gap: 4px
166
+ &.loaded
167
+ display: inline-flex
168
+ .wiki-project
169
+ display: flex
170
+ align-items: center
171
+ gap: 10px
172
+ margin-top: auto
173
+ padding: .75rem 1rem 1rem
174
+ background: rgba(black, .1)
175
+ line-height: 1.2
176
+ @media screen and (max-width: $device-mobile)
177
+ padding: .625rem .75rem .75rem
178
+ .project-icon
179
+ display: flex
180
+ flex: none
181
+ align-items: center
182
+ justify-content: center
183
+ width: 2.5rem
184
+ height: 2.5rem
185
+ overflow: hidden
186
+ border-radius: 30%
187
+ background: var(--block)
188
+ color: var(--text-p2)
189
+ img
190
+ width: 100%
191
+ height: 100%
192
+ object-fit: cover
193
+ svg
194
+ width: 1.5rem
195
+ height: 1.5rem
196
+ .project-text
197
+ min-width: 0
198
+ flex: 1
199
+ .project-name, .project-subtitle
200
+ overflow: hidden
201
+ text-overflow: ellipsis
202
+ white-space: nowrap
203
+ .project-name
204
+ font-size: $fs-14
205
+ font-weight: 600
206
+ .project-subtitle
207
+ margin-top: 3px
208
+ color: var(--text-banner-theme, inherit)
209
+ font-size: $fs-13