hexo-theme-shokax 0.5.2 → 0.5.3

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 (161) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/CODE_OF_CONDUCT.md +128 -128
  3. package/LICENSE +660 -660
  4. package/LICENSE-shoka +21 -21
  5. package/README.md +74 -74
  6. package/UsageRestrictions.md +25 -25
  7. package/_config.yml +359 -352
  8. package/languages/README.md +19 -19
  9. package/languages/default.yml +1 -1
  10. package/languages/en.yml +155 -155
  11. package/languages/ja.yml +155 -155
  12. package/languages/zh-CN.yml +155 -155
  13. package/languages/zh-HK.yml +155 -155
  14. package/languages/zh-TW.yml +155 -155
  15. package/layout/_alternate/atom.ejs +30 -30
  16. package/layout/_alternate/json.ejs +16 -16
  17. package/layout/_alternate/rss.ejs +34 -34
  18. package/layout/_mixin/breadcrumb.pug +33 -33
  19. package/layout/_mixin/card.pug +37 -37
  20. package/layout/_mixin/comment.pug +6 -6
  21. package/layout/_mixin/postmeta.pug +29 -29
  22. package/layout/_mixin/segment.pug +35 -35
  23. package/layout/_mixin/sidebar.pug +40 -40
  24. package/layout/_mixin/widgets.pug +28 -28
  25. package/layout/_partials/footer.pug +43 -43
  26. package/layout/_partials/head/head.pug +50 -50
  27. package/layout/_partials/head/head_com.pug +24 -24
  28. package/layout/_partials/head/pwa.pug +18 -18
  29. package/layout/_partials/header.pug +18 -18
  30. package/layout/_partials/layout.pug +138 -137
  31. package/layout/_partials/loading.pug +13 -13
  32. package/layout/_partials/pagination.pug +4 -4
  33. package/layout/_partials/post/copyright.pug +20 -20
  34. package/layout/_partials/post/footer.pug +20 -20
  35. package/layout/_partials/post/nav.pug +17 -17
  36. package/layout/_partials/post/post.pug +42 -42
  37. package/layout/_partials/post/reward.pug +18 -18
  38. package/layout/_partials/sidebar/menu.pug +37 -37
  39. package/layout/_partials/sidebar/overview.pug +42 -42
  40. package/layout/_partials/third-party/baidu-analytics.pug +11 -11
  41. package/layout/_partials/third-party/clarity.pug +8 -8
  42. package/layout/_partials/third-party/google-analytics.pug +9 -9
  43. package/layout/archive.pug +121 -121
  44. package/layout/category.pug +62 -62
  45. package/layout/index.pug +36 -36
  46. package/layout/page.pug +60 -60
  47. package/layout/post.pug +42 -42
  48. package/layout/tag.pug +46 -46
  49. package/package.json +6 -5
  50. package/scripts/generaters/script.js +2 -1
  51. package/scripts/plugin/check.js +2 -2
  52. package/source/assets/algolia_logo.svg +9 -9
  53. package/source/assets/logo.svg +16 -16
  54. package/source/css/_colors.styl +207 -207
  55. package/source/css/_common/components/components.styl +5 -5
  56. package/source/css/_common/components/pages/collapse.styl +119 -119
  57. package/source/css/_common/components/pages/home.styl +391 -391
  58. package/source/css/_common/components/pages/pages.styl +56 -56
  59. package/source/css/_common/components/pages/tag-cloud.styl +12 -12
  60. package/source/css/_common/components/post/breadcrumb.styl +39 -39
  61. package/source/css/_common/components/post/copyright.styl +41 -41
  62. package/source/css/_common/components/post/expand.styl +263 -263
  63. package/source/css/_common/components/post/footer.styl +11 -11
  64. package/source/css/_common/components/post/header.styl +79 -79
  65. package/source/css/_common/components/post/nav.styl +64 -64
  66. package/source/css/_common/components/post/post.styl +29 -29
  67. package/source/css/_common/components/post/reward.styl +50 -50
  68. package/source/css/_common/components/post/rtl.styl +12 -12
  69. package/source/css/_common/components/post/tags.styl +39 -39
  70. package/source/css/_common/components/tags/collapse.styl +72 -72
  71. package/source/css/_common/components/tags/container.styl +49 -49
  72. package/source/css/_common/components/tags/label.styl +12 -12
  73. package/source/css/_common/components/tags/links.styl +77 -77
  74. package/source/css/_common/components/tags/list.styl +131 -131
  75. package/source/css/_common/components/tags/note.styl +70 -70
  76. package/source/css/_common/components/tags/player.styl +361 -361
  77. package/source/css/_common/components/tags/quiz.styl +200 -200
  78. package/source/css/_common/components/tags/tabs.styl +89 -89
  79. package/source/css/_common/components/tags/tags.styl +9 -9
  80. package/source/css/_common/components/third-party/loading.styl +222 -222
  81. package/source/css/_common/components/third-party/mermaid/class.styl +90 -90
  82. package/source/css/_common/components/third-party/mermaid/flowchart.styl +72 -72
  83. package/source/css/_common/components/third-party/mermaid/gantt.styl +251 -251
  84. package/source/css/_common/components/third-party/mermaid/git.styl +7 -7
  85. package/source/css/_common/components/third-party/mermaid/mermaid.styl +37 -37
  86. package/source/css/_common/components/third-party/mermaid/pie.styl +9 -9
  87. package/source/css/_common/components/third-party/mermaid/sequence.styl +95 -95
  88. package/source/css/_common/components/third-party/mermaid/state.styl +130 -130
  89. package/source/css/_common/components/third-party/pace.styl +18 -18
  90. package/source/css/_common/components/third-party/search.styl +167 -167
  91. package/source/css/_common/components/third-party/theme.styl +151 -151
  92. package/source/css/_common/components/third-party/third-party.styl +22 -22
  93. package/source/css/_common/components/third-party/widgets.styl +57 -57
  94. package/source/css/_common/outline/footer/footer.styl +67 -67
  95. package/source/css/_common/outline/header/brand.styl +77 -77
  96. package/source/css/_common/outline/header/header.styl +20 -20
  97. package/source/css/_common/outline/header/image.styl +85 -85
  98. package/source/css/_common/outline/header/menu.styl +117 -117
  99. package/source/css/_common/outline/header/nav.styl +81 -81
  100. package/source/css/_common/outline/header/right.styl +15 -15
  101. package/source/css/_common/outline/header/tool.styl +207 -207
  102. package/source/css/_common/outline/header/waves.styl +57 -57
  103. package/source/css/_common/outline/mobile.styl +46 -46
  104. package/source/css/_common/outline/outline.styl +78 -78
  105. package/source/css/_common/outline/sidebar/author.styl +59 -59
  106. package/source/css/_common/outline/sidebar/dimmer.styl +23 -23
  107. package/source/css/_common/outline/sidebar/menu.styl +63 -63
  108. package/source/css/_common/outline/sidebar/quick.styl +43 -43
  109. package/source/css/_common/outline/sidebar/related.styl +56 -56
  110. package/source/css/_common/outline/sidebar/sidebar.styl +82 -82
  111. package/source/css/_common/outline/sidebar/social.styl +69 -69
  112. package/source/css/_common/outline/sidebar/state.styl +37 -37
  113. package/source/css/_common/outline/sidebar/tab.styl +71 -71
  114. package/source/css/_common/outline/sidebar/toc.styl +47 -47
  115. package/source/css/_common/scaffolding/animate.styl +322 -322
  116. package/source/css/_common/scaffolding/base.styl +192 -192
  117. package/source/css/_common/scaffolding/buttons.styl +48 -48
  118. package/source/css/_common/scaffolding/divider.styl +36 -36
  119. package/source/css/_common/scaffolding/iconfont.styl +443 -443
  120. package/source/css/_common/scaffolding/normalize.styl +273 -273
  121. package/source/css/_common/scaffolding/pagination.styl +81 -81
  122. package/source/css/_common/scaffolding/ribbon.styl +38 -38
  123. package/source/css/_common/scaffolding/scaffolding.styl +14 -14
  124. package/source/css/_common/scaffolding/scrollbar.styl +37 -37
  125. package/source/css/_common/scaffolding/tables.styl +50 -50
  126. package/source/css/_common/scaffolding/tip.styl +19 -19
  127. package/source/css/_common/scaffolding/toggles.styl +59 -59
  128. package/source/css/_iconfont.styl +455 -455
  129. package/source/css/_mixins.styl +148 -148
  130. package/source/css/_variables.styl +89 -89
  131. package/source/css/app.styl +25 -25
  132. package/source/css/mermaid.styl +5 -5
  133. package/source/css/page.styl +2 -2
  134. package/source/css/post.styl +4 -5
  135. package/source/css/scaffolding.styl +4 -4
  136. package/source/js/_app/components/cloudflare.ts +18 -18
  137. package/source/js/_app/components/comments.ts +88 -88
  138. package/source/js/_app/components/sidebar.ts +243 -243
  139. package/source/js/_app/components/tcomments.ts +53 -53
  140. package/source/js/_app/globals/globalVars.ts +84 -84
  141. package/source/js/_app/globals/handles.ts +124 -124
  142. package/source/js/_app/globals/themeColor.ts +62 -62
  143. package/source/js/_app/globals/thirdparty.ts +63 -63
  144. package/source/js/_app/globals/tools.ts +73 -73
  145. package/source/js/_app/library/anime.ts +121 -121
  146. package/source/js/_app/library/declare.d.ts +129 -128
  147. package/source/js/_app/library/proto.ts +70 -70
  148. package/source/js/_app/library/vue.ts +49 -49
  149. package/source/js/_app/page/common.ts +41 -41
  150. package/source/js/_app/page/imageviewer.ts +15 -15
  151. package/source/js/_app/page/post.ts +251 -252
  152. package/source/js/_app/page/search.ts +109 -109
  153. package/source/js/_app/page/tab.ts +59 -59
  154. package/source/js/_app/pjax/domInit.ts +102 -102
  155. package/source/js/_app/pjax/refresh.ts +117 -117
  156. package/source/js/_app/pjax/siteInit.ts +93 -90
  157. package/source/js/_app/player.ts +13 -13
  158. package/toolbox/compiler.mjs +49 -49
  159. package/toolbox/dev-version.mjs +14 -14
  160. package/toolbox/hoistdep.mjs +5 -5
  161. package/toolbox/lib.mjs +63 -63
