vitepress 1.0.0-draft.2 → 1.0.0-draft.5

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 (127) hide show
  1. package/README.md +3 -1
  2. package/bin/vitepress.js +1 -1
  3. package/dist/client/app/composables/head.js +2 -2
  4. package/dist/client/app/data.js +2 -4
  5. package/dist/client/app/index.js +1 -5
  6. package/dist/client/index.d.ts +123 -134
  7. package/dist/client/index.js +1 -2
  8. package/dist/client/shared.js +21 -0
  9. package/dist/client/theme-default/Layout.vue +7 -0
  10. package/dist/client/theme-default/NotFound.vue +74 -14
  11. package/dist/client/theme-default/components/VPBox.vue +1 -5
  12. package/dist/client/theme-default/components/VPCarbonAds.vue +90 -0
  13. package/dist/client/theme-default/components/VPContent.vue +14 -10
  14. package/dist/client/theme-default/components/VPDoc.vue +73 -58
  15. package/dist/client/theme-default/components/VPDocAside.vue +34 -0
  16. package/dist/client/theme-default/components/VPDocAsideCarbonAds.vue +13 -0
  17. package/dist/client/theme-default/components/{VPDocOutline.vue → VPDocAsideOutline.vue} +14 -3
  18. package/dist/client/theme-default/components/VPDocAsideSponsors.vue +32 -0
  19. package/dist/client/theme-default/components/VPDocFooter.vue +1 -1
  20. package/dist/client/theme-default/components/VPFlyout.vue +2 -3
  21. package/dist/client/theme-default/components/VPFooter.vue +1 -1
  22. package/dist/client/theme-default/components/VPHero.vue +3 -3
  23. package/dist/client/theme-default/components/VPHomeSponsors.vue +3 -7
  24. package/dist/client/theme-default/components/VPLink.vue +2 -1
  25. package/dist/client/theme-default/components/VPLocalNav.vue +1 -1
  26. package/dist/client/theme-default/components/VPMenu.vue +8 -13
  27. package/dist/client/theme-default/components/VPMenuLink.vue +10 -4
  28. package/dist/client/theme-default/components/VPNav.vue +18 -1
  29. package/dist/client/theme-default/components/VPNavBar.vue +20 -8
  30. package/dist/client/theme-default/components/VPNavBarExtra.vue +20 -41
  31. package/dist/client/theme-default/components/VPNavBarMenuGroup.vue +2 -8
  32. package/dist/client/theme-default/components/VPNavBarMenuLink.vue +3 -3
  33. package/dist/client/theme-default/components/VPNavBarSearch.vue +6 -6
  34. package/dist/client/theme-default/components/VPNavBarTitle.vue +4 -2
  35. package/dist/client/theme-default/components/VPNavBarTranslations.vue +10 -39
  36. package/dist/client/theme-default/components/VPNavScreenMenuGroup.vue +1 -2
  37. package/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue +1 -1
  38. package/dist/client/theme-default/components/VPSidebar.vue +12 -6
  39. package/dist/client/theme-default/components/VPSidebarGroup.vue +80 -17
  40. package/dist/client/theme-default/components/VPSidebarLink.vue +2 -9
  41. package/dist/client/theme-default/components/VPSocialLink.vue +2 -2
  42. package/dist/client/theme-default/components/VPSocialLinks.vue +1 -1
  43. package/dist/client/theme-default/components/VPSponsors.vue +15 -40
  44. package/dist/client/theme-default/components/VPSponsorsGrid.vue +2 -2
  45. package/dist/client/theme-default/components/icons/VPIconMinus.vue +5 -0
  46. package/dist/client/theme-default/components/icons/VPIconMinusSquare.vue +6 -0
  47. package/dist/client/theme-default/components/icons/VPIconPlusSquare.vue +6 -0
  48. package/dist/client/theme-default/composables/aside.js +17 -0
  49. package/dist/client/theme-default/composables/copy-code.js +33 -0
  50. package/dist/client/theme-default/composables/outline.js +14 -4
  51. package/dist/client/theme-default/composables/sponsor-grid.js +8 -6
  52. package/dist/client/theme-default/index.js +4 -2
  53. package/dist/client/theme-default/styles/base.css +9 -1
  54. package/dist/client/theme-default/styles/components/custom-block.css +90 -0
  55. package/dist/client/theme-default/styles/{vp-doc.css → components/vp-doc.css} +152 -115
  56. package/dist/client/theme-default/styles/{vp-sponsor.css → components/vp-sponsor.css} +51 -7
  57. package/dist/client/theme-default/styles/vars.css +109 -58
  58. package/dist/node/cli.js +295 -37
  59. package/dist/node/index.d.ts +371 -361
  60. package/dist/node/index.js +22 -22
  61. package/dist/node/serve-f7c10936.js +64795 -0
  62. package/dist/node-cjs/cli.cjs +304 -0
  63. package/dist/node-cjs/index.cjs +38 -0
  64. package/dist/{node/serve-b5dc02b2.js → node-cjs/serve-c220f0a8.cjs} +27511 -28708
  65. package/package.json +47 -40
  66. package/theme.d.ts +7 -2
  67. package/types/default-theme.d.ts +15 -2
  68. package/types/shared.d.ts +3 -0
  69. package/dist/client/theme-default/composables/sponsor.js +0 -87
  70. package/dist/node/alias.js +0 -60
  71. package/dist/node/alias.js.map +0 -1
  72. package/dist/node/build/build.js +0 -57
  73. package/dist/node/build/build.js.map +0 -1
  74. package/dist/node/build/buildMPAClient.js +0 -44
  75. package/dist/node/build/buildMPAClient.js.map +0 -1
  76. package/dist/node/build/bundle.js +0 -163
  77. package/dist/node/build/bundle.js.map +0 -1
  78. package/dist/node/build/render.js +0 -185
  79. package/dist/node/build/render.js.map +0 -1
  80. package/dist/node/cli.js.map +0 -1
  81. package/dist/node/config.js +0 -176
  82. package/dist/node/config.js.map +0 -1
  83. package/dist/node/index.js.map +0 -1
  84. package/dist/node/markdown/markdown.js +0 -75
  85. package/dist/node/markdown/markdown.js.map +0 -1
  86. package/dist/node/markdown/plugins/component.js +0 -86
  87. package/dist/node/markdown/plugins/component.js.map +0 -1
  88. package/dist/node/markdown/plugins/containers.js +0 -41
  89. package/dist/node/markdown/plugins/containers.js.map +0 -1
  90. package/dist/node/markdown/plugins/headings.js +0 -25
  91. package/dist/node/markdown/plugins/headings.js.map +0 -1
  92. package/dist/node/markdown/plugins/highlight.js +0 -53
  93. package/dist/node/markdown/plugins/highlight.js.map +0 -1
  94. package/dist/node/markdown/plugins/highlightLines.js +0 -48
  95. package/dist/node/markdown/plugins/highlightLines.js.map +0 -1
  96. package/dist/node/markdown/plugins/hoist.js +0 -22
  97. package/dist/node/markdown/plugins/hoist.js.map +0 -1
  98. package/dist/node/markdown/plugins/image.js +0 -17
  99. package/dist/node/markdown/plugins/image.js.map +0 -1
  100. package/dist/node/markdown/plugins/lineNumbers.js +0 -23
  101. package/dist/node/markdown/plugins/lineNumbers.js.map +0 -1
  102. package/dist/node/markdown/plugins/link.js +0 -85
  103. package/dist/node/markdown/plugins/link.js.map +0 -1
  104. package/dist/node/markdown/plugins/preWrapper.js +0 -22
  105. package/dist/node/markdown/plugins/preWrapper.js.map +0 -1
  106. package/dist/node/markdown/plugins/slugify.js +0 -26
  107. package/dist/node/markdown/plugins/slugify.js.map +0 -1
  108. package/dist/node/markdown/plugins/snippet.js +0 -146
  109. package/dist/node/markdown/plugins/snippet.js.map +0 -1
  110. package/dist/node/markdownToVue.js +0 -166
  111. package/dist/node/markdownToVue.js.map +0 -1
  112. package/dist/node/plugin.js +0 -227
  113. package/dist/node/plugin.js.map +0 -1
  114. package/dist/node/serve/serve.js +0 -59
  115. package/dist/node/serve/serve.js.map +0 -1
  116. package/dist/node/server.js +0 -18
  117. package/dist/node/server.js.map +0 -1
  118. package/dist/node/shared.js +0 -72
  119. package/dist/node/shared.js.map +0 -1
  120. package/dist/node/staticDataPlugin.js +0 -99
  121. package/dist/node/staticDataPlugin.js.map +0 -1
  122. package/dist/node/utils/getGitTimestamp.js +0 -17
  123. package/dist/node/utils/getGitTimestamp.js.map +0 -1
  124. package/dist/node/utils/parseHeader.js +0 -57
  125. package/dist/node/utils/parseHeader.js.map +0 -1
  126. package/dist/node/utils/slash.js +0 -8
  127. package/dist/node/utils/slash.js.map +0 -1
