@varlet/cli 1.27.20 → 2.0.0-alpha.1663499244572

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 (232) hide show
  1. package/LICENCE +21 -21
  2. package/README.en-US.md +401 -401
  3. package/README.md +396 -396
  4. package/lib/commands/build.d.ts +1 -1
  5. package/lib/commands/build.js +18 -67
  6. package/lib/commands/changelog.d.ts +6 -6
  7. package/lib/commands/changelog.js +26 -27
  8. package/lib/commands/commitLint.d.ts +1 -1
  9. package/lib/commands/commitLint.js +50 -21
  10. package/lib/commands/compile.d.ts +7 -5
  11. package/lib/commands/compile.js +43 -119
  12. package/lib/commands/create.d.ts +8 -3
  13. package/lib/commands/create.js +90 -132
  14. package/lib/commands/dev.d.ts +5 -3
  15. package/lib/commands/dev.js +44 -123
  16. package/lib/commands/gen.d.ts +8 -1
  17. package/lib/commands/gen.js +85 -112
  18. package/lib/commands/lint.d.ts +1 -1
  19. package/lib/commands/lint.js +48 -123
  20. package/lib/commands/preview.d.ts +1 -1
  21. package/lib/commands/preview.js +23 -74
  22. package/lib/commands/release.d.ts +5 -3
  23. package/lib/commands/release.js +132 -270
  24. package/lib/commands/test.d.ts +7 -0
  25. package/lib/commands/test.js +26 -0
  26. package/lib/commands/vite.d.ts +3 -0
  27. package/lib/commands/vite.js +20 -0
  28. package/lib/compiler/compileModule.d.ts +5 -5
  29. package/lib/compiler/compileModule.js +79 -186
  30. package/lib/compiler/compileSFC.d.ts +2 -2
  31. package/lib/compiler/compileSFC.js +86 -132
  32. package/lib/compiler/compileScript.d.ts +17 -17
  33. package/lib/compiler/compileScript.js +152 -202
  34. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  35. package/lib/compiler/compileSiteEntry.js +140 -237
  36. package/lib/compiler/compileStyle.d.ts +11 -11
  37. package/lib/compiler/compileStyle.js +43 -101
  38. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  39. package/lib/compiler/compileTemplateHighlight.js +145 -193
  40. package/lib/compiler/compileTypes.d.ts +2 -2
  41. package/lib/compiler/compileTypes.js +49 -88
  42. package/lib/config/babel.config.d.ts +2 -2
  43. package/lib/config/babel.config.js +30 -31
  44. package/lib/config/babel.sfc.transform.d.ts +1 -1
  45. package/lib/config/babel.sfc.transform.js +18 -18
  46. package/lib/config/varlet.config.d.ts +1 -1
  47. package/lib/config/varlet.config.js +23 -24
  48. package/lib/config/vite.config.d.ts +5 -5
  49. package/lib/config/vite.config.js +157 -162
  50. package/lib/config/vitest.config.d.ts +2 -0
  51. package/lib/config/vitest.config.js +28 -0
  52. package/lib/index.d.ts +2 -2
  53. package/lib/index.js +84 -83
  54. package/lib/shared/constant.d.ts +44 -43
  55. package/lib/shared/constant.js +51 -50
  56. package/lib/shared/fsUtils.d.ts +12 -12
  57. package/lib/shared/fsUtils.js +61 -108
  58. package/lib/shared/logger.d.ts +8 -7
  59. package/lib/shared/logger.js +23 -20
  60. package/package.json +20 -17
  61. package/preset.js +3 -3
  62. package/site/components/button/Button.vue +106 -84
  63. package/site/components/button/button.less +183 -183
  64. package/site/components/button/index.ts +10 -10
  65. package/site/components/button/props.ts +78 -70
  66. package/site/components/cell/Cell.vue +54 -42
  67. package/site/components/cell/cell.less +78 -74
  68. package/site/components/cell/index.ts +10 -10
  69. package/site/components/cell/props.ts +27 -27
  70. package/site/components/code-example/CodeExample.vue +137 -143
  71. package/site/components/code-example/codeExample.less +41 -41
  72. package/site/components/code-example/index.ts +10 -10
  73. package/site/components/context/index.ts +21 -17
  74. package/site/components/context/lock.ts +92 -103
  75. package/site/components/context/zIndex.ts +20 -20
  76. package/site/components/icon/Icon.vue +75 -68
  77. package/site/components/icon/icon.less +26 -26
  78. package/site/components/icon/index.ts +10 -10
  79. package/site/components/icon/props.ts +24 -24
  80. package/site/components/loading/Loading.vue +84 -55
  81. package/site/components/loading/index.ts +10 -10
  82. package/site/components/loading/loading.less +505 -420
  83. package/site/components/loading/props.ts +42 -37
  84. package/site/components/popup/Popup.tsx +102 -0
  85. package/site/components/popup/index.ts +10 -0
  86. package/site/components/popup/popup.less +125 -0
  87. package/site/components/popup/props.ts +63 -0
  88. package/site/components/progress/Progress.vue +112 -108
  89. package/site/components/progress/index.ts +10 -10
  90. package/site/components/progress/progress.less +101 -98
  91. package/site/components/progress/props.ts +55 -55
  92. package/site/components/ripple/index.ts +188 -167
  93. package/site/components/ripple/ripple.less +20 -17
  94. package/site/components/snackbar/Snackbar.vue +41 -38
  95. package/site/components/snackbar/core.vue +132 -117
  96. package/site/components/snackbar/index.tsx +270 -270
  97. package/site/components/snackbar/props.ts +97 -94
  98. package/site/components/snackbar/snackbar.less +135 -135
  99. package/site/components/styles/common.less +64 -64
  100. package/site/components/styles/elevation.less +126 -126
  101. package/site/components/styles/var.less +27 -27
  102. package/site/components/utils/components.ts +117 -69
  103. package/site/components/utils/elements.ts +102 -85
  104. package/site/index.html +49 -49
  105. package/site/mobile/App.vue +291 -291
  106. package/site/mobile/components/AppHome.vue +134 -134
  107. package/site/mobile/components/AppType.vue +22 -22
  108. package/site/mobile/components/app-bar/AppBar.vue +65 -69
  109. package/site/mobile/components/app-bar/appBar.less +57 -56
  110. package/site/mobile/components/app-bar/index.ts +10 -10
  111. package/site/mobile/components/app-bar/props.ts +25 -25
  112. package/site/mobile/main.ts +78 -74
  113. package/site/mobile.html +41 -41
  114. package/site/module.d.ts +5 -5
  115. package/site/pc/App.vue +43 -43
  116. package/site/pc/Layout.vue +423 -397
  117. package/site/pc/components/AnimationBox.vue +33 -45
  118. package/site/pc/components/AppHeader.vue +368 -355
  119. package/site/pc/components/AppMobile.vue +60 -54
  120. package/site/pc/components/AppSidebar.vue +143 -134
  121. package/site/pc/components/LogoAnimation.vue +117 -119
  122. package/site/pc/floating.ts +9 -9
  123. package/site/pc/main.ts +100 -94
  124. package/site/pc/pages/index/index.less +176 -231
  125. package/site/pc/pages/index/index.vue +130 -145
  126. package/site/pc/pages/index/locale/en-US.ts +1 -5
  127. package/site/pc/pages/index/locale/zh-CN.ts +1 -5
  128. package/site/tsconfig.json +11 -11
  129. package/site/useProgress.ts +72 -75
  130. package/site/utils.ts +167 -153
  131. package/template/create/__tests__/index.spec.ejs +8 -0
  132. package/{lib/config/jest.media.mock.d.ts → template/create/docs/en-US.md} +0 -0
  133. package/{lib/config/jest.style.mock.d.ts → template/create/docs/zh-CN.md} +0 -0
  134. package/template/create/example/index.ejs +15 -0
  135. package/template/create/example/locale/en-US.ts +3 -0
  136. package/{generators/config/i18n/tsx/src/button → template/create}/example/locale/index.ts +23 -23
  137. package/template/create/example/locale/zh-CN.ts +3 -0
  138. package/template/create/index.ejs +12 -0
  139. package/template/create/less.ejs +3 -0
  140. package/template/create/props.ts +1 -0
  141. package/template/create/tsx.ejs +13 -0
  142. package/template/create/vue.ejs +17 -0
  143. package/{generators → template/generators}/base/.prettierignore +9 -9
  144. package/{generators → template/generators}/base/.prettierrc +5 -5
  145. package/{generators → template/generators}/base/README.md +82 -82
  146. package/{generators → template/generators}/base/babel.config.js +10 -10
  147. package/{generators → template/generators}/base/public/highlight.css +1 -1
  148. package/{generators → template/generators}/base/public/logo.svg +1 -1
  149. package/{generators → template/generators}/base/shims/shims-md.d.ts +4 -4
  150. package/{generators → template/generators}/base/shims/shims-vue.d.ts +6 -6
  151. package/{generators → template/generators}/base/tsconfig.json +13 -13
  152. package/{generators → template/generators}/config/default/base/docs/home.zh-CN.md +10 -10
  153. package/{generators → template/generators}/config/default/base/package.json +105 -105
  154. package/{generators/config/i18n → template/generators/config/default}/base/types/basicComponent.d.ts +7 -7
  155. package/{generators/config/i18n → template/generators/config/default}/base/types/button.d.ts +12 -12
  156. package/{generators → template/generators}/config/default/base/types/index.d.ts +6 -6
  157. package/{generators → template/generators}/config/default/base/varlet.config.js +110 -110
  158. package/{generators → template/generators}/config/default/sfc/src/button/Button.vue +30 -30
  159. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/__tests__/index.spec.js +7 -7
  160. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/button.less +14 -14
  161. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/docs/zh-CN.md +47 -47
  162. package/{generators → template/generators}/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  163. package/{generators → template/generators}/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  164. package/{generators/config/default/tsx → template/generators/config/default/sfc}/src/button/example/index.vue +13 -13
  165. package/{generators → template/generators}/config/default/sfc/src/button/index.ts +10 -10
  166. package/{generators → template/generators}/config/default/tsx/src/button/Button.tsx +29 -31
  167. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/__tests__/index.spec.js +7 -7
  168. package/{generators/config/i18n → template/generators/config/default}/tsx/src/button/button.less +14 -14
  169. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/docs/zh-CN.md +47 -47
  170. package/{generators → template/generators}/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  171. package/{generators → template/generators}/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  172. package/{generators/config/default/sfc → template/generators/config/default/tsx}/src/button/example/index.vue +13 -13
  173. package/{generators → template/generators}/config/default/tsx/src/button/index.ts +10 -10
  174. package/{generators → template/generators}/config/i18n/base/docs/home.en-US.md +11 -11
  175. package/{generators → template/generators}/config/i18n/base/docs/home.zh-CN.md +10 -10
  176. package/{generators → template/generators}/config/i18n/base/package.json +105 -105
  177. package/{generators/config/default → template/generators/config/i18n}/base/types/basicComponent.d.ts +7 -7
  178. package/{generators/config/default → template/generators/config/i18n}/base/types/button.d.ts +12 -12
  179. package/{generators → template/generators}/config/i18n/base/types/index.d.ts +7 -7
  180. package/{generators → template/generators}/config/i18n/base/types/locale.d.ts +24 -24
  181. package/{generators → template/generators}/config/i18n/base/varlet.config.js +122 -122
  182. package/{generators → template/generators}/config/i18n/sfc/src/button/Button.vue +36 -36
  183. package/{generators → template/generators}/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  184. package/{generators → template/generators}/config/i18n/sfc/src/button/button.less +14 -14
  185. package/{generators → template/generators}/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  186. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/docs/zh-CN.md +34 -34
  187. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/BasicUse.vue +11 -11
  188. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/ModifyColor.vue +11 -11
  189. package/{generators → template/generators}/config/i18n/sfc/src/button/example/index.vue +13 -13
  190. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/locale/en-US.ts +5 -5
  191. package/{generators → template/generators}/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  192. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/button/example/locale/zh-CN.ts +5 -5
  193. package/{generators → template/generators}/config/i18n/sfc/src/button/index.ts +10 -10
  194. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/__tests__/index.spec.js +51 -51
  195. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/docs/en-US.md +26 -26
  196. package/{generators → template/generators}/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  197. package/{generators → template/generators}/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  198. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/en-US.ts +7 -7
  199. package/{generators → template/generators}/config/i18n/sfc/src/locale/index.ts +67 -67
  200. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/zh-CN.d.ts +5 -5
  201. package/{generators/config/i18n/tsx → template/generators/config/i18n/sfc}/src/locale/zh-CN.ts +7 -7
  202. package/{generators → template/generators}/config/i18n/tsx/src/button/Button.tsx +33 -35
  203. package/{generators → template/generators}/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  204. package/{generators/config/default/sfc → template/generators/config/i18n/tsx}/src/button/button.less +14 -14
  205. package/{generators → template/generators}/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  206. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/docs/zh-CN.md +34 -34
  207. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/BasicUse.vue +11 -11
  208. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/ModifyColor.vue +11 -11
  209. package/{generators → template/generators}/config/i18n/tsx/src/button/example/index.vue +13 -13
  210. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/locale/en-US.ts +5 -5
  211. package/template/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -0
  212. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/button/example/locale/zh-CN.ts +5 -5
  213. package/{generators → template/generators}/config/i18n/tsx/src/button/index.ts +10 -10
  214. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/__tests__/index.spec.js +51 -51
  215. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/docs/en-US.md +26 -26
  216. package/{generators → template/generators}/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  217. package/{generators → template/generators}/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  218. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/en-US.ts +7 -7
  219. package/{generators → template/generators}/config/i18n/tsx/src/locale/index.ts +67 -67
  220. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/zh-CN.d.ts +5 -5
  221. package/{generators/config/i18n/sfc → template/generators/config/i18n/tsx}/src/locale/zh-CN.ts +7 -7
  222. package/tsconfig.json +15 -14
  223. package/varlet.default.config.js +137 -15
  224. package/lib/commands/jest.d.ts +0 -8
  225. package/lib/commands/jest.js +0 -81
  226. package/lib/config/jest.config.d.ts +0 -1
  227. package/lib/config/jest.config.js +0 -36
  228. package/lib/config/jest.media.mock.js +0 -2
  229. package/lib/config/jest.style.mock.js +0 -2
  230. package/site/mobile/components/styles/common.less +0 -64
  231. package/site/mobile/components/styles/elevation.less +0 -126
  232. package/site/mobile/components/styles/var.less +0 -27
