hexo-theme-stellar 1.19.0 → 1.21.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 (89) hide show
  1. package/README.md +3 -3
  2. package/_config.yml +49 -22
  3. package/languages/zh-CN.yml +1 -1
  4. package/languages/zh-TW.yml +1 -1
  5. package/layout/404.ejs +1 -1
  6. package/layout/_partial/cover/wiki_cover.ejs +10 -16
  7. package/layout/_partial/head.ejs +3 -3
  8. package/layout/_partial/main/article/article_footer.ejs +86 -54
  9. package/layout/_partial/main/article/read_next.ejs +17 -12
  10. package/layout/_partial/main/navbar/breadcrumb.ejs +55 -17
  11. package/layout/_partial/main/navbar/list_post.ejs +6 -4
  12. package/layout/_partial/main/navbar/list_wiki.ejs +4 -3
  13. package/layout/_partial/main/post_list/post_card.ejs +1 -1
  14. package/layout/_partial/main/post_list/wiki_card.ejs +6 -11
  15. package/layout/_partial/{main/article/ai_abstract.ejs → plugins/ai/tianli_gpt.ejs} +3 -2
  16. package/layout/_partial/plugins/comments/beaudar/script.ejs +1 -1
  17. package/layout/_partial/plugins/comments/giscus/script.ejs +1 -1
  18. package/layout/_partial/plugins/comments/layout.ejs +2 -2
  19. package/layout/_partial/plugins/comments/utterances/script.ejs +1 -1
  20. package/layout/_partial/sidebar/header.ejs +1 -1
  21. package/layout/_partial/sidebar/index.ejs +4 -4
  22. package/layout/_partial/widgets/ghissues.ejs +1 -1
  23. package/layout/_partial/widgets/ghrepo.ejs +1 -1
  24. package/layout/_partial/widgets/ghuser.ejs +1 -1
  25. package/layout/_partial/widgets/recent.ejs +3 -3
  26. package/layout/_partial/widgets/related.ejs +13 -21
  27. package/layout/_partial/widgets/toc.ejs +20 -12
  28. package/layout/index.ejs +13 -11
  29. package/layout/mermaid.ejs +8 -4
  30. package/layout/page.ejs +3 -0
  31. package/layout/post.ejs +1 -1
  32. package/layout/wiki.ejs +4 -1
  33. package/package.json +1 -1
  34. package/scripts/events/lib/doc_tree.js +142 -97
  35. package/scripts/filters/index.js +4 -1
  36. package/scripts/helpers/category_color.js +18 -5
  37. package/scripts/tags/index.js +5 -3
  38. package/scripts/tags/inline-labels.js +2 -2
  39. package/scripts/tags/lib/banner.js +68 -0
  40. package/scripts/tags/lib/{ablock.js → box.js} +4 -4
  41. package/scripts/tags/lib/checkbox.js +1 -1
  42. package/scripts/tags/lib/folders.js +1 -1
  43. package/scripts/tags/lib/folding.js +1 -1
  44. package/scripts/tags/lib/gallery.js +51 -0
  45. package/scripts/tags/lib/hashtag.js +36 -0
  46. package/scripts/tags/lib/image.js +5 -1
  47. package/scripts/tags/lib/mark.js +1 -1
  48. package/scripts/tags/lib/navbar.js +15 -34
  49. package/scripts/tags/lib/note.js +1 -1
  50. package/scripts/tags/lib/okr.js +140 -0
  51. package/scripts/tags/lib/swiper.js +1 -1
  52. package/scripts/tags/lib/timeline.js +3 -3
  53. package/scripts/tags/lib/toc.js +1 -1
  54. package/source/css/_common/highlight.styl +3 -0
  55. package/source/css/_custom.styl +2 -2
  56. package/source/css/_defines/theme.styl +0 -1
  57. package/source/css/_layout/list.styl +12 -4
  58. package/source/css/_layout/md.styl +11 -8
  59. package/source/css/_layout/partial/bread-nav.styl +32 -0
  60. package/source/css/_layout/partial/cover.styl +2 -0
  61. package/source/css/_layout/partial/paginator.styl +9 -5
  62. package/source/css/_layout/tag-plugins/banner.styl +106 -0
  63. package/source/css/_layout/tag-plugins/common.styl +33 -39
  64. package/source/css/_layout/tag-plugins/folding.styl +1 -1
  65. package/source/css/_layout/tag-plugins/frame.styl +1 -1
  66. package/source/css/_layout/tag-plugins/gallery.styl +46 -0
  67. package/source/css/_layout/tag-plugins/grid.styl +0 -9
  68. package/source/css/_layout/tag-plugins/hashtag.styl +17 -0
  69. package/source/css/_layout/tag-plugins/mark.styl +2 -5
  70. package/source/css/_layout/tag-plugins/note.styl +2 -1
  71. package/source/css/_layout/tag-plugins/okr.styl +106 -0
  72. package/source/css/_layout/tag-plugins/timeline.styl +14 -1
  73. package/source/css/_layout/widgets/ghuser.styl +5 -6
  74. package/source/css/_plugins/copycode.styl +17 -6
  75. package/source/css/_plugins/fancybox.styl +4 -0
  76. package/source/css/_plugins/index.styl +2 -0
  77. package/source/css/_plugins/mermaid.styl +125 -10
  78. package/source/css/{_layout/partial/ai_abstract.styl → _plugins/tianli_gpt.styl} +2 -2
  79. package/source/js/main.js +25 -3
  80. package/source/js/plugins/copycode.js +1 -7
  81. package/source/js/plugins/fcircle.js +3 -3
  82. package/source/js/plugins/friends.js +3 -3
  83. package/source/js/plugins/linkcard.js +1 -1
  84. package/source/js/plugins/memos.js +133 -0
  85. package/source/js/plugins/sites.js +4 -4
  86. package/source/js/plugins/timeline.js +3 -3
  87. package/source/js/plugins/weibo.js +3 -3
  88. package/scripts/tags/lib/tag.js +0 -35
  89. package/source/css/_layout/tag-plugins/tag.styl +0 -13
