@voidzero-dev/vitepress-theme 2.0.0 → 2.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 (79) hide show
  1. package/package.json +7 -6
  2. package/src/aliases.js +14 -0
  3. package/src/vitepress/assets/clients/clickup.svg +5 -0
  4. package/src/vitepress/assets/clients/stripe.svg +3 -0
  5. package/src/vitepress/components/oss/Footer.vue +4 -21
  6. package/src/vitepress/components/oss/Header.vue +82 -180
  7. package/src/vitepress/components/oss/Sponsors.vue +3 -3
  8. package/src/vitepress/components/oss/TopBanner.vue +20 -79
  9. package/src/vitepress/components/oss/TrustedBy.vue +1 -1
  10. package/src/vitepress/components/vite/Community.vue +3 -3
  11. package/src/vitepress/components/vite/FeatureGrid1.vue +63 -0
  12. package/src/vitepress/components/vite/{FeatureGrid.vue → FeatureGrid2.vue} +8 -10
  13. package/src/vitepress/components/vite/Hero.vue +6 -15
  14. package/src/vitepress/components/vitepress-default/VPDocOutlineItem.vue +2 -2
  15. package/src/vitepress/components/vitepress-default/VPFlyout.vue +1 -1
  16. package/src/vitepress/components/vitepress-default/VPMenuLink.vue +1 -1
  17. package/src/vitepress/components/vitepress-default/VPNavBarMenuLink.vue +1 -1
  18. package/src/vitepress/components/vitepress-default/VPSidebarItem.vue +1 -1
  19. package/src/vitepress/components/vitepress-default/VPSocialLink.vue +1 -2
  20. package/src/vitepress/fonts/APK-Protocol-Semi-Bold.woff2 +0 -0
  21. package/src/vitepress/fonts/inter-italic-cyrillic-ext.woff2 +0 -0
  22. package/src/vitepress/fonts/inter-italic-cyrillic.woff2 +0 -0
  23. package/src/vitepress/fonts/inter-italic-greek-ext.woff2 +0 -0
  24. package/src/vitepress/fonts/inter-italic-greek.woff2 +0 -0
  25. package/src/vitepress/fonts/inter-italic-latin-ext.woff2 +0 -0
  26. package/src/vitepress/fonts/inter-italic-latin.woff2 +0 -0
  27. package/src/vitepress/fonts/inter-italic-vietnamese.woff2 +0 -0
  28. package/src/vitepress/fonts/inter-roman-cyrillic-ext.woff2 +0 -0
  29. package/src/vitepress/fonts/inter-roman-cyrillic.woff2 +0 -0
  30. package/src/vitepress/fonts/inter-roman-greek-ext.woff2 +0 -0
  31. package/src/vitepress/fonts/inter-roman-greek.woff2 +0 -0
  32. package/src/vitepress/fonts/inter-roman-latin-ext.woff2 +0 -0
  33. package/src/vitepress/fonts/inter-roman-latin.woff2 +0 -0
  34. package/src/vitepress/fonts/inter-roman-vietnamese.woff2 +0 -0
  35. package/src/vitepress/index.ts +64 -230
  36. package/src/vitepress/layouts/VPLayout.vue +2 -17
  37. package/src/vitepress/styles/tokens.css +194 -10
  38. package/src/vitepress/types/theme-context.ts +33 -0
  39. package/src/vitepress/assets/clients/beehiiv.svg +0 -30
  40. package/src/vitepress/assets/clients/excalidraw.svg +0 -82
  41. package/src/vitepress/assets/clients/get-your-guide.svg +0 -1
  42. package/src/vitepress/assets/clients/posthog.svg +0 -1
  43. package/src/vitepress/assets/clients/ramp.svg +0 -1
  44. package/src/vitepress/assets/clients/shopee.svg +0 -55
  45. package/src/vitepress/components/vite/FeaturePanel1.vue +0 -41
  46. package/src/vitepress/components/vite/FeaturePanel2.vue +0 -37
  47. package/src/vitepress/components/vite/FeaturePanel3.vue +0 -43
  48. package/src/vitepress/components/vite/FeaturePanel4.vue +0 -46
  49. package/src/vitepress/components/voidzero/Footer.vue +0 -65
  50. package/src/vitepress/components/voidzero/Header.vue +0 -560
  51. package/src/vitepress/components/voidzero/Megamenu.vue +0 -190
  52. package/src/vitepress/components/voidzero/about/CareerCTA.vue +0 -56
  53. package/src/vitepress/components/voidzero/about/Hero.vue +0 -206
  54. package/src/vitepress/components/voidzero/about/Investors.vue +0 -112
  55. package/src/vitepress/components/voidzero/about/TeamGrid.vue +0 -161
  56. package/src/vitepress/components/voidzero/about/TeamSectionHeading.vue +0 -13
  57. package/src/vitepress/components/voidzero/blog/BlogArchive.vue +0 -223
  58. package/src/vitepress/components/voidzero/blog/BlogSingleContent.vue +0 -364
  59. package/src/vitepress/components/voidzero/blog/BlogSingleHero.vue +0 -113
  60. package/src/vitepress/components/voidzero/blog/BlogSingleRelated.vue +0 -92
  61. package/src/vitepress/components/voidzero/blog/FeaturedArticles.vue +0 -146
  62. package/src/vitepress/components/voidzero/blog/types.ts +0 -56
  63. package/src/vitepress/components/voidzero/home/CaseStudySlider.vue +0 -235
  64. package/src/vitepress/components/voidzero/home/CustomersSectionHeading.vue +0 -5
  65. package/src/vitepress/components/voidzero/home/GitHubStats.vue +0 -27
  66. package/src/vitepress/components/voidzero/home/Hero.vue +0 -69
  67. package/src/vitepress/components/voidzero/home/Investors.vue +0 -30
  68. package/src/vitepress/components/voidzero/home/NewsletterCTA.vue +0 -23
  69. package/src/vitepress/components/voidzero/home/OpenSourceSectionHeading.vue +0 -6
  70. package/src/vitepress/components/voidzero/home/OpenSourceSectionProjects.vue +0 -419
  71. package/src/vitepress/components/voidzero/home/Resources.vue +0 -144
  72. package/src/vitepress/components/voidzero/home/Statistics.vue +0 -507
  73. package/src/vitepress/components/voidzero/home/StatisticsSectionHeading.vue +0 -5
  74. package/src/vitepress/components/voidzero/home/TeamCTA.vue +0 -17
  75. package/src/vitepress/components/voidzero/home/TrustedBy.vue +0 -248
  76. package/src/vitepress/components/voidzero/home/VitePlusSectionFeatures.vue +0 -55
  77. package/src/vitepress/components/voidzero/home/VitePlusSectionHeading.vue +0 -17
  78. package/src/vitepress/fonts/KHTeka-Medium.woff2 +0 -0
  79. package/src/vitepress/fonts/KHTeka-Regular.woff2 +0 -0