@@ -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-app-bar class="app-bar" title-position="left" :title="bigCamelizeComponentName">
5
+ <template #left>
6
+ <var-button v-if="showBackIcon" text round @click="back" color="transparent" text-color="#fff">
7
+ <var-icon name="chevron-left" class="arrow-left" style="margin-top: 1px" />
8
+ </var-button>
9
+ <var-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-icon name="github" class="github" style="margin-top: 1px" />
19
+ </var-button>
20
+ </template>
21
+ <template #right>
22
+ <var-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-icon
34
+ class="theme"
35
+ color="#fff"
36
+ :name="currentTheme === 'lightTheme' ? 'white-balance-sunny' : 'weather-night'"
37
+ />
38
+ </var-button>
39
+ <var-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-icon name="translate" class="i18n" />
48
+ <var-icon name="chevron-down" class="arrow-down" />
49
+ </var-button>
50
+ </template>
51
+ </var-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-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-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
+ getBrowserTheme,
80
+ inIframe,
81
+ isPhone,
82
+ removeEmpty,
83
+ setTheme,
84
+ Theme,
85
+ watchLang,
86
+ watchTheme
87
+ } from "../utils";
88
+ import { bigCamelize } from '@varlet/shared'
89
+ import { get } from 'lodash-es'
90
+
91
+ export default defineComponent({
92
+ setup() {
93
+ const bigCamelizeComponentName: Ref<string> = ref('')
94
+ const route = useRoute()
95
+ const showBackIcon: Ref<boolean> = ref(false)
96
+ const showMenu: Ref<boolean> = ref(false)
97
+ const language: Ref<string> = ref('')
98
+ const languages: Ref<Record<string, string>> = ref(get(config, 'mobile.header.i18n'))
99
+ const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
100
+ const redirect = get(config, 'mobile.redirect', '')
101
+ const github: Ref<string> = ref(get(config, 'mobile.header.github'))
102
+ const darkMode: Ref<string> = ref(get(config, 'mobile.header.darkMode'))
103
+ const currentTheme = ref(getBrowserTheme())
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 getThemeMessage = () => ({ action: 'theme-change', from: 'mobile', data: currentTheme.value })
146
+
147
+ const setCurrentTheme = (theme: Theme) => {
148
+ currentTheme.value = theme
149
+ setTheme(config, currentTheme.value)
150
+ window.localStorage.setItem(get(config, 'themeKey'), currentTheme.value)
151
+ }
152
+
153
+ const toggleTheme = () => {
154
+ setCurrentTheme(currentTheme.value === 'darkTheme' ? 'lightTheme' : 'darkTheme')
155
+ window.postMessage(getThemeMessage(), '*')
156
+
157
+ if (!isPhone() && inIframe()) {
158
+ ;(window.top as any).postMessage(getThemeMessage(), '*')
159
+ }
160
+ }
161
+
162
+ ;(window as any).toggleTheme = toggleTheme
163
+
164
+ setTheme(config, currentTheme.value)
165
+ window.postMessage(getThemeMessage(), '*')
166
+
167
+ document.body.addEventListener('click', () => {
168
+ showMenu.value = false
169
+ })
170
+
171
+ watchTheme((theme, from) => {
172
+ from === 'pc' && setCurrentTheme(theme)
173
+ })
174
+
175
+ return {
176
+ bigCamelizeComponentName,
177
+ showBackIcon,
178
+ github,
179
+ showMenu,
180
+ languages,
181
+ language,
182
+ nonEmptyLanguages,
183
+ currentTheme,
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) !important;
259
+ background: var(--site-config-color-bar) !important;
260
+ cursor: pointer;
261
+
262
+ &--active {
263
+ color: var(--site-config-color-mobile-language-active) !important;
264
+ background: var(--site-config-color-mobile-language-active-background) !important;
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>