@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.
- package/package.json +7 -6
- package/src/aliases.js +14 -0
- package/src/vitepress/assets/clients/clickup.svg +5 -0
- package/src/vitepress/assets/clients/stripe.svg +3 -0
- package/src/vitepress/components/oss/Footer.vue +4 -21
- package/src/vitepress/components/oss/Header.vue +82 -180
- package/src/vitepress/components/oss/Sponsors.vue +3 -3
- package/src/vitepress/components/oss/TopBanner.vue +20 -79
- package/src/vitepress/components/oss/TrustedBy.vue +1 -1
- package/src/vitepress/components/vite/Community.vue +3 -3
- package/src/vitepress/components/vite/FeatureGrid1.vue +63 -0
- package/src/vitepress/components/vite/{FeatureGrid.vue → FeatureGrid2.vue} +8 -10
- package/src/vitepress/components/vite/Hero.vue +6 -15
- package/src/vitepress/components/vitepress-default/VPDocOutlineItem.vue +2 -2
- package/src/vitepress/components/vitepress-default/VPFlyout.vue +1 -1
- package/src/vitepress/components/vitepress-default/VPMenuLink.vue +1 -1
- package/src/vitepress/components/vitepress-default/VPNavBarMenuLink.vue +1 -1
- package/src/vitepress/components/vitepress-default/VPSidebarItem.vue +1 -1
- package/src/vitepress/components/vitepress-default/VPSocialLink.vue +1 -2
- package/src/vitepress/fonts/APK-Protocol-Semi-Bold.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-cyrillic-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-cyrillic.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-greek-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-greek.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-latin-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-latin.woff2 +0 -0
- package/src/vitepress/fonts/inter-italic-vietnamese.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-cyrillic-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-cyrillic.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-greek-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-greek.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-latin-ext.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-latin.woff2 +0 -0
- package/src/vitepress/fonts/inter-roman-vietnamese.woff2 +0 -0
- package/src/vitepress/index.ts +64 -230
- package/src/vitepress/layouts/VPLayout.vue +2 -17
- package/src/vitepress/styles/tokens.css +194 -10
- package/src/vitepress/types/theme-context.ts +33 -0
- package/src/vitepress/assets/clients/beehiiv.svg +0 -30
- package/src/vitepress/assets/clients/excalidraw.svg +0 -82
- package/src/vitepress/assets/clients/get-your-guide.svg +0 -1
- package/src/vitepress/assets/clients/posthog.svg +0 -1
- package/src/vitepress/assets/clients/ramp.svg +0 -1
- package/src/vitepress/assets/clients/shopee.svg +0 -55
- package/src/vitepress/components/vite/FeaturePanel1.vue +0 -41
- package/src/vitepress/components/vite/FeaturePanel2.vue +0 -37
- package/src/vitepress/components/vite/FeaturePanel3.vue +0 -43
- package/src/vitepress/components/vite/FeaturePanel4.vue +0 -46
- package/src/vitepress/components/voidzero/Footer.vue +0 -65
- package/src/vitepress/components/voidzero/Header.vue +0 -560
- package/src/vitepress/components/voidzero/Megamenu.vue +0 -190
- package/src/vitepress/components/voidzero/about/CareerCTA.vue +0 -56
- package/src/vitepress/components/voidzero/about/Hero.vue +0 -206
- package/src/vitepress/components/voidzero/about/Investors.vue +0 -112
- package/src/vitepress/components/voidzero/about/TeamGrid.vue +0 -161
- package/src/vitepress/components/voidzero/about/TeamSectionHeading.vue +0 -13
- package/src/vitepress/components/voidzero/blog/BlogArchive.vue +0 -223
- package/src/vitepress/components/voidzero/blog/BlogSingleContent.vue +0 -364
- package/src/vitepress/components/voidzero/blog/BlogSingleHero.vue +0 -113
- package/src/vitepress/components/voidzero/blog/BlogSingleRelated.vue +0 -92
- package/src/vitepress/components/voidzero/blog/FeaturedArticles.vue +0 -146
- package/src/vitepress/components/voidzero/blog/types.ts +0 -56
- package/src/vitepress/components/voidzero/home/CaseStudySlider.vue +0 -235
- package/src/vitepress/components/voidzero/home/CustomersSectionHeading.vue +0 -5
- package/src/vitepress/components/voidzero/home/GitHubStats.vue +0 -27
- package/src/vitepress/components/voidzero/home/Hero.vue +0 -69
- package/src/vitepress/components/voidzero/home/Investors.vue +0 -30
- package/src/vitepress/components/voidzero/home/NewsletterCTA.vue +0 -23
- package/src/vitepress/components/voidzero/home/OpenSourceSectionHeading.vue +0 -6
- package/src/vitepress/components/voidzero/home/OpenSourceSectionProjects.vue +0 -419
- package/src/vitepress/components/voidzero/home/Resources.vue +0 -144
- package/src/vitepress/components/voidzero/home/Statistics.vue +0 -507
- package/src/vitepress/components/voidzero/home/StatisticsSectionHeading.vue +0 -5
- package/src/vitepress/components/voidzero/home/TeamCTA.vue +0 -17
- package/src/vitepress/components/voidzero/home/TrustedBy.vue +0 -248
- package/src/vitepress/components/voidzero/home/VitePlusSectionFeatures.vue +0 -55
- package/src/vitepress/components/voidzero/home/VitePlusSectionHeading.vue +0 -17
- package/src/vitepress/fonts/KHTeka-Medium.woff2 +0 -0
- package/src/vitepress/fonts/KHTeka-Regular.woff2 +0 -0
package/package.json
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voidzero-dev/vitepress-theme",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Shared VitePress theme for VoidZero projects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"main": "./src/index.ts",
|
|
8
|
+
"module": "./src/index.ts",
|
|
8
9
|
"files": [
|
|
9
10
|
"src"
|
|
10
11
|
],
|
|
11
12
|
"sideEffects": [
|
|
12
13
|
"*.css"
|
|
13
14
|
],
|
|
14
|
-
"scripts": {
|
|
15
|
-
"dev": "vite build --watch",
|
|
16
|
-
"build": "vite build"
|
|
17
|
-
},
|
|
18
15
|
"peerDependencies": {
|
|
19
16
|
"@docsearch/css": "^4.3.2",
|
|
20
17
|
"@docsearch/js": "^4.3.2",
|
|
@@ -62,5 +59,9 @@
|
|
|
62
59
|
"vite-plugin-dts": "^4.5.4",
|
|
63
60
|
"vite-plugin-static-copy": "^3.1.4",
|
|
64
61
|
"vue-tsc": "^3.1.2"
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"dev": "vite build --watch",
|
|
65
|
+
"build": "vite build"
|
|
65
66
|
}
|
|
66
|
-
}
|
|
67
|
+
}
|
package/src/aliases.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { resolve } from "path";
|
|
2
|
+
|
|
3
|
+
const __dirname = import.meta.dirname;
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
"@assets": resolve(__dirname, "vitepress/assets"),
|
|
7
|
+
"@components": resolve(__dirname, "vitepress/components"),
|
|
8
|
+
"@vp-default": resolve(__dirname, "vitepress/components/vitepress-default"),
|
|
9
|
+
"@vp-composables": resolve(
|
|
10
|
+
__dirname,
|
|
11
|
+
"vitepress/composables/vitepress-default"
|
|
12
|
+
),
|
|
13
|
+
"@vp-support": resolve(__dirname, "vitepress/support/vitepress-default"),
|
|
14
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
<svg width="256" height="64" viewBox="0 0 256 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.411092 50.1719C-0.214959 49.4086 -0.0780078 48.285 0.691788 47.667L7.98408 41.8119C8.62017 41.3012 9.55015 41.4165 10.0688 42.0462C15.022 48.0596 20.278 50.8435 26.0957 50.8435C31.8732 50.8435 36.9859 48.099 41.7222 42.1523C42.2305 41.5141 43.1582 41.3821 43.8035 41.8815L51.1954 47.602C51.976 48.2061 52.1332 49.3268 51.5203 50.1004C44.5175 58.9398 35.9435 63.597 26.0957 63.597C16.2766 63.597 7.62609 58.9689 0.411092 50.1719Z" fill="#202020"/>
|
|
3
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.4487 17.1674C26.1739 16.924 25.7606 16.9239 25.4855 17.1671L9.62895 31.1881C9.02279 31.7241 8.09562 31.6619 7.56651 31.0497L1.38195 23.8942C0.860213 23.2906 0.922623 22.3792 1.52177 21.8523L25.0072 1.19951C25.5562 0.716746 26.3783 0.716854 26.9271 1.19976L50.4178 21.8682C51.0173 22.3957 51.079 23.308 50.556 23.9114L44.3565 31.0633C43.8267 31.6744 42.9001 31.7356 42.2946 31.1994L26.4487 17.1674Z" fill="#202020"/>
|
|
4
|
+
<path d="M83.1535 52.7596C77.5333 52.7596 72.8498 50.9382 69.051 47.2955C65.2522 43.6008 63.3788 38.8652 63.3788 33.0889C63.3788 27.2606 65.3042 22.473 69.103 18.7262C72.9539 14.9274 77.6374 13.054 83.2055 13.054C90.0747 13.054 96.1632 16.0202 99.7018 20.6517L93.5092 27.1565C90.543 23.9821 87.3166 22.3689 83.83 22.3689C80.8638 22.3689 78.418 23.3577 76.3885 25.3872C74.411 27.4167 73.4223 29.9666 73.4223 33.0369C73.4223 36.0031 74.411 38.5009 76.3885 40.5305C78.418 42.5079 80.8638 43.4967 83.778 43.4967C87.5768 43.4967 90.9073 41.8314 93.6653 38.553L100.118 44.7456C98.3488 47.0873 95.955 49.0128 92.9888 50.5219C90.0226 52.031 86.7442 52.7596 83.1535 52.7596ZM111.036 12.4816V52.1871H101.877V12.4816H111.036ZM119.717 20.9119C116.646 20.9119 114.409 18.6742 114.409 15.6039C114.409 12.6377 116.75 10.4 119.717 10.4C122.683 10.4 124.972 12.6377 124.972 15.6039C124.972 18.6742 122.683 20.9119 119.717 20.9119ZM124.348 23.4618V52.1871H115.137V23.4618H124.348ZM141.979 52.8116C137.452 52.8116 133.809 51.4066 130.947 48.5965C128.137 45.7864 126.732 42.1957 126.732 37.7724C126.732 33.3491 128.137 29.7584 130.999 26.9483C133.861 24.1383 137.556 22.7332 142.135 22.7332C148.12 22.7332 153.376 25.6474 155.821 31.1114L148.484 34.9623C147.027 32.5165 144.997 31.2676 142.343 31.2676C140.418 31.2676 138.857 31.892 137.608 33.141C136.411 34.3899 135.786 35.9511 135.786 37.7724C135.786 41.5712 138.545 44.3813 142.239 44.3813C144.893 44.3813 147.339 42.9242 148.38 40.6866L155.717 45.0578C153.219 49.8454 148.068 52.8116 141.979 52.8116ZM187.659 52.1871H176.731L168.249 40.7907L166.896 42.0396V52.1871H157.737V12.4816H166.896V31.788L175.534 23.4618H186.722L174.389 35.0144L187.659 52.1871ZM188.273 37.252V13.7305H198.057V37.0959C198.057 41.4151 200.555 43.4967 204.145 43.4967C207.684 43.4967 210.182 41.311 210.182 37.0959V13.7305H220.017V37.252C220.017 48.5965 212.159 52.8637 204.145 52.8637C196.183 52.8637 188.273 48.5965 188.273 37.252ZM241.759 22.7332C245.87 22.7332 249.201 24.1903 251.855 27.1045C254.509 29.9666 255.81 33.5573 255.81 37.7724C255.81 41.9876 254.457 45.5782 251.803 48.5444C249.149 51.4586 245.818 52.9157 241.811 52.9157C238.637 52.9157 235.879 51.8749 233.641 49.7934V63.9999H224.43V23.4618H233.485V26.1157C235.723 23.8781 238.481 22.7332 241.759 22.7332ZM246.443 37.8765C246.443 34.1297 243.737 31.2676 239.99 31.2676C236.243 31.2676 233.485 34.1297 233.485 37.8765C233.485 39.6978 234.109 41.259 235.306 42.56C236.555 43.8609 238.116 44.4854 239.99 44.4854C241.863 44.4854 243.424 43.8609 244.621 42.56C245.818 41.259 246.443 39.6978 246.443 37.8765Z" fill="#202020"/>
|
|
5
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- Generator: Adobe Illustrator 24.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" style="enable-background:new 0 0 468 222.5;" xml:space="preserve" viewBox="54 36 360.02 149.84"> <style type="text/css"> .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#635BFF;} </style> <g> <path class="st0" d="M414,113.4c0-25.6-12.4-45.8-36.1-45.8c-23.8,0-38.2,20.2-38.2,45.6c0,30.1,17,45.3,41.4,45.3 c11.9,0,20.9-2.7,27.7-6.5v-20c-6.8,3.4-14.6,5.5-24.5,5.5c-9.7,0-18.3-3.4-19.4-15.2h48.9C413.8,121,414,115.8,414,113.4z M364.6,103.9c0-11.3,6.9-16,13.2-16c6.1,0,12.6,4.7,12.6,16H364.6z"></path> <path class="st0" d="M301.1,67.6c-9.8,0-16.1,4.6-19.6,7.8l-1.3-6.2h-22v116.6l25-5.3l0.1-28.3c3.6,2.6,8.9,6.3,17.7,6.3 c17.9,0,34.2-14.4,34.2-46.1C335.1,83.4,318.6,67.6,301.1,67.6z M295.1,136.5c-5.9,0-9.4-2.1-11.8-4.7l-0.1-37.1 c2.6-2.9,6.2-4.9,11.9-4.9c9.1,0,15.4,10.2,15.4,23.3C310.5,126.5,304.3,136.5,295.1,136.5z"></path> <polygon class="st0" points="223.8,61.7 248.9,56.3 248.9,36 223.8,41.3 "></polygon> <rect x="223.8" y="69.3" class="st0" width="25.1" height="87.5"></rect> <path class="st0" d="M196.9,76.7l-1.6-7.4h-21.6v87.5h25V97.5c5.9-7.7,15.9-6.3,19-5.2v-23C214.5,68.1,202.8,65.9,196.9,76.7z"></path> <path class="st0" d="M146.9,47.6l-24.4,5.2l-0.1,80.1c0,14.8,11.1,25.7,25.9,25.7c8.2,0,14.2-1.5,17.5-3.3V135 c-3.2,1.3-19,5.9-19-8.9V90.6h19V69.3h-19L146.9,47.6z"></path> <path class="st0" d="M79.3,94.7c0-3.9,3.2-5.4,8.5-5.4c7.6,0,17.2,2.3,24.8,6.4V72.2c-8.3-3.3-16.5-4.6-24.8-4.6 C67.5,67.6,54,78.2,54,95.9c0,27.6,38,23.2,38,35.1c0,4.6-4,6.1-9.6,6.1c-8.3,0-18.9-3.4-27.3-8v23.8c9.3,4,18.7,5.7,27.3,5.7 c20.8,0,35.1-10.3,35.1-28.2C117.4,100.6,79.3,105.9,79.3,94.7z"></path> </g> </svg>
|
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import {computed} from 'vue'
|
|
2
|
+
import {computed, inject} from 'vue'
|
|
3
3
|
import {useData} from 'vitepress'
|
|
4
4
|
|
|
5
|
-
// Import background images for all variants
|
|
6
|
-
import viteFooterBg from '@assets/vite/footer-background.jpg'
|
|
7
|
-
import vitestFooterBg from '@assets/vitest/footer-background.jpg'
|
|
8
|
-
import rolldownFooterBg from '@assets/rolldown/footer-background.jpg'
|
|
9
|
-
import oxcFooterBg from '@assets/oxc/footer-background.jpg'
|
|
10
|
-
|
|
11
5
|
// Social icons
|
|
12
6
|
import githubIcon from '@assets/social/github-light.svg'
|
|
13
7
|
import discordIcon from '@assets/social/discord-light.svg'
|
|
14
8
|
import blueskyIcon from '@assets/social/bluesky-light.svg'
|
|
15
9
|
import twitterIcon from '@assets/social/twitter-light.svg'
|
|
10
|
+
import { themeContextKey } from '../../types/theme-context'
|
|
16
11
|
|
|
17
12
|
// Props for CTA section
|
|
18
13
|
withDefaults(defineProps<{
|
|
@@ -28,19 +23,7 @@ withDefaults(defineProps<{
|
|
|
28
23
|
})
|
|
29
24
|
|
|
30
25
|
const {theme} = useData()
|
|
31
|
-
|
|
32
|
-
// Background image mapping based on variant
|
|
33
|
-
const backgroundMap = {
|
|
34
|
-
vite: viteFooterBg,
|
|
35
|
-
vitest: vitestFooterBg,
|
|
36
|
-
rolldown: rolldownFooterBg,
|
|
37
|
-
oxc: oxcFooterBg,
|
|
38
|
-
} as const
|
|
39
|
-
|
|
40
|
-
type Variant = keyof typeof backgroundMap
|
|
41
|
-
|
|
42
|
-
const variant = computed(() => (theme.value.variant as Variant) || 'vite')
|
|
43
|
-
const backgroundImage = computed(() => backgroundMap[variant.value] || viteFooterBg)
|
|
26
|
+
const { footerBg: backgroundImage } = inject(themeContextKey)!
|
|
44
27
|
|
|
45
28
|
// Social icon mapping
|
|
46
29
|
const socialIconMap: Record<string, string> = {
|
|
@@ -109,7 +92,7 @@ const getSocialLabel = (social: SocialLink): string => {
|
|
|
109
92
|
<section class="wrapper">
|
|
110
93
|
<div class="relative w-full">
|
|
111
94
|
<img :src="backgroundImage" alt="Footer background" inert loading="lazy"
|
|
112
|
-
class="absolute inset-0 w-full h-full object-cover z-0
|
|
95
|
+
class="absolute inset-0 w-full h-full object-cover z-0"/>
|
|
113
96
|
<div
|
|
114
97
|
class="relative z-10 w-full sm:w-2xl flex flex-col justify-start items-center gap-5 px-5 sm:px-0 py-10 md:py-30 mx-auto">
|
|
115
98
|
<h2 class="text-center text-white text-balance">{{ heading }}</h2>
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import {useData, useRoute} from 'vitepress'
|
|
2
|
+
import { useData, useRoute } from 'vitepress'
|
|
3
3
|
import { normalizeLink } from '@vp-support/utils'
|
|
4
|
-
import {ref, computed, onMounted, onUnmounted, watch, nextTick} from 'vue'
|
|
4
|
+
import { ref, computed, onMounted, onUnmounted, watch, nextTick, inject } from 'vue'
|
|
5
5
|
import { getSearchProvider } from '@vp-support/search-config'
|
|
6
|
+
import { themeContextKey } from '../../types/theme-context'
|
|
6
7
|
|
|
7
8
|
// Import VitePress header components
|
|
8
9
|
import VPNavBarSearch from '@vp-default/VPNavBarSearch.vue'
|
|
@@ -14,17 +15,7 @@ import VPNavBarExtra from '@vp-default/VPNavBarExtra.vue'
|
|
|
14
15
|
import VPSwitchAppearance from '@vp-default/VPSwitchAppearance.vue'
|
|
15
16
|
import { useLangs } from '@vp-composables/langs'
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
import viteDark from '@assets/logos/vite-dark.svg'
|
|
19
|
-
import viteLight from '@assets/logos/vite-light.svg'
|
|
20
|
-
import vitestDark from '@assets/logos/vitest-dark.svg'
|
|
21
|
-
import vitestLight from '@assets/logos/vitest-light.svg'
|
|
22
|
-
import rolldownDark from '@assets/logos/rolldown-dark.svg'
|
|
23
|
-
import rolldownLight from '@assets/logos/rolldown-light.svg'
|
|
24
|
-
import oxcDark from '@assets/logos/oxc-dark.svg'
|
|
25
|
-
import oxcLight from '@assets/logos/oxc-light.svg'
|
|
26
|
-
|
|
27
|
-
const {theme, site, frontmatter} = useData()
|
|
18
|
+
const { theme, frontmatter } = useData()
|
|
28
19
|
const nav = theme.value.nav
|
|
29
20
|
|
|
30
21
|
const route = useRoute()
|
|
@@ -35,28 +26,7 @@ const { localeLinks, currentLang } = useLangs({ correspondingLink: true })
|
|
|
35
26
|
// Hide appearance toggle when theme is forced via frontmatter
|
|
36
27
|
const isForcedTheme = computed(() => !!frontmatter.value.theme)
|
|
37
28
|
|
|
38
|
-
|
|
39
|
-
const logoMap = {
|
|
40
|
-
vite: { dark: viteDark, light: viteLight },
|
|
41
|
-
vitest: { dark: vitestDark, light: vitestLight },
|
|
42
|
-
rolldown: { dark: rolldownDark, light: rolldownLight },
|
|
43
|
-
oxc: { dark: oxcDark, light: oxcLight },
|
|
44
|
-
} as const
|
|
45
|
-
|
|
46
|
-
type LogoVariant = keyof typeof logoMap
|
|
47
|
-
|
|
48
|
-
const variant = computed(() => (theme.value.variant as LogoVariant) || 'vite')
|
|
49
|
-
const logoDark = computed(() => logoMap[variant.value]?.dark || viteDark)
|
|
50
|
-
const logoLight = computed(() => logoMap[variant.value]?.light || viteLight)
|
|
51
|
-
const logoAlt = computed(() => {
|
|
52
|
-
const names: Record<LogoVariant, string> = {
|
|
53
|
-
vite: 'Vite',
|
|
54
|
-
vitest: 'Vitest',
|
|
55
|
-
rolldown: 'Rolldown',
|
|
56
|
-
oxc: 'OXC',
|
|
57
|
-
}
|
|
58
|
-
return names[variant.value] || 'Vite'
|
|
59
|
-
})
|
|
29
|
+
const { logoDark, logoLight, logoAlt } = inject(themeContextKey)!
|
|
60
30
|
|
|
61
31
|
// Check if we're on a marketing page (non-doc layout)
|
|
62
32
|
const isMarketingPage = computed(() => {
|
|
@@ -157,7 +127,7 @@ const focusTrap = {
|
|
|
157
127
|
if (!mobileMenu) return
|
|
158
128
|
|
|
159
129
|
const focusableElements = mobileMenu.querySelectorAll(
|
|
160
|
-
|
|
130
|
+
'a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])'
|
|
161
131
|
)
|
|
162
132
|
|
|
163
133
|
if (focusableElements.length === 0) return
|
|
@@ -215,13 +185,15 @@ onUnmounted(() => {
|
|
|
215
185
|
</script>
|
|
216
186
|
|
|
217
187
|
<template>
|
|
218
|
-
<div
|
|
219
|
-
|
|
188
|
+
<div
|
|
189
|
+
:class="isMarketingPage ? 'relative w-full z-50' : 'relative w-full z-50 lg:fixed lg:left-0 lg:right-0 lg:top-[var(--vp-banner-height,0)]'">
|
|
190
|
+
<header
|
|
191
|
+
class="wrapper px-6 py-5 flex items-center justify-between relative bg-white dark:bg-primary border-b border-stroke dark:border-nickel">
|
|
220
192
|
<!-- Left side: Logo + Nav -->
|
|
221
193
|
<div class="flex items-center gap-10">
|
|
222
194
|
<a href="/" class="shrink-0">
|
|
223
|
-
<img class="h-4 block dark:hidden" :src="logoDark" :alt="logoAlt"/>
|
|
224
|
-
<img class="h-4 hidden dark:block" :src="logoLight" :alt="logoAlt"/>
|
|
195
|
+
<img class="h-4 block dark:hidden" :src="logoDark" :alt="logoAlt" />
|
|
196
|
+
<img class="h-4 hidden dark:block" :src="logoLight" :alt="logoAlt" />
|
|
225
197
|
</a>
|
|
226
198
|
|
|
227
199
|
<!-- Desktop navigation -->
|
|
@@ -250,34 +222,30 @@ onUnmounted(() => {
|
|
|
250
222
|
</div>
|
|
251
223
|
|
|
252
224
|
<!-- Mobile search icon - visible <1024px, hidden if search unavailable -->
|
|
253
|
-
<button
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
aria-label="Search"
|
|
257
|
-
class="lg:hidden p-2 text-primary dark:text-white hover:opacity-70 transition-opacity cursor-pointer"
|
|
258
|
-
type="button"
|
|
259
|
-
>
|
|
225
|
+
<button v-if="isSearchAvailable" @click="triggerSearch" aria-label="Search"
|
|
226
|
+
class="lg:hidden p-2 text-primary dark:text-white hover:opacity-70 transition-opacity cursor-pointer"
|
|
227
|
+
type="button">
|
|
260
228
|
<svg class="size-5" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
261
|
-
<path
|
|
229
|
+
<path
|
|
230
|
+
d="M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z"
|
|
231
|
+
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
|
|
262
232
|
</svg>
|
|
263
233
|
</button>
|
|
264
234
|
|
|
265
235
|
<!-- Mobile hamburger - visible <1024px -->
|
|
266
|
-
<button
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
<svg v-if="!mobileMenuOpen" class="size-6 block dark:hidden" viewBox="0 0 18 8" xmlns="http://www.w3.org/2000/svg">
|
|
275
|
-
<path d="M0 0.75H18" stroke="#08060D" stroke-width="1.5"/>
|
|
276
|
-
<path d="M0 6.75H18" stroke="#08060D" stroke-width="1.5"/>
|
|
236
|
+
<button @click="toggleMobileMenu" :aria-expanded="mobileMenuOpen" aria-controls="mobile-menu"
|
|
237
|
+
aria-label="Toggle navigation menu"
|
|
238
|
+
class="lg:hidden p-2 -mr-2 text-primary dark:text-white hover:opacity-70 transition-opacity cursor-pointer"
|
|
239
|
+
type="button">
|
|
240
|
+
<svg v-if="!mobileMenuOpen" class="size-6 block dark:hidden" viewBox="0 0 18 8"
|
|
241
|
+
xmlns="http://www.w3.org/2000/svg">
|
|
242
|
+
<path d="M0 0.75H18" stroke="#08060D" stroke-width="1.5" />
|
|
243
|
+
<path d="M0 6.75H18" stroke="#08060D" stroke-width="1.5" />
|
|
277
244
|
</svg>
|
|
278
|
-
<svg v-if="!mobileMenuOpen" class="size-6 hidden dark:block" viewBox="0 0 18 8"
|
|
279
|
-
|
|
280
|
-
<path d="M0
|
|
245
|
+
<svg v-if="!mobileMenuOpen" class="size-6 hidden dark:block" viewBox="0 0 18 8"
|
|
246
|
+
xmlns="http://www.w3.org/2000/svg">
|
|
247
|
+
<path d="M0 0.75H18" stroke="#FFFFFF" stroke-width="1.5" />
|
|
248
|
+
<path d="M0 6.75H18" stroke="#FFFFFF" stroke-width="1.5" />
|
|
281
249
|
</svg>
|
|
282
250
|
|
|
283
251
|
</button>
|
|
@@ -288,52 +256,33 @@ onUnmounted(() => {
|
|
|
288
256
|
<div class="wrapper relative h-0 tick-left tick-right"></div>
|
|
289
257
|
|
|
290
258
|
<!-- Mobile Menu Overlay - Full Screen -->
|
|
291
|
-
<div
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
role="dialog"
|
|
295
|
-
aria-modal="true"
|
|
296
|
-
aria-label="Mobile navigation menu"
|
|
297
|
-
:data-theme="isForcedTheme ? 'dark' : undefined"
|
|
298
|
-
class="lg:hidden fixed inset-0 z-[1001] bg-white dark:bg-primary"
|
|
299
|
-
>
|
|
259
|
+
<div v-if="mobileMenuOpen" id="mobile-menu" role="dialog" aria-modal="true" aria-label="Mobile navigation menu"
|
|
260
|
+
:data-theme="isForcedTheme ? 'dark' : undefined"
|
|
261
|
+
class="lg:hidden fixed inset-0 z-[1001] bg-white dark:bg-primary">
|
|
300
262
|
<section class="wrapper animate-fade-in">
|
|
301
263
|
|
|
302
264
|
<!-- Internal Header with Logo, Search and Close Button -->
|
|
303
265
|
<div class="w-full pl-5 pr-5 py-5 lg:py-7 flex items-center justify-between">
|
|
304
266
|
<a href="/">
|
|
305
|
-
<img class="h-4 block dark:hidden" :src="logoDark" :alt="logoAlt"/>
|
|
306
|
-
<img class="h-4 hidden dark:block" :src="logoLight" :alt="logoAlt"/>
|
|
267
|
+
<img class="h-4 block dark:hidden" :src="logoDark" :alt="logoAlt" />
|
|
268
|
+
<img class="h-4 hidden dark:block" :src="logoLight" :alt="logoAlt" />
|
|
307
269
|
</a>
|
|
308
270
|
<div class="flex items-center gap-2">
|
|
309
271
|
<!-- Search button - hidden if search unavailable -->
|
|
310
|
-
<button
|
|
311
|
-
|
|
312
|
-
@click="triggerSearch"
|
|
313
|
-
aria-label="Search"
|
|
314
|
-
class="p-2 text-primary dark:text-white hover:opacity-70 transition-opacity cursor-pointer"
|
|
315
|
-
type="button"
|
|
316
|
-
>
|
|
272
|
+
<button v-if="isSearchAvailable" @click="triggerSearch" aria-label="Search"
|
|
273
|
+
class="p-2 text-primary dark:text-white hover:opacity-70 transition-opacity cursor-pointer" type="button">
|
|
317
274
|
<svg class="size-5" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
318
|
-
<path
|
|
275
|
+
<path
|
|
276
|
+
d="M17.5 17.5L13.875 13.875M15.8333 9.16667C15.8333 12.8486 12.8486 15.8333 9.16667 15.8333C5.48477 15.8333 2.5 12.8486 2.5 9.16667C2.5 5.48477 5.48477 2.5 9.16667 2.5C12.8486 2.5 15.8333 5.48477 15.8333 9.16667Z"
|
|
277
|
+
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
|
|
319
278
|
</svg>
|
|
320
279
|
</button>
|
|
321
280
|
<!-- Close button -->
|
|
322
|
-
<button
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
>
|
|
328
|
-
<svg
|
|
329
|
-
class="size-6 cursor-pointer"
|
|
330
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
331
|
-
fill="none"
|
|
332
|
-
viewBox="0 0 24 24"
|
|
333
|
-
stroke="currentColor"
|
|
334
|
-
aria-hidden="true"
|
|
335
|
-
>
|
|
336
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
|
281
|
+
<button @click="closeMobileMenu" aria-label="Close navigation menu"
|
|
282
|
+
class="p-2 -mr-2 text-primary dark:text-white hover:opacity-70 transition-opacity" type="button">
|
|
283
|
+
<svg class="size-6 cursor-pointer" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
|
284
|
+
stroke="currentColor" aria-hidden="true">
|
|
285
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
337
286
|
</svg>
|
|
338
287
|
</button>
|
|
339
288
|
</div>
|
|
@@ -341,62 +290,46 @@ onUnmounted(() => {
|
|
|
341
290
|
|
|
342
291
|
<!-- Scrollable content container -->
|
|
343
292
|
<div
|
|
344
|
-
|
|
345
|
-
|
|
293
|
+
class="overflow-y-auto flex flex-col [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden"
|
|
294
|
+
style="height: calc(100vh - 88px);">
|
|
346
295
|
<!-- Navigation Items - Top Section -->
|
|
347
296
|
<nav class="flex-1 w-full pt-6 pb-8">
|
|
348
297
|
<ul class="space-y-1">
|
|
349
298
|
<li v-for="(navItem, index) in nav" :key="navItem.text">
|
|
350
299
|
<!-- Dropdown item - render as accordion -->
|
|
351
300
|
<template v-if="isDropdown(navItem)">
|
|
352
|
-
<button
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
:aria-expanded="expandedAccordions.has(index)"
|
|
356
|
-
>
|
|
301
|
+
<button @click="toggleAccordion(index)"
|
|
302
|
+
class="w-full flex items-center justify-between py-3 px-4 text-lg font-sans text-primary dark:text-white"
|
|
303
|
+
:aria-expanded="expandedAccordions.has(index)">
|
|
357
304
|
<span>{{ navItem.text }}</span>
|
|
358
|
-
<svg
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
viewBox="0 0 24 24"
|
|
362
|
-
fill="none"
|
|
363
|
-
stroke="currentColor"
|
|
364
|
-
stroke-width="2"
|
|
365
|
-
>
|
|
305
|
+
<svg class="size-4 transition-transform duration-200"
|
|
306
|
+
:class="{ 'rotate-180': expandedAccordions.has(index) }" viewBox="0 0 24 24" fill="none"
|
|
307
|
+
stroke="currentColor" stroke-width="2">
|
|
366
308
|
<path d="M6 9l6 6 6-6" />
|
|
367
309
|
</svg>
|
|
368
310
|
</button>
|
|
369
311
|
<!-- Accordion content -->
|
|
370
|
-
<ul
|
|
371
|
-
v-show="expandedAccordions.has(index)"
|
|
372
|
-
class="pl-4 space-y-1"
|
|
373
|
-
>
|
|
312
|
+
<ul v-show="expandedAccordions.has(index)" class="pl-4 space-y-1">
|
|
374
313
|
<template v-for="childItem in navItem.items" :key="childItem.link || childItem.text">
|
|
375
314
|
<!-- Direct link item -->
|
|
376
315
|
<li v-if="'link' in childItem">
|
|
377
|
-
<a
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(childItem.link) }"
|
|
381
|
-
class="block py-2 px-4 text-base font-sans text-grey dark:text-white/80 hover:text-primary dark:hover:text-white"
|
|
382
|
-
>
|
|
316
|
+
<a :href="normalizeLink(childItem.link)" @click="closeMobileMenu"
|
|
317
|
+
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(childItem.link) }"
|
|
318
|
+
class="block py-2 px-4 text-base font-sans text-grey dark:text-white/80 hover:text-primary dark:hover:text-white">
|
|
383
319
|
{{ childItem.text }}
|
|
384
320
|
</a>
|
|
385
321
|
</li>
|
|
386
322
|
<!-- Nested group/section (items with dividers) -->
|
|
387
323
|
<li v-else-if="'items' in childItem">
|
|
388
|
-
<p v-if="childItem.text"
|
|
324
|
+
<p v-if="childItem.text"
|
|
325
|
+
class="pt-3 pb-1 px-4 text-xs font-semibold uppercase tracking-wider text-grey/70 dark:text-white/50">
|
|
389
326
|
{{ childItem.text }}
|
|
390
327
|
</p>
|
|
391
328
|
<ul class="space-y-1">
|
|
392
329
|
<li v-for="nestedItem in childItem.items" :key="nestedItem.link || nestedItem.text">
|
|
393
|
-
<a
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
@click="closeMobileMenu"
|
|
397
|
-
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(nestedItem.link) }"
|
|
398
|
-
class="block py-2 px-4 text-base font-sans text-grey dark:text-white/80 hover:text-primary dark:hover:text-white"
|
|
399
|
-
>
|
|
330
|
+
<a v-if="nestedItem.link" :href="normalizeLink(nestedItem.link)" @click="closeMobileMenu"
|
|
331
|
+
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(nestedItem.link) }"
|
|
332
|
+
class="block py-2 px-4 text-base font-sans text-grey dark:text-white/80 hover:text-primary dark:hover:text-white">
|
|
400
333
|
{{ nestedItem.text }}
|
|
401
334
|
</a>
|
|
402
335
|
</li>
|
|
@@ -406,20 +339,13 @@ onUnmounted(() => {
|
|
|
406
339
|
</ul>
|
|
407
340
|
</template>
|
|
408
341
|
<!-- Regular link item -->
|
|
409
|
-
<a
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
@click="closeMobileMenu"
|
|
413
|
-
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(navItem.link) }"
|
|
414
|
-
class="block py-3 px-4 text-lg font-sans text-primary dark:text-white"
|
|
415
|
-
>
|
|
342
|
+
<a v-else-if="navItem.link" :href="normalizeLink(navItem.link)" @click="closeMobileMenu"
|
|
343
|
+
:class="{ 'bg-primary/10 dark:bg-white/10': route.path === normalizeLink(navItem.link) }"
|
|
344
|
+
class="block py-3 px-4 text-lg font-sans text-primary dark:text-white">
|
|
416
345
|
{{ navItem.text }}
|
|
417
346
|
</a>
|
|
418
347
|
<!-- Nav item without link (shouldn't happen, but defensive) -->
|
|
419
|
-
<span
|
|
420
|
-
v-else
|
|
421
|
-
class="block py-3 px-4 text-lg font-sans text-primary dark:text-white"
|
|
422
|
-
>
|
|
348
|
+
<span v-else class="block py-3 px-4 text-lg font-sans text-primary dark:text-white">
|
|
423
349
|
{{ navItem.text }}
|
|
424
350
|
</span>
|
|
425
351
|
</li>
|
|
@@ -427,34 +353,24 @@ onUnmounted(() => {
|
|
|
427
353
|
</nav>
|
|
428
354
|
|
|
429
355
|
<!-- Bottom Section - Language + Appearance + Social -->
|
|
430
|
-
<div
|
|
356
|
+
<div
|
|
357
|
+
class="w-full pt-6 pb-12 border-t border-stroke dark:border-nickel relative tick-left tick-right mt-auto">
|
|
431
358
|
<div class="space-y-6">
|
|
432
359
|
<!-- Language Selector (Accordion) -->
|
|
433
360
|
<div v-if="localeLinks.length && currentLang.label" class="px-4">
|
|
434
|
-
<button
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
:aria-expanded="languageMenuOpen"
|
|
438
|
-
>
|
|
361
|
+
<button @click="languageMenuOpen = !languageMenuOpen"
|
|
362
|
+
class="w-full flex items-center justify-between text-grey dark:text-white/80 text-sm font-medium"
|
|
363
|
+
:aria-expanded="languageMenuOpen">
|
|
439
364
|
<span>{{ theme.langMenuLabel || 'Language' }}</span>
|
|
440
|
-
<svg
|
|
441
|
-
|
|
442
|
-
:class="{ 'rotate-180': languageMenuOpen }"
|
|
443
|
-
viewBox="0 0 24 24"
|
|
444
|
-
fill="none"
|
|
445
|
-
stroke="currentColor"
|
|
446
|
-
stroke-width="2"
|
|
447
|
-
>
|
|
365
|
+
<svg class="size-4 transition-transform duration-200" :class="{ 'rotate-180': languageMenuOpen }"
|
|
366
|
+
viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
448
367
|
<path d="M6 9l6 6 6-6" />
|
|
449
368
|
</svg>
|
|
450
369
|
</button>
|
|
451
370
|
<ul v-show="languageMenuOpen" class="mt-3 space-y-1">
|
|
452
371
|
<li v-for="locale in localeLinks" :key="locale.link">
|
|
453
|
-
<a
|
|
454
|
-
|
|
455
|
-
@click="closeMobileMenu"
|
|
456
|
-
class="block py-2 text-sm text-primary dark:text-white hover:opacity-70 transition-opacity"
|
|
457
|
-
>
|
|
372
|
+
<a :href="locale.link" @click="closeMobileMenu"
|
|
373
|
+
class="block py-2 text-sm text-primary dark:text-white hover:opacity-70 transition-opacity">
|
|
458
374
|
{{ locale.text }}
|
|
459
375
|
</a>
|
|
460
376
|
</li>
|
|
@@ -469,33 +385,18 @@ onUnmounted(() => {
|
|
|
469
385
|
|
|
470
386
|
<!-- Social Icons -->
|
|
471
387
|
<div class="flex items-center justify-center gap-4 pt-4">
|
|
472
|
-
<a
|
|
473
|
-
|
|
474
|
-
target="_blank"
|
|
475
|
-
rel="noopener noreferrer"
|
|
476
|
-
class="hover:opacity-70 transition-opacity"
|
|
477
|
-
@click="closeMobileMenu"
|
|
478
|
-
>
|
|
388
|
+
<a href="https://github.com/voidzero-dev" target="_blank" rel="noopener noreferrer"
|
|
389
|
+
class="hover:opacity-70 transition-opacity" @click="closeMobileMenu">
|
|
479
390
|
<img src="@assets/social/github.svg" alt="GitHub" class="size-6 block dark:hidden">
|
|
480
391
|
<img src="@assets/social/github-light.svg" alt="GitHub" class="size-6 hidden dark:block">
|
|
481
392
|
</a>
|
|
482
|
-
<a
|
|
483
|
-
|
|
484
|
-
target="_blank"
|
|
485
|
-
rel="noopener noreferrer"
|
|
486
|
-
class="hover:opacity-70 transition-opacity"
|
|
487
|
-
@click="closeMobileMenu"
|
|
488
|
-
>
|
|
393
|
+
<a href="https://bsky.app/profile/voidzero.dev" target="_blank" rel="noopener noreferrer"
|
|
394
|
+
class="hover:opacity-70 transition-opacity" @click="closeMobileMenu">
|
|
489
395
|
<img src="@assets/social/bluesky.svg" alt="Bluesky" class="size-6 block dark:hidden">
|
|
490
396
|
<img src="@assets/social/bluesky-light.svg" alt="Bluesky" class="size-6 hidden dark:block">
|
|
491
397
|
</a>
|
|
492
|
-
<a
|
|
493
|
-
|
|
494
|
-
target="_blank"
|
|
495
|
-
rel="noopener noreferrer"
|
|
496
|
-
class="hover:opacity-70 transition-opacity"
|
|
497
|
-
@click="closeMobileMenu"
|
|
498
|
-
>
|
|
398
|
+
<a href="https://x.com/voidzerodev" target="_blank" rel="noopener noreferrer"
|
|
399
|
+
class="hover:opacity-70 transition-opacity" @click="closeMobileMenu">
|
|
499
400
|
<img src="@assets/social/twitter.svg" alt="X" class="size-6 block dark:hidden">
|
|
500
401
|
<img src="@assets/social/twitter-light.svg" alt="X" class="size-6 hidden dark:block">
|
|
501
402
|
</a>
|
|
@@ -513,6 +414,7 @@ onUnmounted(() => {
|
|
|
513
414
|
from {
|
|
514
415
|
opacity: 0;
|
|
515
416
|
}
|
|
417
|
+
|
|
516
418
|
to {
|
|
517
419
|
opacity: 1;
|
|
518
420
|
}
|
|
@@ -179,13 +179,13 @@ const getBackerEmptySlots = (itemCount: number, minSlots: number = 30) => {
|
|
|
179
179
|
|
|
180
180
|
<template>
|
|
181
181
|
<div class="wrapper wrapper--ticks border-t py-14 sm:py-30 px-5 sm:px-10">
|
|
182
|
-
<div class="flex flex-col md:flex-row justify-between items-center gap-8 md:gap-20 text-center md:text-left">
|
|
182
|
+
<div class="flex flex-col md:flex-row justify-between items-center gap-8 md:gap-20 text-center md:text-left md:pl-15">
|
|
183
183
|
<div class="flex flex-col gap-3">
|
|
184
184
|
<h3 class="text-white max-w-xl text-balance">{{ heading }}</h3>
|
|
185
185
|
<p class="max-w-lg text-white/70 text-balance">{{ description }}</p>
|
|
186
186
|
<a :href="sponsorLink" target="_blank" class="button w-fit mt-8 mx-auto md:mx-0">{{ sponsorLinkText }}</a>
|
|
187
187
|
</div>
|
|
188
|
-
<div class="flex gap-8 md:gap-12 items-start justify-center md:justify-start md:pr-
|
|
188
|
+
<div class="flex gap-8 md:gap-12 items-start justify-center md:justify-start md:pr-25">
|
|
189
189
|
<img src="../../assets/vite/vite-by-voidzero.png" alt="Brought to you by VoidZero" class="h-44 max-w-full object-contain mt-10 md:mt-0"/>
|
|
190
190
|
</div>
|
|
191
191
|
</div>
|
|
@@ -396,4 +396,4 @@ const getBackerEmptySlots = (itemCount: number, minSlots: number = 30) => {
|
|
|
396
396
|
margin-right: -1px;
|
|
397
397
|
margin-bottom: -1px;
|
|
398
398
|
}
|
|
399
|
-
</style>
|
|
399
|
+
</style>
|