vitepress-theme-element-plus 1.3.1 → 1.4.0

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 (45) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +3 -3
  3. package/client/components/A11yTag.vue +29 -29
  4. package/client/components/ApiTyping.vue +54 -54
  5. package/client/components/Backdrop.vue +41 -41
  6. package/client/components/Bili.vue +94 -94
  7. package/client/components/Content.vue +148 -148
  8. package/client/components/DeprecatedTag.vue +19 -19
  9. package/client/components/Doc.vue +219 -185
  10. package/client/components/DocAside.vue +46 -46
  11. package/client/components/DocAsideOutline.vue +145 -145
  12. package/client/components/DocFooter.vue +162 -162
  13. package/client/components/Footer.vue +100 -100
  14. package/client/components/FooterCopyright.vue +27 -27
  15. package/client/components/Layout.vue +159 -156
  16. package/client/components/Link.vue +41 -41
  17. package/client/components/LocalNav.vue +160 -160
  18. package/client/components/MobilePreviewFrame.vue +175 -0
  19. package/client/components/MobilePreviewLayout.vue +140 -0
  20. package/client/components/Nav.vue +69 -69
  21. package/client/components/NavBar.vue +203 -203
  22. package/client/components/NavBarTitle.vue +89 -89
  23. package/client/components/Sidebar.vue +129 -129
  24. package/client/components/SidebarGroup.vue +51 -51
  25. package/client/components/SidebarItem.vue +304 -304
  26. package/client/components/ThemeToggler.vue +129 -129
  27. package/client/components/VPNavBarSearch.vue +23 -23
  28. package/client/hooks/useBackTop.ts +71 -71
  29. package/client/hooks/useLangs.ts +50 -50
  30. package/client/hooks/useSidebarControl.ts +78 -78
  31. package/client/hooks/useSize.ts +69 -69
  32. package/client/icons/dark.vue +8 -8
  33. package/client/icons/light.vue +8 -8
  34. package/client/mobile-preview.ts +60 -0
  35. package/client/utils/client/common.ts +49 -49
  36. package/client/utils/client/outline.ts +116 -116
  37. package/client/utils/common.ts +90 -90
  38. package/index.ts +57 -45
  39. package/package.json +2 -2
  40. package/shared/constants.ts +3 -3
  41. package/styles/base.scss +105 -105
  42. package/styles/code.scss +290 -290
  43. package/styles/doc-content.scss +363 -363
  44. package/styles/index.scss +71 -71
  45. package/styles/tag-content.scss +30 -30