@@ -15,247 +15,80 @@
15
15
 
16
16
  // Unified design system - single import
17
17
  // Contains: tokens → base → docs → marketing (in that order)
18
- import './styles/index.css'
18
+ import "./styles/index.css";
19
19
 
20
- import type {Theme} from 'vitepress'
21
- import {watch} from 'vue'
20
+ import type { Theme } from "vitepress";
21
+ import { watch } from "vue";
22
22
 
23
23
  // Main layout router
24
- import VPLayout from './layouts/VPLayout.vue'
25
-
26
- // Shared components
27
- import Terminal from '@components/shared/Terminal.vue'
28
- import Eyebrow from '@components/shared/Eyebrow.vue'
29
- import RiveAnimation from '@components/shared/RiveAnimation.vue'
30
- import LogoGrid from '@components/shared/LogoGrid.vue'
31
- import CodeGroup from '@components/shared/CodeGroup.vue'
32
-
24
+ import VPLayout from "./layouts/VPLayout.vue";
33
25
  // VitePress default theme components (forked)
34
- import VPBadge from '@vp-default/VPBadge.vue'
35
-
36
- // Vite+
37
- import VitePlusHeader from '@components/viteplus/Header.vue'
38
-
39
- // VoidZero
40
- import VoidZeroFooter from '@components/voidzero/Footer.vue'
41
- import VoidZeroHeader from '@components/voidzero/Header.vue'
42
-
43
- // VoidZero (Home)
44
- import VoidZeroHomeHero from '@components/voidzero/home/Hero.vue'
45
- import TrustedBy from "@components/voidzero/home/TrustedBy.vue"
46
- import VitePlusSectionHeading from "@components/voidzero/home/VitePlusSectionHeading.vue"
47
- import VitePlusSectionFeatures from "@components/voidzero/home/VitePlusSectionFeatures.vue"
48
- import OpenSourceSectionHeading from "@components/voidzero/home/OpenSourceSectionHeading.vue"
49
- import OpenSourceSectionProjects from "@components/voidzero/home/OpenSourceSectionProjects.vue"
50
- import CustomersSectionHeading from "@components/voidzero/home/CustomersSectionHeading.vue"
51
- import CaseStudySlider from "@components/voidzero/home/CaseStudySlider.vue"
52
- import StatisticsSectionHeading from "@components/voidzero/home/StatisticsSectionHeading.vue"
53
- import Statistics from "@components/voidzero/home/Statistics.vue"
54
- import TeamCTA from "@components/voidzero/home/TeamCTA.vue"
55
- import Investors from "@components/voidzero/home/Investors.vue"
56
- import Spacer from "@components/shared/Spacer.vue"
57
- import Resources from "@components/voidzero/home/Resources.vue"
58
- import NewsletterCTA from "@components/voidzero/home/NewsletterCTA.vue"
59
-
60
- // VoidZero (About)
61
- import VoidZeroAboutHero from '@components/voidzero/about/Hero.vue'
62
- import TeamSectionHeading from "@components/voidzero/about/TeamSectionHeading.vue"
63
- import TeamGrid from "@components/voidzero/about/TeamGrid.vue"
64
- import CareerCTA from '@components/voidzero/about/CareerCTA.vue'
65
- import VoidZeroAboutInvestors from '@components/voidzero/about/Investors.vue'
66
-
67
- // VoidZero (Articles)
68
- import FeaturedArticles from '@components/voidzero/blog/FeaturedArticles.vue'
69
- import BlogArchive from '@components/voidzero/blog/BlogArchive.vue'
70
- import BlogSingleHero from "@components/voidzero/blog/BlogSingleHero.vue";
71
- import BlogSingleContent from "@components/voidzero/blog/BlogSingleContent.vue";
72
- import BlogSingleRelated from "@components/voidzero/blog/BlogSingleRelated.vue";
73
-
74
- // OSS
75
- import OSSHeader from '@components/oss/Header.vue'
76
- import OSSFooter from '@components/oss/Footer.vue'
77
- import OSSTrustedBy from '@components/oss/TrustedBy.vue'
78
- import OSSHeadingSection from '@components/oss/HeadingSection.vue'
79
- import OSSSponsors from '@components/oss/Sponsors.vue'
80
-
81
- // Vite
82
- import ViteHero from '@components/vite/Hero.vue'
83
- import ViteFeaturePanel1 from '@components/vite/FeaturePanel1.vue'
84
- import ViteFeaturePanel2 from '@components/vite/FeaturePanel2.vue'
85
- import ViteFeaturePanel3 from '@components/vite/FeaturePanel3.vue'
86
- import ViteFeaturePanel4 from '@components/vite/FeaturePanel4.vue'
87
- import ViteFeatureGrid from '@components/vite/FeatureGrid.vue'
88
- import ViteFrameworks from '@components/vite/Frameworks.vue'
89
- import ViteCommunity from '@components/vite/Community.vue'
90
-
91
- // Vitest
92
- import VitestHero from '@components/vitest/Hero.vue'
93
- import VitestIntro from '@components/vitest/Intro.vue'
94
- import VitestFeatureGrid from '@components/vitest/FeatureGrid.vue'
95
-
96
- // Rolldown
97
- import RolldownHero from '@components/rolldown/Hero.vue'
98
- import RolldownFeatureGrid from '@components/rolldown/FeatureGrid.vue'
99
-
100
- // OXC
101
- import OXCHero from '@components/oxc/Hero.vue'
102
- import OXCFeatureToolbar from '@components/oxc/FeatureToolbar.vue'
103
- import OXCFeatureParser from '@components/oxc/FeatureParser.vue'
104
- import OXCFeatureLinter from '@components/oxc/FeatureLinter.vue'
105
- import OXCFeatureResolver from '@components/oxc/FeatureResolver.vue'
106
- import OXCFeatureTransformer from '@components/oxc/FeatureTransformer.vue'
107
- import OXCFeatureMinifierFormatter from '@components/oxc/FeatureMinifierFormatter.vue'
26
+ import VPBadge from "@vp-default/VPBadge.vue";
108
27
 
