Build complete AI creator partnership prototype

This commit is contained in:
Codex Sites
2026-07-18 22:55:00 -05:00
commit 8cdc0bf20f
54 changed files with 12460 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
import Link from "next/link";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell";
const cards=[["01","保留你的独特性","从形象、语气到内容边界共同设定,让 AI 分身延续你的表达。"],["02","内容产能可扩展","把一个创意延展到短视频、图文、语音与多语言版本。"],["03","关系持续被经营","从评论到私聊建立连续体验,让高意向粉丝得到自然回应。"],["04","变现不止一种","组合订阅、付费内容、打赏、专属互动等收入路径。"],["05","全程授权可控","合作前明确授权范围、内容红线与审核机制。"],["06","每一步可复盘","围绕内容触达、互动深度与粉丝价值建立指标。"]];
export default function Advantages(){return <SiteShell><main><PageHero eyebrow="WHY PARTNER WITH US" title={<><br/><span className="accent"></span></>} description="我们把 AI 技术、内容运营与粉丝商业化合成一套服务,让创作者专注于真正不可替代的部分:表达、审美与信任。" extra={<Link className="link" href="/process"> <b></b></Link>}/><section className="section shell"><div className="adv-grid">{cards.map(x=><article key={x[0]}><span>{x[0]}</span><h2>{x[1]}</h2><p>{x[2]}</p></article>)}</div></section><section className="section comparison"><div className="shell"><div className="title-row"><div><p className="kicker">A BETTER MODEL</p><h2></h2></div></div><div className="table"><div><b></b><b></b><b>AI </b></div>{[["内容生产","依赖单次拍摄与个人时间","一次创意,多形态持续延展"],["粉丝互动","容易漏掉重要回应","分层承接评论与私聊关系"],["商业化","以广告和平台分成为主","建立多元、可持续粉丝收入"],["增长复盘","数据分散","围绕粉丝旅程持续优化"]].map(r=><div key={r[0]}>{r.map((c,i)=><span className={i===2?"positive":""} key={c}>{c}</span>)}</div>)}</div></div></section><Cta/></main></SiteShell>}
function Cta(){return <section className="cta compact shell"><div><p className="kicker">FIND YOUR GROWTH LEVER</p><h2></h2></div><Link className="btn primary" href="/contact"> <b></b></Link></section>}
+3
View File
@@ -0,0 +1,3 @@
import Link from "next/link";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell";
const cases=[["CASE 01","成熟个人创作者","把经典形象延展为持续更新的 AI 内容 IP","拥有稳定粉丝基础,但个人时间有限,内容频率和覆盖市场难以扩大。",["建立授权 AI 分身","扩展多语言内容","承接高意向互动"],["内容产能","跨市场触达","互动进入率"],"purple"],["CASE 02","关系型内容 IP","让一次内容互动,走向长期粉丝关系","评论活跃、私聊需求高,但人工无法持续回应,商业机会自然流失。",["评论分层运营","连续私聊体验","付费内容与订阅"],["关系深度","用户留存","单粉丝价值"],"coral"],["CASE 03","MCN / Agency","为多个创作者建立可复制的增长基础设施","不同账号依赖不同团队,内容、互动和收入数据分散,经验难复制。",["标准化创作者上架","共享运营规则","统一数据复盘"],["上架效率","运营一致性","矩阵收入"],"blue"]] as const;
export default function Cases(){return <SiteShell><main><PageHero eyebrow="PARTNERSHIP CASES" title={<><br/><span className="accent"></span></>} description="以下为原型阶段的典型合作场景,用于展示方法与指标结构;正式上线时可替换为已授权案例和可核验数据。"/><section className="section shell case-list">{cases.map(x=><article className="case" key={x[0]}><div className={`case-art ${x[6]}`}><span>{x[0]}</span><div><i/><i/><i/></div><strong>{x[1]}</strong></div><div className="case-copy"><small>{x[1]}</small><h2>{x[2]}</h2><section><b></b><p>{x[3]}</p></section><section><b></b><p className="tags">{x[4].map(t=><span key={t}>{t}</span>)}</p></section><section><b></b><p className="metrics">{x[5].map(t=><span key={t}> {t}</span>)}</p></section></div></article>)}</section><section className="cta compact shell"><div><p className="kicker">YOUR CASE STARTS HERE</p><h2></h2></div><Link className="btn primary" href="/contact"> <b></b></Link></section></main></SiteShell>}
+86
View File
@@ -0,0 +1,86 @@
import { headers } from "next/headers";
import { redirect } from "next/navigation";
export type ChatGPTUser = {
displayName: string;
email: string;
fullName: string | null;
};
const USER_EMAIL_HEADER = "oai-authenticated-user-email";
const USER_FULL_NAME_HEADER = "oai-authenticated-user-full-name";
const USER_FULL_NAME_ENCODING_HEADER =
"oai-authenticated-user-full-name-encoding";
const PERCENT_ENCODED_UTF8 = "percent-encoded-utf-8";
const SIGN_IN_PATH = "/signin-with-chatgpt";
const SIGN_OUT_PATH = "/signout-with-chatgpt";
const CALLBACK_PATH = "/callback";
export async function getChatGPTUser(): Promise<ChatGPTUser | null> {
const requestHeaders = await headers();
const email = requestHeaders.get(USER_EMAIL_HEADER);
if (!email) return null;
const encodedFullName = requestHeaders.get(USER_FULL_NAME_HEADER);
const fullName =
encodedFullName &&
requestHeaders.get(USER_FULL_NAME_ENCODING_HEADER) === PERCENT_ENCODED_UTF8
? safeDecodeURIComponent(encodedFullName)
: null;
return {
displayName: fullName ?? email,
email,
fullName,
};
}
export async function requireChatGPTUser(
returnTo: string,
): Promise<ChatGPTUser> {
const user = await getChatGPTUser();
if (user) return user;
redirect(chatGPTSignInPath(returnTo));
}
export function chatGPTSignInPath(returnTo: string): string {
const safeReturnTo = safeRelativeReturnPath(returnTo);
return `${SIGN_IN_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`;
}
export function chatGPTSignOutPath(returnTo = "/"): string {
const safeReturnTo = safeRelativeReturnPath(returnTo);
return `${SIGN_OUT_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`;
}
function safeRelativeReturnPath(value: string): string {
if (!value.startsWith("/") || value.startsWith("//")) return "/";
let url: URL;
try {
url = new URL(value, "https://app.local");
} catch {
return "/";
}
if (url.origin !== "https://app.local") return "/";
if (isReservedAuthPath(url.pathname)) return "/";
return `${url.pathname}${url.search}${url.hash}`;
}
function isReservedAuthPath(pathname: string): boolean {
return (
pathname === SIGN_IN_PATH ||
pathname === SIGN_OUT_PATH ||
pathname === CALLBACK_PATH
);
}
function safeDecodeURIComponent(value: string): string | null {
try {
return decodeURIComponent(value);
} catch {
return null;
}
}
+2
View File
@@ -0,0 +1,2 @@
import { ContactForm } from "../../components/ContactForm";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell";
export default function Contact(){return <SiteShell><main><PageHero eyebrow="START A PARTNERSHIP" title={<>线<br/><span className="accent"></span></>} description="留下基本信息与合作目标。我们会先判断最值得验证的场景,再决定是否进入更深入的合作设计。"/><section className="section shell contact"><aside><p className="kicker">WHAT HAPPENS NEXT</p><h2></h2><ol>{[["01","合作适配判断","判断现阶段是否适合。"],["02","优先场景建议","给出最值得先测试的场景。"],["03","下一步沟通安排","有合作空间时进入具体方案。"]].map(x=><li key={x[0]}><span>{x[0]}</span><div><strong>{x[1]}</strong><p>{x[2]}</p></div></li>)}</ol><div className="privacy"><strong></strong><p></p></div></aside><ContactForm/></section></main></SiteShell>}
+3
View File
@@ -0,0 +1,3 @@
import Link from "next/link";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell";
const qs=[["什么样的创作者适合合作?","更适合已经形成明确形象、内容风格或粉丝基础的个人创作者、艺人、关系型 IP,以及希望为旗下创作者增加运营与变现能力的机构。"],["AI 分身会不会取代创作者本人?","不会。AI 分身延展创作者已经建立的形象与表达;核心创意、授权边界与重大商业决策仍由创作者掌握。"],["如何确保 AI 内容符合我的形象?","合作初期会共同建立创作者 AI 手册,包含语气、价值观、视觉规范、禁区和审核机制。"],["我的肖像、声音和内容版权归谁?","具体权利与使用范围会在正式合作协议中清晰约定。默认仅在获得授权的场景和期限内使用。"],["合作一定要同时做所有服务吗?","不需要。可以从 AI 内容、评论运营、私聊关系或付费内容中的一个场景开始。"],["可以覆盖哪些平台和市场?","合作可适配主流内容、社交与粉丝平台;跨市场扩展会结合账号基础、用户画像与当地条件判断。"],["如何衡量合作是否有效?","不同阶段关注内容触达、互动进入率、粉丝留存、关系深度、付费转化与单粉丝价值。"],["第一步需要准备什么?","提供主要账号、粉丝规模、内容类型,以及当前最想解决的一个问题即可。"]];
export default function FAQ(){return <SiteShell><main><PageHero eyebrow="FREQUENTLY ASKED QUESTIONS" title={<><br/><span className="accent"></span></>} description="关于 AI 分身、合作边界、版权与效果衡量,这里整理了创作者最常问的问题。" extra={<Link className="link" href="/contact"> <b></b></Link>}/><section className="section shell faq"><aside><p className="kicker">8 QUESTIONS</p><h2></h2><p></p></aside><div>{qs.map((x,i)=><details key={x[0]} open={i===0}><summary><span>{String(i+1).padStart(2,"0")}</span>{x[0]}<i></i></summary><p>{x[1]}</p></details>)}</div></section><section className="cta compact shell"><div><p className="kicker">LET'S TALK</p><h2></h2></div><Link className="btn primary" href="/contact"> <b></b></Link></section></main></SiteShell>}
+5
View File
File diff suppressed because one or more lines are too long
+41
View File
@@ -0,0 +1,41 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "COZCREATORAI 创作者合作服务",
description: "为创作者与机构提供 AI 分身、内容增长、粉丝关系运营与商业化服务。",
other: {
"codex-preview": "development",
},
icons: {
icon: "/favicon.svg",
shortcut: "/favicon.svg",
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="zh-CN">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
</body>
</html>
);
}
+48
View File
@@ -0,0 +1,48 @@
import Link from "next/link";
import { SiteShell } from "../components/SiteShell";
const services = [
["01", "AI 分身", "在创作者授权与边界内,建立可持续更新的数字形象。"],
["02", "内容增长", "把一次创意延展为多平台、多语言、多形态内容资产。"],
["03", "关系运营", "承接评论与私聊,让粉丝被回应、被理解、愿意留下。"],
["04", "粉丝变现", "组合订阅、付费内容、打赏与专属互动,构建长期收入。"],
];
export default function Home() {
return <SiteShell><main>
<section className="hero paper">
<div className="shell hero-grid">
<div className="hero-copy">
<p className="eyebrow">AI CREATOR PARTNERSHIP</p>
<h1><br/><span className="accent">线</span></h1>
<p className="lead"> AI </p>
<div className="actions"><Link className="btn primary" href="/contact"> <b></b></Link><Link className="link" href="/cases"> <b></b></Link></div>
</div>
<div className="hero-art" aria-label="AI 创作者增长系统示意">
<div className="portrait-card"><span>CREATOR</span><div className="portrait-shape"><i/><i/><i/></div><strong></strong><small> · · </small></div>
<div className="twin-card"><span>AI TWIN</span><strong></strong><small> · · </small></div>
<div className="orbit-label">AI <i/></div>
</div>
</div>
<div className="shell proof"><div><i></i></div><div><strong>1:1</strong><span></span></div><div><strong>4</strong><span></span></div><div><strong></strong><span></span></div></div>
</section>
<section className="section shell">
<div className="split"><div><p className="kicker">OUR MODEL</p><h2><br/></h2></div><p>AI </p></div>
<div className="service-grid">{services.map(([no,title,text])=><article key={no}><span>{no}</span><div/><h3>{title}</h3><p>{text}</p></article>)}</div>
</section>
<section className="section dark"><div className="shell"><div className="split light"><div><p className="kicker">PARTNERSHIP VALUE</p><h2><br/></h2></div><Link className="btn pale" href="/advantages"> <b></b></Link></div><div className="flow">{[["01","内容被看见","扩大触达"],["02","互动被回应","建立关系"],["03","信任被沉淀","形成资产"],["04","影响力变现","持续增长"]].map((x,i)=><article className={i===3?"hot":""} key={x[0]}><span>{x[0]}</span><strong>{x[1]}</strong><small>{x[2]}</small></article>)}</div></div></section>
<section className="section shell">
<div className="title-row"><div><p className="kicker">USE CASES</p><h2></h2></div><Link className="link" href="/cases"> <b></b></Link></div>
<div className="scenario-grid">{[
["个人创作者","把个人影响力变成可持续经营的品牌资产","AI 分身 · 多平台内容 · 粉丝私域","purple"],
["关系型 IP","从内容关注走向更深、更长期的粉丝关系","评论运营 · 私聊体验 · 付费内容","coral"],
["MCN / Agency","用一套系统承接多个创作者增长与变现","批量上架 · 标准流程 · 数据复盘","blue"],
].map(([label,title,tags,color])=><article className={`scenario ${color}`} key={label}><span>{label}</span><h3>{title}</h3><p>{tags}</p><Link href="/cases"></Link></article>)}</div>
</section>
<section className="cta shell"><div><p className="kicker">START A PARTNERSHIP</p><h2><br/></h2></div><div><p></p><Link className="btn primary" href="/contact"> <b></b></Link></div></section>
</main></SiteShell>;
}
+3
View File
@@ -0,0 +1,3 @@
import Link from "next/link";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell";
const steps=[["01","合作诊断","了解内容资产、核心粉丝、平台分布与商业目标,找到最值得优先验证的机会。","合作机会地图"],["02","形象与边界","共同定义 AI 分身的人设、表达方式、授权范围和审核规则。","创作者 AI 手册"],["03","AI 分身制作","完成形象、声音与对话能力校准,并准备首批内容样本。","可测试版本"],["04","小范围验证","选择一个平台或场景开始,观察触达、互动、留存与付费信号。","验证数据"],["05","规模化增长","扩展内容形态、渠道和变现路径,形成可复用运营节奏。","长期增长计划"]];
export default function Process(){return <SiteShell><main><PageHero eyebrow="HOW WE WORK" title={<><br/><span className="accent"></span></>} description="我们从小范围验证开始,让每一步都可看、可控、可复盘。合作范围随真实结果逐步扩展。" extra={<Link className="btn primary small" href="/contact"> <b></b></Link>}/><section className="section shell process-list">{steps.map(x=><article key={x[0]}><span>{x[0]}</span><h2>{x[1]}</h2><p>{x[2]}</p><strong>{x[3]}</strong></article>)}</section><section className="section dark"><div className="shell principles"><div><p className="kicker">OUR PRINCIPLES</p><h2><br/></h2></div><div>{[["01","先验证,再扩大","用真实反馈决定投入。"],["02","先定边界,再创作","内容与互动在授权范围内运行。"],["03","长期价值优先","不透支粉丝信任。"]].map(x=><article key={x[0]}><span>{x[0]}</span><strong>{x[1]}</strong><p>{x[2]}</p></article>)}</div></div></section><section className="cta compact shell"><div><p className="kicker">READY WHEN YOU ARE</p><h2></h2></div><Link className="btn primary" href="/contact"> <b></b></Link></section></main></SiteShell>}