@varlet/cli 1.27.16 → 1.27.17-alpha.1656907860130

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 (210) hide show
  1. package/LICENCE +21 -21
  2. package/README.en-US.md +401 -401
  3. package/README.md +396 -396
  4. package/generators/base/.prettierignore +9 -9
  5. package/generators/base/.prettierrc +5 -5
  6. package/generators/base/README.md +82 -82
  7. package/generators/base/babel.config.js +10 -10
  8. package/generators/base/public/highlight.css +1 -1
  9. package/generators/base/public/logo.svg +1 -1
  10. package/generators/base/shims/shims-md.d.ts +4 -4
  11. package/generators/base/shims/shims-vue.d.ts +6 -6
  12. package/generators/base/tsconfig.json +13 -13
  13. package/generators/config/default/base/docs/home.zh-CN.md +10 -10
  14. package/generators/config/default/base/package.json +1 -0
  15. package/generators/config/default/base/types/basicComponent.d.ts +7 -7
  16. package/generators/config/default/base/types/button.d.ts +12 -12
  17. package/generators/config/default/base/types/index.d.ts +6 -6
  18. package/generators/config/default/base/varlet.config.js +110 -110
  19. package/generators/config/default/sfc/src/button/Button.vue +30 -30
  20. package/generators/config/default/sfc/src/button/__tests__/index.spec.js +7 -7
  21. package/generators/config/default/sfc/src/button/button.less +14 -14
  22. package/generators/config/default/sfc/src/button/docs/zh-CN.md +47 -47
  23. package/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  24. package/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  25. package/generators/config/default/sfc/src/button/example/index.vue +13 -13
  26. package/generators/config/default/sfc/src/button/index.ts +10 -10
  27. package/generators/config/default/tsx/src/button/Button.tsx +31 -31
  28. package/generators/config/default/tsx/src/button/__tests__/index.spec.js +7 -7
  29. package/generators/config/default/tsx/src/button/button.less +14 -14
  30. package/generators/config/default/tsx/src/button/docs/zh-CN.md +47 -47
  31. package/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  32. package/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  33. package/generators/config/default/tsx/src/button/example/index.vue +13 -13
  34. package/generators/config/default/tsx/src/button/index.ts +10 -10
  35. package/generators/config/i18n/base/docs/home.en-US.md +11 -11
  36. package/generators/config/i18n/base/docs/home.zh-CN.md +10 -10
  37. package/generators/config/i18n/base/package.json +1 -0
  38. package/generators/config/i18n/base/types/basicComponent.d.ts +7 -7
  39. package/generators/config/i18n/base/types/button.d.ts +12 -12
  40. package/generators/config/i18n/base/types/index.d.ts +7 -7
  41. package/generators/config/i18n/base/types/locale.d.ts +24 -24
  42. package/generators/config/i18n/base/varlet.config.js +122 -122
  43. package/generators/config/i18n/sfc/src/button/Button.vue +36 -36
  44. package/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  45. package/generators/config/i18n/sfc/src/button/button.less +14 -14
  46. package/generators/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  47. package/generators/config/i18n/sfc/src/button/docs/zh-CN.md +34 -34
  48. package/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -11
  49. package/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -11
  50. package/generators/config/i18n/sfc/src/button/example/index.vue +13 -13
  51. package/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -5
  52. package/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  53. package/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -5
  54. package/generators/config/i18n/sfc/src/button/index.ts +10 -10
  55. package/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +51 -51
  56. package/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -26
  57. package/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  58. package/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  59. package/generators/config/i18n/sfc/src/locale/en-US.ts +7 -7
  60. package/generators/config/i18n/sfc/src/locale/index.ts +67 -67
  61. package/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -5
  62. package/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -7
  63. package/generators/config/i18n/tsx/src/button/Button.tsx +35 -35
  64. package/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  65. package/generators/config/i18n/tsx/src/button/button.less +14 -14
  66. package/generators/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  67. package/generators/config/i18n/tsx/src/button/docs/zh-CN.md +34 -34
  68. package/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -11
  69. package/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -11
  70. package/generators/config/i18n/tsx/src/button/example/index.vue +13 -13
  71. package/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -5
  72. package/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -23
  73. package/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -5
  74. package/generators/config/i18n/tsx/src/button/index.ts +10 -10
  75. package/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +51 -51
  76. package/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -26
  77. package/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  78. package/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  79. package/generators/config/i18n/tsx/src/locale/en-US.ts +7 -7
  80. package/generators/config/i18n/tsx/src/locale/index.ts +67 -67
  81. package/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -5
  82. package/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -7
  83. package/lib/commands/build.d.ts +1 -1
  84. package/lib/commands/build.js +67 -67
  85. package/lib/commands/changelog.d.ts +6 -6
  86. package/lib/commands/changelog.js +27 -27
  87. package/lib/commands/commitLint.d.ts +1 -1
  88. package/lib/commands/commitLint.js +21 -21
  89. package/lib/commands/compile.d.ts +5 -5
  90. package/lib/commands/compile.js +119 -119
  91. package/lib/commands/create.d.ts +3 -3
  92. package/lib/commands/create.js +132 -132
  93. package/lib/commands/dev.d.ts +3 -3
  94. package/lib/commands/dev.js +123 -123
  95. package/lib/commands/gen.d.ts +1 -1
  96. package/lib/commands/gen.js +112 -112
  97. package/lib/commands/jest.d.ts +8 -8
  98. package/lib/commands/jest.js +81 -81
  99. package/lib/commands/lint.d.ts +1 -1
  100. package/lib/commands/lint.js +123 -123
  101. package/lib/commands/preview.d.ts +1 -1
  102. package/lib/commands/preview.js +74 -74
  103. package/lib/commands/release.d.ts +3 -3
  104. package/lib/commands/release.js +267 -269
  105. package/lib/compiler/compileModule.d.ts +5 -5
  106. package/lib/compiler/compileModule.js +186 -186
  107. package/lib/compiler/compileSFC.d.ts +2 -2
  108. package/lib/compiler/compileSFC.js +132 -132
  109. package/lib/compiler/compileScript.d.ts +17 -17
  110. package/lib/compiler/compileScript.js +202 -202
  111. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  112. package/lib/compiler/compileSiteEntry.js +237 -237
  113. package/lib/compiler/compileStyle.d.ts +11 -11
  114. package/lib/compiler/compileStyle.js +101 -101
  115. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  116. package/lib/compiler/compileTemplateHighlight.js +193 -193
  117. package/lib/compiler/compileTypes.d.ts +2 -2
  118. package/lib/compiler/compileTypes.js +88 -88
  119. package/lib/config/babel.config.d.ts +2 -2
  120. package/lib/config/babel.config.js +31 -31
  121. package/lib/config/babel.sfc.transform.d.ts +1 -1
  122. package/lib/config/babel.sfc.transform.js +18 -18
  123. package/lib/config/jest.config.d.ts +1 -1
  124. package/lib/config/jest.config.js +36 -36
  125. package/lib/config/jest.media.mock.js +2 -2
  126. package/lib/config/jest.style.mock.js +2 -2
  127. package/lib/config/varlet.config.d.ts +1 -1
  128. package/lib/config/varlet.config.js +24 -24
  129. package/lib/config/vite.config.d.ts +5 -5
  130. package/lib/config/vite.config.js +162 -162
  131. package/lib/index.d.ts +2 -2
  132. package/lib/index.js +83 -83
  133. package/lib/shared/constant.d.ts +43 -43
  134. package/lib/shared/constant.js +50 -50
  135. package/lib/shared/fsUtils.d.ts +12 -12
  136. package/lib/shared/fsUtils.js +108 -108
  137. package/lib/shared/logger.d.ts +7 -7
  138. package/lib/shared/logger.js +20 -20
  139. package/package.json +7 -8
  140. package/preset.js +3 -3
  141. package/site/components/button/Button.vue +84 -84
  142. package/site/components/button/button.less +183 -183
  143. package/site/components/button/index.ts +10 -10
  144. package/site/components/button/props.ts +70 -70
  145. package/site/components/cell/Cell.vue +42 -42
  146. package/site/components/cell/cell.less +74 -74
  147. package/site/components/cell/index.ts +10 -10
  148. package/site/components/cell/props.ts +27 -27
  149. package/site/components/code-example/CodeExample.vue +143 -143
  150. package/site/components/code-example/codeExample.less +41 -41
  151. package/site/components/code-example/index.ts +10 -10
  152. package/site/components/context/index.ts +17 -17
  153. package/site/components/context/lock.ts +103 -103
  154. package/site/components/context/zIndex.ts +20 -20
  155. package/site/components/icon/Icon.vue +68 -68
  156. package/site/components/icon/icon.less +26 -26
  157. package/site/components/icon/index.ts +10 -10
  158. package/site/components/icon/props.ts +24 -24
  159. package/site/components/loading/Loading.vue +55 -55
  160. package/site/components/loading/index.ts +10 -10
  161. package/site/components/loading/loading.less +420 -420
  162. package/site/components/loading/props.ts +37 -37
  163. package/site/components/progress/Progress.vue +108 -108
  164. package/site/components/progress/index.ts +10 -10
  165. package/site/components/progress/progress.less +98 -98
  166. package/site/components/progress/props.ts +55 -55
  167. package/site/components/ripple/index.ts +167 -167
  168. package/site/components/ripple/ripple.less +17 -17
  169. package/site/components/snackbar/Snackbar.vue +38 -38
  170. package/site/components/snackbar/core.vue +117 -117
  171. package/site/components/snackbar/index.tsx +270 -270
  172. package/site/components/snackbar/props.ts +94 -94
  173. package/site/components/snackbar/snackbar.less +135 -135
  174. package/site/components/styles/common.less +64 -64
  175. package/site/components/styles/elevation.less +126 -126
  176. package/site/components/styles/var.less +27 -27
  177. package/site/components/utils/components.ts +69 -69
  178. package/site/components/utils/elements.ts +85 -85
  179. package/site/index.html +49 -49
  180. package/site/mobile/App.vue +291 -291
  181. package/site/mobile/components/AppHome.vue +134 -134
  182. package/site/mobile/components/AppType.vue +22 -22
  183. package/site/mobile/components/app-bar/AppBar.vue +69 -69
  184. package/site/mobile/components/app-bar/appBar.less +56 -56
  185. package/site/mobile/components/app-bar/index.ts +10 -10
  186. package/site/mobile/components/app-bar/props.ts +25 -25
  187. package/site/mobile/components/styles/common.less +64 -64
  188. package/site/mobile/components/styles/elevation.less +126 -126
  189. package/site/mobile/components/styles/var.less +27 -27
  190. package/site/mobile/main.ts +74 -74
  191. package/site/mobile.html +41 -41
  192. package/site/module.d.ts +5 -5
  193. package/site/pc/App.vue +43 -43
  194. package/site/pc/Layout.vue +397 -397
  195. package/site/pc/components/AnimationBox.vue +45 -45
  196. package/site/pc/components/AppHeader.vue +355 -355
  197. package/site/pc/components/AppMobile.vue +54 -54
  198. package/site/pc/components/AppSidebar.vue +134 -134
  199. package/site/pc/components/LogoAnimation.vue +119 -119
  200. package/site/pc/floating.ts +9 -9
  201. package/site/pc/main.ts +94 -94
  202. package/site/pc/pages/index/index.less +194 -194
  203. package/site/pc/pages/index/index.vue +128 -125
  204. package/site/pc/pages/index/locale/en-US.ts +3 -5
  205. package/site/pc/pages/index/locale/zh-CN.ts +3 -5
  206. package/site/tsconfig.json +11 -11
  207. package/site/useProgress.ts +75 -75
  208. package/site/utils.ts +153 -153
  209. package/tsconfig.json +14 -14
  210. package/varlet.default.config.js +151 -145
