@varlet/cli 1.27.17-alpha.1656907860130 → 1.27.17

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 (208) 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/types/basicComponent.d.ts +7 -7
  15. package/generators/config/default/base/types/button.d.ts +12 -12
  16. package/generators/config/default/base/types/index.d.ts +6 -6
  17. package/generators/config/default/base/varlet.config.js +110 -110
  18. package/generators/config/default/sfc/src/button/Button.vue +30 -30
  19. package/generators/config/default/sfc/src/button/__tests__/index.spec.js +7 -7
  20. package/generators/config/default/sfc/src/button/button.less +14 -14
  21. package/generators/config/default/sfc/src/button/docs/zh-CN.md +47 -47
  22. package/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -7
  23. package/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -7
  24. package/generators/config/default/sfc/src/button/example/index.vue +13 -13
  25. package/generators/config/default/sfc/src/button/index.ts +10 -10
  26. package/generators/config/default/tsx/src/button/Button.tsx +31 -31
  27. package/generators/config/default/tsx/src/button/__tests__/index.spec.js +7 -7
  28. package/generators/config/default/tsx/src/button/button.less +14 -14
  29. package/generators/config/default/tsx/src/button/docs/zh-CN.md +47 -47
  30. package/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -7
  31. package/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -7
  32. package/generators/config/default/tsx/src/button/example/index.vue +13 -13
  33. package/generators/config/default/tsx/src/button/index.ts +10 -10
  34. package/generators/config/i18n/base/docs/home.en-US.md +11 -11
  35. package/generators/config/i18n/base/docs/home.zh-CN.md +10 -10
  36. package/generators/config/i18n/base/types/basicComponent.d.ts +7 -7
  37. package/generators/config/i18n/base/types/button.d.ts +12 -12
  38. package/generators/config/i18n/base/types/index.d.ts +7 -7
  39. package/generators/config/i18n/base/types/locale.d.ts +24 -24
  40. package/generators/config/i18n/base/varlet.config.js +122 -122
  41. package/generators/config/i18n/sfc/src/button/Button.vue +36 -36
  42. package/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +7 -7
  43. package/generators/config/i18n/sfc/src/button/button.less +14 -14
  44. package/generators/config/i18n/sfc/src/button/docs/en-US.md +34 -34
  45. package/generators/config/i18n/sfc/src/button/docs/zh-CN.md +34 -34
  46. package/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -11
  47. package/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -11
  48. package/generators/config/i18n/sfc/src/button/example/index.vue +13 -13
  49. package/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -5
  50. package/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -23
  51. package/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -5
  52. package/generators/config/i18n/sfc/src/button/index.ts +10 -10
  53. package/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +51 -51
  54. package/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -26
  55. package/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -25
  56. package/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -5
  57. package/generators/config/i18n/sfc/src/locale/en-US.ts +7 -7
  58. package/generators/config/i18n/sfc/src/locale/index.ts +67 -67
  59. package/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -5
  60. package/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -7
  61. package/generators/config/i18n/tsx/src/button/Button.tsx +35 -35
  62. package/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +7 -7
  63. package/generators/config/i18n/tsx/src/button/button.less +14 -14
  64. package/generators/config/i18n/tsx/src/button/docs/en-US.md +34 -34
  65. package/generators/config/i18n/tsx/src/button/docs/zh-CN.md +34 -34
  66. package/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -11
  67. package/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -11
  68. package/generators/config/i18n/tsx/src/button/example/index.vue +13 -13
  69. package/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -5
  70. package/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -23
  71. package/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -5
  72. package/generators/config/i18n/tsx/src/button/index.ts +10 -10
  73. package/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +51 -51
  74. package/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -26
  75. package/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -25
  76. package/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -5
  77. package/generators/config/i18n/tsx/src/locale/en-US.ts +7 -7
  78. package/generators/config/i18n/tsx/src/locale/index.ts +67 -67
  79. package/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -5
  80. package/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -7
  81. package/lib/commands/build.d.ts +1 -1
  82. package/lib/commands/build.js +67 -67
  83. package/lib/commands/changelog.d.ts +6 -6
  84. package/lib/commands/changelog.js +27 -27
  85. package/lib/commands/commitLint.d.ts +1 -1
  86. package/lib/commands/commitLint.js +21 -21
  87. package/lib/commands/compile.d.ts +5 -5
  88. package/lib/commands/compile.js +119 -119
  89. package/lib/commands/create.d.ts +3 -3
  90. package/lib/commands/create.js +132 -132
  91. package/lib/commands/dev.d.ts +3 -3
  92. package/lib/commands/dev.js +123 -123
  93. package/lib/commands/gen.d.ts +1 -1
  94. package/lib/commands/gen.js +112 -112
  95. package/lib/commands/jest.d.ts +8 -8
  96. package/lib/commands/jest.js +81 -81
  97. package/lib/commands/lint.d.ts +1 -1
  98. package/lib/commands/lint.js +123 -123
  99. package/lib/commands/preview.d.ts +1 -1
  100. package/lib/commands/preview.js +74 -74
  101. package/lib/commands/release.d.ts +3 -3
  102. package/lib/commands/release.js +269 -267
  103. package/lib/compiler/compileModule.d.ts +5 -5
  104. package/lib/compiler/compileModule.js +186 -186
  105. package/lib/compiler/compileSFC.d.ts +2 -2
  106. package/lib/compiler/compileSFC.js +132 -132
  107. package/lib/compiler/compileScript.d.ts +17 -17
  108. package/lib/compiler/compileScript.js +202 -202
  109. package/lib/compiler/compileSiteEntry.d.ts +13 -13
  110. package/lib/compiler/compileSiteEntry.js +237 -237
  111. package/lib/compiler/compileStyle.d.ts +11 -11
  112. package/lib/compiler/compileStyle.js +101 -101
  113. package/lib/compiler/compileTemplateHighlight.d.ts +10 -10
  114. package/lib/compiler/compileTemplateHighlight.js +193 -193
  115. package/lib/compiler/compileTypes.d.ts +2 -2
  116. package/lib/compiler/compileTypes.js +88 -88
  117. package/lib/config/babel.config.d.ts +2 -2
  118. package/lib/config/babel.config.js +31 -31
  119. package/lib/config/babel.sfc.transform.d.ts +1 -1
  120. package/lib/config/babel.sfc.transform.js +18 -18
  121. package/lib/config/jest.config.d.ts +1 -1
  122. package/lib/config/jest.config.js +36 -36
  123. package/lib/config/jest.media.mock.js +2 -2
  124. package/lib/config/jest.style.mock.js +2 -2
  125. package/lib/config/varlet.config.d.ts +1 -1
  126. package/lib/config/varlet.config.js +24 -24
  127. package/lib/config/vite.config.d.ts +5 -5
  128. package/lib/config/vite.config.js +162 -162
  129. package/lib/index.d.ts +2 -2
  130. package/lib/index.js +83 -83
  131. package/lib/shared/constant.d.ts +43 -43
  132. package/lib/shared/constant.js +50 -50
  133. package/lib/shared/fsUtils.d.ts +12 -12
  134. package/lib/shared/fsUtils.js +108 -108
  135. package/lib/shared/logger.d.ts +7 -7
  136. package/lib/shared/logger.js +20 -20
  137. package/package.json +8 -7
  138. package/preset.js +3 -3
  139. package/site/components/button/Button.vue +84 -84
  140. package/site/components/button/button.less +183 -183
  141. package/site/components/button/index.ts +10 -10
  142. package/site/components/button/props.ts +70 -70
  143. package/site/components/cell/Cell.vue +42 -42
  144. package/site/components/cell/cell.less +74 -74
  145. package/site/components/cell/index.ts +10 -10
  146. package/site/components/cell/props.ts +27 -27
  147. package/site/components/code-example/CodeExample.vue +143 -143
  148. package/site/components/code-example/codeExample.less +41 -41
  149. package/site/components/code-example/index.ts +10 -10
  150. package/site/components/context/index.ts +17 -17
  151. package/site/components/context/lock.ts +103 -103
  152. package/site/components/context/zIndex.ts +20 -20
  153. package/site/components/icon/Icon.vue +68 -68
  154. package/site/components/icon/icon.less +26 -26
  155. package/site/components/icon/index.ts +10 -10
  156. package/site/components/icon/props.ts +24 -24
  157. package/site/components/loading/Loading.vue +55 -55
  158. package/site/components/loading/index.ts +10 -10
  159. package/site/components/loading/loading.less +420 -420
  160. package/site/components/loading/props.ts +37 -37
  161. package/site/components/progress/Progress.vue +108 -108
  162. package/site/components/progress/index.ts +10 -10
  163. package/site/components/progress/progress.less +98 -98
  164. package/site/components/progress/props.ts +55 -55
  165. package/site/components/ripple/index.ts +167 -167
  166. package/site/components/ripple/ripple.less +17 -17
  167. package/site/components/snackbar/Snackbar.vue +38 -38
  168. package/site/components/snackbar/core.vue +117 -117
  169. package/site/components/snackbar/index.tsx +270 -270
  170. package/site/components/snackbar/props.ts +94 -94
  171. package/site/components/snackbar/snackbar.less +135 -135
  172. package/site/components/styles/common.less +64 -64
  173. package/site/components/styles/elevation.less +126 -126
  174. package/site/components/styles/var.less +27 -27
  175. package/site/components/utils/components.ts +69 -69
  176. package/site/components/utils/elements.ts +85 -85
  177. package/site/index.html +49 -49
  178. package/site/mobile/App.vue +291 -291
  179. package/site/mobile/components/AppHome.vue +134 -134
  180. package/site/mobile/components/AppType.vue +22 -22
  181. package/site/mobile/components/app-bar/AppBar.vue +69 -69
  182. package/site/mobile/components/app-bar/appBar.less +56 -56
  183. package/site/mobile/components/app-bar/index.ts +10 -10
  184. package/site/mobile/components/app-bar/props.ts +25 -25
  185. package/site/mobile/components/styles/common.less +64 -64
  186. package/site/mobile/components/styles/elevation.less +126 -126
  187. package/site/mobile/components/styles/var.less +27 -27
  188. package/site/mobile/main.ts +74 -74
  189. package/site/mobile.html +41 -41
  190. package/site/module.d.ts +5 -5
  191. package/site/pc/App.vue +43 -43
  192. package/site/pc/Layout.vue +397 -397
  193. package/site/pc/components/AnimationBox.vue +45 -45
  194. package/site/pc/components/AppHeader.vue +355 -355
  195. package/site/pc/components/AppMobile.vue +54 -54
  196. package/site/pc/components/AppSidebar.vue +134 -134
  197. package/site/pc/components/LogoAnimation.vue +119 -119
  198. package/site/pc/floating.ts +9 -9
  199. package/site/pc/main.ts +94 -94
  200. package/site/pc/pages/index/index.less +194 -194
  201. package/site/pc/pages/index/index.vue +145 -128
  202. package/site/pc/pages/index/locale/en-US.ts +5 -3
  203. package/site/pc/pages/index/locale/zh-CN.ts +5 -3
  204. package/site/tsconfig.json +11 -11
  205. package/site/useProgress.ts +75 -75
  206. package/site/utils.ts +153 -153
  207. package/tsconfig.json +14 -14
  208. package/varlet.default.config.js +145 -151
