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
+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>