themekit-js 1.1.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 (171) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/bin/themekit.js +2 -0
  4. package/client.d.ts +5 -0
  5. package/dist/client/app/components/ClientOnly.js +10 -0
  6. package/dist/client/app/components/Content.js +23 -0
  7. package/dist/client/app/composables/codeGroups.js +40 -0
  8. package/dist/client/app/composables/copyCode.js +73 -0
  9. package/dist/client/app/composables/head.js +81 -0
  10. package/dist/client/app/composables/preFetch.js +99 -0
  11. package/dist/client/app/data.js +59 -0
  12. package/dist/client/app/devtools.js +29 -0
  13. package/dist/client/app/index.js +140 -0
  14. package/dist/client/app/router.js +233 -0
  15. package/dist/client/app/ssr.js +10 -0
  16. package/dist/client/app/theme.js +1 -0
  17. package/dist/client/app/utils.js +119 -0
  18. package/dist/client/index.d.ts +1446 -0
  19. package/dist/client/index.js +9 -0
  20. package/dist/client/shared.js +139 -0
  21. package/dist/client/theme-default/Layout.vue +94 -0
  22. package/dist/client/theme-default/NotFound.vue +109 -0
  23. package/dist/client/theme-default/components/VPAlgoliaSearchBox.vue +99 -0
  24. package/dist/client/theme-default/components/VPBackdrop.vue +41 -0
  25. package/dist/client/theme-default/components/VPBadge.vue +86 -0
  26. package/dist/client/theme-default/components/VPButton.vue +123 -0
  27. package/dist/client/theme-default/components/VPCarbonAds.vue +109 -0
  28. package/dist/client/theme-default/components/VPContent.vue +98 -0
  29. package/dist/client/theme-default/components/VPDoc.vue +193 -0
  30. package/dist/client/theme-default/components/VPDocAside.vue +46 -0
  31. package/dist/client/theme-default/components/VPDocAsideCarbonAds.vue +18 -0
  32. package/dist/client/theme-default/components/VPDocAsideOutline.vue +87 -0
  33. package/dist/client/theme-default/components/VPDocAsideSponsors.vue +17 -0
  34. package/dist/client/theme-default/components/VPDocFooter.vue +145 -0
  35. package/dist/client/theme-default/components/VPDocFooterLastUpdated.vue +50 -0
  36. package/dist/client/theme-default/components/VPDocOutlineItem.vue +59 -0
  37. package/dist/client/theme-default/components/VPFeature.vue +123 -0
  38. package/dist/client/theme-default/components/VPFeatures.vue +121 -0
  39. package/dist/client/theme-default/components/VPFlyout.vue +136 -0
  40. package/dist/client/theme-default/components/VPFooter.vue +60 -0
  41. package/dist/client/theme-default/components/VPHero.vue +336 -0
  42. package/dist/client/theme-default/components/VPHome.vue +43 -0
  43. package/dist/client/theme-default/components/VPHomeContent.vue +52 -0
  44. package/dist/client/theme-default/components/VPHomeFeatures.vue +14 -0
  45. package/dist/client/theme-default/components/VPHomeHero.vue +24 -0
  46. package/dist/client/theme-default/components/VPHomeSponsors.vue +116 -0
  47. package/dist/client/theme-default/components/VPImage.vue +46 -0
  48. package/dist/client/theme-default/components/VPLink.vue +33 -0
  49. package/dist/client/theme-default/components/VPLocalNav.vue +171 -0
  50. package/dist/client/theme-default/components/VPLocalNavOutlineDropdown.vue +190 -0
  51. package/dist/client/theme-default/components/VPLocalSearchBox.vue +856 -0
  52. package/dist/client/theme-default/components/VPMenu.vue +72 -0
  53. package/dist/client/theme-default/components/VPMenuGroup.vue +47 -0
  54. package/dist/client/theme-default/components/VPMenuLink.vue +54 -0
  55. package/dist/client/theme-default/components/VPNav.vue +57 -0
  56. package/dist/client/theme-default/components/VPNavBar.vue +267 -0
  57. package/dist/client/theme-default/components/VPNavBarAppearance.vue +25 -0
  58. package/dist/client/theme-default/components/VPNavBarExtra.vue +94 -0
  59. package/dist/client/theme-default/components/VPNavBarHamburger.vue +79 -0
  60. package/dist/client/theme-default/components/VPNavBarMenu.vue +29 -0
  61. package/dist/client/theme-default/components/VPNavBarMenuGroup.vue +42 -0
  62. package/dist/client/theme-default/components/VPNavBarMenuLink.vue +53 -0
  63. package/dist/client/theme-default/components/VPNavBarSearch.vue +194 -0
  64. package/dist/client/theme-default/components/VPNavBarSearchButton.vue +208 -0
  65. package/dist/client/theme-default/components/VPNavBarSocialLinks.vue +27 -0
  66. package/dist/client/theme-default/components/VPNavBarTitle.vue +76 -0
  67. package/dist/client/theme-default/components/VPNavBarTranslations.vue +47 -0
  68. package/dist/client/theme-default/components/VPNavScreen.vue +99 -0
  69. package/dist/client/theme-default/components/VPNavScreenAppearance.vue +33 -0
  70. package/dist/client/theme-default/components/VPNavScreenMenu.vue +23 -0
  71. package/dist/client/theme-default/components/VPNavScreenMenuGroup.vue +111 -0
  72. package/dist/client/theme-default/components/VPNavScreenMenuGroupLink.vue +39 -0
  73. package/dist/client/theme-default/components/VPNavScreenMenuGroupSection.vue +34 -0
  74. package/dist/client/theme-default/components/VPNavScreenMenuLink.vue +39 -0
  75. package/dist/client/theme-default/components/VPNavScreenSocialLinks.vue +14 -0
  76. package/dist/client/theme-default/components/VPNavScreenTranslations.vue +73 -0
  77. package/dist/client/theme-default/components/VPPage.vue +7 -0
  78. package/dist/client/theme-default/components/VPSidebar.vue +137 -0
  79. package/dist/client/theme-default/components/VPSidebarItem.vue +250 -0
  80. package/dist/client/theme-default/components/VPSkipLink.vue +68 -0
  81. package/dist/client/theme-default/components/VPSocialLink.vue +50 -0
  82. package/dist/client/theme-default/components/VPSocialLinks.vue +27 -0
  83. package/dist/client/theme-default/components/VPSponsors.vue +48 -0
  84. package/dist/client/theme-default/components/VPSponsorsGrid.vue +48 -0
  85. package/dist/client/theme-default/components/VPSwitch.vue +63 -0
  86. package/dist/client/theme-default/components/VPSwitchAppearance.vue +52 -0
  87. package/dist/client/theme-default/components/VPTeamMembers.vue +66 -0
  88. package/dist/client/theme-default/components/VPTeamMembersItem.vue +225 -0
  89. package/dist/client/theme-default/components/VPTeamPage.vue +58 -0
  90. package/dist/client/theme-default/components/VPTeamPageSection.vue +77 -0
  91. package/dist/client/theme-default/components/VPTeamPageTitle.vue +63 -0
  92. package/dist/client/theme-default/components/icons/VPIconAlignJustify.vue +8 -0
  93. package/dist/client/theme-default/components/icons/VPIconAlignLeft.vue +8 -0
  94. package/dist/client/theme-default/components/icons/VPIconAlignRight.vue +8 -0
  95. package/dist/client/theme-default/components/icons/VPIconArrowLeft.vue +7 -0
  96. package/dist/client/theme-default/components/icons/VPIconArrowRight.vue +7 -0
  97. package/dist/client/theme-default/components/icons/VPIconChevronDown.vue +5 -0
  98. package/dist/client/theme-default/components/icons/VPIconChevronLeft.vue +5 -0
  99. package/dist/client/theme-default/components/icons/VPIconChevronRight.vue +5 -0
  100. package/dist/client/theme-default/components/icons/VPIconChevronUp.vue +5 -0
  101. package/dist/client/theme-default/components/icons/VPIconEdit.vue +6 -0
  102. package/dist/client/theme-default/components/icons/VPIconHeart.vue +5 -0
  103. package/dist/client/theme-default/components/icons/VPIconLanguages.vue +9 -0
  104. package/dist/client/theme-default/components/icons/VPIconMinus.vue +5 -0
  105. package/dist/client/theme-default/components/icons/VPIconMinusSquare.vue +6 -0
  106. package/dist/client/theme-default/components/icons/VPIconMoon.vue +5 -0
  107. package/dist/client/theme-default/components/icons/VPIconMoreHorizontal.vue +7 -0
  108. package/dist/client/theme-default/components/icons/VPIconPlus.vue +5 -0
  109. package/dist/client/theme-default/components/icons/VPIconPlusSquare.vue +6 -0
  110. package/dist/client/theme-default/components/icons/VPIconSun.vue +13 -0
  111. package/dist/client/theme-default/composables/aside.js +17 -0
  112. package/dist/client/theme-default/composables/data.js +2 -0
  113. package/dist/client/theme-default/composables/edit-link.js +16 -0
  114. package/dist/client/theme-default/composables/flyout.js +41 -0
  115. package/dist/client/theme-default/composables/langs.js +26 -0
  116. package/dist/client/theme-default/composables/local-nav.js +18 -0
  117. package/dist/client/theme-default/composables/nav.js +30 -0
  118. package/dist/client/theme-default/composables/outline.js +178 -0
  119. package/dist/client/theme-default/composables/prev-next.js +57 -0
  120. package/dist/client/theme-default/composables/sidebar.js +136 -0
  121. package/dist/client/theme-default/composables/sponsor-grid.js +94 -0
  122. package/dist/client/theme-default/fonts/inter-italic-cyrillic-ext.woff2 +0 -0
  123. package/dist/client/theme-default/fonts/inter-italic-cyrillic.woff2 +0 -0
  124. package/dist/client/theme-default/fonts/inter-italic-greek-ext.woff2 +0 -0
  125. package/dist/client/theme-default/fonts/inter-italic-greek.woff2 +0 -0
  126. package/dist/client/theme-default/fonts/inter-italic-latin-ext.woff2 +0 -0
  127. package/dist/client/theme-default/fonts/inter-italic-latin.woff2 +0 -0
  128. package/dist/client/theme-default/fonts/inter-italic-vietnamese.woff2 +0 -0
  129. package/dist/client/theme-default/fonts/inter-roman-cyrillic-ext.woff2 +0 -0
  130. package/dist/client/theme-default/fonts/inter-roman-cyrillic.woff2 +0 -0
  131. package/dist/client/theme-default/fonts/inter-roman-greek-ext.woff2 +0 -0
  132. package/dist/client/theme-default/fonts/inter-roman-greek.woff2 +0 -0
  133. package/dist/client/theme-default/fonts/inter-roman-latin-ext.woff2 +0 -0
  134. package/dist/client/theme-default/fonts/inter-roman-latin.woff2 +0 -0
  135. package/dist/client/theme-default/fonts/inter-roman-vietnamese.woff2 +0 -0
  136. package/dist/client/theme-default/index.js +3 -0
  137. package/dist/client/theme-default/styles/base.css +252 -0
  138. package/dist/client/theme-default/styles/components/custom-block.css +208 -0
  139. package/dist/client/theme-default/styles/components/vp-code-group.css +85 -0
  140. package/dist/client/theme-default/styles/components/vp-code.css +7 -0
  141. package/dist/client/theme-default/styles/components/vp-doc.css +570 -0
  142. package/dist/client/theme-default/styles/components/vp-sponsor.css +155 -0
  143. package/dist/client/theme-default/styles/fonts.css +157 -0
  144. package/dist/client/theme-default/styles/icons.css +123 -0
  145. package/dist/client/theme-default/styles/utils.css +9 -0
  146. package/dist/client/theme-default/styles/vars.css +563 -0
  147. package/dist/client/theme-default/support/lru.js +33 -0
  148. package/dist/client/theme-default/support/sidebar.js +89 -0
  149. package/dist/client/theme-default/support/translation.js +49 -0
  150. package/dist/client/theme-default/support/utils.js +33 -0
  151. package/dist/client/theme-default/without-fonts.js +32 -0
  152. package/dist/node/cli.js +444 -0
  153. package/dist/node/index.d.ts +4588 -0
  154. package/dist/node/index.js +198 -0
  155. package/dist/node/serve-BjvG349_.js +50301 -0
  156. package/lib/vue-demi.mjs +34 -0
  157. package/package.json +223 -0
  158. package/template/.vitepress/config.js +28 -0
  159. package/template/.vitepress/theme/Layout.vue +21 -0
  160. package/template/.vitepress/theme/index.js +29 -0
  161. package/template/.vitepress/theme/style.css +143 -0
  162. package/template/api-examples.md +49 -0
  163. package/template/index.md +28 -0
  164. package/template/markdown-examples.md +85 -0
  165. package/theme-without-fonts.d.ts +2 -0
  166. package/theme.d.ts +30 -0
  167. package/types/default-theme.d.ts +533 -0
  168. package/types/docsearch.d.ts +144 -0
  169. package/types/index.d.ts +3 -0
  170. package/types/local-search.d.ts +33 -0
  171. package/types/shared.d.ts +199 -0