@@ -1,11 +1,11 @@
1
1
  /**
2
- * navbar.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/
2
+ * navbar.js v2 | https://github.com/xaoxuu/hexo-theme-stellar/
3
3
  * 格式与官方标签插件一致使用空格分隔,中括号内的是可选参数(中括号不需要写出来)
4
4
  *
5
- * {% navbar [markdown link] ... %}
5
+ * {% navbar [active:url] [markdown-link] ... %}
6
6
  *
7
7
  * example:
8
- * {% navbar active:1 [Home](/) [About](/about/) [Comments](#comments) %}
8
+ * {% navbar active:/about/ [Home](/) [About](/about/) [Comments](#comments) %}
9
9
  */
10
10
 
11
11
  'use strict'
@@ -18,40 +18,21 @@ module.exports = ctx => function(args) {
18
18
  if (args.links) {
19
19
  args.links = args.links.split(' ')
20
20
  }
21
- var el = '<div class="tag-plugin navbar"><nav class="cap">'
22
- function layoutItem(a, i) {
23
- var text = ''
24
- var href = ''
25
- var el = '<a'
26
- if ((i+1).toString() === args.active) {
27
- el += ' class="active"'
28
- }
29
- if (a.includes('](')) {
30
- // markdown
31
- let tmp = a.split('](')
32
- if (tmp.length > 1) {
33
- text = tmp[0]
34
- if (text.length > 1) {
35
- text = text.substring(1, text.length)
36
- }
37
- href = tmp[1]
38
- if (href.length > 1) {
39
- href = href.substring(0, href.length-1)
40
- }
41
- el += ' href="' + href + '"'
21
+ var el = `<div class="tag-plugin navbar"><nav class="cap">`
22
+ for (let link of args.links) {
23
+ const matches = link.match(/\[(.*?)\]\((.*?)\)/i)
24
+ if (matches?.length > 2) {
25
+ let text = matches[1]
26
+ let href = matches[2]
27
+ if (href == args.active) {
28
+ el += `<a class="link blur active" href="${href}">${text}</a>`
29
+ } else {
30
+ el += `<a class="link" href="${href}">${text}</a>`
42
31
  }
43
32
  } else {
44
- el += ' href="#' + a + '"'
45
- text = a
33
+ el += `<a class="link" href="#${link}">${link}</a>`
46
34
  }
47
- el += '>'
48
- el += text
49
- el += '</a>'
50
- return el
51
35
  }
52
- (args.links || []).forEach((item, i) => {
53
- el += layoutItem(item, i)
54
- })
55
- el += '</nav></div>'
36
+ el += `</nav></div>`
56
37
  return el
57
38
  }
@@ -19,7 +19,7 @@ module.exports = ctx => function(args) {
19
19
  }
20
20
  var el = ''
21
21
  // header
22
- el += '<div class="tag-plugin note"'
22
+ el += '<div class="tag-plugin colorful note"'
23
23
  el += ' ' + ctx.args.joinTags(args, ['color', 'child']).join(' ')
24
24
  el += '>'
25
25
  // title
@@ -0,0 +1,140 @@
1
+ /**
2
+ * okr.js v1 | https://github.com/xaoxuu/hexo-theme-stellar/
3
+ *
4
+ * {% okr o1 percent:0.5 status:delay %}
5
+ * title (only one line)
6
+ * note
7
+ * <!-- okr kr1 percent:1 -->
8
+ * title (only one line)
9
+ * note
10
+ * {% endokr %}
11
+ *
12
+ */
13
+
14
+ 'use strict'
15
+
16
+ function splitContentAndNote(input) {
17
+ var arr = input.trim().split('\n').filter(item => item.trim().length > 0)
18
+ if (arr.length == 0) {
19
+ return {title:'', note:''}
20
+ }
21
+ const title = arr.shift()
22
+ const note = arr.join('\n')
23
+ return {title:title, note:note}
24
+ }
25
+
26
+ function generateKRList(ctx, contentArray) {
27
+ if (contentArray.length < 3) {
28
+ console.error('invalid okr tag:', contentArray);
29
+ return []
30
+ }
31
+ var result = []
32
+ var krTagIndexes = []
33
+ for (let index = 0; index < contentArray.length; index++) {
34
+ const element = contentArray[index];
35
+ if (element.startsWith('kr')) {
36
+ krTagIndexes.push(index)
37
+ }
38
+ }
39
+ for (let index of krTagIndexes) {
40
+ if (index >= contentArray.length) {
41
+ break
42
+ }
43
+ const tagStr = contentArray[index]
44
+ const contentStr = contentArray[index+1]
45
+ if (contentStr.startsWith('kr')) {
46
+ continue
47
+ }
48
+ result.push({
49
+ krMeta: ctx.args.map(tagStr.split(/\s+/), ['percent', 'status'], 'krIndex'),
50
+ krBody: splitContentAndNote(contentStr)
51
+ })
52
+ }
53
+ return result
54
+ }
55
+
56
+ function layoutItem(ctx, type, index, title, note, color, label, percent) {
57
+ const percentStr = (percent * 100).toString().replace(/\.\d*/, '')
58
+ return `
59
+ <div class="okr-item ${type}">
60
+ <div class="okr-left">
61
+ <span class="title">${index.toUpperCase()}</span>
62
+ </div>
63
+ <div class="okr-center">
64
+ <span class="title">${title}</span>
65
+ <div class="note">${ctx.render.renderSync({text: note, engine: 'markdown'}).split('\n').join('')}</div>
66
+ </div>
67
+ <div class="okr-right colorful" color="${color}">
68
+ <div class="labels">
69
+ <span class="status label">${label}</span>
70
+ <span class="status percent">${percentStr}%</span>
71
+ </div>
72
+ <div class="progress">
73
+ <div class="fill" style="width:${percentStr}%;"></div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ `
78
+ }
79
+
80
+ module.exports = ctx => function(args, content = '') {
81
+ args = ctx.args.map(args, ['percent', 'status', 'color'], 'oIndex')
82
+ var contentArray = content.split(/<!--\s*okr (.*?)\s*-->/g).filter(item => item.trim().length > 0)
83
+ if (contentArray.length < 3) {
84
+ console.error('invalid okr tag:', contentArray);
85
+ return ''
86
+ }
87
+ const statusList = ctx.theme.config.tag_plugins.okr.status
88
+ const oMeta = args
89
+ const oBody = splitContentAndNote(contentArray.shift())
90
+ const krList = generateKRList(ctx, contentArray)
91
+
92
+ var el_krs = ''
93
+ var krPercentList = []
94
+ for (let kr of krList) {
95
+ const { krMeta, krBody } = kr
96
+ const krPercent = Number(krMeta.percent) || 0
97
+ if (krMeta == null || krBody == null) {
98
+ continue
99
+ }
100
+ var status = null
101
+ if (krMeta.status && statusList[krMeta.status]) {
102
+ status = statusList[krMeta.status]
103
+ }
104
+ if (status == null) {
105
+ if (krPercent >= 1) {
106
+ status = statusList['finished']
107
+ } else {
108
+ status = statusList['in_track']
109
+ }
110
+ }
111
+ krPercentList.push(krPercent)
112
+ el_krs += layoutItem(ctx, 'kr', krMeta.krIndex, krBody.title, krBody.note, status.color, status.label, krPercent)
113
+ }
114
+ const krPercentSum = krPercentList.reduce(
115
+ (accumulator, currentValue) => accumulator + currentValue,
116
+ 0,
117
+ );
118
+
119
+ const oPercent = Number(oMeta.percent) || (krPercentSum / krPercentList.length).toFixed(2)
120
+ var status = null
121
+ if (args.status != null && args.status && statusList[args.status]) {
122
+ status = statusList[args.status]
123
+ }
124
+ if (status == null) {
125
+ if (oPercent >= 1) {
126
+ status = statusList['finished']
127
+ } else {
128
+ status = statusList['in_track']
129
+ }
130
+ }
131
+
132
+ var el = ''
133
+ el += '<div class="tag-plugin colorful okr"'
134
+ el += ' ' + ctx.args.joinTags(args, ['color']).join(' ')
135
+ el += '>'
136
+ el += layoutItem(ctx, 'o', oMeta.oIndex, oBody.title, oBody.note, status.color, status.label, oPercent)
137
+ el += el_krs
138
+ el += '</div>'
139
+ return el
140
+ }
@@ -22,7 +22,7 @@ module.exports = ctx => function(args, content) {
22
22
  })
23
23
  }
24
24
  }
