@maple-design/cli-vue 0.0.0-stage → 1.1.1

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 (228) hide show
  1. package/README.md +305 -2
  2. package/README.zh-CN.md +305 -0
  3. package/bin/cli.mjs +5 -0
  4. package/client.d.ts +1 -0
  5. package/client.js +1 -0
  6. package/lib/client/appType.d.ts +4 -0
  7. package/lib/client/appType.js +7 -0
  8. package/lib/client/index.d.ts +29 -0
  9. package/lib/client/index.js +170 -0
  10. package/lib/client/language.d.ts +11 -0
  11. package/lib/client/language.js +52 -0
  12. package/lib/client/theme-state.d.ts +3 -0
  13. package/lib/client/theme-state.js +6 -0
  14. package/lib/node/bin.d.ts +2 -0
  15. package/lib/node/bin.js +154 -0
  16. package/lib/node/commands/build.d.ts +1 -0
  17. package/lib/node/commands/build.js +15 -0
  18. package/lib/node/commands/checklist.d.ts +6 -0
  19. package/lib/node/commands/checklist.js +59 -0
  20. package/lib/node/commands/compile.d.ts +3 -0
  21. package/lib/node/commands/compile.js +41 -0
  22. package/lib/node/commands/create.d.ts +8 -0
  23. package/lib/node/commands/create.js +91 -0
  24. package/lib/node/commands/dev.d.ts +6 -0
  25. package/lib/node/commands/dev.js +58 -0
  26. package/lib/node/commands/extension.d.ts +3 -0
  27. package/lib/node/commands/extension.js +5 -0
  28. package/lib/node/commands/gen.d.ts +24 -0
  29. package/lib/node/commands/gen.js +91 -0
  30. package/lib/node/commands/icons.d.ts +4 -0
  31. package/lib/node/commands/icons.js +15 -0
  32. package/lib/node/commands/preview.d.ts +4 -0
  33. package/lib/node/commands/preview.js +18 -0
  34. package/lib/node/commands/styleVars.d.ts +1 -0
  35. package/lib/node/commands/styleVars.js +6 -0
  36. package/lib/node/commands/test.d.ts +7 -0
  37. package/lib/node/commands/test.js +16 -0
  38. package/lib/node/commands/vite.d.ts +2 -0
  39. package/lib/node/commands/vite.js +14 -0
  40. package/lib/node/compiler/compileModule.d.ts +4 -0
  41. package/lib/node/compiler/compileModule.js +78 -0
  42. package/lib/node/compiler/compileSFC.d.ts +6 -0
  43. package/lib/node/compiler/compileSFC.js +119 -0
  44. package/lib/node/compiler/compileScript.d.ts +27 -0
  45. package/lib/node/compiler/compileScript.js +221 -0
  46. package/lib/node/compiler/compileSiteEntry.d.ts +19 -0
  47. package/lib/node/compiler/compileSiteEntry.js +164 -0
  48. package/lib/node/compiler/compileStyle.d.ts +14 -0
  49. package/lib/node/compiler/compileStyle.js +55 -0
  50. package/lib/node/compiler/compileStyleVars.d.ts +3 -0
  51. package/lib/node/compiler/compileStyleVars.js +46 -0
  52. package/lib/node/compiler/compileTemplateHighlight.d.ts +18 -0
  53. package/lib/node/compiler/compileTemplateHighlight.js +133 -0
  54. package/lib/node/compiler/compileTypes.d.ts +2 -0
  55. package/lib/node/compiler/compileTypes.js +58 -0
  56. package/lib/node/compiler/generateLibraryEntry.d.ts +3 -0
  57. package/lib/node/compiler/generateLibraryEntry.js +152 -0
  58. package/lib/node/compiler/siteRoutes.d.ts +4 -0
  59. package/lib/node/compiler/siteRoutes.js +9 -0
  60. package/lib/node/config/maple.config.d.ts +215 -0
  61. package/lib/node/config/maple.config.js +32 -0
  62. package/lib/node/config/maple.default.config.d.ts +2 -0
  63. package/lib/node/config/maple.default.config.js +386 -0
  64. package/lib/node/config/site-resolver.d.ts +25 -0
  65. package/lib/node/config/site-resolver.js +138 -0
  66. package/lib/node/config/vite.config.d.ts +28 -0
  67. package/lib/node/config/vite.config.js +209 -0
  68. package/lib/node/config/vitest.config.d.ts +2 -0
  69. package/lib/node/config/vitest.config.js +54 -0
  70. package/lib/node/config/vitest.setup.d.ts +1 -0
  71. package/lib/node/config/vitest.setup.js +8 -0
  72. package/lib/node/index.d.ts +13 -0
  73. package/lib/node/index.js +13 -0
  74. package/lib/node/release/index.d.ts +20 -0
  75. package/lib/node/release/index.js +147 -0
  76. package/lib/node/shared/constant.d.ts +47 -0
  77. package/lib/node/shared/constant.js +53 -0
  78. package/lib/node/shared/fsUtils.d.ts +18 -0
  79. package/lib/node/shared/fsUtils.js +57 -0
  80. package/lib/node/shared/logger.d.ts +8 -0
  81. package/lib/node/shared/logger.js +18 -0
  82. package/lib/node/shared/serial-task.d.ts +2 -0
  83. package/lib/node/shared/serial-task.js +9 -0
  84. package/package.json +111 -3
  85. package/site/documentation-sections.spec.ts +45 -0
  86. package/site/documentation-sections.ts +48 -0
  87. package/site/index.html +89 -0
  88. package/site/mobile/App.vue +437 -0
  89. package/site/mobile/AppHome.vue +154 -0
  90. package/site/mobile/main.ts +99 -0
  91. package/site/mobile/route-sync.spec.ts +34 -0
  92. package/site/mobile/route-sync.ts +10 -0
  93. package/site/mobile.html +70 -0
  94. package/site/module.d.ts +5 -0
  95. package/site/pc/App.vue +44 -0
  96. package/site/pc/Layout.vue +641 -0
  97. package/site/pc/components/AppAd.vue +117 -0
  98. package/site/pc/components/AppHeader.vue +459 -0
  99. package/site/pc/components/AppMobile.spec.ts +204 -0
  100. package/site/pc/components/AppMobile.vue +201 -0
  101. package/site/pc/components/AppOutline.spec.ts +89 -0
  102. package/site/pc/components/AppOutline.vue +161 -0
  103. package/site/pc/components/AppSidebar.vue +144 -0
  104. package/site/pc/components/code-example/CodeExample.spec.ts +36 -0
  105. package/site/pc/components/code-example/CodeExample.vue +164 -0
  106. package/site/pc/components/code-example/codeExample.less +88 -0
  107. package/site/pc/components/code-example/index.ts +10 -0
  108. package/site/pc/components/demo-preview/DemoPreview.vue +92 -0
  109. package/site/pc/components/demo-preview/index.ts +8 -0
  110. package/site/pc/components/mobile-preview-url.ts +17 -0
  111. package/site/pc/components/preview-section.spec.ts +24 -0
  112. package/site/pc/components/preview-section.ts +23 -0
  113. package/site/pc/main.ts +108 -0
  114. package/site/pc/pages/index/index.vue +421 -0
  115. package/site/pc/pages/index/locale/en-US.ts +1 -0
  116. package/site/pc/pages/index/locale/zh-CN.ts +1 -0
  117. package/site/pc/responsive-layout.spec.ts +40 -0
  118. package/site/pc/route-state.spec.ts +34 -0
  119. package/site/pc/route-state.ts +25 -0
  120. package/site/pc/scroll-hash.spec.ts +49 -0
  121. package/site/pc/scroll-hash.ts +25 -0
  122. package/site/route-recovery.spec.ts +51 -0
  123. package/site/route-recovery.ts +38 -0
  124. package/site/tsconfig.json +16 -0
  125. package/site/types.ts +6 -0
  126. package/site/utils.ts +45 -0
  127. package/template/create/[ComponentName].tsx.ejs +16 -0
  128. package/template/create/[ComponentName].vue.ejs +21 -0
  129. package/template/create/[componentName].d.ts.ejs +13 -0
  130. package/template/create/__tests__/index.spec.js.ejs +10 -0
  131. package/template/create/docs/en-US.md +0 -0
  132. package/template/create/docs/zh-CN.md +0 -0
  133. package/template/create/example/index.vue.ejs +17 -0
  134. package/template/create/example/locale/_index.ts +17 -0
  135. package/template/create/example/locale/en-US.ts +3 -0
  136. package/template/create/example/locale/index.ts +24 -0
  137. package/template/create/example/locale/zh-CN.ts +3 -0
  138. package/template/create/index.ts.ejs +12 -0
  139. package/template/create/props.ts +1 -0
  140. package/template/create/style/[componentName].less.ejs +5 -0
  141. package/template/create/style/index.less.ejs +1 -0
  142. package/template/create/style/index.ts.ejs +1 -0
  143. package/template/generators/base/.browserslistrc +2 -0
  144. package/template/generators/base/.prettierignore +14 -0
  145. package/template/generators/base/README.md +90 -0
  146. package/template/generators/base/_gitignore +19 -0
  147. package/template/generators/base/eslint.config.js +15 -0
  148. package/template/generators/base/package.json +97 -0
  149. package/template/generators/base/prettier.config.js +3 -0
  150. package/template/generators/base/public/logo.svg +30 -0
  151. package/template/generators/base/shims/shims-md.d.ts +4 -0
  152. package/template/generators/base/shims/shims-vue.d.ts +6 -0
  153. package/template/generators/base/tsconfig.declaration.json +21 -0
  154. package/template/generators/base/tsconfig.json +28 -0
  155. package/template/generators/base/ui-build.config.mjs +16 -0
  156. package/template/generators/config/default/base/docs/home.zh-CN.md +3 -0
  157. package/template/generators/config/default/base/maple.config.mjs +49 -0
  158. package/template/generators/config/default/sfc/src/button/Button.vue +34 -0
  159. package/template/generators/config/default/sfc/src/button/__tests__/index.spec.js +8 -0
  160. package/template/generators/config/default/sfc/src/button/docs/zh-CN.md +39 -0
  161. package/template/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -0
  162. package/template/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -0
  163. package/template/generators/config/default/sfc/src/button/example/index.vue +12 -0
  164. package/template/generators/config/default/sfc/src/button/index.ts +8 -0
  165. package/template/generators/config/default/sfc/src/button/style/button.less +14 -0
  166. package/template/generators/config/default/sfc/src/button/style/index.less +1 -0
  167. package/template/generators/config/default/sfc/src/button/style/index.ts +1 -0
  168. package/template/generators/config/default/sfc/src/utils/components.ts +20 -0
  169. package/template/generators/config/default/tsx/src/button/Button.tsx +30 -0
  170. package/template/generators/config/default/tsx/src/button/__tests__/index.spec.js +8 -0
  171. package/template/generators/config/default/tsx/src/button/docs/zh-CN.md +39 -0
  172. package/template/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -0
  173. package/template/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -0
  174. package/template/generators/config/default/tsx/src/button/example/index.vue +12 -0
  175. package/template/generators/config/default/tsx/src/button/index.ts +8 -0
  176. package/template/generators/config/default/tsx/src/button/style/button.less +14 -0
  177. package/template/generators/config/default/tsx/src/button/style/index.less +1 -0
  178. package/template/generators/config/default/tsx/src/button/style/index.ts +1 -0
  179. package/template/generators/config/default/tsx/src/utils/components.ts +20 -0
  180. package/template/generators/config/i18n/base/docs/home.en-US.md +3 -0
  181. package/template/generators/config/i18n/base/docs/home.zh-CN.md +3 -0
  182. package/template/generators/config/i18n/base/maple.config.mjs +51 -0
  183. package/template/generators/config/i18n/sfc/src/button/Button.vue +38 -0
  184. package/template/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +8 -0
  185. package/template/generators/config/i18n/sfc/src/button/docs/en-US.md +39 -0
  186. package/template/generators/config/i18n/sfc/src/button/docs/zh-CN.md +39 -0
  187. package/template/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -0
  188. package/template/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -0
  189. package/template/generators/config/i18n/sfc/src/button/example/index.vue +15 -0
  190. package/template/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -0
  191. package/template/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -0
  192. package/template/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -0
  193. package/template/generators/config/i18n/sfc/src/button/index.ts +8 -0
  194. package/template/generators/config/i18n/sfc/src/button/style/button.less +14 -0
  195. package/template/generators/config/i18n/sfc/src/button/style/index.less +1 -0
  196. package/template/generators/config/i18n/sfc/src/button/style/index.ts +1 -0
  197. package/template/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +52 -0
  198. package/template/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -0
  199. package/template/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -0
  200. package/template/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -0
  201. package/template/generators/config/i18n/sfc/src/locale/en-US.ts +7 -0
  202. package/template/generators/config/i18n/sfc/src/locale/index.ts +82 -0
  203. package/template/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -0
  204. package/template/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -0
  205. package/template/generators/config/i18n/sfc/src/utils/components.ts +20 -0
  206. package/template/generators/config/i18n/tsx/src/button/Button.tsx +35 -0
  207. package/template/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +8 -0
  208. package/template/generators/config/i18n/tsx/src/button/docs/en-US.md +39 -0
  209. package/template/generators/config/i18n/tsx/src/button/docs/zh-CN.md +39 -0
  210. package/template/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -0
  211. package/template/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -0
  212. package/template/generators/config/i18n/tsx/src/button/example/index.vue +15 -0
  213. package/template/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -0
  214. package/template/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -0
  215. package/template/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -0
  216. package/template/generators/config/i18n/tsx/src/button/index.ts +8 -0
  217. package/template/generators/config/i18n/tsx/src/button/style/button.less +14 -0
  218. package/template/generators/config/i18n/tsx/src/button/style/index.less +1 -0
  219. package/template/generators/config/i18n/tsx/src/button/style/index.ts +1 -0
  220. package/template/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +52 -0
  221. package/template/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -0
  222. package/template/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -0
  223. package/template/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -0
  224. package/template/generators/config/i18n/tsx/src/locale/en-US.ts +7 -0
  225. package/template/generators/config/i18n/tsx/src/locale/index.ts +82 -0
  226. package/template/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -0
  227. package/template/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -0
  228. package/template/generators/config/i18n/tsx/src/utils/components.ts +20 -0