@@ -1,69 +1,69 @@
1
- <script setup lang="ts">
2
- import { inBrowser } from 'vitepress'
3
- import { useData } from 'vitepress/client'
4
- import VPNavScreen from 'vitepress/dist/client/theme-default/components/VPNavScreen.vue'
5
- import { navInjectionKey, useNav } from 'vitepress/dist/client/theme-default/composables/nav.js'
6
- import { computed, provide, watchEffect } from 'vue'
7
- import NavBar from './NavBar.vue'
8
-
9
- const { isScreenOpen, closeScreen, toggleScreen } = useNav()
10
- const { frontmatter } = useData()
11
-
12
- const hasNavbar = computed(() => {
13
- return frontmatter.value.navbar !== false
14
- })
15
-
16
- provide(navInjectionKey, { closeScreen })
17
-
18
- watchEffect(() => {
19
- if (inBrowser) {
20
- document.documentElement.classList.toggle('hide-nav', !hasNavbar.value)
21
- }
22
- })
23
- </script>
24
-
25
- <template>
26
- <header v-if="hasNavbar" class="VPNav">
27
- <NavBar :is-screen-open="isScreenOpen" @toggle-screen="toggleScreen">
28
- <template #nav-bar-title-before>
29
- <slot name="nav-bar-title-before" />
30
- </template>
31
- <template #nav-bar-title-after>
32
- <slot name="nav-bar-title-after" />
33
- </template>
34
- <template #nav-bar-content-before>
35
- <slot name="nav-bar-content-before" />
36
- </template>
37
- <template #nav-bar-content-after>
38
- <slot name="nav-bar-content-after" />
39
- </template>
40
- </NavBar>
41
- <VPNavScreen :open="isScreenOpen">
42
- <template #nav-screen-content-before>
43
- <slot name="nav-screen-content-before" />
44
- </template>
45
- <template #nav-screen-content-after>
46
- <slot name="nav-screen-content-after" />
47
- </template>
48
- </VPNavScreen>
49
- </header>
50
- </template>
51
-
52
- <style scoped>
53
- .VPNav {
54
- position: relative;
55
- top: var(--vp-layout-top-height, 0px);
56
- /*rtl:ignore*/
57
- left: 0;
58
- z-index: var(--vp-z-index-nav);
59
- width: 100%;
60
- pointer-events: none;
61
- transition: background-color 0.5s;
62
- }
63
-
64
- @media (min-width: 960px) {
65
- .VPNav {
66
- position: fixed;
67
- }
68
- }
69
- </style>
1
+ <script setup lang="ts">
2
+ import { inBrowser } from 'vitepress'
3
+ import { useData } from 'vitepress/client'
4
+ import VPNavScreen from 'vitepress/dist/client/theme-default/components/VPNavScreen.vue'
5
+ import { navInjectionKey, useNav } from 'vitepress/dist/client/theme-default/composables/nav.js'
6
+ import { computed, provide, watchEffect } from 'vue'
7
+ import NavBar from './NavBar.vue'
8
+
9
+ const { isScreenOpen, closeScreen, toggleScreen } = useNav()
10
+ const { frontmatter } = useData()
11
+
12
+ const hasNavbar = computed(() => {
13
+ return frontmatter.value.navbar !== false
14
+ })
15
+
16
+ provide(navInjectionKey, { closeScreen })
17
+
18
+ watchEffect(() => {
19
+ if (inBrowser) {
20
+ document.documentElement.classList.toggle('hide-nav', !hasNavbar.value)
21
+ }
22
+ })
23
+ </script>
24
+
25
+ <template>
26
+ <header v-if="hasNavbar" class="VPNav">
27
+ <NavBar :is-screen-open="isScreenOpen" @toggle-screen="toggleScreen">
28
+ <template #nav-bar-title-before>
29
+ <slot name="nav-bar-title-before" />
30
+ </template>
31
+ <template #nav-bar-title-after>
32
+ <slot name="nav-bar-title-after" />
33
+ </template>
34
+ <template #nav-bar-content-before>
35
+ <slot name="nav-bar-content-before" />
36
+ </template>
37
+ <template #nav-bar-content-after>
38
+ <slot name="nav-bar-content-after" />
39
+ </template>
40
+ </NavBar>
41
+ <VPNavScreen :open="isScreenOpen">
42
+ <template #nav-screen-content-before>
43
+ <slot name="nav-screen-content-before" />
44
+ </template>
45
+ <template #nav-screen-content-after>
46
+ <slot name="nav-screen-content-after" />
47
+ </template>
48
+ </VPNavScreen>
49
+ </header>
50
+ </template>
51
+
52
+ <style scoped>
53
+ .VPNav {
54
+ position: relative;
55
+ top: var(--vp-layout-top-height, 0px);
56
+ /*rtl:ignore*/
57
+ left: 0;
58
+ z-index: var(--vp-z-index-nav);
59
+ width: 100%;
60
+ pointer-events: none;
61
+ transition: background-color 0.5s;
62
+ }
63
+
64
+ @media (min-width: 960px) {
65
+ .VPNav {
66
+ position: fixed;
67
+ }
68
+ }
69
+ </style>
@@ -1,203 +1,203 @@
1
- <script lang="ts" setup>
2
- import { useWindowScroll } from '@vueuse/core'
3
- import { useData } from 'vitepress'
4
- import VPNavBarExtra from 'vitepress/dist/client/theme-default/components/VPNavBarExtra.vue'
5
- import VPNavBarHamburger from 'vitepress/dist/client/theme-default/components/VPNavBarHamburger.vue'
6
- import VPNavBarMenu from 'vitepress/dist/client/theme-default/components/VPNavBarMenu.vue'
7
- import VPNavBarSocialLinks from 'vitepress/dist/client/theme-default/components/VPNavBarSocialLinks.vue'
8
- import VPNavBarTranslations from 'vitepress/dist/client/theme-default/components/VPNavBarTranslations.vue'
9
- import { ref, watchPostEffect } from 'vue'
10
- import VPNavBarTitle from './NavBarTitle.vue'
11
- import ThemeToggler from './ThemeToggler.vue'
12
- import VPNavBarSearch from './VPNavBarSearch.vue'
13
-
14
- const props = defineProps<{
15
- isScreenOpen: boolean
16
- }>()
17
-
18
- defineEmits<{
19
- (e: 'toggleScreen'): void
20
- }>()
21
-
22
- const { y } = useWindowScroll()
23
- const { frontmatter } = useData()
24
- const classes = ref<Record<string, boolean>>({})
25
-
26
- watchPostEffect(() => {
27
- classes.value = {
28
- 'home': frontmatter.value.layout === 'home',
29
- 'top': y.value === 0,
30
- 'screen-open': props.isScreenOpen,
31
- }
32
- })
33
- </script>
34
-
35
- <template>
36
- <div class="VPNavBar" :class="classes">
37
- <div class="wrapper">
38
- <div class="container">
39
- <div class="title">
40
- <VPNavBarTitle>
41
- <template #nav-bar-title-before>
42
- <slot name="nav-bar-title-before" />
43
- </template>
44
- <template #nav-bar-title-after>
45
- <slot name="nav-bar-title-after" />
46
- </template>
47
- </VPNavBarTitle>
48
- </div>
49
-
50
- <div class="content">
51
- <div class="content-body">
52
- <slot name="nav-bar-content-before" />
53
- <VPNavBarSearch class="search" />
54
- <VPNavBarMenu class="menu" />
55
- <VPNavBarTranslations class="translations" />
56
- <ThemeToggler class="appearance" />
57
- <VPNavBarSocialLinks class="social-links" />
58
- <VPNavBarExtra class="extra" />
59
- <slot name="nav-bar-content-after" />
60
- <VPNavBarHamburger class="hamburger" :active="isScreenOpen" @click="$emit('toggleScreen')" />
61
- </div>
62
- </div>
63
- </div>
64
- </div>
65
-
66
- <div class="divider">
67
- <div class="divider-line" />
68
- </div>
69
- </div>
70
- </template>
71
-
72
- <style scoped lang="scss">
73
- .VPNavBar {
74
- position: relative;
75
- height: var(--vp-nav-height);
76
- pointer-events: none;
77
- white-space: nowrap;
78
- transition: background-color 0.25s;
79
- background-image: radial-gradient(transparent 1px, var(--vp-c-bg) 1px);
80
- background-size: 4px 4px;
81
- backdrop-filter: saturate(50%) blur(4px);
82
- -webkit-backdrop-filter: saturate(50%) blur(4px);
83
- }
84
-
85
- .VPNavBar.screen-open {
86
- transition: none;
87
- background-color: var(--vp-nav-bg-color);
88
- border-bottom: 1px solid var(--vp-c-divider);
89
- }
90
-
91
- .VPNavBar:not(.home) {
92
- background-color: var(--vp-nav-bg-color);
93
- }
94
-
95
- :deep(.VPNavBarMenuLink) {
96
- border-bottom: 2px solid transparent;
97
- }
98
-
99
- :deep(.VPNavBarMenuLink.active) {
100
- border-bottom-color: var(--vp-c-brand);
101
- }
102
-
103
- @media (min-width: 960px) {
104
- .VPNavBar:not(.home) {
105
- background-color: transparent;
106
- }
107
- }
108
-
109
- .wrapper {
110
- padding: 0 8px 0 24px;
111
- }
112
-
113
- @media (min-width: 768px) {
114
- .wrapper {
115
- padding: 0 32px;
116
- }
117
- }
118
-
119
- @media screen and (min-width: var(--vp-layout-max-width)) {
120
- .wrapper {
121
- padding: 0px 48px;
122
- }
123
- }
124
-
125
- .container {
126
- display: flex;
127
- justify-content: space-between;
128
- margin: 0 auto;
129
- height: var(--vp-nav-height);
130
- pointer-events: none;
131
- }
132
-
133
- .container > .title,
134
- .container > .content {
135
- pointer-events: none;
136
- }
137
-
138
- .container :deep(*) {
139
- pointer-events: auto;
140
- }
141
-
142
- .title {
143
- flex-shrink: 0;
144
- height: calc(var(--vp-nav-height) - 1px);
145
- transition: background-color 0.5s;
146
- }
147
-
148
- .content {
149
- flex-grow: 1;
150
- }
151
-
152
- .content-body {
153
- display: flex;
154
- justify-content: flex-end;
155
- align-items: center;
156
- height: var(--vp-nav-height);
157
- transition: background-color 0.5s;
158
- }
159
-
160
- @media (max-width: 767px) {
161
- .content-body {
162
- column-gap: 0.5rem;
163
- }
164
- }
165
-
166
- .menu + .translations::before,
167
- .menu + .appearance::before,
168
- .menu + .social-links::before,
169
- .translations + .appearance::before,
170
- .appearance + .social-links::before {
171
- margin-right: 8px;
172
- margin-left: 8px;
173
- width: 1px;
174
- height: 24px;
175
- background-color: var(--vp-c-divider);
176
- content: '';
177
- }
178
-
179
- .menu + .appearance::before,
180
- .translations + .appearance::before {
181
- margin-right: 16px;
182
- }
183
-
184
- .appearance + .social-links::before {
185
- margin-left: 16px;
186
- }
187
-
188
- .social-links {
189
- margin-right: -8px;
190
- }
191
-
192
- .divider {
193
- width: 100%;
194
- height: 1px;
195
- }
196
-
197
- .divider-line {
198
- width: 100%;
199
- height: 1px;
200
- transition: background-color 0.5s;
201
- background-color: var(--vp-c-gutter);
202
- }
203
- </style>
1
+ <script lang="ts" setup>
2
+ import { useWindowScroll } from '@vueuse/core'
3
+ import { useData } from 'vitepress'
4
+ import VPNavBarExtra from 'vitepress/dist/client/theme-default/components/VPNavBarExtra.vue'
5
+ import VPNavBarHamburger from 'vitepress/dist/client/theme-default/components/VPNavBarHamburger.vue'
6
+ import VPNavBarMenu from 'vitepress/dist/client/theme-default/components/VPNavBarMenu.vue'
7
+ import VPNavBarSocialLinks from 'vitepress/dist/client/theme-default/components/VPNavBarSocialLinks.vue'
8
+ import VPNavBarTranslations from 'vitepress/dist/client/theme-default/components/VPNavBarTranslations.vue'
9
+ import { ref, watchPostEffect } from 'vue'
10
+ import VPNavBarTitle from './NavBarTitle.vue'
11
+ import ThemeToggler from './ThemeToggler.vue'
12
+ import VPNavBarSearch from './VPNavBarSearch.vue'
13
+
14
+ const props = defineProps<{
15
+ isScreenOpen: boolean
16
+ }>()
17
+
18
+ defineEmits<{
19
+ (e: 'toggleScreen'): void
20
+ }>()
21
+
22
+ const { y } = useWindowScroll()
23
+ const { frontmatter } = useData()
24
+ const classes = ref<Record<string, boolean>>({})
25
+
26
+ watchPostEffect(() => {
27
+ classes.value = {
28
+ 'home': frontmatter.value.layout === 'home',
29
+ 'top': y.value === 0,
30
+ 'screen-open': props.isScreenOpen,
31
+ }
32
+ })
33
+ </script>
34
+
35
+ <template>
36
+ <div class="VPNavBar" :class="classes">
37
+ <div class="wrapper">
38
+ <div class="container">
39
+ <div class="title">
40
+ <VPNavBarTitle>
41
+ <template #nav-bar-title-before>
42
+ <slot name="nav-bar-title-before" />
43
+ </template>
44
+ <template #nav-bar-title-after>
45
+ <slot name="nav-bar-title-after" />
46
+ </template>
47
+ </VPNavBarTitle>
48
+ </div>
49
+
50
+ <div class="content">
51
+ <div class="content-body">
52
+ <slot name="nav-bar-content-before" />
53
+ <VPNavBarSearch class="search" />
54
+ <VPNavBarMenu class="menu" />
55
+ <VPNavBarTranslations class="translations" />
56
+ <ThemeToggler class="appearance" />
57
+ <VPNavBarSocialLinks class="social-links" />
58
+ <VPNavBarExtra class="extra" />
59
+ <slot name="nav-bar-content-after" />
60
+ <VPNavBarHamburger class="hamburger" :active="isScreenOpen" @click="$emit('toggleScreen')" />
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+
66
+ <div class="divider">
67
+ <div class="divider-line" />
68
+ </div>
69
+ </div>
70
+ </template>
71
+
72
+ <style scoped lang="scss">
73
+ .VPNavBar {
74
+ position: relative;
75
+ height: var(--vp-nav-height);
76
+ pointer-events: none;
77
+ white-space: nowrap;
78
+ transition: background-color 0.25s;
79
+ background-image: radial-gradient(transparent 1px, var(--vp-c-bg) 1px);
80
+ background-size: 4px 4px;
81
+ backdrop-filter: saturate(50%) blur(4px);
82
+ -webkit-backdrop-filter: saturate(50%) blur(4px);
83
+ }
84
+
85
+ .VPNavBar.screen-open {
86
+ transition: none;
87
+ background-color: var(--vp-nav-bg-color);
88
+ border-bottom: 1px solid var(--vp-c-divider);
89
+ }
90
+
91
+ .VPNavBar:not(.home) {
92
+ background-color: var(--vp-nav-bg-color);
93
+ }
94
+
95
+ :deep(.VPNavBarMenuLink) {
96
+ border-bottom: 2px solid transparent;
97
+ }
98
+
99
+ :deep(.VPNavBarMenuLink.active) {
100
+ border-bottom-color: var(--vp-c-brand);
101
+ }
102
+
103
+ @media (min-width: 960px) {
104
+ .VPNavBar:not(.home) {
105
+ background-color: transparent;
106
+ }
107
+ }
108
+
109
+ .wrapper {
110
+ padding: 0 8px 0 24px;
111
+ }
112
+
113
+ @media (min-width: 768px) {
114
+ .wrapper {
115
+ padding: 0 32px;
116
+ }
117
+ }
118
+
119
+ @media screen and (min-width: var(--vp-layout-max-width)) {
120
+ .wrapper {
121
+ padding: 0px 48px;
122
+ }
123
+ }
124
+
125
+ .container {
126
+ display: flex;
127
+ justify-content: space-between;
128
+ margin: 0 auto;
129
+ height: var(--vp-nav-height);
130
+ pointer-events: none;
131
+ }
132
+
133
+ .container > .title,
134
+ .container > .content {
135
+ pointer-events: none;
136
+ }
137
+
138
+ .container :deep(*) {
139
+ pointer-events: auto;
140
+ }
141
+
142
+ .title {
143
+ flex-shrink: 0;
144
+ height: calc(var(--vp-nav-height) - 1px);
145
+ transition: background-color 0.5s;
146
+ }
147
+
148
+ .content {
149
+ flex-grow: 1;
150
+ }
151
+
152
+ .content-body {
153
+ display: flex;
154
+ justify-content: flex-end;
155
+ align-items: center;
156
+ height: var(--vp-nav-height);
157
+ transition: background-color 0.5s;
158
+ }
159
+
160
+ @media (max-width: 767px) {
161
+ .content-body {
162
+ column-gap: 0.5rem;
163
+ }
164
+ }
165
+
166
+ .menu + .translations::before,
167
+ .menu + .appearance::before,
168
+ .menu + .social-links::before,
169
+ .translations + .appearance::before,
170
+ .appearance + .social-links::before {
171
+ margin-right: 8px;
172
+ margin-left: 8px;
173
+ width: 1px;
174
+ height: 24px;
175
+ background-color: var(--vp-c-divider);
176
+ content: '';
177
+ }
178
+
179
+ .menu + .appearance::before,
180
+ .translations + .appearance::before {
181
+ margin-right: 16px;
182
+ }
183
+
184
+ .appearance + .social-links::before {
185
+ margin-left: 16px;
186
+ }
187
+
188
+ .social-links {
189
+ margin-right: -8px;
190
+ }
191
+
192
+ .divider {
193
+ width: 100%;
194
+ height: 1px;
195
+ }
196
+
197
+ .divider-line {
198
+ width: 100%;
199
+ height: 1px;
200
+ transition: background-color 0.5s;
201
+ background-color: var(--vp-c-gutter);
202
+ }
203
+ </style>