hexo-theme-lnote 1.2.4 → 1.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. package/README.md +122 -122
  2. package/_config.yml +19 -19
  3. package/config/links.yml +63 -63
  4. package/config/svg.yml +33 -33
  5. package/index.d.ts +4 -0
  6. package/languages/de.yml +69 -69
  7. package/languages/en.yml +73 -69
  8. package/languages/eo.yml +69 -69
  9. package/languages/es.yml +69 -69
  10. package/languages/ja.yml +69 -69
  11. package/languages/ru.yml +69 -69
  12. package/languages/zh-CN.yml +73 -69
  13. package/languages/zh-HK.yml +73 -69
  14. package/languages/zh-TW.yml +73 -69
  15. package/layout/404.ejs +8 -8
  16. package/layout/_partials/archive-list.ejs +17 -17
  17. package/layout/_partials/category-chains.ejs +19 -19
  18. package/layout/_partials/category-list.ejs +62 -62
  19. package/layout/_partials/comments/changyan.ejs +11 -11
  20. package/layout/_partials/comments/cusdis.ejs +25 -25
  21. package/layout/_partials/comments/discuss.ejs +17 -17
  22. package/layout/_partials/comments/disqus.ejs +32 -32
  23. package/layout/_partials/comments/giscus.ejs +36 -36
  24. package/layout/_partials/comments/gitalk.ejs +19 -19
  25. package/layout/_partials/comments/livere.ejs +10 -10
  26. package/layout/_partials/comments/remark42.ejs +29 -29
  27. package/layout/_partials/comments/twikoo.ejs +25 -25
  28. package/layout/_partials/comments/utterances.ejs +27 -27
  29. package/layout/_partials/comments/valine.ejs +23 -23
  30. package/layout/_partials/comments/waline.ejs +24 -24
  31. package/layout/_partials/comments.ejs +8 -8
  32. package/layout/_partials/css.ejs +9 -9
  33. package/layout/_partials/footer/beian.ejs +33 -33
  34. package/layout/_partials/footer/statistics.ejs +39 -39
  35. package/layout/_partials/footer.ejs +7 -7
  36. package/layout/_partials/head.ejs +46 -46
  37. package/layout/_partials/header/banner.ejs +24 -24
  38. package/layout/_partials/header/navigation.ejs +56 -56
  39. package/layout/_partials/header.ejs +4 -4
  40. package/layout/_partials/markdown-plugins.ejs +24 -24
  41. package/layout/_partials/paginator.ejs +14 -14
  42. package/layout/_partials/plugins/CSR.ejs +4 -0
  43. package/layout/_partials/plugins/analytics.ejs +75 -75
  44. package/layout/_partials/plugins/anchorjs.ejs +39 -39
  45. package/layout/_partials/plugins/code-widget.ejs +7 -7
  46. package/layout/_partials/plugins/encrypt.ejs +18 -18
  47. package/layout/_partials/plugins/fancybox.ejs +11 -11
  48. package/layout/_partials/plugins/highlight.ejs +13 -13
  49. package/layout/_partials/plugins/math.ejs +51 -51
  50. package/layout/_partials/plugins/mermaid.ejs +4 -4
  51. package/layout/_partials/plugins/nprogress.ejs +7 -7
  52. package/layout/_partials/plugins/typed.ejs +20 -20
  53. package/layout/_partials/post/category-bar.ejs +18 -18
  54. package/layout/_partials/post/copyright.ejs +50 -50
  55. package/layout/_partials/post/css.ejs +3 -3
  56. package/layout/_partials/post/meta-bottom.ejs +16 -16
  57. package/layout/_partials/post/meta-top.ejs +27 -27
  58. package/layout/_partials/post/scripts.ejs +8 -7
  59. package/layout/_partials/post/sidebar-left.ejs +1 -1
  60. package/layout/_partials/post/sidebar-right.ejs +2 -2
  61. package/layout/_partials/post/toc.ejs +6 -6
  62. package/layout/_partials/scripts.ejs +10 -10
  63. package/layout/_partials/search.ejs +19 -19
  64. package/layout/about.ejs +22 -22
  65. package/layout/archive.ejs +10 -10
  66. package/layout/categories.ejs +20 -20
  67. package/layout/category.ejs +12 -12
  68. package/layout/index.ejs +61 -61
  69. package/layout/layout.ejs +60 -60
  70. package/layout/links.ejs +31 -31
  71. package/layout/page.ejs +15 -15
  72. package/layout/post.ejs +77 -77
  73. package/layout/tag.ejs +12 -12
  74. package/layout/tags.ejs +26 -26
  75. package/package.json +74 -70
  76. package/scripts/index.js +1 -1
  77. package/source/css/_functions/base.styl +8 -8
  78. package/source/css/_mixins/base.styl +23 -23
  79. package/source/css/_pages/_about/about.styl +32 -32
  80. package/source/css/_pages/_archive/archive.styl +32 -32
  81. package/source/css/_pages/_base/_widget/anchorjs.styl +8 -8
  82. package/source/css/_pages/_base/_widget/banner.styl +29 -29
  83. package/source/css/_pages/_base/_widget/board.styl +11 -11
  84. package/source/css/_pages/_base/_widget/code-widget.styl +37 -36
  85. package/source/css/_pages/_base/_widget/copyright.styl +91 -90
  86. package/source/css/_pages/_base/_widget/footer.styl +65 -65
  87. package/source/css/_pages/_base/_widget/footnote.styl +26 -25
  88. package/source/css/_pages/_base/_widget/header.styl +173 -173
  89. package/source/css/_pages/_base/_widget/modal.styl +100 -100
  90. package/source/css/_pages/_base/_widget/navlink.styl +15 -15
  91. package/source/css/_pages/_base/_widget/ngrogress.styl +12 -12
  92. package/source/css/_pages/_base/_widget/noscript.styl +13 -12
  93. package/source/css/_pages/_base/_widget/pagination.styl +23 -23
  94. package/source/css/_pages/_base/_widget/qrcode.styl +17 -17
  95. package/source/css/_pages/_base/_widget/scroll-btn.styl +48 -48
  96. package/source/css/_pages/_base/_widget/text.styl +20 -19
  97. package/source/css/_pages/_base/_widget/toc.styl +75 -75
  98. package/source/css/_pages/_base/base.styl +67 -68
  99. package/source/css/_pages/_base/color-schema.styl +79 -75
  100. package/source/css/_pages/_base/inline.styl +51 -51
  101. package/source/css/_pages/_base/keyframes.styl +31 -31
  102. package/source/css/_pages/_base/print.styl +39 -38
  103. package/source/css/_pages/_category/category-bar.styl +58 -58
  104. package/source/css/_pages/_category/category-chain.styl +6 -6
  105. package/source/css/_pages/_category/category-list.styl +62 -62
  106. package/source/css/_pages/_index/index.styl +75 -75
  107. package/source/css/_pages/_links/links.styl +80 -79
  108. package/source/css/_pages/_post/comment.styl +28 -27
  109. package/source/css/_pages/_post/highlight.styl +76 -75
  110. package/source/css/_pages/_post/markdown.styl +96 -96
  111. package/source/css/_pages/_post/post-page.styl +179 -179
  112. package/source/css/_pages/_post/post-plugin.styl +10 -0
  113. package/source/css/_pages/_post/post-tag.styl +75 -29
  114. package/source/css/_pages/_tag/tags.styl +9 -9
  115. package/source/css/_pages/pages.styl +8 -8
  116. package/source/css/_variables/base.styl +72 -72
  117. package/source/css/gitalk.css +546 -546
  118. package/source/css/main.styl +19 -19
  119. package/source/img/chat/responder.jpg +0 -0
  120. package/source/img/chat/sender.jpg +0 -0
  121. package/source/img/default8.jpg +0 -0
  122. package/source/js/color-schema.js +279 -279
  123. package/source/js/events.js +72 -72
  124. package/source/js/img-lazyload.js +10 -10
  125. package/source/js/local-search.js +70 -70
  126. package/source/js/post/copying-code.js +34 -34
  127. package/source/js/post/enable.js +6 -6
  128. package/source/js/post/img-swipe-bf.js +47 -47
  129. package/source/js/post/img-swipe.js +84 -35
  130. package/source/js/post/mermaiding.js +9 -9
  131. package/source/js/post/play-imgs.js +58 -58
  132. package/source/js/post/toc.js +24 -24
  133. package/source/js/post/view-imgs.js +27 -27
  134. package/source/js/utils.js +245 -245
  135. package/source/xml/local-search.xml +45 -45
  136. package/templates/Chat.vue +52 -0
  137. package/templates/GroupImage.vue +36 -0
  138. package/templates/MenuNav.vue +39 -0
  139. package/templates/Note.vue +33 -0
  140. package/templates/Noun.vue +25 -0
  141. package/templates/NounContent.vue +29 -0
  142. package/templates/Tab.vue +40 -0
  143. package/templates/footer.ejs +12 -12
  144. package/templates/utils/uri.ts +40 -0
  145. package/source/css/_pages/_tag/tag.styl +0 -9
  146. package/templates/noun.vue +0 -18
