feat(docs): implement parallax for cover and home page (#313)

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
This commit is contained in:
Makito
2025-07-24 01:04:23 +08:00
committed by GitHub
co-authored by gemini-code-assist[bot]
parent 6f5124b6d9
commit 935c0c5169
8 changed files with 266 additions and 164 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

+111 -55
View File
@@ -1,13 +1,75 @@
<script setup lang="ts">
import type { AnimatableObject } from 'animejs'
import { useLocalStorage } from '@vueuse/core'
import { createAnimatable } from 'animejs'
import { onMounted, shallowRef, useTemplateRef, watch, watchEffect } from 'vue'
import { useI18n } from 'vue-i18n'
import homeCover from '../assets/home-cover-2025-07-15.avif'
import ParallaxCover from './ParallaxCover.vue'
const heroRef = useTemplateRef<HTMLDivElement>('hero')
const shouldReduceMotion = useLocalStorage('docs:settings/reduce-motion', false)
const { t } = useI18n()
function handleClickTryLive() {
window.location.replace('https://airi.moeru.ai/')
}
const DURATION = 1200
const EASE = 'outSine'
const heroAnimatable = shallowRef<AnimatableObject>()
function animateHero(xOffsetRatio: number, yOffsetRatio: number) {
const referenceSize = window.innerWidth
heroAnimatable.value?.x(-xOffsetRatio * 0.03 * referenceSize)
heroAnimatable.value?.y(-yOffsetRatio * 0.03 * referenceSize)
heroAnimatable.value?.z(0)
}
function onMouseMove(event: MouseEvent) {
const x = event.clientX
const y = event.clientY
const xOffsetRatio = (x - window.innerWidth / 2) / window.innerWidth
const yOffsetRatio = (y - window.innerHeight / 2) / window.innerHeight
animateHero(xOffsetRatio, yOffsetRatio)
}
watch(shouldReduceMotion, (shouldReduceMotion) => {
if (shouldReduceMotion) {
window.removeEventListener('mousemove', onMouseMove)
animateHero(0, 0)
}
else {
window.addEventListener('mousemove', onMouseMove)
}
})
onMounted(() => {
heroAnimatable.value = createAnimatable(heroRef.value!, {
x: DURATION,
y: DURATION,
z: 0,
ease: EASE,
})
})
watchEffect((onCleanup) => {
if (shouldReduceMotion.value) {
animateHero(0, 0)
}
else {
window.addEventListener('mousemove', onMouseMove)
onCleanup(() => {
window.removeEventListener('mousemove', onMouseMove)
})
}
})
</script>
<template>
@@ -15,67 +77,61 @@ function handleClickTryLive() {
<div relative h-full w-full flex flex-1 flex-col>
<section class="mx-auto h-full max-w-[1440px] w-full flex flex-1 flex-col">
<div class="z-10 h-full w-full flex flex-1 flex-col items-center justify-start gap-4 overflow-hidden px-16 pb-16 pt-20 md:pt-36">
<div class="font-sans-rounded relative w-full justify-center text-center font-extrabold" text="4xl md:5xl">
<div>
Project AIRI
<div ref="hero" flex="~ col items-center gap-4 justify-start">
<div class="font-sans-rounded relative w-full justify-center text-center font-extrabold" text="4xl md:5xl">
<div>
Project AIRI
</div>
</div>
<div class="relative max-w-prose text-center text-slate-900 dark:text-white">
{{ t('docs.theme.home.subtitle') }}
</div>
<div class="relative z-10 w-full flex justify-center gap-4">
<a
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-cyan-200',
]"
bg="primary/20 dark:primary/30 dark:hover:primary/40"
transition="colors,transform duration-200 ease-in-out"
cursor-pointer
@click="() => handleClickTryLive()"
>
{{ t('docs.theme.home.try-live.title') }}
</a>
<a
href="https://github.com/moeru-ai/airi/releases/latest"
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-slate-100',
]"
bg="black/4 dark:white/20 dark:hover:white/30"
cursor-pointer
transition="colors,transform duration-200 ease-in-out"
>
{{ t('docs.theme.home.download.title') }}
</a>
<a
href="./docs/overview/"
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-slate-100',
]"
bg="black/4 dark:white/20 dark:hover:white/30"
transition="colors,transform duration-200 ease-in-out"
cursor-pointer
>
{{ t('docs.theme.home.get-started.title') }}
</a>
</div>
</div>
<div class="relative max-w-prose text-center text-slate-900 dark:text-white">
{{ t('docs.theme.home.subtitle') }}
</div>
<div class="relative z-10 w-full flex justify-center gap-4">
<a
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-cyan-200',
]"
bg="primary/20 dark:primary/30 dark:hover:primary/40"
transition="colors,transform duration-200 ease-in-out"
@click="() => handleClickTryLive()"
>
{{ t('docs.theme.home.try-live.title') }}
</a>
<a
href="https://github.com/moeru-ai/airi/releases/latest"
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-slate-100',
]"
bg="black/4 dark:white/20 dark:hover:white/30"
transition="colors,transform duration-200 ease-in-out"
>
{{ t('docs.theme.home.download.title') }}
</a>
<a
href="./docs/overview/"
:class="[
'rounded-xl px-3 py-2 lg:px-5 lg:py-3 font-extrabold outline-none backdrop-blur-md active:scale-95 focus:outline-none text-nowrap text-sm md:text-base',
'text-slate-700 dark:text-slate-100',
]"
bg="black/4 dark:white/20 dark:hover:white/30"
transition="colors,transform duration-200 ease-in-out"
>
{{ t('docs.theme.home.get-started.title') }}
</a>
</div>
</div>
</section>
<div class="absolute inset-0 overflow-hidden -z-10">
<!-- Flickering red (even within the color space range) if to top in oklch (UnoCSS or tailwind css default), have to force to use srgb color space to prevent this -->
<div class="absolute bottom-0 left-0 right-0 top-10 z-2 h-full from-transparent to-white bg-gradient-to-t dark:to-[hsl(207_15%_5%)]" style="--un-gradient-shape: to top in srgb;" />
<img
:src="homeCover"
alt="Project AIRI Cover Image"
:class="[
'absolute left-1/2 -translate-x-1/2 max-w-none object-cover z-1',
'w-[160%] translate-y-[25%] -rotate-20 top-8rem',
'md:w-[120%] md:translate-y-[20%] md:rotate-[-15deg] md:top-8dvh',
'lg:w-[95%] lg:translate-y-[5%] lg:rotate-[-10deg] lg:top-32dvh',
'xl:top-18dvh',
'2xl:top-16dvh',
]"
>
<div class="absolute bottom-0 left-0 right-0 top-0 z-2 h-80% from-transparent to-white bg-gradient-to-t dark:to-[hsl(207_15%_5%)]" style="--un-gradient-shape: to top in srgb;" />
<ParallaxCover />
</div>
<footer class="fixed bottom-3 left-1/2 z-40 flex justify-end -translate-x-1/2">
@@ -0,0 +1,32 @@
<script setup lang="ts">
import { Icon } from '@iconify/vue'
import { useLocalStorage } from '@vueuse/core'
import { SwitchRoot, SwitchThumb } from 'reka-ui'
import { ref, watchPostEffect } from 'vue'
const shouldReduceMotion = useLocalStorage('docs:settings/reduce-motion', false)
const switchTitle = ref('')
watchPostEffect(() => {
switchTitle.value = shouldReduceMotion.value
? 'Enable motion'
: 'Reduce motion'
})
</script>
<template>
<SwitchRoot
id="motion-toggle"
v-model="shouldReduceMotion"
class="bg-muted border-muted-foreground/10 relative h-6 w-11 flex flex-shrink-0 border rounded-full"
:aria-label="switchTitle"
>
<SwitchThumb
class="text-muted-foreground bg-background border-muted my-auto h-5 w-5 flex translate-x-0.5 items-center justify-center border rounded-full text-xs will-change-transform data-[state=checked]:translate-x-5 !transition-transform"
>
<Icon v-if="shouldReduceMotion" icon="lucide:square-dashed-mouse-pointer" />
<Icon v-else icon="lucide:square-mouse-pointer" />
</SwitchThumb>
</SwitchRoot>
</template>
+5 -1
View File
@@ -7,6 +7,7 @@ import { ref, toRefs, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import DropdownMenu from './DropdownMenu.vue'
import MotionToggle from './MotionToggle.vue'
import NavbarLanguage from './NavbarLanguage.vue'
import NavbarLanguageSubMenu from './NavbarLanguageSubMenu.vue'
import ThemeToggle from './ThemeToggle.vue'
@@ -61,7 +62,10 @@ function isNavLinkActive(link: string, path: string) {
<NavbarLanguage />
<ThemeToggle />
<div flex="~ row items-center justify-between gap-3">
<MotionToggle />
<ThemeToggle />
</div>
<Separator
class="bg-muted mx-4 h-4 w-px"
@@ -0,0 +1,107 @@
<script setup lang="ts">
import type { AnimatableObject } from 'animejs'
import { useLocalStorage } from '@vueuse/core'
import { createAnimatable } from 'animejs'
import { onMounted, shallowRef, useTemplateRef, watchEffect } from 'vue'
import homeCover from '../assets/home-cover-2025-07-23.avif'
const surfaceRef = useTemplateRef<HTMLImageElement>('surface')
const silhouettePinkRef = useTemplateRef<HTMLDivElement>('silhouettePink')
const silhouettePurpleRef = useTemplateRef<HTMLDivElement>('silhouettePurple')
const shouldReduceMotion = useLocalStorage('docs:settings/reduce-motion', false)
const DURATION = 1200
const EASE = 'outSine'
const surfaceAnimatable = shallowRef<AnimatableObject>()
const silhouettePinkAnimatable = shallowRef<AnimatableObject>()
const silhouettePurpleAnimatable = shallowRef<AnimatableObject>()
function animateCover(xOffsetRatio: number, yOffsetRatio: number) {
const referenceWidth = window.innerWidth
surfaceAnimatable.value?.x(-xOffsetRatio * 0.02 * referenceWidth)
surfaceAnimatable.value?.y(-yOffsetRatio * 0.02 * referenceWidth)
surfaceAnimatable.value?.z(0)
silhouettePinkAnimatable.value?.x(0.01 * referenceWidth - yOffsetRatio * 0.015 * referenceWidth)
silhouettePinkAnimatable.value?.y(0.02 * referenceWidth + xOffsetRatio * 0.015 * referenceWidth)
silhouettePinkAnimatable.value?.z(0)
silhouettePurpleAnimatable.value?.x(0.01 * referenceWidth + yOffsetRatio * 0.01 * referenceWidth)
silhouettePurpleAnimatable.value?.y(-0.01 * referenceWidth - yOffsetRatio * 0.01 * referenceWidth)
silhouettePurpleAnimatable.value?.z(0)
}
function onMouseMove(event: MouseEvent) {
const x = event.clientX
const y = event.clientY
const xOffsetRatio = (x - window.innerWidth / 2) / window.innerWidth
const yOffsetRatio = (y - window.innerHeight / 2) / window.innerHeight
animateCover(xOffsetRatio, yOffsetRatio)
}
onMounted(() => {
const animatableConfig = {
x: DURATION,
y: DURATION,
z: 0,
ease: EASE,
}
surfaceAnimatable.value = createAnimatable(surfaceRef.value!, animatableConfig)
silhouettePinkAnimatable.value = createAnimatable(silhouettePinkRef.value!, animatableConfig)
silhouettePurpleAnimatable.value = createAnimatable(silhouettePurpleRef.value!, animatableConfig)
})
watchEffect((onCleanup) => {
if (shouldReduceMotion.value) {
animateCover(0, 0)
}
else {
window.addEventListener('mousemove', onMouseMove)
onCleanup(() => {
window.removeEventListener('mousemove', onMouseMove)
})
}
})
const maskImageURL = `url(${homeCover})`
</script>
<template>
<div
:class="[
'relative left-1/2 -translate-x-1/2 max-w-none object-cover z-1',
'w-[160%] translate-y-[25%] -rotate-20 top-8rem',
'md:w-[120%] md:translate-y-[20%] md:rotate-[-15deg] md:top-8dvh',
'lg:w-[95%] lg:translate-y-[5%] lg:rotate-[-10deg] lg:top-32dvh',
'xl:top-18dvh',
'2xl:top-16dvh',
]"
>
<img ref="surface" :src="homeCover" alt="Project AIRI Cover Image">
<div ref="silhouettePink" class="silhouette absolute left-0 top-0 z--1 h-full w-full bg-[oklch(0.8105_0.1267_350.84)]" />
<div ref="silhouettePurple" class="silhouette absolute left-0 top-0 z--2 h-full w-full bg-[oklch(0.5712_0.2396_278.59)]" />
</div>
</template>
<style scoped>
.silhouette {
-webkit-mask-image: v-bind(maskImageURL);
mask-image: v-bind(maskImageURL);
-webkit-mask-mode: alpha;
mask-mode: alpha;
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center; /* Center the mask */
mask-position: center;
}
</style>
+1
View File
@@ -40,6 +40,7 @@
"@types/markdown-it-anchor": "^7.0.0",
"@unocss/reset": "^66.3.3",
"@vue/tsconfig": "^0.7.0",
"animejs": "^4.0.2",
"fast-glob": "^3.3.3",
"mark.js": "^8.11.1",
"markdown-it": "^14.1.0",
+10 -108
View File
@@ -1020,6 +1020,9 @@ importers:
'@vue/tsconfig':
specifier: ^0.7.0
version: 0.7.0(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))
animejs:
specifier: ^4.0.2
version: 4.0.2
fast-glob:
specifier: ^3.3.3
version: 3.3.3
@@ -1052,7 +1055,7 @@ importers:
version: 0.1.3
unplugin-yaml:
specifier: ^3.0.2
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
vitepress:
specifier: ^2.0.0-alpha.8
version: 2.0.0-alpha.8(@algolia/client-search@5.32.0)(@types/node@24.0.15)(change-case@5.4.4)(fuse.js@7.1.0)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(nprogress@0.2.0)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
@@ -1098,7 +1101,7 @@ importers:
devDependencies:
unplugin-yaml:
specifier: ^3.0.2
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
packages/memory-pgvector:
dependencies:
@@ -1475,7 +1478,7 @@ importers:
version: 1.2.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(esbuild@0.25.5)(rollup@4.45.1)(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
unplugin-yaml:
specifier: ^3.0.2
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
vite:
specifier: ^6.3.5
version: 6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
@@ -18695,107 +18698,6 @@ snapshots:
- yaml
optional: true
astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0):
dependencies:
'@astrojs/compiler': 2.12.2
'@astrojs/internal-helpers': 0.6.1
'@astrojs/markdown-remark': 6.3.2
'@astrojs/telemetry': 3.3.0
'@capsizecss/unpack': 2.4.0(encoding@0.1.13)
'@oslojs/encoding': 1.1.0
'@rollup/pluginutils': 5.2.0(rollup@4.45.1)
acorn: 8.15.0
aria-query: 5.3.2
axobject-query: 4.1.0
boxen: 8.0.1
ci-info: 4.2.0
clsx: 2.1.1
common-ancestor-path: 1.0.1
cookie: 1.0.2
cssesc: 3.0.0
debug: 4.4.1
deterministic-object-hash: 2.0.2
devalue: 5.1.1
diff: 5.2.0
dlv: 1.1.3
dset: 3.1.4
es-module-lexer: 1.7.0
esbuild: 0.25.5
estree-walker: 3.0.3
flattie: 1.1.1
fontace: 0.3.0
github-slugger: 2.0.0
html-escaper: 3.0.3
http-cache-semantics: 4.2.0
import-meta-resolve: 4.1.0
js-yaml: 4.1.0
kleur: 4.1.5
magic-string: 0.30.17
magicast: 0.3.5
mrmime: 2.0.1
neotraverse: 0.6.18
p-limit: 6.2.0
p-queue: 8.1.0
package-manager-detector: 1.3.0
picomatch: 4.0.2
prompts: 2.4.2
rehype: 13.0.2
semver: 7.7.2
shiki: 3.8.1
tinyexec: 0.3.2
tinyglobby: 0.2.14
tsconfck: 3.1.6(typescript@5.8.3)
ultrahtml: 1.6.0
unifont: 0.5.2
unist-util-visit: 5.0.0
unstorage: 1.16.0
vfile: 6.0.3
vite: 6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
vitefu: 1.0.7(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
xxhash-wasm: 1.1.0
yargs-parser: 21.1.1
yocto-spinner: 0.2.3
zod: 3.25.76
zod-to-json-schema: 3.24.6(zod@3.25.76)
zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.76)
optionalDependencies:
sharp: 0.33.5
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
- '@azure/data-tables'
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
- '@capacitor/preferences'
- '@deno/kv'
- '@netlify/blobs'
- '@planetscale/database'
- '@types/node'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/kv'
- aws4fetch
- db0
- encoding
- idb-keyval
- ioredis
- jiti
- less
- lightningcss
- rollup
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- typescript
- uploadthing
- yaml
optional: true
async-mutex@0.3.2:
dependencies:
tslib: 2.8.1
@@ -25681,7 +25583,7 @@ snapshots:
rollup: 4.45.1
vite: rolldown-vite@7.0.9(@types/node@24.0.15)(esbuild@0.25.5)(jiti@2.4.2)(less@4.4.0)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
unplugin-yaml@3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
unplugin-yaml@3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.45.1)
unplugin: 2.3.5
@@ -25689,13 +25591,13 @@ snapshots:
optionalDependencies:
'@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.45.1)
'@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.45.1)
astro: 5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
astro: 5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
esbuild: 0.25.5
rolldown: 1.0.0-beta.29
rollup: 4.45.1
vite: 6.3.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
unplugin-yaml@3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
unplugin-yaml@3.0.2(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.45.1))(astro@5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.29)(rollup@4.45.1)(vite@7.0.5(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.45.1)
unplugin: 2.3.5
@@ -25703,7 +25605,7 @@ snapshots:
optionalDependencies:
'@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.45.1)
'@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.45.1)
astro: 5.10.1(@types/node@24.0.15)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
astro: 5.10.1(@types/node@24.0.15)(encoding@0.1.13)(jiti@2.4.2)(less@4.4.0)(lightningcss@1.30.1)(rollup@4.45.1)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
esbuild: 0.25.5
rolldown: 1.0.0-beta.29
rollup: 4.45.1