hexo-theme-gnix 12.0.0 → 14.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.
Files changed (45) hide show
  1. package/README.md +2 -0
  2. package/include/hexo/generator/archive.js +14 -1
  3. package/include/hexo/generator/index.js +0 -5
  4. package/include/hexo/generator/page.js +18 -4
  5. package/include/hexo/generator/tag.js +1 -1
  6. package/include/hexo/helper.js +0 -4
  7. package/include/hexo/i18n.js +31 -136
  8. package/include/hexo/obsidian-callouts.js +210 -0
  9. package/include/hexo/renderer.js +4 -14
  10. package/include/hexo/shiki.js +191 -0
  11. package/include/hexo/sitemap.js +184 -0
  12. package/include/util/i18n.js +92 -106
  13. package/languages/en.yml +4 -10
  14. package/languages/zh-CN.yml +4 -10
  15. package/layout/archive.jsx +155 -78
  16. package/layout/common/article.jsx +94 -108
  17. package/layout/common/article_cover.jsx +3 -3
  18. package/layout/common/article_info.jsx +11 -48
  19. package/layout/common/article_media.jsx +9 -2
  20. package/layout/common/footer.jsx +17 -106
  21. package/layout/common/head.jsx +3 -15
  22. package/layout/common/navbar.jsx +24 -87
  23. package/layout/common/scripts.jsx +1 -1
  24. package/layout/layout.jsx +37 -19
  25. package/layout/plugin/goatcounter.jsx +25 -0
  26. package/layout/tag.jsx +3 -70
  27. package/layout/tags.jsx +26 -23
  28. package/package.json +7 -13
  29. package/scripts/index.js +1 -0
  30. package/source/css/archive.css +287 -168
  31. package/source/css/callout_blocks.css +41 -21
  32. package/source/css/default.css +154 -132
  33. package/source/css/optional/mermaid.css +12 -6
  34. package/source/css/responsive.css +1 -45
  35. package/source/css/shiki/shiki.css +5 -4
  36. package/source/css/tags.css +53 -59
  37. package/source/js/components/archive-popup.js +313 -0
  38. package/source/js/components/friends-list.js +270 -0
  39. package/source/js/components/x-info-card.js +297 -0
  40. package/source/js/main.js +38 -34
  41. package/source/js/mdit/mermaid.js +10 -0
  42. package/include/hexo/generator/home.js +0 -64
  43. package/layout/index.jsx +0 -19
  44. package/layout/misc/paginator.jsx +0 -69
  45. package/source/js/host/iconify-icon/3.0.2/iconify-icon.min.js +0 -12
@@ -251,9 +251,37 @@ body {
251
251
  flex-direction: column;
252
252
  /* Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/text-autospace */
253
253
  text-autospace: normal;
254
+ font-synthesis: none;
254
255
  font-family: var(--font-sans-serif);
255
256
  }
256
257
 
258
+ .site-toast {
259
+ position: fixed;
260
+ top: 10rem;
261
+ left: 50%;
262
+ z-index: 102;
263
+ max-width: min(90vw, 32rem);
264
+ padding: 0.7rem 1rem;
265
+ border: 1px solid var(--surface2);
266
+ border-radius: 0.75rem;
267
+ background: var(--surface1);
268
+ color: var(--text);
269
+ box-shadow: 0 0.75rem 2rem -1rem hsl(from var(--text) h s l / 0.35);
270
+ font-size: 0.875rem;
271
+ line-height: 1.35;
272
+ pointer-events: none;
273
+ opacity: 0;
274
+ transform: translateX(-50%) translateY(-2rem);
275
+ transition:
276
+ opacity 160ms ease,
277
+ transform 160ms ease;
278
+ }
279
+
280
+ .site-toast.is-visible {
281
+ opacity: 1;
282
+ transform: translateX(-50%) translateY(0);
283
+ }
284
+
257
285
  .navbar-main,
