hexo-theme-gnix 12.0.0 → 13.0.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.
@@ -0,0 +1,25 @@
1
+ const { Component, Fragment, cacheComponent } = require("../../include/util/common");
2
+
3
+ class Goatcounter extends Component {
4
+ render() {
5
+ const { url } = this.props;
6
+
7
+ return (
8
+ <Fragment>
9
+ <script data-goatcounter={url} async src="//gc.zgo.at/count.js"></script>
10
+ </Fragment>
11
+ );
12
+ }
13
+ }
14
+
15
+ Goatcounter.Cacheable = cacheComponent(Goatcounter, "plugin.goatcounter", (props) => {
16
+ const { head, plugin } = props;
17
+ if (!head || !plugin.url) {
18
+ return null;
19
+ }
20
+ return {
21
+ url: plugin.url,
22
+ };
23
+ });
24
+
25
+ module.exports = Goatcounter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hexo-theme-gnix",
3
- "version": "12.0.0",
3
+ "version": "13.0.0",
4
4
  "author": "Efterklang <gaojiaxing0220@gmail.com> (https://vluv.space)",
5
5
  "license": "MIT",
6
6
  "description": "Second generation of Hexo theme Icarus, now with Catppuccin flavor and night mode support.",
@@ -21,8 +21,7 @@
21
21
  "lint": "biome check --write .",
22
22
  "format": "biome format .",
23
23
  "check": "biome check",
24
- "test": "node test/md_generator.test.js",
25
- "build:swup": "cp src/swup.js source/js/swup.js"
24
+ "test": "node test/md_generator.test.js"
26
25
  },
27
26
  "files": [
28
27
  "include",
@@ -34,8 +33,6 @@
34
33
  "README.md"
35
34
  ],
36
35
  "dependencies": {
37
- "@swup/head-plugin": "^2.3.1",
38
- "@swup/scripts-plugin": "^2.1.0",
39
36
  "esbuild": "^0.28.0",
40
37
  "feedsmith": "^2.9.4",
41
38
  "hexo-pagination": "^4.0.0",
@@ -46,19 +43,16 @@
46
43
  "markdown-exit": "^1.0.0-beta.9",
47
44
  "markdown-exit-mermaid": "^2.2.3",
48
45
  "markdown-exit-ratex": "^0.2.2",
49
- "markdown-exit-shiki": "^0.3.2",
50
- "markdown-it-abbr": "^2.0.0",
46
+ "@shikijs/colorized-brackets": "^4.0.2",
47
+ "@shikijs/transformers": "^4.0.2",
48
+ "shiki": "^4.0.2",
51
49
  "markdown-it-anchor": "^9.2.0",
52
50
  "markdown-it-footnote": "^4.0.0",
53
- "markdown-it-ins": "^4.0.0",
54
51
  "markdown-it-mark": "^4.0.0",
55
- "markdown-it-sub": "^2.0.0",
56
- "markdown-it-sup": "^2.0.0",
57
52
  "markdown-it-task-lists": "^2.1.1",
58
- "swup": "^4.8.3"
53
+ "hexo-util": "^4.0.0"
59
54
  },
60
55
  "peerDependencies": {
61
- "hexo": "^8.1.1",
62
- "hexo-util": "^4.0.0"
56
+ "hexo": "^8.1.2"
63
57
  }
64
58
  }
package/scripts/index.js CHANGED
@@ -2,6 +2,7 @@ require("../include/hexo/i18n")(hexo);
2
2
  require("../include/hexo/filter")(hexo);
3
3
  require("../include/hexo/generator")(hexo);
4
4
  require("../include/hexo/feed")(hexo);
5
+ require("../include/hexo/sitemap")(hexo);
5
6
  require("../include/hexo/encrypt")(hexo);
6
7
  require("../include/hexo/view").init(hexo);
7
8
  require("../include/hexo/helper")(hexo);
@@ -167,16 +167,14 @@
167
167
 
168
168
  .archive-item::before {
169
169
  position: absolute;
170
- top: 0.86rem;
171
- left: -1.18rem;
170
+ top: 1em;
171
+ left: -1rem;
172
172
  width: 0.55rem;
173
173
  height: 0.55rem;
174
174
  border-radius: 999px;
175
175
  background: transparent;
176
176
  content: "";
177
- transition:
178
- background 140ms ease,
179
- transform 140ms ease;
177
+ transition: background 500ms ease;
180
178
  }
181
179
 
182
180
  .archive-item:hover::before,
@@ -1,14 +1,13 @@
1
1
  .callout {
2
2
  --callout-color: var(--blue);
3
- --callout-icon: lucide-pencil;
4
3
  --callout-collapse-icon: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0ibTkgMThsNi02bC02LTYiLz48L3N2Zz4=);
