hexo-theme-stellar 1.33.1 → 1.34.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 (81) hide show
  1. package/CLAUDE.md +217 -0
  2. package/README.md +2 -0
  3. package/_config.yml +28 -14
  4. package/docs/audits/2026-08-08-stellar-analysis.md +267 -0
  5. package/docs/release-process.md +59 -0
  6. package/layout/_partial/comments/artalk/script.ejs +56 -41
  7. package/layout/_partial/comments/beaudar/script.ejs +35 -20
  8. package/layout/_partial/comments/giscus/script.ejs +34 -19
  9. package/layout/_partial/comments/twikoo/script.ejs +29 -14
  10. package/layout/_partial/comments/utterances/script.ejs +35 -20
  11. package/layout/_partial/comments/waline/script.ejs +40 -28
  12. package/layout/_partial/cover/wiki_cover.ejs +1 -1
  13. package/layout/_partial/head.ejs +53 -4
  14. package/layout/_partial/scripts/defines.ejs +21 -3
  15. package/layout/_partial/scripts/lazyload.ejs +2 -2
  16. package/layout/_partial/scripts/services.ejs +101 -41
  17. package/layout/_partial/scripts/utils.ejs +144 -5
  18. package/layout/_partial/sidebar/index_leftbar.ejs +3 -0
  19. package/layout/_partial/sidebar/search.ejs +3 -0
  20. package/layout/_partial/widgets/ghuser.ejs +18 -4
  21. package/layout/_partial/widgets/linklist.ejs +1 -1
  22. package/layout/_partial/widgets/timeline.ejs +36 -33
  23. package/layout/_plugins/copycode.ejs +9 -5
  24. package/layout/_plugins/mermaid.ejs +28 -24
  25. package/layout/_plugins/pjax.ejs +8 -0
  26. package/layout/_plugins/scrollreveal.ejs +14 -13
  27. package/layout/_plugins/swiper.ejs +2 -2
  28. package/layout/index.ejs +4 -2
  29. package/layout/index_topic.ejs +4 -2
  30. package/layout/index_wiki.ejs +6 -4
  31. package/layout/layout.ejs +3 -2
  32. package/package.json +2 -1
  33. package/scripts/commands/new-note.js +49 -0
  34. package/scripts/filters/lib/img_onerror.js +0 -2
  35. package/scripts/helpers/json_ld.js +11 -8
  36. package/scripts/helpers/pretty_url.js +5 -0
  37. package/scripts/tags/lib/chat.js +16 -9
  38. package/scripts/tags/lib/frame.js +2 -1
  39. package/scripts/tags/lib/image.js +6 -5
  40. package/scripts/tags/lib/link.js +6 -4
  41. package/scripts/tags/lib/timeline.js +101 -79
  42. package/source/css/_common/canonical.styl +11 -6
  43. package/source/css/_common/highlight.styl +4 -1
  44. package/source/css/_common/html.styl +4 -0
  45. package/source/css/_common/loading.styl +5 -1
  46. package/source/css/_components/md.styl +1 -0
  47. package/source/css/_components/pages/article-story.styl +2 -0
  48. package/source/css/_components/partial/article-footer.styl +1 -0
  49. package/source/css/_components/partial/navbar.styl +2 -0
  50. package/source/css/_components/sidebar/menu.styl +1 -0
  51. package/source/css/_components/sidebar/search.styl +4 -0
  52. package/source/css/_components/sidebar/sidebar.styl +12 -5
  53. package/source/css/_components/tag-plugins/chat.styl +6 -8
  54. package/source/css/_components/tag-plugins/folding.styl +1 -0
  55. package/source/css/_components/tag-plugins/gallery.styl +2 -0
  56. package/source/css/_components/tag-plugins/grid.styl +1 -0
  57. package/source/css/_components/tag-plugins/image.styl +3 -0
  58. package/source/css/_components/tag-plugins/link.styl +1 -0
  59. package/source/css/_components/tag-plugins/navbar.styl +15 -13
  60. package/source/css/_components/tag-plugins/note.styl +1 -0
  61. package/source/css/_components/tag-plugins/okr.styl +1 -0
  62. package/source/css/_components/tag-plugins/sites.styl +2 -0
  63. package/source/css/_components/tag-plugins/timeline.styl +9 -0
  64. package/source/css/_components/tag-plugins/vote.styl +2 -0
  65. package/source/css/_components/widgets/components.styl +1 -0
  66. package/source/css/_components/widgets/ghuser.styl +19 -3
  67. package/source/css/_components/widgets/list.styl +1 -0
  68. package/source/css/_components/widgets/toc.styl +3 -0
  69. package/source/css/_components/widgets/widgets.styl +4 -0
  70. package/source/css/_custom.styl +2 -1
  71. package/source/css/_defines/func.styl +8 -0
  72. package/source/css/_plugins/comments/artalk.styl +6 -2
  73. package/source/css/_plugins/comments/twikoo.styl +2 -0
  74. package/source/css/_plugins/index.styl +2 -0
  75. package/source/css/_plugins/pjax.styl +61 -0
  76. package/source/js/main.js +80 -26
  77. package/source/js/plugins/copycode.js +34 -27
  78. package/source/js/plugins/pjax.js +646 -0
  79. package/source/js/search/local-search.js +5 -2
  80. package/source/js/services/memos.js +42 -4
  81. package/source/js/services/rss.js +200 -0