@@ -1,252 +1,251 @@
1
- import { postImageViewer } from './imageviewer'
2
- import { clipBoard, showtip } from '../globals/tools'
3
- import { CONFIG, BODY } from '../globals/globalVars'
4
- import { pageScroll, transition } from '../library/anime'
5
- import { getDisplay, setDisplay, wrapObject } from '../library/proto'
6
- import { initializeCodeBlock } from 'shokax-components-lib/components/codeblock/init'
7
-
8
- export const postBeauty = async () => {
9
- if (!document.querySelector('.md')) { return }
10
-
11
- postImageViewer('.post.block');
12
-
13
- (document.querySelector('.post.block') as HTMLTextAreaElement).oncopy = (event) => {
14
- showtip(LOCAL.copyright)
15
-
16
- if (LOCAL.nocopy) {
17
- event.preventDefault()
18
- return
19
- }
20
-
21
- const copyright = document.getElementById('copyright')
22
- if (window.getSelection().toString().length > CONFIG.experiments.copyrightLength && copyright) {
23
- event.preventDefault()
24
- const author = '# ' + (copyright.querySelector('.author') as HTMLElement).innerText
25
- const link = '# ' + (copyright.querySelector('.link') as HTMLElement).innerText
26
- const license = '# ' + (copyright.querySelector('.license') as HTMLElement).innerText
27
- const htmlData = author + '<br>' + link + '<br>' + license + '<br><br>' + window.getSelection().toString().replace(/\r\n/g, '<br>')
28
-
29
- const textData = author + '\n' + link + '\n' + license + '\n\n' + window.getSelection().toString().replace(/\r\n/g, '\n')
30
- if (event.clipboardData) {
31
- event.clipboardData.setData('text/html', htmlData)
32
- event.clipboardData.setData('text/plain', textData)
33
- } else {
34
- throw new Error('Clipboard API not supported')
35
- }
36
- }
37
- }
38
-
39
- document.querySelectorAll('li ruby').forEach((element) => {
40
- let parent = element.parentNode as HTMLElement
41
- // @ts-ignore
42
- if (element.parentNode.tagName !== 'LI') {
43
- parent = element.parentNode.parentNode as HTMLElement
44
- }
45
- parent.classList.add('ruby')
46
- })
47
-
48
- document.querySelectorAll('ol[start]').forEach((element) => {
49
- // @ts-ignore
50
- element.style.counterReset = 'counter ' + parseInt(element.getAttribute('start') - 1)
51
- })
52
-
53
- document.querySelectorAll<HTMLElement>('.md table').forEach((element) => {
54
- wrapObject(element, {
55
- className: 'table-container'
56
- })
57
- })
58
-
59
- document.querySelectorAll('.highlight > .table-container').forEach((element) => {
60
- element.className = 'code-container'
61
- })
62
-
63
- document.querySelectorAll<HTMLElement>('figure.highlight').forEach((element) => {
64
- const code_container = element.querySelector('.code-container') as HTMLElement
65
- const caption = element.querySelector('figcaption')
66
-
67
- element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="ic i-align-left"></i></span><span class="copy-btn"><i class="ic i-clipboard"></i></span><span class="fullscreen-btn"><i class="ic i-expand"></i></span></div>')
68
-
69
- const copyBtn = element.querySelector('.copy-btn')
70
- if (LOCAL.nocopy) {
71
- copyBtn.remove()
72
- } else {
73
- copyBtn.addEventListener('click', (event) => {
74
- const target = <HTMLElement>event.currentTarget
75
- let comma = ''; let code = ''
76
- code_container.querySelectorAll('pre').forEach((line) => {
77
- code += comma + line.innerText
78
- comma = '\n'
79
- })
80
-
81
- clipBoard(code, (result) => {
82
- target.querySelector('.ic').className = result ? 'ic i-check' : 'ic i-times'
83
- target.blur()
84
- showtip(LOCAL.copyright)
85
- })
86
- }, { passive: true })
87
- copyBtn.addEventListener('mouseleave', (event) => {
88
- setTimeout(() => {
89
- (event.target as HTMLElement).querySelector('.ic').className = 'ic i-clipboard'
90
- }, 1000)
91
- })
92
- }
93
-
94
- const breakBtn = element.querySelector('.breakline-btn')
95
- breakBtn.addEventListener('click', (event) => {
96
- const target = event.currentTarget as HTMLElement
97
- if (element.classList.contains('breakline')) {
98
- element.classList.remove('breakline')
99
- target.querySelector('.ic').className = 'ic i-align-left'
100
- } else {
101
- element.classList.add('breakline')
102
- target.querySelector('.ic').className = 'ic i-align-justify'
103
- }
104
- })
105
-
106
- const fullscreenBtn = element.querySelector('.fullscreen-btn')
107
- const removeFullscreen = () => {
108
- element.classList.remove('fullscreen')
109
- element.scrollTop = 0
110
- BODY.classList.remove('fullscreen')
111
- fullscreenBtn.querySelector('.ic').className = 'ic i-expand'
112
- }
113
- const fullscreenHandle = () => {
114
- if (element.classList.contains('fullscreen')) {
115
- removeFullscreen()
116
- if (code_container && code_container.querySelectorAll('tr').length > 15) {
117
- const showBtn = code_container.querySelector('.show-btn')
118
- code_container.style.maxHeight = '300px'
119
- showBtn.classList.remove('open')
120
- }
121
- pageScroll(element)
122
- } else {
123
- element.classList.add('fullscreen')
124
- BODY.classList.add('fullscreen')
125
- fullscreenBtn.querySelector('.ic').className = 'ic i-compress'
126
- if (code_container && code_container.querySelectorAll('tr').length > 15) {
127
- const showBtn = code_container.querySelector('.show-btn')
128
- code_container.style.maxHeight = ''
129
- showBtn.classList.add('open')
130
- }
131
- }
132
- }
133
- fullscreenBtn.addEventListener('click', fullscreenHandle)
134
- caption && caption.addEventListener('click', fullscreenHandle)
135
-
136
- if (code_container && code_container.querySelectorAll('tr').length > 15) {
137
- code_container.style.maxHeight = '300px'
138
- code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="ic i-angle-down"></i></div>')
139
- const showBtn = code_container.querySelector('.show-btn')
140
-
141
- const hideCode = () => {
142
- code_container.style.maxHeight = '300px'
143
- showBtn.classList.remove('open')
144
- }
145
- const showCode = () => {
146
- code_container.style.maxHeight = ''
147
- showBtn.classList.add('open')
148
- }
149
-
150
- showBtn.addEventListener('click', () => {
151
- if (showBtn.classList.contains('open')) {
152
- removeFullscreen()
153
- hideCode()
154
- pageScroll(code_container)
155
- } else {
156
- showCode()
157
- }
158
- })
159
- }
160
- })
161
-
162
- document.querySelectorAll('pre.mermaid > svg').forEach((element) => {
163
- const temp = <SVGAElement><unknown>element
164
- temp.style.maxWidth = ''
165
- })
166
-
167
- document.querySelectorAll('.reward button').forEach((element) => {
168
- element.addEventListener('click', (event) => {
169
- event.preventDefault()
170
- const qr = document.getElementById('qr')
171
- if (getDisplay(qr) === 'inline-flex') {
172
- transition(qr, 0)
173
- } else {
174
- transition(qr, 1, () => {
175
- setDisplay(qr, 'inline-flex')
176
- }) // slideUpBigIn
177
- }
178
- })
179
- })
180
-
181
- // quiz
182
- if (__shokax_quiz__) {
183
- document.querySelectorAll('.quiz > ul.options li').forEach((element) => {
184
- element.addEventListener('click', () => {
185
- if (element.classList.contains('correct')) {
186
- element.classList.toggle('right');
187
- (element.parentNode.parentNode as HTMLElement).classList.add('show')
188
- } else {
189
- element.classList.toggle('wrong')
190
- }
191
- })
192
- })
193
-
194
- document.querySelectorAll('.quiz > p').forEach((element) => {
195
- element.addEventListener('click', () => {
196
- (element.parentNode as HTMLElement).classList.toggle('show')
197
- })
198
- })
199
-
200
- document.querySelectorAll('.quiz > p:first-child').forEach((element) => {
201
- const quiz = element.parentNode as HTMLElement
202
- let type = 'choice'
203
- if (quiz.classList.contains('true') || quiz.classList.contains('false')) {
204
- type = 'true_false'
205
- }
206
- if (quiz.classList.contains('multi')) {
207
- type = 'multiple'
208
- }
209
- if (quiz.classList.contains('fill')) {
210
- type = 'gap_fill'
211
- }
212
- if (quiz.classList.contains('essay')) {
213
- type = 'essay'
214
- }
215
- element.setAttribute('data-type', LOCAL.quiz[type])
216
- })
217
-
218
- document.querySelectorAll('.quiz .mistake').forEach((element) => {
219
- element.setAttribute('data-type', LOCAL.quiz.mistake)
220
- })
221
- }
222
-
223
- document.querySelectorAll('div.tags a').forEach((element) => {
224
- element.className = ['primary', 'success', 'info', 'warning', 'danger'][Math.floor(Math.random() * 5)]
225
- })
226
-
227
- const angleDown = document.querySelectorAll('.show-btn .i-angle-down')
228
- if (angleDown.length) {
229
- const io = new IntersectionObserver((entries) => {
230
- entries.forEach(entry => {
231
- if (entry.isIntersecting) {
232
- angleDown.forEach(i => {
233
- i.classList.remove('stop-animation')
234
- })
235
- } else {
236
- angleDown.forEach(i => {
237
- i.classList.add('stop-animation')
238
- })
239
- }
240
- })
241
- }, {
242
- root: null,
243
- threshold: 0.5
244
- })
245
- angleDown.forEach(i => {
246
- io.observe(i)
247
- })
248
- }
249
-
250
- await import('shokax-components-lib/components/codeblock/init')
251
- initializeCodeBlock('.shiki')
252
- }
1
+ import { postImageViewer } from './imageviewer'
2
+ import { clipBoard, showtip } from '../globals/tools'
3
+ import { CONFIG, BODY } from '../globals/globalVars'
4
+ import { pageScroll, transition } from '../library/anime'
5
+ import { getDisplay, setDisplay, wrapObject } from '../library/proto'
6
+ import { initializeCodeBlock } from 'shokax-uikit/components/codeblock/init'
7
+
8
+ export const postBeauty = async () => {
9
+ if (!document.querySelector('.md')) { return }
10
+
11
+ postImageViewer('.post.block');
12
+
13
+ (document.querySelector('.post.block') as HTMLTextAreaElement).oncopy = (event) => {
14
+ showtip(LOCAL.copyright)
15
+
16
+ if (LOCAL.nocopy) {
17
+ event.preventDefault()
18
+ return
19
+ }
20
+
21
+ const copyright = document.getElementById('copyright')
22
+ if (window.getSelection().toString().length > CONFIG.experiments.copyrightLength && copyright) {
23
+ event.preventDefault()
24
+ const author = '# ' + (copyright.querySelector('.author') as HTMLElement).innerText
25
+ const link = '# ' + (copyright.querySelector('.link') as HTMLElement).innerText
26
+ const license = '# ' + (copyright.querySelector('.license') as HTMLElement).innerText
27
+ const htmlData = author + '<br>' + link + '<br>' + license + '<br><br>' + window.getSelection().toString().replace(/\r\n/g, '<br>')
28
+
29
+ const textData = author + '\n' + link + '\n' + license + '\n\n' + window.getSelection().toString().replace(/\r\n/g, '\n')
30
+ if (event.clipboardData) {
31
+ event.clipboardData.setData('text/html', htmlData)
32
+ event.clipboardData.setData('text/plain', textData)
33
+ } else {
34
+ throw new Error('Clipboard API not supported')
35
+ }
36
+ }
37
+ }
38
+
39
+ document.querySelectorAll('li ruby').forEach((element) => {
40
+ let parent = element.parentNode as HTMLElement
41
+ // @ts-ignore
42
+ if (element.parentNode.tagName !== 'LI') {
43
+ parent = element.parentNode.parentNode as HTMLElement
44
+ }
45
+ parent.classList.add('ruby')
46
+ })
47
+
48
+ document.querySelectorAll('ol[start]').forEach((element) => {
49
+ // @ts-ignore
50
+ element.style.counterReset = 'counter ' + parseInt(element.getAttribute('start') - 1)
51
+ })
52
+
53
+ document.querySelectorAll<HTMLElement>('.md table').forEach((element) => {
54
+ wrapObject(element, {
55
+ className: 'table-container'
56
+ })
57
+ })
58
+
59
+ document.querySelectorAll('.highlight > .table-container').forEach((element) => {
60
+ element.className = 'code-container'
61
+ })
62
+
63
+ document.querySelectorAll<HTMLElement>('figure.highlight').forEach((element) => {
64
+ const code_container = element.querySelector('.code-container') as HTMLElement
65
+ const caption = element.querySelector('figcaption')
66
+
67
+ element.insertAdjacentHTML('beforeend', '<div class="operation"><span class="breakline-btn"><i class="ic i-align-left"></i></span><span class="copy-btn"><i class="ic i-clipboard"></i></span><span class="fullscreen-btn"><i class="ic i-expand"></i></span></div>')
68
+
69
+ const copyBtn = element.querySelector('.copy-btn')
70
+ if (LOCAL.nocopy) {
71
+ copyBtn.remove()
72
+ } else {
73
+ copyBtn.addEventListener('click', (event) => {
74
+ const target = <HTMLElement>event.currentTarget
75
+ let comma = ''; let code = ''
76
+ code_container.querySelectorAll('pre').forEach((line) => {
77
+ code += comma + line.innerText
78
+ comma = '\n'
79
+ })
80
+
81
+ clipBoard(code, (result) => {
82
+ target.querySelector('.ic').className = result ? 'ic i-check' : 'ic i-times'
83
+ target.blur()
84
+ showtip(LOCAL.copyright)
85
+ })
86
+ }, { passive: true })
87
+ copyBtn.addEventListener('mouseleave', (event) => {
88
+ setTimeout(() => {
89
+ (event.target as HTMLElement).querySelector('.ic').className = 'ic i-clipboard'
90
+ }, 1000)
91
+ })
92
+ }
93
+
94
+ const breakBtn = element.querySelector('.breakline-btn')
95
+ breakBtn.addEventListener('click', (event) => {
96
+ const target = event.currentTarget as HTMLElement
97
+ if (element.classList.contains('breakline')) {
98
+ element.classList.remove('breakline')
99
+ target.querySelector('.ic').className = 'ic i-align-left'
100
+ } else {
101
+ element.classList.add('breakline')
102
+ target.querySelector('.ic').className = 'ic i-align-justify'
103
+ }
104
+ })
105
+
106
+ const fullscreenBtn = element.querySelector('.fullscreen-btn')
107
+ const removeFullscreen = () => {
108
+ element.classList.remove('fullscreen')
109
+ element.scrollTop = 0
110
+ BODY.classList.remove('fullscreen')
111
+ fullscreenBtn.querySelector('.ic').className = 'ic i-expand'
112
+ }
113
+ const fullscreenHandle = () => {
114
+ if (element.classList.contains('fullscreen')) {
115
+ removeFullscreen()
116
+ if (code_container && code_container.querySelectorAll('tr').length > 15) {
117
+ const showBtn = code_container.querySelector('.show-btn')
118
+ code_container.style.maxHeight = '300px'
119
+ showBtn.classList.remove('open')
120
+ }
121
+ pageScroll(element)
122
+ } else {
123
+ element.classList.add('fullscreen')
124
+ BODY.classList.add('fullscreen')
125
+ fullscreenBtn.querySelector('.ic').className = 'ic i-compress'
126
+ if (code_container && code_container.querySelectorAll('tr').length > 15) {
127
+ const showBtn = code_container.querySelector('.show-btn')
128
+ code_container.style.maxHeight = ''
129
+ showBtn.classList.add('open')
130
+ }
131
+ }
132
+ }
133
+ fullscreenBtn.addEventListener('click', fullscreenHandle)
134
+ caption && caption.addEventListener('click', fullscreenHandle)
135
+
136
+ if (code_container && code_container.querySelectorAll('tr').length > 15) {
137
+ code_container.style.maxHeight = '300px'
138
+ code_container.insertAdjacentHTML('beforeend', '<div class="show-btn"><i class="ic i-angle-down"></i></div>')
139
+ const showBtn = code_container.querySelector('.show-btn')
140
+
141
+ const hideCode = () => {
142
+ code_container.style.maxHeight = '300px'
143
+ showBtn.classList.remove('open')
144
+ }
145
+ const showCode = () => {
146
+ code_container.style.maxHeight = ''
147
+ showBtn.classList.add('open')
148
+ }
149
+
150
+ showBtn.addEventListener('click', () => {
151
+ if (showBtn.classList.contains('open')) {
152
+ removeFullscreen()
153
+ hideCode()
154
+ pageScroll(code_container)
155
+ } else {
156
+ showCode()
157
+ }
158
+ })
159
+ }
160
+ })
161
+
162
+ document.querySelectorAll('pre.mermaid > svg').forEach((element) => {
163
+ const temp = <SVGAElement><unknown>element
164
+ temp.style.maxWidth = ''
165
+ })
166
+
167
+ document.querySelectorAll('.reward button').forEach((element) => {
168
+ element.addEventListener('click', (event) => {
169
+ event.preventDefault()
170
+ const qr = document.getElementById('qr')
171
+ if (getDisplay(qr) === 'inline-flex') {
172
+ transition(qr, 0)
173
+ } else {
174
+ transition(qr, 1, () => {
175
+ setDisplay(qr, 'inline-flex')
176
+ }) // slideUpBigIn
177
+ }
178
+ })
179
+ })
180
+
181
+ // quiz
182
+ if (__shokax_quiz__) {
183
+ document.querySelectorAll('.quiz > ul.options li').forEach((element) => {
184
+ element.addEventListener('click', () => {
185
+ if (element.classList.contains('correct')) {
186
+ element.classList.toggle('right');
187
+ (element.parentNode.parentNode as HTMLElement).classList.add('show')
188
+ } else {
189
+ element.classList.toggle('wrong')
190
+ }
191
+ })
192
+ })
193
+
194
+ document.querySelectorAll('.quiz > p').forEach((element) => {
195
+ element.addEventListener('click', () => {
196
+ (element.parentNode as HTMLElement).classList.toggle('show')
197
+ })
198
+ })
199
+
200
+ document.querySelectorAll('.quiz > p:first-child').forEach((element) => {
201
+ const quiz = element.parentNode as HTMLElement
202
+ let type = 'choice'
203
+ if (quiz.classList.contains('true') || quiz.classList.contains('false')) {
204
+ type = 'true_false'
205
+ }
206
+ if (quiz.classList.contains('multi')) {
207
+ type = 'multiple'
208
+ }
209
+ if (quiz.classList.contains('fill')) {
210
+ type = 'gap_fill'
211
+ }
212
+ if (quiz.classList.contains('essay')) {
213
+ type = 'essay'
214
+ }
215
+ element.setAttribute('data-type', LOCAL.quiz[type])
216
+ })
217
+
218
+ document.querySelectorAll('.quiz .mistake').forEach((element) => {
219
+ element.setAttribute('data-type', LOCAL.quiz.mistake)
220
+ })
221
+ }
222
+
223
+ document.querySelectorAll('div.tags a').forEach((element) => {
224
+ element.className = ['primary', 'success', 'info', 'warning', 'danger'][Math.floor(Math.random() * 5)]
225
+ })
226
+
227
+ const angleDown = document.querySelectorAll('.show-btn .i-angle-down')
228
+ if (angleDown.length) {
229
+ const io = new IntersectionObserver((entries) => {
230
+ entries.forEach(entry => {
231
+ if (entry.isIntersecting) {
232
+ angleDown.forEach(i => {
233
+ i.classList.remove('stop-animation')
234
+ })
235
+ } else {
236
+ angleDown.forEach(i => {
237
+ i.classList.add('stop-animation')
238
+ })
239
+ }
240
+ })
241
+ }, {
242
+ root: null,
243
+ threshold: 0.5
244
+ })
245
+ angleDown.forEach(i => {
246
+ io.observe(i)
247
+ })
248
+ }
249
+
250
+ initializeCodeBlock('.shiki')
251
+ }