@@ -1,355 +1,355 @@
1
- <template>
2
- <div class="varlet-site-header">
3
- <div class="varlet-site-header__lead">
4
- <animation-box class="varlet-site-header__logo" @click="backRoot" />
5
- <div class="varlet-site-header__title" v-if="title" @click="backRoot">{{ title }}</div>
6
- </div>
7
-
8
- <div class="varlet-site-header__tail">
9
- <div
10
- class="varlet-site-header__versions"
11
- @mouseenter="isOpenVersionsMenu = true"
12
- @mouseleave="isOpenVersionsMenu = false"
13
- v-if="versionItems"
14
- >
15
- <span style="font-size: 14px;">{{ currentVersion }}</span>
16
- <var-site-icon name="chevron-down" />
17
- <transition name="fade">
18
- <div
19
- class="varlet-site-header__animation-list varlet-site-header__animation-versions var-site-elevation--5"
20
- v-show="isOpenVersionsMenu"
21
- :style="{ pointerEvents: isOpenVersionsMenu ? 'auto' : 'none' }"
22
- >
23
- <var-site-cell
24
- v-for="(value, key) in nonEmptyVersions"
25
- v-ripple
26
- :key="key"
27
- :class="{ 'varlet-site-header__animation-list--active': currentVersion === key }"
28
- @click="open(value)"
29
- >{{ key }}
30
- </var-site-cell>
31
- </div>
32
- </transition>
33
- </div>
34
-
35
- <a class="varlet-site-header__link" target="_blank" :href="playground" v-ripple v-if="playground">
36
- <var-site-icon name="code-json" :size="24" />
37
- </a>
38
- <a class="varlet-site-header__link" target="_blank" :href="github" v-ripple v-if="github">
39
- <var-site-icon name="github" :size="28" />
40
- </a>
41
- <div class="varlet-site-header__theme" v-ripple v-if="darkMode" @click="toggleTheme">
42
- <var-site-icon
43
- size="26px"
44
- :name="currentThemes === 'themes' ? 'white-balance-sunny' : 'weather-night'"
45
- :style="{
46
- marginBottom: currentThemes === 'darkThemes' && '2px',
47
- marginTop: currentThemes === 'themes' && '2px',
48
- }"
49
- />
50
- </div>
51
- <div
52
- class="varlet-site-header__language"
53
- @mouseenter="isOpenLanguageMenu = true"
54
- @mouseleave="isOpenLanguageMenu = false"
55
- v-if="languages"
56
- >
57
- <var-site-icon name="translate" size="26px" />
58
- <var-site-icon name="chevron-down" />
59
- <transition name="fade">
60
- <div
61
- class="varlet-site-header__animation-list var-site-elevation--5"
62
- v-show="isOpenLanguageMenu"
63
- :style="{ pointerEvents: isOpenLanguageMenu ? 'auto' : 'none' }"
64
- >
65
- <var-site-cell
66
- v-for="(value, key) in nonEmptyLanguages"
67
- v-ripple
68
- :key="key"
69
- :class="{ 'varlet-site-header__animation-list--active': language === key }"
70
- @click="handleLanguageChange(key)"
71
- >{{ value }}
72
- </var-site-cell>
73
- </div>
74
- </transition>
75
- </div>
76
-
77
- </div>
78
- </div>
79
- </template>
80
-
81
- <script lang="ts">
82
- import config from '@config'
83
- import { ref, computed, defineComponent } from 'vue'
84
- import { get } from 'lodash-es'
85
- import { getBrowserThemes, getPCLocationInfo, removeEmpty, setThemes, watchThemes } from '../../utils'
86
- import { useRouter } from 'vue-router'
87
- import AnimationBox from './AnimationBox.vue'
88
- import type { Ref, ComputedRef } from 'vue'
89
-
90
- export default defineComponent({
91
- name: 'AppHeader',
92
- components: { AnimationBox },
93
- props: {
94
- language: {
95
- type: String,
96
- }
97
- },
98
- setup() {
99
- const title: Ref<string> = ref(get(config, 'title'))
100
- const logo: Ref<string> = ref(get(config, 'logo'))
101
- const themesKey = get(config, 'themesKey')
102
- const languages: Ref<Record<string, string>> = ref(get(config, 'pc.header.i18n'))
103
- const currentVersion: Ref<string> = ref(get(config, 'pc.header.version.current'))
104
- const versionItems: Ref<Record<string, string>> = ref(get(config, 'pc.header.version.items'))
105
- const playground: Ref<string> = ref(get(config, 'pc.header.playground'))
106
- const github: Ref<string> = ref(get(config, 'pc.header.github'))
107
- const redirect = get(config, 'pc.redirect')
108
- const darkMode: Ref<boolean> = ref(get(config, 'pc.header.darkMode'))
109
- const currentThemes = ref(getBrowserThemes(themesKey))
110
-
111
- const isOpenLanguageMenu: Ref<boolean> = ref(false)
112
- const isOpenVersionsMenu: Ref<boolean> = ref(false)
113
- const router = useRouter()
114
- const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
115
- const nonEmptyVersions: ComputedRef<Record<string, string>> = computed(() => removeEmpty(versionItems.value))
116
-
117
- const backRoot = () => {
118
- const { language: lang } = getPCLocationInfo()
119
- router.replace(`/${lang}${redirect}`)
120
- }
121
-
122
- const handleLanguageChange = (language: string) => {
123
- const { menuName } = getPCLocationInfo()
124
- router.replace(`/${language}/${menuName}`)
125
- isOpenLanguageMenu.value = false
126
- }
127
-
128
- const setCurrentThemes = (themes: 'themes' | 'darkThemes') => {
129
- currentThemes.value = themes
130
- setThemes(config, currentThemes.value)
131
- window.localStorage.setItem(themesKey, currentThemes.value)
132
- }
133
-
134
- const getThemesMessage = () => ({ action: 'themesChange', from: 'pc', data: currentThemes.value })
135
-
136
- const toggleTheme = () => {
137
- setCurrentThemes(currentThemes.value === 'darkThemes' ? 'themes' : 'darkThemes')
138
- window.postMessage(getThemesMessage(), '*')
139
- ;(document.getElementById('mobile') as HTMLIFrameElement).contentWindow!.postMessage(getThemesMessage(), '*')
140
- }
141
-
142
- const open = (value: string) => {
143
- setTimeout(() => {
144
- window.location.href = value
145
- }, 350);
146
- }
147
-
148
- watchThemes((themes, from) => {
149
- from === 'mobile' && setCurrentThemes(themes)
150
- })
151
-
152
- setThemes(config, currentThemes.value)
153
- window.postMessage(getThemesMessage(), '*')
154
-
155
- return {
156
- logo,
157
- title,
158
- currentVersion,
159
- languages,
160
- versionItems,
161
- nonEmptyLanguages,
162
- nonEmptyVersions,
163
- playground,
164
- github,
165
- isOpenLanguageMenu,
166
- isOpenVersionsMenu,
167
- darkMode,
168
- currentThemes,
169
- open,
170
- backRoot,
171
- handleLanguageChange,
172
- toggleTheme,
173
- }
174
- },
175
- })
176
- </script>
177
-
178
- <style scoped lang="less">
179
- .fade-enter-active {
180
- animation-name: fade-in;
181
- animation-duration: 0.3s;
182
- }
183
-
184
- .fade-leave-active {
185
- animation-name: fade-leave;
186
- animation-duration: 0.3s;
187
- }
188
-
189
- @keyframes fade-in {
190
- 0% {
191
- top: 30px;
192
- opacity: 0;
193
- }
194
- 100% {
195
- top: 40px;
196
- opacity: 1;
197
- }
198
- }
199
-
200
- @keyframes fade-leave {
201
- 0% {
202
- top: 40px;
203
- opacity: 1;
204
- }
205
- 100% {
206
- top: 30px;
207
- opacity: 0;
208
- }
209
- }
210
-
211
- .varlet-site-header {
212
- position: fixed;
213
- top: 0;
214
- left: 0;
215
- display: flex;
216
- align-items: center;
217
- width: 100%;
218
- height: 60px;
219
- padding: 0 30px;
220
- justify-content: space-between;
221
- user-select: none;
222
- z-index: 9;
223
- background: var(--site-config-color-bar);
224
- border-bottom: 1px solid var(--site-config-color-border);
225
- box-sizing: border-box;
226
-
227
- &__lead {
228
- display: flex;
229
- align-items: center;
230
- cursor: pointer;
231
- }
232
-
233
- &__logo {
234
- width: 32px;
235
- height: 32px;
236
- margin-right: 12px;
237
- flex-shrink: 0;
238
- transition: 0.3s all ease-in-out;
239
- }
240
-
241
- &__title {
242
- font-size: 22px;
243
- margin-right: 12px;
244
- }
245
-
246
- &__tail {
247
- display: flex;
248
- align-items: center;
249
- }
250
-
251
- @media screen and (max-width: 400px) {
252
- &__tail {
253
- display: none;
254
- }
255
- }
256
-
257
- &__language {
258
- border-radius: 3px;
259
- height: 40px;
260
- display: flex;
261
- align-items: center;
262
- padding: 0 10px;
263
- position: relative;
264
- cursor: pointer;
265
- transition: background-color 0.25s;
266
-
267
- &:hover {
268
- background: var(--site-config-color-nav-button-hover-background);
269
- }
270
- }
271
-
272
- &__versions {
273
- border-radius: 3px;
274
- height: 40px;
275
- display: flex;
276
- align-items: center;
277
- padding-right: 10px;
278
- padding-left: 18px;
279
- position: relative;
280
- cursor: pointer;
281
- transition: background-color 0.25s;
282
- margin-right: 4px;
283
-
284
- &:hover {
285
- background: var(--site-config-color-nav-button-hover-background);
286
- }
287
- }
288
-
289
- &__link {
290
- border-radius: 50%;
291
- width: 42px;
292
- height: 42px;
293
- display: flex;
294
- justify-content: center;
295
- align-items: center;
296
- cursor: pointer;
297
- text-decoration: none;
298
- color: var(--site-config-color-text);
299
- transition: background-color 0.25s;
300
- margin-right: 6px;
301
-
302
- a {
303
- text-decoration: none;
304
- }
305
-
306
- &:hover {
307
- background: var(--site-config-color-nav-button-hover-background);
308
- }
309
- }
310
-
311
- &__theme {
312
- border-radius: 50%;
313
- width: 42px;
314
- height: 42px;
315
- display: flex;
316
- justify-content: center;
317
- align-items: center;
318
- cursor: pointer;
319
- transition: background-color 0.25s;
320
- margin-right: 4px;
321
-
322
- &:hover {
323
- background: var(--site-config-color-nav-button-hover-background);
324
- }
325
- }
326
-
327
- &__animation-list {
328
- background: var(--site-config-color-bar);
329
- cursor: pointer;
330
- color: var(--site-config-color-text);
331
- border-radius: 2px;
332
- position: absolute;
333
- top: 40px;
334
- left: -20px;
335
-
336
- .var-site-cell {
337
- width: 100px;
338
-
339
- &:hover {
340
- background: var(--site-config-color-pc-language-active-background);
341
- color: var(--site-config-color-pc-language-active);
342
- }
343
- }
344
-
345
- &--active {
346
- background: var(--site-config-color-pc-language-active-background);
347
- color: var(--site-config-color-pc-language-active);
348
- }
349
- }
350
-
351
- &__animation-versions {
352
- left: -7px;
353
- }
354
- }
355
- </style>
1
+ <template>
2
+ <div class="varlet-site-header">
3
+ <div class="varlet-site-header__lead">
4
+ <animation-box class="varlet-site-header__logo" @click="backRoot" />
5
+ <div class="varlet-site-header__title" v-if="title" @click="backRoot">{{ title }}</div>
6
+ </div>
7
+
8
+ <div class="varlet-site-header__tail">
9
+ <div
10
+ class="varlet-site-header__versions"
11
+ @mouseenter="isOpenVersionsMenu = true"
12
+ @mouseleave="isOpenVersionsMenu = false"
13
+ v-if="versionItems"
14
+ >
15
+ <span style="font-size: 14px;">{{ currentVersion }}</span>
16
+ <var-site-icon name="chevron-down" />
17
+ <transition name="fade">
18
+ <div
19
+ class="varlet-site-header__animation-list varlet-site-header__animation-versions var-site-elevation--5"
20
+ v-show="isOpenVersionsMenu"
21
+ :style="{ pointerEvents: isOpenVersionsMenu ? 'auto' : 'none' }"
22
+ >
23
+ <var-site-cell
24
+ v-for="(value, key) in nonEmptyVersions"
25
+ v-ripple
26
+ :key="key"
27
+ :class="{ 'varlet-site-header__animation-list--active': currentVersion === key }"
28
+ @click="open(value)"
29
+ >{{ key }}
30
+ </var-site-cell>
31
+ </div>
32
+ </transition>
33
+ </div>
34
+
35
+ <a class="varlet-site-header__link" target="_blank" :href="playground" v-ripple v-if="playground">
36
+ <var-site-icon name="code-json" :size="24" />
37
+ </a>
38
+ <a class="varlet-site-header__link" target="_blank" :href="github" v-ripple v-if="github">
39
+ <var-site-icon name="github" :size="28" />
40
+ </a>
41
+ <div class="varlet-site-header__theme" v-ripple v-if="darkMode" @click="toggleTheme">
42
+ <var-site-icon
43
+ size="26px"
44
+ :name="currentThemes === 'themes' ? 'white-balance-sunny' : 'weather-night'"
45
+ :style="{
46
+ marginBottom: currentThemes === 'darkThemes' && '2px',
47
+ marginTop: currentThemes === 'themes' && '2px',
48
+ }"
49
+ />
50
+ </div>
51
+ <div
52
+ class="varlet-site-header__language"
53
+ @mouseenter="isOpenLanguageMenu = true"
54
+ @mouseleave="isOpenLanguageMenu = false"
55
+ v-if="languages"
56
+ >
57
+ <var-site-icon name="translate" size="26px" />
58
+ <var-site-icon name="chevron-down" />
59
+ <transition name="fade">
60
+ <div
61
+ class="varlet-site-header__animation-list var-site-elevation--5"
62
+ v-show="isOpenLanguageMenu"
63
+ :style="{ pointerEvents: isOpenLanguageMenu ? 'auto' : 'none' }"
64
+ >
65
+ <var-site-cell
66
+ v-for="(value, key) in nonEmptyLanguages"
67
+ v-ripple
68
+ :key="key"
69
+ :class="{ 'varlet-site-header__animation-list--active': language === key }"
70
+ @click="handleLanguageChange(key)"
71
+ >{{ value }}
72
+ </var-site-cell>
73
+ </div>
74
+ </transition>
75
+ </div>
76
+
77
+ </div>
78
+ </div>
79
+ </template>
80
+
81
+ <script lang="ts">
82
+ import config from '@config'
83
+ import { ref, computed, defineComponent } from 'vue'
84
+ import { get } from 'lodash-es'
85
+ import { getBrowserThemes, getPCLocationInfo, removeEmpty, setThemes, watchThemes } from '../../utils'
86
+ import { useRouter } from 'vue-router'
87
+ import AnimationBox from './AnimationBox.vue'
88
+ import type { Ref, ComputedRef } from 'vue'
89
+
90
+ export default defineComponent({
91
+ name: 'AppHeader',
92
+ components: { AnimationBox },
93
+ props: {
94
+ language: {
95
+ type: String,
96
+ }
97
+ },
98
+ setup() {
99
+ const title: Ref<string> = ref(get(config, 'title'))
100
+ const logo: Ref<string> = ref(get(config, 'logo'))
101
+ const themesKey = get(config, 'themesKey')
102
+ const languages: Ref<Record<string, string>> = ref(get(config, 'pc.header.i18n'))
103
+ const currentVersion: Ref<string> = ref(get(config, 'pc.header.version.current'))
104
+ const versionItems: Ref<Record<string, string>> = ref(get(config, 'pc.header.version.items'))
105
+ const playground: Ref<string> = ref(get(config, 'pc.header.playground'))
106
+ const github: Ref<string> = ref(get(config, 'pc.header.github'))
107
+ const redirect = get(config, 'pc.redirect')
108
+ const darkMode: Ref<boolean> = ref(get(config, 'pc.header.darkMode'))
109
+ const currentThemes = ref(getBrowserThemes(themesKey))
110
+
111
+ const isOpenLanguageMenu: Ref<boolean> = ref(false)
112
+ const isOpenVersionsMenu: Ref<boolean> = ref(false)
113
+ const router = useRouter()
114
+ const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
115
+ const nonEmptyVersions: ComputedRef<Record<string, string>> = computed(() => removeEmpty(versionItems.value))
116
+
117
+ const backRoot = () => {
118
+ const { language: lang } = getPCLocationInfo()
119
+ router.replace(`/${lang}${redirect}`)
120
+ }
121
+
122
+ const handleLanguageChange = (language: string) => {
123
+ const { menuName } = getPCLocationInfo()
124
+ router.replace(`/${language}/${menuName}`)
125
+ isOpenLanguageMenu.value = false
126
+ }
127
+
128
+ const setCurrentThemes = (themes: 'themes' | 'darkThemes') => {
129
+ currentThemes.value = themes
130
+ setThemes(config, currentThemes.value)
131
+ window.localStorage.setItem(themesKey, currentThemes.value)
132
+ }
133
+
134
+ const getThemesMessage = () => ({ action: 'themesChange', from: 'pc', data: currentThemes.value })
135
+
136
+ const toggleTheme = () => {
137
+ setCurrentThemes(currentThemes.value === 'darkThemes' ? 'themes' : 'darkThemes')
138
+ window.postMessage(getThemesMessage(), '*')
139
+ ;(document.getElementById('mobile') as HTMLIFrameElement).contentWindow!.postMessage(getThemesMessage(), '*')
140
+ }
141
+
142
+ const open = (value: string) => {
143
+ setTimeout(() => {
144
+ window.location.href = value
145
+ }, 350);
146
+ }
147
+
148
+ watchThemes((themes, from) => {
149
+ from === 'mobile' && setCurrentThemes(themes)
150
+ })
151
+
152
+ setThemes(config, currentThemes.value)
153
+ window.postMessage(getThemesMessage(), '*')
154
+
155
+ return {
156
+ logo,
157
+ title,
158
+ currentVersion,
159
+ languages,
160
+ versionItems,
161
+ nonEmptyLanguages,
162
+ nonEmptyVersions,
163
+ playground,
164
+ github,
165
+ isOpenLanguageMenu,
166
+ isOpenVersionsMenu,
167
+ darkMode,
168
+ currentThemes,
169
+ open,
170
+ backRoot,
171
+ handleLanguageChange,
172
+ toggleTheme,
173
+ }
174
+ },
175
+ })
176
+ </script>
177
+
178
+ <style scoped lang="less">
179
+ .fade-enter-active {
180
+ animation-name: fade-in;
181
+ animation-duration: 0.3s;
182
+ }
183
+
184
+ .fade-leave-active {
185
+ animation-name: fade-leave;
186
+ animation-duration: 0.3s;
187
+ }
188
+
189
+ @keyframes fade-in {
190
+ 0% {
191
+ top: 30px;
192
+ opacity: 0;
193
+ }
194
+ 100% {
195
+ top: 40px;
196
+ opacity: 1;
197
+ }
198
+ }
199
+
200
+ @keyframes fade-leave {
201
+ 0% {
202
+ top: 40px;
203
+ opacity: 1;
204
+ }
205
+ 100% {
206
+ top: 30px;
207
+ opacity: 0;
208
+ }
209
+ }
210
+
211
+ .varlet-site-header {
212
+ position: fixed;
213
+ top: 0;
214
+ left: 0;
215
+ display: flex;
216
+ align-items: center;
217
+ width: 100%;
218
+ height: 60px;
219
+ padding: 0 30px;
220
+ justify-content: space-between;
221
+ user-select: none;
222
+ z-index: 9;
223
+ background: var(--site-config-color-bar);
224
+ border-bottom: 1px solid var(--site-config-color-border);
225
+ box-sizing: border-box;
226
+
227
+ &__lead {
228
+ display: flex;
229
+ align-items: center;
230
+ cursor: pointer;
231
+ }
232
+
233
+ &__logo {
234
+ width: 32px;
235
+ height: 32px;
236
+ margin-right: 12px;
237
+ flex-shrink: 0;
238
+ transition: 0.3s all ease-in-out;
239
+ }
240
+
241
+ &__title {
242
+ font-size: 22px;
243
+ margin-right: 12px;
244
+ }
245
+
246
+ &__tail {
247
+ display: flex;
248
+ align-items: center;
249
+ }
250
+
251
+ @media screen and (max-width: 400px) {
252
+ &__tail {
253
+ display: none;
254
+ }
255
+ }
256
+
257
+ &__language {
258
+ border-radius: 3px;
259
+ height: 40px;
260
+ display: flex;
261
+ align-items: center;
262
+ padding: 0 10px;
263
+ position: relative;
264
+ cursor: pointer;
265
+ transition: background-color 0.25s;
266
+
267
+ &:hover {
268
+ background: var(--site-config-color-nav-button-hover-background);
269
+ }
270
+ }
271
+
272
+ &__versions {
273
+ border-radius: 3px;
274
+ height: 40px;
275
+ display: flex;
276
+ align-items: center;
277
+ padding-right: 10px;
278
+ padding-left: 18px;
279
+ position: relative;
280
+ cursor: pointer;
281
+ transition: background-color 0.25s;
282
+ margin-right: 4px;
283
+
284
+ &:hover {
285
+ background: var(--site-config-color-nav-button-hover-background);
286
+ }
287
+ }
288
+
289
+ &__link {
290
+ border-radius: 50%;
291
+ width: 42px;
292
+ height: 42px;
293
+ display: flex;
294
+ justify-content: center;
295
+ align-items: center;
296
+ cursor: pointer;
297
+ text-decoration: none;
298
+ color: var(--site-config-color-text);
299
+ transition: background-color 0.25s;
300
+ margin-right: 6px;
301
+
302
+ a {
303
+ text-decoration: none;
304
+ }
305
+
306
+ &:hover {
307
+ background: var(--site-config-color-nav-button-hover-background);
308
+ }
309
+ }
310
+
311
+ &__theme {
312
+ border-radius: 50%;
313
+ width: 42px;
314
+ height: 42px;
315
+ display: flex;
316
+ justify-content: center;
317
+ align-items: center;
318
+ cursor: pointer;
319
+ transition: background-color 0.25s;
320
+ margin-right: 4px;
321
+
322
+ &:hover {
323
+ background: var(--site-config-color-nav-button-hover-background);
324
+ }
325
+ }
326
+
327
+ &__animation-list {
328
+ background: var(--site-config-color-bar);
329
+ cursor: pointer;
330
+ color: var(--site-config-color-text);
331
+ border-radius: 2px;
332
+ position: absolute;
333
+ top: 40px;
334
+ left: -20px;
335
+
336
+ .var-site-cell {
337
+ width: 100px;
338
+
339
+ &:hover {
340
+ background: var(--site-config-color-pc-language-active-background);
341
+ color: var(--site-config-color-pc-language-active);
342
+ }
343
+ }
344
+
345
+ &--active {
346
+ background: var(--site-config-color-pc-language-active-background);
347
+ color: var(--site-config-color-pc-language-active);
348
+ }
349
+ }
350
+
351
+ &__animation-versions {
352
+ left: -7px;
353
+ }
354
+ }
355
+ </style>