109
28
  const VoidZeroTheme = {
110
- Layout: VPLayout, // Smart layout router that switches between VP and custom layouts
111
- enhanceApp({app, router, siteData}) {
112
- const variant = siteData.value.themeConfig?.variant || 'voidzero'
113
- if (typeof document !== 'undefined') {
114
- document.documentElement.setAttribute('data-variant', variant)
115
-
116
- // Watch for frontmatter.theme changes and apply theme logic
117
- watch(
118
- () => router.route.data.frontmatter?.theme,
119
- (theme) => {
120
- if (theme) {
121
- // Forced theme via frontmatter
122
- document.documentElement.setAttribute('data-theme', theme)
123
- } else if (variant === 'voidzero' || variant === 'viteplus') {
124
- // Non-OSS: Always force light mode (ignore user preference)
125
- document.documentElement.setAttribute('data-theme', 'light')
126
- } else {
127
- // OSS: Respect user preference, but default to dark if no preference
128
- document.documentElement.removeAttribute('data-theme')
129
-
130
- const hasUserPreference = localStorage.getItem('vitepress-theme-appearance')
131
- if (!hasUserPreference && !document.documentElement.classList.contains('dark')) {
132
- // No user preference - set dark as default for OSS
133
- document.documentElement.classList.add('dark')
134
- }
135
- }
136
- },
137
- {immediate: true}
138
- )
139
- }
140
-
141
- // VitePress default theme component (for markdown usage)
142
- app.component('Badge', VPBadge)
143
-
144
- // Shared Components
145
- app.component('Terminal', Terminal)
146
- app.component('Eyebrow', Eyebrow)
147
- app.component('RiveAnimation', RiveAnimation)
148
- app.component('LogoGrid', LogoGrid)
149
- app.component('Spacer', Spacer)
150
- app.component('CodeGroup', CodeGroup)
151
- if (variant === 'viteplus') {
152
- // Vite+
153
- app.component('Header', VitePlusHeader)
154
- } else if (variant === 'voidzero') {
155
- // VoidZero
156
- app.component('Header', VoidZeroHeader)
157
- app.component('Footer', VoidZeroFooter)
158
- app.component('Hero', VoidZeroHomeHero)
159
- app.component('TrustedBy', TrustedBy)
160
- app.component('VitePlusSectionHeading', VitePlusSectionHeading)
161
- app.component('VitePlusSectionFeatures', VitePlusSectionFeatures)
162
- app.component('OpenSourceSectionHeading', OpenSourceSectionHeading)
163
- app.component('OpenSourceSectionProjects', OpenSourceSectionProjects)
164
- app.component('CustomersSectionHeading', CustomersSectionHeading)
165
- app.component('CaseStudySlider', CaseStudySlider)
166
- app.component('StatisticsSectionHeading', StatisticsSectionHeading)
167
- app.component('Statistics', Statistics)
168
- app.component('TeamCTA', TeamCTA)
169
- app.component('Investors', Investors)
170
- app.component('Resources', Resources)
171
- app.component('NewsletterCTA', NewsletterCTA)
172
- app.component('AboutHero', VoidZeroAboutHero)
173
- app.component('TeamSectionHeading', TeamSectionHeading)
174
- app.component('TeamGrid', TeamGrid)
175
- app.component('CareerCTA', CareerCTA)
176
- app.component('AboutInvestors', VoidZeroAboutInvestors)
177
- app.component('FeaturedArticles', FeaturedArticles)
178
- app.component('BlogArchive', BlogArchive)
179
- app.component('BlogSingleHero', BlogSingleHero)
180
- app.component('BlogSingleContent', BlogSingleContent)
181
- app.component('BlogSingleRelated', BlogSingleRelated)
182
- } else if (variant === 'vite') {
183
- // Vite
184
- app.component('Header', OSSHeader)
185
- app.component('Footer', OSSFooter)
186
- app.component('Hero', ViteHero)
187
- app.component('TrustedBy', OSSTrustedBy)
188
- app.component('HeadingSection', OSSHeadingSection)
189
- app.component('ViteFeaturePanel1', ViteFeaturePanel1)
190
- app.component('ViteFeaturePanel2', ViteFeaturePanel2)
191
- app.component('ViteFeaturePanel3', ViteFeaturePanel3)
192
- app.component('ViteFeaturePanel4', ViteFeaturePanel4)
193
- app.component('ViteFeatureGrid', ViteFeatureGrid)
194
- app.component('ViteFrameworks', ViteFrameworks)
195
- app.component('ViteCommunity', ViteCommunity)
196
- app.component('ViteSponsors', OSSSponsors)
197
- } else if (variant === 'vitest') {
198
- // Vitest
199
- app.component('Header', OSSHeader)
200
- app.component('Footer', OSSFooter)
201
- app.component('Hero', VitestHero)
202
- app.component('TrustedBy', OSSTrustedBy)
203
- app.component('Intro', VitestIntro)
204
- app.component('HeadingSection', OSSHeadingSection)
205
- app.component('VitestFeatureGrid', VitestFeatureGrid)
206
- app.component('Sponsors', OSSSponsors)
207
- } else if (variant === 'rolldown') {
208
- // Rolldown
209
- app.component('Header', OSSHeader)
210
- app.component('Footer', OSSFooter)
211
- app.component('Hero', RolldownHero)
212
- app.component('TrustedBy', OSSTrustedBy)
213
- app.component('HeadingSection', OSSHeadingSection)
214
- app.component('RolldownFeatureGrid', RolldownFeatureGrid)
215
- app.component('Sponsors', OSSSponsors)
216
- } else if (variant === 'oxc') {
217
- // OXC
218
- app.component('Header', OSSHeader)
219
- app.component('Footer', OSSFooter)
220
- app.component('Hero', OXCHero)
221
- app.component('TrustedBy', OSSTrustedBy)
222
- app.component('HeadingSection', OSSHeadingSection)
223
- app.component('FeatureToolbar', OXCFeatureToolbar)
224
- app.component('FeatureParser', OXCFeatureParser)
225
- app.component('FeatureLinter', OXCFeatureLinter)
226
- app.component('FeatureResolver', OXCFeatureResolver)
227
- app.component('FeatureTransformer', OXCFeatureTransformer)
228
- app.component('FeatureMinifierFormatter', OXCFeatureMinifierFormatter)
229
- app.component('Sponsors', OSSSponsors)
230
- }
231
- },
232
- } satisfies Theme
29
+ Layout: VPLayout, // Smart layout router that switches between VP and custom layouts
30
+ enhanceApp({ app, router, siteData }) {
31
+ const variant = siteData.value.themeConfig?.variant || "voidzero";
32
+ if (typeof document !== "undefined") {
33
+ document.documentElement.setAttribute("data-variant", variant);
34
+
35
+ // Watch for frontmatter.theme changes and apply theme logic
36
+ watch(
37
+ () => router.route.data.frontmatter?.theme,
38
+ (theme) => {
39
+ if (theme) {
40
+ // Forced theme via frontmatter
41
+ document.documentElement.setAttribute("data-theme", theme);
42
+ } else {
43
+ // OSS: Respect user preference, but default to dark if no preference
44
+ document.documentElement.removeAttribute("data-theme");
45
+
46
+ const hasUserPreference = localStorage.getItem(
47
+ "vitepress-theme-appearance"
48
+ );
49
+ if (
50
+ !hasUserPreference &&
51
+ !document.documentElement.classList.contains("dark")
52
+ ) {
53
+ // No user preference - set dark as default for OSS
54
+ document.documentElement.classList.add("dark");
55
+ }
56
+ }
57
+ },
58
+ { immediate: true }
59
+ );
60
+ }
61
+
62
+ // VitePress default theme component (for markdown usage)
63
+ app.component("Badge", VPBadge);
64
+ },
65
+ } satisfies Theme;
233
66
 
