hexo-theme-lnote 1.2.5 → 1.2.7

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 (145) hide show
  1. package/README.md +36 -123
  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 +3 -3
  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 -4
  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 -8
  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 +73 -73
  76. package/scripts/index.js +1 -0
  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 +36 -36
  85. package/source/css/_pages/_base/_widget/copyright.styl +90 -90
  86. package/source/css/_pages/_base/_widget/footer.styl +65 -65
  87. package/source/css/_pages/_base/_widget/footnote.styl +25 -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 +12 -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 +19 -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 +38 -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 +79 -79
  108. package/source/css/_pages/_post/comment.styl +27 -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 +9 -9
  113. package/source/css/_pages/_post/post-tag.styl +75 -43
  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 +83 -80
  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 +39 -11
  145. package/templates/noun.vue +0 -15
@@ -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>