@@ -1,245 +1,245 @@
1
- /* global LNote, CONFIG */
2
-
3
- // window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
4
-
5
- LNote.utils = {
6
-
7
- listenScroll: function(callback) {
8
- var dbc = new Debouncer(callback);
9
- window.addEventListener('scroll', dbc, false);
10
- dbc.handleEvent();
11
- return dbc;
12
- },
13
-
14
- unlistenScroll: function(callback) {
15
- window.removeEventListener('scroll', callback);
16
- },
17
-
18
- listenDOMLoaded(callback) {
19
- if (document.readyState !== 'loading') {
20
- callback();
21
- } else {
22
- document.addEventListener('DOMContentLoaded', function () {
23
- callback();
24
- });
25
- }
26
- },
27
-
28
- scrollToElement: function(target, offset) {
29
- var of = jQuery(target).offset();
30
- if (of) {
31
- jQuery('html,body').animate({
32
- scrollTop: of.top + (offset || 0),
33
- easing : 'swing'
34
- });
35
- }
36
- },
37
-
38
- elementVisible: function(element, offsetFactor) {
39
- offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
40
- var rect = element.getBoundingClientRect();
41
- const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
42
- return (
43
- (rect.top >= 0 && rect.top <= viewportHeight * (1 + offsetFactor) + rect.height / 2) ||
44
- (rect.bottom >= 0 && rect.bottom <= viewportHeight * (1 + offsetFactor) + rect.height / 2)
45
- );
46
- },
47
-
48
- waitElementVisible: function(selectorOrElement, callback, offsetFactor) {
49
- var runningOnBrowser = typeof window !== 'undefined';
50
- var isBot = (runningOnBrowser && !('onscroll' in window))
51
- || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
52
- if (!runningOnBrowser || isBot) {
53
- return;
54
- }
55
-
56
- offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
57
-
58
- function waitInViewport(element) {
59
- LNote.utils.listenDOMLoaded(function() {
60
- if (LNote.utils.elementVisible(element, offsetFactor)) {
61
- callback();
62
- return;
63
- }
64
- if ('IntersectionObserver' in window) {
65
- var io = new IntersectionObserver(function(entries, ob) {
66
- if (entries[0].isIntersecting) {
67
- callback();
68
- ob.disconnect();
69
- }
70
- }, {
71
- threshold : [0],
72
- rootMargin: (window.innerHeight || document.documentElement.clientHeight) * offsetFactor + 'px'
73
- });
74
- io.observe(element);
75
- } else {
76
- var wrapper = LNote.utils.listenScroll(function() {
77
- if (LNote.utils.elementVisible(element, offsetFactor)) {
78
- LNote.utils.unlistenScroll(wrapper);
79
- callback();
80
- }
81
- });
82
- }
83
- });
84
- }
85
-
86
- if (typeof selectorOrElement === 'string') {
87
- this.waitElementLoaded(selectorOrElement, function(element) {
88
- waitInViewport(element);
89
- });
90
- } else {
91
- waitInViewport(selectorOrElement);
92
- }
93
- },
94
-
95
- waitElementLoaded: function(selector, callback) {
96
- var runningOnBrowser = typeof window !== 'undefined';
97
- var isBot = (runningOnBrowser && !('onscroll' in window))
98
- || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
99
- if (!runningOnBrowser || isBot) {
100
- return;
101
- }
102
-
103
- if ('MutationObserver' in window) {
104
- var mo = new MutationObserver(function(records, ob) {
105
- var ele = document.querySelector(selector);
106
- if (ele) {
107
- callback(ele);
108
- ob.disconnect();
109
- }
110
- });
111
- mo.observe(document, { childList: true, subtree: true });
112
- } else {
113
- LNote.utils.listenDOMLoaded(function() {
114
- var waitLoop = function() {
115
- var ele = document.querySelector(selector);
116
- if (ele) {
117
- callback(ele);
118
- } else {
119
- setTimeout(waitLoop, 100);
120
- }
121
- };
122
- waitLoop();
123
- });
124
- }
125
- },
126
-
127
- createScript: function(url, onload) {
128
- var s = document.createElement('script');
129
- s.setAttribute('src', url);
130
- s.setAttribute('type', 'text/javascript');
131
- s.setAttribute('charset', 'UTF-8');
132
- s.async = false;
133
- if (typeof onload === 'function') {
134
- if (window.attachEvent) {
135
- s.onreadystatechange = function() {
136
- var e = s.readyState;
137
- if (e === 'loaded' || e === 'complete') {
138
- s.onreadystatechange = null;
139
- onload();
140
- }
141
- };
142
- } else {
143
- s.onload = onload;
144
- }
145
- }
146
- var ss = document.getElementsByTagName('script');
147
- var e = ss.length > 0 ? ss[ss.length - 1] : document.head || document.documentElement;
148
- e.parentNode.insertBefore(s, e.nextSibling);
149
- },
150
-
151
- createCssLink: function(url) {
152
- var l = document.createElement('link');
153
- l.setAttribute('rel', 'stylesheet');
154
- l.setAttribute('type', 'text/css');
155
- l.setAttribute('href', url);
156
- var e = document.getElementsByTagName('link')[0]
157
- || document.getElementsByTagName('head')[0]
158
- || document.head || document.documentElement;
159
- e.parentNode.insertBefore(l, e);
160
- },
161
-
162
- loadComments: function(selector, loadFunc) {
163
- var ele = document.querySelector('#comments[lazyload]');
164
- if (ele) {
165
- var callback = function() {
166
- loadFunc();
167
- ele.removeAttribute('lazyload');
168
- };
169
- LNote.utils.waitElementVisible(selector, callback, 2);
170
- } else {
171
- loadFunc();
172
- }
173
- },
174
-
175
- getBackgroundLightness(selectorOrElement) {
176
- var ele = selectorOrElement;
177
- if (typeof selectorOrElement === 'string') {
178
- ele = document.querySelector(selectorOrElement);
179
- }
180
- var view = ele.ownerDocument.defaultView;
181
- if (!view) {
182
- view = window;
183
- }
184
- var rgbArr = view.getComputedStyle(ele).backgroundColor.replace(/rgba*\(/, '').replace(')', '').split(/,\s*/);
185
- if (rgbArr.length < 3) {
186
- return 0;
187
- }
188
- var colorCast = (0.213 * rgbArr[0]) + (0.715 * rgbArr[1]) + (0.072 * rgbArr[2]);
189
- return colorCast === 0 || colorCast > 255 / 2 ? 1 : -1;
190
- },
191
-
192
- retry(handler, interval, times) {
193
- if (times <= 0) {
194
- return;
195
- }
196
- var next = function() {
197
- if (--times >= 0 && !handler()) {
198
- setTimeout(next, interval);
199
- }
200
- };
201
- setTimeout(next, interval);
202
- }
203
-
204
- };
205
-
206
- /**
207
- * Handles debouncing of events via requestAnimationFrame
208
- * @see http://www.html5rocks.com/en/tutorials/speed/animations/
209
- * @param {Function} callback The callback to handle whichever event
210
- */
211
- function Debouncer(callback) {
212
- this.callback = callback;
213
- this.ticking = false;
214
- }
215
-
216
- Debouncer.prototype = {
217
- constructor: Debouncer,
218
-
219
- /**
220
- * dispatches the event to the supplied callback
221
- * @private
222
- */
223
- update: function() {
224
- this.callback && this.callback();
225
- this.ticking = false;
226
- },
227
-
228
- /**
229
- * ensures events don't get stacked
230
- * @private
231
- */
232
- requestTick: function() {
233
- if (!this.ticking) {
234
- requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
235
- this.ticking = true;
236
- }
237
- },
238
-
239
- /**
240
- * Attach this as the event listeners
241
- */
242
- handleEvent: function() {
243
- this.requestTick();
244
- }
245
- };
1
+ /* global LNote, CONFIG */
2
+
3
+ // window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
4
+
5
+ LNote.utils = {
6
+
7
+ listenScroll: function(callback) {
8
+ var dbc = new Debouncer(callback);
9
+ window.addEventListener('scroll', dbc, false);
10
+ dbc.handleEvent();
11
+ return dbc;
12
+ },
13
+
14
+ unlistenScroll: function(callback) {
15
+ window.removeEventListener('scroll', callback);
16
+ },
17
+
18
+ listenDOMLoaded(callback) {
19
+ if (document.readyState !== 'loading') {
20
+ callback();
21
+ } else {
22
+ document.addEventListener('DOMContentLoaded', function () {
23
+ callback();
24
+ });
25
+ }
26
+ },
27
+
28
+ scrollToElement: function(target, offset) {
29
+ var of = jQuery(target).offset();
30
+ if (of) {
31
+ jQuery('html,body').animate({
32
+ scrollTop: of.top + (offset || 0),
33
+ easing : 'swing'
34
+ });
35
+ }
36
+ },
37
+
38
+ elementVisible: function(element, offsetFactor) {
39
+ offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
40
+ var rect = element.getBoundingClientRect();
41
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
42
+ return (
43
+ (rect.top >= 0 && rect.top <= viewportHeight * (1 + offsetFactor) + rect.height / 2) ||
44
+ (rect.bottom >= 0 && rect.bottom <= viewportHeight * (1 + offsetFactor) + rect.height / 2)
45
+ );
46
+ },
47
+
48
+ waitElementVisible: function(selectorOrElement, callback, offsetFactor) {
49
+ var runningOnBrowser = typeof window !== 'undefined';
50
+ var isBot = (runningOnBrowser && !('onscroll' in window))
51
+ || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
52
+ if (!runningOnBrowser || isBot) {
53
+ return;
54
+ }
55
+
56
+ offsetFactor = offsetFactor && offsetFactor >= 0 ? offsetFactor : 0;
57
+
58
+ function waitInViewport(element) {
59
+ LNote.utils.listenDOMLoaded(function() {
60
+ if (LNote.utils.elementVisible(element, offsetFactor)) {
61
+ callback();
62
+ return;
63
+ }
64
+ if ('IntersectionObserver' in window) {
65
+ var io = new IntersectionObserver(function(entries, ob) {
66
+ if (entries[0].isIntersecting) {
67
+ callback();
68
+ ob.disconnect();
69
+ }
70
+ }, {
71
+ threshold : [0],
72
+ rootMargin: (window.innerHeight || document.documentElement.clientHeight) * offsetFactor + 'px'
73
+ });
74
+ io.observe(element);
75
+ } else {
76
+ var wrapper = LNote.utils.listenScroll(function() {
77
+ if (LNote.utils.elementVisible(element, offsetFactor)) {
78
+ LNote.utils.unlistenScroll(wrapper);
79
+ callback();
80
+ }
81
+ });
82
+ }
83
+ });
84
+ }
85
+
86
+ if (typeof selectorOrElement === 'string') {
87
+ this.waitElementLoaded(selectorOrElement, function(element) {
88
+ waitInViewport(element);
89
+ });
90
+ } else {
91
+ waitInViewport(selectorOrElement);
92
+ }
93
+ },
94
+
95
+ waitElementLoaded: function(selector, callback) {
96
+ var runningOnBrowser = typeof window !== 'undefined';
97
+ var isBot = (runningOnBrowser && !('onscroll' in window))
98
+ || (typeof navigator !== 'undefined' && /(gle|ing|ro|msn)bot|crawl|spider|yand|duckgo/i.test(navigator.userAgent));
99
+ if (!runningOnBrowser || isBot) {
100
+ return;
101
+ }
102
+
103
+ if ('MutationObserver' in window) {
104
+ var mo = new MutationObserver(function(records, ob) {
105
+ var ele = document.querySelector(selector);
106
+ if (ele) {
107
+ callback(ele);
108
+ ob.disconnect();
109
+ }
110
+ });
111
+ mo.observe(document, { childList: true, subtree: true });
112
+ } else {
113
+ LNote.utils.listenDOMLoaded(function() {
114
+ var waitLoop = function() {
115
+ var ele = document.querySelector(selector);
116
+ if (ele) {
117
+ callback(ele);
118
+ } else {
119
+ setTimeout(waitLoop, 100);
120
+ }
121
+ };
122
+ waitLoop();
123
+ });
124
+ }
125
+ },
126
+
127
+ createScript: function(url, onload) {
128
+ var s = document.createElement('script');
129
+ s.setAttribute('src', url);
130
+ s.setAttribute('type', 'text/javascript');
131
+ s.setAttribute('charset', 'UTF-8');
132
+ s.async = false;
133
+ if (typeof onload === 'function') {
134
+ if (window.attachEvent) {
135
+ s.onreadystatechange = function() {
136
+ var e = s.readyState;
137
+ if (e === 'loaded' || e === 'complete') {
138
+ s.onreadystatechange = null;
139
+ onload();
140
+ }
141
+ };
142
+ } else {
143
+ s.onload = onload;
144
+ }
145
+ }
146
+ var ss = document.getElementsByTagName('script');
147
+ var e = ss.length > 0 ? ss[ss.length - 1] : document.head || document.documentElement;
148
+ e.parentNode.insertBefore(s, e.nextSibling);
149
+ },
150
+
151
+ createCssLink: function(url) {
152
+ var l = document.createElement('link');
153
+ l.setAttribute('rel', 'stylesheet');
154
+ l.setAttribute('type', 'text/css');
155
+ l.setAttribute('href', url);
156
+ var e = document.getElementsByTagName('link')[0]
157
+ || document.getElementsByTagName('head')[0]
158
+ || document.head || document.documentElement;
159
+ e.parentNode.insertBefore(l, e);
160
+ },
161
+
162
+ loadComments: function(selector, loadFunc) {
163
+ var ele = document.querySelector('#comments[lazyload]');
164
+ if (ele) {
165
+ var callback = function() {
166
+ loadFunc();
167
+ ele.removeAttribute('lazyload');
168
+ };
169
+ LNote.utils.waitElementVisible(selector, callback, 2);
170
+ } else {
171
+ loadFunc();
172
+ }
173
+ },
174
+
175
+ getBackgroundLightness(selectorOrElement) {
176
+ var ele = selectorOrElement;
177
+ if (typeof selectorOrElement === 'string') {
178
+ ele = document.querySelector(selectorOrElement);
179
+ }
180
+ var view = ele.ownerDocument.defaultView;
181
+ if (!view) {
182
+ view = window;
183
+ }
184
+ var rgbArr = view.getComputedStyle(ele).backgroundColor.replace(/rgba*\(/, '').replace(')', '').split(/,\s*/);
185
+ if (rgbArr.length < 3) {
186
+ return 0;
187
+ }
188
+ var colorCast = (0.213 * rgbArr[0]) + (0.715 * rgbArr[1]) + (0.072 * rgbArr[2]);
189
+ return colorCast === 0 || colorCast > 255 / 2 ? 1 : -1;
190
+ },
191
+
192
+ retry(handler, interval, times) {
193
+ if (times <= 0) {
194
+ return;
195
+ }
196
+ var next = function() {
197
+ if (--times >= 0 && !handler()) {
198
+ setTimeout(next, interval);
199
+ }
200
+ };
201
+ setTimeout(next, interval);
202
+ }
203
+
204
+ };
205
+
206
+ /**
207
+ * Handles debouncing of events via requestAnimationFrame
208
+ * @see http://www.html5rocks.com/en/tutorials/speed/animations/
209
+ * @param {Function} callback The callback to handle whichever event
210
+ */
211
+ function Debouncer(callback) {
212
+ this.callback = callback;
213
+ this.ticking = false;
214
+ }
215
+
216
+ Debouncer.prototype = {
217
+ constructor: Debouncer,
218
+
219
+ /**
220
+ * dispatches the event to the supplied callback
221
+ * @private
222
+ */
223
+ update: function() {
224
+ this.callback && this.callback();
225
+ this.ticking = false;
226
+ },
227
+
228
+ /**
229
+ * ensures events don't get stacked
230
+ * @private
231
+ */
232
+ requestTick: function() {
233
+ if (!this.ticking) {
234
+ requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
235
+ this.ticking = true;
236
+ }
237
+ },
238
+
239
+ /**
240
+ * Attach this as the event listeners
241
+ */
242
+ handleEvent: function() {
243
+ this.requestTick();
244
+ }
245
+ };
@@ -1,45 +1,45 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <search>
3
- {% if posts %}
4
- {% for post in posts.toArray() %}
5
- {% if post.indexing == undefined or post.indexing %}
6
- <entry>
7
- <title>{{ post.title }}</title>
8
- <link href="{{ [url, post.path] | urlJoin | uriencode }}"/>
9
- <url>{{ [url, post.path] | urlJoin | uriencode }}</url>
10
- {% if content %}
11
- <content type="html"><![CDATA[{{ post.content | noControlChars | safe }}]]></content>
12
- {% endif %}
13
- {% if post.categories and post.categories.length>0 %}
14
- <categories>
15
- {% for cate in post.categories.toArray() %}
16
- <category>{{ cate.name }}</category>
17
- {% endfor %}
18
- </categories>
19
- {% endif %}
20
- {% if post.tags and post.tags.length>0 %}
21
- <tags>
22
- {% for tag in post.tags.toArray() %}
23
- <tag>{{ tag.name }}</tag>
24
- {% endfor %}
25
- </tags>
26
- {% endif %}
27
- </entry>
28
- {% endif %}
29
- {% endfor %}
30
- {% endif %}
31
- {% if pages %}
32
- {% for page in pages.toArray() %}
33
- {% if post.indexing == undefined or post.indexing %}
34
- <entry>
35
- <title>{{ page.title }}</title>
36
- <link href="{{ [url, post.path] | urlJoin | uriencode }}"/>
37
- <url>{{ [url, post.path] | urlJoin | uriencode }}</url>
38
- {% if content %}
39
- <content type="html"><![CDATA[{{ page.content | noControlChars | safe }}]]></content>
40
- {% endif %}
41
- </entry>
42
- {% endif %}
43
- {% endfor %}
44
- {% endif %}
45
- </search>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <search>
3
+ {% if posts %}
4
+ {% for post in posts.toArray() %}
5
+ {% if post.indexing == undefined or post.indexing %}
6
+ <entry>
7
+ <title>{{ post.title }}</title>
8
+ <link href="{{ [url, post.path] | urlJoin | uriencode }}"/>
9
+ <url>{{ [url, post.path] | urlJoin | uriencode }}</url>
10
+ {% if content %}
11
+ <content type="html"><![CDATA[{{ post.content | noControlChars | safe }}]]></content>
12
+ {% endif %}
13
+ {% if post.categories and post.categories.length>0 %}
14
+ <categories>
15
+ {% for cate in post.categories.toArray() %}
16
+ <category>{{ cate.name }}</category>
17
+ {% endfor %}
18
+ </categories>
19
+ {% endif %}
20
+ {% if post.tags and post.tags.length>0 %}
21
+ <tags>
22
+ {% for tag in post.tags.toArray() %}
23
+ <tag>{{ tag.name }}</tag>
24
+ {% endfor %}
25
+ </tags>
26
+ {% endif %}
27
+ </entry>
28
+ {% endif %}
29
+ {% endfor %}
30
+ {% endif %}
31
+ {% if pages %}
32
+ {% for page in pages.toArray() %}
33
+ {% if post.indexing == undefined or post.indexing %}
34
+ <entry>
35
+ <title>{{ page.title }}</title>
36
+ <link href="{{ [url, post.path] | urlJoin | uriencode }}"/>
37
+ <url>{{ [url, post.path] | urlJoin | uriencode }}</url>
38
+ {% if content %}
39
+ <content type="html"><![CDATA[{{ page.content | noControlChars | safe }}]]></content>
40
+ {% endif %}
41
+ </entry>
42
+ {% endif %}
43
+ {% endfor %}
44
+ {% endif %}
45
+ </search>
@@ -0,0 +1,52 @@
1
+ <template>
2
+ <article class="chats">
3
+ <template v-for="item in chats">
4
+ <section
5
+ v-if="item.role === 'sender'"
6
+ class="chat-sender py-3 d-flex align-items-start justify-content-start"
7
+ >
8
+ <img
9
+ class="chat-avatar rounded"
10
+ :src="uriFor(['/img/chat/sender.jpg'])"
11
+ />
12
+ <div
13
+ class="chat-part overflow-hidden ms-3 flex-fill d-flex flex-column align-items-start"
14
+ >
15
+ <div class="chat-name mb-2 overflow-hidden">
16
+ {{ item.name }}
17
+ </div>
18
+ <div
19
+ class="chat-content rounded bg-secondary-subtle px-3 py-2"
20
+ v-html="item.content"
21
+ ></div>
22
+ </div>
23
+ </section>
24
+ <section
25
+ v-else
26
+ class="chat-responder py-3 flex-row-reverse d-flex align-items-start justify-content-start"
27
+ >
28
+ <img
29
+ class="chat-avatar rounded"
30
+ :src="uriFor(['/img/chat/responder.jpg'])"
31
+ />
32
+ <div
33
+ class="chat-part overflow-hidden me-3 flex-fill d-flex flex-column align-items-end"
34
+ >
35
+ <div class="chat-name mb-2 overflow-hidden">
36
+ {{ item.name }}
37
+ </div>
38
+ <div
39
+ class="chat-content rounded bg-primary-subtle px-3 py-2"
40
+ v-html="item.content"
41
+ ></div>
42
+ </div>
43
+ </section>
44
+ </template>
45
+ </article>
46
+ </template>
47
+
48
+ <script lang="ts" setup>
49
+ import { uriFor } from './utils/uri'
50
+ import type { Chat } from '../types/tag'
51
+ const chats: Chat[] = []
52
+ </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div v-if="rowCol === 1" class="group-image-container">
3
+ <img
4
+ class="img-fluid object-fit-cover w-100 img-swipe-single"
5
+ :alt="list[0].title"
6
+ :src="uriFor([list[0].url])"
7
+ />
8
+ </div>
9
+ <div v-else class="group-image-container img-swipe-group">
10
+ <div :class="['row', `row-cols-${rowCol}`, 'gx-2', 'gy-2']">
11
+ <div class="col" v-for="item in list">
12
+ <img
13
+ v-if="isSameSize"
14
+ class="img-fluid object-fit-cover"
15
+ :alt="item.title"
16
+ :src="uriFor([item.url])"
17
+ />
18
+ <div class="image-adapter" v-else>
19
+ <div>
20
+ <img
21
+ class="img-fluid object-fit-cover"
22
+ :alt="item.title"
23
+ :src="uriFor([item.url])"
24
+ />
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+ <script lang="ts" setup>
32
+ import { uriFor } from './utils/uri'
33
+ const rowCol: number = 1
34
+ const isSameSize: boolean = false
35
+ const list: { title: string; url: string }[] = []
36
+ </script>