@@ -0,0 +1,117 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import config from '@config'
4
+ import { IconChevronRight as MIconChevronRight, IconClose as MIconClose } from '@maple-design/icons-vue'
5
+
6
+ defineProps({
7
+ language: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ })
12
+
13
+ const ad = ref(config?.pc?.ad)
14
+ const storageKey = `maple-site-ad-closed-${ad.value?.id}`
15
+ const isClose = ref(localStorage.getItem(storageKey) === 'true')
16
+
17
+ setSiteAddHeight()
18
+
19
+ function setSiteAddHeight() {
20
+ document.documentElement.style.setProperty('--site-ad-height', isClose.value || !ad.value ? '0px' : '52px')
21
+ }
22
+
23
+ function handleClose() {
24
+ localStorage.setItem(`maple-site-ad-closed-${ad.value?.id}`, 'true')
25
+ isClose.value = true
26
+ setSiteAddHeight()
27
+ }
28
+ </script>
29
+
30
+ <template>
31
+ <a
32
+ class="maple-site-ad maple-site-ad--animation"
33
+ :href="ad?.link[language]"
34
+ target="_blank"
35
+ :style="{
36
+ background: ad?.background,
37
+ color: ad?.textColor,
38
+ }"
39
+ >
40
+ <img v-if="ad?.logo" class="maple-site-ad__logo" :style="{ height: ad?.logoHeight }" :src="ad?.logo" />
41
+ <div
42
+ v-if="ad?.description"
43
+ class="maple-site-ad__description"
44
+ :style="{ background: ad?.descriptionBackground, color: ad?.descriptionTextColor }"
45
+ >
46
+ <span>{{ ad?.description?.[language] }}</span>
47
+ <mp-icon style="margin-left: 4px" :size="24"><MIconChevronRight /></mp-icon>
48
+ </div>
49
+ <mp-button class="maple-site-ad__close-button" text round @click.prevent="handleClose">
50
+ <mp-icon :size="20"><MIconClose /></mp-icon>
51
+ </mp-button>
52
+ </a>
53
+ </template>
54
+
55
+ <style lang="less">
56
+ .maple-site-ad {
57
+ width: 100%;
58
+ position: relative;
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: center;
62
+ height: var(--site-ad-height);
63
+ color: var(--site-config-color-bar);
64
+ text-decoration: unset;
65
+ overflow: hidden;
66
+
67
+ @keyframes maple-site-ad-animation {
68
+ from {
69
+ transform: translateX(-100%);
70
+ }
71
+
72
+ to {
73
+ transform: translateX(100%);
74
+ }
75
+ }
76
+
77
+ &__logo {
78
+ height: 36px;
79
+ border-radius: 8px;
80
+ }
81
+
82
+ &__description {
83
+ display: flex;
84
+ align-items: center;
85
+ height: 34px;
86
+ border-radius: 100px;
87
+ padding: 0 18px;
88
+ margin-left: 12px;
89
+ font-size: 15px;
90
+ background: var(--site-config-color-side-bar-active-background);
91
+ color: var(--site-config-color-text);
92
+ }
93
+
94
+ &__close-button {
95
+ position: absolute !important;
96
+ top: 50%;
97
+ right: 35px;
98
+ transform: translateY(-50%);
99
+ }
100
+
101
+ &--animation {
102
+ &::after {
103
+ content: '';
104
+ position: absolute;
105
+ top: 0;
106
+ left: 0;
107
+ width: 100%;
108
+ height: 100%;
109
+ z-index: 1;
110
+ pointer-events: none;
111
+ animation: maple-site-ad-animation 8s infinite;
112
+ background: linear-gradient(90deg, hsla(0, 0%, 100%, 0), hsla(0, 0%, 100%, 0.2), hsla(0, 0%, 100%, 0));
113
+ transition: 0.25s background-color;
114
+ }
115
+ }
116
+ }
117
+ </style>
@@ -0,0 +1,459 @@
1
+ <template>
2
+ <div class="maple-site-header">
3
+ <div class="maple-site-header__lead">
4
+ <img class="maple-site-header__logo" :src="siteLogo" @click="backRoot" />
5
+ <div v-if="title" class="maple-site-header__title" @click="backRoot">{{ title }}</div>
6
+ </div>
7
+
8
+ <nav
9
+ v-if="sections.length > 1"
10
+ class="maple-site-header__sections"
11
+ :aria-label="language === 'en-US' ? 'Documentation areas' : '文档分区'"
12
+ >
13
+ <mp-space size="sm" wrap
14
+ ><mp-button
15
+ v-for="section in sections"
16
+ :key="section.id"
17
+ :status="activeSection === section.id ? 'primary' : 'default'"
18
+ :aria-pressed="activeSection === section.id"
19
+ @click="$emit('section-change', section)"
20
+ >{{ section.text[language] }}</mp-button
21
+ ></mp-space
22
+ >
23
+ </nav>
24
+ <div class="maple-site-header__tail">
25
+ <DirectionToggle />
26
+ <div
27
+ v-if="isShowVersion"
28
+ class="maple-site-header__versions"
29
+ @mouseenter="isOpenVersionsMenu = true"
30
+ @mouseleave="isOpenVersionsMenu = false"
31
+ >
32
+ <span style="font-size: 16px">{{ currentVersion }}</span>
33
+ <mp-icon><MIconChevronDown /></mp-icon>
34
+ <transition name="fade">
35
+ <div
36
+ v-show="isOpenVersionsMenu"
37
+ class="maple-site-header__animation-list maple-site-header__animation-versions mp-elevation--5"
38
+ :style="{ pointerEvents: isOpenVersionsMenu ? 'auto' : 'none' }"
39
+ >
40
+ <mp-cell
41
+ v-for="(i, key) in versionItems"
42
+ :key="key"
43
+ v-ripple
44
+ :class="{ 'maple-site-header__animation-list--active': currentVersion === i.label }"
45
+ @click="open(i.link)"
46
+ >
47
+ {{ i.label }}
48
+ </mp-cell>
49
+ </div>
50
+ </transition>
51
+ </div>
52
+
53
+ <a
54
+ v-if="ai"
55
+ v-ripple
56
+ class="maple-site-header__link"
57
+ style="width: auto; border-radius: 3px; padding: 0 12px; height: 40px"
58
+ target="_blank"
59
+ :href="ai"
60
+ >
61
+ <span>AI Agent</span>
62
+ </a>
63
+ <a
64
+ v-if="changelog"
65
+ v-ripple
66
+ class="maple-site-header__link"
67
+ style="margin-right: 8px"
68
+ target="_blank"
69
+ :href="changelog"
70
+ >
71
+ <mp-icon :size="28"><MIconHistory /></mp-icon>
72
+ </a>
73
+ <a v-if="playground" v-ripple class="maple-site-header__link" target="_blank" :href="playground">
74
+ <mp-icon :size="24"><MIconCodeJson /></mp-icon>
75
+ </a>
76
+ <a v-if="github" v-ripple class="maple-site-header__link" target="_blank" :href="github">
77
+ <mp-icon :size="28"><MIconGithub /></mp-icon>
78
+ </a>
79
+ <div
80
+ v-if="themes.length > 1"
81
+ class="maple-site-header__theme"
82
+ @mouseenter="isOpenThemeMenu = true"
83
+ @mouseleave="isOpenThemeMenu = false"
84
+ >
85
+ <mp-icon :size="28"><MIconPaletteFill /></mp-icon>
86
+ <mp-icon><MIconChevronDown /></mp-icon>
87
+ <transition name="fade">
88
+ <div
89
+ v-show="isOpenThemeMenu"
90
+ class="maple-site-header__animation-list mp-elevation--5"
91
+ :style="{ pointerEvents: isOpenThemeMenu ? 'auto' : 'none' }"
92
+ >
93
+ <mp-cell
94
+ v-for="t in themes"
95
+ :key="t.value"
96
+ v-ripple
97
+ :class="{ 'maple-site-header__animation-list--active': currentTheme === t.value }"
98
+ @click="() => toggleTheme(t.value as Theme)"
99
+ >{{ t[language as keyof typeof t] }}
100
+ </mp-cell>
101
+ </div>
102
+ </transition>
103
+ </div>
104
+ <select
105
+ v-if="Object.keys(nonEmptyLanguages).length > 1"
106
+ class="maple-site-header__language"
107
+ :aria-label="language === 'en-US' ? 'Language' : '语言'"
108
+ :value="language"
109
+ style="color: inherit; background: transparent; border: 0; font: inherit; cursor: pointer"
110
+ @change="handleLanguageChange(($event.target as HTMLSelectElement).value)"
111
+ >
112
+ <option v-for="(value, key) in nonEmptyLanguages" :key="key" :value="key">{{ value }}</option>
113
+ </select>
114
+ </div>
115
+ </div>
116
+ </template>
117
+
118
+ <script lang="ts">
119
+ import { computed, defineComponent, ref } from 'vue'
120
+ import type { ComputedRef, PropType, Ref } from 'vue'
121
+ import config from '@config'
122
+ import { getBrowserTheme, getPCLocationInfo, persistTheme, setTheme, Theme } from '@maple-design/cli-vue/client'
123
+ import {
124
+ IconChevronDown as MIconChevronDown,
125
+ IconCodeJson as MIconCodeJson,
126
+ IconGithub as MIconGithub,
127
+ IconHistory as MIconHistory,
128
+ IconPaletteFill as MIconPaletteFill,
129
+ } from '@maple-design/icons-vue'
130
+ import { DirectionToggle } from '@sparknest/ui-doc-preview-vue'
131
+ import { useRouter } from 'vue-router'
132
+ import type { DocumentationSection } from '../../documentation-sections'
133
+ import { removeEmpty, resolveSiteAsset } from '../../utils'
134
+
135
+ export default defineComponent({
136
+ components: { DirectionToggle, MIconChevronDown, MIconHistory, MIconCodeJson, MIconGithub, MIconPaletteFill },
137
+ name: 'AppHeader',
138
+ emits: ['section-change'],
139
+ props: {
140
+ sections: { type: Array as PropType<DocumentationSection[]>, default: () => [] },
141
+ activeSection: String,
142
+ language: {
143
+ type: String,
144
+ },
145
+ },
146
+ setup() {
147
+ const title: Ref<string> = ref(config?.title)
148
+ const siteLogo = resolveSiteAsset(config?.logo)
149
+ const languages: Ref<Record<string, string>> = ref(config?.pc?.header?.i18n ?? {})
150
+ const currentVersion: Ref<string> = ref(config?.pc?.header?.currentVersion ?? '')
151
+ const versions = config?.pc?.header?.versions
152
+ const isShowVersion: Ref<boolean> = ref(!!versions)
153
+ const versionItems: Ref<Array<Record<string, any>>> = ref(
154
+ (versions ?? []).find((i: any) => window.location.host.includes(i.name))?.items ?? versions?.[0]?.items ?? [],
155
+ )
156
+ const playground: Ref<string> = ref(config?.pc?.header?.playground)
157
+ const github: Ref<string> = ref(config?.pc?.header?.github)
158
+ const themes: Ref<Record<string, any>> = ref(config?.pc?.header?.themes ?? {})
159
+ const changelog: Ref<string> = ref(config?.pc?.header?.changelog)
160
+ const ai: Ref<string> = ref(config?.pc?.header?.ai)
161
+ const redirect = config?.pc?.redirect ?? ''
162
+ const darkMode: Ref<boolean> = ref(config?.pc?.header?.darkMode ?? false)
163
+ const currentTheme = ref(getBrowserTheme('site'))
164
+
165
+ const isOpenThemeMenu: Ref<boolean> = ref(false)
166
+ const isOpenVersionsMenu: Ref<boolean> = ref(false)
167
+ const router = useRouter()
168
+ const nonEmptyLanguages: ComputedRef<Record<string, string>> = computed(() => removeEmpty(languages.value))
169
+
170
+ const backRoot = () => {
171
+ const { language: lang } = getPCLocationInfo()
172
+ router.replace(`/${lang}${redirect}`)
173
+ }
174
+
175
+ const handleLanguageChange = (language: string) => {
176
+ const current = router.currentRoute.value
177
+ router.push({ path: current.path.replace(/^\/[^/]+/, `/${language}`), query: current.query, hash: current.hash })
178
+ }
179
+
180
+ const setCurrentTheme = (theme: Theme) => {
181
+ currentTheme.value = theme
182
+ setTheme(theme)
183
+ persistTheme(theme, 'site')
184
+ persistTheme(theme, 'demo')
185
+
186
+ for (const id of ['mobile', 'playground']) {
187
+ const frame = document.getElementById(id) as HTMLIFrameElement | null
188
+ frame?.contentWindow?.postMessage({ action: 'theme-change', data: theme, from: 'pc' }, '*')
189
+ }
190
+ }
191
+
192
+ const toggleTheme = (value: Theme) => {
193
+ setCurrentTheme(value)
194
+ isOpenThemeMenu.value = false
195
+ }
196
+
197
+ const open = (value: string) => {
198
+ window.location.href = value
199
+ }
200
+
201
+ setTheme(currentTheme.value)
202
+
203
+ return {
204
+ siteLogo,
205
+ config,
206
+ title,
207
+ currentVersion,
208
+ languages,
209
+ isShowVersion,
210
+ versionItems,
211
+ themes,
212
+ nonEmptyLanguages,
213
+ playground,
214
+ changelog,
215
+ ai,
216
+ github,
217
+ isOpenVersionsMenu,
218
+ isOpenThemeMenu,
219
+ darkMode,
220
+ currentTheme,
221
+ open,
222
+ backRoot,
223
+ handleLanguageChange,
224
+ toggleTheme,
225
+ }
226
+ },
227
+ })
228
+ </script>
229
+
230
+ <style lang="less">
231
+ .maple-site-header {
232
+ position: sticky;
233
+ top: 0;
234
+ left: 0;
235
+ display: flex;
236
+ align-items: center;
237
+ width: 100%;
238
+ height: 60px;
239
+ padding: 0 30px;
240
+ justify-content: space-between;
241
+ user-select: none;
242
+ z-index: 9;
243
+ background: var(--site-config-color-bar);
244
+ border-bottom: 1px solid var(--site-config-color-border);
245
+ box-sizing: border-box;
246
+
247
+ &__lead {
248
+ display: flex;
249
+ align-items: center;
250
+ cursor: pointer;
251
+ }
252
+
253
+ &__logo {
254
+ width: 36px;
255
+ height: 36px;
256
+ margin-right: 10px;
257
+ flex-shrink: 0;
258
+ display: block;
259
+ object-fit: contain;
260
+ transition: 0.3s all ease-in-out;
261
+ }
262
+
263
+ &__title {
264
+ font-size: 22px;
265
+ margin-right: 12px;
266
+ }
267
+
268
+ &__tail {
269
+ display: flex;
270
+ align-items: center;
271
+ }
272
+
273
+ &__versions {
274
+ border-radius: 3px;
275
+ height: 40px;
276
+ display: flex;
277
+ align-items: center;
278
+ padding-right: 10px;
279
+ padding-left: 18px;
280
+ position: relative;
281
+ cursor: pointer;
282
+ transition: background-color 0.25s;
283
+ margin-right: 4px;
284
+
285
+ &:hover {
286
+ background: var(--site-config-color-nav-button-hover-background);
287
+ }
288
+ }
289
+
290
+ &__link {
291
+ border-radius: 50%;
292
+ width: 42px;
293
+ height: 42px;
294
+ display: flex;
295
+ justify-content: center;
296
+ align-items: center;
297
+ cursor: pointer;
298
+ text-decoration: none;
299
+ color: var(--site-config-color-text);
300
+ transition: background-color 0.25s;
301
+ margin-right: 6px;
302
+
303
+ a {
304
+ text-decoration: none;
305
+ }
306
+
307
+ &:hover {
308
+ background: var(--site-config-color-nav-button-hover-background);
309
+ }
310
+ }
311
+
312
+ &__language {
313
+ border-radius: 3px;
314
+ height: 40px;
315
+ display: flex;
316
+ align-items: center;
317
+ padding: 0 10px;
318
+ position: relative;
319
+ cursor: pointer;
320
+ transition: background-color 0.25s;
321
+
322
+ &:hover {
323
+ background: var(--site-config-color-nav-button-hover-background);
324
+ }
325
+ }
326
+
327
+ &__theme {
328
+ border-radius: 3px;
329
+ height: 40px;
330
+ display: flex;
331
+ align-items: center;
332
+ padding: 0 10px;
333
+ position: relative;
334
+ cursor: pointer;
335
+ transition: background-color 0.25s;
336
+ margin-right: 6px;
337
+
338
+ &:hover {
339
+ background: var(--site-config-color-nav-button-hover-background);
340
+ }
341
+ }
342
+
343
+ &__animation-list {
344
+ background: var(--site-config-color-bar);
345
+ cursor: pointer;
346
+ color: var(--site-config-color-text);
347
+ border-radius: 2px;
348
+ position: absolute;
349
+ top: 40px;
350
+ left: -20px;
351
+
352
+ .mp-cell {
353
+ width: 100px !important;
354
+ color: var(--site-config-color-text);
355
+
356
+ &__content {
357
+ color: inherit !important;
358
+ }
359
+ }
360
+
361
+ &--active {
362
+ background: var(--site-config-color-pc-language-active-background) !important;
363
+ color: var(--site-config-color-pc-language-active) !important;
364
+ }
365
+ }
366
+
367
+ &__theme-animation-list {
368
+ background: var(--site-config-color-bar);
369
+ cursor: pointer;
370
+ color: var(--site-config-color-text);
371
+ border-radius: 2px;
372
+ position: absolute;
373
+ top: 40px;
374
+ left: -20px;
375
+
376
+ .mp-cell {
377
+ width: 100px !important;
378
+ color: var(--site-config-color-text);
379
+
380
+ &__content {
381
+ color: inherit !important;
382
+ }
383
+ }
384
+
385
+ &--active {
386
+ background: var(--site-config-color-pc-theme-active-background) !important;
387
+ color: var(--site-config-color-pc-theme-active) !important;
388
+ }
389
+ }
390
+
391
+ &__animation-versions {
392
+ left: -7px;
393
+ }
394
+
395
+ @media screen and (max-width: 562px) {
396
+ padding: 0 16px;
397
+
398
+ &__versions,
399
+ &__link,
400
+ &__theme {
401
+ display: none;
402
+ }
403
+ }
404
+ }
405
+ </style>
406
+
407
+ <style lang="less" scoped>
408
+ .fade-enter-active {
409
+ animation-name: fade-in;
410
+ animation-duration: 0.3s;
411
+ }
412
+
413
+ .fade-leave-active {
414
+ animation-name: fade-leave;
415
+ animation-duration: 0.3s;
416
+ }
417
+
418
+ @keyframes fade-in {
419
+ 0% {
420
+ top: 30px;
421
+ opacity: 0;
422
+ }
423
+ 100% {
424
+ top: 40px;
425
+ opacity: 1;
426
+ }
427
+ }
428
+
429
+ @keyframes fade-leave {
430
+ 0% {
431
+ top: 40px;
432
+ opacity: 1;
433
+ }
434
+ 100% {
435
+ top: 30px;
436
+ opacity: 0;
437
+ }
438
+ }
439
+ </style>
440
+
441
+ <style scoped>
442
+ .maple-site-header__sections {
443
+ margin: 0 16px;
444
+ }
445
+ @media (max-width: 900px) {
446
+ .maple-site-header {
447
+ height: auto;
448
+ min-height: 60px;
449
+ flex-wrap: wrap;
450
+ gap: 8px;
451
+ padding: 10px 16px;
452
+ }
453
+ .maple-site-header__sections {
454
+ order: 3;
455
+ width: 100%;
456
+ margin: 0;
457
+ }
458
+ }
459
+ </style>