vitepress 0.22.2 → 1.0.0-draft.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 (134) hide show
  1. package/README.md +4 -4
  2. package/client.d.ts +2 -3
  3. package/dist/client/app/components/ClientOnly.js +1 -1
  4. package/dist/client/app/index.js +5 -7
  5. package/dist/client/app/router.js +11 -5
  6. package/dist/client/theme-default/Layout.vue +25 -183
  7. package/dist/client/theme-default/NotFound.vue +9 -8
  8. package/dist/client/theme-default/components/VPAlgoliaSearchBox.vue +127 -0
  9. package/dist/client/theme-default/components/VPBackdrop.vue +39 -0
  10. package/dist/client/theme-default/components/VPContent.vue +44 -0
  11. package/dist/client/theme-default/components/VPContentDoc.vue +173 -0
  12. package/dist/client/theme-default/components/VPContentDocFooter.vue +140 -0
  13. package/dist/client/theme-default/components/VPContentDocOutline.vue +108 -0
  14. package/dist/client/theme-default/components/VPFlyout.vue +149 -0
  15. package/dist/client/theme-default/components/VPLink.vue +37 -0
  16. package/dist/client/theme-default/components/VPLocalNav.vue +106 -0
  17. package/dist/client/theme-default/components/VPMenu.vue +79 -0
  18. package/dist/client/theme-default/components/VPMenuGroup.vue +35 -0
  19. package/dist/client/theme-default/components/VPMenuLink.vue +30 -0
  20. package/dist/client/theme-default/components/VPNav.vue +33 -0
  21. package/dist/client/theme-default/components/VPNavBar.vue +109 -0
  22. package/dist/client/theme-default/components/VPNavBarAppearance.vue +22 -0
  23. package/dist/client/theme-default/components/VPNavBarExtra.vue +107 -0
  24. package/dist/client/theme-default/components/VPNavBarHamburger.vue +79 -0
  25. package/dist/client/theme-default/components/VPNavBarMenu.vue +29 -0
  26. package/dist/client/theme-default/components/VPNavBarMenuGroup.vue +18 -0
  27. package/dist/client/theme-default/components/VPNavBarMenuLink.vue +56 -0
  28. package/dist/client/theme-default/components/VPNavBarSearch.vue +269 -0
  29. package/dist/client/theme-default/components/VPNavBarSocialLinks.vue +27 -0
  30. package/dist/client/theme-default/components/VPNavBarTitle.vue +44 -0
  31. package/dist/client/theme-default/components/VPNavBarTranslations.vue +74 -0
  32. package/dist/client/theme-default/components/VPNavScreen.vue +100 -0
  33. package/dist/client/theme-default/components/VPNavScreenAppearance.vue +30 -0
  34. package/dist/client/theme-default/components/VPNavScreenMenu.vue +24 -0
  35. package/dist/client/theme-default/components/VPNavScreenMenuGroup.vue +118 -0
  36. package/dist/client/theme-default/components/VPNavScreenMenuGroupLink.vue +33 -0
  37. package/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue +35 -0
  38. package/dist/client/theme-default/components/VPNavScreenMenuLink.vue +34 -0
  39. package/dist/client/theme-default/components/VPNavScreenSocialLinks.vue +14 -0
  40. package/dist/client/theme-default/components/VPNavScreenTranslations.vue +73 -0
  41. package/dist/client/theme-default/components/VPSidebar.vue +118 -0
  42. package/dist/client/theme-default/components/VPSidebarGroup.vue +44 -0
  43. package/dist/client/theme-default/components/VPSidebarLink.vue +57 -0
  44. package/dist/client/theme-default/components/VPSkipLink.vue +72 -0
  45. package/dist/client/theme-default/components/VPSocialLink.vue +63 -0
  46. package/dist/client/theme-default/components/VPSocialLinks.vue +27 -0
  47. package/dist/client/theme-default/components/VPSwitch.vue +66 -0
  48. package/dist/client/theme-default/components/VPSwitchAppearance.vue +74 -0
  49. package/dist/client/theme-default/components/icons/VPIconAlignJustify.vue +8 -0
  50. package/dist/client/theme-default/components/icons/VPIconAlignLeft.vue +8 -0
  51. package/dist/client/theme-default/components/icons/VPIconAlignRight.vue +8 -0
  52. package/dist/client/theme-default/components/icons/{ArrowLeft.vue → VPIconArrowLeft.vue} +0 -0
  53. package/dist/client/theme-default/components/icons/{ArrowRight.vue → VPIconArrowRight.vue} +0 -0
  54. package/dist/client/theme-default/components/icons/VPIconChevronDown.vue +5 -0
  55. package/dist/client/theme-default/components/icons/VPIconChevronLeft.vue +5 -0
  56. package/dist/client/theme-default/components/icons/VPIconChevronRight.vue +5 -0
  57. package/dist/client/theme-default/components/icons/VPIconChevronUp.vue +5 -0
  58. package/dist/client/theme-default/components/icons/VPIconDiscord.vue +5 -0
  59. package/dist/client/theme-default/components/icons/VPIconEdit.vue +6 -0
  60. package/dist/client/theme-default/components/icons/VPIconExternalLink.vue +13 -0
  61. package/dist/client/theme-default/components/icons/VPIconFacebook.vue +5 -0
  62. package/dist/client/theme-default/components/icons/VPIconGitHub.vue +5 -0
  63. package/dist/client/theme-default/components/icons/VPIconInstagram.vue +5 -0
  64. package/dist/client/theme-default/components/icons/VPIconLanguages.vue +9 -0
  65. package/dist/client/theme-default/components/icons/VPIconLinkedIn.vue +5 -0
  66. package/dist/client/theme-default/components/icons/VPIconMoon.vue +5 -0
  67. package/dist/client/theme-default/components/icons/VPIconMoreHorizontal.vue +7 -0
  68. package/dist/client/theme-default/components/icons/VPIconPlus.vue +5 -0
  69. package/dist/client/theme-default/components/icons/VPIconSlack.vue +5 -0
  70. package/dist/client/theme-default/components/icons/VPIconSun.vue +13 -0
  71. package/dist/client/theme-default/components/icons/VPIconTwitter.vue +5 -0
  72. package/dist/client/theme-default/components/icons/VPIconYouTube.vue +5 -0
  73. package/dist/client/theme-default/composables/edit-link.js +22 -0
  74. package/dist/client/theme-default/composables/flyout.js +40 -0
  75. package/dist/client/theme-default/composables/nav.js +27 -1
  76. package/dist/client/theme-default/composables/outline.js +130 -0
  77. package/dist/client/theme-default/composables/prev-next.js +18 -0
  78. package/dist/client/theme-default/composables/sidebar.js +57 -0
  79. package/dist/client/theme-default/fonts/inter-cyrillic-ext.woff2 +0 -0
  80. package/dist/client/theme-default/fonts/inter-cyrillic.woff2 +0 -0
  81. package/dist/client/theme-default/fonts/inter-greek-ext.woff2 +0 -0
  82. package/dist/client/theme-default/fonts/inter-greek.woff2 +0 -0
  83. package/dist/client/theme-default/fonts/inter-latin-ext.woff2 +0 -0
  84. package/dist/client/theme-default/fonts/inter-latin.woff2 +0 -0
  85. package/dist/client/theme-default/fonts/inter-vietnamese.woff2 +0 -0
  86. package/dist/client/theme-default/index.js +4 -4
  87. package/dist/client/theme-default/styles/base.css +200 -0
  88. package/dist/client/theme-default/styles/fonts.css +67 -0
  89. package/dist/client/theme-default/styles/utils.css +9 -0
  90. package/dist/client/theme-default/styles/vars.css +206 -66
  91. package/dist/client/theme-default/styles/vp-doc.css +419 -0
  92. package/dist/client/theme-default/support/sidebar.js +29 -0
  93. package/dist/client/theme-default/support/utils.js +43 -0
  94. package/dist/node/cli.js +1 -1
  95. package/dist/node/index.d.ts +106 -81
  96. package/dist/node/index.js +1 -1
  97. package/dist/node/{serve-cf4b2162.js → serve-428d4610.js} +27 -10
  98. package/package.json +31 -27
  99. package/types/default-theme.d.ts +105 -80
  100. package/dist/client/theme-default/components/AlgoliaSearchBox.vue +0 -195
  101. package/dist/client/theme-default/components/BuySellAds.vue +0 -152
  102. package/dist/client/theme-default/components/CarbonAds.vue +0 -99
  103. package/dist/client/theme-default/components/EditLink.vue +0 -38
  104. package/dist/client/theme-default/components/Home.vue +0 -31
  105. package/dist/client/theme-default/components/HomeFeatures.vue +0 -143
  106. package/dist/client/theme-default/components/HomeFooter.vue +0 -50
  107. package/dist/client/theme-default/components/HomeHero.vue +0 -161
  108. package/dist/client/theme-default/components/LastUpdated.vue +0 -60
  109. package/dist/client/theme-default/components/NavBar.vue +0 -60
  110. package/dist/client/theme-default/components/NavBarTitle.vue +0 -41
  111. package/dist/client/theme-default/components/NavDropdownLink.vue +0 -135
  112. package/dist/client/theme-default/components/NavDropdownLinkItem.vue +0 -76
  113. package/dist/client/theme-default/components/NavLink.vue +0 -61
  114. package/dist/client/theme-default/components/NavLinks.vue +0 -52
  115. package/dist/client/theme-default/components/NextAndPrevLinks.vue +0 -88
  116. package/dist/client/theme-default/components/Page.vue +0 -53
  117. package/dist/client/theme-default/components/PageFooter.vue +0 -44
  118. package/dist/client/theme-default/components/SideBar.vue +0 -60
  119. package/dist/client/theme-default/components/SideBarLink.js +0 -68
  120. package/dist/client/theme-default/components/SideBarLinks.vue +0 -12
  121. package/dist/client/theme-default/components/ToggleSideBarButton.vue +0 -46
  122. package/dist/client/theme-default/components/icons/OutboundLink.vue +0 -31
  123. package/dist/client/theme-default/composables/activeSidebarLink.js +0 -99
  124. package/dist/client/theme-default/composables/editLink.js +0 -49
  125. package/dist/client/theme-default/composables/navLink.js +0 -42
  126. package/dist/client/theme-default/composables/nextAndPrevLinks.js +0 -37
  127. package/dist/client/theme-default/composables/repo.js +0 -38
  128. package/dist/client/theme-default/composables/sideBar.js +0 -57
  129. package/dist/client/theme-default/styles/code.css +0 -299
  130. package/dist/client/theme-default/styles/custom-blocks.css +0 -76
  131. package/dist/client/theme-default/styles/layout.css +0 -236
  132. package/dist/client/theme-default/styles/sidebar-links.css +0 -107
  133. package/dist/client/theme-default/support/sideBar.js +0 -46
  134. package/dist/client/theme-default/utils.js +0 -63
