@varlet/cli 2.0.0-alpha.1663499244572 → 2.0.0-alpha.1663742071515

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