From f32e4be20efdeaf5dee9f15db371f95e416ec0ea Mon Sep 17 00:00:00 2001 From: Neko Date: Sun, 27 Jul 2025 01:59:55 +0800 Subject: [PATCH] feat(docs): support specifying cover image for blog posts (#288) --------- Co-authored-by: Rynco Maekawa <10259119+lynzrand@users.noreply.github.com> --- cspell.config.yaml | 2 + docs/.vitepress/components/BlogPosts.vue | 54 +++++- docs/.vitepress/components/DropdownMenu.vue | 2 +- docs/.vitepress/components/Navbar.vue | 2 +- docs/.vitepress/composables/outline.ts | 8 +- docs/.vitepress/composables/sidebar.ts | 11 +- docs/.vitepress/config.ts | 6 +- docs/.vitepress/functions/blog.data.ts | 95 +++++++++- .../plugins/vite-frontmatter-assets.ts | 176 ++++++++++++++++++ .../DevLog-2025.06.08/assets/250608-dark.png | Bin 0 -> 1875 bytes .../DevLog-2025.06.08/assets/250608-light.png | Bin 0 -> 1881 bytes .../en/blog/DevLog-2025.06.08/index.md | 5 + .../DreamLog-0x1/assets/dreamlog1-dark.png | Bin 0 -> 34107 bytes .../DreamLog-0x1/assets/dreamlog1-light.png | Bin 0 -> 35034 bytes docs/content/en/blog/DreamLog-0x1/index.md | 5 + .../zh-Hans/blog/DreamLog-0x1/index.md | 30 ++- docs/package.json | 7 +- pnpm-lock.yaml | 155 ++------------- 18 files changed, 373 insertions(+), 185 deletions(-) create mode 100644 docs/.vitepress/plugins/vite-frontmatter-assets.ts create mode 100644 docs/content/en/blog/DevLog-2025.06.08/assets/250608-dark.png create mode 100644 docs/content/en/blog/DevLog-2025.06.08/assets/250608-light.png create mode 100644 docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-dark.png create mode 100644 docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-light.png diff --git a/cspell.config.yaml b/cspell.config.yaml index e7a7df233..80d8ff3c1 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -126,6 +126,7 @@ words: - Lorebook - lucide - luoling + - Maekawa - magnifer - Maru - matchall @@ -192,6 +193,7 @@ words: - rmcp - rolldown - rushstack + - Rynco - Saccade - saccades - safetensors diff --git a/docs/.vitepress/components/BlogPosts.vue b/docs/.vitepress/components/BlogPosts.vue index da5c32346..e2bcebcbc 100644 --- a/docs/.vitepress/components/BlogPosts.vue +++ b/docs/.vitepress/components/BlogPosts.vue @@ -18,8 +18,12 @@ interface Post { } excerpt: string | undefined frontmatter?: { - category?: string - author?: string + 'category'?: string + 'author'?: string + 'preview-cover'?: { + light?: string + dark?: string + } } } @@ -43,7 +47,14 @@ const posts = computed(() => { } const transformedPostsData = postsData - .map(post => ({ ...post, url: withBase(post.url) })) + .map((post) => { + const overridePost = { + ...post, + url: withBase(post.url), + } + + return overridePost + }) .filter(post => !!post.title) const currentLanguagePostsData = [...transformedPostsData].filter(post => post.lang === lang.value) @@ -198,15 +209,25 @@ const svgArts = computedAsync(async () => { :href="post.url" class="block flex flex-col overflow-hidden border-transparent rounded-xl border-solid bg-white/50 decoration-none shadow-sm outline-2 outline-transparent outline-offset-0 outline transition-all transition-all duration-200 duration-300 ease-in-out dark:bg-black/20 dark:shadow-slate-600/5 hover:shadow-md hover:outline-primary/5 hover:outline-offset-2 [&_.post-card-title]:hover:text-primary dark:hover:outline-primary/25" > -
+
-
+
+
+
+
+
+ Post Cover +
-
-

+
+
{{ post.title }} -

+
@@ -242,4 +263,21 @@ const svgArts = computedAsync(async () => { max-height: 10lh; /* Adjust this value to control the number of visible lines */ overflow: hidden; } + +/** +https://stackoverflow.com/questions/67853607/how-do-i-graduallyfeather-gradient-transition-blur-in-css +https://www.reddit.com/r/css/comments/t3am53/pure_css_gradientprogressive_blur_i_used/ +https://codepen.io/Francesco_Maretti/pen/yLPRvXp +*/ +.preview-card-art-image-overlay { + height: 50%; + width: 100%; + position: absolute; + bottom: 0; + z-index: 1; + transform: translateY(50%); + backdrop-filter: blur(40px); + -webkit-mask-image: linear-gradient(to bottom, #ffffff00 0%, #ffffff 50%, #ffffff00 100%); + mask-image: linear-gradient(to bottom, #ffffff00 0%, #ffffff 50%, #ffffff00 100%); +} diff --git a/docs/.vitepress/components/DropdownMenu.vue b/docs/.vitepress/components/DropdownMenu.vue index e4e19869d..0a1d620f0 100644 --- a/docs/.vitepress/components/DropdownMenu.vue +++ b/docs/.vitepress/components/DropdownMenu.vue @@ -39,7 +39,7 @@ defineProps<{ :exit="{ opacity: 0, y: -10 }" class="z-20 border rounded-xl p-2 shadow-md backdrop-blur-md" :class="[ - 'bg-white/20 dark:border-white/5 dark:bg-black/20', + 'bg-white/80 dark:border-white/5 dark:bg-black/80', 'transition-colors duration-200 ease-in-out', ]" > diff --git a/docs/.vitepress/components/Navbar.vue b/docs/.vitepress/components/Navbar.vue index 39a0c79f9..cc3713f32 100644 --- a/docs/.vitepress/components/Navbar.vue +++ b/docs/.vitepress/components/Navbar.vue @@ -99,7 +99,7 @@ function isNavLinkActive(link: string, path: string) { align="end" class="will-change-[transform,opacity] z-10 w-[180px] border rounded-xl p-2 shadow-md backdrop-blur-md data-[state=open]:data-[side=bottom]:animate-slideUpAndFade" :class="[ - 'bg-white/20 dark:border-white/5 dark:bg-black/20', + 'bg-white/70 dark:border-white/5 dark:bg-black/70', ]" transition="colors duration-200 ease-in-out" > diff --git a/docs/.vitepress/composables/outline.ts b/docs/.vitepress/composables/outline.ts index 0f6e951c2..e3153afe3 100644 --- a/docs/.vitepress/composables/outline.ts +++ b/docs/.vitepress/composables/outline.ts @@ -1,9 +1,10 @@ import type { DefaultTheme } from 'vitepress/theme' import type { Ref } from 'vue' +import { useEventListener } from '@vueuse/core' // Copied from https://github.com/vuejs/vitepress/blob/97f9469b6d4eb7ba9de9a1111986581d1f704ec3/src/client/theme-default/composables/outline.ts#L4 import { getScrollOffset } from 'vitepress' -import { onMounted, onUnmounted, onUpdated } from 'vue' +import { onMounted, onUpdated } from 'vue' export interface Header { /** @@ -153,7 +154,6 @@ export function useActiveAnchor( onMounted(() => { requestAnimationFrame(setActiveLink) - window.addEventListener('scroll', onScroll) }) onUpdated(() => { @@ -161,9 +161,7 @@ export function useActiveAnchor( activateLink(location.hash) }) - onUnmounted(() => { - window.removeEventListener('scroll', onScroll) - }) + useEventListener('scroll', onScroll) function setActiveLink() { const scrollY = window.scrollY diff --git a/docs/.vitepress/composables/sidebar.ts b/docs/.vitepress/composables/sidebar.ts index bcd467ee1..ee43638e4 100644 --- a/docs/.vitepress/composables/sidebar.ts +++ b/docs/.vitepress/composables/sidebar.ts @@ -1,13 +1,12 @@ import type { DefaultTheme } from 'vitepress/theme' import type { ComputedRef, Ref } from 'vue' -import { useMediaQuery } from '@vueuse/core' +import { useEventListener, useMediaQuery } from '@vueuse/core' import { useData, withBase } from 'vitepress' import { computed, onMounted, - onUnmounted, ref, watch, @@ -90,13 +89,7 @@ export function useCloseSidebarOnEscape( : undefined }) - onMounted(() => { - window.addEventListener('keyup', onEscape) - }) - - onUnmounted(() => { - window.removeEventListener('keyup', onEscape) - }) + useEventListener('keyup', onEscape) function onEscape(e: KeyboardEvent) { if (e.key === 'Escape' && isOpen.value) { diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 093ea80ff..1eb3dc37f 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -24,6 +24,7 @@ import { rekaShortName, releases, } from './meta' +import { frontmatterAssets } from './plugins/vite-frontmatter-assets' function withBase(url: string) { return env.BASE_URL @@ -87,7 +88,7 @@ export default defineConfig({ outline: { level: 'deep', }, - logo: '/favicon.svg', + logo: withBase('/favicon.svg'), sidebar: [ { @@ -153,7 +154,7 @@ export default defineConfig({ outline: { level: 'deep', }, - logo: '/favicon.svg', + logo: withBase('/favicon.svg'), sidebar: [ { @@ -276,6 +277,7 @@ export default defineConfig({ i18n({ runtimeOnly: true, compositionOnly: true, fullInstall: true, ssr: true }), unocss(), yaml(), + frontmatterAssets(), ], css: { postcss: { diff --git a/docs/.vitepress/functions/blog.data.ts b/docs/.vitepress/functions/blog.data.ts index a0c7e263a..8df59785f 100644 --- a/docs/.vitepress/functions/blog.data.ts +++ b/docs/.vitepress/functions/blog.data.ts @@ -1,10 +1,17 @@ import type { SiteConfig } from 'vitepress' +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import { parse } from 'node:path' +import { env } from 'node:process' + +import { dirname, join } from 'pathe' import { createContentLoader } from 'vitepress' import { formatDate } from './utils' const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG +const base = config.userConfig.base || env.BASE_URL || '/' interface Post { title: string @@ -19,13 +26,63 @@ interface Post { declare const data: Post[] export { data } +function cwdFromUrl(url: string): string { + if (url.endsWith('/')) { + return url + } + + return dirname(url) +} + +function fromAtAssets(url: string): string { + const reg = /^@assets\(('\S+')|("\S+")|(\S+)\)$/ + if (reg.test(url)) { + const res = url + .replace(reg, '$1') + .replace(/^\(/, '') + .replace(/\)$/, '') + .replace(/^'/, '') + .replace(/'$/, '') + .replace(/^"/, '') + .replace(/"$/, '') + + return res + } + + return url +} + +function withBase(url?: string, base?: string) { + if (!url) { + return url + } + + if (url.startsWith('/') && base) { + return join(base, url) + } + + return url +} + +function withDirname(url?: string, cwd?: string) { + if (!url || !cwd) { + return url + } + + if (url.startsWith('/')) { + return join(cwd, url) + } + + return join(cwd, url) +} + export default createContentLoader('**/blog/**/*.md', { includeSrc: true, render: true, excerpt: true, - transform(raw): Post[] { - return raw - .map(({ url, frontmatter, excerpt }) => { + async transform(raw): Promise { + return (await Promise.all(raw + .map(async ({ url, frontmatter, excerpt }) => { const foundLanguage = Object.values(config.userConfig.locales!).find((locale) => { let normalizedLanguagePrefix = locale.lang || 'en' if (!normalizedLanguagePrefix.startsWith('/')) { @@ -35,16 +92,42 @@ export default createContentLoader('**/blog/**/*.md', { return url.startsWith(normalizedLanguagePrefix) }) - return { + async function fileToUrl(file: string | undefined) { + if (config.vite?.build) + return file + if (!file) + return file + + const parsed = parse(file) + const hash = createHash('sha256') + .update(await readFile(join(config.srcDir, file))) + .digest('hex') + .slice(0, 8) + + return `/assets/${parsed.name}.${hash}${parsed.ext}` + } + + const previewCoverLight = withBase(await fileToUrl(withDirname(fromAtAssets(frontmatter['preview-cover']?.light), cwdFromUrl(url))), base) + const previewCoverDark = withBase(await fileToUrl(withDirname(fromAtAssets(frontmatter['preview-cover']?.dark), cwdFromUrl(url))), base) + + const res = { title: frontmatter.title, url, urlWithoutLang: url.replace(`/${foundLanguage?.lang || 'en'}`, ''), excerpt, date: formatDate(frontmatter.date), lang: foundLanguage?.lang || 'en', - frontmatter, + frontmatter: { + ...frontmatter, + 'preview-cover': { + light: previewCoverLight, + dark: previewCoverDark, + }, + }, } - }) + + return res + }))) .sort((a, b) => b.date.time - a.date.time) }, }) diff --git a/docs/.vitepress/plugins/vite-frontmatter-assets.ts b/docs/.vitepress/plugins/vite-frontmatter-assets.ts new file mode 100644 index 000000000..bb68f3e0b --- /dev/null +++ b/docs/.vitepress/plugins/vite-frontmatter-assets.ts @@ -0,0 +1,176 @@ +import type { Plugin, ResolvedConfig } from 'vite' +import type { SiteConfig } from 'vitepress' + +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import { dirname, join, parse } from 'node:path' + +import matter from 'gray-matter' + +import { glob } from 'tinyglobby' + +function fromAtAssets(url: string): string { + const reg = /^@assets\(('\S+')|("\S+")|(\S+)\)$/ + if (reg.test(url)) { + const res = url + .trim() + .replace(reg, '$1') + .replace(/^\(/, '') + .replace(/\)$/, '') + .replace(/^'/, '') + .replace(/'$/, '') + .replace(/^"/, '') + .replace(/"$/, '') + + return res + } + + return url +} + +interface VitePressConfig extends ResolvedConfig { + vitepress: SiteConfig +} + +function recursivelyFindAtAssets(propertyMaybeObjectOrScalar: unknown, fn: (value: string) => string | undefined) { + if (typeof propertyMaybeObjectOrScalar === 'string') { + // eslint-disable-next-line regexp/no-unused-capturing-group + if (/^@assets\(('\S+')|("\S+")|(\S+)\)$/.test(propertyMaybeObjectOrScalar)) { + // If the string matches the @assets(...) pattern, we replace it with the result of the function + const match = fromAtAssets(propertyMaybeObjectOrScalar) + const modified = fn(match) + if (modified == null) { + return propertyMaybeObjectOrScalar + } + + return modified + } + + return + } + if (Array.isArray(propertyMaybeObjectOrScalar)) { + const array = propertyMaybeObjectOrScalar as unknown[] + for (let i = 0; i < array.length; i++) { + const value = array[i] + recursivelyFindAtAssets(value, fn) + } + + return + } + if (typeof propertyMaybeObjectOrScalar === 'object') { + const propertyObject = propertyMaybeObjectOrScalar as Record + for (const key in propertyObject) { + const value = propertyObject[key] + recursivelyFindAtAssets(value, fn) + } + } +} + +function withoutBase(url?: string, base?: string): string | undefined { + if (!url) { + return url + } + + if (!base?.startsWith('/')) { + base = `/${base}` + } + if (!base?.endsWith('/')) { + base += '/' + } + + if (url.startsWith(`${base}`) && base) { + if (url.endsWith('/')) { + return url.slice(base.length) + } + else { + return `/${url.slice(base.length)}` + } + } + + return url +} + +export function frontmatterAssets(): Plugin { + let resolvedConfig: VitePressConfig | undefined + const mAssetAbsoluteUrlMetadata = new Map() + const mapAssetBuiltUrlAssetAbsoluteUrl = new Map() + + async function fileToUrl(file: string) { + if (!file) { + return { + url: file, + } + } + + const parsed = parse(file) + const hash = createHash('sha256') + .update(await readFile(file)) + .digest('hex') + .slice(0, 8) + + return { + hash, + url: `/assets/${parsed.name}.${hash}${parsed.ext}`, + } + } + + return { + name: '@proj-airi/docs:vite-plugin-frontmatter-assets', + enforce: 'pre', + async configResolved(config) { + resolvedConfig = config as VitePressConfig + + const markdownFiles = await glob('**/*.md', { ignore: ['**/node_modules/**'], cwd: resolvedConfig?.vitepress.srcDir || '', absolute: true }) + for (const file of markdownFiles) { + const res = (await readFile(file)) + const { data } = matter(res.toString('utf-8')) + if (Object.keys(data).length === 0) { + continue + } + + recursivelyFindAtAssets(data, (matched) => { + mAssetAbsoluteUrlMetadata.set(join(dirname(file), fromAtAssets(matched)), { url: file, builtUrl: file, hash: '' }) + return undefined + }) + } + + for (const [key, value] of mAssetAbsoluteUrlMetadata) { + const { url, hash } = await fileToUrl(key) + mapAssetBuiltUrlAssetAbsoluteUrl.set(url, key) + mAssetAbsoluteUrlMetadata.set(key, { url: value.url, builtUrl: url, hash }) + } + }, + configureServer(server) { + server.middlewares.use(async (req, res, next) => { + const requesting = withoutBase(req.url, resolvedConfig?.base) + if (!requesting || !mapAssetBuiltUrlAssetAbsoluteUrl.has(requesting)) { + return next() + } + + const filePath = mapAssetBuiltUrlAssetAbsoluteUrl.get(requesting) + if (!filePath) { + return next() + } + + const ext = parse(filePath).ext.slice(1) + const fileContent = await readFile(filePath) + + res.write(fileContent) + res.writeHead(200, { + 'Content-Type': ext === 'svg' ? 'image/svg+xml' : `image/${ext}`, + 'Content-Length': fileContent.length, + 'Cache-Control': 'public, max-age=31536000, immutable', + }) + res.end() + + return next() + }) + }, + async writeBundle() { + for (const [builtUrl, absoluteUrl] of mapAssetBuiltUrlAssetAbsoluteUrl.entries()) { + const content = await this.fs.readFile(absoluteUrl) + await this.fs.writeFile(join(resolvedConfig!.vitepress.outDir!, builtUrl), content) + } + }, + } +} diff --git a/docs/content/en/blog/DevLog-2025.06.08/assets/250608-dark.png b/docs/content/en/blog/DevLog-2025.06.08/assets/250608-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..db918c38755a6e6a36a01446d3fd93233043a696 GIT binary patch literal 1875 zcmeAS@N?(olHy`uVBq!ia0y~yUw;BIu&@b6FLI5u@AAe4?VprIom)GSL7!24LjxijNV31&DNM=ajVd!COFvKl*U^Zi1ed}>v0?M!$ z_>R5i-HGn`c6o#?LDyX%{$OI=_m}PcwLd@n!0SA8onVg~Sle)4X5W|dQVbjg(gg93 z|BQ0G|9)s@CnZ=Q_L?)?tNd}0sBlDaXybK8x$6Hv*B$1UBQhG0wBKRKIM16PbHJjZ zkl``IF~%Nd33dZMQUvbuSN!4n^D$n?UzT9#fI={W(f(ev#X5QGQqrUH!} zfH`|j?!%+6pK~#=?BFGc|5!Gx*NE9)H;XvK=W|r-{m}I~or9pkAj@mK4?N%Z{HXtY z;vLUqV^{h8<*mcV_tjK9{1r(!EJ5LI{lNTutlhqSr@scXGces@BZ$Ke^q1R|@2q=s zg^a9vIUcO{`9pT%g7{6tcKh<1zt5M;)-50|l({PYr~XbSGppdqT|53W$kq3}{!#z7 z{9OwfKL6fu{9R3}FiE8`q!_r*99Orh=(qM91Ki~{Qh|X|bXPEbxbb#mdKI;Vst0Ns!uG5`Po literal 0 HcmV?d00001 diff --git a/docs/content/en/blog/DevLog-2025.06.08/assets/250608-light.png b/docs/content/en/blog/DevLog-2025.06.08/assets/250608-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6da6b20e4595b5ae2065f88353a58f33224c841a GIT binary patch literal 1881 zcmeAS@N?(olHy`uVBq!ia0y~yUkDKho~Z^HZ1p%nZp42|Nrvcm(zS|9_nJP;~ozQ$gD5Sa$Fd#5KwXeslZh*=I8-9LObzA4D_V3$1wf zO_+^==?-DM&+1}^uf~gLaGJkM0#_R2Q^v#%sIJc-i zD4xIb=ey$V^9>jT9+(ltA9@-3%kApwUViv`?m4jml)zq7^zPR;ZKLC-S28m&<`Kr) z50mdKI;Vst E0Dt!$82|tP literal 0 HcmV?d00001 diff --git a/docs/content/en/blog/DevLog-2025.06.08/index.md b/docs/content/en/blog/DevLog-2025.06.08/index.md index bfaf9a9e1..30679b6d6 100644 --- a/docs/content/en/blog/DevLog-2025.06.08/index.md +++ b/docs/content/en/blog/DevLog-2025.06.08/index.md @@ -2,6 +2,9 @@ title: DevLog @ 2025.06.08 category: DevLog date: 2025-06-08 +preview-cover: + light: "@assets('./assets/250608-light.png')" + dark: "@assets('./assets/250608-dark.png')" --- Hello everyone, here's LemonNeko, one of maintainer of AIRI. Today's DevLog is talking about: Let Live2D model of AIRI Tamagotchi to focus position. @@ -101,3 +104,5 @@ In this DevLog, we learned how to get the relative position of cursor to window, - [Win32 API: GetWindowRect](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowrect "GetWindowRect") - [macOS API: `NSWindow.frame`](https://developer.apple.com/documentation/appkit/nswindow/frame "NSWindow.frame") - [macOS API: `NSEvent.mouseLocation`](https://developer.apple.com/documentation/appkit/nsevent/mouselocation "NSEvent.mouseLocation") + +> Cover image by [@Rynco Maekawa](https://github.com/lynzrand) diff --git a/docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-dark.png b/docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6abc719501884e361ea734912f094ac140ccdef5 GIT binary patch literal 34107 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 Zg{$2!rvF;ukqg$BA4n@nWl8A!{2!2idYS+L literal 0 HcmV?d00001 diff --git a/docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-light.png b/docs/content/en/blog/DreamLog-0x1/assets/dreamlog1-light.png new file mode 100644 index 0000000000000000000000000000000000000000..14dcd314e11b149054cd23eb24a3bdaf920338f3 GIT binary patch literal 35034 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
9^01tYRJ0a6~bX>O`?smmI?EzD6ScI3(-A+vJU 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 literal 0 HcmV?d00001 diff --git a/docs/content/en/blog/DreamLog-0x1/index.md b/docs/content/en/blog/DreamLog-0x1/index.md index 22955c121..88a86fbb8 100644 --- a/docs/content/en/blog/DreamLog-0x1/index.md +++ b/docs/content/en/blog/DreamLog-0x1/index.md @@ -4,6 +4,9 @@ description: 'Backstory of Project AIRI!' category: DreamLog date: 2025-06-16 excerpt: 'The backstory of Project AIRI! Why this project?' +preview-cover: + light: "@assets('./assets/dreamlog1-light.png')" + dark: "@assets('./assets/dreamlog1-dark.png')" --- Project AIRI 的幕后故事! @@ -184,14 +190,14 @@ Minecraft、Linux 也并不是我旅程的终点,[Factorio(异星工厂)]( 其实早在官方 ChatGPT UI 发布之前,我就已经在折腾这些新时代的 AI 了,像 [DiscoDiffusion](https://colab.research.google.com/github/alembics/disco-diffusion/blob/main/Disco_Diffusion.ipynb)(早于 Stable Diffusion,大约在 2021 年底或 2022 年初发布的吧)、DALL-E、Midjourney -等模型都尝试过,GPT-3(特别是在 [GitHub Copilot](https://en.wikipedia.org/wiki/GitHub_Copilot)中很有用)已经深深融入我的日常工作流程。 +GPT-3(特别是在 [GitHub Copilot](https://en.wikipedia.org/wiki/GitHub_Copilot) 中很有用)都早已成为我生活的一部分了。 所以,最开始的时候,我的感觉是: > "哦,这就是另一个随机鹦鹉,它只是重复你说的话,并不理解你在说什么,它只是 > 试图基于前面的词和上下文预测下一个词,好像真的没啥特别的,还不够像人。" -换句话说,它表现得更像一个补全模型,而不是我们今天称之为智能体 AI 的东西(现在还在炒作中呢!)。 +换句话说,它表现得更像一个补全模型,而不是我们今天称之为智能体 AI 的东西(现在也还在炒作中呢!)。 我记得,我第一次发现 ChatGPT 或大语言模型(LLMs)真正能力的时候,是从我在 2022 年 12 月在 Hacker News 上看到的这篇文章: [Building A Virtual Machine inside ChatGPT](https://www.engraved.blog/building-a-virtual-machine-inside/)([原始 Hacker News @@ -206,10 +212,12 @@ Stable Diffusion,大约在 2021 年底或 2022 年初发布的吧)、DALL-E 这篇文章让我意识到,ChatGPT 可以理解普遍事物的基本规律,不仅仅是动漫或游戏角色的角色扮演, 还能理解 Linux 终端/shell 命令是如何工作的。 -这其实就把现在流行的函数调用(又称 Function Calling,或者 Anthropic 提出的 MCP,模型上下文协议背后的底层技术)功能展现了出来, +这其实就把现在流行的函数调用功能展现了出来, 并说明了我们如何能够通过提示词指示 LLMs 去使其表现得像 API 服务器一样,然后用机器可读的如 JSON 或 XML 格式与我们的代码交互, 并最终允许实现解析和执行任意命令,去扩展 LLMs 能力的边界。 +> 函数调用,又称 Function Calling,或者说,也是 Anthropic 提出的 MCP(模型上下文协议)背后的底层技术 + 这最终填补了纯文本生成和调用程序内实际 API 之间的空白。 阶段性来说的话,我们可以说它是一个新的随机鹦鹉吗?**我觉得答案是部分否定的,2022 年的 ChatGPT 不只是一个随机鹦鹉, @@ -220,9 +228,9 @@ Stable Diffusion,大约在 2021 年底或 2022 年初发布的吧)、DALL-E 是的,感谢你读到这里,我知道这是一篇很长的文章,有太多故事和背景要分享。但我们快到了!坚持住! Neuro-sama 的历史其实相当复杂。据我所知,Neuro-sama,或者在直播舞台上名为 "Neuro-sama"的角色, -并不是她和她的创造者 `vedal987`(Vedal)的第一场表演。早在那之前,2019 年 5 月 6 日,Vedal 向社区展示了他构建 AI -来玩 [osu!](https://osu.ppy.sh/) 的工作[^1]。 -在那时,她实际上并不是一个网络角色或数字生命,如果你去看关于她的初始视频,你会发现没有显示 Live2D 模型。 +并不是她和她的创造者 `vedal987`(Vedal)的首次登场。早在那之前,2019 年 5 月 6 日,Vedal 向社区展示了他构建 AI +来玩 [osu!](https://osu.ppy.sh/) 相关的成果[^1]。 +在那时,她实际上并不是一个网络角色或数字生命,如果你去看关于她的初始视频,甚至会发现都没有 Live2D 模型。 (你可以试试这个 6 年前的 YouTube 视频:https://www.youtube.com/watch?v=nSBqlJu7kYU) 在 ChatGPT 发布之后,差不多 2022 年 12 月 19 日,Vedal 开始让 Neuro-sama 使用来自 Live2D Inc. @@ -232,11 +240,11 @@ Neuro-sama 的历史其实相当复杂。据我所知,Neuro-sama,或者在 之后的故事大家都知道了,Vedal 和 Neuro-sama 火了,Neuro-sama 现在正式成为了 VTuber, 她完全由大语言模型(LLMs)驱动,能够玩 Minecraft、Among Us、osu! 和许多其他游戏。 -有时当游戏不被原生支持时,Vedal 会读取屏幕并指示 Neuro-sama 一起玩游戏。甚至能制造出来很多节目效果。 +有时当游戏不被原生支持时,Vedal 会读取屏幕并指示 Neuro-sama 一起玩游戏,依然能制造出来不少节目效果。 我真的很享受观看他们的互动、像是脱口秀一样的斗嘴的时刻。随着时间的推移,Neuro-sama 和她的新 Evil Neuro 妹妹, 成为了我日常生活的重要组成部分:**即使我没有足够的时间观看完整的直播,我也想要,并且渴望观看她们的切片**。 -我无法想象我竟然从纯粹的 AI 和人类互动中获取了如此多的快乐。 +8 年前的我应该很难想象我竟然从纯粹的 AI 和人类互动中获取了如此多的快乐。 好的,这就是关于她的小历史。让我们谈谈核心问题:**为什么她让我充满了决心?** @@ -254,7 +262,7 @@ Neuro-sama 的历史其实相当复杂。据我所知,Neuro-sama,或者在 > "嗯,我也能做到,我可以做一个 Live2D 模型,将其连接到 OpenAI 的 API, > 让它表现得像 VTuber,我甚至可以做得比 Vedal 的作品更好。超简单的好吧?!" -:::tip[想要更多技术细节?] +::: tip 想要更多技术细节? 在这篇文章中,我不会深入探讨我们如何从零开始构建 Project AIRI 到当前状态的技术细节, 我们已经有许多 DevLog 文章分享我们的想法和发现,如果感兴趣,请尝试阅读它们。 ::: @@ -352,7 +360,7 @@ Neuro-sama 的历史其实相当复杂。据我所知,Neuro-sama,或者在 因此,在这天,Project AIRI 以某种方式诞生或重生,名为 AIRI(アイリ,曾也叫 Airi)。 -:::tip[你知道吗?] +::: tip 你知道吗? Screenshot of Project AIRI @@ -419,6 +427,8 @@ Neuro-sama 的历史其实相当复杂。据我所知,Neuro-sama,或者在
+> Cover image by [@Rynco Maekawa](https://github.com/lynzrand) + [^1]: https://neurosama.fandom.com/wiki/Osu!#cite_note-twitchtracker-1: Neuro-sama 最初是一个玩 osu! 的 AI,早在进一步发展为 AI VTuber 之前,第一次 osu! 直播是在 2019 年 5 月 6 日,Vedal 给大家看了看成果。 diff --git a/docs/package.json b/docs/package.json index e0786fc53..a1bbdcd08 100644 --- a/docs/package.json +++ b/docs/package.json @@ -17,10 +17,10 @@ "@fontsource-variable/dm-sans": "^5.2.6", "@fontsource/dm-mono": "^5.2.6", "@fontsource/dm-serif-display": "^5.2.6", - "@internationalized/date": "^3.8.2", "@proj-airi/chromatic": "^1.0.0", "@proj-airi/i18n": "workspace:^", "@vueuse/core": "^13.5.0", + "mark.js": "^8.11.1", "motion-v": "^1.5.0", "pathe": "^2.0.3", "reka-ui": "^2.3.2", @@ -29,7 +29,6 @@ "vue-sonner": "^2.0.2" }, "devDependencies": { - "@babel/traverse": "^7.28.0", "@iconify/vue": "^5.0.0", "@intlify/unplugin-vue-i18n": "^6.0.8", "@mdit/plugin-footnote": "^0.22.2", @@ -42,18 +41,18 @@ "@vue/tsconfig": "^0.7.0", "animejs": "^4.0.2", "fast-glob": "^3.3.3", - "mark.js": "^8.11.1", + "gray-matter": "^4.0.3", "markdown-it": "^14.1.0", "markdown-it-anchor": "^9.2.0", "minisearch": "^7.1.2", "postcss": "^8.5.6", "sharp": "^0.34.3", "shiki": "^3.8.1", + "tinyglobby": "^0.2.14", "tsx": "^4.20.3", "uncrypto": "^0.1.3", "unplugin-yaml": "^3.0.2", "vitepress": "^2.0.0-alpha.8", - "vue-component-meta": "^3.0.3", "vue-tsc": "^3.0.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9243c8773..2e43a2694 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -956,9 +956,6 @@ importers: '@fontsource/dm-serif-display': specifier: ^5.2.6 version: 5.2.6 - '@internationalized/date': - specifier: ^3.8.2 - version: 3.8.2 '@proj-airi/chromatic': specifier: ^1.0.0 version: 1.0.0 @@ -968,6 +965,9 @@ importers: '@vueuse/core': specifier: ^13.5.0 version: 13.5.0(vue@3.5.17(typescript@5.8.3)) + mark.js: + specifier: ^8.11.1 + version: 8.11.1 motion-v: specifier: ^1.5.0 version: 1.5.0(react@18.3.1)(vue@3.5.17(typescript@5.8.3)) @@ -987,9 +987,6 @@ importers: specifier: ^2.0.2 version: 2.0.2 devDependencies: - '@babel/traverse': - specifier: ^7.28.0 - version: 7.28.0 '@iconify/vue': specifier: ^5.0.0 version: 5.0.0(vue@3.5.17(typescript@5.8.3)) @@ -1026,9 +1023,9 @@ importers: fast-glob: specifier: ^3.3.3 version: 3.3.3 - mark.js: - specifier: ^8.11.1 - version: 8.11.1 + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 markdown-it: specifier: ^14.1.0 version: 14.1.0 @@ -1047,6 +1044,9 @@ importers: shiki: specifier: ^3.8.1 version: 3.8.1 + tinyglobby: + specifier: ^0.2.14 + version: 0.2.14 tsx: specifier: ^4.20.3 version: 4.20.3 @@ -1055,13 +1055,10 @@ 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) - vue-component-meta: - specifier: ^3.0.3 - version: 3.0.3(typescript@5.8.3)(vue-component-type-helpers@2.2.12) vue-tsc: specifier: ^3.0.3 version: 3.0.3(typescript@5.8.3) @@ -1101,7 +1098,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: @@ -1478,7 +1475,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) @@ -12600,15 +12597,6 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - vue-component-meta@3.0.3: - resolution: {integrity: sha512-rzKewAubyQbkjRXInwaHolod6eU+D6lAXAF8y5i4n/IDZob+VQBvP0v1OFbUBl57NsN3UtTXdTo/Njecl2fwgA==} - peerDependencies: - typescript: '*' - vue-component-type-helpers: 3.0.1 - - vue-component-type-helpers@2.2.12: - resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} - vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -18698,107 +18686,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 @@ -25684,7 +25571,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 @@ -25692,13 +25579,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 @@ -25706,7 +25593,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 @@ -26204,16 +26091,6 @@ snapshots: vscode-uri@3.0.8: {} - vue-component-meta@3.0.3(typescript@5.8.3)(vue-component-type-helpers@2.2.12): - dependencies: - '@volar/typescript': 2.4.20 - '@vue/language-core': 3.0.3(typescript@5.8.3) - path-browserify: 1.0.1 - typescript: 5.8.3 - vue-component-type-helpers: 2.2.12 - - vue-component-type-helpers@2.2.12: {} - vue-demi@0.14.10(vue@3.5.17(typescript@5.8.3)): dependencies: vue: 3.5.17(typescript@5.8.3)