diff --git a/docs/.vitepress/assets/home-cover-2025-12-24-bg.avif b/docs/.vitepress/assets/home-cover-2025-12-24-bg.avif new file mode 100644 index 000000000..ba0c239e1 Binary files /dev/null and b/docs/.vitepress/assets/home-cover-2025-12-24-bg.avif differ diff --git a/docs/.vitepress/assets/home-cover-2025-12-24.avif b/docs/.vitepress/assets/home-cover-2025-12-24.avif new file mode 100644 index 000000000..16ff575c5 Binary files /dev/null and b/docs/.vitepress/assets/home-cover-2025-12-24.avif differ diff --git a/docs/.vitepress/components/Home.vue b/docs/.vitepress/components/Home.vue index 288a58a48..5894b32a4 100644 --- a/docs/.vitepress/components/Home.vue +++ b/docs/.vitepress/components/Home.vue @@ -6,15 +6,21 @@ import { createAnimatable } from 'animejs' import { onMounted, shallowRef, useTemplateRef, watch, watchEffect } from 'vue' import { useI18n } from 'vue-i18n' +import homeBackgroundChristmas20251224 from '../assets/home-cover-2025-12-24-bg.avif' // NOTICE: for unknown reasons, without `?no-inline`, the inlined SVG use in the SFC template // of `url(...)` doesn't work properly in Vite/Vue, the entire SVG content either got incorrectly // cached or erased in dev/prod, causing the mask pattern to not show up. import homeBackgroundPatternGhost from '../assets/home-patterns-ghost.svg?no-inline' import homeBackgroundPatternLollipop from '../assets/home-patterns-lollipop.svg?no-inline' import ParallaxCover from './ParallaxCover.vue' +import ParallaxCoverChristmas20251224 from './ParallaxCoverChristmas20251224.vue' import ParallaxCoverHalloween20251029 from './ParallaxCoverHalloween20251029.vue' +import Snowfall from './Snowfall.vue' -import { isBetweenHalloweenAndHalfOfNovember } from '../composables/date' +import { + isBetweenChristmasAndHalfOfJanuary, + isBetweenHalloweenAndHalfOfNovember, +} from '../composables/date' const heroRef = useTemplateRef('hero') @@ -106,6 +112,19 @@ watchEffect((onCleanup) => { >
Happy Halloween!
+
+
Merry Christmas!
+
Project AIRI
@@ -165,16 +184,28 @@ watchEffect((onCleanup) => { + - - -
- + +
+ @@ -182,7 +213,7 @@ watchEffect((onCleanup) => {
diff --git a/docs/.vitepress/components/ParallaxCoverChristmas20251224.vue b/docs/.vitepress/components/ParallaxCoverChristmas20251224.vue new file mode 100644 index 000000000..e16a73970 --- /dev/null +++ b/docs/.vitepress/components/ParallaxCoverChristmas20251224.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/docs/.vitepress/components/Snowfall.vue b/docs/.vitepress/components/Snowfall.vue new file mode 100644 index 000000000..53e11cf16 --- /dev/null +++ b/docs/.vitepress/components/Snowfall.vue @@ -0,0 +1,175 @@ + + + + + + + diff --git a/docs/.vitepress/composables/date.ts b/docs/.vitepress/composables/date.ts index 92ba42050..83d0637e7 100644 --- a/docs/.vitepress/composables/date.ts +++ b/docs/.vitepress/composables/date.ts @@ -7,3 +7,11 @@ export function isBetweenHalloweenAndHalfOfNovember(date: Date) { return isAfter(date, halloween) && isBefore(date, halfOfNovember) } + +export function isBetweenChristmasAndHalfOfJanuary(date: Date) { + const year = date.getFullYear() + const christmas = new Date(year, 11, 20) // December 20 + const halfOfJanuary = new Date(year + 1, 0, 10) // January 10 of the next year + + return isAfter(date, christmas) && isBefore(date, halfOfJanuary) +}