5
- background-color: hsl(from var(--callout-color) h s l / 0.2);
4
+ background-color: hsl(from var(--callout-color) h s l / 0.15);
6
5
  border-color: hsl(from var(--callout-color) h s l / 0.5);
7
6
  border-radius: 8px;
8
7
  border-style: solid;
9
8
  border-width: 1.5px;
10
9
  margin: 1.5em 0 !important;
11
- padding: 10px 12px 10px 15px;
10
+ padding: 10px 15px;
12
11
 
13
12
  svg {
14
13
  color: var(--callout-color);
@@ -18,19 +17,44 @@
18
17
  .callout-title {
19
18
  align-items: center;
20
19
  color: var(--callout-color);
21
- cursor: pointer;
22
20
  display: flex;
23
21
  font-size: inherit;
24
22
  font-weight: bold;
25
23
  gap: 7px;
26
24
  line-height: 1.3;
27
25
  padding: 0;
26
+ list-style: none;
27
+ }
28
+
29
+ .callout-title::-webkit-details-marker,
30
+ .callout-title::marker {
31
+ display: none;
32
+ }
33
+
34
+ details.callout > .callout-title {
35
+ cursor: pointer;
36
+ user-select: none;
37
+ }
38
+
39
+ details.callout > .callout-title:hover {
40
+ color: hsl(from var(--callout-color) h s calc(l + 5));
28
41
  }
29
42
 
30
- .callout-icon {
43
+ .callout-icon,
44
+ .callout-title-icon {
31
45
  flex: 0 0 auto;
32
46
  display: flex;
33
47
  align-items: center;
48
+
49
+ svg {
50
+ width: 1.1em;
51
+ height: 1.1em;
52
+ }
53
+ }
54
+
55
+ .callout-title-inner {
56
+ flex: 1 1 auto;
57
+ min-width: 0;
34
58
  }
35
59
 
36
60
  .callout-fold {
@@ -39,47 +63,48 @@
39
63
  mask-size: 100%;
40
64
  -webkit-mask-image: var(--callout-collapse-icon);
41
65
  -webkit-mask-size: 100%;
42
- height: 20px;
43
- width: 20px;
44
- transition: 0.1s ease-in-out;
66
+ height: 1em;
67
+ width: 1em;
68
+ flex: 0 0 auto;
69
+ transition: transform 0.15s ease-in-out;
70
+ }
71
+
72
+ details[open].callout > .callout-title > .callout-fold {
73
+ transform: rotate(90deg);
45
74
  }
46
75
 
47
76
  .callout-content {
48
77
  padding: 0;
49
78
  }
50
79
 
51
- details[close].callout > .callout-title > .callout-fold {
52
- transform: rotate(-90deg);
80
+ .callout-content > :first-child {
81
+ margin-top: 0.5em;
53
82
  }
54
83
 
55
- details[open].callout > .callout-title > .callout-fold {
56
- transform: rotate(90deg);
84
+ .callout-content > :last-child {
85
+ margin-bottom: 0;
57
86
  }
58
87
 
59
88
  .callout[data-callout="info"],
60
89
  .callout[data-callout="todo"] {
61
- --callout-icon: lucide-check-circle-2;
62
90
  --callout-color: var(--sapphire);
63
91
  }
64
92
 
65
93
  .callout[data-callout="success"],
66
94
  .callout[data-callout="check"],
67
95
  .callout[data-callout="done"] {
68
- --callout-icon: lucide-check;
69
96
  --callout-color: var(--green);
70
97
  }
71
98
 
72
99
  .callout[data-callout="warning"],
73
100
  .callout[data-callout="caution"],
74
101
  .callout[data-callout="attention"] {
75
- --callout-icon: lucide-alert-triangle;
76
102
  --callout-color: var(--peach);
77
103
  }
78
104
 
79
105
  .callout[data-callout="question"],
80
106
  .callout[data-callout="help"],
81
107
  .callout[data-callout="faq"] {
82
- --callout-icon: lucide-alert-mark;
83
108
  --callout-color: var(--yellow);
84
109
  }
85
110
 
@@ -89,31 +114,26 @@ details[open].callout > .callout-title > .callout-fold {
89
114
  .callout[data-callout="failure"],
90
115
  .callout[data-callout="fail"],
91
116
  .callout[data-callout="missing"] {
92
- --callout-icon: lucide-zap;
93
117
  --callout-color: var(--red);
94
118
  }
95
119
 
96
120
  .callout[data-callout="tip"],
97
121
  .callout[data-callout="hint"],
98
122
  .callout[data-callout="important"] {
99
- --callout-icon: lucide-flame;
100
123
  --callout-color: var(--pink);
101
124
  }
102
125
 
103
126
  .callout[data-callout="example"] {
104
- --callout-icon: lucide-list;
105
127
  --callout-color: var(--mauve);
106
128
  }
107
129
 
108
130
  .callout[data-callout="abstract"],
109
131
  .callout[data-callout="summary"],
110
132
  .callout[data-callout="tldr"] {
111
- --callout-icon: lucide-clipboard-list;
112
133
  --callout-color: var(--teal);
113
134
  }
114
135
 
115
136
  .callout[data-callout="quote"],
116
137
  .callout[data-callout="cite"] {
117
- --callout-icon: quote-glyph;
118
138
  --callout-color: var(--lavender);
119
139
  }
@@ -254,6 +254,33 @@ body {
254
254
  font-family: var(--font-sans-serif);
255
255
  }
256
256
 
257
+ .site-toast {
258
+ position: fixed;
259
+ top: 10rem;
260
+ left: 50%;
261
+ z-index: 102;
262
+ max-width: min(90vw, 32rem);
263
+ padding: 0.7rem 1rem;
264
+ border: 1px solid var(--surface2);
265
+ border-radius: 0.75rem;
266
+ background: var(--surface1);
267
+ color: var(--text);
268
+ box-shadow: 0 0.75rem 2rem -1rem hsl(from var(--text) h s l / 0.35);
269
+ font-size: 0.875rem;
270
+ line-height: 1.35;
271
+ pointer-events: none;
272
+ opacity: 0;
273
+ transform: translateX(-50%) translateY(-2rem);
274
+ transition:
275
+ opacity 160ms ease,
276
+ transform 160ms ease;
277
+ }
278
+
279
+ .site-toast.is-visible {
280
+ opacity: 1;
281
+ transform: translateX(-50%) translateY(0);
282
+ }
283
+
257
284
  .navbar-main,
258
285
  .navbar-menu {
259
286
  user-select: none;
@@ -532,7 +559,8 @@ html {
532
559
  .navbar {
533
560
  min-height: 4rem;
534
561
  position: sticky;
535
- top: env(safe-area-inset-top);
562
+ padding-top: env(safe-area-inset-top);
563
+ top: 0;
536
564
  left: 0;
537
565
  right: 0;
538
566
  z-index: 100;
@@ -578,23 +606,6 @@ html {
578
606
  transition: color 0.18s ease;
579
607
  }
580
608
 
581
- .navbar-start .navbar-item.is-active {
582
- color: var(--text);
583
- font-weight: 500;
584
- }
585
-
586
- .navbar-start .navbar-item.is-active::after {
587
- content: "";
588
- position: absolute;
589
- left: 50%;
590
- bottom: 0.875rem;
591
- width: 1.45em;
592
- height: 1px;
593
- background: currentColor;
594
- opacity: 0.36;
595
- transform: translateX(-50%);
596
- }
597
-
598
609
  .navbar-end {
599
610
  svg {
600
611
  width: 1.2em;
@@ -707,61 +718,51 @@ html {
707
718
 
708
719
  .footer {
709
720
  user-select: none;
710
- padding: 3rem 1.5rem 6rem;
711
721
  position: relative;
712
- border-top: 0.5px solid var(--surface0);
713
-
714
- iconify-icon {
715
- font-size: 1.2rem;
716
- }
717
- }
718
-
719
- .footer-grid {
720
- display: grid;
721
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
722
- grid-gap: 1.5rem;
723
- align-items: start;
722
+ padding: 4rem 1.5rem 3rem;
723
+ text-align: center;
724
+ color: var(--overlay0);
724
725
  }
725
726
 
726
- .footer-column {
727
+ .footer-brand {
727
728
  display: flex;
728
729
  flex-direction: column;
729
- gap: 0.5rem;
730
+ align-items: center;
731
+ gap: 0.25rem;
730
732
  }
731
733
 
732
- .footer-title {
733
- font-family: homemade-apple, var(--font-handwriting);
734
- font-weight: bolder;
735
- font-size: 1.1rem;
736
- margin-bottom: 0.25rem;
734
+ .footer-credit {
735
+ font-size: 0.75rem;
736
+ font-weight: 400;
737
+ margin: 0;
738
+ letter-spacing: 0.06em;
737
739
  }
738
740
 
739
- .footer-heading {
740
- font-weight: bolder;
741
- font-family: var(--font-serif);
741
+ .footer-author {
742
+ font-size: 0.8125rem;
742
743
  font-style: italic;
743
- font-size: 1.1rem;
744
- margin-bottom: 0.25rem;
744
+ font-family: homemade-apple, var(--font-handwriting);
745
+ color: var(--subtext0);
746
+ font-weight: 600;
747
+ letter-spacing: 0.01em;
745
748
  }
746
749
 
747
750
  .footer-meta {
748
- font-size: 0.75rem;
749
- color: var(--subtext0);
750
- line-height: 1.6;
751
+ font-size: 0.65rem;
752
+ font-weight: 400;
753
+ margin: 0;
754
+ line-height: 1.8;
755
+ letter-spacing: 0.02em;
751
756
  }
752
757
 
753
- .footer-links {
754
- display: flex;
755
- flex-wrap: wrap;
756
- gap: 0.5rem 1rem;
757
- align-items: center;
758
+ .footer-icp {
759
+ color: inherit;
760
+ text-decoration: none;
761
+ transition: color 0.2s ease;
758
762
  }
759
763
 
760
- .footer-link {
761
- display: inline-flex;
762
- align-items: center;
763
- gap: 0.4rem;
764
- color: var(--subtext0);
764
+ .footer-icp:hover {
765
+ color: var(--lavender);
765
766
  }
766
767
 
767
768
  /* #endregion Footer */
@@ -1248,7 +1249,6 @@ small {
1248
1249
  /* #endregion Content */
1249
1250
 
1250
1251
  article,
1251
- aside,
1252
1252
  figure,
1253
1253
  footer,
1254
1254
  header,
@@ -2337,7 +2337,7 @@ input.searchbox-input {
2337
2337
  font-size: 1.8rem;
2338
2338
  }
2339
2339
  .toc-level-3 & {
2340
- color: var(--subtext1);
2340
+ color: var(--overlay1);
2341
2341
  font-size: 1.5rem;
2342
2342
  }
2343
2343
  .toc-level-4 & {
@@ -19,7 +19,12 @@
19
19
  opacity: 0;
20
20
  transition: opacity 0.2s ease;
21
21
  }
22
- .mermaid-wrapper:hover .mermaid-toolbar {
22
+ @media (hover: hover) and (pointer: fine) {
23
+ .mermaid-wrapper:hover .mermaid-toolbar {
24
+ opacity: 1;
25
+ }
26
+ }
27
+ .mermaid-wrapper.is-controls-visible .mermaid-toolbar {
23
28
  opacity: 1;
24
29
  }
25
30
  .mermaid-view-container {
@@ -57,7 +62,12 @@
57
62
  grid-template-rows: repeat(3, 1fr);
58
63
  gap: 4px;
59
64
  }
60
- .mermaid-wrapper:hover .mermaid-viewer-grid-panel {
65
+ @media (hover: hover) and (pointer: fine) {
66
+ .mermaid-wrapper:hover .mermaid-viewer-grid-panel {
67
+ opacity: 1;
68
+ }
69
+ }
70
+ .mermaid-wrapper.is-controls-visible .mermaid-viewer-grid-panel {
61
71
  opacity: 1;
62
72
  }
63
73
  .mermaid-viewer-grid-panel .grid-row {
@@ -112,10 +122,6 @@
112
122
  .mermaid-wrapper {
113
123
  border-radius: 3px;
114
124
  }
115
- .mermaid-toolbar,
116
- .mermaid-viewer-grid-panel {
117
- opacity: 1;
118
- }
119
125
  .btn {
120
126
  width: 28px;
121
127
  height: 28px;
@@ -56,7 +56,8 @@ figure.shiki {
56
56
  overflow: auto;
57
57
  background: var(--mantle);
58
58
  color: var(--text);
59
- iconify-icon {
59
+ svg {
60
+ width: 1em;
60
61
  color: transparent;
61
62
  cursor: pointer;
62
63
  transition:
@@ -65,7 +66,7 @@ figure.shiki {
65
66
  }
66
67
 
67
68
  &:hover {
68
- iconify-icon {
69
+ svg {
69
70
  color: var(--text);
70
71
  &:hover {
71
72
  color: var(--blue);
@@ -165,13 +166,13 @@ figure.shiki {
165
166
  align-items: center;
166
167
  font-size: 1em;
167
168
  cursor: pointer;
168
- > iconify-icon {
169
+ > svg {
169
170
  padding: 6px 0;
170
171
  animation: code-expand-pulse 1.2s infinite;
171
172
  transition: transform 0.3s ease;
172
173
  }
173
174
 
174
- &.expand-done > iconify-icon {
175
+ &.expand-done > svg {
175
176
  transform: rotate(180deg);
176
177
  }
177
178
  }