@voidzero-dev/vitepress-theme 3.2.0 → 3.3.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 (66) hide show
  1. package/package.json +3 -11
  2. package/src/assets/oxc/footer-background.jpg +0 -0
  3. package/src/assets/oxc/oxc-feature-background.jpg +0 -0
  4. package/src/assets/oxc/oxc-formatter-terminal.png +0 -0
  5. package/src/assets/rolldown/footer-background.jpg +0 -0
  6. package/src/assets/rolldown/hero-background.jpg +0 -0
  7. package/src/assets/rolldown/rolldown-esbuild-parity.png +0 -0
  8. package/src/assets/rolldown/rolldown-rollup-background.jpg +0 -0
  9. package/src/assets/vite/footer-background.jpg +0 -0
  10. package/src/assets/vite/vite-featurepanel-1-background.jpg +0 -0
  11. package/src/assets/vite/vite-featurepanel-4-background.jpg +0 -0
  12. package/src/assets/vite/vite-frameworks-mobile.png +0 -0
  13. package/src/assets/vite/vite-frameworks.png +0 -0
  14. package/src/assets/vite/vite-ssr-support.png +0 -0
  15. package/src/assets/vitest/footer-background.jpg +0 -0
  16. package/src/assets/vitest/hero-background.jpg +0 -0
  17. package/src/assets/vitest/hero-terminal.png +0 -0
  18. package/src/assets/vitest/vitest-jest-compatible.png +0 -0
  19. package/src/assets/vitest/vitest-watcher-background.jpg +0 -0
  20. package/src/components/vitepress-default/Layout.vue +93 -45
  21. package/src/styles/base.css +9 -0
  22. package/src/assets/vitest/hero-terminal.svg +0 -44
  23. package/src/assets/voidzero/animations/1280_x_552_homepage.riv +0 -0
  24. package/src/assets/voidzero/animations/343_x_148_homepage_mobile.riv +0 -0
  25. package/src/assets/voidzero/animations/480_x_480_build_tool_for_web.riv +0 -0
  26. package/src/assets/voidzero/animations/480_x_480_fastest_javascript_bundler.riv +0 -0
  27. package/src/assets/voidzero/animations/480_x_480_language_toolchain.riv +0 -0
  28. package/src/assets/voidzero/animations/480_x_480_next_generation_runner.riv +0 -0
  29. package/src/assets/voidzero/animations/about-mobile.riv +0 -0
  30. package/src/assets/voidzero/animations/about.riv +0 -0
  31. package/src/assets/voidzero/backgrounds/casestudies.jpg +0 -0
  32. package/src/assets/voidzero/backgrounds/oxc.jpg +0 -0
  33. package/src/assets/voidzero/backgrounds/rolldown.jpg +0 -0
  34. package/src/assets/voidzero/backgrounds/vite.jpg +0 -0
  35. package/src/assets/voidzero/backgrounds/vitest.jpg +0 -0
  36. package/src/assets/voidzero/career-illustration.jpg +0 -0
  37. package/src/assets/voidzero/footer-logo.svg +0 -5
  38. package/src/assets/voidzero/footer.jpg +0 -0
  39. package/src/assets/voidzero/investors/accel.svg +0 -9
  40. package/src/assets/voidzero/investors/amplify.svg +0 -3
  41. package/src/assets/voidzero/investors/peakxv.png +0 -0
  42. package/src/assets/voidzero/investors/resend.svg +0 -3
  43. package/src/assets/voidzero/investors/sentry.svg +0 -10
  44. package/src/assets/voidzero/investors/sunflower.png +0 -0
  45. package/src/assets/voidzero/logo-light.svg +0 -3
  46. package/src/assets/voidzero/logo.svg +0 -3
  47. package/src/assets/voidzero/signature.svg +0 -11
  48. package/src/assets/voidzero/terminals/rolldown.svg +0 -7
  49. package/src/assets/voidzero/terminals/vite.svg +0 -9
  50. package/src/assets/voidzero/terminals/vitest.svg +0 -49
  51. package/src/assets/voidzero/vite-plus-chip.png +0 -0
  52. package/src/components/oxc/FeatureFormatter.vue +0 -30
  53. package/src/components/oxc/FeatureLinter.vue +0 -31
  54. package/src/components/oxc/FeatureMinifier.vue +0 -26
  55. package/src/components/oxc/FeatureParser.vue +0 -57
  56. package/src/components/oxc/FeatureResolver.vue +0 -29
  57. package/src/components/oxc/FeatureToolbar.vue +0 -195
  58. package/src/components/oxc/FeatureTransformer.vue +0 -36
  59. package/src/components/oxc/Hero.vue +0 -37
  60. package/src/components/rolldown/FeatureGrid.vue +0 -94
  61. package/src/components/rolldown/Hero.vue +0 -57
  62. package/src/components/vite/Community.vue +0 -192
  63. package/src/components/vite/FeatureGrid1.vue +0 -66
  64. package/src/components/vite/FeatureGrid2.vue +0 -55
  65. package/src/components/vite/Frameworks.vue +0 -14
  66. package/src/components/vite/Hero.vue +0 -48
@@ -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
15
- class="mx-1 outline-none bg-nickel/50 text-aqua">enhanced-resolve</code></li>
16
- <li>28x faster than <code class="mx-1 outline-none bg-nickel/50 text-aqua">enhanced-resolve</code>
17
- <li>Highly customizable</li>
18
- </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>