234
67
  // VP components (for use in Markdown and custom components)
235
- export {default as VPBadge} from '@vp-default/VPBadge.vue'
236
- export {default as VPButton} from '@vp-default/VPButton.vue'
237
- export {default as VPDocAsideSponsors} from '@vp-default/VPDocAsideSponsors.vue'
238
- export {default as VPFeatures} from '@vp-default/VPFeatures.vue'
239
- export {default as VPHomeContent} from '@vp-default/VPHomeContent.vue'
240
- export {default as VPHomeFeatures} from '@vp-default/VPHomeFeatures.vue'
241
- export {default as VPHomeHero} from '@vp-default/VPHomeHero.vue'
242
- export {default as VPHomeSponsors} from '@vp-default/VPHomeSponsors.vue'
243
- export {default as VPImage} from '@vp-default/VPImage.vue'
244
- export {default as VPLink} from '@vp-default/VPLink.vue'
245
- export {default as VPSocialLink} from '@vp-default/VPSocialLink.vue'
246
- export {default as VPSocialLinks} from '@vp-default/VPSocialLinks.vue'
247
- export {default as VPSponsors} from '@vp-default/VPSponsors.vue'
248
- export {default as VPTeamMembers} from '@vp-default/VPTeamMembers.vue'
249
- export {default as VPTeamPage} from '@vp-default/VPTeamPage.vue'
250
- export {default as VPTeamPageSection} from '@vp-default/VPTeamPageSection.vue'
251
- export {default as VPTeamPageTitle} from '@vp-default/VPTeamPageTitle.vue'
68
+ export { default as VPBadge } from "@vp-default/VPBadge.vue";
69
+ export { default as VPButton } from "@vp-default/VPButton.vue";
70
+ export { default as VPDocAsideSponsors } from "@vp-default/VPDocAsideSponsors.vue";
71
+ export { default as VPFeatures } from "@vp-default/VPFeatures.vue";
72
+ export { default as VPHomeContent } from "@vp-default/VPHomeContent.vue";
73
+ export { default as VPHomeFeatures } from "@vp-default/VPHomeFeatures.vue";
74
+ export { default as VPHomeHero } from "@vp-default/VPHomeHero.vue";
75
+ export { default as VPHomeSponsors } from "@vp-default/VPHomeSponsors.vue";
76
+ export { default as VPImage } from "@vp-default/VPImage.vue";
77
+ export { default as VPLink } from "@vp-default/VPLink.vue";
78
+ export { default as VPSocialLink } from "@vp-default/VPSocialLink.vue";
79
+ export { default as VPSocialLinks } from "@vp-default/VPSocialLinks.vue";
80
+ export { default as VPSponsors } from "@vp-default/VPSponsors.vue";
81
+ export { default as VPTeamMembers } from "@vp-default/VPTeamMembers.vue";
82
+ export { default as VPTeamPage } from "@vp-default/VPTeamPage.vue";
83
+ export { default as VPTeamPageSection } from "@vp-default/VPTeamPageSection.vue";
84
+ export { default as VPTeamPageTitle } from "@vp-default/VPTeamPageTitle.vue";
252
85
 
