chore: complete @yume → @infiplot rename (post-PR#9)

PR #9 已完成首页和 layout 的视觉品牌迁移,此 commit 补齐剩余的
技术性改名 —— workspace 包名、source import、localStorage 键、
CSS keyframe、内部 header logo、.env.example、README。

- @yume/* → @infiplot/* (6 package.json + 17 imports + lockfile)
- localStorage/sessionStorage: yume:* → infiplot:*
  (含 PR #9 新增的 yume:hintClosed)
- CSS keyframe yume-ripple → infiplot-ripple
- new/play 页面 header logo "云梦" → "InfiPlot"
- 代码注释中的「云梦」style 形容词删除(layout.tsx, page.tsx)
- 根 package.json name + description(描述跟齐 staging
  "AI 实时交互剧情游戏")
- README: tagline / Vercel deploy URL / 目录树 / engine 描述

保留:prompts.ts 的 LLM 体裁术语「视觉小说/galgame」、CustomForm
placeholder 的「视觉小说画风」(图像模型识别的风格名词)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
yuanzonghao
2026-06-02 09:27:00 +08:00
parent 5d0a5bb756
commit 8eda27f241
37 changed files with 103 additions and 103 deletions
+5 -5
View File
@@ -1,6 +1,6 @@
# 云梦
# InfiPlot
> An AI-driven visual novel painted by an AI, one scene at a time. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
> A real-time AI-generated interactive story game — painted scene by scene. You talk and explore within a scene; when the story turns a corner, it paints the next. You click. It paints. The story unfolds.
---
@@ -37,7 +37,7 @@ There is no traditional game UI baked into the art. The AI paints the world in w
## One-click deploy
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/yume&root-directory=apps/web&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,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/yume%23environment-variables)
[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/zonghaoyuan/infiplot&root-directory=apps/web&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,TTS_BASE_URL,TTS_API_KEY,TTS_SPEECH_MODEL,MOCK_IMAGE&envDescription=Three%20required%20providers%20%2B%20optional%20TTS.%20Any%20OpenAI-compatible%20endpoint%20works%20for%20text%2Fvision%2Ftts.&envLink=https://github.com/zonghaoyuan/infiplot%23environment-variables)
After deploy, set the environment variables (see below) in your Vercel project. Nine are required; TTS is optional (leave blank to run silently); `MOCK_IMAGE=true` skips image generation for cheap TTS-only testing. The Vercel project's **Root Directory** must be set to `apps/web` (the deploy button passes this; if you configure manually, set it in Project Settings).
@@ -81,7 +81,7 @@ pnpm dev
## Project layout
```
yume/
infiplot/
├── apps/web/ Next.js 16 app — pages + API routes (Vercel root)
└── packages/
├── types/ shared TypeScript types
@@ -90,7 +90,7 @@ yume/
└── engine/ multi-agent AI orchestration (open core)
```
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own visual-novel front-end (Tauri, Electron, CLI, anywhere).
`packages/engine` is the open core — pure TS, no Next.js or browser dependency. Import it directly to build your own interactive-narrative front-end (Tauri, Electron, CLI, anywhere).
---
+1 -1
View File
@@ -1,5 +1,5 @@
# =============================================================
# 云梦 — AI 视觉小说
# InfiPlot — AI 实时交互剧情游戏
# Recommended setup: Xiaomi MiMo Token Plan for TEXT / VISION / TTS
# (one API key covers all three) + Runware for IMAGE (FLUX.2 [klein]).
#
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestBeatAudio } from "@yume/engine";
import type { BeatAudioRequest } from "@yume/types";
import { requestBeatAudio } from "@infiplot/engine";
import type { BeatAudioRequest } from "@infiplot/types";
import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestInsertBeat } from "@yume/engine";
import type { InsertBeatRequest } from "@yume/types";
import { requestInsertBeat } from "@infiplot/engine";
import type { InsertBeatRequest } from "@infiplot/types";
import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { requestScene } from "@yume/engine";
import type { SceneRequest } from "@yume/types";
import { requestScene } from "@infiplot/engine";
import type { SceneRequest } from "@infiplot/types";
import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { startSession } from "@yume/engine";
import type { StartRequest } from "@yume/types";
import { startSession } from "@infiplot/engine";
import type { StartRequest } from "@infiplot/types";
import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config";
+2 -2
View File
@@ -1,5 +1,5 @@
import { visionDecide } from "@yume/engine";
import type { VisionRequest } from "@yume/types";
import { visionDecide } from "@infiplot/engine";
import type { VisionRequest } from "@infiplot/types";
import { NextResponse } from "next/server";
import { loadEngineConfig } from "@/lib/config";
+1 -1
View File
@@ -54,7 +54,7 @@
}
}
@keyframes yume-ripple {
@keyframes infiplot-ripple {
0% {
width: 14px;
height: 14px;
+1 -1
View File
@@ -2,7 +2,7 @@ import type { Metadata } from "next";
import { Cormorant_Garamond, Inter } from "next/font/google";
import "./globals.css";
// Editorial 云梦 fonts: drive tailwind `font-serif`/`font-sans` via
// Editorial fonts: drive tailwind `font-serif`/`font-sans` via
// --font-serif / --font-sans across every page (home, /play, /new, CustomForm).
const cormorant = Cormorant_Garamond({
subsets: ["latin"],
+1 -1
View File
@@ -10,7 +10,7 @@ export default function NewPage() {
className="text-[10px] smallcaps text-clay-700 hover:text-clay-900 transition-colors flex items-center gap-2"
>
<i className="fa-solid fa-arrow-left text-[9px]" />
InfiPlot
</Link>
<span className="text-[10px] smallcaps text-clay-500">
+6 -6
View File
@@ -4,7 +4,7 @@ import { useRouter } from "next/navigation";
import { useEffect, useRef, useState } from "react";
/* ============================================================================
InfiPlot · 首页(云梦编辑式视觉风格 · 居中构图,呼应低保真原型)
InfiPlot · 首页(编辑式视觉风格 · 居中构图,呼应低保真原型)
- 顶部 Header:左上角衬线 wordmark logo
- Hero 控制区(居中):标题 / prompt 输入框 + 开始 / 5 个类别选择器
- 统一瀑布流(居中定宽):7 张主推 + 16 张画廊,按性向整体 crossfade 切换
@@ -399,7 +399,7 @@ export default function HomePage() {
const [prompt, setPrompt] = useState("");
const inputRef = useRef<HTMLTextAreaElement>(null);
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:yume:hintClosed)。
// 顶部使用提示:默认展示,用户可点 × 永久关闭(localStorage:infiplot:hintClosed)。
const [hintClosed, setHintClosed] = useState(false);
const styleRow = OPTS.findIndex((o) => o.modal);
@@ -432,7 +432,7 @@ export default function HomePage() {
useEffect(() => {
try {
if (localStorage.getItem("yume:hintClosed") === "1") setHintClosed(true);
if (localStorage.getItem("infiplot:hintClosed") === "1") setHintClosed(true);
} catch {
/* ignore */
}
@@ -449,7 +449,7 @@ export default function HomePage() {
const closeHint = () => {
setHintClosed(true);
try {
localStorage.setItem("yume:hintClosed", "1");
localStorage.setItem("infiplot:hintClosed", "1");
} catch {
/* ignore */
}
@@ -496,7 +496,7 @@ export default function HomePage() {
const audioEnabled = voice === "开启";
sessionStorage.setItem(
"yume:custom",
"infiplot:custom",
JSON.stringify({ worldSetting, styleGuide, audioEnabled }),
);
router.push("/play?custom=1");
@@ -610,7 +610,7 @@ export default function HomePage() {
))}
</div>
{/* 使用提示:可被用户永久关闭(localStorage:yume:hintClosed */}
{/* 使用提示:可被用户永久关闭(localStorage:infiplot:hintClosed */}
{!hintClosed && (
<div className="relative mx-auto mt-10 md:mt-12 max-w-[640px] rounded-sm border border-clay-900/10 bg-cream-100/50 px-8 py-3.5">
<p className="font-serif text-[13px] md:text-sm leading-relaxed text-clay-500">
+4 -4
View File
@@ -24,9 +24,9 @@ import type {
Session,
StartResponse,
VisionResponse,
} from "@yume/types";
} from "@infiplot/types";
const MUTED_STORAGE_KEY = "yume:muted";
const MUTED_STORAGE_KEY = "infiplot:muted";
// Cap how long we wait for the browser to download + decode a scene image
// before giving up and rendering anyway. Runware's CDN is normally <2s for a
@@ -485,7 +485,7 @@ function PlayInner() {
const p = PRESETS.find((x) => x.id === presetId);
if (p) payload = { worldSetting: p.worldSetting, styleGuide: p.styleGuide };
} else if (params.get("custom") === "1") {
const stored = sessionStorage.getItem("yume:custom");
const stored = sessionStorage.getItem("infiplot:custom");
if (stored) {
try {
const parsed = JSON.parse(stored) as {
@@ -890,7 +890,7 @@ function PlayInner() {
className="text-[10px] smallcaps text-clay-600 hover:text-clay-900 transition-colors flex items-center gap-2"
>
<i className="fa-solid fa-arrow-left text-[9px]" />
InfiPlot
</Link>
<div className="flex items-center gap-3 text-[10px] smallcaps text-clay-500 num">
<span> · {String(sceneCount).padStart(3, "0")} · </span>
+1 -1
View File
@@ -19,7 +19,7 @@ export function CustomForm() {
if (!canSubmit) return;
setSubmitting(true);
sessionStorage.setItem(
"yume:custom",
"infiplot:custom",
JSON.stringify({ worldSetting, styleGuide }),
);
router.push("/play?custom=1");
+2 -2
View File
@@ -1,7 +1,7 @@
"use client";
import { useCallback, useEffect, useRef, useState } from "react";
import type { Beat, BeatChoice } from "@yume/types";
import type { Beat, BeatChoice } from "@infiplot/types";
export type Phase =
| "loading-first" // first scene not yet rendered
@@ -439,7 +439,7 @@ export function PlayCanvas({
width: 30,
height: 30,
animation:
"yume-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
"infiplot-ripple 1.6s cubic-bezier(0.16,1,0.3,1) infinite",
}}
/>
<div
+1 -1
View File
@@ -1,4 +1,4 @@
import type { EngineConfig, TtsConfig } from "@yume/types";
import type { EngineConfig, TtsConfig } from "@infiplot/types";
function readVar(name: string): string {
const v = process.env[name];
+4 -4
View File
@@ -5,10 +5,10 @@ const config: NextConfig = {
reactStrictMode: true,
typedRoutes: false,
transpilePackages: [
"@yume/engine",
"@yume/ai-client",
"@yume/types",
"@yume/tts-client",
"@infiplot/engine",
"@infiplot/ai-client",
"@infiplot/types",
"@infiplot/tts-client",
],
serverExternalPackages: ["sharp"],
turbopack: {
+4 -4
View File
@@ -1,5 +1,5 @@
{
"name": "@yume/web",
"name": "@infiplot/web",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -11,9 +11,9 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@yume/ai-client": "workspace:*",
"@yume/engine": "workspace:*",
"@yume/types": "workspace:*",
"@infiplot/ai-client": "workspace:*",
"@infiplot/engine": "workspace:*",
"@infiplot/types": "workspace:*",
"next": "^16.0.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
+5 -5
View File
@@ -1,17 +1,17 @@
{
"name": "yume",
"name": "infiplot",
"version": "0.1.0",
"private": true,
"description": "AI 驱动的视觉小说(云梦)",
"description": "AI 实时交互剧情游戏",
"license": "UNLICENSED",
"packageManager": "pnpm@9.12.0",
"engines": {
"node": ">=20"
},
"scripts": {
"dev": "pnpm --filter @yume/web dev",
"build": "pnpm --filter @yume/web build",
"start": "pnpm --filter @yume/web start",
"dev": "pnpm --filter @infiplot/web dev",
"build": "pnpm --filter @infiplot/web build",
"start": "pnpm --filter @infiplot/web start",
"lint": "pnpm -r lint",
"typecheck": "pnpm -r typecheck"
},
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "@yume/ai-client",
"name": "@infiplot/ai-client",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -12,6 +12,6 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@yume/types": "workspace:*"
"@infiplot/types": "workspace:*"
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types";
import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry";
export type ChatMessage = {
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types";
import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry";
// Runware uses its own task-array protocol (not OpenAI-compatible).
+1 -1
View File
@@ -1,4 +1,4 @@
import type { ProviderConfig } from "@yume/types";
import type { ProviderConfig } from "@infiplot/types";
import { fetchWithRetry } from "./fetchWithRetry";
export async function interpretClick(
+4 -4
View File
@@ -1,5 +1,5 @@
{
"name": "@yume/engine",
"name": "@infiplot/engine",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -12,9 +12,9 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@yume/ai-client": "workspace:*",
"@yume/tts-client": "workspace:*",
"@yume/types": "workspace:*",
"@infiplot/ai-client": "workspace:*",
"@infiplot/tts-client": "workspace:*",
"@infiplot/types": "workspace:*",
"jsonrepair": "^3.14.0",
"sharp": "^0.33.5"
}
@@ -1,11 +1,11 @@
import { chat, generateImage } from "@yume/ai-client";
import { provisionVoice } from "@yume/tts-client";
import { chat, generateImage } from "@infiplot/ai-client";
import { provisionVoice } from "@infiplot/tts-client";
import type {
Character,
CharacterVoice,
EngineConfig,
Session,
} from "@yume/types";
} from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser";
import { mockImageDataUri } from "../mockImage";
import {
@@ -1,5 +1,5 @@
import { chat } from "@yume/ai-client";
import type { BeatActiveCharacter, ProviderConfig } from "@yume/types";
import { chat } from "@infiplot/ai-client";
import type { BeatActiveCharacter, ProviderConfig } from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser";
import {
CINEMATOGRAPHER_SYSTEM,
+3 -3
View File
@@ -1,11 +1,11 @@
import { generateImage } from "@yume/ai-client";
import type { GenerateImageOptions, GenerateImageResult } from "@yume/ai-client";
import { generateImage } from "@infiplot/ai-client";
import type { GenerateImageOptions, GenerateImageResult } from "@infiplot/ai-client";
import type {
Beat,
Character,
EngineConfig,
ProviderConfig,
} from "@yume/types";
} from "@infiplot/types";
import { mockImageDataUri } from "../mockImage";
import { buildPainterPrompt } from "../prompts";
+2 -2
View File
@@ -1,4 +1,4 @@
import { chat } from "@yume/ai-client";
import { chat } from "@infiplot/ai-client";
import type {
Beat,
BeatActiveCharacter,
@@ -7,7 +7,7 @@ import type {
BeatNext,
ProviderConfig,
Session,
} from "@yume/types";
} from "@infiplot/types";
import { parseJsonLoose } from "../jsonParser";
import { WRITER_SYSTEM, buildWriterUserMessage } from "../prompts";
+2 -2
View File
@@ -1,4 +1,4 @@
import { chat } from "@yume/ai-client";
import { chat } from "@infiplot/ai-client";
import type {
Character,
EngineConfig,
@@ -6,7 +6,7 @@ import type {
ProviderConfig,
Scene,
Session,
} from "@yume/types";
} from "@infiplot/types";
import { designCharacter, provisionVoiceForName } from "./agents/characterDesigner";
import { runCinematographer } from "./agents/cinematographer";
import { runPainter } from "./agents/painter";
+1 -1
View File
@@ -11,5 +11,5 @@ export { mergeCharacters } from "./director";
export type { SceneResult } from "./director";
export type { WriterOutput } from "./agents/writer";
export type { CinematographerOutput } from "./agents/cinematographer";
export type { InsertBeatPartial } from "@yume/types";
export type { InsertBeatPartial } from "@infiplot/types";
export * from "./prompts";
+1 -1
View File
@@ -11,7 +11,7 @@ import type {
StartResponse,
VisionRequest,
VisionResponse,
} from "@yume/types";
} from "@infiplot/types";
import { annotateClick } from "./annotate";
import { directInsertBeat, directScene } from "./director";
import { synthesizeBeat } from "./voice";
+1 -1
View File
@@ -3,7 +3,7 @@ import type {
Character,
Scene,
Session,
} from "@yume/types";
} from "@infiplot/types";
// ══════════════════════════════════════════════════════════════════════
// Multi-agent scene generation pipeline:
+2 -2
View File
@@ -1,10 +1,10 @@
import { interpretClick } from "@yume/ai-client";
import { interpretClick } from "@infiplot/ai-client";
import type {
ClickIntent,
ProviderConfig,
Scene,
VisionClassify,
} from "@yume/types";
} from "@infiplot/types";
import { parseJsonLoose } from "./jsonParser";
import { VISION_SYSTEM_PROMPT, buildVisionUserPrompt } from "./prompts";
+2 -2
View File
@@ -1,5 +1,5 @@
import { synthesize } from "@yume/tts-client";
import type { BeatAudio, CharacterVoice, TtsConfig } from "@yume/types";
import { synthesize } from "@infiplot/tts-client";
import type { BeatAudio, CharacterVoice, TtsConfig } from "@infiplot/types";
// Per-beat synth budget. MiMo's median synth is 37s; the tail can spike
// to 3070s under concurrent load. Capping here means a single bad beat
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "@yume/tts-client",
"name": "@infiplot/tts-client",
"version": "0.1.0",
"private": true,
"type": "module",
@@ -12,6 +12,6 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@yume/types": "workspace:*"
"@infiplot/types": "workspace:*"
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
import type { CharacterVoice, TtsConfig } from "@yume/types";
import type { CharacterVoice, TtsConfig } from "@infiplot/types";
// Xiaomi MiMo currently outputs wav / pcm16 only (mp3 not supported for output).
// The reference clip we persist is therefore wav. Kept as a single switch so we
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "@yume/types",
"name": "@infiplot/types",
"version": "0.1.0",
"private": true,
"type": "module",
+25 -25
View File
@@ -14,13 +14,13 @@ importers:
apps/web:
dependencies:
'@yume/ai-client':
'@infiplot/ai-client':
specifier: workspace:*
version: link:../../packages/ai-client
'@yume/engine':
'@infiplot/engine':
specifier: workspace:*
version: link:../../packages/engine
'@yume/types':
'@infiplot/types':
specifier: workspace:*
version: link:../../packages/types
next:
@@ -60,19 +60,19 @@ importers:
packages/ai-client:
dependencies:
'@yume/types':
'@infiplot/types':
specifier: workspace:*
version: link:../types
packages/engine:
dependencies:
'@yume/ai-client':
'@infiplot/ai-client':
specifier: workspace:*
version: link:../ai-client
'@yume/tts-client':
'@infiplot/tts-client':
specifier: workspace:*
version: link:../tts-client
'@yume/types':
'@infiplot/types':
specifier: workspace:*
version: link:../types
jsonrepair:
@@ -84,7 +84,7 @@ importers:
packages/tts-client:
dependencies:
'@yume/types':
'@infiplot/types':
specifier: workspace:*
version: link:../types
@@ -448,8 +448,8 @@ packages:
peerDependencies:
postcss: ^8.1.0
baseline-browser-mapping@2.10.32:
resolution: {integrity: sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==}
baseline-browser-mapping@2.10.33:
resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -516,8 +516,8 @@ packages:
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
electron-to-chromium@1.5.361:
resolution: {integrity: sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==}
electron-to-chromium@1.5.364:
resolution: {integrity: sha512-G/dYE3+AYhyHwzTwg8UbnXf7zqMERYh7l2jJ3QujhFsH8agSYwtnGAR2aZ7f0AakIKJXd5En/Hre4igIUrdlYw==}
es-errors@1.3.0:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
@@ -566,8 +566,8 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
hasown@2.0.3:
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
hasown@2.0.4:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
is-arrayish@0.3.4:
@@ -822,8 +822,8 @@ packages:
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
tinyglobby@0.2.16:
resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
to-regex-range@5.0.1:
@@ -1120,7 +1120,7 @@ snapshots:
postcss: 8.5.15
postcss-value-parser: 4.2.0
baseline-browser-mapping@2.10.32: {}
baseline-browser-mapping@2.10.33: {}
binary-extensions@2.3.0: {}
@@ -1130,9 +1130,9 @@ snapshots:
browserslist@4.28.2:
dependencies:
baseline-browser-mapping: 2.10.32
baseline-browser-mapping: 2.10.33
caniuse-lite: 1.0.30001793
electron-to-chromium: 1.5.361
electron-to-chromium: 1.5.364
node-releases: 2.0.46
update-browserslist-db: 1.2.3(browserslist@4.28.2)
@@ -1182,7 +1182,7 @@ snapshots:
dlv@1.1.3: {}
electron-to-chromium@1.5.361: {}
electron-to-chromium@1.5.364: {}
es-errors@1.3.0: {}
@@ -1223,7 +1223,7 @@ snapshots:
dependencies:
is-glob: 4.0.3
hasown@2.0.3:
hasown@2.0.4:
dependencies:
function-bind: 1.1.2
@@ -1235,7 +1235,7 @@ snapshots:
is-core-module@2.16.2:
dependencies:
hasown: 2.0.3
hasown: 2.0.4
is-extglob@2.1.1: {}
@@ -1272,7 +1272,7 @@ snapshots:
dependencies:
'@next/env': 16.2.6
'@swc/helpers': 0.5.15
baseline-browser-mapping: 2.10.32
baseline-browser-mapping: 2.10.33
caniuse-lite: 1.0.30001793
postcss: 8.4.31
react: 19.2.6
@@ -1465,7 +1465,7 @@ snapshots:
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.7
tinyglobby: 0.2.16
tinyglobby: 0.2.17
ts-interface-checker: 0.1.13
supports-preserve-symlinks-flag@1.0.0: {}
@@ -1506,7 +1506,7 @@ snapshots:
dependencies:
any-promise: 1.3.0
tinyglobby@0.2.16:
tinyglobby@0.2.17:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4