25
- el += '<div class="tag-plugin gallery swiper" id="swiper-api"'
25
+ el += '<div class="tag-plugin swiper" id="swiper-api"'
26
26
  el += ' ' + ctx.args.joinTags(args, ['width', 'effect']).join(' ')
27
27
  el += '>'
28
28
  el += '<div class="swiper-wrapper">'
@@ -1,5 +1,5 @@
1
1
  /**
2
- * timeline.js v2 | https://github.com/xaoxuu/hexo-theme-stellar/
2
+ * timeline.js v2.1 | https://github.com/xaoxuu/hexo-theme-stellar/
3
3
  *
4
4
  * {% timeline %}
5
5
  *
@@ -35,14 +35,14 @@ function layoutNodeContent(ctx, content) {
35
35
  }
36
36
 
37
37
  module.exports = ctx => function(args, content = '') {
38
- args = ctx.args.map(args, ['api', 'user', 'type', 'limit', 'hide'])
38
+ args = ctx.args.map(args, ['api', 'user', 'type', 'limit', 'hide', 'avatar'])
39
39
  var el = ''
40
40
  if (!args.type) {
41
41
  args.type = 'timeline'
42
42
  }
43
43
  if (args.api && args.api.length > 0) {
44
44
  el += '<div class="tag-plugin timeline stellar-' + args.type + '-api"'
45
- el += ' ' + ctx.args.joinTags(args, ['api', 'user', 'limit', 'hide']).join(' ')
45
+ el += ' ' + ctx.args.joinTags(args, ['api', 'user', 'limit', 'hide', 'avatar']).join(' ')
46
46
  el += '>'
47
47
  } else {
48
48
  el += '<div class="tag-plugin timeline">'
@@ -43,7 +43,7 @@ module.exports = ctx => function(args) {
43
43
  el += '</summary>'
44
44
 
45
45
  if (args.wiki) {
46
- const proj = ctx.theme.config.wiki.projects[args.wiki]
46
+ const proj = ctx.theme.config.wiki.tree[args.wiki]
47
47
  if (proj == undefined) {
48
48
  return ''
49
49
  }
@@ -78,6 +78,7 @@ p>code:not([class]),li>code:not([class])
78
78
  .gist-file
79
79
  border: 1px solid var(--block-border)
80
80
  border-radius: $border-block
81
+ overflow: hidden
81
82
  .gist-data
82
83
  border-bottom: 1px solid var(--block-border)
83
84
  .highlight
@@ -171,6 +172,8 @@ table:not([class])
171
172
  content: "Go"
172
173
  &.typescript .code:before,&.ts .code:before
173
174
  content: "TS"
175
+ &.matlab .code:before
176
+ content: "MATLAB"
174
177
 
175
178
 
176
179
 
@@ -44,8 +44,8 @@ $fs-14 = .875rem
44
44
  $fs-13 = .8125rem
45
45
  $fs-12 = .75rem
46
46
 
47
- $fs-h1 = 1.75rem // 32px
48
- $fs-h2 = 1.5rem // 24px
47
+ $fs-h1 = 2rem // 32px
48
+ $fs-h2 = 1.75rem // 28px
49
49
  $fs-h3 = 1.375rem // 22px
50
50
  $fs-h4 = 1.125rem // 18px
51
51
  $fs-h5 = $fs-15
@@ -39,7 +39,6 @@ set_text_light()
39
39
  --block-border: hsl($color-block-h, $color-block-s, 90)
40
40
  --block-hover: hsl($color-block-h, $color-block-s, 92)
41
41
  set_text_dark()
42
- --theme-bg2: $color-theme
43
42
  --theme-link: $color-link
44
43
 
45
44
  set_darkmode()
@@ -145,12 +145,11 @@
145
145
 
146
146
  .post-list .post-card.wiki article .preview
147
147
  display: flex
148
- width: 200px
149
- margin: 1rem .5rem
150
- @media screen and (min-width: 950px)
151
- margin: 1rem
148
+ margin: 1rem 3rem
152
149
  align-items: center
153
150
  img
151
+ width: 96px
152
+ max-height: 96px
154
153
  object-fit: contain
155
154
  &:not(.lazy)
156
155
  trans1: transform 0.75s
@@ -162,5 +161,14 @@
162
161
  flex: 1
163
162
  overflow: hidden
164
163
  word-wrap: break-word
164
+ .caps
165
+ line-height: 1
166
+ margin-bottom: 0.75rem
167
+ .cap
168
+ background: var(--theme-block)
169
+ padding: 2px 4px
170
+ border-radius: 2px
165
171
  p:last-child
166
172
  margin-bottom: 0
173
+ .cap+.cap
174
+ margin-left: 4px
@@ -35,7 +35,7 @@ h1.article-title
35
35
  >:first-child:not(h1)
36
36
  margin-top: 0
37
37
  h1:not(:first-child)
38
- margin-top: 2em
38
+ margin-top: 1em
39
39
  h2
40
40
  margin-bottom: 1rem
41
41
  h3,h4,h5,h6
@@ -47,6 +47,11 @@ h1.article-title
47
47
  &:hover
48
48
  a.headerlink:before
49
49
  opacity: 1
50
+ blockquote, .tag-plugin
51
+ h2,h3,h4,h5,h6
52
+ margin-top: 0.25em
53
+ margin-bottom: 0.25em
54
+ padding-top: 0
50
55
 
51
56
  .md-text.content:first-child
52
57
  padding-top: 0
@@ -82,7 +87,7 @@ h1.article-title
82
87
  opacity: 0
83
88
  content: '#'
84
89
  position: absolute
85
- margin-left: -0.75em
90
+ margin-left: -0.6em
86
91
  h2
87
92
  margin-top: 2rem
88
93
  border-bottom: 1px solid var(--block-border)
@@ -139,7 +144,10 @@ h1.article-title
139
144
  left: 0
140
145
  right: 0
141
146
  height: 1px
142
- opacity: 0.8
147
+ if hexo-config('style.link.underline') == true
148
+ opacity: 0.8
149
+ else
150
+ opacity: 0
143
151
  background: var(--theme-link)
144
152
  trans1: all
145
153
  &:hover
@@ -153,8 +161,3 @@ h1.article-title
153
161
  bottom: 0
154
162
  left: -2px
155
163
  right: -2px
156
- .md-text li:not([class]) a:not([class]):before, .md-text p:not([class]) a:not([class]):before
157
- background unset !important
158
-
159
- .md-text li:not([class]) a:not([class]):hover:before, .md-text p:not([class]) a:not([class]):hover:before
160
- background var(--theme-link) !important
@@ -3,6 +3,8 @@
3
3
  padding: 0.25rem 1rem 0
4
4
  color: var(--text-p3)
5
5
  font-weight: 500
6
+ display: flex
7
+ justify-content: space-between
6
8
  div#breadcrumb
7
9
  display: flex
8
10
  align-items: center
@@ -17,3 +19,33 @@
17
19
  color: $color-hover
18
20
  div#post-meta
19
21
  margin-top: 2px
22
+ span+span
23
+ margin-left: 8px
24
+ visibility: hidden
25
+ &:hover
26
+ div#post-meta
27
+ span+span
28
+ visibility: visible
29
+
30
+ .bread-nav .ghrepo
31
+ font-size: $fs-13
32
+ display: flex
33
+ flex-direction: column
34
+ align-items: flex-start
35
+ border-left: 1px solid var(--text-meta)
36
+ padding-left: 8px
37
+ a
38
+ display: flex
39
+ align-items: center
40
+ color: var(--text-p2)
41
+ svg
42
+ margin-right: 4px
43
+ &.bold
44
+ font-weight: 600
45
+ color: var(--text-p1)
46
+ span
47
+ margin-left: 4px
48
+ &:hover
49
+ color: var(--theme-link)
50
+ a+a
51
+ margin-top: 8px
@@ -63,6 +63,8 @@
63
63
  margin-bottom: 2rem
64
64
  img
65
65
  object-fit: contain
66
+ min-width: 96px
67
+ min-height: 96px
66
68
  max-height: 35vh
67
69
  max-width: 100%
68
70
  @media screen and (max-width: $device-mobile)
@@ -9,11 +9,16 @@
9
9
  border-radius: $border-card
10
10
  overflow: hidden
11
11
  box-shadow: 0 2px 8px 0px rgba(0, 0, 0, 0.03)
12
+ color: var(--text-p3)
12
13
  .page-number
13
14
  padding: 4px 8px
14
15
  border-radius: 8px
15
- background: var(--block)
16
16
  margin: 2px
17
+ a.page-number
18
+ color: var(--text-p3)
19
+ &:hover
20
+ color: var(--text-p1)
21
+ background: var(--block)
17
22
  .extend
18
23
  text-align: center
19
24
  background-size: contain
@@ -23,15 +28,14 @@
23
28
  background-clip: content-box
24
29
  &.next
25
30
  border-left: 1px dashed var(--block-border)
26
- background-image: url('https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.4/arrow/064b95430caf4.svg')
31
+ background-image: url('https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/arrow/064b95430caf4.svg')
27
32
  &.prev
28
33
  border-right: 1px dashed var(--block-border)
29
- background-image: url('https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.4/arrow/f049bbd4e88ec.svg')
34
+ background-image: url('https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.9/arrow/f049bbd4e88ec.svg')
30
35
  .current
31
36
  font-family: $ff-code
32
- color: var(--text-p3)
37
+ background: var(--block)
33
38
  .extend
34
- color: var(--text-p3)
35
39
  padding: 1rem
36
40
  line-height: 0
37
41
  filter: grayscale(100%)
@@ -0,0 +1,106 @@
1
+ .tag-plugin.banner
2
+ border-radius: $border-card
3
+ position: relative
4
+ overflow: hidden
5
+ display: flex
6
+ flex-direction: column
7
+ justify-content: flex-end
8
+ align-items: flex-start
9
+ color: white
10
+ height: 240px
11
+ @media screen and (max-width: $device-mobile-max)
12
+ height: 200px
13
+ .bg
14
+ z-index: 0
15
+ .content
16
+ z-index: 1
17
+ width: 100%
18
+ height: 100%
19
+ display: flex
20
+ flex-direction: column
21
+ justify-content: space-between
22
+ .top
23
+ display: flex
24
+ justify-content: space-between
25
+ align-items: center
26
+ line-height: 1
27
+ margin: 1rem
28
+ .navbar
29
+ margin: 0
30
+ nav.cap
31
+ border-radius: 6px
32
+ background: rgba(black, 0.2)
33
+ .link
34
+ color: rgba(white, 0.8)
35
+ padding: 2px 6px
36
+ border-radius: 4px
37
+ background: none
38
+ line-height: 1.5
39
+ font-size: $fs-15
40
+ &:hover
41
+ color: white
42
+ background: rgba(black, 0.5)
43
+ &.active
44
+ color: white
45
+ background: rgba(white, 0.25)
46
+ .back
47
+ background: none
48
+ padding: 0
49
+ line-height: 0
50
+ visibility: hidden
51
+ @media screen and (max-width: $device-mobile-max)
52
+ visibility: visible
53
+ svg
54
+ width: 20px
55
+ height: 20px
56
+ fill: white
57
+ .banner-link
58
+ position: absolute
59
+ top: 0
60
+ bottom: 0
61
+ left: 0
62
+ right: 0
63
+ opacity: 0
64
+ z-index: 2
65
+ img
66
+ object-fit: cover
67
+ disable-select()
68
+ margin: 0
69
+ height: 100%
70
+ width: 100%
71
+ img.bg
72
+ position absolute
73
+ top: 0
74
+ bottom: 0
75
+ left: 0
76
+ right: 0
77
+ img.avatar
78
+ border-radius: 50%
79
+ width: 48px
80
+ height: 48px
81
+ border: 2px solid white
82
+ .bottom
83
+ display: flex
84
+ padding: 1rem
85
+ width: 100%
86
+ box-sizing: border-box
87
+ background-image: linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.2))
88
+ text-shadow: 0 0 1px rgba(0,0,0,0.12)
89
+ .title
90
+ font-size: 1.5rem
91
+ font-weight: 600
92
+ .avatar+.text-area
93
+ margin-left: 0.75rem
94
+ .text-area .text
95
+ line-height: 1.2
96
+ margin-top: 0.25rem
97
+ margin-bottom: 0.25rem
98
+ .avatar+.text-area .title
99
+ font-size: 1.2rem
100
+ .subtitle
101
+ font-size: $fs-14
102
+
103
+ .tag-plugin.banner:hover
104
+ img.bg
105
+ transform: scale(1.01)
106
+ trans1(transform, 2s)