diff --git a/README.md b/README.md index f74ca5e..6b70bb5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Dada +# 云梦 > An AI-driven visual novel where every frame — scenes, dialogue, choices — is rendered by an AI, one frame at a time. You click. It paints. The story unfolds. @@ -31,7 +31,7 @@ There is no traditional UI. There is only the image. The AI chooses the layout, ## One-click deploy -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/YOUR_USERNAME/dada&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL&envDescription=Three%20independently%20configurable%20providers.%20Any%20OpenAI-compatible%20endpoint%20works.&envLink=https://github.com/YOUR_USERNAME/dada%23environment-variables) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/YOUR_USERNAME/yume&env=TEXT_BASE_URL,TEXT_API_KEY,TEXT_MODEL,IMAGE_BASE_URL,IMAGE_API_KEY,IMAGE_MODEL,VISION_BASE_URL,VISION_API_KEY,VISION_MODEL&envDescription=Three%20independently%20configurable%20providers.%20Any%20OpenAI-compatible%20endpoint%20works.&envLink=https://github.com/YOUR_USERNAME/yume%23environment-variables) After deploy, set the nine environment variables (see below) in your Vercel project. That's it. @@ -68,7 +68,7 @@ pnpm dev ## Project layout ``` -dada/ +yume/ ├── apps/web/ Next.js 16 app — pages + API routes └── packages/ ├── types/ shared TypeScript types diff --git a/apps/web/.env.example b/apps/web/.env.example index fe9c11e..daf42be 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1,5 +1,5 @@ # ============================================================= -# Dada — AI Visual Novel +# 云梦 — AI 视觉小说 # Three independently configurable AI providers # Any OpenAI-compatible endpoint works (OpenRouter, OpenAI, # Anthropic via OpenAI-compat proxy, Gemini, DeepSeek, Ollama). diff --git a/apps/web/app/api/interact/route.ts b/apps/web/app/api/interact/route.ts index 45872cb..f4d3c4d 100644 --- a/apps/web/app/api/interact/route.ts +++ b/apps/web/app/api/interact/route.ts @@ -1,5 +1,5 @@ -import { takeTurn } from "@dada/engine"; -import type { InteractRequest } from "@dada/types"; +import { takeTurn } from "@yume/engine"; +import type { InteractRequest } from "@yume/types"; import { NextResponse } from "next/server"; import { loadEngineConfig } from "@/lib/config"; diff --git a/apps/web/app/api/start/route.ts b/apps/web/app/api/start/route.ts index 1449203..b898f82 100644 --- a/apps/web/app/api/start/route.ts +++ b/apps/web/app/api/start/route.ts @@ -1,5 +1,5 @@ -import { startSession } from "@dada/engine"; -import type { StartRequest } from "@dada/types"; +import { startSession } from "@yume/engine"; +import type { StartRequest } from "@yume/types"; import { NextResponse } from "next/server"; import { loadEngineConfig } from "@/lib/config"; diff --git a/apps/web/app/api/vision/route.ts b/apps/web/app/api/vision/route.ts index 864d751..85b8a5e 100644 --- a/apps/web/app/api/vision/route.ts +++ b/apps/web/app/api/vision/route.ts @@ -1,5 +1,5 @@ -import { visionTurn } from "@dada/engine"; -import type { VisionRequest } from "@dada/types"; +import { visionTurn } from "@yume/engine"; +import type { VisionRequest } from "@yume/types"; import { NextResponse } from "next/server"; import { loadEngineConfig } from "@/lib/config"; diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index 5f17d2a..b15dc09 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -54,7 +54,7 @@ } } -@keyframes dada-ripple { +@keyframes yume-ripple { 0% { width: 14px; height: 14px; diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index c09d866..48a1308 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -2,9 +2,8 @@ import type { Metadata } from "next"; import "./globals.css"; export const metadata: Metadata = { - title: "Dada — AI Visual Novel", - description: - "An open-source visual novel where every frame is generated by AI.", + title: "云梦 — AI 视觉小说", + description: "一部由 AI 实时绘制每一帧的开源视觉小说。", }; export default function RootLayout({ diff --git a/apps/web/app/new/page.tsx b/apps/web/app/new/page.tsx index 0cfda71..24a62bd 100644 --- a/apps/web/app/new/page.tsx +++ b/apps/web/app/new/page.tsx @@ -10,10 +10,10 @@ export default function NewPage() { className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2" > - Dada + 云梦 - Compose · a · world + 编 织 一 个 世 界 @@ -21,23 +21,22 @@ export default function NewPage() {

