"use client"; import Link from "next/link"; import { useEffect, useState } from "react"; import data from "../data/content-templates.json"; import styles from "./CharacterDetail.module.css"; const character = data.character; export default function CharacterDetailPage() { const [favorite, setFavorite] = useState(false); const [tags, setTags] = useState(character.tags); const [newTag, setNewTag] = useState(""); const [note, setNote] = useState("第 09 话需要加强她主动提出关闭穹顶照明的动机铺垫。\n与遥的冲突不能只停留在信息差,需要落到选择差异。 "); const [editingNote, setEditingNote] = useState(false); const [activeTab, setActiveTab] = useState("overview"); const [toast, setToast] = useState(""); useEffect(() => { try { const saved = window.localStorage.getItem("star-character-detail"); if (saved) { const parsed = JSON.parse(saved); setFavorite(Boolean(parsed.favorite)); if (Array.isArray(parsed.tags)) setTags(parsed.tags); if (typeof parsed.note === "string") setNote(parsed.note); } } catch { /* use JSON defaults */ } }, []); useEffect(() => { window.localStorage.setItem("star-character-detail", JSON.stringify({ favorite, tags, note })); }, [favorite, tags, note]); const notify = (message: string) => { setToast(message); window.setTimeout(() => setToast(""), 2100); }; const addTag = () => { const value = newTag.trim(); if (!value || tags.includes(value)) return; setTags((current) => [...current, value]); setNewTag(""); notify(`已添加标签「${value}」`); }; return (
SSTELLAR
CHARACTER DATABASE
模板首页/角色资料库/{character.name}

{character.code}

{character.name}

{character.nameEn}
“{character.quote}”
{activeTab === "overview" && <>
PROFILE

角色简介

{character.bio}

核心动机寻找十二年前讯号的来源
外部目标让城市重新看见星空
内在冲突理性判断与情感信任
RELATIONSHIPS

人物关系

{character.relations.map((item) =>
{item.initial}

{item.name}{item.relation}

)}
} {activeTab === "setting" && <>
PERSONAL ATTRIBUTES

人物能力值

设定集 v2.4
{character.traits.map((trait) =>

{trait.label}{trait.value}

)}
SPECIAL SKILLS

技能与专长

{character.skills.map((skill) =>
{skill.level}

{skill.name}{skill.description}

)}
} {activeTab === "timeline" &&
STORY TIMELINE

剧情轨迹

{character.timeline.map((item,index) =>
{index+1}
{item.episode} · {item.type}{item.title}
)}
}