hexo-theme-shokax 0.0.1-alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-shoka +21 -0
  3. package/README.md +47 -0
  4. package/_config.yml +353 -0
  5. package/_images.yml +99 -0
  6. package/languages/README.md +19 -0
  7. package/languages/default.yml +1 -0
  8. package/languages/en.yml +151 -0
  9. package/languages/ja.yml +146 -0
  10. package/languages/zh-CN.yml +154 -0
  11. package/languages/zh-HK.yml +146 -0
  12. package/languages/zh-TW.yml +146 -0
  13. package/layout/_alternate/atom.ejs +30 -0
  14. package/layout/_alternate/json.ejs +16 -0
  15. package/layout/_alternate/rss.ejs +34 -0
  16. package/layout/_mixin/breadcrumb.pug +33 -0
  17. package/layout/_mixin/card.pug +37 -0
  18. package/layout/_mixin/comment.pug +10 -0
  19. package/layout/_mixin/postmeta.pug +30 -0
  20. package/layout/_mixin/segment.pug +32 -0
  21. package/layout/_mixin/sidebar.pug +36 -0
  22. package/layout/_mixin/widgets.pug +29 -0
  23. package/layout/_partials/footer.pug +61 -0
  24. package/layout/_partials/head/head.pug +54 -0
  25. package/layout/_partials/head/head_com.pug +17 -0
  26. package/layout/_partials/head/pwa.pug +17 -0
  27. package/layout/_partials/header.pug +19 -0
  28. package/layout/_partials/layout.pug +143 -0
  29. package/layout/_partials/loading.pug +13 -0
  30. package/layout/_partials/pagination.pug +4 -0
  31. package/layout/_partials/post/copyright.pug +20 -0
  32. package/layout/_partials/post/footer.pug +13 -0
  33. package/layout/_partials/post/nav.pug +13 -0
  34. package/layout/_partials/post/post.pug +26 -0
  35. package/layout/_partials/post/reward.pug +18 -0
  36. package/layout/_partials/sidebar/menu.pug +37 -0
  37. package/layout/_partials/sidebar/overview.pug +40 -0
  38. package/layout/_partials/third-party/baidu-analytics.pug +11 -0
  39. package/layout/_partials/third-party/clarity.pug +8 -0
  40. package/layout/_partials/third-party/qweather.pug +35 -0
  41. package/layout/archive.pug +31 -0
  42. package/layout/category.pug +66 -0
  43. package/layout/index.pug +33 -0
  44. package/layout/page.pug +56 -0
  45. package/layout/post.pug +35 -0
  46. package/layout/tag.pug +43 -0
  47. package/package.json +35 -0
  48. package/scripts/filters/locals.js +57 -0
  49. package/scripts/filters/post.js +23 -0
  50. package/scripts/generaters/archive.js +141 -0
  51. package/scripts/generaters/config.js +43 -0
  52. package/scripts/generaters/images.js +26 -0
  53. package/scripts/generaters/index.js +110 -0
  54. package/scripts/generaters/pages.js +19 -0
  55. package/scripts/generaters/script.js +81 -0
  56. package/scripts/helpers/asset.js +237 -0
  57. package/scripts/helpers/engine.js +183 -0
  58. package/scripts/helpers/list_categories.js +140 -0
  59. package/scripts/helpers/symbols_count_time.js +76 -0
  60. package/scripts/tags/links.js +86 -0
  61. package/scripts/tags/media.js +19 -0
  62. package/source/assets/404.png +0 -0
  63. package/source/assets/algolia_logo.svg +9 -0
  64. package/source/assets/apple-touch-icon.png +0 -0
  65. package/source/assets/beian.webp +0 -0
  66. package/source/assets/failure.ico +0 -0
  67. package/source/assets/favicon.ico +0 -0
  68. package/source/assets/logo.svg +16 -0
  69. package/source/assets/play_disc.png +0 -0
  70. package/source/assets/play_needle.png +0 -0
  71. package/source/assets/search.png +0 -0
  72. package/source/css/_colors.styl +207 -0
  73. package/source/css/_common/components/components.styl +6 -0
  74. package/source/css/_common/components/highlight/highlight.styl +353 -0
  75. package/source/css/_common/components/highlight/operation.styl +21 -0
  76. package/source/css/_common/components/pages/collapse.styl +119 -0
  77. package/source/css/_common/components/pages/home.styl +385 -0
  78. package/source/css/_common/components/pages/pages.styl +56 -0
  79. package/source/css/_common/components/pages/tag-cloud.styl +12 -0
  80. package/source/css/_common/components/post/breadcrumb.styl +39 -0
  81. package/source/css/_common/components/post/copyright.styl +41 -0
  82. package/source/css/_common/components/post/expand.styl +264 -0
  83. package/source/css/_common/components/post/footer.styl +11 -0
  84. package/source/css/_common/components/post/header.styl +79 -0
  85. package/source/css/_common/components/post/nav.styl +63 -0
  86. package/source/css/_common/components/post/post.styl +29 -0
  87. package/source/css/_common/components/post/reward.styl +50 -0
  88. package/source/css/_common/components/post/rtl.styl +12 -0
  89. package/source/css/_common/components/post/tags.styl +39 -0
  90. package/source/css/_common/components/tags/collapse.styl +72 -0
  91. package/source/css/_common/components/tags/container.styl +49 -0
  92. package/source/css/_common/components/tags/label.styl +12 -0
  93. package/source/css/_common/components/tags/links.styl +77 -0
  94. package/source/css/_common/components/tags/list.styl +131 -0
  95. package/source/css/_common/components/tags/note.styl +70 -0
  96. package/source/css/_common/components/tags/player.styl +361 -0
  97. package/source/css/_common/components/tags/quiz.styl +200 -0
  98. package/source/css/_common/components/tags/tabs.styl +83 -0
  99. package/source/css/_common/components/tags/tags.styl +9 -0
  100. package/source/css/_common/components/third-party/loading.styl +222 -0
  101. package/source/css/_common/components/third-party/mermaid/class.styl +90 -0
  102. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -0
  103. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -0
  104. package/source/css/_common/components/third-party/mermaid/git.styl +7 -0
  105. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -0
  106. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -0
  107. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -0
  108. package/source/css/_common/components/third-party/mermaid/state.styl +130 -0
  109. package/source/css/_common/components/third-party/pace.styl +18 -0
  110. package/source/css/_common/components/third-party/search.styl +167 -0
  111. package/source/css/_common/components/third-party/theme.styl +151 -0
  112. package/source/css/_common/components/third-party/third-party.styl +22 -0
  113. package/source/css/_common/components/third-party/valine.styl +548 -0
  114. package/source/css/_common/components/third-party/widgets.styl +57 -0
  115. package/source/css/_common/outline/footer/footer.styl +69 -0
  116. package/source/css/_common/outline/header/brand.styl +77 -0
  117. package/source/css/_common/outline/header/header.styl +20 -0
  118. package/source/css/_common/outline/header/image.styl +79 -0
  119. package/source/css/_common/outline/header/menu.styl +117 -0
  120. package/source/css/_common/outline/header/nav.styl +81 -0
  121. package/source/css/_common/outline/header/right.styl +15 -0
  122. package/source/css/_common/outline/header/tool.styl +207 -0
  123. package/source/css/_common/outline/header/waves.styl +50 -0
  124. package/source/css/_common/outline/mobile.styl +46 -0
  125. package/source/css/_common/outline/outline.styl +78 -0
  126. package/source/css/_common/outline/sidebar/author.styl +59 -0
  127. package/source/css/_common/outline/sidebar/dimmer.styl +23 -0
  128. package/source/css/_common/outline/sidebar/menu.styl +63 -0
  129. package/source/css/_common/outline/sidebar/quick.styl +43 -0
  130. package/source/css/_common/outline/sidebar/related.styl +56 -0
  131. package/source/css/_common/outline/sidebar/sidebar.styl +75 -0
  132. package/source/css/_common/outline/sidebar/social.styl +69 -0
  133. package/source/css/_common/outline/sidebar/state.styl +37 -0
  134. package/source/css/_common/outline/sidebar/tab.styl +71 -0
  135. package/source/css/_common/outline/sidebar/toc.styl +47 -0
  136. package/source/css/_common/scaffolding/animate.styl +318 -0
  137. package/source/css/_common/scaffolding/base.styl +172 -0
  138. package/source/css/_common/scaffolding/buttons.styl +48 -0
  139. package/source/css/_common/scaffolding/divider.styl +36 -0
  140. package/source/css/_common/scaffolding/iconfont.styl +443 -0
  141. package/source/css/_common/scaffolding/normalize.styl +289 -0
  142. package/source/css/_common/scaffolding/pagination.styl +81 -0
  143. package/source/css/_common/scaffolding/ribbon.styl +38 -0
  144. package/source/css/_common/scaffolding/scaffolding.styl +14 -0
  145. package/source/css/_common/scaffolding/scrollbar.styl +37 -0
  146. package/source/css/_common/scaffolding/tables.styl +50 -0
  147. package/source/css/_common/scaffolding/tip.styl +19 -0
  148. package/source/css/_common/scaffolding/toggles.styl +59 -0
  149. package/source/css/_iconfont.styl +451 -0
  150. package/source/css/_mixins.styl +146 -0
  151. package/source/css/_variables.styl +89 -0
  152. package/source/css/app.styl +27 -0
  153. package/source/css/comment.styl +5 -0
  154. package/source/css/mermaid.styl +5 -0
  155. package/source/css/plugin.styl +174 -0
  156. package/source/css/twikoo.css +2002 -0
  157. package/source/js/_app/components.js +330 -0
  158. package/source/js/_app/global.js +317 -0
  159. package/source/js/_app/library.js +302 -0
  160. package/source/js/_app/page.js +623 -0
  161. package/source/js/_app/player.js +748 -0
  162. package/source/js/_app/vue.js +43 -0