@@ -14,9 +14,9 @@ p>code:not([class]),li>code:not([class])
14
14
  --theme: var(--text-p3)
15
15
  margin: var(--gap-p) 0
16
16
  border-radius: $border-card
17
+ corner-shape: superellipse(1.2)
17
18
  overflow: hidden
18
19
  background: var(--block)
19
- line-height: 1.5
20
20
  font-family: $ff-codeblock
21
21
  box-sizing: border-box
22
22
  @media screen and (min-width: $device-mobile)
@@ -80,6 +80,7 @@ p>code:not([class]),li>code:not([class])
80
80
  .gist-file
81
81
  border: 1px solid var(--block-border)
82
82
  border-radius: $border-card
83
+ corner-shape: superellipse(1.2)
83
84
  overflow: hidden
84
85
  .gist-data
85
86
  --bgColor-default: var(--block)
@@ -182,6 +183,8 @@ table:not([class])
182
183
  content: "TS"
183
184
  &.matlab .code:before
184
185
  content: "MATLAB"
186
+ &.nginx .code:before
187
+ content: "Nginx"
185
188
 
186
189
 
187
190
 
@@ -1,6 +1,10 @@
1
1
  *
2
2
  outline: none
3
3
  html
4
+ height: 100%
5
+ width: 100%
6
+ scrollbar(8px,8px)
7
+ overflow-y: scroll
4
8
  font-family: $ff-body
5
9
  font-size: $fs-root
6
10
  -webkit-text-size-adjust: 100%
@@ -31,4 +31,8 @@ svg.loading
31
31
  font-size: 14px
32
32
  &.error
33
33
  &:after
34
- content: hexo-config('style.loading.error')
34
+ content: hexo-config('style.loading.error')
35
+
36
+ .article-footer
37
+ .loading-wrap
38
+ background: none
@@ -82,6 +82,7 @@
82
82
  .md-text.content
83
83
  p>img, .tag-plugin.image .image-bg
84
84
  border-radius: $border-image
85
+ corner-shape: superellipse(1.2)
85
86
 
86
87
  // 链接样式
87
88
  li:not([class]) a:not([class])
@@ -91,8 +91,10 @@
91
91
 
92
92
  p>img, .tag-plugin.image .image-bg
93
93
  border-radius: $border-image-l
94
+ corner-shape: superellipse(1.2)
94
95
  >img
95
96
  border-radius: $border-image-l
97
+ corner-shape: superellipse(1.2)
96
98
 
97
99
 
98
100
  .l_body[type=story] .md-text.content>blockquote, .md-text.content .tag-plugin.blockquote
@@ -3,6 +3,7 @@
3
3
  padding: 1rem
4
4
  background: var(--block)
5
5
  border-radius: $border-card-l
6
+ corner-shape: superellipse(1.2)
6
7
  border: 1px solid var(--block-border)
7
8
  font-size: $fs-15
8
9
  line-height: 1.6
@@ -40,6 +40,8 @@
40
40
  color: var(--text)
41
41
  &.active
42
42
  background: var(--bg-a60)
43
+ :root[data-theme="dark"] &
44
+ background: rgba(white, 0.25)
43
45
  @media (prefers-color-scheme: dark)
44
46
  background: rgba(white, 0.25)