@@ -0,0 +1,33 @@
1
+ <script lang="ts" setup>
2
+ import { inject } from 'vue'
3
+ import VPLink from './VPLink.vue'
4
+
5
+ defineProps<{
6
+ text: string
7
+ link: string
8
+ }>()
9
+
10
+ const closeScreen = inject('close-screen') as () => void
11
+ </script>
12
+
13
+ <template>
14
+ <VPLink class="VPNavScreenMenuGroupLink" :href="link" @click="closeScreen">
15
+ {{ text }}
16
+ </VPLink>
17
+ </template>
18
+
19
+ <style scoped>
20
+ .VPNavScreenMenuGroupLink {
21
+ display: block;
22
+ line-height: 32px;
23
+ font-size: 13px;
24
+ font-weight: 400;
25
+ color: var(--vp-c-text-1);
26
+ transition: color 0.25s;
27
+ margin-left: 12px;
28
+ }
29
+
30
+ .VPNavScreenMenuGroupLink:hover {
31
+ color: var(--vp-c-brand);
32
+ }
33
+ </style>
@@ -0,0 +1,35 @@
1
+ <script lang="ts" setup>
2
+ import { DefaultTheme } from 'vitepress'
3
+ import VPNavScreenMenuGroupLink from './VPNavScreenMenuGroupLink.vue'
4
+
5
+ defineProps<{
6
+ text?: string
7
+ items: DefaultTheme.NavItemWithLink[]
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <div class="VPNavScreenMenuGroupSection">
13
+ <p v-if="text" class="title">{{ text }}</p>
14
+ <VPNavScreenMenuGroupLink
15
+ v-for="item in items"
16
+ :key="item.text"
17
+ :text="item.text"
18
+ :link="item.link"
19
+ />
20
+ </div>
21
+ </template>
22
+
23
+ <style scoped>
24
+ .VPNavScreenMenuGroupSection {
25
+ display: block;
26
+ }
27
+
28
+ .title {
29
+ line-height: 32px;
30
+ font-size: 13px;
31
+ font-weight: 700;
32
+ color: var(--vp-c-text-2);
33
+ transition: color 0.25s;
34
+ }
35
+ </style>
@@ -0,0 +1,34 @@
1
+ <script lang="ts" setup>
2
+ import { inject } from 'vue'
3
+ import VPLink from './VPLink.vue'
4
+
5
+ defineProps<{
6
+ text: string
7
+ link: string
8
+ }>()
9
+
10
+ const closeScreen = inject('close-screen') as () => void
11
+ </script>
12
+
13
+ <template>
14
+ <VPLink class="VPNavScreenMenuLink" :href="link" @click="closeScreen">
15
+ {{ text }}
16
+ </VPLink>
17
+ </template>
18
+
19
+ <style scoped>
20
+ .VPNavScreenMenuLink {
21
+ display: block;
22
+ border-bottom: 1px solid var(--vp-c-divider-light);
23
+ padding: 12px 0 11px;
24
+ line-height: 24px;
25
+ font-size: 14px;
26
+ font-weight: 500;
27
+ color: var(--vp-c-text-1);
28
+ transition: border-color 0.5s, color 0.25s;
29
+ }
30
+
31
+ .VPNavScreenMenuLink:hover {
32
+ color: var(--vp-c-brand);
33
+ }
34
+ </style>
@@ -0,0 +1,14 @@
1
+ <script lang="ts" setup>
2
+ import { useData } from 'vitepress'
3
+ import VPSocialLinks from './VPSocialLinks.vue'
4
+
5
+ const { theme } = useData()
6
+ </script>
7
+
8
+ <template>
9
+ <VPSocialLinks
10
+ v-if="theme.socialLinks"
11
+ class="VPNavScreenSocialLinks"
12
+ :links="theme.socialLinks"
13
+ />
14
+ </template>
@@ -0,0 +1,73 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import { useData } from 'vitepress'
4
+ import VPIconChevronDown from './icons/VPIconChevronDown.vue'
5
+ import VPIconLanguages from './icons/VPIconLanguages.vue'
6
+
7
+ const { theme } = useData()
8
+
9
+ const isOpen = ref(false)
10
+
11
+ function toggle() {
12
+ isOpen.value = !isOpen.value
13
+ }
14
+ </script>
15
+
16
+ <template>
17
+ <div v-if="theme.localeLinks" class="VPNavScreenTranslations" :class="{ open: isOpen }">
18
+ <button class="title" @click="toggle">
19
+ <VPIconLanguages class="icon lang" />
20
+ {{ theme.localeLinks.text }}
21
+ <VPIconChevronDown class="icon chevron" />
22
+ </button>
23
+
24
+ <ul class="list">
25
+ <li v-for="locale in theme.localeLinks.items" :key="locale.link" class="item">
26
+ <a class="link" :href="locale.link">{{ locale.text }}</a>
27
+ </li>
28
+ </ul>
29
+ </div>
30
+ </template>
31
+
32
+ <style scoped>
33
+ .VPNavScreenTranslations {
34
+ height: 24px;
35
+ overflow: hidden;
36
+ }
37
+
38
+ .VPNavScreenTranslations.open {
39
+ height: auto;
40
+ }
41
+
42
+ .title {
43
+ display: flex;
44
+ align-items: center;
45
+ font-size: 14px;
46
+ font-weight: 500;
47
+ color: var(--vp-c-text-1);
48
+ }
49
+
50
+ .icon {
51
+ width: 16px;
52
+ height: 16px;
53
+ fill: currentColor;
54
+ }
55
+
56
+ .icon.lang {
57
+ margin-right: 8px;
58
+ }
59
+
60
+ .icon.chevron {
61
+ margin-left: 4px;
62
+ }
63
+
64
+ .list {
65
+ padding: 4px 0 0 24px;
66
+ }
67
+
68
+ .link {
69
+ line-height: 32px;
70
+ font-size: 13px;
71
+ color: var(--vp-c-text-1);
72
+ }
73
+ </style>
@@ -0,0 +1,118 @@
1
+ <script lang="ts" setup>
2
+ import { ref, watchPostEffect, nextTick } from 'vue'
3
+ import { useSidebar } from '../composables/sidebar'
4
+ import VPSidebarGroup from './VPSidebarGroup.vue'
5
+
6
+ const { sidebar, hasSidebar } = useSidebar()
7
+
8
+ const props = defineProps<{
9
+ open: boolean
10
+ }>()
11
+
12
+ // a11y: focus Nav element when menu has opened
13
+ let navEl = ref<(Element & { focus(): void }) | null>(null)
14
+
15
+ watchPostEffect(async () => {
16
+ if (props.open) {
17
+ await nextTick()
18
+ navEl.value?.focus()
19
+ }
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <aside
25
+ v-if="hasSidebar"
26
+ class="VPSidebar"
27
+ :class="{ open }"
28
+ ref="navEl"
29
+ @click.stop
30
+ >
31
+ <nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1">
32
+ <span class="visually-hidden" id="sidebar-aria-label">
33
+ Sidebar Navigation
34
+ </span>
35
+
36
+ <div v-for="group in sidebar" :key="group.text" class="group">
37
+ <VPSidebarGroup :text="group.text" :items="group.items" />
38
+ </div>
39
+ </nav>
40
+ </aside>
41
+ </template>
42
+
43
+ <style scoped>
44
+ .VPSidebar {
45
+ position: fixed;
46
+ top: 0;
47
+ bottom: 0;
48
+ left: 0;
49
+ z-index: var(--vp-z-index-sidebar);
50
+ padding: 32px 32px 96px;
51
+ width: calc(100vw - 64px);
52
+ max-width: 320px;
53
+ background-color: var(--vp-c-bg);
54
+ opacity: 0;
55
+ box-shadow: var(--vp-c-shadow-3);
56
+ overflow-x: hidden;
57
+ overflow-y: auto;
58
+ transform: translateX(-100%);
59
+ transition: background-color 0.5s, opacity 0.5s, transform 0.25s ease;
60
+ }
61
+
62
+ .VPSidebar.open {
63
+ opacity: 1;
64
+ visibility: visible;
65
+ transform: translateX(0);
66
+ transition: background-color 0.5s,
67
+ opacity 0.25s,
68
+ transform 0.5s cubic-bezier(0.19, 1, 0.22, 1);
69
+ }
70
+
71
+ .dark .VPSidebar {
72
+ box-shadow: var(--vp-shadow-1);
73
+ }
74
+
75
+ @media (min-width: 960px) {
76
+ .VPSidebar {
77
+ z-index: 1;
78
+ padding-top: var(--vp-nav-height-desktop);
79
+ padding-bottom: 128px;
80
+ width: var(--vp-sidebar-width);
81
+ max-width: 100%;
82
+ width: var(--vp-sidebar-width);
83
+ background-color: var(--vp-c-bg-sidebar);
84
+ opacity: 1;
85
+ visibility: visible;
86
+ box-shadow: none;
87
+ transform: translateX(0);
88
+ transition: border-color 0.5s, background-color 0.5s;
89
+ }
90
+ }
91
+
92
+ @media (min-width: 1440px) {
93
+ .VPSidebar {
94
+ padding-left: calc((100% - var(--vp-layout-max-width)) / 2);
95
+ width: calc((100% - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width) - 32px);
96
+ }
97
+ }
98
+
99
+ .nav {
100
+ outline: 0;
101
+ }
102
+
103
+ .group + .group {
104
+ margin-top: 32px;
105
+ border-top: 1px solid var(--vp-c-divider-light);
106
+ padding-top: 8px;
107
+ }
108
+
109
+ @media (min-width: 960px) {
110
+ .group {
111
+ padding-top: 8px;
112
+ }
113
+
114
+ .group + .group {
115
+ margin-top: 24px;
116
+ }
117
+ }
118
+ </style>
@@ -0,0 +1,44 @@
1
+ <script lang="ts" setup>
2
+ import { useData } from 'vitepress'
3
+ import { DefaultTheme } from '../config'
4
+ import VPSidebarLink from './VPSidebarLink.vue'
5
+
6
+ const props = defineProps<{
7
+ text: string
8
+ items: DefaultTheme.SidebarItem[]
9
+ }>()
10
+
11
+ const { page } = useData()
12
+ </script>
13
+
14
+ <template>
15
+ <section class="VPSidebarGroup">
16
+ <div class="title">
17
+ <h2 class="title-text">{{ text }}</h2>
18
+ </div>
19
+
20
+ <template v-for="item in items" :key="item.link">
21
+ <VPSidebarLink :item="item" />
22
+ </template>
23
+ </section>
24
+ </template>
25
+
26
+ <style scoped>
27
+ .title {
28
+ padding: 6px 0;
29
+ }
30
+
31
+ @media (min-width: 960px) {
32
+ .title {
33
+ padding: 4px 0;
34
+ }
35
+ }
36
+
37
+ .title-text {
38
+ line-height: 20px;
39
+ font-size: 13px;
40
+ font-weight: 600;
41
+ color: var(--vp-c-text-1);
42
+ transition: color 0.5s;
43
+ }
44
+ </style>
@@ -0,0 +1,57 @@
1
+ <script lang="ts" setup>
2
+ import { inject } from 'vue'
3
+ import { useData } from 'vitepress'
4
+ import { DefaultTheme } from '../config'
5
+ import { isActive, normalizeLink } from '../support/utils'
6
+
7
+ defineProps<{
8
+ item: DefaultTheme.SidebarItem
9
+ }>()
10
+
11
+ const { page } = useData()
12
+
13
+ const closeSideBar = inject('close-sidebar') as () => void
14
+ </script>
15
+
16
+ <template>
17
+ <a
18
+ class="link"
19
+ :class="{ active: isActive(page.relativePath, item.link) }"
20
+ :href="normalizeLink(item.link)"
21
+ @click="closeSideBar"
22
+ >
23
+ <p class="link-text">{{ item.text }}</p>
24
+ </a>
25
+ </template>
26
+
27
+ <style scoped>
28
+ .link {
29
+ display: block;
30
+ padding: 6px 0;
31
+ }
32
+
33
+ .link:hover .link-text {
34
+ color: var(--vp-c-brand);
35
+ transition: color 0.25s;
36
+ }
37
+
38
+ .link.active .link-text {
39
+ font-weight: 600;
40
+ color: var(--vp-c-brand);
41
+ transition: color 0.25s;
42
+ }
43
+
44
+ @media (min-width: 960px) {
45
+ .link {
46
+ padding: 4px 0;
47
+ }
48
+ }
49
+
50
+ .link-text {
51
+ line-height: 20px;
52
+ font-size: 13px;
53
+ font-weight: 500;
54
+ color: var(--vp-c-text-2);
55
+ transition: color 0.5s;
56
+ }
57
+ </style>
@@ -0,0 +1,72 @@
1
+ <script lang="ts" setup>
2
+ import { ref, watch } from 'vue'
3
+ import { useRoute } from 'vitepress'
4
+
5
+ const route = useRoute()
6
+ const backToTop = ref()
7
+
8
+ watch(() => route.path, () => backToTop.value.focus())
9
+
10
+ function focusOnTargetAnchor({ target }: Event) {
11
+ const el = document.querySelector(
12
+ (target as HTMLAnchorElement).hash!
13
+ ) as HTMLAnchorElement
14
+
15
+ if (el) {
16
+ const removeTabIndex = () => {
17
+ el.removeAttribute('tabindex')
18
+ el.removeEventListener('blur', removeTabIndex)
19
+ }
20
+
21
+ el.setAttribute('tabindex', '-1')
22
+ el.addEventListener('blur', removeTabIndex)
23
+ el.focus()
24
+ window.scrollTo(0, 0)
25
+ }
26
+ }
27
+ </script>
28
+
29
+ <template>
30
+ <span ref="backToTop" tabindex="-1" />
31
+ <a
32
+ href="#VPContent"
33
+ class="VPSkipLink visually-hidden"
34
+ @click="focusOnTargetAnchor"
35
+ >
36
+ Skip to content
37
+ </a>
38
+ </template>
39
+
40
+ <style scoped>
41
+ .VPSkipLink {
42
+ top: 8px;
43
+ left: 8px;
44
+ padding: 8px 16px;
45
+ z-index: 999;
46
+ border-radius: 8px;
47
+ font-size: 12px;
48
+ font-weight: bold;
49
+ text-decoration: none;
50
+ color: var(--vp-c-brand);
51
+ box-shadow: var(--vp-shadow-3);
52
+ background-color: var(--vp-c-bg);
53
+ }
54
+
55
+ .VPSkipLink:focus {
56
+ height: auto;
57
+ width: auto;
58
+ clip: auto;
59
+ clip-path: none;
60
+ }
61
+
62
+ .dark .VPSkipLink {
63
+ color: var(--vp-c-green);
64
+ }
65
+
66
+ @media (min-width: 1280px) {
67
+ .VPSkipLink {
68
+ top: 14px;
69
+ left: 16px;
70
+ }
71
+ }
72
+ </style>
@@ -0,0 +1,63 @@
1
+ <script lang="ts" setup>
2
+ import { DefaultTheme } from 'vitepress'
3
+ import VPIconDiscord from './icons/VPIconDiscord.vue'
4
+ import VPIconFacebook from './icons/VPIconFacebook.vue'
5
+ import VPIconGitHub from './icons/VPIconGitHub.vue'
6
+ import VPIconLinkedIn from './icons/VPIconLinkedIn.vue'
7
+ import VPIconInstagram from './icons/VPIconInstagram.vue'
8
+ import VPIconSlack from './icons/VPIconSlack.vue'
9
+ import VPIconTwitter from './icons/VPIconTwitter.vue'
10
+ import VPIconYouTube from './icons/VPIconYouTube.vue'
11
+
12
+ const props = defineProps<{
13
+ icon: DefaultTheme.SocialLinkIcon
14
+ link: string
15
+ }>()
16
+
17
+ const icons = {
18
+ discord: VPIconDiscord,
19
+ facebook: VPIconFacebook,
20
+ github: VPIconGitHub,
21
+ instagram: VPIconInstagram,
22
+ linkedin: VPIconLinkedIn,
23
+ slack: VPIconSlack,
24
+ twitter: VPIconTwitter,
25
+ youtube: VPIconYouTube
26
+ }
27
+ </script>
28
+
29
+ <template>
30
+ <a
31
+ class="VPSocialLink"
32
+ :href="link"
33
+ :title="icon"
34
+ target="_blank"
35
+ rel="noopener noreferrer"
36
+ >
37
+ <component :is="icons[icon]" class="icon" />
38
+ <span class="visually-hidden">{{ icon }}</span>
39
+ </a>
40
+ </template>
41
+
42
+ <style scoped>
43
+ .VPSocialLink {
44
+ display: flex;
45
+ justify-content: center;
46
+ align-items: center;
47
+ width: 36px;
48
+ height: 36px;
49
+ color: var(--vp-c-text-2);
50
+ transition: color .5s;
51
+ }
52
+
53
+ .VPSocialLink:hover {
54
+ color: var(--vp-c-text-1);
55
+ transition: color .25s;
56
+ }
57
+
58
+ .icon {
59
+ width: 20px;
60
+ height: 20px;
61
+ fill: currentColor;
62
+ }
63
+ </style>
@@ -0,0 +1,27 @@
1
+ <script lang="ts" setup>
2
+ import { DefaultTheme } from 'vitepress'
3
+ import VPSocialLink from './VPSocialLink.vue'
4
+
5
+ defineProps<{
6
+ links: DefaultTheme.SocialLink[]
7
+ }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div class="VPSocialLinks">
12
+ <VPSocialLink
13
+ v-for="{ link, icon } in links"
14
+ :key="link"
15
+ :icon="icon"
16
+ :link="link"
17
+ />
18
+ </div>
19
+ </template>
20
+
21
+ <style scoped>
22
+ .VPSocialLinks {
23
+ display: flex;
24
+ flex-wrap: wrap;
25
+ justify-content: center;
26
+ }
27
+ </style>
@@ -0,0 +1,66 @@
1
+ <template>
2
+ <button class="VPSwitch" type="button" role="switch">
3
+ <span class="check">
4
+ <span class="icon" v-if="$slots.default">
5
+ <slot />
6
+ </span>
7
+ </span>
8
+ </button>
9
+ </template>
10
+
11
+ <style scoped>
12
+ .VPSwitch {
13
+ position: relative;
14
+ border-radius: 11px;
15
+ display: block;
16
+ width: 40px;
17
+ height: 22px;
18
+ flex-shrink: 0;
19
+ border: 1px solid var(--vp-c-divider);
20
+ background-color: var(--vp-c-bg-mute);
21
+ transition: border-color 0.25s, background-color 0.25s;
22
+ }
23
+
24
+ .VPSwitch:hover {
25
+ border-color: var(--vp-c-gray);
26
+ }
27
+
28
+ .check {
29
+ position: absolute;
30
+ top: 1px;
31
+ left: 1px;
32
+ width: 18px;
33
+ height: 18px;
34
+ border-radius: 50%;
35
+ background-color: var(--vp-c-white);
36
+ box-shadow: var(--vp-shadow-1);
37
+ transition: background-color 0.25s, transform 0.25s;
38
+ }
39
+
40
+ .dark .check {
41
+ background-color: var(--vp-c-black);
42
+ }
43
+
44
+ .icon {
45
+ position: relative;
46
+ display: block;
47
+ width: 18px;
48
+ height: 18px;
49
+ border-radius: 50%;
50
+ overflow: hidden;
51
+ }
52
+
53
+ .icon :deep(svg) {
54
+ position: absolute;
55
+ top: 3px;
56
+ left: 3px;
57
+ width: 12px;
58
+ height: 12px;
59
+ fill: var(--vp-c-text-2);
60
+ }
61
+
62
+ .dark .icon :deep(svg) {
63
+ fill: var(--vp-c-text-1);
64
+ transition: opacity 0.25s;
65
+ }
66
+ </style>