258
286
  .navbar-menu {
259
287
  user-select: none;
@@ -530,21 +558,32 @@ html {
530
558
  /* #region Navbar */
531
559
 
532
560
  .navbar {
533
- min-height: 4rem;
561
+ min-height: 3.5rem;
534
562
  position: sticky;
535
- top: env(safe-area-inset-top);
563
+ padding-top: env(safe-area-inset-top);
564
+ top: 0;
536
565
  left: 0;
537
566
  right: 0;
538
567
  z-index: 100;
539
568
  background: var(--mantle);
540
- border-bottom: 0.5px solid var(--surface0);
569
+ }
570
+
571
+ .navbar::after {
572
+ content: "";
573
+ position: absolute;
574
+ left: 8%;
575
+ right: 8%;
576
+ bottom: 0;
577
+ height: 1px;
578
+ background: linear-gradient(90deg, transparent 0%, hsl(from var(--surface0) h s l / 0.75) 22%, hsl(from var(--surface0) h s l / 0.75) 78%, transparent 100%);
579
+ pointer-events: none;
541
580
  }
542
581
 
543
582
  @media screen and (min-width: 1024px) {
544
583
  .navbar {
545
- -webkit-backdrop-filter: blur(18px) saturate(1.35);
546
- backdrop-filter: blur(18px) saturate(1.35);
547
- background: hsl(from var(--mantle) h s l / 0.75);
584
+ -webkit-backdrop-filter: blur(20px) saturate(1.4);
585
+ backdrop-filter: blur(20px) saturate(1.4);
586
+ background: hsl(from var(--mantle) h s l / 0.72);
548
587
  }
549
588
  }
550
589
 
@@ -553,7 +592,7 @@ html {
553
592
  margin: 0 auto;
554
593
  width: auto;
555
594
  display: flex;
556
- min-height: 4rem;
595
+ min-height: 3.5rem;
557
596
 
558
597
  button {
559
598
  background: none;
@@ -562,10 +601,29 @@ html {
562
601
  }
563
602
  }
564
603
 
604
+ .navbar-main {
605
+ transition: transform 240ms cubic-bezier(0.4, 0, 0.2, 1);
606
+ }
607
+
565
608
  .navbar-main.navbar--hidden {
566
609
  transform: translateY(-100%);
567
610
  }
568
611
 
612
+ .navbar-logo {
613
+ font-family: homemade-apple, var(--font-handwriting);
614
+ color: var(--subtext1);
615
+ display: flex;
616
+ align-items: center;
617
+ padding: 0 1.25rem;
618
+ letter-spacing: 0.01em;
619
+ line-height: 1;
620
+ transition: color 240ms ease;
621
+ }
622
+
623
+ .navbar-logo:hover {
624
+ color: var(--rosewater);
625
+ }
626
+
569
627
  .navbar-item {
570
628
  color: var(--subtext0);
571
629
  align-items: center;
@@ -575,33 +633,63 @@ html {
575
633
  flex-grow: 0;
576
634
  flex-shrink: 0;
577
635
  letter-spacing: 0.05em;
578
- transition: color 0.18s ease;
636
+ transition: color 220ms ease;
579
637
  }
580
638
 
581
- .navbar-start .navbar-item.is-active {
582
- color: var(--text);
583
- font-weight: 500;
584
- }
639
+ @media screen and (min-width: 1024px) {
640
+ .navbar-start .navbar-item {
641
+ font-family: var(--font-sans-serif);
642
+ font-size: 0.78rem;
643
+ font-weight: 500;
644
+ letter-spacing: 0.18em;
645
+ text-transform: uppercase;
646
+ padding: 0 0.9rem;
647
+ color: var(--subtext0);
648
+ }
585
649
 
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%);
650
+ .navbar-start .navbar-item::after {
651
+ content: "";
652
+ position: absolute;
653
+ left: 50%;
654
+ bottom: 0.95rem;
655
+ width: 55%;
656
+ height: 1px;
657
+ background: var(--rosewater);
658
+ transform: translateX(-50%) scaleX(0);
659
+ transform-origin: center;
660
+ transition: transform 320ms cubic-bezier(0.4, 0, 0.2, 1);
661
+ }
662
+
663
+ .navbar-start .navbar-item:hover {
664
+ color: var(--text);
665
+ }
666
+
667
+ .navbar-start .navbar-item:hover::after {
668
+ transform: translateX(-50%) scaleX(1);
669
+ }
596
670
  }
597
671
 
598
672
  .navbar-end {
599
673
  svg {
600
- width: 1.2em;
674
+ width: 1.1em;
675
+ opacity: 0.78;
676
+ transition:
677
+ opacity 220ms ease,
678
+ transform 220ms ease;
679
+ }
680
+
681
+ .navbar-item {
682
+ padding: 0 0.6rem;
683
+ transition: color 220ms ease;
601
684
  }
602
685
 
603
686
  .navbar-item:hover {
604
- color: var(--lavender);
687
+ color: var(--text);
688
+ }
689
+
690
+ .navbar-item:hover svg {
691
+ opacity: 1;
692
+ transform: translateY(-1px);
605
693
  }
606
694
  }
607
695
 
@@ -645,49 +733,6 @@ html {
645
733
 
646
734
  /* #endregion Theme Selector */
647
735
 
648
- /* #region Pagination */
649
-
650
- .pagination,
651
- .pagination-list {
652
- align-items: center;
653
- display: flex;
654
- text-align: center;
655
- font-family: var(--font-serif);
656
- font-style: italic;
657
- }
658
-
659
- .pagination-link.is-current {
660
- color: var(--text);
661
- font-weight: bold;
662
- }
663
-
664
- .pagination-ellipsis,
665
- .pagination-link,
666
- .pagination-next,
667
- .pagination-previous {
668
- user-select: none;
669
- color: var(--subtext0);
670
- padding: 0 1rem;
671
- display: inline-flex;
672
- min-width: 1.5em;
673
- }
674
-
675
- .pagination-previous {
676
- margin-right: auto;
677
- margin-left: 0.5rem;
678
- }
679
-
680
- .pagination-next {
681
- margin-left: auto;
682
- margin-right: 0.5rem;
683
- }
684
-
685
- .pagination-list {
686
- flex-wrap: wrap;
687
- }
688
-
689
- /* #endregion Pagination */
690
-
691
736
  .section {
692
737
  padding: 3rem 1.5rem;
693
738
  flex-grow: 1;
@@ -707,61 +752,54 @@ html {
707
752
 
708
753
  .footer {
709
754
  user-select: none;
710
- padding: 3rem 1.5rem 6rem;
711
755
  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;
756
+ padding: 4rem 1.5rem 3rem;
757
+ text-align: center;
758
+ color: var(--overlay0);
759
+ font-family: var(--font-mono);
724
760
  }
725
761
 
726
- .footer-column {
762
+ .footer-brand {
727
763
  display: flex;
728
764
  flex-direction: column;
729
- gap: 0.5rem;
765
+ align-items: center;
766
+ gap: 0.25rem;
730
767
  }
731
768
 
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;
769
+ .footer-credit,
770
+ .footer-credit > a {
771
+ font-size: 0.75rem;
772
+ font-weight: 400;
773
+ margin: 0;
774
+ letter-spacing: 0.06em;
775
+ color: inherit;
737
776
  }
738
777
 
739
- .footer-heading {
740
- font-weight: bolder;
741
- font-family: var(--font-serif);
778
+ .footer-author {
779
+ font-size: 0.8125rem;
742
780
  font-style: italic;
743
- font-size: 1.1rem;
744
- margin-bottom: 0.25rem;
781
+ font-family: homemade-apple, var(--font-handwriting);
782
+ color: var(--subtext0);
783
+ font-weight: 600;
784
+ letter-spacing: 0.01em;
745
785
  }
746
786
 
747
787
  .footer-meta {
748
- font-size: 0.75rem;
749
- color: var(--subtext0);
750
- line-height: 1.6;
788
+ font-size: 0.65rem;
789
+ font-weight: 400;
790
+ margin: 0;
791
+ line-height: 1.8;
792
+ letter-spacing: 0.02em;
751
793
  }
752
794
 
753
- .footer-links {
754
- display: flex;
755
- flex-wrap: wrap;
756
- gap: 0.5rem 1rem;
757
- align-items: center;
795
+ .footer-icp {
796
+ color: inherit;
797
+ text-decoration: none;
798
+ transition: color 0.2s ease;
758
799
  }
759
800
 
760
- .footer-link {
761
- display: inline-flex;
762
- align-items: center;
763
- gap: 0.4rem;
764
- color: var(--subtext0);
801
+ .footer-icp:hover {
802
+ color: var(--lavender);
765
803
  }
766
804
 
767
805
  /* #endregion Footer */
@@ -825,10 +863,11 @@ html {
825
863
  &::before {
826
864
  content: counter(h2-counter, decimal-leading-zero) ".";
827
865
  color: var(--flamingo);
828
- font-family: var(--font-mono);
866
+ font-family: var(--font-serif);
829
867
  padding-right: 0.2em;
868
+ letter-spacing: 0.1rem;
830
869
  font-size: 0.75em;
831
- font-variant-numeric: tabular-nums;
870
+ font-variant-numeric: oldstyle-nums;
832
871
  }
833
872
 
834
873
  &:hover::after {
@@ -1248,7 +1287,6 @@ small {
1248
1287
  /* #endregion Content */
1249
1288
 
1250
1289
  article,
1251
- aside,
1252
1290
  figure,
1253
1291
  footer,
1254
1292
  header,
@@ -1303,11 +1341,12 @@ section {
1303
1341
  color: var(--overlay0);
1304
1342
  }
1305
1343
 
1306
- .article-footer {
1344
+ .article-meta-bar {
1307
1345
  display: flex;
1308
1346
  justify-content: space-between;
1309
1347
  align-items: center;
1310
1348
  margin-top: 1rem;
1349
+ margin-bottom: 1rem;
1311
1350
  padding-bottom: 0.75rem;
1312
1351
  border-bottom: 1px dashed var(--surface0);
1313
1352
  font-family: var(--font-mono);
@@ -1332,20 +1371,6 @@ em,
1332
1371
  gap: 0.2rem;
1333
1372
  }
1334
1373
 
1335
- .article-read-more {
1336
- color: var(--subtext0);
1337
- text-decoration: none;
1338
- white-space: nowrap;
1339
-
1340
- &:hover {
1341
- color: var(--blue);
1342
- }
1343
- }
1344
-
1345
- .article-footer.article-meta-bar {
1346
- margin-bottom: 1rem;
1347
- }
1348
-
1349
1374
  .article-title-actions {
1350
1375
  display: flex;
1351
1376
  align-items: center;
@@ -1423,7 +1448,7 @@ em,
1423
1448
  }
1424
1449
 
1425
1450
  .language-switch-popover {
1426
- width: min(24rem, 90vw);
1451
+ width: min(40rem, 90vw);
1427
1452
  }
1428
1453
 
1429
1454
  .language-switch-popover-body {
@@ -2041,7 +2066,7 @@ em,
2041
2066
  display: flex;
2042
2067
  flex-direction: column;
2043
2068
  gap: 0.125rem;
2044
- min-width: 0;
2069
+ min-width: 20rem;
2045
2070
  flex: 1;
2046
2071
  padding-top: 0.125rem;
2047
2072
  }
@@ -2214,8 +2239,8 @@ input.searchbox-input {
2214
2239
 
2215
2240
  .toc-button {
2216
2241
  position: fixed;
2217
- top: 7rem;
2218
- left: 2rem;
2242
+ top: 10rem;
2243
+ left: max(2rem, calc(50% - 25em - 10rem));
2219
2244
  width: 3rem;
2220
2245
  height: 3rem;
2221
2246
  border-radius: 50%;
@@ -2276,19 +2301,16 @@ input.searchbox-input {
2276
2301
  margin: auto;
2277
2302
  max-width: 90vw;
2278
2303
  max-height: 85vh;
2279
- border: 1px solid var(--surface0);
2280
2304
  border-radius: 16px;
2281
- background: var(--mantle);
2305
+ /* background: var(--mantle); */
2282
2306
  color: var(--text);
2283
2307
  box-shadow:
2284
2308
  0 20px 60px -15px rgba(0, 0, 0, 0.3),
2285
2309
  0 0 0 1px var(--surface0);
2286
2310
  overflow: hidden;
2287
- backdrop-filter: none;
2288
- -webkit-backdrop-filter: none;
2289
2311
 
2290
2312
  &::backdrop {
2291
- background: hsl(from var(--mantle) h s l / 0.7);
2313
+ /* background: hsl(from var(--mantle) h s l / 0.7); */
2292
2314
  backdrop-filter: blur(10px);
2293
2315
  -webkit-backdrop-filter: blur(10px);
2294
2316
  }
@@ -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;
@@ -110,10 +110,6 @@
110
110
  margin-bottom: 0.5rem;
111
111
  }
112
112
 
113
- .is-hidden-mobile {
114
- display: none;
115
- }
116
-
117
113
  table {
118
114
  font-size: 14px;
119
115
  }
@@ -140,10 +136,6 @@
140
136
  border-radius: 0;
141
137
  }
142
138
 
143
- .pagination {
144
- height: 2.5em;
145
- }
146
-
147
139
  .article-comment-popover,
148
140
  .article-comment-popover-body {
149
141
  width: calc(100vw - 1rem);
@@ -169,46 +161,10 @@
169
161
  }
170
162
 
171
163
  @media screen and (min-width: 769px) {
172
- .is-hidden-tablet {
173
- display: none;
174
- }
175
-
176
164
  .level {
177
165
  display: flex;
178
166
  flex-grow: 1;
179
167
  }
180
-
181
- .pagination-list {
182
- flex-grow: 1;
183
- flex-shrink: 1;
184
- justify-content: flex-start;
185
- order: 1;
186
- }
187
-
188
- .pagination-previous {
189
- order: 2;
190
- }
191
-
192
- .pagination-next {
193
- order: 3;
194
- }
195
-
196
- .pagination {
197
- justify-content: space-between;
198
- }
199
-
200
- .pagination-previous {
201
- order: 1;
202
- }
203
-
204
- .pagination-list {
205
- justify-content: center;
206
- order: 2;
207
- }
208
-
209
- .pagination-next {
210
- order: 3;
211
- }
212
168
  }
213
169
 
214
170
  @media screen and (max-width: 1023px) {
@@ -222,7 +178,7 @@
222
178
  .navbar-menu.is-active {
223
179
  display: block;
224
180
  position: fixed;
225
- top: 4rem;
181
+ top: 3.5rem;
226
182
  left: 0;
227
183
  width: 100%;
228
184
  height: 100vh;
@@ -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
  }