@voidzero-dev/vitepress-theme 3.2.1 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/assets/oxc/footer-background.jpg +0 -0
- package/src/assets/oxc/oxc-feature-background.jpg +0 -0
- package/src/assets/oxc/oxc-formatter-terminal.png +0 -0
- package/src/assets/rolldown/footer-background.jpg +0 -0
- package/src/assets/rolldown/hero-background.jpg +0 -0
- package/src/assets/rolldown/rolldown-esbuild-parity.png +0 -0
- package/src/assets/rolldown/rolldown-rollup-background.jpg +0 -0
- package/src/assets/vite/footer-background.jpg +0 -0
- package/src/assets/vite/vite-featurepanel-1-background.jpg +0 -0
- package/src/assets/vite/vite-featurepanel-4-background.jpg +0 -0
- package/src/assets/vite/vite-frameworks-mobile.png +0 -0
- package/src/assets/vite/vite-frameworks.png +0 -0
- package/src/assets/vite/vite-ssr-support.png +0 -0
- package/src/assets/vitest/footer-background.jpg +0 -0
- package/src/assets/vitest/hero-background.jpg +0 -0
- package/src/assets/vitest/hero-terminal.png +0 -0
- package/src/assets/vitest/vitest-jest-compatible.png +0 -0
- package/src/assets/vitest/vitest-watcher-background.jpg +0 -0
- package/src/components/vitepress-default/Layout.vue +93 -45
- package/src/components/vitepress-default/VPMenuLink.vue +16 -0
- package/src/components/vitepress-default/VPNavBarMenuLink.vue +19 -7
- package/src/styles/base.css +9 -0
- package/src/assets/vitest/hero-terminal.svg +0 -44
- package/src/assets/voidzero/animations/1280_x_552_homepage.riv +0 -0
- package/src/assets/voidzero/animations/343_x_148_homepage_mobile.riv +0 -0
- package/src/assets/voidzero/animations/480_x_480_build_tool_for_web.riv +0 -0
- package/src/assets/voidzero/animations/480_x_480_fastest_javascript_bundler.riv +0 -0
- package/src/assets/voidzero/animations/480_x_480_language_toolchain.riv +0 -0
- package/src/assets/voidzero/animations/480_x_480_next_generation_runner.riv +0 -0
- package/src/assets/voidzero/animations/about-mobile.riv +0 -0
- package/src/assets/voidzero/animations/about.riv +0 -0
- package/src/assets/voidzero/backgrounds/casestudies.jpg +0 -0
- package/src/assets/voidzero/backgrounds/oxc.jpg +0 -0
- package/src/assets/voidzero/backgrounds/rolldown.jpg +0 -0
- package/src/assets/voidzero/backgrounds/vite.jpg +0 -0
- package/src/assets/voidzero/backgrounds/vitest.jpg +0 -0
- package/src/assets/voidzero/career-illustration.jpg +0 -0
- package/src/assets/voidzero/footer-logo.svg +0 -5
- package/src/assets/voidzero/footer.jpg +0 -0
- package/src/assets/voidzero/investors/accel.svg +0 -9
- package/src/assets/voidzero/investors/amplify.svg +0 -3
- package/src/assets/voidzero/investors/peakxv.png +0 -0
- package/src/assets/voidzero/investors/resend.svg +0 -3
- package/src/assets/voidzero/investors/sentry.svg +0 -10
- package/src/assets/voidzero/investors/sunflower.png +0 -0
- package/src/assets/voidzero/logo-light.svg +0 -3
- package/src/assets/voidzero/logo.svg +0 -3
- package/src/assets/voidzero/signature.svg +0 -11
- package/src/assets/voidzero/terminals/rolldown.svg +0 -7
- package/src/assets/voidzero/terminals/vite.svg +0 -9
- package/src/assets/voidzero/terminals/vitest.svg +0 -49
- package/src/assets/voidzero/vite-plus-chip.png +0 -0
- package/src/components/oxc/FeatureFormatter.vue +0 -30
- package/src/components/oxc/FeatureLinter.vue +0 -31
- package/src/components/oxc/FeatureMinifier.vue +0 -26
- package/src/components/oxc/FeatureParser.vue +0 -57
- package/src/components/oxc/FeatureResolver.vue +0 -29
- package/src/components/oxc/FeatureToolbar.vue +0 -195
- package/src/components/oxc/FeatureTransformer.vue +0 -36
- package/src/components/oxc/Hero.vue +0 -37
- package/src/components/rolldown/FeatureGrid.vue +0 -94
- package/src/components/rolldown/Hero.vue +0 -57
- package/src/components/vite/Community.vue +0 -192
- package/src/components/vite/FeatureGrid1.vue +0 -66
- package/src/components/vite/FeatureGrid2.vue +0 -55
- package/src/components/vite/Frameworks.vue +0 -14
- package/src/components/vite/Hero.vue +0 -48
|
Binary file
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<section id="feature-formatter" class="wrapper grid border-t md:grid-cols-2">
|
|
3
|
-
<div class="px-5 py-6 md:p-10 flex flex-col justify-center gap-15">
|
|
4
|
-
<div class="flex flex-col gap-5">
|
|
5
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Formatter<span class="text-aqua"> (Alpha)</span></span>
|
|
6
|
-
<h4 class="text-white">Oxfmt: Prettier-compatible formatter</h4>
|
|
7
|
-
<p class="text-white/70 text-base max-w-[25rem] text-pretty">Enforce consistent code styles</p>
|
|
8
|
-
<ul class="checkmark-list">
|
|
9
|
-
<li>3x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">Biome</code></li>
|
|
10
|
-
<li>35x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">Prettier</code></li>
|
|
11
|
-
<li>Tailwind class sorting support</li>
|
|
12
|
-
</ul>
|
|
13
|
-
<a href="/docs/guide/usage/formatter" class="button w-fit mt-6">Usage Guide</a>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
<div class="flex flex-col">
|
|
17
|
-
<div class="h-full overflow-clip flex justify-end items-center py-5 px-5 md:py-20 md:pl-10 md:pr-0">
|
|
18
|
-
<img loading="lazy" src="@assets/oxc/oxc-formatter-terminal.png" alt="Linter" class="[mask-image:linear-gradient(to_bottom,black_50%,transparent),linear-gradient(to_right,black_50%,transparent)] [mask-composite:intersect] [-webkit-mask-composite:source-in]">
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
</section>
|
|
22
|
-
</template>
|
|
23
|
-
|
|
24
|
-
<style scoped>
|
|
25
|
-
.card-bg {
|
|
26
|
-
background-image: url('@assets/oxc/oxc-feature-background.jpg');
|
|
27
|
-
background-size: cover;
|
|
28
|
-
background-position: center;
|
|
29
|
-
}
|
|
30
|
-
</style>
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<section id="feature-linter" class="wrapper grid md:grid-cols-2">
|
|
3
|
-
<div class="px-5 py-6 md:p-10 flex flex-col justify-center gap-15">
|
|
4
|
-
<div class="flex flex-col gap-5">
|
|
5
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Linter</span>
|
|
6
|
-
<h4 class="text-white">Oxlint: ESLint-compatible linter</h4>
|
|
7
|
-
<p class="text-white/70 text-base max-w-[25rem] text-pretty">Catch bugs before they make it to production</p>
|
|
8
|
-
<ul class="checkmark-list">
|
|
9
|
-
<li>50~100x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">ESLint</code></li>
|
|
10
|
-
<li>570+ rules and growing</li>
|
|
11
|
-
<li>True type-aware Linting powered by <code class="mx-1 outline-none bg-nickel/50 text-aqua">tsgo</code></li>
|
|
12
|
-
<li>Support for <code class="mx-1 outline-none bg-nickel/50 text-aqua">ESLint</code> JS Plugins</li>
|
|
13
|
-
</ul>
|
|
14
|
-
<a href="/docs/guide/usage/linter" class="button w-fit mt-6">Usage Guide</a>
|
|
15
|
-
</div>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="flex flex-col">
|
|
18
|
-
<div class="card-bg h-full overflow-clip flex justify-end items-center py-20 px-5 md:pl-10 md:pr-0">
|
|
19
|
-
<img loading="lazy" src="@assets/oxc/oxc-linter-terminal.png" alt="Linter" class="w-full md:w-auto">
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
</section>
|
|
23
|
-
</template>
|
|
24
|
-
|
|
25
|
-
<style scoped>
|
|
26
|
-
.card-bg {
|
|
27
|
-
background-image: url('@assets/oxc/oxc-feature-background.jpg');
|
|
28
|
-
background-size: cover;
|
|
29
|
-
background-position: center;
|
|
30
|
-
}
|
|
31
|
-
</style>
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import RiveAnimation from "@components/shared/RiveAnimation.vue";
|
|
3
|
-
import minifierAnimation from '@assets/oxc/animations/560_x_260_minifier.riv'
|
|
4
|
-
</script>
|
|
5
|
-
|
|
6
|
-
<template>
|
|
7
|
-
<section id="feature-minifier" class="wrapper border-t grid md:grid-cols-2">
|
|
8
|
-
<div class="px-5 py-6 md:p-10 flex flex-col justify-center gap-15">
|
|
9
|
-
<div class="flex flex-col gap-5">
|
|
10
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Minifier <span class="text-aqua">(Alpha)</span></span>
|
|
11
|
-
<h4 class="text-white">oxc-minify</h4>
|
|
12
|
-
<p class="text-white/70 text-base max-w-[25rem] text-pretty">Compress and optimize</p>
|
|
13
|
-
<ul class="checkmark-list">
|
|
14
|
-
<li>Dead code elimination</li>
|
|
15
|
-
<li>Syntax shortening & whitespace removal</li>
|
|
16
|
-
<li>Variable name mangling</li>
|
|
17
|
-
</ul>
|
|
18
|
-
<a href="/docs/guide/usage/minifier" class="button w-fit mt-6">Usage Guide</a>
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="flex flex-col py-10">
|
|
22
|
-
<RiveAnimation :desktop-src="minifierAnimation" :desktop-width="560" :desktop-height="260"
|
|
23
|
-
canvas-class="w-full" />
|
|
24
|
-
</div>
|
|
25
|
-
</section>
|
|
26
|
-
</template>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import PerformanceBar from "@components/shared/PerformanceBar.vue";
|
|
3
|
-
import parserBenchmarkBg from '@assets/oxc/oxc-feature-background.jpg';
|
|
4
|
-
|
|
5
|
-
const performanceData = [
|
|
6
|
-
{
|
|
7
|
-
name: 'OXC',
|
|
8
|
-
percentage: 20,
|
|
9
|
-
time: '26.3ms',
|
|
10
|
-
isPrimary: true
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
name: 'SWC',
|
|
14
|
-
percentage: 65,
|
|
15
|
-
time: '84.1ms'
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
name: 'Biome',
|
|
19
|
-
percentage: 100,
|
|
20
|
-
time: '130.1ms'
|
|
21
|
-
}
|
|
22
|
-
]
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<template>
|
|
26
|
-
<section id="feature-parser" class="wrapper grid border-t md:grid-cols-2">
|
|
27
|
-
<div class="px-5 py-6 md:p-10 md:py-15 flex flex-col justify-center gap-15">
|
|
28
|
-
<div class="flex flex-col gap-5">
|
|
29
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Parser</span>
|
|
30
|
-
<h4 class="text-white">oxc-parser</h4>
|
|
31
|
-
<p class="text-white/70 text-base max-w-100 text-pretty">The foundation for advanced transformations and
|
|
32
|
-
compilations</p>
|
|
33
|
-
<ul class="checkmark-list">
|
|
34
|
-
<li>3x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">SWC</code></li>
|
|
35
|
-
<li>Parses <code class="mx-1 outline-none bg-nickel/50 text-aqua">.js(x)</code> and <code class="mx-1 outline-none bg-nickel/50 text-aqua">.ts(x)</code></li>
|
|
36
|
-
<li>Passes all Test262 stage4 tests</li>
|
|
37
|
-
</ul>
|
|
38
|
-
<a href="/docs/guide/usage/parser" class="button w-fit mt-6">Usage Guide</a>
|
|
39
|
-
</div>
|
|
40
|
-
</div>
|
|
41
|
-
<div class="flex flex-col justify-center px-5 md:px-10 py-5 md:pb-10 md:py-10">
|
|
42
|
-
<p class="text-white font-medium mb-10">
|
|
43
|
-
Parser Benchmark for Oxc, Swc and Biome
|
|
44
|
-
</p>
|
|
45
|
-
<div class="flex flex-col gap-6">
|
|
46
|
-
<PerformanceBar v-for="item in performanceData" :key="item.name" :data="item"
|
|
47
|
-
:background-image="parserBenchmarkBg" large />
|
|
48
|
-
</div>
|
|
49
|
-
<p class="text-xs mt-10">
|
|
50
|
-
Parsing typescript.js on Macbook Pro M3 Max |
|
|
51
|
-
<a href="https://github.com/oxc-project/bench-javascript-parser-written-in-rust" target="_blank">Source</a>
|
|
52
|
-
</p>
|
|
53
|
-
</div>
|
|
54
|
-
</section>
|
|
55
|
-
</template>
|
|
56
|
-
|
|
57
|
-
<style scoped></style>
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<template>
|
|
6
|
-
<section id="feature-resolver" class="wrapper border-t grid md:grid-cols-2">
|
|
7
|
-
<div class="px-5 py-6 md:p-10 flex flex-col justify-center gap-15">
|
|
8
|
-
<div class="flex flex-col gap-5">
|
|
9
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Resolver</span>
|
|
10
|
-
<h4 class="text-white">oxc-resolver</h4>
|
|
11
|
-
<p class="text-white/70 text-base max-w-[25rem] text-pretty">Node.js-compatible CJS and ESM module resolution
|
|
12
|
-
</p>
|
|
13
|
-
<ul class="checkmark-list">
|
|
14
|
-
<li>Behavior alignment with <code class="mx-1 outline-none bg-nickel/50 text-aqua">enhanced-resolve</code>
|
|
15
|
-
</li>
|
|
16
|
-
<li>28x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">enhanced-resolve</code>
|
|
17
|
-
</li>
|
|
18
|
-
<li>Highly customizable</li>
|
|
19
|
-
</ul>
|
|
20
|
-
<a href="/docs/guide/usage/resolver" class="button w-fit mt-6">Usage Guide</a>
|
|
21
|
-
</div>
|
|
22
|
-
</div>
|
|
23
|
-
<div class="flex flex-col">
|
|
24
|
-
<div class="h-full overflow-clip flex justify-end items-center py-16 px-5 md:px-10">
|
|
25
|
-
<img loading="lazy" src="@assets/oxc/oxc-resolver-terminal.png" alt="Resolver" class="w-full md:w-auto">
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
</section>
|
|
29
|
-
</template>
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { ref, onMounted, onUnmounted } from 'vue'
|
|
3
|
-
|
|
4
|
-
const features = [
|
|
5
|
-
{ id: 'feature-linter', label: 'linter' },
|
|
6
|
-
{ id: 'feature-formatter', label: 'formatter' },
|
|
7
|
-
{ id: 'feature-parser', label: 'parser' },
|
|
8
|
-
{ id: 'feature-transformer', label: 'transformer' },
|
|
9
|
-
{ id: 'feature-resolver', label: 'resolver' },
|
|
10
|
-
{ id: 'feature-minifier', label: 'minifier' },
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
const activeSection = ref('feature-parser')
|
|
14
|
-
const underlineStyle = ref({ left: '0px', width: '0px' })
|
|
15
|
-
const listItems = ref<HTMLElement[]>([])
|
|
16
|
-
let scrollTimeout: number | null = null
|
|
17
|
-
|
|
18
|
-
const scrollToSection = (e: Event, id: string) => {
|
|
19
|
-
e.preventDefault()
|
|
20
|
-
e.stopPropagation()
|
|
21
|
-
|
|
22
|
-
const element = document.getElementById(id)
|
|
23
|
-
if (!element) return
|
|
24
|
-
|
|
25
|
-
// Get the toolbar height to offset the scroll
|
|
26
|
-
const toolbar = (e.currentTarget as HTMLElement).closest('section')
|
|
27
|
-
const toolbarHeight = toolbar?.offsetHeight || 0
|
|
28
|
-
|
|
29
|
-
// Calculate position to scroll to
|
|
30
|
-
const elementPosition = element.getBoundingClientRect().top + window.scrollY
|
|
31
|
-
const offsetPosition = elementPosition - toolbarHeight
|
|
32
|
-
|
|
33
|
-
// Use custom smooth scroll with requestAnimationFrame for guaranteed smooth behavior
|
|
34
|
-
const startPosition = window.scrollY
|
|
35
|
-
const distance = offsetPosition - startPosition
|
|
36
|
-
const duration = 800 // ms
|
|
37
|
-
let startTime: number | null = null
|
|
38
|
-
|
|
39
|
-
const animation = (currentTime: number) => {
|
|
40
|
-
if (startTime === null) startTime = currentTime
|
|
41
|
-
const timeElapsed = currentTime - startTime
|
|
42
|
-
const progress = Math.min(timeElapsed / duration, 1)
|
|
43
|
-
|
|
44
|
-
// Easing function (easeInOutCubic)
|
|
45
|
-
const ease = progress < 0.5
|
|
46
|
-
? 4 * progress * progress * progress
|
|
47
|
-
: 1 - Math.pow(-2 * progress + 2, 3) / 2
|
|
48
|
-
|
|
49
|
-
window.scrollTo(0, startPosition + distance * ease)
|
|
50
|
-
|
|
51
|
-
if (progress < 1) {
|
|
52
|
-
requestAnimationFrame(animation)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
requestAnimationFrame(animation)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const updateUnderlinePosition = () => {
|
|
60
|
-
const activeIndex = features.findIndex(f => f.id === activeSection.value)
|
|
61
|
-
if (activeIndex >= 0 && listItems.value[activeIndex]) {
|
|
62
|
-
const activeItem = listItems.value[activeIndex]
|
|
63
|
-
underlineStyle.value = {
|
|
64
|
-
left: `${activeItem.offsetLeft}px`,
|
|
65
|
-
width: `${activeItem.offsetWidth}px`
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Auto-scroll the toolbar on mobile to keep active item in view
|
|
69
|
-
const toolbar = activeItem.closest('ul')
|
|
70
|
-
if (toolbar && window.innerWidth < 640) { // sm breakpoint
|
|
71
|
-
const itemLeft = activeItem.offsetLeft
|
|
72
|
-
const itemWidth = activeItem.offsetWidth
|
|
73
|
-
const toolbarWidth = toolbar.clientWidth
|
|
74
|
-
|
|
75
|
-
// Calculate the center position
|
|
76
|
-
const targetScrollLeft = itemLeft - (toolbarWidth / 2) + (itemWidth / 2)
|
|
77
|
-
|
|
78
|
-
toolbar.scrollTo({
|
|
79
|
-
left: targetScrollLeft,
|
|
80
|
-
behavior: 'smooth'
|
|
81
|
-
})
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const determineActiveSection = () => {
|
|
87
|
-
// Get all sections and their positions
|
|
88
|
-
const sections = features.map(feature => {
|
|
89
|
-
const element = document.getElementById(feature.id)
|
|
90
|
-
if (!element) return null
|
|
91
|
-
|
|
92
|
-
const rect = element.getBoundingClientRect()
|
|
93
|
-
return {
|
|
94
|
-
id: feature.id,
|
|
95
|
-
top: rect.top,
|
|
96
|
-
bottom: rect.bottom,
|
|
97
|
-
height: rect.height
|
|
98
|
-
}
|
|
99
|
-
}).filter(Boolean)
|
|
100
|
-
|
|
101
|
-
// Find the section that's most visible near the top of the viewport
|
|
102
|
-
// We consider a section "active" if it's within 200px of the top
|
|
103
|
-
const threshold = 200
|
|
104
|
-
let activeId = activeSection.value
|
|
105
|
-
|
|
106
|
-
for (const section of sections) {
|
|
107
|
-
if (!section) continue
|
|
108
|
-
|
|
109
|
-
// If section top is near or above threshold and bottom is below threshold
|
|
110
|
-
if (section.top <= threshold && section.bottom > threshold) {
|
|
111
|
-
activeId = section.id
|
|
112
|
-
break
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// If no section found above, check if we're at the very bottom
|
|
117
|
-
if (activeId === activeSection.value) {
|
|
118
|
-
const lastSection = sections[sections.length - 1]
|
|
119
|
-
if (lastSection && window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 100) {
|
|
120
|
-
activeId = lastSection.id
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (activeId !== activeSection.value) {
|
|
125
|
-
activeSection.value = activeId
|
|
126
|
-
updateUnderlinePosition()
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const handleScroll = () => {
|
|
131
|
-
if (scrollTimeout) {
|
|
132
|
-
window.cancelAnimationFrame(scrollTimeout)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
scrollTimeout = window.requestAnimationFrame(() => {
|
|
136
|
-
determineActiveSection()
|
|
137
|
-
})
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
let observer: IntersectionObserver | null = null
|
|
141
|
-
|
|
142
|
-
onMounted(() => {
|
|
143
|
-
// Set up scroll listener for active state tracking
|
|
144
|
-
window.addEventListener('scroll', handleScroll, { passive: true })
|
|
145
|
-
|
|
146
|
-
// Initial underline position
|
|
147
|
-
setTimeout(() => {
|
|
148
|
-
updateUnderlinePosition()
|
|
149
|
-
determineActiveSection()
|
|
150
|
-
}, 100)
|
|
151
|
-
|
|
152
|
-
// Update on resize
|
|
153
|
-
window.addEventListener('resize', updateUnderlinePosition)
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
onUnmounted(() => {
|
|
157
|
-
window.removeEventListener('scroll', handleScroll)
|
|
158
|
-
window.removeEventListener('resize', updateUnderlinePosition)
|
|
159
|
-
if (scrollTimeout) {
|
|
160
|
-
window.cancelAnimationFrame(scrollTimeout)
|
|
161
|
-
}
|
|
162
|
-
})
|
|
163
|
-
</script>
|
|
164
|
-
|
|
165
|
-
<template>
|
|
166
|
-
<div class="wrapper wrapper wrapper--ticks border-t w-full relative z-20"></div>
|
|
167
|
-
<section class="wrapper sticky top-0 border-b bg-primary z-10 overflow-hidden">
|
|
168
|
-
<ul
|
|
169
|
-
class="w-full sm:grid sm:grid-cols-6 flex items-center divide-x divide-nickel relative overflow-x-auto scrollbar-hide touch-none sm:touch-auto select-none sm:select-auto">
|
|
170
|
-
<div class="absolute bottom-0 h-0.5 bg-white transition-all duration-300 ease-out" :style="underlineStyle" />
|
|
171
|
-
<li v-for="(feature, _index) in features" :key="feature.id" ref="listItems" class="flex-shrink-0">
|
|
172
|
-
<a :href="`#${feature.id}`" @click="scrollToSection($event, feature.id)"
|
|
173
|
-
class="h-full text-sm font-mono tracking-tight py-4 px-6 sm:px-0 flex justify-center gap-1.5 transition-colors duration-200 whitespace-nowrap"
|
|
174
|
-
:class="activeSection === feature.id ? 'text-white' : 'text-grey'">
|
|
175
|
-
<span>{{ feature.label }}</span>
|
|
176
|
-
</a>
|
|
177
|
-
</li>
|
|
178
|
-
</ul>
|
|
179
|
-
</section>
|
|
180
|
-
</template>
|
|
181
|
-
|
|
182
|
-
<style scoped>
|
|
183
|
-
/* Hide scrollbar for Chrome, Safari and Opera */
|
|
184
|
-
.scrollbar-hide::-webkit-scrollbar {
|
|
185
|
-
display: none;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
/* Hide scrollbar for IE, Edge and Firefox */
|
|
189
|
-
.scrollbar-hide {
|
|
190
|
-
-ms-overflow-style: none;
|
|
191
|
-
/* IE and Edge */
|
|
192
|
-
scrollbar-width: none;
|
|
193
|
-
/* Firefox */
|
|
194
|
-
}
|
|
195
|
-
</style>
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<template>
|
|
6
|
-
<section id="feature-transformer" class="wrapper border-t grid md:grid-cols-2">
|
|
7
|
-
<div class="px-5 py-6 md:p-10 flex flex-col justify-center gap-15">
|
|
8
|
-
<div class="flex flex-col gap-5">
|
|
9
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">Transformer</span>
|
|
10
|
-
<h4 class="text-white">oxc-transform</h4>
|
|
11
|
-
<p class="text-white/70 text-base max-w-[25rem] text-pretty">Transpile source code at the speed of thought</p>
|
|
12
|
-
<ul class="checkmark-list">
|
|
13
|
-
<li><code class="mx-1 outline-none bg-nickel/50 text-aqua">TypeScript</code> & <code
|
|
14
|
-
class="mx-1 outline-none bg-nickel/50 text-aqua">JSX</code></li>
|
|
15
|
-
<li>Syntax lowering to ES2015</li>
|
|
16
|
-
<li>Isolated Declarations DTS Emit</li>
|
|
17
|
-
<li>React Fast Refresh, styled-components, and more</li>
|
|
18
|
-
</ul>
|
|
19
|
-
<a href="/docs/guide/usage/transformer" class="button w-fit mt-6">Usage Guide</a>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
<div class="flex flex-col">
|
|
23
|
-
<div class="card-bg h-full overflow-clip flex justify-end items-center py-5 md:py-10 px-5 md:px-25">
|
|
24
|
-
<img loading="lazy" src="@assets/oxc/oxc-transformer-terminal.png" alt="Transformer" class="w-full md:w-auto">
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
</section>
|
|
28
|
-
</template>
|
|
29
|
-
|
|
30
|
-
<style scoped>
|
|
31
|
-
.card-bg {
|
|
32
|
-
background-image: url('@assets/oxc/oxc-feature-background.jpg');
|
|
33
|
-
background-size: cover;
|
|
34
|
-
background-position: center;
|
|
35
|
-
}
|
|
36
|
-
</style>
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import RiveAnimation from "@components/shared/RiveAnimation.vue";
|
|
3
|
-
import oxcAnimation from '@assets/oxc/animations/640_x_630_oxc masthead_.riv'
|
|
4
|
-
</script>
|
|
5
|
-
|
|
6
|
-
<template>
|
|
7
|
-
<div class="wrapper wrapper--ticks grid md:grid-cols-2 w-full border-nickel divide-x">
|
|
8
|
-
<div class="flex flex-col p-10 justify-center items-center md:items-start">
|
|
9
|
-
<div class="flex flex-col gap-5 max-w-[30rem] text-center md:text-left items-center md:items-start">
|
|
10
|
-
<a class="flex items-center gap-2" href="https://voidzero.dev" target="_blank">
|
|
11
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">By</span>
|
|
12
|
-
<img src="@assets/logos/voidzero-light.svg" alt="VoidZero" class="h-2.5">
|
|
13
|
-
</a>
|
|
14
|
-
<h1 class="text-white text-pretty">The JavaScript Oxidation Compiler</h1>
|
|
15
|
-
<p class="text-white/70 text-lg max-w-[25rem] text-pretty">A collection of high-performance JavaScript tools
|
|
16
|
-
written in Rust</p>
|
|
17
|
-
<div class="flex items-center gap-5 mt-8">
|
|
18
|
-
<a href="/docs/guide/introduction" class="button button--primary inline-block w-fit">
|
|
19
|
-
Get Started
|
|
20
|
-
</a>
|
|
21
|
-
<a href="https://github.com/oxc-project/oxc" target="_blank" rel="noopener noreferrer"
|
|
22
|
-
class="button inline-block w-fit">
|
|
23
|
-
View on GitHub
|
|
24
|
-
</a>
|
|
25
|
-
</div>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
<div class="flex flex-col min-h-[22rem] sm:min-h-[30rem]">
|
|
29
|
-
<div class="relative px-10 h-full flex flex-col justify-center overflow-clip pb-10 sm:pb-0">
|
|
30
|
-
<RiveAnimation :desktop-src="oxcAnimation" :mobile-src="oxcAnimation" :desktop-width="640" :desktop-height="630"
|
|
31
|
-
:mobile-width="640" :mobile-height="630" canvas-class="w-full" />
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
</div>
|
|
35
|
-
</template>
|
|
36
|
-
|
|
37
|
-
<style scoped></style>
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import RiveAnimation from "@components/shared/RiveAnimation.vue";
|
|
3
|
-
import vitePoweredAnimation from '@assets/rolldown/animations/640_x_300_design_for_vite.riv'
|
|
4
|
-
import PerformanceBar from "@components/shared/PerformanceBar.vue";
|
|
5
|
-
import performanceBarBg from '@assets/rolldown/rolldown-rollup-background.jpg';
|
|
6
|
-
|
|
7
|
-
const performanceData = [
|
|
8
|
-
{
|
|
9
|
-
name: 'Rolldown',
|
|
10
|
-
percentage: 4.01,
|
|
11
|
-
time: '1.61s',
|
|
12
|
-
isPrimary: true
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
name: 'esbuild',
|
|
16
|
-
percentage: 4.24,
|
|
17
|
-
time: '1.70s'
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'rspack',
|
|
21
|
-
percentage: 10.15,
|
|
22
|
-
time: '4.07s',
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
name: 'Rollup + esbuild',
|
|
26
|
-
percentage: 100,
|
|
27
|
-
time: '40.10s'
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
</script>
|
|
31
|
-
|
|
32
|
-
<template>
|
|
33
|
-
<section class="wrapper wrapper--ticks border-t grid lg:grid-cols-2 divide-x divide-y divide-nickel">
|
|
34
|
-
<div class="flex flex-col gap-3 justify-between">
|
|
35
|
-
<div class="p-5 sm:p-15 pb-0 sm:pb-0 flex flex-col gap-3">
|
|
36
|
-
<h5 class="text-balance sm:text-pretty text-white">Speed of Rust</h5>
|
|
37
|
-
<p class="sm:max-w-[30rem] text-pretty">Rolldown handles tens of thousands of modules without breaking a sweat
|
|
38
|
-
</p>
|
|
39
|
-
</div>
|
|
40
|
-
<div class="p-5 sm:p-15 flex flex-col gap-10">
|
|
41
|
-
<div class="flex flex-col gap-4">
|
|
42
|
-
<PerformanceBar v-for="item in performanceData" :key="item.name" :data="item"
|
|
43
|
-
:background-image="performanceBarBg" />
|
|
44
|
-
</div>
|
|
45
|
-
<div>
|
|
46
|
-
<p class="text-sm"><a
|
|
47
|
-
href="https://github.com/rolldown/benchmarks/tree/f3997c801b7d261e8aaa15d4affbf6730cc19884?tab=readme-ov-file#ubuntu-latest-updated-2025-12-21"
|
|
48
|
-
target="_blank" class="text-white font-medium">Benchmark</a> bundling <span
|
|
49
|
-
class="text-white font-medium">19k</span>
|
|
50
|
-
modules.</p>
|
|
51
|
-
<p class="text-xs">10k React JSX components + 9k iconify JS files, with minification and source maps.</p>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<div class="flex flex-col gap-3 border-r-0 justify-between overflow-hidden">
|
|
57
|
-
<div class="p-5 sm:p-15 sm:pb-10 flex flex-col gap-3">
|
|
58
|
-
<h5 class="text-white">Rollup Compatible</h5>
|
|
59
|
-
<p class="max-w-[30rem] text-pretty">Familiar API & options with a rich plugin ecosystem</p>
|
|
60
|
-
</div>
|
|
61
|
-
<div class="card-bg px-5 sm:px-20 pt-5 sm:pt-10 flex justify-center">
|
|
62
|
-
<img src="@assets/rolldown/rolldown-rollup.png" class="-mb-[60px]" inert loading="lazy" alt="rollup compatible">
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
<div class="flex flex-col gap-3 justify-between">
|
|
67
|
-
<div class="p-5 sm:p-15 pb-0 sm:pb-0 flex flex-col gap-3">
|
|
68
|
-
<h5 class="text-white">Esbuild Feature Parity</h5>
|
|
69
|
-
<p class="max-w-[26rem] text-pretty">Built-in transforms, define, inject, minify, CSS bundling & more...</p>
|
|
70
|
-
</div>
|
|
71
|
-
<div class="flex-1 flex items-center justify-center p-8 sm:p-15 sm:pt-10">
|
|
72
|
-
<img src="@assets/rolldown/rolldown-esbuild-parity.png" inert loading="lazy" alt="jest compatible"
|
|
73
|
-
class="w-full max-h-60 object-contain">
|
|
74
|
-
</div>
|
|
75
|
-
</div>
|
|
76
|
-
|
|
77
|
-
<div class="flex flex-col gap-3 justify-between">
|
|
78
|
-
<div class="p-5 sm:p-15 pb-0 sm:pb-0 flex flex-col gap-3">
|
|
79
|
-
<h5 class="text-white">Designed for Vite</h5>
|
|
80
|
-
<p class="max-w-[25rem] text-pretty">The unified bundler powering Vite 8+</p>
|
|
81
|
-
</div>
|
|
82
|
-
<RiveAnimation :desktop-src="vitePoweredAnimation" :desktop-width="640" :desktop-height="300"
|
|
83
|
-
canvas-class="w-full mb-10" />
|
|
84
|
-
</div>
|
|
85
|
-
</section>
|
|
86
|
-
</template>
|
|
87
|
-
|
|
88
|
-
<style scoped>
|
|
89
|
-
.card-bg {
|
|
90
|
-
background-image: url('@assets/rolldown/rolldown-rollup-background.jpg');
|
|
91
|
-
background-size: cover;
|
|
92
|
-
background-position: center;
|
|
93
|
-
}
|
|
94
|
-
</style>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="wrapper wrapper--ticks grid md:grid-cols-2 w-full border-nickel divide-x">
|
|
3
|
-
<div class="flex flex-col p-10 justify-between items-center md:items-start">
|
|
4
|
-
<div class="flex flex-col gap-5 text-center md:text-left items-center md:items-start">
|
|
5
|
-
<a class="flex items-center gap-2" href="https://voidzero.dev" target="_blank">
|
|
6
|
-
<span class="text-grey text-xs font-mono uppercase tracking-wide">By</span>
|
|
7
|
-
<img src="@assets/logos/voidzero-light.svg" alt="VoidZero" class="h-2.5">
|
|
8
|
-
</a>
|
|
9
|
-
<h1 class="text-white text-pretty max-w-[35rem]">Blazing Fast<br>Rust-based bundler for JavaScript</h1>
|
|
10
|
-
<p class="text-white/70 text-lg max-w-[30rem] text-pretty">with Rollup-compatible API and esbuild feature parity</p>
|
|
11
|
-
<div class="flex items-center gap-5 mt-6">
|
|
12
|
-
<a href="/guide/" class="button button--primary inline-block w-fit">
|
|
13
|
-
<span>Get Started</span>
|
|
14
|
-
</a>
|
|
15
|
-
<a href="https://github.com/rolldown/rolldown" target="_blank" rel="noopener noreferrer" class="button inline-block w-fit">
|
|
16
|
-
View on GitHub
|
|
17
|
-
</a>
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="px-3 py-1.5 bg-slate rounded w-fit flex gap-2 items-center mt-8 md:mt-0">
|
|
21
|
-
<a href="https://repl.rolldown.rs/" target="_blank">
|
|
22
|
-
<figure class="project-icon gap-3">
|
|
23
|
-
<img class="size-5" loading="lazy" src="@assets/icons/rolldown-light.svg" alt="Rolldown">
|
|
24
|
-
<figcaption class="text-sm">Try Rolldown in the REPL</figcaption>
|
|
25
|
-
<svg class="size-3" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
26
|
-
<path d="M3.18228 2.81797L9.54624 2.81797L9.54624 9.18193" stroke="#FF5500" stroke-width="1.35" stroke-linejoin="round"/>
|
|
27
|
-
<path d="M9.5459 2.81799L3.18194 9.18195" stroke="#FF5500" stroke-width="1.35" stroke-linejoin="round"/>
|
|
28
|
-
</svg>
|
|
29
|
-
</figure>
|
|
30
|
-
</a>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
<div class="flex flex-col min-h-[22rem] sm:min-h-[30rem]">
|
|
34
|
-
<div class="relative pl-6 sm:pl-16 h-full flex flex-col justify-center overflow-clip py-8 sm:py-16 hero-background">
|
|
35
|
-
<img src="@assets/rolldown/hero-terminal.svg" alt="Rolldown terminal" class="w-full h-full object-contain">
|
|
36
|
-
</div>
|
|
37
|
-
<a href="https://www.youtube.com/watch?v=RRjfm8cMveQ" target="_blank" class="p-5 flex gap-5 items-center relative group">
|
|
38
|
-
<img src="@assets/rolldown/rolldown-thumbnail.png" alt="Video thumbnail" class="h-16 group-hover:opacity-75 group-hover:scale-105 transition-[scale,opacity]">
|
|
39
|
-
<div>
|
|
40
|
-
<h5 class="text-white">What is Rolldown</h5>
|
|
41
|
-
<p class="text-base">Rolldown explained in 37 seconds</p>
|
|
42
|
-
</div>
|
|
43
|
-
<span class="absolute top-5 right-5 text-fire bg-slate rounded px-3 py-1 text-xs font-mono">0:37</span>
|
|
44
|
-
</a>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</template>
|
|
48
|
-
|
|
49
|
-
<style scoped>
|
|
50
|
-
.hero-background {
|
|
51
|
-
background-image: url('@assets/rolldown/hero-background.jpg');
|
|
52
|
-
background-size: cover;
|
|
53
|
-
background-position: center;
|
|
54
|
-
}
|
|
55
|
-
</style>
|
|
56
|
-
<script setup lang="ts">
|
|
57
|
-
</script>
|