@@ -0,0 +1,250 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import type { DefaultTheme } from 'vitepress/theme'
4
+ import { useSidebarControl } from '../composables/sidebar'
5
+ import VPLink from './VPLink.vue'
6
+
7
+ const props = defineProps<{
8
+ item: DefaultTheme.SidebarItem
9
+ depth: number
10
+ }>()
11
+
12
+ const {
13
+ collapsed,
14
+ collapsible,
15
+ isLink,
16
+ isActiveLink,
17
+ hasActiveLink,
18
+ hasChildren,
19
+ toggle
20
+ } = useSidebarControl(computed(() => props.item))
21
+
22
+ const sectionTag = computed(() => (hasChildren.value ? 'section' : `div`))
23
+
24
+ const linkTag = computed(() => (isLink.value ? 'a' : 'div'))
25
+
26
+ const textTag = computed(() => {
27
+ return !hasChildren.value
28
+ ? 'p'
29
+ : props.depth + 2 === 7
30
+ ? 'p'
31
+ : `h${props.depth + 2}`
32
+ })
33
+
34
+ const itemRole = computed(() => (isLink.value ? undefined : 'button'))
35
+
36
+ const classes = computed(() => [
37
+ [`level-${props.depth}`],
38
+ { collapsible: collapsible.value },
39
+ { collapsed: collapsed.value },
40
+ { 'is-link': isLink.value },
41
+ { 'is-active': isActiveLink.value },
42
+ { 'has-active': hasActiveLink.value }
43
+ ])
44
+
45
+ function onItemInteraction(e: MouseEvent | Event) {
46
+ if ('key' in e && e.key !== 'Enter') {
47
+ return
48
+ }
49
+ !props.item.link && toggle()
50
+ }
51
+
52
+ function onCaretClick() {
53
+ props.item.link && toggle()
54
+ }
55
+ </script>
56
+
57
+ <template>
58
+ <component :is="sectionTag" class="VPSidebarItem" :class="classes">
59
+ <div
60
+ v-if="item.text"
61
+ class="item"
62
+ :role="itemRole"
63
+ v-on="
64
+ item.items
65
+ ? { click: onItemInteraction, keydown: onItemInteraction }
66
+ : {}
67
+ "
68
+ :tabindex="item.items && 0"
69
+ >
70
+ <div class="indicator" />
71
+
72
+ <VPLink
73
+ v-if="item.link"
74
+ :tag="linkTag"
75
+ class="link"
76
+ :href="item.link"
77
+ :rel="item.rel"
78
+ :target="item.target"
79
+ >
80
+ <component :is="textTag" class="text" v-html="item.text" />
81
+ </VPLink>
82
+ <component v-else :is="textTag" class="text" v-html="item.text" />
83
+
84
+ <div
85
+ v-if="item.collapsed != null && item.items && item.items.length"
86
+ class="caret"
87
+ role="button"
88
+ aria-label="toggle section"
89
+ @click="onCaretClick"
90
+ @keydown.enter="onCaretClick"
91
+ tabindex="0"
92
+ >
93
+ <span class="vpi-chevron-right caret-icon" />
94
+ </div>
95
+ </div>
96
+
97
+ <div v-if="item.items && item.items.length" class="items">
98
+ <template v-if="depth < 5">
99
+ <VPSidebarItem
100
+ v-for="i in item.items"
101
+ :key="i.text"
102
+ :item="i"
103
+ :depth="depth + 1"
104
+ />
105
+ </template>
106
+ </div>
107
+ </component>
108
+ </template>
109
+
110
+ <style scoped>
111
+ .VPSidebarItem.level-0 {
112
+ padding-bottom: 24px;
113
+ }
114
+
115
+ .VPSidebarItem.collapsed.level-0 {
116
+ padding-bottom: 10px;
117
+ }
118
+
119
+ .item {
120
+ position: relative;
121
+ display: flex;
122
+ width: 100%;
123
+ }
124
+
125
+ .VPSidebarItem.collapsible > .item {
126
+ cursor: pointer;
127
+ }
128
+
129
+ .indicator {
130
+ position: absolute;
131
+ top: 6px;
132
+ bottom: 6px;
133
+ left: -17px;
134
+ width: 2px;
135
+ border-radius: 2px;
136
+ transition: background-color 0.25s;
137
+ }
138
+
139
+ .VPSidebarItem.level-2.is-active > .item > .indicator,
140
+ .VPSidebarItem.level-3.is-active > .item > .indicator,
141
+ .VPSidebarItem.level-4.is-active > .item > .indicator,
142
+ .VPSidebarItem.level-5.is-active > .item > .indicator {
143
+ background-color: var(--vp-c-brand-1);
144
+ }
145
+
146
+ .link {
147
+ display: flex;
148
+ align-items: center;
149
+ flex-grow: 1;
150
+ }
151
+
152
+ .text {
153
+ flex-grow: 1;
154
+ padding: 4px 0;
155
+ line-height: 24px;
156
+ font-size: 14px;
157
+ transition: color 0.25s;
158
+ }
159
+
160
+ .VPSidebarItem.level-0 .text {
161
+ font-weight: 700;
162
+ color: var(--vp-c-text-1);
163
+ }
164
+
165
+ .VPSidebarItem.level-1 .text,
166
+ .VPSidebarItem.level-2 .text,
167
+ .VPSidebarItem.level-3 .text,
168
+ .VPSidebarItem.level-4 .text,
169
+ .VPSidebarItem.level-5 .text {
170
+ font-weight: 500;
171
+ color: var(--vp-c-text-2);
172
+ }
173
+
174
+ .VPSidebarItem.level-0.is-link > .item > .link:hover .text,
175
+ .VPSidebarItem.level-1.is-link > .item > .link:hover .text,
176
+ .VPSidebarItem.level-2.is-link > .item > .link:hover .text,
177
+ .VPSidebarItem.level-3.is-link > .item > .link:hover .text,
178
+ .VPSidebarItem.level-4.is-link > .item > .link:hover .text,
179
+ .VPSidebarItem.level-5.is-link > .item > .link:hover .text {
180
+ color: var(--vp-c-brand-1);
181
+ }
182
+
183
+ .VPSidebarItem.level-0.has-active > .item > .text,
184
+ .VPSidebarItem.level-1.has-active > .item > .text,
185
+ .VPSidebarItem.level-2.has-active > .item > .text,
186
+ .VPSidebarItem.level-3.has-active > .item > .text,
187
+ .VPSidebarItem.level-4.has-active > .item > .text,
188
+ .VPSidebarItem.level-5.has-active > .item > .text,
189
+ .VPSidebarItem.level-0.has-active > .item > .link > .text,
190
+ .VPSidebarItem.level-1.has-active > .item > .link > .text,
191
+ .VPSidebarItem.level-2.has-active > .item > .link > .text,
192
+ .VPSidebarItem.level-3.has-active > .item > .link > .text,
193
+ .VPSidebarItem.level-4.has-active > .item > .link > .text,
194
+ .VPSidebarItem.level-5.has-active > .item > .link > .text {
195
+ color: var(--vp-c-text-1);
196
+ }
197
+
198
+ .VPSidebarItem.level-0.is-active > .item .link > .text,
199
+ .VPSidebarItem.level-1.is-active > .item .link > .text,
200
+ .VPSidebarItem.level-2.is-active > .item .link > .text,
201
+ .VPSidebarItem.level-3.is-active > .item .link > .text,
202
+ .VPSidebarItem.level-4.is-active > .item .link > .text,
203
+ .VPSidebarItem.level-5.is-active > .item .link > .text {
204
+ color: var(--vp-c-brand-1);
205
+ }
206
+
207
+ .caret {
208
+ display: flex;
209
+ justify-content: center;
210
+ align-items: center;
211
+ margin-right: -7px;
212
+ width: 32px;
213
+ height: 32px;
214
+ color: var(--vp-c-text-3);
215
+ cursor: pointer;
216
+ transition: color 0.25s;
217
+ flex-shrink: 0;
218
+ }
219
+
220
+ .item:hover .caret {
221
+ color: var(--vp-c-text-2);
222
+ }
223
+
224
+ .item:hover .caret:hover {
225
+ color: var(--vp-c-text-1);
226
+ }
227
+
228
+ .caret-icon {
229
+ font-size: 18px;
230
+ transform: rotate(90deg);
231
+ transition: transform 0.25s;
232
+ }
233
+
234
+ .VPSidebarItem.collapsed .caret-icon {
235
+ transform: rotate(0);
236
+ }
237
+
238
+ .VPSidebarItem.level-1 .items,
239
+ .VPSidebarItem.level-2 .items,
240
+ .VPSidebarItem.level-3 .items,
241
+ .VPSidebarItem.level-4 .items,
242
+ .VPSidebarItem.level-5 .items {
243
+ border-left: 1px solid var(--vp-c-divider);
244
+ padding-left: 16px;
245
+ }
246
+
247
+ .VPSidebarItem.collapsed .items {
248
+ display: none;
249
+ }
250
+ </style>
@@ -0,0 +1,68 @@
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.getElementById(
12
+ decodeURIComponent((target as HTMLAnchorElement).hash).slice(1)
13
+ )
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-1);
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
+ @media (min-width: 1280px) {
63
+ .VPSkipLink {
64
+ top: 14px;
65
+ left: 16px;
66
+ }
67
+ }
68
+ </style>
@@ -0,0 +1,50 @@
1
+ <script lang="ts" setup>
2
+ import type { DefaultTheme } from 'vitepress/theme'
3
+ import { computed } from 'vue'
4
+
5
+ const props = defineProps<{
6
+ icon: DefaultTheme.SocialLinkIcon
7
+ link: string
8
+ ariaLabel?: string
9
+ }>()
10
+
11
+ const svg = computed(() => {
12
+ if (typeof props.icon === 'object') return props.icon.svg
13
+ return `<span class="vpi-social-${props.icon}" />`
14
+ })
15
+ </script>
16
+
17
+ <template>
18
+ <a
19
+ class="VPSocialLink no-icon"
20
+ :href="link"
21
+ :aria-label="ariaLabel ?? (typeof icon === 'string' ? icon : '')"
22
+ target="_blank"
23
+ rel="noopener"
24
+ v-html="svg"
25
+ ></a>
26
+ </template>
27
+
28
+ <style scoped>
29
+ .VPSocialLink {
30
+ display: flex;
31
+ justify-content: center;
32
+ align-items: center;
33
+ width: 36px;
34
+ height: 36px;
35
+ color: var(--vp-c-text-2);
36
+ transition: color 0.5s;
37
+ }
38
+
39
+ .VPSocialLink:hover {
40
+ color: var(--vp-c-text-1);
41
+ transition: color 0.25s;
42
+ }
43
+
44
+ .VPSocialLink > :deep(svg),
45
+ .VPSocialLink > :deep([class^="vpi-social-"]) {
46
+ width: 20px;
47
+ height: 20px;
48
+ fill: currentColor;
49
+ }
50
+ </style>
@@ -0,0 +1,27 @@
1
+ <script lang="ts" setup>
2
+ import type { DefaultTheme } from 'vitepress/theme'
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, ariaLabel } in links"
14
+ :key="link"
15
+ :icon="icon"
16
+ :link="link"
17
+ :ariaLabel="ariaLabel"
18
+ />
19
+ </div>
20
+ </template>
21
+
22
+ <style scoped>
23
+ .VPSocialLinks {
24
+ display: flex;
25
+ justify-content: center;
26
+ }
27
+ </style>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import type { GridSize } from '../composables/sponsor-grid'
3
+ import type { Sponsor } from './VPSponsorsGrid.vue'
4
+ import { computed } from 'vue'
5
+ import VPSponsorsGrid from './VPSponsorsGrid.vue'
6
+
7
+ export interface Sponsors {
8
+ tier?: string
9
+ size?: GridSize
10
+ items: Sponsor[]
11
+ }
12
+ interface Props {
13
+ mode?: 'normal' | 'aside'
14
+ tier?: string
15
+ size?: GridSize
16
+ data: Sponsors[] | Sponsor[]
17
+ }
18
+ const props = withDefaults(defineProps<Props>(), {
19
+ mode: 'normal'
20
+ })
21
+
22
+ const sponsors = computed(() => {
23
+ const isSponsors = props.data.some((s) => {
24
+ return 'items' in s
25
+ })
26
+
27
+ if (isSponsors) {
28
+ return props.data as Sponsors[]
29
+ }
30
+
31
+ return [
32
+ { tier: props.tier, size: props.size, items: props.data as Sponsor[] }
33
+ ]
34
+ })
35
+ </script>
36
+
37
+ <template>
38
+ <div class="VPSponsors vp-sponsor" :class="[mode]">
39
+ <section
40
+ v-for="(sponsor, index) in sponsors"
41
+ :key="index"
42
+ class="vp-sponsor-section"
43
+ >
44
+ <h3 v-if="sponsor.tier" class="vp-sponsor-tier">{{ sponsor.tier }}</h3>
45
+ <VPSponsorsGrid :size="sponsor.size" :data="sponsor.items" />
46
+ </section>
47
+ </div>
48
+ </template>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import type { GridSize } from '../composables/sponsor-grid'
3
+ import { ref } from 'vue'
4
+ import { useSponsorsGrid } from '../composables/sponsor-grid'
5
+
6
+ export interface Sponsor {
7
+ name: string
8
+ img: string
9
+ url: string
10
+ }
11
+ interface Props {
12
+ size?: GridSize
13
+ data: Sponsor[]
14
+ }
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ size: 'medium'
17
+ })
18
+
19
+ const el = ref(null)
20
+
21
+ useSponsorsGrid({ el, size: props.size })
22
+ </script>
23
+
24
+ <template>
25
+ <div class="VPSponsorsGrid vp-sponsor-grid" :class="[size]" ref="el">
26
+ <div
27
+ v-for="sponsor in data"
28
+ :key="sponsor.name"
29
+ class="vp-sponsor-grid-item"
30
+ >
31
+ <a
32
+ class="vp-sponsor-grid-link"
33
+ :href="sponsor.url"
34
+ target="_blank"
35
+ rel="sponsored noopener"
36
+ >
37
+ <article class="vp-sponsor-grid-box">
38
+ <h4 class="visually-hidden">{{ sponsor.name }}</h4>
39
+ <img
40
+ class="vp-sponsor-grid-image"
41
+ :src="sponsor.img"
42
+ :alt="sponsor.name"
43
+ />
44
+ </article>
45
+ </a>
46
+ </div>
47
+ </div>
48
+ </template>
@@ -0,0 +1,63 @@
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-input-border-color);
20
+ background-color: var(--vp-input-switch-bg-color);
21
+ transition: border-color 0.25s !important;
22
+ }
23
+
24
+ .VPSwitch:hover {
25
+ border-color: var(--vp-c-brand-1);
26
+ }
27
+
28
+ .check {
29
+ position: absolute;
30
+ top: 1px;
31
+ /*rtl:ignore*/
32
+ left: 1px;
33
+ width: 18px;
34
+ height: 18px;
35
+ border-radius: 50%;
36
+ background-color: var(--vp-c-neutral-inverse);
37
+ box-shadow: var(--vp-shadow-1);
38
+ transition: transform 0.25s !important;
39
+ }
40
+
41
+ .icon {
42
+ position: relative;
43
+ display: block;
44
+ width: 18px;
45
+ height: 18px;
46
+ border-radius: 50%;
47
+ overflow: hidden;
48
+ }
49
+
50
+ .icon :deep([class^='vpi-']) {
51
+ position: absolute;
52
+ top: 3px;
53
+ left: 3px;
54
+ width: 12px;
55
+ height: 12px;
56
+ color: var(--vp-c-text-2);
57
+ }
58
+
59
+ .dark .icon :deep([class^='vpi-']) {
60
+ color: var(--vp-c-text-1);
61
+ transition: opacity 0.25s !important;
62
+ }
63
+ </style>
@@ -0,0 +1,52 @@
1
+ <script lang="ts" setup>
2
+ import { inject, computed } from 'vue'
3
+ import { useData } from '../composables/data'
4
+ import VPSwitch from './VPSwitch.vue'
5
+
6
+ const { isDark, theme } = useData()
7
+
8
+ const toggleAppearance = inject('toggle-appearance', () => {
9
+ isDark.value = !isDark.value
10
+ })
11
+
12
+ const switchTitle = computed(() => {
13
+ return isDark.value
14
+ ? theme.value.lightModeSwitchTitle || 'Switch to light theme'
15
+ : theme.value.darkModeSwitchTitle || 'Switch to dark theme'
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <VPSwitch
21
+ :title="switchTitle"
22
+ class="VPSwitchAppearance"
23
+ :aria-checked="isDark"
24
+ @click="toggleAppearance"
25
+ >
26
+ <span class="vpi-sun sun" />
27
+ <span class="vpi-moon moon" />
28
+ </VPSwitch>
29
+ </template>
30
+
31
+ <style scoped>
32
+ .sun {
33
+ opacity: 1;
34
+ }
35
+
36
+ .moon {
37
+ opacity: 0;
38
+ }
39
+
40
+ .dark .sun {
41
+ opacity: 0;
42
+ }
43
+
44
+ .dark .moon {
45
+ opacity: 1;
46
+ }
47
+
48
+ .dark .VPSwitchAppearance :deep(.check) {
49
+ /*rtl:ignore*/
50
+ transform: translateX(18px);
51
+ }
52
+ </style>
@@ -0,0 +1,66 @@
1
+ <script setup lang="ts">
2
+ import type { DefaultTheme } from 'vitepress/theme'
3
+ import { computed } from 'vue'
4
+ import VPTeamMembersItem from './VPTeamMembersItem.vue'
5
+
6
+ interface Props {
7
+ size?: 'small' | 'medium'
8
+ members: DefaultTheme.TeamMember[]
9
+ }
10
+
11
+ const props = withDefaults(defineProps<Props>(), {
12
+ size: 'medium'
13
+ })
14
+
15
+ const classes = computed(() => [props.size, `count-${props.members.length}`])
16
+ </script>
17
+
18
+ <template>
19
+ <div class="VPTeamMembers" :class="classes">
20
+ <div class="container">
21
+ <div v-for="member in members" :key="member.name" class="item">
22
+ <VPTeamMembersItem :size="size" :member="member" />
23
+ </div>
24
+ </div>
25
+ </div>
26
+ </template>
27
+
28
+ <style scoped>
29
+ .VPTeamMembers.small .container {
30
+ grid-template-columns: repeat(auto-fit, minmax(224px, 1fr));
31
+ }
32
+
33
+ .VPTeamMembers.small.count-1 .container {
34
+ max-width: 276px;
35
+ }
36
+ .VPTeamMembers.small.count-2 .container {
37
+ max-width: calc(276px * 2 + 24px);
38
+ }
39
+ .VPTeamMembers.small.count-3 .container {
40
+ max-width: calc(276px * 3 + 24px * 2);
41
+ }
42
+
43
+ .VPTeamMembers.medium .container {
44
+ grid-template-columns: repeat(auto-fit, minmax(256px, 1fr));
45
+ }
46
+
47
+ @media (min-width: 375px) {
48
+ .VPTeamMembers.medium .container {
49
+ grid-template-columns: repeat(auto-fit, minmax(288px, 1fr));
50
+ }
51
+ }
52
+
53
+ .VPTeamMembers.medium.count-1 .container {
54
+ max-width: 368px;
55
+ }
56
+ .VPTeamMembers.medium.count-2 .container {
57
+ max-width: calc(368px * 2 + 24px);
58
+ }
59
+
60
+ .container {
61
+ display: grid;
62
+ gap: 24px;
63
+ margin: 0 auto;
64
+ max-width: 1152px;
65
+ }
66
+ </style>