hexo-theme-particlex 2.5.14 → 2.6.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.
- package/layout/current.ejs +6 -6
- package/layout/index.ejs +1 -5
- package/layout/layout.ejs +13 -13
- package/layout/menu.ejs +16 -14
- package/layout/post.ejs +2 -2
- package/package.json +1 -1
- package/source/css/main.css +16 -15
- package/source/js/lib/crypto.js +9 -9
- package/source/js/lib/highlight.js +8 -3
- package/source/js/lib/home.js +3 -3
- package/source/js/lib/preview.js +2 -2
- package/source/js/main.js +2 -2
package/layout/current.ejs
CHANGED
@@ -14,12 +14,12 @@
|
|
14
14
|
<span class="page-omit">...</span>
|
15
15
|
<% } %>
|
16
16
|
<% if (page.current - 2 >= 1) { %>
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
<% if (page.current - 2 === 1) { %>
|
18
|
+
<a class="page-num" href="<%- config.root %>">1</a>
|
19
|
+
<% } %>
|
20
|
+
<% if (page.current - 2 !== 1) { %>
|
21
|
+
<a class="page-num" href="<%- url_for("page/" + (page.current - 2)) %>"><%= page.current - 2 %></a>
|
22
|
+
<% } %>
|
23
23
|
<% } %>
|
24
24
|
<a class="page-num" href="<%- url_for(page.prev_link) %>"><%= page.prev %></a>
|
25
25
|
</span>
|
package/layout/index.ejs
CHANGED
@@ -1,9 +1,5 @@
|
|
1
1
|
<div id="home-head">
|
2
|
-
<div
|
3
|
-
id="home-background"
|
4
|
-
ref="homeBackground"
|
5
|
-
data-images="<%- theme.background.map(i => url_for(i)) %>"
|
6
|
-
></div>
|
2
|
+
<div id="home-background" ref="homeBackground" data-images="<%- theme.background.map(i => url_for(i)) %>"></div>
|
7
3
|
<div id="home-info" @click="homeClick">
|
8
4
|
<span class="loop"></span>
|
9
5
|
<span class="loop"></span>
|
package/layout/layout.ejs
CHANGED
@@ -27,26 +27,26 @@
|
|
27
27
|
<body>
|
28
28
|
<div id="layout">
|
29
29
|
<transition name="fade">
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
<div id="loading" v-show="loading">
|
31
|
+
<div id="loading-circle">
|
32
|
+
<h2>LOADING</h2>
|
33
|
+
<p>加载过慢请开启缓存 浏览器默认开启</p>
|
34
|
+
<img src="<%- url_for("/images/loading.gif") %>" />
|
35
|
+
</div>
|
35
36
|
</div>
|
36
|
-
</div>
|
37
37
|
</transition>
|
38
38
|
<%- partial("menu") %>
|
39
39
|
<transition name="into">
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
<div id="main" v-show="!loading">
|
41
|
+
<%- partial(type) %>
|
42
|
+
<%- partial("footer") %>
|
43
|
+
</div>
|
44
44
|
</transition>
|
45
45
|
<% if (theme.preview.enable) { %>
|
46
46
|
<transition name="fade">
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
<div id="preview" ref="preview" v-show="previewShow">
|
48
|
+
<img id="preview-content" ref="previewContent" />
|
49
|
+
</div>
|
50
50
|
</transition>
|
51
51
|
<% } %>
|
52
52
|
</div>
|
package/layout/menu.ejs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
<nav id="menu" :class="{ hidden: hiddenMenu, 'menu-color': menuColor}">
|
2
|
-
<div
|
2
|
+
<div id="desktop-menu">
|
3
3
|
<a class="title" href="<%- config.root %>">
|
4
4
|
<span><%= config.title.toUpperCase() %></span>
|
5
5
|
</a>
|
@@ -11,24 +11,26 @@
|
|
11
11
|
<% }); %>
|
12
12
|
</div>
|
13
13
|
<div id="mobile-menu">
|
14
|
-
<div class="
|
15
|
-
<div class="title" @click="shouMenuItems = !shouMenuItems">
|
14
|
+
<div class="title" @click="showMenuItems = !showMenuItems">
|
16
15
|
<i class="fa-solid fa-bars fa-fw"></i>
|
17
16
|
<span> <%= config.title.toUpperCase() %></span>
|
18
17
|
</div>
|
19
18
|
<transition name="slide">
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
<div class="items" v-show="showMenuItems">
|
20
|
+
<% Object.keys(theme.menu).forEach(key => { %>
|
21
|
+
<a href="<%- url_for(theme.menu[key].link) %>">
|
22
|
+
<div class="item">
|
23
|
+
<div style="min-width: 20px; max-width: 50px; width: 10%">
|
24
|
+
<i class="fa-<%- theme.menu[key].theme %> fa-<%- theme.menu[key].name %> fa-fw"></i>
|
25
|
+
</div>
|
26
|
+
<div style="min-width: 100px; max-width: 150%; width: 20%"><%= key %></div>
|
26
27
|
</div>
|
27
|
-
|
28
|
-
|
29
|
-
</
|
30
|
-
<% }); %>
|
31
|
-
</div>
|
28
|
+
</a>
|
29
|
+
<% }); %>
|
30
|
+
</div>
|
32
31
|
</transition>
|
33
32
|
</div>
|
34
33
|
</nav>
|
34
|
+
<transition name="fade">
|
35
|
+
<div id="menu-curtain" @click="showMenuItems = !showMenuItems" v-show="showMenuItems"></div>
|
36
|
+
</transition>
|
package/layout/post.ejs
CHANGED
@@ -47,7 +47,7 @@
|
|
47
47
|
<input
|
48
48
|
id="crypto"
|
49
49
|
:class="['input', cryptoClass]"
|
50
|
-
:disabled="
|
50
|
+
:disabled="cryptoStatus"
|
51
51
|
ref="crypto"
|
52
52
|
placeholder="文章被加密,请输入密码"
|
53
53
|
data-encrypted="<%- CryptoJS.AES.encrypt(page.content, page.secret).toString() %>"
|
@@ -55,7 +55,7 @@
|
|
55
55
|
v-model="crypto"
|
56
56
|
/>
|
57
57
|
<transition name="fade">
|
58
|
-
|
58
|
+
<div class="content" ref="content" v-show="cryptoStatus"></div>
|
59
59
|
</transition>
|
60
60
|
<% } else { %>
|
61
61
|
<div class="content" v-pre>
|
package/package.json
CHANGED
package/source/css/main.css
CHANGED
@@ -271,7 +271,7 @@
|
|
271
271
|
}
|
272
272
|
#home-posts .post .category-and-date .date,
|
273
273
|
#archives .tags,
|
274
|
-
#menu
|
274
|
+
#menu #desktop-menu a span {
|
275
275
|
display: inline-block;
|
276
276
|
}
|
277
277
|
#home-posts .post .category-and-date .special {
|
@@ -376,18 +376,18 @@
|
|
376
376
|
top: 0;
|
377
377
|
transition: background 0.25s ease-out, top 0.25s ease-out;
|
378
378
|
width: 100vw;
|
379
|
-
z-index:
|
379
|
+
z-index: 1004;
|
380
380
|
}
|
381
|
-
#menu
|
381
|
+
#menu #desktop-menu {
|
382
382
|
height: 50px;
|
383
383
|
}
|
384
|
-
#menu
|
384
|
+
#menu #desktop-menu .title {
|
385
385
|
color: #555;
|
386
386
|
display: inline-block;
|
387
387
|
margin-left: 60px;
|
388
388
|
margin-right: 5px;
|
389
389
|
}
|
390
|
-
#menu
|
390
|
+
#menu #desktop-menu a {
|
391
391
|
color: #555;
|
392
392
|
display: inline-block;
|
393
393
|
margin-left: 30px;
|
@@ -396,17 +396,18 @@
|
|
396
396
|
min-height: 50px;
|
397
397
|
text-align: center;
|
398
398
|
}
|
399
|
-
#menu
|
399
|
+
#menu-curtain {
|
400
|
+
background: #0003;
|
400
401
|
height: 100%;
|
401
402
|
left: 0;
|
402
403
|
position: fixed;
|
403
404
|
top: 0;
|
404
405
|
width: 100%;
|
405
|
-
z-index:
|
406
|
+
z-index: 1001;
|
406
407
|
}
|
407
408
|
#menu #mobile-menu .items {
|
408
409
|
padding: 10px 0 20px;
|
409
|
-
z-index:
|
410
|
+
z-index: 1002;
|
410
411
|
}
|
411
412
|
#menu #mobile-menu .items .item {
|
412
413
|
display: flex;
|
@@ -421,10 +422,10 @@
|
|
421
422
|
#menu #mobile-menu .title {
|
422
423
|
color: #555;
|
423
424
|
cursor: pointer;
|
424
|
-
z-index:
|
425
|
+
z-index: 1003;
|
425
426
|
}
|
426
427
|
#menu.hidden {
|
427
|
-
top: -
|
428
|
+
top: -50px !important;
|
428
429
|
}
|
429
430
|
#menu.menu-color {
|
430
431
|
background: #0003 !important;
|
@@ -444,7 +445,7 @@
|
|
444
445
|
position: fixed;
|
445
446
|
top: 0;
|
446
447
|
width: 100vw;
|
447
|
-
z-index:
|
448
|
+
z-index: 1005;
|
448
449
|
}
|
449
450
|
#preview-content {
|
450
451
|
box-shadow: 0 0 50px 10px #d9d9d980;
|
@@ -454,7 +455,7 @@
|
|
454
455
|
}
|
455
456
|
#search-bar {
|
456
457
|
margin-bottom: 50px;
|
457
|
-
z-index:
|
458
|
+
z-index: 1000;
|
458
459
|
}
|
459
460
|
#timeline-wrap {
|
460
461
|
display: flex;
|
@@ -633,7 +634,7 @@ body::-webkit-scrollbar-track {
|
|
633
634
|
width: 12px;
|
634
635
|
}
|
635
636
|
::-webkit-scrollbar-thumb {
|
636
|
-
background
|
637
|
+
background: #8ab5ff
|
637
638
|
linear-gradient(
|
638
639
|
45deg,
|
639
640
|
#fff6 25%,
|
@@ -872,7 +873,7 @@ ol li {
|
|
872
873
|
#home-posts-wrap {
|
873
874
|
max-width: 1200px;
|
874
875
|
}
|
875
|
-
#menu
|
876
|
+
#menu #desktop-menu {
|
876
877
|
display: block;
|
877
878
|
}
|
878
879
|
#menu #mobile-menu {
|
@@ -958,7 +959,7 @@ ol li {
|
|
958
959
|
#footer #footer-wrap {
|
959
960
|
width: 100%;
|
960
961
|
}
|
961
|
-
#menu
|
962
|
+
#menu #desktop-menu,
|
962
963
|
#home-card {
|
963
964
|
display: none;
|
964
965
|
}
|
package/source/js/lib/crypto.js
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
mixins.crypto = {
|
2
2
|
data() {
|
3
|
-
return { crypto: "",
|
3
|
+
return { crypto: "", cryptoStatus: null };
|
4
4
|
},
|
5
5
|
watch: {
|
6
6
|
crypto(value) {
|
7
7
|
let input = this.$refs.crypto,
|
8
|
-
content = this.$refs.content
|
9
|
-
|
8
|
+
content = this.$refs.content,
|
9
|
+
{ encrypted, shasum } = input.dataset;
|
10
10
|
try {
|
11
11
|
let decrypted = CryptoJS.AES.decrypt(encrypted, value).toString(CryptoJS.enc.Utf8);
|
12
12
|
if (CryptoJS.SHA256(decrypted).toString() === shasum) {
|
13
|
-
this.
|
13
|
+
this.cryptoStatus = true;
|
14
14
|
content.innerHTML = decrypted;
|
15
15
|
this.render();
|
16
|
-
} else this.
|
16
|
+
} else this.cryptoStatus = false;
|
17
17
|
} catch {
|
18
|
-
this.
|
18
|
+
this.cryptoStatus = false;
|
19
19
|
}
|
20
20
|
},
|
21
21
|
},
|
22
22
|
computed: {
|
23
23
|
cryptoClass() {
|
24
|
-
if (this.
|
25
|
-
if (this.
|
26
|
-
if (this.
|
24
|
+
if (this.cryptoStatus === null) return "";
|
25
|
+
if (this.cryptoStatus === true) return "success";
|
26
|
+
if (this.cryptoStatus === false) return "fail";
|
27
27
|
},
|
28
28
|
},
|
29
29
|
};
|
@@ -10,9 +10,14 @@ mixins.highlight = {
|
|
10
10
|
highlight() {
|
11
11
|
let codes = document.querySelectorAll("pre");
|
12
12
|
for (let i of codes) {
|
13
|
-
let code = i.innerText
|
14
|
-
|
15
|
-
|
13
|
+
let code = i.innerText,
|
14
|
+
language = [...i.classList, ...i.firstChild.classList][0] || "plaintext",
|
15
|
+
highlighted;
|
16
|
+
try {
|
17
|
+
highlighted = hljs.highlight(code, { language }).value;
|
18
|
+
} catch {
|
19
|
+
highlighted = code;
|
20
|
+
}
|
16
21
|
i.innerHTML = `
|
17
22
|
<div class="code-content">${highlighted}</div>
|
18
23
|
<div class="language">${language}</div>
|
package/source/js/lib/home.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
mixins.home = {
|
2
2
|
mounted() {
|
3
|
-
let background = this.$refs.homeBackground
|
4
|
-
|
5
|
-
|
3
|
+
let background = this.$refs.homeBackground,
|
4
|
+
images = background.dataset.images.split(","),
|
5
|
+
id = Math.floor(Math.random() * images.length);
|
6
6
|
background.style.backgroundImage = `url('${images[id]}')`;
|
7
7
|
this.menuColor = true;
|
8
8
|
},
|
package/source/js/lib/preview.js
CHANGED
@@ -8,8 +8,8 @@ mixins.preview = {
|
|
8
8
|
methods: {
|
9
9
|
preview() {
|
10
10
|
let preview = this.$refs.preview,
|
11
|
-
content = this.$refs.previewContent
|
12
|
-
|
11
|
+
content = this.$refs.previewContent,
|
12
|
+
images = document.querySelectorAll("img");
|
13
13
|
for (let i of images)
|
14
14
|
i.addEventListener("click", () => {
|
15
15
|
content.alt = i.alt;
|
package/source/js/main.js
CHANGED
@@ -25,8 +25,8 @@ const app = Vue.createApp({
|
|
25
25
|
for (let i of this.renderers) i();
|
26
26
|
},
|
27
27
|
handleScroll() {
|
28
|
-
let wrap = this.$refs.homePostsWrap
|
29
|
-
|
28
|
+
let wrap = this.$refs.homePostsWrap,
|
29
|
+
newScrollTop = document.documentElement.scrollTop;
|
30
30
|
if (this.scrollTop < newScrollTop) {
|
31
31
|
this.hiddenMenu = true;
|
32
32
|
this.showMenuItems = false;
|