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
@@ -1,76 +0,0 @@
1
- <script setup lang="ts">
2
- import { toRefs } from 'vue'
3
- import type { DefaultTheme } from '../config'
4
- import { useNavLink } from '../composables/navLink'
5
- import OutboundLink from './icons/OutboundLink.vue'
6
-
7
- const props = defineProps<{
8
- item: DefaultTheme.NavItemWithLink
9
- }>()
10
-
11
- const propsRefs = toRefs(props)
12
-
13
- const { props: linkProps, isExternal } = useNavLink(propsRefs.item)
14
- </script>
15
-
16
- <template>
17
- <div class="nav-dropdown-link-item">
18
- <a class="item" v-bind="linkProps">
19
- <span class="arrow" />
20
- <span class="text">{{ item.text }}</span>
21
- <span class="icon"><OutboundLink v-if="isExternal" /></span>
22
- </a>
23
- </div>
24
- </template>
25
-
26
- <style scoped>
27
- .item {
28
- display: block;
29
- padding: 0 1.5rem 0 2.5rem;
30
- line-height: 32px;
31
- font-size: 0.9rem;
32
- font-weight: 500;
33
- color: var(--c-text);
34
- white-space: nowrap;
35
- }
36
-
37
- @media (min-width: 720px) {
38
- .item {
39
- padding: 0 24px 0 12px;
40
- line-height: 32px;
41
- font-size: 0.85rem;
42
- font-weight: 500;
43
- color: var(--c-text);
44
- white-space: nowrap;
45
- }
46
-
47
- .item.active .arrow {
48
- opacity: 1;
49
- }
50
- }
51
-
52
- .item:hover,
53
- .item.active {
54
- text-decoration: none;
55
- color: var(--c-brand);
56
- }
57
-
58
- .item.external:hover {
59
- border-bottom-color: transparent;
60
- color: var(--c-text);
61
- }
62
-
63
- @media (min-width: 720px) {
64
- .arrow {
65
- display: inline-block;
66
- margin-right: 8px;
67
- border-top: 6px solid #ccc;
68
- border-right: 4px solid transparent;
69
- border-bottom: 0;
70
- border-left: 4px solid transparent;
71
- vertical-align: middle;
72
- opacity: 0;
73
- transform: translateY(-2px) rotate(-90deg);
74
- }
75
- }
76
- </style>
@@ -1,61 +0,0 @@
1
- <script setup lang="ts">
2
- import { toRefs } from 'vue'
3
- import type { DefaultTheme } from '../config'
4
- import { useNavLink } from '../composables/navLink'
5
- import OutboundLink from './icons/OutboundLink.vue'
6
-
7
- const props = defineProps<{
8
- item: DefaultTheme.NavItemWithLink
9
- }>()
10
-
11
- const propsRefs = toRefs(props)
12
-
13
- const { props: linkProps, isExternal } = useNavLink(propsRefs.item)
14
- </script>
15
-
16
- <template>
17
- <div class="nav-link">
18
- <a class="item" v-bind="linkProps">
19
- {{ item.text }} <OutboundLink v-if="isExternal" />
20
- </a>
21
- </div>
22
- </template>
23
-
24
- <style scoped>
25
- .item {
26
- display: block;
27
- padding: 0 1.5rem;
28
- line-height: 36px;
29
- font-size: 1rem;
30
- font-weight: 600;
31
- color: var(--c-text);
32
- white-space: nowrap;
33
- }
34
-
35
- .item:hover,
36
- .item.active {
37
- text-decoration: none;
38
- color: var(--c-brand);
39
- }
40
-
41
- .item.external:hover {
42
- border-bottom-color: transparent;
43
- color: var(--c-text);
44
- }
45
-
46
- @media (min-width: 720px) {
47
- .item {
48
- border-bottom: 2px solid transparent;
49
- padding: 0;
50
- line-height: 24px;
51
- font-size: 0.9rem;
52
- font-weight: 500;
53
- }
54
-
55
- .item:hover,
56
- .item.active {
57
- border-bottom-color: var(--c-brand);
58
- color: var(--c-text);
59
- }
60
- }
61
- </style>
@@ -1,52 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { useData } from 'vitepress'
4
- import { useLanguageLinks } from '../composables/nav'
5
- import { useRepo } from '../composables/repo'
6
- import NavLink from './NavLink.vue'
7
- import NavDropdownLink from './NavDropdownLink.vue'
8
-
9
- const { theme } = useData()
10
- const localeLinks = useLanguageLinks()
11
- const repo = useRepo()
12
- const show = computed(() => theme.value.nav || repo.value || localeLinks.value)
13
- </script>
14
-
15
- <template>
16
- <nav v-if="show" class="nav-links">
17
- <template v-if="theme.nav">
18
- <div v-for="item in theme.nav" :key="item.text" class="item">
19
- <NavDropdownLink v-if="item.items" :item="item" />
20
- <NavLink v-else :item="item" />
21
- </div>
22
- </template>
23
-
24
- <div v-if="localeLinks" class="item">
25
- <NavDropdownLink :item="localeLinks" />
26
- </div>
27
-
28
- <div v-if="repo" class="item">
29
- <NavLink :item="repo" />
30
- </div>
31
- </nav>
32
- </template>
33
-
34
- <style scoped>
35
- .nav-links {
36
- padding: 0.75rem 0;
37
- border-bottom: 1px solid var(--c-divider);
38
- }
39
-
40
- @media (min-width: 720px) {
41
- .nav-links {
42
- display: flex;
43
- padding: 6px 0 0;
44
- align-items: center;
45
- border-bottom: 0;
46
- }
47
-
48
- .item + .item {
49
- padding-left: 24px;
50
- }
51
- }
52
- </style>
@@ -1,88 +0,0 @@
1
- <script setup lang="ts">
2
- import { withBase } from 'vitepress'
3
- import { useNextAndPrevLinks } from '../composables/nextAndPrevLinks'
4
- import ArrowLeft from './icons/ArrowLeft.vue'
5
- import ArrowRight from './icons/ArrowRight.vue'
6
-
7
- const { hasLinks, prev, next } = useNextAndPrevLinks()
8
- </script>
9
-
10
- <template>
11
- <div v-if="hasLinks" class="next-and-prev-link">
12
- <div class="container">
13
- <div class="prev">
14
- <a v-if="prev" class="link" :href="withBase(prev.link)">
15
- <ArrowLeft class="icon icon-prev" />
16
- <span class="text">{{ prev.text }}</span>
17
- </a>
18
- </div>
19
- <div class="next">
20
- <a v-if="next" class="link" :href="withBase(next.link)">
21
- <span class="text">{{ next.text }}</span>
22
- <ArrowRight class="icon icon-next" />
23
- </a>
24
- </div>
25
- </div>
26
- </div>
27
- </template>
28
-
29
- <style scoped>
30
- .next-and-prev-link {
31
- padding-top: 1rem;
32
- }
33
-
34
- .container {
35
- display: flex;
36
- justify-content: space-between;
37
- border-top: 1px solid var(--c-divider);
38
- padding-top: 1rem;
39
- }
40
-
41
- .prev,
42
- .next {
43
- display: flex;
44
- flex-shrink: 0;
45
- width: 50%;
46
- }
47
-
48
- .prev {
49
- justify-content: flex-start;
50
- padding-right: 12px;
51
- }
52
-
53
- .next {
54
- justify-content: flex-end;
55
- padding-left: 12px;
56
- }
57
-
58
- .link {
59
- display: inline-flex;
60
- align-items: center;
61
- max-width: 100%;
62
- font-size: 1rem;
63
- font-weight: 500;
64
- }
65
-
66
- .text {
67
- display: block;
68
- white-space: nowrap;
69
- overflow: hidden;
70
- text-overflow: ellipsis;
71
- }
72
-
73
- .icon {
74
- display: block;
75
- flex-shrink: 0;
76
- width: 16px;
77
- height: 16px;
78
- fill: var(--c-text);
79
- transform: translateY(1px);
80
- }
81
-
82
- .icon-prev {
83
- margin-right: 8px;
84
- }
85
- .icon-next {
86
- margin-left: 8px;
87
- }
88
- </style>
@@ -1,53 +0,0 @@
1
- <script setup lang="ts">
2
- import PageFooter from './PageFooter.vue'
3
- import NextAndPrevLinks from './NextAndPrevLinks.vue'
4
- </script>
5
-
6
- <template>
7
- <main class="page">
8
- <div class="container">
9
- <slot name="top" />
10
-
11
- <Content class="content" />
12
- <PageFooter />
13
- <NextAndPrevLinks />
14
-
15
- <slot name="bottom" />
16
- </div>
17
- </main>
18
- </template>
19
-
20
- <style scoped>
21
- .page {
22
- padding-top: var(--header-height);
23
- }
24
-
25
- @media (min-width: 720px) {
26
- .page {
27
- margin-left: 16.4rem;
28
- }
29
- }
30
-
31
- @media (min-width: 960px) {
32
- .page {
33
- margin-left: 20rem;
34
- }
35
- }
36
-
37
- .container {
38
- margin: 0 auto;
39
- padding: 0 1.5rem 4rem;
40
- max-width: 48rem;
41
- }
42
-
43
- .content {
44
- padding-bottom: 1.5rem;
45
- }
46
-
47
- @media (max-width: 420px) {
48
- .content {
49
- /* fix carbon ads display */
50
- clear: both;
51
- }
52
- }
53
- </style>
@@ -1,44 +0,0 @@
1
- <script setup lang="ts">
2
- import EditLink from './EditLink.vue'
3
- import LastUpdated from './LastUpdated.vue'
4
- import { useData } from 'vitepress'
5
-
6
- const { page } = useData()
7
- </script>
8
-
9
- <template>
10
- <footer class="page-footer">
11
- <div class="edit">
12
- <EditLink />
13
- </div>
14
- <div class="updated">
15
- <LastUpdated v-if="page.lastUpdated" />
16
- </div>
17
- </footer>
18
- </template>
19
-
20
- <style scoped>
21
- .page-footer {
22
- padding-top: 1rem;
23
- padding-bottom: 1rem;
24
- overflow: auto;
25
- }
26
-
27
- @media (min-width: 960px) {
28
- .page-footer {
29
- display: flex;
30
- justify-content: space-between;
31
- align-items: center;
32
- }
33
- }
34
-
35
- .updated {
36
- padding-top: 4px;
37
- }
38
-
39
- @media (min-width: 960px) {
40
- .updated {
41
- padding-top: 0;
42
- }
43
- }
44
- </style>
@@ -1,60 +0,0 @@
1
- <script setup lang="ts">
2
- import NavLinks from './NavLinks.vue'
3
- import SideBarLinks from './SideBarLinks.vue'
4
-
5
- defineProps<{ open: boolean }>()
6
- </script>
7
-
8
- <template>
9
- <aside class="sidebar" :class="{ open }">
10
- <NavLinks class="nav" />
11
-
12
- <slot name="sidebar-top" />
13
-
14
- <SideBarLinks />
15
-
16
- <slot name="sidebar-bottom" />
17
- </aside>
18
- </template>
19
-
20
- <style scoped>
21
- .sidebar {
22
- position: fixed;
23
- top: var(--header-height);
24
- bottom: 0;
25
- left: 0;
26
- z-index: var(--z-index-sidebar);
27
- border-right: 1px solid var(--c-divider);
28
- width: 16.4rem;
29
- background-color: var(--c-bg);
30
- overflow-y: auto;
31
- transform: translateX(-100%);
32
- transition: transform 0.25s ease;
33
- }
34
-
35
- @media (min-width: 720px) {
36
- .sidebar {
37
- transform: translateX(0);
38
- }
39
- }
40
-
41
- @media (min-width: 960px) {
42
- .sidebar {
43
- width: 20rem;
44
- }
45
- }
46
-
47
- .sidebar.open {
48
- transform: translateX(0);
49
- }
50
-
51
- .nav {
52
- display: block;
53
- }
54
-
55
- @media (min-width: 720px) {
56
- .nav {
57
- display: none;
58
- }
59
- }
60
- </style>
@@ -1,68 +0,0 @@
1
- import { h } from 'vue';
2
- import { useRoute, useData } from 'vitepress';
3
- import { joinUrl, isActive } from '../utils';
4
- export const SideBarLink = (props) => {
5
- const route = useRoute();
6
- const { site, frontmatter } = useData();
7
- const depth = props.depth || 1;
8
- const maxDepth = frontmatter.value.sidebarDepth || Infinity;
9
- const headers = route.data.headers;
10
- const text = props.item.text;
11
- const link = resolveLink(site.value.base, props.item.link);
12
- const children = props.item.children;
13
- const active = isActive(route, props.item.link);
14
- const childItems = depth < maxDepth
15
- ? createChildren(active, children, headers, depth + 1)
16
- : null;
17
- return h('li', { class: 'sidebar-link' }, [
18
- h(link ? 'a' : 'p', {
19
- class: { 'sidebar-link-item': true, active },
20
- href: link
21
- }, text),
22
- childItems
23
- ]);
24
- };
25
- function resolveLink(base, path) {
26
- if (path === undefined) {
27
- return path;
28
- }
29
- // keep relative hash to the same page
30
- if (path.startsWith('#')) {
31
- return path;
32
- }
33
- return joinUrl(base, path);
34
- }
35
- function createChildren(active, children, headers, depth = 1) {
36
- if (children && children.length > 0) {
37
- return h('ul', { class: 'sidebar-links' }, children.map((c) => {
38
- return h(SideBarLink, { item: c, depth });
39
- }));
40
- }
41
- return active && headers
42
- ? createChildren(false, resolveHeaders(headers), undefined, depth)
43
- : null;
44
- }
45
- function resolveHeaders(headers) {
46
- return mapHeaders(groupHeaders(headers));
47
- }
48
- function groupHeaders(headers) {
49
- headers = headers.map((h) => Object.assign({}, h));
50
- let lastH2;
51
- headers.forEach((h) => {
52
- if (h.level === 2) {
53
- lastH2 = h;
54
- }
55
- else if (lastH2) {
56
- ;
57
- (lastH2.children || (lastH2.children = [])).push(h);
58
- }
59
- });
60
- return headers.filter((h) => h.level === 2);
61
- }
62
- function mapHeaders(headers) {
63
- return headers.map((header) => ({
64
- text: header.title,
65
- link: `#${header.slug}`,
66
- children: header.children ? mapHeaders(header.children) : undefined
67
- }));
68
- }
@@ -1,12 +0,0 @@
1
- <script setup lang="ts">
2
- import { useSideBar } from '../composables/sideBar'
3
- import { SideBarLink } from './SideBarLink'
4
-
5
- const items = useSideBar()
6
- </script>
7
-
8
- <template>
9
- <ul v-if="items.length > 0" class="sidebar-links">
10
- <SideBarLink v-for="item of items" :item="item" />
11
- </ul>
12
- </template>
@@ -1,46 +0,0 @@
1
- <script lang="ts">
2
- export default {
3
- emits: ['toggle']
4
- }
5
- </script>
6
-
7
- <template>
8
- <div class="sidebar-button" @click="$emit('toggle')">
9
- <svg
10
- class="icon"
11
- xmlns="http://www.w3.org/2000/svg"
12
- aria-hidden="true"
13
- role="img"
14
- viewBox="0 0 448 512"
15
- >
16
- <path
17
- fill="currentColor"
18
- d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"
19
- class
20
- />
21
- </svg>
22
- </div>
23
- </template>
24
-
25
- <style>
26
- .sidebar-button {
27
- position: absolute;
28
- top: 0.6rem;
29
- left: 1rem;
30
- display: none;
31
- padding: 0.6rem;
32
- cursor: pointer;
33
- }
34
-
35
- .sidebar-button .icon {
36
- display: block;
37
- width: 1.25rem;
38
- height: 1.25rem;
39
- }
40
-
41
- @media screen and (max-width: 719px) {
42
- .sidebar-button {
43
- display: block;
44
- }
45
- }
46
- </style>
@@ -1,31 +0,0 @@
1
- <template>
2
- <svg
3
- class="icon outbound"
4
- xmlns="http://www.w3.org/2000/svg"
5
- aria-hidden="true"
6
- x="0px"
7
- y="0px"
8
- viewBox="0 0 100 100"
9
- width="15"
10
- height="15"
11
- >
12
- <path
13
- fill="currentColor"
14
- d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"
15
- />
16
- <polygon
17
- fill="currentColor"
18
- points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"
19
- />
20
- </svg>
21
- </template>
22
-
23
- <style>
24
- .icon.outbound {
25
- position: relative;
26
- top: -1px;
27
- display: inline-block;
28
- vertical-align: middle;
29
- color: var(--c-text-lighter);
30
- }
31
- </style>
@@ -1,99 +0,0 @@
1
- import { onMounted, onUnmounted, onUpdated } from 'vue';
2
- export function useActiveSidebarLinks() {
3
- let rootActiveLink = null;
4
- let activeLink = null;
5
- const onScroll = throttleAndDebounce(setActiveLink, 300);
6
- function setActiveLink() {
7
- const sidebarLinks = getSidebarLinks();
8
- const anchors = getAnchors(sidebarLinks);
9
- for (let i = 0; i < anchors.length; i++) {
10
- const anchor = anchors[i];
11
- const nextAnchor = anchors[i + 1];
12
- const [isActive, hash] = isAnchorActive(i, anchor, nextAnchor);
13
- if (isActive) {
14
- history.replaceState(null, document.title, hash ? hash : ' ');
15
- activateLink(hash);
16
- return;
17
- }
18
- }
19
- }
20
- function activateLink(hash) {
21
- deactiveLink(activeLink);
22
- deactiveLink(rootActiveLink);
23
- activeLink = document.querySelector(`.sidebar a[href="${hash}"]`);
24
- if (!activeLink) {
25
- return;
26
- }
27
- activeLink.classList.add('active');
28
- // also add active class to parent h2 anchors
29
- const rootLi = activeLink.closest('.sidebar-links > ul > li');
30
- if (rootLi && rootLi !== activeLink.parentElement) {
31
- rootActiveLink = rootLi.querySelector('a');
32
- rootActiveLink && rootActiveLink.classList.add('active');
33
- }
34
- else {
35
- rootActiveLink = null;
36
- }
37
- }
38
- function deactiveLink(link) {
39
- link && link.classList.remove('active');
40
- }
41
- onMounted(() => {
42
- setActiveLink();
43
- window.addEventListener('scroll', onScroll);
44
- });
45
- onUpdated(() => {
46
- // sidebar update means a route change
47
- activateLink(decodeURIComponent(location.hash));
48
- });
49
- onUnmounted(() => {
50
- window.removeEventListener('scroll', onScroll);
51
- });
52
- }
53
- function getSidebarLinks() {
54
- return [].slice.call(document.querySelectorAll('.sidebar a.sidebar-link-item'));
55
- }
56
- function getAnchors(sidebarLinks) {
57
- return [].slice
58
- .call(document.querySelectorAll('.header-anchor'))
59
- .filter((anchor) => sidebarLinks.some((sidebarLink) => sidebarLink.hash === anchor.hash));
60
- }
61
- function getPageOffset() {
62
- return document.querySelector('.nav-bar').offsetHeight;
63
- }
64
- function getAnchorTop(anchor) {
65
- const pageOffset = getPageOffset();
66
- return anchor.parentElement.offsetTop - pageOffset - 15;
67
- }
68
- function isAnchorActive(index, anchor, nextAnchor) {
69
- const scrollTop = window.scrollY;
70
- if (index === 0 && scrollTop === 0) {
71
- return [true, null];
72
- }
73
- if (scrollTop < getAnchorTop(anchor)) {
74
- return [false, null];
75
- }
76
- if (!nextAnchor || scrollTop < getAnchorTop(nextAnchor)) {
77
- return [true, decodeURIComponent(anchor.hash)];
78
- }
79
- return [false, null];
80
- }
81
- function throttleAndDebounce(fn, delay) {
82
- let timeout;
83
- let called = false;
84
- return () => {
85
- if (timeout) {
86
- clearTimeout(timeout);
87
- }
88
- if (!called) {
89
- fn();
90
- called = true;
91
- setTimeout(() => {
92
- called = false;
93
- }, delay);
94
- }
95
- else {
96
- timeout = setTimeout(fn, delay);
97
- }
98
- };
99
- }