@@ -1,291 +1,291 @@
1
- <template>
2
- <div style="position: relative">
3
- <header>
4
- <var-site-app-bar class="app-bar" title-position="left" :title="bigCamelizeComponentName">
5
- <template #left>
6
- <var-site-button v-if="showBackIcon" text round @click="back" color="transparent" text-color="#fff">
7
- <var-site-icon name="chevron-left" class="arrow-left" style="margin-top: 1px" />
8
- </var-site-button>
9
- <var-site-button
10
- v-if="!showBackIcon && github"
11
- style="margin-left: 2px"
12
- text
13
- round
14
- @click="toGithub"
15
- color="transparent"
16
- text-color="#fff"
17
- >
18
- <var-site-icon name="github" class="github" style="margin-top: 1px" />
19
- </var-site-button>
20
- </template>
21
- <template #right>
22
- <var-site-button
23
- text
24
- round
25
- color="transparent"
26
- text-color="#fff"
27
- :style="{
28
- transform: languages ? 'translateX(2px)' : 'translateX(-4px)',
29
- }"
30
- v-if="darkMode"
31
- @click="toggleTheme"
32
- >
33
- <var-site-icon
34
- class="theme"
35
- color="#fff"
36
- :name="currentThemes === 'themes' ? 'white-balance-sunny' : 'weather-night'"
37
- />
38
- </var-site-button>
39
- <var-site-button
40
- class="i18n-button"
41
- text
42
- color="transparent"
43
- text-color="#fff"
44
- @click.stop="showMenu = true"
45
- v-if="languages"
46
- >
47
- <var-site-icon name="translate" class="i18n" />
48
- <var-site-icon name="chevron-down" class="arrow-down" />
49
- </var-site-button>
50
- </template>
51
- </var-site-app-bar>
52
- </header>
53
- <div class="router-view__block">
54
- <router-view />
55
- </div>
56
-
57
- <transition name="site-menu">
58
- <div class="settings var-site-elevation--3" v-if="showMenu">
59
- <var-site-cell
60
- v-for="(value, key) in nonEmptyLanguages"
61
- :key="key"
62
- class="mobile-language-cell"
63
- :class="[language === key && 'mobile-language-cell--active']"
64
- v-ripple
65
- @click="changeLanguage(key)"
66
- >
67
- {{ value }}
68
- </var-site-cell>
69
- </div>
70
- </transition>
71
- </div>
72
- </template>
73
-
74
- <script lang="ts">
75
- import config from '@config'
76
- import { computed, ComputedRef, defineComponent, ref, Ref, watch } from 'vue'
77
- import { useRoute } from 'vue-router'
78
- import {
79
- getBrowserThemes,
80
- inIframe,
81
- isPhone,
82
- removeEmpty,
83
- setThemes,
84
- watchLang,
85
- watchThemes,
86
- } from '../utils'
87
- import { bigCamelize } from '@varlet/shared'
88
- import { get } from 'lodash-es'
89
-
90
- export default defineComponent({
91
- setup: function () {
92
- const bigCamelizeComponentName: Ref<string> = ref('')
93
- const route = useRoute()
94
- const showBackIcon: Ref<boolean> = ref(false)
95
- const showMenu: Ref<boolean> = ref(false)
96
- const language: Ref<string> = ref('')
97
- const languages: Ref<Record<string, string>> = ref(get(config, 'mobile.header.i18n'))
98
- const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
99
- const redirect = get(config, 'mobile.redirect', '')
100
- const themesKey = get(config, 'themesKey')
101
- const github: Ref<string> = ref(get(config, 'mobile.header.github'))
102
- const darkMode: Ref<string> = ref(get(config, 'mobile.header.darkMode'))
103
- const currentThemes = ref(getBrowserThemes(themesKey))
104
-
105
- const changeLanguage = (lang: string) => {
106
- language.value = lang
107
- showMenu.value = false
108
- window.location.href = `./mobile.html#${route.path}?language=${language.value}&replace=${route.query.replace}`
109
-
110
- if (!isPhone() && inIframe()) {
111
- ;(window.top as any).scrollToMenu(redirect.slice(1))
112
- }
113
- }
114
-
115
- const back = () => {
116
- window.location.href = `./mobile.html#${redirect}?language=${language.value}&replace=${redirect.slice(1)}`
117
-
118
- if (!isPhone() && inIframe()) {
119
- ;(window.top as any).scrollToMenu(redirect.slice(1))
120
- }
121
- }
122
-
123
- const toGithub = () => {
124
- if (inIframe() && !isPhone()) {
125
- window.top!.open(github.value)
126
- } else {
127
- window.location.href = github.value
128
- }
129
- }
130
-
131
- watchLang((newValue) => {
132
- language.value = newValue
133
- })
134
-
135
- watch(
136
- () => route.path,
137
- (to: string) => {
138
- const componentName = bigCamelize(to.slice(1))
139
- const redirectName = bigCamelize(redirect.slice(1))
140
- bigCamelizeComponentName.value = componentName === redirectName ? '' : componentName
141
- showBackIcon.value = componentName !== redirectName
142
- }
143
- )
144
-
145
- const getThemesMessage = () => ({ action: 'themesChange', from: 'mobile', data: currentThemes.value })
146
-
147
- const setCurrentThemes = (themes: 'themes' | 'darkThemes') => {
148
- currentThemes.value = themes
149
- setThemes(config, currentThemes.value)
150
- window.localStorage.setItem(themesKey, currentThemes.value)
151
- }
152
-
153
- const toggleTheme = () => {
154
- setCurrentThemes(currentThemes.value === 'darkThemes' ? 'themes' : 'darkThemes')
155
- window.postMessage(getThemesMessage(), '*')
156
-
157
- if (!isPhone() && inIframe()) {
158
- ;(window.top as any).postMessage(getThemesMessage(), '*')
159
- }
160
- }
161
-
162
- ;(window as any).toggleTheme = toggleTheme
163
-
164
- setThemes(config, currentThemes.value)
165
- window.postMessage(getThemesMessage(), '*')
166
-
167
- document.body.addEventListener('click', () => {
168
- showMenu.value = false
169
- })
170
-
171
- watchThemes((themes, from) => {
172
- from === 'pc' && setCurrentThemes(themes)
173
- })
174
-
175
- return {
176
- bigCamelizeComponentName,
177
- showBackIcon,
178
- github,
179
- showMenu,
180
- languages,
181
- language,
182
- nonEmptyLanguages,
183
- currentThemes,
184
- darkMode,
185
- toGithub,
186
- back,
187
- changeLanguage,
188
- toggleTheme,
189
- }
190
- },
191
- })
192
- </script>
193
-
194
- <style lang="less">
195
- * {
196
- -webkit-font-smoothing: antialiased;
197
- }
198
-
199
- body {
200
- margin: 0;
201
- padding: 0;
202
- min-height: 100%;
203
- font-size: 16px;
204
- font-family: 'Roboto', sans-serif;
205
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
206
- background: var(--site-config-color-bar);
207
- color: var(--site-config-color-text);
208
- transition: background-color 0.25s, color 0.25s;
209
- }
210
-
211
- ::-webkit-scrollbar {
212
- display: none;
213
- width: 0;
214
- background: transparent;
215
- }
216
-
217
- .site {
218
- &-menu-enter-from,
219
- &-menu-leave-to {
220
- transform: translateY(-10px);
221
- opacity: 0;
222
- }
223
- &-menu-enter-active,
224
- &-menu-leave-active {
225
- transition-property: opacity, transform;
226
- transition-duration: 0.25s;
227
- }
228
- }
229
-
230
- header {
231
- position: fixed;
232
- z-index: 99;
233
- width: 100%;
234
- font-weight: bold;
235
- }
236
-
237
- .app-bar {
238
- background: var(--site-config-color-app-bar) !important;
239
- }
240
-
241
- .settings {
242
- position: fixed;
243
- z-index: 200;
244
- top: 48px;
245
- right: 5px;
246
- background: var(--site-config-color-bar);
247
- }
248
-
249
- .router-view__block {
250
- padding: 55px 15px 15px;
251
- }
252
-
253
- * {
254
- box-sizing: border-box;
255
- }
256
-
257
- .mobile-language-cell {
258
- color: var(--site-config-color-text);
259
- background: var(--site-config-color-bar);
260
- cursor: pointer;
261
-
262
- &--active {
263
- color: var(--site-config-color-mobile-language-active);
264
- background: var(--site-config-color-mobile-language-active-background);
265
- }
266
- }
267
-
268
- .arrow-left {
269
- font-size: 28px !important;
270
- }
271
-
272
- .github {
273
- font-size: 28px !important;
274
- }
275
-
276
- .theme {
277
- font-size: 24px !important;
278
- }
279
-
280
- .i18n {
281
- font-size: 24px !important;
282
- }
283
-
284
- .arrow-down {
285
- font-size: 22px !important;
286
- }
287
-
288
- .i18n-button {
289
- padding-right: 6px !important;
290
- }
291
- </style>
1
+ <template>
2
+ <div style="position: relative">
3
+ <header>
4
+ <var-site-app-bar class="app-bar" title-position="left" :title="bigCamelizeComponentName">
5
+ <template #left>
6
+ <var-site-button v-if="showBackIcon" text round @click="back" color="transparent" text-color="#fff">
7
+ <var-site-icon name="chevron-left" class="arrow-left" style="margin-top: 1px" />
8
+ </var-site-button>
9
+ <var-site-button
10
+ v-if="!showBackIcon && github"
11
+ style="margin-left: 2px"
12
+ text
13
+ round
14
+ @click="toGithub"
15
+ color="transparent"
16
+ text-color="#fff"
17
+ >
18
+ <var-site-icon name="github" class="github" style="margin-top: 1px" />
19
+ </var-site-button>
20
+ </template>
21
+ <template #right>
22
+ <var-site-button
23
+ text
24
+ round
25
+ color="transparent"
26
+ text-color="#fff"
27
+ :style="{
28
+ transform: languages ? 'translateX(2px)' : 'translateX(-4px)',
29
+ }"
30
+ v-if="darkMode"
31
+ @click="toggleTheme"
32
+ >
33
+ <var-site-icon
34
+ class="theme"
35
+ color="#fff"
36
+ :name="currentThemes === 'themes' ? 'white-balance-sunny' : 'weather-night'"
37
+ />
38
+ </var-site-button>
39
+ <var-site-button
40
+ class="i18n-button"
41
+ text
42
+ color="transparent"
43
+ text-color="#fff"
44
+ @click.stop="showMenu = true"
45
+ v-if="languages"
46
+ >
47
+ <var-site-icon name="translate" class="i18n" />
48
+ <var-site-icon name="chevron-down" class="arrow-down" />
49
+ </var-site-button>
50
+ </template>
51
+ </var-site-app-bar>
52
+ </header>
53
+ <div class="router-view__block">
54
+ <router-view />
55
+ </div>
56
+
57
+ <transition name="site-menu">
58
+ <div class="settings var-site-elevation--3" v-if="showMenu">
59
+ <var-site-cell
60
+ v-for="(value, key) in nonEmptyLanguages"
61
+ :key="key"
62
+ class="mobile-language-cell"
63
+ :class="[language === key && 'mobile-language-cell--active']"
64
+ v-ripple
65
+ @click="changeLanguage(key)"
66
+ >
67
+ {{ value }}
68
+ </var-site-cell>
69
+ </div>
70
+ </transition>
71
+ </div>
72
+ </template>
73
+
74
+ <script lang="ts">
75
+ import config from '@config'
76
+ import { computed, ComputedRef, defineComponent, ref, Ref, watch } from 'vue'
77
+ import { useRoute } from 'vue-router'
78
+ import {
79
+ getBrowserThemes,
80
+ inIframe,
81
+ isPhone,
82
+ removeEmpty,
83
+ setThemes,
84
+ watchLang,
85
+ watchThemes,
86
+ } from '../utils'
87
+ import { bigCamelize } from '@varlet/shared'
88
+ import { get } from 'lodash-es'
89
+
90
+ export default defineComponent({
91
+ setup: function () {
92
+ const bigCamelizeComponentName: Ref<string> = ref('')
93
+ const route = useRoute()
94
+ const showBackIcon: Ref<boolean> = ref(false)
95
+ const showMenu: Ref<boolean> = ref(false)
96
+ const language: Ref<string> = ref('')
97
+ const languages: Ref<Record<string, string>> = ref(get(config, 'mobile.header.i18n'))
98
+ const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
99
+ const redirect = get(config, 'mobile.redirect', '')
100
+ const themesKey = get(config, 'themesKey')
101
+ const github: Ref<string> = ref(get(config, 'mobile.header.github'))
102
+ const darkMode: Ref<string> = ref(get(config, 'mobile.header.darkMode'))
103
+ const currentThemes = ref(getBrowserThemes(themesKey))
104
+
105
+ const changeLanguage = (lang: string) => {
106
+ language.value = lang
107
+ showMenu.value = false
108
+ window.location.href = `./mobile.html#${route.path}?language=${language.value}&replace=${route.query.replace}`
109
+
110
+ if (!isPhone() && inIframe()) {
111
+ ;(window.top as any).scrollToMenu(redirect.slice(1))
112
+ }
113
+ }
114
+
115
+ const back = () => {
116
+ window.location.href = `./mobile.html#${redirect}?language=${language.value}&replace=${redirect.slice(1)}`
117
+
118
+ if (!isPhone() && inIframe()) {
119
+ ;(window.top as any).scrollToMenu(redirect.slice(1))
120
+ }
121
+ }
122
+
123
+ const toGithub = () => {
124
+ if (inIframe() && !isPhone()) {
125
+ window.top!.open(github.value)
126
+ } else {
127
+ window.location.href = github.value
128
+ }
129
+ }
130
+
131
+ watchLang((newValue) => {
132
+ language.value = newValue
133
+ })
134
+
135
+ watch(
136
+ () => route.path,
137
+ (to: string) => {
138
+ const componentName = bigCamelize(to.slice(1))
139
+ const redirectName = bigCamelize(redirect.slice(1))
140
+ bigCamelizeComponentName.value = componentName === redirectName ? '' : componentName
141
+ showBackIcon.value = componentName !== redirectName
142
+ }
143
+ )
144
+
145
+ const getThemesMessage = () => ({ action: 'themesChange', from: 'mobile', data: currentThemes.value })
146
+
147
+ const setCurrentThemes = (themes: 'themes' | 'darkThemes') => {
148
+ currentThemes.value = themes
149
+ setThemes(config, currentThemes.value)
150
+ window.localStorage.setItem(themesKey, currentThemes.value)
151
+ }
152
+
153
+ const toggleTheme = () => {
154
+ setCurrentThemes(currentThemes.value === 'darkThemes' ? 'themes' : 'darkThemes')
155
+ window.postMessage(getThemesMessage(), '*')
156
+
157
+ if (!isPhone() && inIframe()) {
158
+ ;(window.top as any).postMessage(getThemesMessage(), '*')
159
+ }
160
+ }
161
+
162
+ ;(window as any).toggleTheme = toggleTheme
163
+
164
+ setThemes(config, currentThemes.value)
165
+ window.postMessage(getThemesMessage(), '*')
166
+
167
+ document.body.addEventListener('click', () => {
168
+ showMenu.value = false
169
+ })
170
+
171
+ watchThemes((themes, from) => {
172
+ from === 'pc' && setCurrentThemes(themes)
173
+ })
174
+
175
+ return {
176
+ bigCamelizeComponentName,
177
+ showBackIcon,
178
+ github,
179
+ showMenu,
180
+ languages,
181
+ language,
182
+ nonEmptyLanguages,
183
+ currentThemes,
184
+ darkMode,
185
+ toGithub,
186
+ back,
187
+ changeLanguage,
188
+ toggleTheme,
189
+ }
190
+ },
191
+ })
192
+ </script>
193
+
194
+ <style lang="less">
195
+ * {
196
+ -webkit-font-smoothing: antialiased;
197
+ }
198
+
199
+ body {
200
+ margin: 0;
201
+ padding: 0;
202
+ min-height: 100%;
203
+ font-size: 16px;
204
+ font-family: 'Roboto', sans-serif;
205
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
206
+ background: var(--site-config-color-bar);
207
+ color: var(--site-config-color-text);
208
+ transition: background-color 0.25s, color 0.25s;
209
+ }
210
+
211
+ ::-webkit-scrollbar {
212
+ display: none;
213
+ width: 0;
214
+ background: transparent;
215
+ }
216
+
217
+ .site {
218
+ &-menu-enter-from,
219
+ &-menu-leave-to {
220
+ transform: translateY(-10px);
221
+ opacity: 0;
222
+ }
223
+ &-menu-enter-active,
224
+ &-menu-leave-active {
225
+ transition-property: opacity, transform;
226
+ transition-duration: 0.25s;
227
+ }
228
+ }
229
+
230
+ header {
231
+ position: fixed;
232
+ z-index: 99;
233
+ width: 100%;
234
+ font-weight: bold;
235
+ }
236
+
237
+ .app-bar {
238
+ background: var(--site-config-color-app-bar) !important;
239
+ }
240
+
241
+ .settings {
242
+ position: fixed;
243
+ z-index: 200;
244
+ top: 48px;
245
+ right: 5px;
246
+ background: var(--site-config-color-bar);
247
+ }
248
+
249
+ .router-view__block {
250
+ padding: 55px 15px 15px;
251
+ }
252
+
253
+ * {
254
+ box-sizing: border-box;
255
+ }
256
+
257
+ .mobile-language-cell {
258
+ color: var(--site-config-color-text);
259
+ background: var(--site-config-color-bar);
260
+ cursor: pointer;
261
+
262
+ &--active {
263
+ color: var(--site-config-color-mobile-language-active);
264
+ background: var(--site-config-color-mobile-language-active-background);
265
+ }
266
+ }
267
+
268
+ .arrow-left {
269
+ font-size: 28px !important;
270
+ }
271
+
272
+ .github {
273
+ font-size: 28px !important;
274
+ }
275
+
276
+ .theme {
277
+ font-size: 24px !important;
278
+ }
279
+
280
+ .i18n {
281
+ font-size: 24px !important;
282
+ }
283
+
284
+ .arrow-down {
285
+ font-size: 22px !important;
286
+ }
287
+
288
+ .i18n-button {
289
+ padding-right: 6px !important;
290
+ }
291
+ </style>