45
47
  box-shadow: 0 0 1px rgba(0, 0, 0, 0.04), 0 0 2px rgba(0, 0, 0, 0.04), 0 0 4px rgba(0, 0, 0, 0.08)
@@ -16,6 +16,7 @@
16
16
  width: 100%
17
17
  min-height: 40px
18
18
  border-radius: $border-bar
19
+ corner-shape: superellipse(1.2)
19
20
  font-size: $fs-15
20
21
  font-weight: 500
21
22
  color: var(--text-p3)
@@ -25,6 +25,8 @@
25
25
  right: 1rem
26
26
  border-radius: $border-bar
27
27
  background: var(--bg-a100)
28
+ :root[data-theme="dark"] &
29
+ background: var(--bg-a20)
28
30
  @media screen and (prefers-color-scheme: dark)
29
31
  background: var(--bg-a20)
30
32
  z-index 0
@@ -44,6 +46,8 @@
44
46
  color: var(--text)
45
47
  &::placeholder
46
48
  color: var(--text-p3)
49
+ :root[data-theme="dark"] &
50
+ color: var(--text-p2)
47
51
  @media screen and (prefers-color-scheme: dark)
48
52
  color: var(--text-p2)
49
53
  .search-button
@@ -38,11 +38,15 @@
38
38
  --background-opacity: hexo-config('style.leftbar.background-opacity')
39
39
  background-image: convert(hexo-config('style.leftbar.background-image'))
40
40
  filter: saturate(var(--saturate)) blur(var(--blur-px)) opacity(var(--background-opacity))
41
+ :root[data-theme="dark"] &
42
+ --background-opacity: hexo-config('style.leftbar.background-opacity') * 0.75
41
43
  @media screen and (prefers-color-scheme: dark)
42
44
  --background-opacity: hexo-config('style.leftbar.background-opacity') * 0.75
43
- else if $leftbar-background-color
44
- background-color: convert($leftbar-background-color)
45
-
45
+ else if $leftbar-background-color-light || $leftbar-background-color-dark
46
+ background-color: convert($leftbar-background-color-light)
47
+ @media screen and (prefers-color-scheme: dark)
48
+ background-color: convert($leftbar-background-color-dark)
49
+
46
50
  .leftbar-container
47
51
  height: 'calc(%s - %s * 2 - %s)' % (100vh var(--gap-margin) $leftbar-bottom-margin)
48
52
  display: flex
@@ -69,12 +73,15 @@
69
73
  &:before
70
74
  if $leftbar-background-image
71
75
  @media screen and (min-width: $device-mobile-max)
72
- background: rgba(white, 0.5)
76
+ background: rgba(white, 0.05)
73
77
  box-shadow: inset 0 0 32px 1px rgba(white, 0.5)
74
78
  backdrop-filter: saturate(300%)
75
79
  -webkit-backdrop-filter: saturate(300%)
76
80
  mask: linear-gradient(black, rgba(black, 0.5), 70%, transparent, 90%, transparent)
77
81
  -webkit-mask: linear-gradient(black, rgba(black, 0.5), 70%, transparent, 90%, transparent)
82
+ :root[data-theme="dark"] &
83
+ background: rgba(white, 0.05)
84
+ box-shadow: inset 0 0 32px 1px rgba(white, 0.1)
78
85
  @media screen and (prefers-color-scheme: dark)
79
86
  background: rgba(white, 0.05)
80
87
  box-shadow: inset 0 0 32px 1px rgba(white, 0.1)
@@ -87,4 +94,4 @@
87
94
  --inset: 0
88
95
  --saturate: 300%
89
96
  .leftbar-container:after
90
- background: var(--bg-a20)
97
+ background: var(--bg-a20)
@@ -39,8 +39,6 @@ chat_dark()
39
39
  font-size: $fs-12
40
40
  .cap
41
41
  color: var(--text-p3)
42
- *
43
- word-break: break-all
44
42
  box-sizing: border-box
45
43
  -webkit-box-sizing: border-box
46
44
  -moz-box-sizing: border-box
@@ -62,7 +60,7 @@ chat_dark()
62
60
  position: relative
63
61
  box-shadow: unset
64
62
  >.device-image