253
86
  // Export custom layouts and components
254
- export {VoidZeroTheme}
255
- export default VoidZeroTheme
87
+ export { VoidZeroTheme };
88
+ export default VoidZeroTheme;
256
89
 
257
90
  // Export types
258
- export type { Sponsors } from './components/vitepress-default/VPSponsors.vue'
91
+ export type { Sponsors } from "./components/vitepress-default/VPSponsors.vue";
259
92
  export type {
260
93
  BannerConfig,
261
94
  FooterConfig,
@@ -266,4 +99,5 @@ export type {
266
99
  Sponsor,
267
100
  SponsorTier,
268
101
  VoidZeroThemeConfig,
269
- } from './types/theme-config'
102
+ } from "./types/theme-config";
103
+ export { type ThemeContext, themeContextKey } from "./types/theme-context";
@@ -6,9 +6,6 @@ import { useData } from 'vitepress'
6
6
  import VPDefaultLayout from '@vp-default/Layout.vue'
7
7
 
8
8
  // Import custom variant layouts/components
9
- import VoidZeroHeader from '@components/voidzero/Header.vue'
10
- import VoidZeroFooter from '@components/voidzero/Footer.vue'
11
- import VitePlusHeader from '@components/viteplus/Header.vue'
12
9
  import OSSHeader from '@components/oss/Header.vue'
