hexo-theme-particlex 2.5.15 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 +15 -14
- 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;
|
@@ -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;
|