@@ -0,0 +1,330 @@
1
+ const canvasEl = document.createElement('canvas');
2
+ canvasEl.style.cssText = 'position:fixed;top:0;left:0;pointer-events:none;z-index:9999999';
3
+ document.body.appendChild(canvasEl);
4
+ const ctx = canvasEl.getContext('2d');
5
+ const numberOfParticules = 30;
6
+ let pointerX = 0;
7
+ let pointerY = 0;
8
+ const tap = 'click';
9
+ const colors = CONFIG.fireworks;
10
+ function setCanvasSize() {
11
+ canvasEl.width = window.innerWidth * 2;
12
+ canvasEl.height = window.innerHeight * 2;
13
+ canvasEl.style.width = window.innerWidth + 'px';
14
+ canvasEl.style.height = window.innerHeight + 'px';
15
+ canvasEl.getContext('2d').scale(2, 2);
16
+ }
17
+ function updateCoords(e) {
18
+ pointerX = e.clientX || (e.touches && e.touches[0].clientX);
19
+ pointerY = e.clientY || (e.touches && e.touches[0].clientY);
20
+ }
21
+ function setParticuleDirection(p) {
22
+ const angle = anime.random(0, 360) * Math.PI / 180;
23
+ const value = anime.random(50, 180);
24
+ const radius = [-1, 1][anime.random(0, 1)] * value;
25
+ return {
26
+ x: p.x + radius * Math.cos(angle),
27
+ y: p.y + radius * Math.sin(angle)
28
+ };
29
+ }
30
+ function createParticule(x, y) {
31
+ const p = {
32
+ x: undefined,
33
+ y: undefined,
34
+ color: undefined,
35
+ radius: undefined,
36
+ endPos: undefined,
37
+ draw: undefined
38
+ };
39
+ p.x = x;
40
+ p.y = y;
41
+ p.color = colors[anime.random(0, colors.length - 1)];
42
+ p.radius = anime.random(16, 32);
43
+ p.endPos = setParticuleDirection(p);
44
+ p.draw = function () {
45
+ ctx.beginPath();
46
+ ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true);
47
+ ctx.fillStyle = p.color;
48
+ ctx.fill();
49
+ };
50
+ return p;
51
+ }
52
+ function createCircle(x, y) {
53
+ const p = {
54
+ x: undefined,
55
+ y: undefined,
56
+ color: undefined,
57
+ radius: undefined,
58
+ endPos: undefined,
59
+ alpha: undefined,
60
+ lineWidth: undefined,
61
+ draw: undefined
62
+ };
63
+ p.x = x;
64
+ p.y = y;
65
+ p.color = '#FFF';
66
+ p.radius = 0.1;
67
+ p.alpha = 0.5;
68
+ p.lineWidth = 6;
69
+ p.draw = function () {
70
+ ctx.globalAlpha = p.alpha;
71
+ ctx.beginPath();
72
+ ctx.arc(p.x, p.y, p.radius, 0, 2 * Math.PI, true);
73
+ ctx.lineWidth = p.lineWidth;
74
+ ctx.strokeStyle = p.color;
75
+ ctx.stroke();
76
+ ctx.globalAlpha = 1;
77
+ };
78
+ return p;
79
+ }
80
+ function renderParticule(anim) {
81
+ for (let i = 0; i < anim.animatables.length; i++) {
82
+ anim.animatables[i].target.draw();
83
+ }
84
+ }
85
+ function animateParticules(x, y) {
86
+ const circle = createCircle(x, y);
87
+ const particules = [];
88
+ for (let i = 0; i < numberOfParticules; i++) {
89
+ particules.push(createParticule(x, y));
90
+ }
91
+ anime.timeline().add({
92
+ targets: particules,
93
+ x: function (p) {
94
+ return p.endPos.x;
95
+ },
96
+ y: function (p) {
97
+ return p.endPos.y;
98
+ },
99
+ radius: 0.1,
100
+ duration: anime.random(1200, 1800),
101
+ easing: 'easeOutExpo',
102
+ update: renderParticule
103
+ }).add({
104
+ targets: circle,
105
+ radius: anime.random(80, 160),
106
+ lineWidth: 0,
107
+ alpha: {
108
+ value: 0,
109
+ easing: 'linear',
110
+ duration: anime.random(600, 800)
111
+ },
112
+ duration: anime.random(1200, 1800),
113
+ easing: 'easeOutExpo',
114
+ update: renderParticule
115
+ }, 0);
116
+ }
117
+ const render = anime({
118
+ duration: Infinity,
119
+ update: function () {
120
+ ctx.clearRect(0, 0, canvasEl.width, canvasEl.height);
121
+ }
122
+ });
123
+ document.addEventListener(tap, function (e) {
124
+ render.play();
125
+ updateCoords(e);
126
+ animateParticules(pointerX, pointerY);
127
+ }, false);
128
+ setCanvasSize();
129
+ window.addEventListener('resize', setCanvasSize, false);
130
+ const sideBarToggleHandle = function (event, force) {
131
+ if (sideBar.hasClass('on')) {
132
+ sideBar.removeClass('on');
133
+ menuToggle.removeClass('close');
134
+ if (force) {
135
+ sideBar.style = '';
136
+ }
137
+ else {
138
+ transition(sideBar, 'slideRightOut');
139
+ }
140
+ }
141
+ else {
142
+ if (force) {
143
+ sideBar.style = '';
144
+ }
145
+ else {
146
+ transition(sideBar, 'slideRightIn', function () {
147
+ sideBar.addClass('on');
148
+ menuToggle.addClass('close');
149
+ });
150
+ }
151
+ }
152
+ };
153
+ const sideBarTab = function () {
154
+ const sideBarInner = sideBar.child('.inner');
155
+ const panels = sideBar.find('.panel');
156
+ if (sideBar.child('.tab')) {
157
+ sideBarInner.removeChild(sideBar.child('.tab'));
158
+ }
159
+ const list = document.createElement('ul');
160
+ let active = 'active';
161
+ list.className = 'tab';
162
+ ['contents', 'related', 'overview'].forEach(function (item) {
163
+ const element = sideBar.child('.panel.' + item);
164
+ if (element.innerHTML.replace(/(^\s*)|(\s*$)/g, '').length < 1) {
165
+ if (item === 'contents') {
166
+ showContents.display('none');
167
+ }
168
+ return;
169
+ }
170
+ if (item === 'contents') {
171
+ showContents.display('');
172
+ }
173
+ const tab = document.createElement('li');
174
+ const span = document.createElement('span');
175
+ const text = document.createTextNode(element.attr('data-title'));
176
+ span.appendChild(text);
177
+ tab.appendChild(span);
178
+ tab.addClass(item + ' item');
179
+ if (active) {
180
+ element.addClass(active);
181
+ tab.addClass(active);
182
+ }
183
+ else {
184
+ element.removeClass('active');
185
+ }
186
+ tab.addEventListener('click', function (event) {
187
+ const target = event.currentTarget;
188
+ if (target.hasClass('active'))
189
+ return;
190
+ sideBar.find('.tab .item').forEach(function (element) {
191
+ element.removeClass('active');
192
+ });
193
+ sideBar.find('.panel').forEach(function (element) {
194
+ element.removeClass('active');
195
+ });
196
+ sideBar.child('.panel.' + target.className.replace(' item', '')).addClass('active');
197
+ target.addClass('active');
198
+ });
199
+ list.appendChild(tab);
200
+ active = '';
201
+ });
202
+ if (list.childNodes.length > 1) {
203
+ sideBarInner.insertBefore(list, sideBarInner.childNodes[0]);
204
+ sideBar.child('.panels').style.paddingTop = '';
205
+ }
206
+ else {
207
+ sideBar.child('.panels').style.paddingTop = '.625rem';
208
+ }
209
+ };
210
+ const sidebarTOC = function () {
211
+ const activateNavByIndex = function (index, lock) {
212
+ const target = navItems[index];
213
+ if (!target)
214
+ return;
215
+ if (target.hasClass('current')) {
216
+ return;
217
+ }
218
+ $dom.each('.toc .active', function (element) {
219
+ element && element.removeClass('active current');
220
+ });
221
+ sections.forEach(function (element) {
222
+ element && element.removeClass('active');
223
+ });
224
+ target.addClass('active current');
225
+ sections[index] && sections[index].addClass('active');
226
+ let parent = target.parentNode;
227
+ while (!parent.matches('.contents')) {
228
+ if (parent.matches('li')) {
229
+ parent.addClass('active');
230
+ const t = $dom(parent.child('a.toc-link').attr('href'));
231
+ if (t) {
232
+ t.addClass('active');
233
+ }
234
+ }
235
+ parent = parent.parentNode;
236
+ }
237
+ if (getComputedStyle(sideBar).display !== 'none' && tocElement.hasClass('active')) {
238
+ pageScroll(tocElement, target.offsetTop - (tocElement.offsetHeight / 4));
239
+ }
240
+ };
241
+ const navItems = $dom.all('.contents li');
242
+ if (navItems.length < 1) {
243
+ return;
244
+ }
245
+ let sections = Array.prototype.slice.call(navItems) || [];
246
+ let activeLock = null;
247
+ sections = sections.map(function (element, index) {
248
+ const link = element.child('a.toc-link');
249
+ const anchor = $dom(decodeURI(link.attr('href')));
250
+ if (!anchor)
251
+ return;
252
+ const alink = anchor.child('a.anchor');
253
+ const anchorScroll = function (event) {
254
+ event.preventDefault();
255
+ const target = $dom(decodeURI(event.currentTarget.attr('href')));
256
+ activeLock = index;
257
+ pageScroll(target, null, function () {
258
+ activateNavByIndex(index);
259
+ activeLock = null;
260
+ });
261
+ };
262
+ link.addEventListener('click', anchorScroll);
263
+ alink && alink.addEventListener('click', function (event) {
264
+ anchorScroll(event);
265
+ clipBoard(CONFIG.hostname + '/' + LOCAL.path + event.currentTarget.attr('href'));
266
+ });
267
+ return anchor;
268
+ });
269
+ const tocElement = sideBar.child('.contents.panel');
270
+ const findIndex = function (entries) {
271
+ let index = 0;
272
+ let entry = entries[index];
273
+ if (entry.boundingClientRect.top > 0) {
274
+ index = sections.indexOf(entry.target);
275
+ return index === 0 ? 0 : index - 1;
276
+ }
277
+ for (; index < entries.length; index++) {
278
+ if (entries[index].boundingClientRect.top <= 0) {
279
+ entry = entries[index];
280
+ }
281
+ else {
282
+ return sections.indexOf(entry.target);
283
+ }
284
+ }
285
+ return sections.indexOf(entry.target);
286
+ };
287
+ const createIntersectionObserver = function () {
288
+ if (!window.IntersectionObserver)
289
+ return;
290
+ const observer = new IntersectionObserver(function (entries, observe) {
291
+ const index = findIndex(entries) + (diffY < 0 ? 1 : 0);
292
+ if (activeLock === null) {
293
+ activateNavByIndex(index);
294
+ }
295
+ }, {
296
+ rootMargin: '0px 0px -100% 0px', threshold: 0
297
+ });
298
+ sections.forEach(function (element) {
299
+ element && observer.observe(element);
300
+ });
301
+ };
302
+ createIntersectionObserver();
303
+ };
304
+ const backToTopHandle = function () {
305
+ pageScroll(0);
306
+ };
307
+ const goToBottomHandle = function () {
308
+ pageScroll(parseInt(String(Container.changeOrGetHeight())));
309
+ };
310
+ const goToCommentHandle = function () {
311
+ pageScroll($dom('#comments'));
312
+ };
313
+ const menuActive = function () {
314
+ $dom.each('.menu .item:not(.title)', function (element) {
315
+ const target = element.child('a[href]');
316
+ const parentItem = element.parentNode.parentNode;
317
+ if (!target)
318
+ return;
319
+ const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '');
320
+ const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname);
321
+ const active = target.hostname === location.hostname && (isSamePath || isSubPath);
322
+ element.toggleClass('active', active);
323
+ if (element.parentNode.child('.active') && parentItem.hasClass('dropdown')) {
324
+ parentItem.removeClass('active').addClass('expand');
325
+ }
326
+ else {
327
+ parentItem.removeClass('expand');
328
+ }
329
+ });
330
+ };
@@ -0,0 +1,317 @@
1
+ const statics = CONFIG.statics.indexOf('//') > 0 ? CONFIG.statics : CONFIG.root;
2
+ const scrollAction = { x: undefined, y: undefined };
3
+ let diffY = 0;
4
+ let originTitle, titleTime;
5
+ const BODY = document.getElementsByTagName('body')[0];
6
+ const HTML = document.documentElement;
7
+ const Container = $dom('#container');
8
+ const loadCat = $dom('#loading');
9
+ const siteNav = $dom('#nav');
10
+ const siteHeader = $dom('#header');
11
+ const menuToggle = siteNav.child('.toggle');
12
+ const quickBtn = $dom('#quick');
13
+ const sideBar = $dom('#sidebar');
14
+ const siteBrand = $dom('#brand');
15
+ let toolBtn = $dom('#tool');
16
+ let toolPlayer;
17
+ let backToTop;
18
+ let goToComment;
19
+ let showContents;
20
+ let siteSearch = $dom('#search');
21
+ let siteNavHeight, headerHightInner, headerHight;
22
+ let oWinHeight = window.innerHeight;
23
+ let oWinWidth = window.innerWidth;
24
+ let LOCAL_HASH = 0;
25
+ let LOCAL_URL = window.location.href;
26
+ let pjax;
27
+ const changeTheme = function (type) {
28
+ const btn = $dom('.theme .ic');
29
+ if (type === 'dark') {
30
+ HTML.attr('data-theme', type);
31
+ btn.removeClass('i-sun');
32
+ btn.addClass('i-moon');
33
+ }
34
+ else {
35
+ HTML.attr('data-theme', null);
36
+ btn.removeClass('i-moon');
37
+ btn.addClass('i-sun');
38
+ }
39
+ };
40
+ const autoDarkmode = function () {
41
+ if (CONFIG.auto_dark.enable) {
42
+ if (new Date().getHours() >= CONFIG.auto_dark.start || new Date().getHours() <= CONFIG.auto_dark.end) {
43
+ changeTheme('dark');
44
+ }
45
+ else {
46
+ if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
47
+ changeTheme('dark');
48
+ }
49
+ else {
50
+ changeTheme();
51
+ }
52
+ }
53
+ }
54
+ };
55
+ const lazyload = lozad('img, [data-background-image]', {
56
+ loaded: function (el) {
57
+ el.addClass('lozaded');
58
+ }
59
+ });
60
+ const Loader = {
61
+ timer: null,
62
+ lock: false,
63
+ show: function () {
64
+ clearTimeout(this.timer);
65
+ document.body.removeClass('loaded');
66
+ loadCat.attr('style', 'display:block');
67
+ Loader.lock = false;
68
+ },
69
+ hide: function (sec) {
70
+ if (!CONFIG.loader.start) {
71
+ sec = -1;
72
+ }
73
+ this.timer = setTimeout(this.vanish, sec || 3000);
74
+ },
75
+ vanish: function () {
76
+ if (Loader.lock) {
77
+ return;
78
+ }
79
+ if (CONFIG.loader.start) {
80
+ transition(loadCat, 0);
81
+ }
82
+ document.body.addClass('loaded');
83
+ Loader.lock = true;
84
+ }
85
+ };
86
+ const changeMetaTheme = function (color) {
87
+ if (HTML.attr('data-theme') === 'dark') {
88
+ color = '#222';
89
+ }
90
+ $dom('meta[name="theme-color"]').attr('content', color);
91
+ };
92
+ const themeColorListener = function () {
93
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function (mediaQueryList) {
94
+ if (mediaQueryList.matches) {
95
+ changeTheme('dark');
96
+ }
97
+ else {
98
+ changeTheme();
99
+ }
100
+ });
101
+ const t = $storage.get('theme');
102
+ if (t) {
103
+ changeTheme(t);
104
+ }
105
+ else {
106
+ if (CONFIG.darkmode) {
107
+ changeTheme('dark');
108
+ }
109
+ }
110
+ };
111
+ const visibilityListener = function () {
112
+ let iconNode = $dom('[rel="icon"]');
113
+ document.addEventListener('visibilitychange', function () {
114
+ switch (document.visibilityState) {
115
+ case 'hidden':
116
+ iconNode.attr('href', statics + CONFIG.favicon.hidden);
117
+ document.title = LOCAL.favicon.hide;
118
+ if (CONFIG.loader.switch) {
119
+ Loader.show();
120
+ }
121
+ clearTimeout(titleTime);
122
+ break;
123
+ case 'visible':
124
+ iconNode.attr('href', statics + CONFIG.favicon.normal);
125
+ document.title = LOCAL.favicon.show;
126
+ if (CONFIG.loader.switch) {
127
+ Loader.hide(1000);
128
+ }
129
+ titleTime = setTimeout(function () {
130
+ document.title = originTitle;
131
+ }, 2000);
132
+ break;
133
+ }
134
+ });
135
+ };
136
+ const showtip = function (msg) {
137
+ if (!msg) {
138
+ return;
139
+ }
140
+ const tipbox = BODY.createChild('div', {
141
+ innerHTML: msg,
142
+ className: 'tip'
143
+ });
144
+ setTimeout(function () {
145
+ tipbox.addClass('hide');
146
+ setTimeout(function () {
147
+ BODY.removeChild(tipbox);
148
+ }, 300);
149
+ }, 3000);
150
+ };
151
+ const resizeHandle = function (event) {
152
+ siteNavHeight = siteNav.changeOrGetHeight();
153
+ headerHightInner = siteHeader.changeOrGetHeight();
154
+ headerHight = headerHightInner + $dom('#waves').changeOrGetHeight();
155
+ if (oWinWidth !== window.innerWidth) {
156
+ sideBarToggleHandle(null, 1);
157
+ }
158
+ oWinHeight = window.innerHeight;
159
+ oWinWidth = window.innerWidth;
160
+ sideBar.child('.panels').changeOrGetHeight(oWinHeight + 'px');
161
+ };
162
+ const scrollHandle = function (event) {
163
+ const winHeight = window.innerHeight;
164
+ const docHeight = getDocHeight();
165
+ const contentVisibilityHeight = docHeight > winHeight ? docHeight - winHeight : document.body.scrollHeight - winHeight;
166
+ const SHOW = window.scrollY > headerHightInner;
167
+ const startScroll = window.scrollY > 0;
168
+ if (SHOW) {
169
+ changeMetaTheme('#FFF');
170
+ }
171
+ else {
172
+ changeMetaTheme('#222');
173
+ }
174
+ siteNav.toggleClass('show', SHOW);
175
+ toolBtn.toggleClass('affix', startScroll);
176
+ siteBrand.toggleClass('affix', startScroll);
177
+ sideBar.toggleClass('affix', window.scrollY > headerHight && document.body.offsetWidth > 991);
178
+ if (typeof scrollAction.y === 'undefined') {
179
+ scrollAction.y = window.scrollY;
180
+ }
181
+ diffY = scrollAction.y - window.scrollY;
182
+ if (diffY < 0) {
183
+ siteNav.removeClass('up');
184
+ siteNav.toggleClass('down', SHOW);
185
+ }
186
+ else if (diffY > 0) {
187
+ siteNav.removeClass('down');
188
+ siteNav.toggleClass('up', SHOW);
189
+ }
190
+ else {
191
+ }
192
+ scrollAction.y = window.scrollY;
193
+ const scrollPercent = Math.round(Math.min(100 * window.scrollY / contentVisibilityHeight, 100)) + '%';
194
+ backToTop.child('span').innerText = scrollPercent;
195
+ $dom('.percent').changeOrGetWidth(scrollPercent);
196
+ };
197
+ const pagePosition = function () {
198
+ if (CONFIG.auto_scroll) {
199
+ $storage.set(LOCAL_URL, String(scrollAction.y));
200
+ }
201
+ };
202
+ const positionInit = function (comment) {
203
+ const anchor = window.location.hash;
204
+ let target = null;
205
+ if (LOCAL_HASH) {
206
+ $storage.del(LOCAL_URL);
207
+ return;
208
+ }
209
+ if (anchor) {
210
+ target = $dom(decodeURI(anchor));
211
+ }
212
+ else {
213
+ target = CONFIG.auto_scroll ? parseInt($storage.get(LOCAL_URL)) : 0;
214
+ }
215
+ if (target) {
216
+ pageScroll(target);
217
+ LOCAL_HASH = 1;
218
+ }
219
+ if (comment && anchor && !LOCAL_HASH) {
220
+ pageScroll(target);
221
+ LOCAL_HASH = 1;
222
+ }
223
+ };
224
+ const clipBoard = function (str, callback) {
225
+ if (navigator.clipboard && window.isSecureContext) {
226
+ navigator.clipboard.writeText(str).then(() => {
227
+ callback && callback(true);
228
+ }, () => {
229
+ callback && callback(false);
230
+ });
231
+ }
232
+ else {
233
+ const ta = BODY.createChild('textarea', {
234
+ style: {
235
+ top: window.scrollY + 'px',
236
+ position: 'absolute',
237
+ opacity: '0'
238
+ },
239
+ readOnly: true,
240
+ value: str
241
+ });
242
+ const selection = document.getSelection();
243
+ const selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
244
+ ta.select();
245
+ ta.setSelectionRange(0, str.length);
246
+ ta.readOnly = false;
247
+ const result = document.execCommand('copy');
248
+ callback && callback(result);
249
+ ta.blur();
250
+ if (selected) {
251
+ selection.removeAllRanges();
252
+ selection.addRange(selected);
253
+ }
254
+ BODY.removeChild(ta);
255
+ }
256
+ };
257
+ const isOutime = function () {
258
+ let updateTime;
259
+ if (CONFIG.outime.enable && LOCAL.outime) {
260
+ const times = document.getElementsByTagName('time');
261
+ if (times.length === 0) {
262
+ return;
263
+ }
264
+ const posts = document.getElementsByClassName('body md');
265
+ if (posts.length === 0) {
266
+ return;
267
+ }
268
+ const now = Date.now();
269
+ const pubTime = new Date(times[0].dateTime);
270
+ if (times.length === 1) {
271
+ updateTime = pubTime;
272
+ }
273
+ else {
274
+ updateTime = new Date(times[1].dateTime);
275
+ }
276
+ const interval = parseInt(String(now - updateTime));
277
+ const days = parseInt(String(CONFIG.outime.days)) || 30;
278
+ if (interval > (days * 86400000)) {
279
+ const publish = parseInt(String((now - pubTime) / 86400000));
280
+ const updated = parseInt(String(interval / 86400000));
281
+ const template = LOCAL.template.replace('{{publish}}', String(publish)).replace('{{updated}}', String(updated));
282
+ posts[0].insertAdjacentHTML('afterbegin', template);
283
+ }
284
+ }
285
+ };
286
+ const clickMenu = function () {
287
+ const menuElement = $dom('#clickMenu');
288
+ window.oncontextmenu = function (event) {
289
+ if (event.ctrlKey) {
290
+ return;
291
+ }
292
+ event.preventDefault();
293
+ let x = event.offsetX;
294
+ let y = event.offsetY;
295
+ let winWidth = window.innerWidth;
296
+ let winHeight = window.innerHeight;
297
+ let menuWidth = menuElement.offsetWidth;
298
+ let menuHeight = menuElement.offsetHeight;
299
+ x = winWidth - menuWidth >= x ? x : winWidth - menuWidth;
300
+ y = winHeight - menuHeight >= y ? y : winHeight - menuHeight;
301
+ menuElement.style.top = y + 'px';
302
+ menuElement.style.left = x + 'px';
303
+ menuElement.classList.add('active');
304
+ $dom.each(".clickSubmenu", (submenu) => {
305
+ if (x > (winWidth - menuWidth - submenu.offsetWidth)) {
306
+ submenu.style.left = '-200px';
307
+ }
308
+ else {
309
+ submenu.style.left = '';
310
+ submenu.style.right = '-200px';
311
+ }
312
+ });
313
+ };
314
+ window.addEventListener('click', function () {
315
+ menuElement.classList.remove('active');
316
+ });
317
+ };