- Ⅳ · Untitled + Ⅳ · 无 题

- Write + 写下
- two + 两段
- paragraphs. + 文字。

- The first sketches the world your story unfolds in. The second - describes how the world should look — its medium, its mood, its - grain. + 第一段,勾勒故事所在的世界。第二段,描述世界应是什么模样 — + 它的介质、氛围、颗粒感。

- Both fields accept any language. Specificity rewards specificity. + 两栏皆可任意语言。越具体,回报越具体。

diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index ba5d9b5..46fa03e 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -10,11 +10,11 @@ export default function LandingPage() {
- Dada + 云梦 - Frame · by · Frame + 逐 · 帧 · 而 · 成
@@ -35,20 +35,19 @@ export default function LandingPage() {

- An open-source experiment · MMXXVI + 一场 · 开源 · 实验 · MMXXVI

- Every{" "} - frame + 每一帧
- is painted on + 都于
- demand. + 此刻 + 诞生。

- Dada is a visual novel where the entire interface — scene, - dialogue, choices — is rendered by an AI, one frame at a time. You - click. It paints. The story unfolds. + 云梦是一部视觉小说 — 场景、对话、选项,整个界面皆由 AI + 一帧一帧绘成。你点击。它落笔。故事铺展。

@@ -56,13 +55,13 @@ export default function LandingPage() {

- “It is impossible to step into the same river twice. + “人不能两次踏入同一条河流。

- It is impossible to play the same Dada twice.” + 你也不会两次走进同一个云梦。”

- — README · v0.1 + — 自述 · v0.1

@@ -76,10 +75,10 @@ export default function LandingPage() {

- Four Doors + 四 扇 门

- Choose a world · or compose your own + 择 一 世 界 · 或 自 行 编 织

@@ -98,14 +97,14 @@ export default function LandingPage() {

- Untitled + 无 题

- Bring your own world. Describe it in your own words. + 带来你自己的世界。用你自己的话讲述它。

- COMPOSE + 编 织
@@ -119,30 +118,28 @@ export default function LandingPage() { >

- Colophon · I + 题 跋 · I

- A small open-source experiment in generative narrative. Self-host on - Vercel in a single click. + 一场关于生成式叙事的小型开源实验。一键 Vercel 自建。

- Colophon · II + 题 跋 · II

    -
  • Story · large language model
  • -
  • Image · generative renderer
  • -
  • Click · vision interpreter
  • +
  • 文 · 大语言模型
  • +
  • 图 · 生成式渲染
  • +
  • 感知 · 视觉解读

- Colophon · III + 题 跋 · III

- All three are configured separately — bring any OpenAI-compatible - endpoint. + 三者各自独立配置 — 任何 OpenAI 兼容端点皆可。

diff --git a/apps/web/app/play/page.tsx b/apps/web/app/play/page.tsx index 0ce2c20..42a0ae2 100644 --- a/apps/web/app/play/page.tsx +++ b/apps/web/app/play/page.tsx @@ -12,7 +12,7 @@ import type { StartResponse, StoryFrame, VisionResponse, -} from "@dada/types"; +} from "@yume/types"; function PlayInner() { const router = useRouter(); @@ -47,7 +47,7 @@ function PlayInner() { payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide }; } } else if (params.get("custom") === "1") { - const stored = sessionStorage.getItem("dada:custom"); + const stored = sessionStorage.getItem("yume:custom"); if (stored) { try { payload = JSON.parse(stored); @@ -224,7 +224,7 @@ function PlayInner() {

- An · error · occurred + 出 · 了 · 点 · 状 · 况

{error} @@ -234,7 +234,7 @@ function PlayInner() { className="text-[10px] smallcaps text-clay-700 hover:text-ember-500 transition-colors inline-flex items-center gap-3" > - Return + 返 回

@@ -249,10 +249,10 @@ function PlayInner() { className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2" > - Dada + 云梦
- Frame · {String(turnNum).padStart(3, "0")} + 第 · {String(turnNum).padStart(3, "0")} · 帧 · {session?.id.slice(2, 14) ?? "—"} @@ -271,30 +271,30 @@ function PlayInner() {
{phase === "loading-first" && (

- Summoning · the · first · frame + 正 · 在 · 唤 · 起 · 第 · 一 · 帧

)} {phase === "interacting" && (

- AI · is · painting · the · next · moment + AI · 正 · 在 · 描 · 画 · 下 · 一 · 刻

- cached choices resolve in seconds · free-form takes longer + 预取选项秒级响应 · 自由点击稍候

)} {phase === "ready" && intent?.targetLabel && (

- Last · move · + 上 · 一 · 步 · {intent.targetLabel}

)} {phase === "ready" && !intent && turnNum > 0 && (

- Click · anywhere · to · respond + 点 · 击 · 任 · 意 · 处 · 回 · 应

)}
@@ -315,7 +315,7 @@ export default function PlayPage() { fallback={
- Loading + 载入中
} diff --git a/apps/web/components/CustomForm.tsx b/apps/web/components/CustomForm.tsx index 19a38d9..99ccf12 100644 --- a/apps/web/components/CustomForm.tsx +++ b/apps/web/components/CustomForm.tsx @@ -19,7 +19,7 @@ export function CustomForm() { if (!canSubmit) return; setSubmitting(true); sessionStorage.setItem( - "dada:custom", + "yume:custom", JSON.stringify({ worldSetting, styleGuide }), ); router.push("/play?custom=1"); @@ -64,7 +64,7 @@ export function CustomForm() { value={styleGuide} onChange={(e) => setStyleGuide(e.target.value)} rows={4} - placeholder="例:Soft watercolor, warm afternoon light, anime visual novel style, classic dialogue panel⋯" + placeholder="例:水彩柔光,午后暖意,动漫视觉小说画风,传统对话面板⋯" className="w-full bg-transparent border-0 border-b border-clay-900/20 px-0 py-3 text-clay-900 font-serif text-lg leading-[1.7] focus:outline-none focus:border-clay-700 transition-colors resize-none placeholder:font-serif placeholder:italic placeholder:text-base placeholder:leading-[1.7]" />
@@ -72,17 +72,17 @@ export function CustomForm() {
{submitting - ? "Summoning the first frame…" + ? "正在唤起第一帧…" : canSubmit - ? "Ready when you are" - : "Two paragraphs · enough to begin"} + ? "准 · 备 · 就 · 绪" + : "两 · 段 · 即 · 可 · 开 · 场"} diff --git a/apps/web/components/PlayCanvas.tsx b/apps/web/components/PlayCanvas.tsx index e38a7fe..e2814f2 100644 --- a/apps/web/components/PlayCanvas.tsx +++ b/apps/web/components/PlayCanvas.tsx @@ -71,7 +71,7 @@ export function PlayCanvas({ width: 30, height: 30, animation: - "dada-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite", + "yume-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite", }} />

- Painting · the · first · frame + 正 · 在 · 绘 · 制 · 第 · 一 · 帧

)} @@ -113,7 +113,7 @@ export function PlayCanvas({ {dims ? `${dims.w} × ${dims.h} · png` : "—"} - {phase === "ready" ? "Tap · anywhere" : "···"} + {phase === "ready" ? "任 · 意 · 点 · 击" : "···"}
diff --git a/apps/web/lib/config.ts b/apps/web/lib/config.ts index 9c7d604..02e97fe 100644 --- a/apps/web/lib/config.ts +++ b/apps/web/lib/config.ts @@ -1,4 +1,4 @@ -import type { EngineConfig } from "@dada/types"; +import type { EngineConfig } from "@yume/types"; function readVar(name: string): string { const v = process.env[name]; diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index f8baeea..c3ecb8e 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -4,7 +4,7 @@ import type { NextConfig } from "next"; const config: NextConfig = { reactStrictMode: true, typedRoutes: false, - transpilePackages: ["@dada/engine", "@dada/ai-client", "@dada/types"], + transpilePackages: ["@yume/engine", "@yume/ai-client", "@yume/types"], serverExternalPackages: ["sharp"], turbopack: { root: path.join(__dirname, "..", ".."), diff --git a/apps/web/package.json b/apps/web/package.json index 365af37..593a1ff 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,5 +1,5 @@ { - "name": "@dada/web", + "name": "@yume/web", "version": "0.1.0", "private": true, "type": "module", @@ -11,9 +11,9 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@dada/ai-client": "workspace:*", - "@dada/engine": "workspace:*", - "@dada/types": "workspace:*", + "@yume/ai-client": "workspace:*", + "@yume/engine": "workspace:*", + "@yume/types": "workspace:*", "next": "^16.0.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/package.json b/package.json index 574abab..f096956 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,17 @@ { - "name": "dada", + "name": "yume", "version": "0.1.0", "private": true, - "description": "AI-driven visual novel", + "description": "AI 驱动的视觉小说(云梦)", "license": "UNLICENSED", "packageManager": "pnpm@9.12.0", "engines": { "node": ">=20" }, "scripts": { - "dev": "pnpm --filter @dada/web dev", - "build": "pnpm --filter @dada/web build", - "start": "pnpm --filter @dada/web start", + "dev": "pnpm --filter @yume/web dev", + "build": "pnpm --filter @yume/web build", + "start": "pnpm --filter @yume/web start", "lint": "pnpm -r lint", "typecheck": "pnpm -r typecheck" }, diff --git a/packages/ai-client/package.json b/packages/ai-client/package.json index 3acc606..7280d8e 100644 --- a/packages/ai-client/package.json +++ b/packages/ai-client/package.json @@ -1,5 +1,5 @@ { - "name": "@dada/ai-client", + "name": "@yume/ai-client", "version": "0.1.0", "private": true, "type": "module", @@ -12,6 +12,6 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@dada/types": "workspace:*" + "@yume/types": "workspace:*" } } diff --git a/packages/ai-client/src/chat.ts b/packages/ai-client/src/chat.ts index 6e05afd..f039fdd 100644 --- a/packages/ai-client/src/chat.ts +++ b/packages/ai-client/src/chat.ts @@ -1,4 +1,4 @@ -import type { ProviderConfig } from "@dada/types"; +import type { ProviderConfig } from "@yume/types"; import { fetchWithRetry } from "./fetchWithRetry"; export type ChatMessage = { diff --git a/packages/ai-client/src/image.ts b/packages/ai-client/src/image.ts index c87d12b..4287b54 100644 --- a/packages/ai-client/src/image.ts +++ b/packages/ai-client/src/image.ts @@ -1,4 +1,4 @@ -import type { ProviderConfig } from "@dada/types"; +import type { ProviderConfig } from "@yume/types"; import { fetchWithRetry } from "./fetchWithRetry"; type ImageUrlPart = { type: string; image_url?: { url?: string } }; diff --git a/packages/ai-client/src/vision.ts b/packages/ai-client/src/vision.ts index e652190..b48beaa 100644 --- a/packages/ai-client/src/vision.ts +++ b/packages/ai-client/src/vision.ts @@ -1,4 +1,4 @@ -import type { ProviderConfig } from "@dada/types"; +import type { ProviderConfig } from "@yume/types"; import { fetchWithRetry } from "./fetchWithRetry"; export async function interpretClick( diff --git a/packages/engine/package.json b/packages/engine/package.json index 6b80c32..b0ddaf7 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -1,5 +1,5 @@ { - "name": "@dada/engine", + "name": "@yume/engine", "version": "0.1.0", "private": true, "type": "module", @@ -12,8 +12,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@dada/ai-client": "workspace:*", - "@dada/types": "workspace:*", + "@yume/ai-client": "workspace:*", + "@yume/types": "workspace:*", "sharp": "^0.33.5" } } diff --git a/packages/engine/src/director.ts b/packages/engine/src/director.ts index 07f35fb..c478cc9 100644 --- a/packages/engine/src/director.ts +++ b/packages/engine/src/director.ts @@ -1,5 +1,5 @@ -import { chat } from "@dada/ai-client"; -import type { ProviderConfig, Session, StoryFrame, UIElement } from "@dada/types"; +import { chat } from "@yume/ai-client"; +import type { ProviderConfig, Session, StoryFrame, UIElement } from "@yume/types"; import { parseJsonLoose } from "./jsonParser"; import { DIRECTOR_SYSTEM, buildDirectorUserMessage } from "./prompts"; diff --git a/packages/engine/src/orchestrator.ts b/packages/engine/src/orchestrator.ts index 6fee9ba..f0b47ec 100644 --- a/packages/engine/src/orchestrator.ts +++ b/packages/engine/src/orchestrator.ts @@ -8,7 +8,7 @@ import type { StartResponse, VisionRequest, VisionResponse, -} from "@dada/types"; +} from "@yume/types"; import { annotateClick } from "./annotate"; import { direct } from "./director"; import { render } from "./renderer"; diff --git a/packages/engine/src/prompts.ts b/packages/engine/src/prompts.ts index eae5177..54ba4e0 100644 --- a/packages/engine/src/prompts.ts +++ b/packages/engine/src/prompts.ts @@ -1,4 +1,4 @@ -import type { Session, StoryFrame, UIElement } from "@dada/types"; +import type { Session, StoryFrame, UIElement } from "@yume/types"; export const DIRECTOR_SYSTEM = `你是一个交互视觉小说的编剧导演。每次根据世界观、画风和历史,输出当前画面要呈现的内容。 diff --git a/packages/engine/src/renderer.ts b/packages/engine/src/renderer.ts index 0f5a9a9..c395266 100644 --- a/packages/engine/src/renderer.ts +++ b/packages/engine/src/renderer.ts @@ -1,5 +1,5 @@ -import { generateImage } from "@dada/ai-client"; -import type { ProviderConfig, StoryFrame } from "@dada/types"; +import { generateImage } from "@yume/ai-client"; +import type { ProviderConfig, StoryFrame } from "@yume/types"; import { buildImagePrompt } from "./prompts"; export async function render( diff --git a/packages/engine/src/vision.ts b/packages/engine/src/vision.ts index c0a26bc..c56c365 100644 --- a/packages/engine/src/vision.ts +++ b/packages/engine/src/vision.ts @@ -1,5 +1,5 @@ -import { interpretClick } from "@dada/ai-client"; -import type { ClickIntent, ProviderConfig, UIElement } from "@dada/types"; +import { interpretClick } from "@yume/ai-client"; +import type { ClickIntent, ProviderConfig, UIElement } from "@yume/types"; import { parseJsonLoose } from "./jsonParser"; import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts"; diff --git a/packages/types/package.json b/packages/types/package.json index 8d12fd7..908b13a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,5 +1,5 @@ { - "name": "@dada/types", + "name": "@yume/types", "version": "0.1.0", "private": true, "type": "module", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40222b3..4691d9e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,13 +14,13 @@ importers: apps/web: dependencies: - '@dada/ai-client': + '@yume/ai-client': specifier: workspace:* version: link:../../packages/ai-client - '@dada/engine': + '@yume/engine': specifier: workspace:* version: link:../../packages/engine - '@dada/types': + '@yume/types': specifier: workspace:* version: link:../../packages/types next: @@ -38,19 +38,19 @@ importers: devDependencies: '@types/node': specifier: ^22.9.0 - version: 22.19.18 + version: 22.19.19 '@types/react': specifier: ^19.0.0 - version: 19.2.14 + version: 19.2.15 '@types/react-dom': specifier: ^19.0.0 - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.15) autoprefixer: specifier: ^10.4.20 - version: 10.5.0(postcss@8.5.14) + version: 10.5.0(postcss@8.5.15) postcss: specifier: ^8.4.49 - version: 8.5.14 + version: 8.5.15 tailwindcss: specifier: ^3.4.15 version: 3.4.19 @@ -60,16 +60,16 @@ importers: packages/ai-client: dependencies: - '@dada/types': + '@yume/types': specifier: workspace:* version: link:../types packages/engine: dependencies: - '@dada/ai-client': + '@yume/ai-client': specifier: workspace:* version: link:../ai-client - '@dada/types': + '@yume/types': specifier: workspace:* version: link:../types sharp: @@ -139,183 +139,155 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -390,28 +362,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@16.2.6': resolution: {integrity: sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@16.2.6': resolution: {integrity: sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@16.2.6': resolution: {integrity: sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@16.2.6': resolution: {integrity: sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==} @@ -440,16 +408,16 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@types/node@22.19.18': - resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.15': + resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -468,8 +436,8 @@ packages: peerDependencies: postcss: ^8.1.0 - baseline-browser-mapping@2.10.28: - resolution: {integrity: sha512-Ic44hnOtFIgravCunj1ifSoQPSUrkNiJuH9Mf6jr2jjoA74icqV8wU0KuadXeOR8zuIJMOoTv0GuQjZ9ZYNMeA==} + baseline-browser-mapping@2.10.32: + resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==} engines: {node: '>=6.0.0'} hasBin: true @@ -490,8 +458,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001792: - resolution: {integrity: sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==} + caniuse-lite@1.0.30001793: + resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -536,8 +504,8 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - electron-to-chromium@1.5.353: - resolution: {integrity: sha512-kOrWphBi8TOZyiJZqsgqIle0lw+tzmnQK83pV9dZUd01Nm2POECSyFQMAuarzZdYqQW7FH9RaYOuaRo3h+bQ3w==} + electron-to-chromium@1.5.361: + resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} @@ -661,8 +629,9 @@ packages: sass: optional: true - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.46: + resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -745,8 +714,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.14: - resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} queue-microtask@1.2.3: @@ -783,8 +752,8 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - semver@7.8.0: - resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} engines: {node: '>=10'} hasBin: true @@ -1105,15 +1074,15 @@ snapshots: dependencies: tslib: 2.8.1 - '@types/node@22.19.18': + '@types/node@22.19.19': dependencies: undici-types: 6.21.0 - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.3(@types/react@19.2.15)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.15 - '@types/react@19.2.14': + '@types/react@19.2.15': dependencies: csstype: 3.2.3 @@ -1126,16 +1095,16 @@ snapshots: arg@5.0.2: {} - autoprefixer@10.5.0(postcss@8.5.14): + autoprefixer@10.5.0(postcss@8.5.15): dependencies: browserslist: 4.28.2 - caniuse-lite: 1.0.30001792 + caniuse-lite: 1.0.30001793 fraction.js: 5.3.4 picocolors: 1.1.1 - postcss: 8.5.14 + postcss: 8.5.15 postcss-value-parser: 4.2.0 - baseline-browser-mapping@2.10.28: {} + baseline-browser-mapping@2.10.32: {} binary-extensions@2.3.0: {} @@ -1145,15 +1114,15 @@ snapshots: browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.28 - caniuse-lite: 1.0.30001792 - electron-to-chromium: 1.5.353 - node-releases: 2.0.38 + baseline-browser-mapping: 2.10.32 + caniuse-lite: 1.0.30001793 + electron-to-chromium: 1.5.361 + node-releases: 2.0.46 update-browserslist-db: 1.2.3(browserslist@4.28.2) camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001792: {} + caniuse-lite@1.0.30001793: {} chokidar@3.6.0: dependencies: @@ -1197,7 +1166,7 @@ snapshots: dlv@1.1.3: {} - electron-to-chromium@1.5.353: {} + electron-to-chromium@1.5.361: {} es-errors@1.3.0: {} @@ -1285,8 +1254,8 @@ snapshots: dependencies: '@next/env': 16.2.6 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.28 - caniuse-lite: 1.0.30001792 + baseline-browser-mapping: 2.10.32 + caniuse-lite: 1.0.30001793 postcss: 8.4.31 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -1305,7 +1274,7 @@ snapshots: - '@babel/core' - babel-plugin-macros - node-releases@2.0.38: {} + node-releases@2.0.46: {} normalize-path@3.0.0: {} @@ -1325,28 +1294,28 @@ snapshots: pirates@4.0.7: {} - postcss-import@15.1.0(postcss@8.5.14): + postcss-import@15.1.0(postcss@8.5.15): dependencies: - postcss: 8.5.14 + postcss: 8.5.15 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.12 - postcss-js@4.1.0(postcss@8.5.14): + postcss-js@4.1.0(postcss@8.5.15): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.14 + postcss: 8.5.15 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.14): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.15): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 - postcss: 8.5.14 + postcss: 8.5.15 - postcss-nested@6.2.0(postcss@8.5.14): + postcss-nested@6.2.0(postcss@8.5.15): dependencies: - postcss: 8.5.14 + postcss: 8.5.15 postcss-selector-parser: 6.1.2 postcss-selector-parser@6.1.2: @@ -1362,7 +1331,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.14: + postcss@8.5.15: dependencies: nanoid: 3.3.12 picocolors: 1.1.1 @@ -1400,13 +1369,13 @@ snapshots: scheduler@0.27.0: {} - semver@7.8.0: {} + semver@7.8.1: {} sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.1.2 - semver: 7.8.0 + semver: 7.8.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 '@img/sharp-darwin-x64': 0.33.5 @@ -1432,7 +1401,7 @@ snapshots: dependencies: '@img/colour': 1.1.0 detect-libc: 2.1.2 - semver: 7.8.0 + semver: 7.8.1 optionalDependencies: '@img/sharp-darwin-arm64': 0.34.5 '@img/sharp-darwin-x64': 0.34.5 @@ -1499,11 +1468,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.14 - postcss-import: 15.1.0(postcss@8.5.14) - postcss-js: 4.1.0(postcss@8.5.14) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.14) - postcss-nested: 6.2.0(postcss@8.5.14) + postcss: 8.5.15 + postcss-import: 15.1.0(postcss@8.5.15) + postcss-js: 4.1.0(postcss@8.5.15) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.15) + postcss-nested: 6.2.0(postcss@8.5.15) postcss-selector-parser: 6.1.2 resolve: 1.22.12 sucrase: 3.35.1