65
- background-image: url(https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.4/frame/iphone11.svg)
63
+ background-image: url(https://gcore.jsdelivr.net/gh/cdn-x/placeholder@1.0.14/frame/iphone11.svg)
66
64
  width: 100%
67
65
  height: 100%
68
66
  position: absolute
@@ -274,7 +272,7 @@ chat_dark()
274
272
  &.emoji,
275
273
  &.link,
276
274
  &.video,
277
- &.file
275
+ &.chat-file
278
276
  background: unset !important
279
277
  padding: 0 !important
280
278
  &.link
@@ -394,7 +392,7 @@ chat_dark()
394
392
  video
395
393
  width: 100%
396
394
  border-radius: 6px
397
- &.file
395
+ &.chat-file
398
396
  background: transparent !important
399
397
  display: flex
400
398
  padding: unset !important
@@ -458,7 +456,7 @@ chat_dark()
458
456
  flex-basis: 100%
459
457
  justify-content: flex-end
460
458
  .talk
461
- &.file
459
+ &.chat-file
462
460
  flex-direction: row-reverse
463
461
  &.voice
464
462
  .voice-btns
@@ -524,11 +522,11 @@ chat_dark()
524
522
  display: none
525
523
  &.link>.link-card,
526
524
  &.video>video,
527
- &.file>.content,
525
+ &.chat-file>.content,
528
526
  &.image>img,
529
527
  &.emoji>img
530
528
  border-radius: 4px
531
- &.file .download-btn
529
+ &.chat-file .download-btn
532
530
  display: none
533
531
  &.voice
534
532
  padding: 8px .5em
@@ -3,6 +3,7 @@ details.folding
3
3
  padding: 1rem
4
4
  margin: 1rem 0
5
5
  border-radius: $border-card
6
+ corner-shape: superellipse(1.2)
6
7
  background: var(--theme-block)
7
8
  border: 1px solid var(--theme-border)
8
9
  summary
@@ -49,6 +49,8 @@
49
49
  // 网格布局
50
50
  .tag-plugin.gallery.grid-box
51
51
  display: grid
52
+ .grid-cell
53
+ corner-shape: superellipse(1.2)
52
54
  &[size='xs']
53
55
  grid-template-columns: repeat(auto-fill, minmax(80px, 1fr))
54
56
  grid-gap: 2px
@@ -17,6 +17,7 @@
17
17
  &[bg]>.cell
18
18
  padding: 1rem
19
19
  border-radius: $border-card
20
+ corner-shape: superellipse(1.2)
20
21
  &[bg='box']>.cell
21
22
  background: var(--block)
22
23
  &[bg='card']>.cell
@@ -5,6 +5,7 @@
5
5
  .image-bg
6
6
  text-align: center
7
7
  border-radius: $border-image
8
+ corner-shape: superellipse(1.2)
8
9
  position: relative
9
10
  overflow: hidden
10
11
  display: flex
@@ -23,7 +24,9 @@
23
24
  display: block
24
25
  object-fit: cover
25
26
  border-radius: $border-image
27
+ corner-shape: superellipse(1.2)
26
28
  .image-download
29
+ z-index: 2
27
30
  position: absolute
28
31
  bottom: 8px
29
32
  right: 8px
@@ -13,6 +13,7 @@
13
13
  width: 300px
14
14
  max-width: 100%
15
15
  border-radius: $border-card-s
16
+ corner-shape: superellipse(1.2)
16
17
  hoverable-card()
17
18
 
18
19
  .md-text .link-card.plain
@@ -1,19 +1,21 @@
1
1
  .tag-plugin.navbar
2
2
  display: inline-flex
3
- background: var(--card)
4
- border-radius: $border-button
5
- z-index inherit
6
- box-shadow: 0 0 8px hsla(black, 0.04)
7
3
  a
8
4
  box-sizing: border-box
9
- padding: .25rem 1rem
10
- margin: 2px
5
+ padding: .25rem 0
11
6
  color: inherit
12
- border-radius: 'calc(%s - 1px)' % $border-button
13
- trans1 all
7
+ position: relative
14
8
  &+a
15
- margin-left: 0
16
- &.active
17
- background: var(--block)
18
- &:hover
19
- background: var(--block)
9
+ margin-left: 1rem
10
+ &:after
11
+ content: ''
12
+ position: absolute
13
+ border-radius: 2px
14
+ width: 100%
15
+ height: 2px
16
+ left: 0
17
+ bottom: 0
18
+ trans1 all
19
+ &.active,&:hover
20
+ &:after
21
+ background: var(--theme)
@@ -2,6 +2,7 @@
2
2
  position: relative
3
3
  padding: 0.25rem 1rem
4
4
  border-radius: $border-card
5
+ corner-shape: superellipse(1.2)
5
6
  background: var(--theme-block)
6
7
  overflow: hidden
7
8
  if hexo-config('tag_plugins.note.border') == true
@@ -1,6 +1,7 @@
1
1
  .md-text .tag-plugin.okr
2
2
  position: relative
3
3
  border-radius: $border-card
4
+ corner-shape: superellipse(1.2)
4
5
  background: var(--theme-block)
5
6
  if hexo-config('tag_plugins.okr.border') == true
6
7
  border: 1px solid var(--theme-border)
@@ -12,6 +12,7 @@
12
12
  position: relative
13
13
  .lazy-box
14
14
  border-radius: $border-card-s
15
+ corner-shape: superellipse(1.2)
15
16
  box-shadow: 0 1px 2px 0px rgba(0, 0, 0, 0.2)
16
17
  overflow hidden
17
18
  >img
@@ -28,6 +29,7 @@
28
29
  margin-right: 8px
29
30
  margin-top: 2px
30
31
  border-radius: @width
32
+ corner-shape: superellipse(1)
31
33
  >img
32
34
  width: 28px
33
35
  height: @width
@@ -1,6 +1,9 @@
1
1
  .tag-plugin.timeline
2
2
  position: relative
3
3
  padding-left: 16px
4
+ p>img
5
+ border-radius: $border-image-s
6
+ corner-shape: superellipse(1.2)
4
7
  &:before
5
8
  content: ''
6
9
  position: absolute
@@ -19,6 +22,9 @@
19
22
  .tag-plugin.timeline
20
23
  ol,ul
21
24
  margin-left: 0
25
+ p>img
26
+ border-radius: $border-image-s
27
+ corner-shape: superellipse(1.2)
22
28
 
23
29
  .tag-plugin.timeline .timenode
24
30
  position: relative
@@ -87,6 +93,7 @@
87
93
  .tag-plugin.timeline .body
88
94
  background: var(--card)
89
95
  border-radius: 16px
96
+ corner-shape: superellipse(1.2)
90
97
  border-top-left-radius: 2px
91
98
  padding: 0.5rem 1rem
92
99
  margin-top: 4px
@@ -143,6 +150,7 @@
143
150
  .lazy-box
144
151
  margin: .5rem 0
145
152
  border-radius: $border-image
153
+ corner-shape: superellipse(1.2)
146
154
  >img
147
155
  margin: 0 auto
148
156
 
@@ -151,6 +159,7 @@
151
159
 
152
160
  aside .tag-plugin.timeline[data-api] .body .lazy-box
153
161
  border-radius: $border-image-s
162
+ corner-shape: superellipse(1.2)
154
163
 
155
164
  .tag-plugin.timeline[data-api] .body .footer
156
165
  margin: 0 0 -0.5rem
@@ -33,6 +33,8 @@
33
33
  trans1 all
34
34
  color: var(--theme)
35
35
  background: var(--theme-a10)
36
+ :root[data-theme="dark"] &
37
+ background: var(--theme-a20)
36
38
  @media (prefers-color-scheme: dark)
37
39
  background: var(--theme-a20)
38
40
  &.vote-up
@@ -4,6 +4,7 @@
4
4
 
5
5
  .linklist .link
6
6
  border-radius: $border-bar
7
+ corner-shape: superellipse(1.2)
7
8
  color: var(--text-p2)
8
9
  min-height: 32px
9
10
  padding: 0 4px
@@ -1,6 +1,19 @@
1
1
  .widget-wrapper.user-card
2
2
  .widget-header+.widget-body
3
3
  margin: 0.75rem 0
4
+ .widget-wrapper.user-card .widget-header
5
+ a
6
+ display: flex
7
+ align-items: center
8
+ color: var(--text-p2)
9
+ trans1 all
10
+ svg
11
+ margin-right: 4px
12
+ width 1em
13
+ height: 1em
14
+ &:hover
15
+ color: var(--text)
16
+
4
17
  .widget-wrapper.user-card .widget-body
5
18
  text-align: center
6
19
  background: var(--card)
@@ -33,7 +46,7 @@
33
46
  .follow
34
47
  font-weight: 500
35
48
  border-radius: 64px
36
- margin: 1rem 0 0
49
+ margin-top: 1rem
37
50
  padding: 0.5rem 1rem
38
51
  background: var(--theme)
39
52
  color: white
@@ -53,7 +66,7 @@
53
66
  background: var(--accent)
54
67
 
55
68
  .buttons
56
- margin: 1rem 0
69
+ margin-top: 1rem
57
70
  align-self: stretch
58
71
  display: grid
59
72
  grid-gap: 2px
@@ -76,4 +89,7 @@
76
89
  .desc
77
90
  font-size: $fs-12
78
91
  color: var(--text-p3)
79
- font-weight: 500
92
+ font-weight: 500
93
+
94
+ .widget-wrapper.user-card .widget-header+.widget-body
95
+ margin-top: 4px
@@ -4,6 +4,7 @@
4
4
  padding: 6px 16px
5
5
  display: block
6
6
  border-radius: $border-bar
7
+ corner-shape: superellipse(1.2)
7
8
  color: var(--text-p1)
8
9
  trans1 background
9
10
  &.active,&:hover
@@ -16,6 +16,9 @@
16
16
  @media screen and (min-width: $device-laptop)
17
17
  background: var(--background)
18
18
 
19
+ .l_left .widget-wrapper.toc
20
+ @media screen and (min-width: $device-laptop)
21
+ background: none
19
22
 
20
23
  // 目录基本样式
21
24
  .widget-wrapper.toc .toc
@@ -77,3 +77,7 @@
77
77
  @media screen and (min-width: $device-laptop)
78
78
  .widget-wrapper.markdown .widget-body
79
79
  background: var(--block)
80
+
81
+ .leftbar-container
82
+ .header+.widgets
83
+ margin-top: 1rem
@@ -31,7 +31,8 @@ $fsp3 = 'calc(%s - 3px)' % $fs-body
31
31
  // site main
32
32
  $site-background-image = hexo-config('style.site.background-image')
33
33
  $leftbar-background-image = hexo-config('style.leftbar.background-image')
34
- $leftbar-background-color = hexo-config('style.leftbar.background-color')
34
+ $leftbar-background-color-light = hexo-config('style.leftbar.background-color-light')
35
+ $leftbar-background-color-dark = hexo-config('style.leftbar.background-color-dark')
35
36
 
36
37
 
37
38
  // colors
@@ -137,10 +137,14 @@ newblur()
137
137
  box-shadow: 0 0 2px rgba(black, .04), 0 2px 8px rgba(black, .04), 0 4px 16px rgba(black, .04)
138
138
  trans1: all
139
139
  text-shadow: 0 0 4px rgba(white, 1), 0 0 8px rgba(white, 0.8), 0 0 16px rgba(white, 0.6)
140
+ :root[data-theme="dark"] &
141
+ text-shadow: 0 0 2px rgba(black, 0.2), 0 0 4px rgba(black, 0.4)
140
142
  @media (prefers-color-scheme: dark)
141
143
  text-shadow: 0 0 2px rgba(black, 0.2), 0 0 4px rgba(black, 0.4)
142
144
  nav a:not(.active,:hover)
143
145
  filter: drop-shadow(0 0 0 white) drop-shadow(0 0 4px white)
146
+ :root[data-theme="dark"] &
147
+ filter: none
144
148
  @media (prefers-color-scheme: dark)
145
149
  filter: none
146
150
  &:before,&:after
@@ -158,6 +162,8 @@ newblur()
158
162
  -webkit-backdrop-filter: blur(8px)
159
163
  background: rgba(white, 0.3)
160
164
  margin: 1px
165
+ :root[data-theme="dark"] &
166
+ background: rgba(white, 0.2)
161
167
  @media (prefers-color-scheme: dark)
162
168
  background: rgba(white, 0.2)
163
169
  &:after
@@ -169,5 +175,7 @@ newblur()
169
175
  -webkit-mask-image: linear-gradient(white, 20%, transparent, 80%, white), linear-gradient(90deg, white, 20%, transparent, 80%, white)
170
176
  box-shadow: inset 0 0 4px 1px rgba(white, 0.5)
171
177
  trans1 all
178
+ :root[data-theme="dark"] &
179
+ box-shadow: inset 0 0 2px 1px rgba(white, 0.2)
172
180
  @media (prefers-color-scheme: dark)
173
181
  box-shadow: inset 0 0 2px 1px rgba(white, 0.2)
@@ -158,6 +158,7 @@
158
158
  >img
159
159
  margin: var(--gap-p) auto
160
160
  border-radius: $border-image-s
161
+ corner-shape: superellipse(1.2)
161
162
  a>img
162
163
  display: inline
163
164
  img[atk-emoticon]
@@ -175,5 +176,8 @@
175
176
  padding: 0.25rem 1rem
176
177
  p
177
178
  color: var(--text-p3)
178
- .atk-content a
179
- --at-color-main: var(--link)
179
+ .atk-content
180
+ a
181
+ --at-color-main: var(--link)
182
+ pre>code
183
+ padding: 0
@@ -6,6 +6,7 @@
6
6
  .vemoji, .tk-owo-emotion
7
7
  width: unset
8
8
  border-radius: $border-image-s
9
+ corner-shape: superellipse(1.2)
9
10
  max-height: 24px
10
11
  max-width: 100px
11
12
  display: inline
@@ -14,6 +15,7 @@
14
15
  max-width: 400px
15
16
  max-height: 400px
16
17
  border-radius: $border-image-s
18
+ corner-shape: superellipse(1.2)
17
19
 
18
20
  .OwO
19
21
  .OwO-body
@@ -14,6 +14,8 @@ if hexo-config('plugins.copycode.enable')
14
14
  @import 'copycode'
15
15
  if hexo-config('plugins.tianli_gpt.enable')
16
16
  @import 'tianli_gpt'
17
+ if hexo-config('plugins.pjax.enable')
18
+ @import 'pjax'
17
19
 
18
20
  if hexo-config('plugins.katex.enable')
19
21
  @import 'katex'
@@ -0,0 +1,61 @@
1
+ // PJAX - Seamless page transitions
2
+
3
+ // Custom easing for smooth, natural animations
4
+ $pjax-easing = cubic-bezier(0.4, 0, 0.2, 1)
5
+ $pjax-easing-out = cubic-bezier(0.16, 1, 0.3, 1) // Expo out - more elegant deceleration
6
+ $pjax-duration = 0.4s
7
+ $pjax-translate-distance = convert(hexo-config('plugins.pjax.translate-distance'))
8
+
9
+ .page-loading-bar
10
+ position: fixed
11
+ top: 0
12
+ left: calc(50% - 16px)
13
+ width: 32px
14
+ height: 32px
15
+ display: none
16
+ flex-direction: column
17
+ align-items: center
18
+ img
19
+ height: 100%
20
+ body.pjax-loading
21
+ .page-loading-bar
22
+ display: flex
23
+
24
+ // Main content transition base
25
+ .l_body .l_main, #l_cover
26
+ transition: opacity $pjax-duration $pjax-easing, transform $pjax-duration $pjax-easing
27
+
28
+ // Fade-in animation keyframes
29
+ @keyframes pjax-fade-in
30
+ 0%
31
+ opacity: 0
32
+ transform: translateY($pjax-translate-distance)
33
+ 100%
34
+ opacity: 1
35
+ transform: translateY(0)
36
+
37
+ // Loading state - content fades out and moves down slightly
38
+ body.pjax-loading
39
+ .l_body .l_main, #l_cover
40
+ opacity: 0.4
41
+ transform: translateY($pjax-translate-distance)
42
+ pointer-events: none
43
+
44
+ // Loaded state - content fades in with upward motion
45
+ body.pjax-loaded
46
+ .l_body .l_main, #l_cover
47
+ animation: pjax-fade-in $pjax-duration $pjax-easing-out forwards
48
+
49
+ // Respect reduced motion preferences
50
+ @media (prefers-reduced-motion: reduce)
51
+ .l_body .l_main, #l_cover
52
+ transition: opacity $pjax-duration ease
53
+ body.pjax-loading .l_body .l_main, body.pjax-loading #l_cover
54
+ transform: none
55
+ body.pjax-loaded .l_body .l_main, body.pjax-loaded #l_cover
56
+ animation: pjax-fade-simple $pjax-duration ease forwards
57
+ @keyframes pjax-fade-simple
58
+ 0%
59
+ opacity: 0
60
+ 100%
61
+ opacity: 1