@@ -1,10 +1,12 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue'
3
3
  import { useData } from 'vitepress'
4
- import VPDocOutline from './VPDocOutline.vue'
4
+ import { useSidebar } from '../composables/sidebar'
5
+ import VPDocAside from './VPDocAside.vue'
5
6
  import VPDocFooter from './VPDocFooter.vue'
6
7
 
7
8
  const { page } = useData()
9
+ const { hasSidebar } = useSidebar()
8
10
 
9
11
  const pageName = computed(() => {
10
12
  return page.value.relativePath.slice(0, page.value.relativePath.indexOf('/'))
@@ -12,23 +14,32 @@ const pageName = computed(() => {
12
14
  </script>
13
15
 
14
16
  <template>
15
- <div class="VPDoc has-aside">
17
+ <div class="VPDoc" :class="{ 'has-sidebar': hasSidebar }">
16
18
  <div class="container">
17
19
  <div class="aside">
20
+ <div class="aside-curtain" />
18
21
  <div class="aside-container">
19
- <div class="aside-curtain" />
20
22
  <div class="aside-content">
21
- <VPDocOutline v-if="page.headers" />
23
+ <VPDocAside>
24
+ <template #aside-top><slot name="aside-top" /></template>
25
+ <template #aside-bottom><slot name="aside-bottom" /></template>
26
+ <template #aside-outline-before><slot name="aside-outline-before" /></template>
27
+ <template #aside-outline-after><slot name="aside-outline-after" /></template>
28
+ <template #aside-ads-before><slot name="aside-ads-before" /></template>
29
+ <template #aside-ads-after><slot name="aside-ads-after" /></template>
30
+ </VPDocAside>
22
31
  </div>
23
32
  </div>
24
33
  </div>
25
34
 
26
35
  <div class="content">
27
- <main class="main">
28
- <Content class="vp-doc" :class="pageName" />
29
- </main>
36
+ <div class="content-container">
37
+ <main class="main">
38
+ <Content class="vp-doc" :class="pageName" />
39
+ </main>
30
40
 
31
- <VPDocFooter />
41
+ <VPDocFooter />
42
+ </div>
32
43
  </div>
33
44
  </div>
34
45
  </div>
@@ -37,6 +48,7 @@ const pageName = computed(() => {
37
48
  <style scoped>
38
49
  .VPDoc {
39
50
  padding: 32px 24px 96px;
51
+ width: 100%;
40
52
  }
41
53
 
42
54
  @media (min-width: 768px) {
@@ -47,90 +59,82 @@ const pageName = computed(() => {
47
59
 
48
60
  @media (min-width: 960px) {
49
61
  .VPDoc {
50
- padding: 32px 64px 96px;
62
+ padding: 32px 32px 32px;
51
63
  }
52
- }
53
64
 
54
- @media (min-width: 1280px) {
55
- .VPDoc {
56
- padding: 32px 0 128px 64px;
65
+ .VPDoc:not(.has-sidebar) .container {
66
+ display: flex;
67
+ justify-content: center;
68
+ max-width: 992px;
57
69
  }
58
70
 
59
- .VPDoc:not(.has-sidebar.has-aside) {
60
- padding-left: calc((100vw - 688px) / 2);
71
+ .VPDoc:not(.has-sidebar) .aside {
72
+ display: block;
61
73
  }
62
74
 
63
- .VPDoc.has-aside:not(.has-sidebar) {
64
- padding-left: calc((100vw - 688px - 320px) / 2);
75
+ .VPDoc:not(.has-sidebar) .content {
76
+ max-width: 752px;
77
+ }
78
+ }
79
+
80
+ @media (min-width: 1280px) {
81
+ .VPDoc .container {
82
+ display: flex;
83
+ justify-content: center;
65
84
  }
66
85
 
67
- .VPDoc:not(.has-aside) .content {
68
- min-width: 688px;
86
+ .VPDoc .aside {
87
+ display: block;
69
88
  }
70
89
  }
71
90
 
72
91
  @media (min-width: 1440px) {
73
- .VPDoc {
74
- padding: 32px 0 128px 96px;
92
+ .VPDoc:not(.has-sidebar) .content {
93
+ max-width: 784px;
75
94
  }
76
- }
77
95
 
78
- @media (min-width: 1280px) {
79
- .container {
80
- display: flex;
96
+ .VPDoc:not(.has-sidebar) .container {
97
+ max-width: 1104px;
81
98
  }
82
99
  }
83
100
 
101
+ .container {
102
+ margin: 0 auto;
103
+ width: 100%;
104
+ }
105
+
84
106
  .aside {
85
107
  position: relative;
86
108
  display: none;
87
109
  order: 2;
88
- flex-shrink: 0;
89
110
  flex-grow: 1;
90
- padding-left: 64px;
91
- padding-right: 32px;
92
- min-width: 320px;
93
- }
94
-
95
- @media (min-width: 1280px) {
96
- .aside {
97
- display: block;
98
- }
99
- }
100
-
101
- @media (min-width: 1440px) {
102
- .aside {
103
- padding-left: 96px;
104
- }
111
+ padding-left: 32px;
112
+ width: 100%;
113
+ max-width: 256px;
105
114
  }
106
115
 
107
116
  .aside-container {
108
- position: fixed;
109
- top: var(--vp-nav-height-desktop);
110
- bottom: 0;
111
- padding-top: 32px;
112
- width: 224px;
117
+ position: sticky;
118
+ top: 0;
119
+ margin-top: calc(var(--vp-nav-height-desktop) * -1 - 32px);
120
+ padding-top: calc(var(--vp-nav-height-desktop) + 32px);
121
+ max-height: 100vh;
113
122
  overflow-x: hidden;
114
123
  overflow-y: auto;
124
+ scrollbar-width: none;
115
125
  }
116
126
 
117
127
  .aside-container::-webkit-scrollbar {
118
128
  display: none;
119
129
  }
120
130
 
121
- @media (min-width: 1440px) {
122
- .aside-container {
123
- width: 256px;
124
- }
125
- }
126
-
127
131
  .aside-curtain {
128
132
  position: fixed;
129
- top: var(--vp-nav-height-desktop);
133
+ bottom: 0;
130
134
  z-index: 10;
131
- width: 100%;
132
- height: 40px;
133
- background: linear-gradient(var(--vp-c-bg-content), transparent);
135
+ width: 224px;
136
+ height: 88px;
137
+ background: linear-gradient(transparent, var(--vp-c-bg) 70%);
134
138
  }
135
139
 
136
140
  .aside-content {
@@ -140,17 +144,28 @@ const pageName = computed(() => {
140
144
  .content {
141
145
  position: relative;
142
146
  margin: 0 auto;
143
- max-width: 688px;
147
+ width: 100%;
148
+ }
149
+
150
+ @media (min-width: 960px) {
151
+ .content {
152
+ padding: 0 32px 96px;
153
+ }
144
154
  }
145
155
 
146
156
  @media (min-width: 1280px) {
147
157
  .content {
148
158
  order: 1;
149
159
  margin: 0;
150
- min-width: 632px;
160
+ min-width: 640px;
151
161
  }
152
162
  }
153
163
 
164
+ .content-container {
165
+ margin: 0 auto;
166
+ max-width: 688px;
167
+ }
168
+
154
169
  .edit-link {
155
170
  margin: 0 0 32px;
156
171
  }
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import { useData } from 'vitepress'
3
+ import VPDocAsideOutline from './VPDocAsideOutline.vue'
4
+ import VPDocAsideCarbonAds from './VPDocAsideCarbonAds.vue'
5
+
6
+ const { page, theme } = useData()
7
+ </script>
8
+
9
+ <template>
10
+ <div class="VPDocAside">
11
+ <slot name="aside-top" />
12
+
13
+ <slot name="aside-outline-before" />
14
+ <VPDocAsideOutline v-if="page.headers.length" />
15
+ <slot name="aside-outline-after" />
16
+
17
+ <slot name="aside-ads-before" />
18
+ <VPDocAsideCarbonAds v-if="theme.carbonAds" />
19
+ <slot name="aside-ads-after" />
20
+
21
+ <slot name="aside-bottom" />
22
+ </div>
23
+ </template>
24
+
25
+ <style scoped>
26
+ .VPDocAside :deep(.VPDocAsideOutline + .VPDocAsideSponsors),
27
+ .VPDocAside :deep(.VPDocAsideOutline + .VPDocAsideCarbonAds) {
28
+ margin-top: 24px;
29
+ }
30
+
31
+ .VPDocAside :deep(.VPDocAsideSponsors + .VPDocAsideCarbonAds) {
32
+ margin-top: 16px;
33
+ }
34
+ </style>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { defineAsyncComponent } from 'vue'
3
+
4
+ const VPCarbonAds = __ALGOLIA__
5
+ ? defineAsyncComponent(() => import('./VPCarbonAds.vue'))
6
+ : () => null
7
+ </script>
8
+
9
+ <template>
10
+ <div class="VPDocAsideCarbonAds">
11
+ <VPCarbonAds />
12
+ </div>
13
+ </template>
@@ -1,10 +1,16 @@
1
1
  <script setup lang="ts">
2
2
  import { ref, computed } from 'vue'
3
3
  import { useData } from 'vitepress'
4
- import { resolveHeaders, useActiveAnchor } from '../composables/outline'
4
+ import {
5
+ resolveHeaders,
6
+ useOutline,
7
+ useActiveAnchor
8
+ } from '../composables/outline'
5
9
 
6
10
  const { page, frontmatter } = useData()
7
11
 
12
+ const { hasOutline } = useOutline()
13
+
8
14
  const container = ref()
9
15
  const marker = ref()
10
16
 
@@ -22,7 +28,7 @@ function handleClick({ target: el }: Event) {
22
28
  </script>
23
29
 
24
30
  <template>
25
- <div class="VPDocOutline" ref="container">
31
+ <div class="VPDocAsideOutline" :class="{ 'has-outline': hasOutline }" ref="container">
26
32
  <div class="outline-marker" ref="marker" />
27
33
 
28
34
  <div class="outline-title">On this page</div>
@@ -54,14 +60,19 @@ function handleClick({ target: el }: Event) {
54
60
  </template>
55
61
 
56
62
  <style scoped>
57
- .VPDocOutline {
63
+ .VPDocAsideOutline {
58
64
  position: relative;
65
+ display: none;
59
66
  border-left: 1px solid var(--vp-c-divider-light);
60
67
  padding-left: 16px;
61
68
  font-size: 13px;
62
69
  font-weight: 500;
63
70
  }
64
71
 
72
+ .VPDocAsideOutline.has-outline {
73
+ display: block;
74
+ }
75
+
65
76
  .outline-marker {
66
77
  position: absolute;
67
78
  top: 32px;
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ import VPSponsors from './VPSponsors.vue'
3
+
4
+ export interface Sponsors {
5
+ tier?: string
6
+ size?: 'xmini' | 'mini' | 'small'
7
+ items: Sponsor[]
8
+ }
9
+
10
+ export interface Sponsor {
11
+ name: string
12
+ img: string
13
+ url: string
14
+ }
15
+
16
+ defineProps<{
17
+ tier?: string
18
+ size?: 'xmini' | 'mini' | 'small'
19
+ data: Sponsors[] | Sponsor[]
20
+ }>()
21
+ </script>
22
+
23
+ <template>
24
+ <div class="VPDocAsideSponsors">
25
+ <VPSponsors
26
+ mode="aside"
27
+ :tier="tier"
28
+ :size="size"
29
+ :data="data"
30
+ />
31
+ </div>
32
+ </template>
@@ -44,7 +44,7 @@ const control = usePrevNext()
44
44
  }
45
45
 
46
46
  .edit-link {
47
- padding-bottom: 8px;
47
+ padding-bottom: 14px;
48
48
  }
49
49
 
50
50
  .edit-link-button {
@@ -1,12 +1,11 @@
1
1
  <script lang="ts" setup>
2
2
  import { ref } from 'vue'
3
- import { DefaultTheme } from 'vitepress'
4
3
  import { useFlyout } from '../composables/flyout'
5
4
  import VPIconChevronDown from './icons/VPIconChevronDown.vue'
6
5
  import VPIconMoreHorizontal from './icons/VPIconMoreHorizontal.vue'
7
6
  import VPMenu from './VPMenu.vue'
8
7
 
9
- const props = defineProps<{
8
+ defineProps<{
10
9
  icon?: any
11
10
  button?: string
12
11
  label?: string
@@ -141,7 +140,7 @@ function onBlur() {
141
140
  transition: opacity 0.25s, visibility 0.25s, transform 0.25s;
142
141
  }
143
142
 
144
- @media (min-width: 1280px) {
143
+ @media (min-width: 960px) {
145
144
  .menu {
146
145
  top: calc(var(--vp-nav-height-desktop) / 2 + 20px);
147
146
  }
@@ -21,7 +21,7 @@ const { hasSidebar } = useSidebar()
21
21
  z-index: var(--vp-z-index-footer);
22
22
  border-top: 1px solid var(--vp-c-divider-light);
23
23
  padding: 32px 24px;
24
- background-color: var(--vp-c-bg-content);
24
+ background-color: var(--vp-c-bg);
25
25
  }
26
26
 
27
27
  .VPFooter.has-sidebar {
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import VPButton from './VPButton.vue'
3
3
 
4
- interface HeroAction {
4
+ export interface HeroAction {
5
5
  theme?: 'brand' | 'alt'
6
6
  text: string
7
7
  link: string
@@ -56,8 +56,8 @@ defineProps<{
56
56
 
57
57
  .name,
58
58
  .text {
59
- line-height: 40px;
60
- font-size: 32px;
59
+ line-height: 48px;
60
+ font-size: 40px;
61
61
  font-weight: 700;
62
62
  }
63
63
 
@@ -3,13 +3,13 @@ import VPIconHeart from './icons/VPIconHeart.vue'
3
3
  import VPButton from './VPButton.vue'
4
4
  import VPSponsors from './VPSponsors.vue'
5
5
 
6
- interface Sponsors {
6
+ export interface Sponsors {
7
7
  tier: string
8
8
  size?: 'medium' | 'big'
9
9
  items: Sponsor[]
10
10
  }
11
11
 
12
- interface Sponsor {
12
+ export interface Sponsor {
13
13
  name: string
14
14
  img: string
15
15
  url: string
@@ -50,7 +50,7 @@ defineProps<{
50
50
  .VPHomeSponsors {
51
51
  border-top: 1px solid var(--vp-c-divider-light);
52
52
  padding: 88px 24px 96px;
53
- background-color: var(--vp-c-bg-content);
53
+ background-color: var(--vp-c-bg);
54
54
  }
55
55
 
56
56
  .container {
@@ -86,10 +86,6 @@ defineProps<{
86
86
  padding-top: 32px;
87
87
  }
88
88
 
89
- .sponsor + .sponsor {
90
- padding-top: 0px;
91
- }
92
-
93
89
  .action {
94
90
  padding-top: 40px;
95
91
  text-align: center;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" setup>
2
2
  import { computed } from 'vue'
3
+ import { normalizeLink } from '../support/utils'
3
4
  import VPIconExternalLink from './icons/VPIconExternalLink.vue'
4
5
 
5
6
  const props = defineProps<{
@@ -15,7 +16,7 @@ const isExternal = computed(() => props.href && /^[a-z]+:/i.test(props.href))
15
16
  :is="href ? 'a' : 'span'"
16
17
  class="VPLink"
17
18
  :class="{ link: href }"
18
- :href="href"
19
+ :href="href ? normalizeLink(href) : undefined"
19
20
  :target="isExternal ? '_blank' : undefined"
20
21
  :rel="isExternal ? 'noopener noreferrer' : undefined"
21
22
  >
@@ -45,7 +45,7 @@ function scrollToTop() {
45
45
  justify-content: space-between;
46
46
  border-bottom: 1px solid var(--vp-c-divider-light);
47
47
  width: 100%;
48
- background-color: var(--vp-c-bg-content);
48
+ background-color: var(--vp-c-bg);
49
49
  transition: border-color 0.5s, background-color 0.5s;
50
50
  }
51
51
 
@@ -22,27 +22,22 @@ defineProps<{
22
22
 
23
23
  <style scoped>
24
24
  .VPMenu {
25
- border-radius: 8px;
26
- padding: 12px 0;
27
- min-width: 192px;
28
- border: 1px solid transparent;
29
- background: var(--vp-c-bg);
25
+ border-radius: 12px;
26
+ padding: 12px;
27
+ min-width: 128px;
28
+ border: 1px solid var(--vp-c-divider-light);
29
+ background-color: var(--vp-c-bg);
30
30
  box-shadow: var(--vp-shadow-3);
31
31
  transition: background-color 0.5s;
32
32
  }
33
33
 
34
34
  .dark .VPMenu {
35
- background: var(--vp-c-bg);
36
- box-shadow: var(--vp-shadow-1);
37
- border: 1px solid var(--vp-c-divider-light);
38
- }
39
-
40
- .VPMenu :deep(.items) {
41
- transition: border-color .5s;
35
+ box-shadow: var(--vp-shadow-2);
42
36
  }
43
37
 
44
38
  .VPMenu :deep(.group) {
45
- padding: 0 0 12px;
39
+ margin: 0 -12px;
40
+ padding: 0 12px 12px;
46
41
  }
47
42
 
48
43
  .VPMenu :deep(.group + .group) {
@@ -15,16 +15,22 @@ defineProps<{
15
15
  <style scoped>
16
16
  .VPMenuLink {
17
17
  display: block;
18
- padding: 0 16px;
19
- line-height: 28px;
20
- font-size: 13px;
18
+ border-radius: 6px;
19
+ padding: 0 12px;
20
+ line-height: 32px;
21
+ font-size: 14px;
21
22
  font-weight: 500;
22
23
  color: var(--vp-c-text-1);
23
24
  white-space: nowrap;
24
- transition: color 0.25s;
25
+ transition: background-color 0.25s, color 0.25s;
25
26
  }
26
27
 
27
28
  .VPMenuLink:hover {
28
29
  color: var(--vp-c-brand);
30
+ background-color: var(--vp-c-bg-mute);
31
+ }
32
+
33
+ .dark .VPMenuLink:hover {
34
+ background-color: var(--vp-c-bg-soft);
29
35
  }
30
36
  </style>
@@ -1,16 +1,18 @@
1
1
  <script setup lang="ts">
2
2
  import { provide } from 'vue'
3
3
  import { useNav } from '../composables/nav'
4
+ import { useSidebar } from '../composables/sidebar'
4
5
  import VPNavBar from './VPNavBar.vue'
5
6
  import VPNavScreen from './VPNavScreen.vue'
6
7
 
7
8
  const { isScreenOpen, closeScreen, toggleScreen } = useNav()
9
+ const { hasSidebar } = useSidebar()
8
10
 
9
11
  provide('close-screen', closeScreen)
10
12
  </script>
11
13
 
12
14
  <template>
13
- <header class="VPNav">
15
+ <header class="VPNav" :class="{ 'no-sidebar' : !hasSidebar }">
14
16
  <VPNavBar :is-screen-open="isScreenOpen" @toggle-screen="toggleScreen" />
15
17
  <VPNavScreen :open="isScreenOpen" />
16
18
  </header>
@@ -29,5 +31,20 @@ provide('close-screen', closeScreen)
29
31
  .VPNav {
30
32
  position: fixed;
31
33
  }
34
+
35
+ .VPNav.no-sidebar {
36
+ backdrop-filter: saturate(50%) blur(8px);
37
+ -webkit-backdrop-filter: saturate(50%) blur(8px);
38
+ }
39
+
40
+ @supports not (backdrop-filter: saturate(50%) blur(8px)) {
41
+ .VPNav.no-sidebar {
42
+ background: rgba(255, 255, 255, 0.95);
43
+ }
44
+
45
+ .dark .VPNav.no-sidebar {
46
+ background: rgba(36, 36, 36, 0.95);
47
+ }
48
+ }
32
49
  }
33
50
  </style>
@@ -1,4 +1,5 @@
1
1
  <script lang="ts" setup>
2
+ import { useSidebar } from '../composables/sidebar'
2
3
  import VPNavBarTitle from './VPNavBarTitle.vue'
3
4
  import VPNavBarSearch from './VPNavBarSearch.vue'
4
5
  import VPNavBarMenu from './VPNavBarMenu.vue'
@@ -15,10 +16,12 @@ defineProps<{
15
16
  defineEmits<{
16
17
  (e: 'toggle-screen'): void
17
18
  }>()
19
+
20
+ const { hasSidebar } = useSidebar()
18
21
  </script>
19
22
 
20
23
  <template>
21
- <div class="VPNavBar">
24
+ <div class="VPNavBar" :class="{ 'has-sidebar' : hasSidebar }">
22
25
  <div class="container">
23
26
  <VPNavBarTitle />
24
27
 
@@ -60,13 +63,28 @@ defineEmits<{
60
63
  height: var(--vp-nav-height-desktop);
61
64
  border-bottom: 0;
62
65
  }
66
+
67
+ .VPNavBar.has-sidebar .content {
68
+ backdrop-filter: saturate(50%) blur(8px);
69
+ -webkit-backdrop-filter: saturate(50%) blur(8px);
70
+ }
71
+
72
+ @supports not (backdrop-filter: saturate(50%) blur(8px)) {
73
+ .VPNavBar.has-sidebar.content {
74
+ background: rgba(255, 255, 255, 0.95);
75
+ }
76
+
77
+ .dark .VPNavBar.has-sidebar .content {
78
+ background: rgba(36, 36, 36, 0.95);
79
+ }
80
+ }
63
81
  }
64
82
 
65
83
  .container {
66
84
  display: flex;
67
85
  justify-content: space-between;
68
86
  margin: 0 auto;
69
- max-width: var(--vp-layout-max-width);
87
+ max-width: calc(var(--vp-layout-max-width) - 64px);
70
88
  }
71
89
 
72
90
  .content {
@@ -76,12 +94,6 @@ defineEmits<{
76
94
  flex-grow: 1;
77
95
  }
78
96
 
79
- @media (min-width: 960px) {
80
- .content {
81
- backdrop-filter: saturate(50%) blur(8px);
82
- }
83
- }
84
-
85
97
  .menu + .translations::before,
86
98
  .menu + .appearance::before,
87
99
  .menu + .social-links::before,