13
10
  import TopBanner from '@components/oss/TopBanner.vue'
14
11
 
@@ -16,7 +13,7 @@ const { frontmatter, site } = useData()
16
13
  const slots = useSlots()
17
14
 
18
15
  // Determine variant from theme config
19
- const variant = computed(() => site.value.themeConfig?.variant || 'voidzero')
16
+ const variant = computed(() => site.value.themeConfig?.variant || 'vite')
20
17
 
21
18
  // Determine which layout to use based on frontmatter.layout
22
19
  // Default behavior (no layout specified) = use VitePress doc layout
@@ -45,21 +42,9 @@ const useVPLayout = computed(() => {
45
42
  </template>
46
43
  </VPDefaultLayout>
47
44
  </div>
48
-
49
- <div v-else-if="variant === 'viteplus'" class="marketing-layout" :data-theme="frontmatter.theme" :data-variant="variant">
50
- <VitePlusHeader />
51
- <Content />
52
- </div>
53
-
54
- <div v-else-if="variant === 'voidzero'" class="marketing-layout" :data-theme="frontmatter.theme" :data-variant="variant">
55
- <VoidZeroHeader />
56
- <Content />
57
- <VoidZeroFooter />
58
- </div>
59
-
60
45
  <div v-else class="marketing-layout" :data-theme="frontmatter.theme" :data-variant="variant">
61
46
  <TopBanner />
62
- <OSSHeader/>
47
+ <OSSHeader />
63
48
  <Content />
64
49
  </div>
65
50
  </template>
@@ -17,7 +17,7 @@
17
17
  /* Typography tokens */
18
18
  --font-*: initial;
19
19
  --font-heading: 'APK Protocol', sans-serif;
20
- --font-sans: 'KH Teka', sans-serif;
20
+ --font-sans: Inter, sans-serif;
21
21
  --font-mono: 'KH Teka Mono', monospace;
22
22
 
23
23
  /* Color palette */
@@ -113,15 +113,9 @@
113
113
  }
114
114
 
115
115
  @font-face {
116
- font-family: 'KH Teka';
117
- font-weight: 400;
118
- src: url('../fonts/KHTeka-Regular.woff2') format('woff2');
119
- }
120
-
121
- @font-face {
122
- font-family: 'KH Teka';
123
- font-weight: 500;
124
- src: url('../fonts/KHTeka-Medium.woff2') format('woff2');
116
+ font-family: 'APK Protocol';
117
+ font-weight: 700;
118
+ src: url('../fonts/APK-Protocol-Semi-Bold.woff2') format('woff2');
125
119
  }
126
120
 
127
121
  @font-face {
@@ -135,3 +129,193 @@
135
129
  font-weight: 500;
136
130
  src: url('../fonts/KHTekaMono-Medium.woff2') format('woff2');
137
131
  }
132
+
133
+ @font-face {
134
+ font-family: Inter;
135
+ font-style: normal;
136
+ font-weight: 100 900;
137
+ font-display: swap;
138
+ src: url('../fonts/inter-roman-cyrillic-ext.woff2') format('woff2');
139
+ unicode-range:
140
+ U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
141
+ }
142
+
143
+ @font-face {
144
+ font-family: Inter;
145
+ font-style: normal;
146
+ font-weight: 100 900;
147
+ font-display: swap;
148
+ src: url('../fonts/inter-roman-cyrillic.woff2') format('woff2');
149
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
150
+ }
151
+
152
+ @font-face {
153
+ font-family: Inter;
154
+ font-style: normal;
155
+ font-weight: 100 900;
156
+ font-display: swap;
157
+ src: url('../fonts/inter-roman-greek-ext.woff2') format('woff2');
158
+ unicode-range: U+1F00-1FFF;
159
+ }
160
+
161
+ @font-face {
162
+ font-family: Inter;
163
+ font-style: normal;
164
+ font-weight: 100 900;
165
+ font-display: swap;
166
+ src: url('../fonts/inter-roman-greek.woff2') format('woff2');
167
+ unicode-range:
168
+ U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
169
+ }
170
+
171
+ @font-face {
172
+ font-family: Inter;
173
+ font-style: normal;
174
+ font-weight: 100 900;
175
+ font-display: swap;
176
+ src: url('../fonts/inter-roman-vietnamese.woff2') format('woff2');
177
+ unicode-range:
178
+ U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,
179
+ U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329,
180
+ U+1EA0-1EF9, U+20AB;
181
+ }
182
+
183
+ @font-face {
184
+ font-family: Inter;
185
+ font-style: normal;
186
+ font-weight: 100 900;
187
+ font-display: swap;
188
+ src: url('../fonts/inter-roman-latin-ext.woff2') format('woff2');
189
+ unicode-range:
190
+ U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020,
191
+ U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
192
+ }
193
+
194
+ @font-face {
195
+ font-family: Inter;
196
+ font-style: normal;
197
+ font-weight: 100 900;
198
+ font-display: swap;
199
+ src: url('../fonts/inter-roman-latin.woff2') format('woff2');
200
+ unicode-range:
201
+ U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
202
+ U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193,
203
+ U+2212, U+2215, U+FEFF, U+FFFD;
204
+ }
205
+
206
+ @font-face {
207
+ font-family: Inter;
208
+ font-style: italic;
209
+ font-weight: 100 900;
210
+ font-display: swap;
211
+ src: url('../fonts/inter-italic-cyrillic-ext.woff2') format('woff2');
212
+ unicode-range:
213
+ U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
214
+ }
215
+
216
+ @font-face {
217
+ font-family: Inter;
218
+ font-style: italic;
219
+ font-weight: 100 900;
220
+ font-display: swap;
221
+ src: url('../fonts/inter-italic-cyrillic.woff2') format('woff2');
222
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
223
+ }
224
+
225
+ @font-face {
226
+ font-family: Inter;
227
+ font-style: italic;
228
+ font-weight: 100 900;
229
+ font-display: swap;
230
+ src: url('../fonts/inter-italic-greek-ext.woff2') format('woff2');
231
+ unicode-range: U+1F00-1FFF;
232
+ }
233
+
234
+ @font-face {
235
+ font-family: Inter;
236
+ font-style: italic;
237
+ font-weight: 100 900;
238
+ font-display: swap;
239
+ src: url('../fonts/inter-italic-greek.woff2') format('woff2');
240
+ unicode-range:
241
+ U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
242
+ }
243
+
244
+ @font-face {
245
+ font-family: Inter;
246
+ font-style: italic;
247
+ font-weight: 100 900;
248
+ font-display: swap;
249
+ src: url('../fonts/inter-italic-vietnamese.woff2') format('woff2');
250
+ unicode-range:
251
+ U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,
252
+ U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329,
253
+ U+1EA0-1EF9, U+20AB;
254
+ }
255
+
256
+ @font-face {
257
+ font-family: Inter;
258
+ font-style: italic;
259
+ font-weight: 100 900;
260
+ font-display: swap;
261
+ src: url('../fonts/inter-italic-latin-ext.woff2') format('woff2');
262
+ unicode-range:
263
+ U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020,
264
+ U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
265
+ }
266
+
267
+ @font-face {
268
+ font-family: Inter;
269
+ font-style: italic;
270
+ font-weight: 100 900;
271
+ font-display: swap;
272
+ src: url('../fonts/inter-italic-latin.woff2') format('woff2');
273
+ unicode-range:
274
+ U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
275
+ U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193,
276
+ U+2212, U+2215, U+FEFF, U+FFFD;
277
+ }
278
+
279
+ @font-face {
280
+ font-family: 'Punctuation SC';
281
+ font-weight: 400;
282
+ src:
283
+ local('PingFang SC Regular'), local('Noto Sans CJK SC'),
284
+ local('Microsoft YaHei');
285
+ unicode-range:
286
+ U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, U+00B7,
287
+ U+007E, U+002F;
288
+ }
289
+
290
+ @font-face {
291
+ font-family: 'Punctuation SC';
292
+ font-weight: 500;
293
+ src:
294
+ local('PingFang SC Medium'), local('Noto Sans CJK SC'),
295
+ local('Microsoft YaHei');
296
+ unicode-range:
297
+ U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, U+00B7,
298
+ U+007E, U+002F;
299
+ }
300
+
301
+ @font-face {
302
+ font-family: 'Punctuation SC';
303
+ font-weight: 600;
304
+ src:
305
+ local('PingFang SC Semibold'), local('Noto Sans CJK SC Bold'),
306
+ local('Microsoft YaHei Bold');
307
+ unicode-range:
308
+ U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, U+00B7,
309
+ U+007E, U+002F;
310
+ }
311
+
312
+ @font-face {
313
+ font-family: 'Punctuation SC';
314
+ font-weight: 700;
315
+ src:
316
+ local('PingFang SC Semibold'), local('Noto Sans CJK SC Bold'),
317
+ local('Microsoft YaHei Bold');
318
+ unicode-range:
319
+ U+201C, U+201D, U+2018, U+2019, U+2E3A, U+2014, U+2013, U+2026, U+00B7,
320
+ U+007E, U+002F;
321
+ }
@@ -0,0 +1,33 @@
1
+ import { InjectionKey } from "vue";
2
+
3
+ // asset injection for different project variants
4
+ export interface ThemeContext {
5
+ // header
6
+ /**
7
+ * "@assets/logos/[project]-dark.svg"
8
+ */
9
+ logoDark: string;
10
+ /**
11
+ * "@assets/logos/[project]-light.svg"
12
+ */
13
+ logoLight: string;
14
+ /**
15
+ * @string
16
+ */
17
+ logoAlt: string;
18
+
19
+ // footer
20
+ /**
21
+ * "@assets/[project]/footer-background.jpg"
22
+ */
23
+ footerBg: string;
24
+
25
+ // banner
26
+ /**
27
+ * "@assets/icons/[project]-mono.svg"
28
+ */
29
+ monoIcon: string
30
+ }
31
+
32
+ export const themeContextKey: InjectionKey<ThemeContext> =
33
+ "theme-context-key" as any; // using symbol breaks with HMR
@@ -1,30 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1396.92 308.78">
3
- <defs>
4
- <style>
5
- .cls-1 {
6
- fill: #000000;
7
- }
8
- </style>
9
- </defs>
10
- <g id="Layer_1-2">
11
- <g>
12
- <g>
13
- <path class="cls-1" d="M283.19,145.14H42.6c-6.13,0-11.14-5.04-11.14-11.21v-17.09c0-19.33,15.59-35.02,34.81-35.02h192.97c19.21,0,34.81,15.69,34.81,35.02v17.09c.28,6.16-4.73,11.21-10.86,11.21Z"/>
14
- <path class="cls-1" d="M232.51,63.32H93.28c-6.13,0-11.42-5.04-11.42-11.49C81.87,23.26,104.98,0,133.38,0h59.03c28.4,0,51.51,23.26,51.51,51.84,0,6.44-5.01,11.49-11.42,11.49Z"/>
15
- <path class="cls-1" d="M294.33,163.63H31.47c-17.26,0-31.47,14.29-31.47,31.66s14.2,31.66,31.47,31.66h93.28c3.34-17.93,18.93-31.66,37.87-31.66s34.81,13.73,38.15,31.66h93.28c17.26,0,31.47-14.29,31.47-31.66s-13.92-31.66-31.19-31.66Z"/>
16
- <path class="cls-1" d="M282.91,245.45h-81.59v63.32h61.26c17.26,0,31.47-14.29,31.47-31.66v-20.17c.28-6.16-4.73-11.49-11.14-11.49Z"/>
17
- <path class="cls-1" d="M42.6,245.45c-6.13,0-11.42,5.04-11.42,11.49v20.17c0,17.37,14.2,31.66,31.47,31.66h61.26v-63.32c.28,0-81.31,0-81.31,0Z"/>
18
- </g>
19
- <path class="cls-1" d="M558.67,182.5c0,46.73-32.09,76.74-74,76.74-20.01,0-35.87-6.46-46.44-19.38v17.1h-41.15V51.43h43.04v72.57c10.95-12.16,26.05-18.24,44.55-18.24,41.53,0,74,30.01,74,76.75ZM514.88,182.5c0-25.84-16.23-41.41-37.76-41.41s-37.76,15.58-37.76,41.41,16.23,41.41,37.76,41.41,37.76-15.58,37.76-41.41Z"/>
20
- <path class="cls-1" d="M696.13,210.24l23.03,25.08c-13.59,15.96-34.36,23.93-61.16,23.93-51.35,0-84.57-32.29-84.57-76.75s33.6-76.74,79.29-76.74c41.91,0,76.27,27.73,76.65,75.61l-109.87,21.27c6.42,14.82,20.01,22.04,39.27,22.04,15.86,0,27.18-4.56,37.38-14.44ZM615.33,177.94l72.11-14.06c-4.15-15.2-16.99-25.46-35.11-25.46-21.14,0-36.25,14.44-37,39.51Z"/>
21
- <path class="cls-1" d="M864.98,210.24l23.03,25.08c-13.6,15.96-34.36,23.93-61.17,23.93-51.35,0-84.57-32.29-84.57-76.75s33.6-76.74,79.29-76.74c41.9,0,76.26,27.73,76.64,75.61l-109.49,21.27c6.42,14.82,20.01,22.04,39.26,22.04,15.48,0,26.81-4.56,37.01-14.44ZM784.18,177.94l72.11-14.06c-4.15-15.2-16.99-25.46-35.11-25.46-21.15,0-35.87,14.44-37,39.51Z"/>
22
- <path class="cls-1" d="M1073.54,171.87v85.48h-43.04v-79.02c0-23.94-10.95-35.33-30.2-35.33-20.77,0-35.49,12.92-35.49,40.27v73.7h-43.04V51.43h43.04v72.19c11.7-11.78,28.31-17.86,47.19-17.86,35.12,0,61.54,20.52,61.54,66.11Z"/>
23
- <path class="cls-1" d="M1095.77,64.09c0-12.04,9.64-21.41,23.59-21.41s23.6,8.7,23.6,20.4c0,12.71-9.64,22.07-23.6,22.07s-23.59-9.03-23.59-21.07Z"/>
24
- <path class="cls-1" d="M1097.84,108.04h43.04v149.31h-43.04V108.04Z"/>
25
- <path class="cls-1" d="M1163.2,108.04h43.04v149.31h-43.04V108.04Z"/>
26
- <path class="cls-1" d="M1396.92,108.04l-62.67,149.31h-44.56l-62.29-149.31h44.55l41.15,101.44,42.29-101.44h41.53Z"/>
27
- <path class="cls-1" d="M1161.12,64.09c0-12.04,9.64-21.41,23.59-21.41s23.6,8.7,23.6,20.4c0,12.71-9.64,22.07-23.6,22.07s-23.59-9.03-23.59-21.07Z"/>
28
- </g>
29
- </g>
30
- </svg>