commit 8cdc0bf20f120c728ba7072b86294c8334bac61b Author: Codex Sites Date: Sat Jul 18 22:55:00 2026 -0500 Build complete AI creator partnership prototype diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c413892 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +next-env.d.ts +/dist/ +/.wrangler/ +/.sites-runtime/ +/outputs/ +/work/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..0edab15 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +audit=false +fund=false +update-notifier=false +cache=.sites-runtime/npm-cache diff --git a/.openai/hosting.json b/.openai/hosting.json new file mode 100644 index 0000000..04fe630 --- /dev/null +++ b/.openai/hosting.json @@ -0,0 +1,5 @@ +{ + "d1": null, + "project_id": "appgprj_6a5c3db6538881919fb7fca5ecb49d9f", + "r2": null +} diff --git a/.vinext/fonts/geist-8ac0455e797f/geist-001175b1.woff2 b/.vinext/fonts/geist-8ac0455e797f/geist-001175b1.woff2 new file mode 100644 index 0000000..8a1d3df Binary files /dev/null and b/.vinext/fonts/geist-8ac0455e797f/geist-001175b1.woff2 differ diff --git a/.vinext/fonts/geist-8ac0455e797f/geist-52306abf.woff2 b/.vinext/fonts/geist-8ac0455e797f/geist-52306abf.woff2 new file mode 100644 index 0000000..0bcca1b Binary files /dev/null and b/.vinext/fonts/geist-8ac0455e797f/geist-52306abf.woff2 differ diff --git a/.vinext/fonts/geist-8ac0455e797f/geist-875ccdd4.woff2 b/.vinext/fonts/geist-8ac0455e797f/geist-875ccdd4.woff2 new file mode 100644 index 0000000..f385e23 Binary files /dev/null and b/.vinext/fonts/geist-8ac0455e797f/geist-875ccdd4.woff2 differ diff --git a/.vinext/fonts/geist-8ac0455e797f/geist-98bbbccb.woff2 b/.vinext/fonts/geist-8ac0455e797f/geist-98bbbccb.woff2 new file mode 100644 index 0000000..8f01e76 Binary files /dev/null and b/.vinext/fonts/geist-8ac0455e797f/geist-98bbbccb.woff2 differ diff --git a/.vinext/fonts/geist-8ac0455e797f/geist-ff2310f5.woff2 b/.vinext/fonts/geist-8ac0455e797f/geist-ff2310f5.woff2 new file mode 100644 index 0000000..7ab581f Binary files /dev/null and b/.vinext/fonts/geist-8ac0455e797f/geist-ff2310f5.woff2 differ diff --git a/.vinext/fonts/geist-8ac0455e797f/style.css b/.vinext/fonts/geist-8ac0455e797f/style.css new file mode 100644 index 0000000..cb723b5 --- /dev/null +++ b/.vinext/fonts/geist-8ac0455e797f/style.css @@ -0,0 +1,45 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-8ac0455e797f/geist-ff2310f5.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-8ac0455e797f/geist-875ccdd4.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-8ac0455e797f/geist-52306abf.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-8ac0455e797f/geist-001175b1.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Geist'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-8ac0455e797f/geist-98bbbccb.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-013b2f2f.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-013b2f2f.woff2 new file mode 100644 index 0000000..cf24126 Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-013b2f2f.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-0638449e.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-0638449e.woff2 new file mode 100644 index 0000000..29dd20f Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-0638449e.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-44745446.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-44745446.woff2 new file mode 100644 index 0000000..751a04d Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-44745446.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-44e03052.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-44e03052.woff2 new file mode 100644 index 0000000..4fc15d1 Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-44e03052.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-971fb274.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-971fb274.woff2 new file mode 100644 index 0000000..873f580 Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-971fb274.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/geist-mono-f6b33328.woff2 b/.vinext/fonts/geist-mono-00e989178794/geist-mono-f6b33328.woff2 new file mode 100644 index 0000000..c7700cd Binary files /dev/null and b/.vinext/fonts/geist-mono-00e989178794/geist-mono-f6b33328.woff2 differ diff --git a/.vinext/fonts/geist-mono-00e989178794/style.css b/.vinext/fonts/geist-mono-00e989178794/style.css new file mode 100644 index 0000000..dee7f98 --- /dev/null +++ b/.vinext/fonts/geist-mono-00e989178794/style.css @@ -0,0 +1,54 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-f6b33328.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-44e03052.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* symbols2 */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-0638449e.woff2) format('woff2'); + unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F; +} +/* vietnamese */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-971fb274.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-44745446.woff2) format('woff2'); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Geist Mono'; + font-style: normal; + font-weight: 100 900; + font-display: swap; + src: url(/workspace/sites/ai-creator-partnership/.vinext/fonts/geist-mono-00e989178794/geist-mono-013b2f2f.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..a14b0e6 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +# vinext-starter + +A clean full-stack starter running on +[vinext](https://github.com/cloudflare/vinext), with optional Cloudflare D1 and +Drizzle support. + +## Prerequisites + +- Node.js `>=22.13.0` +- Linux with `flock`, `curl`, and GNU `timeout` + +## Sites Lifecycle + +The Sites lifecycle CLI runs the locked dependency install before returning this checkout. Edit the source under `app/`, then checkpoint when a coherent milestone is ready to inspect or share. The remote Sites builder runs `npm run build` against the pushed commit. Do not repeat install or build as a normal pre-checkpoint step. + +This starter does not use `wrangler.jsonc`. + +`install:ci` is intentionally a single, non-retrying `npm ci`. It refuses a concurrent install for the same project, consumes a matching image-seeded npm cache with `--prefer-offline` while retaining registry fallback for a missing cache object, otherwise downloads and verifies the complete vinext tarball recorded in `package-lock.json`, limits npm to one socket, and terminates a stalled install. `build` applies a short timeout and then validates the Sites artifact. These helpers target Linux and use GNU `timeout`; they are not native macOS scripts. + +Scripts that need writable project-scoped home, npm, XDG, and temporary paths use `scripts/sites-env.sh`. The `dev` and `start` scripts honor the caller's runtime environment and keep Wrangler logs inside the checkout. The generated `.sites-runtime/` directory is disposable and ignored by Git. + +## Included Shape + +- edit site code under `app/` +- `app/chatgpt-auth.ts` provides optional dispatch-owned ChatGPT sign-in helpers +- `.openai/hosting.json` declares optional Sites D1 and R2 bindings +- `vite.config.ts` simulates declared bindings for local development +- `db/index.ts` reads the D1 binding from the Cloudflare Worker environment +- `db/schema.ts` starts intentionally empty +- `examples/d1/` contains an optional D1 example surface +- `drizzle.config.ts` supports local migration generation when needed + +## Workspace Auth Headers + +OpenAI workspace sites can read the current user's email from +`oai-authenticated-user-email`. + +SIWC-authenticated workspace sites may also receive +`oai-authenticated-user-full-name` when the user's SIWC profile has a non-empty +`name` claim. The full-name value is percent-encoded UTF-8 and is accompanied by +`oai-authenticated-user-full-name-encoding: percent-encoded-utf-8`. + +Treat the full name as optional and fall back to email when it is absent: + +```tsx +import { headers } from "next/headers"; + +export default async function Home() { + const requestHeaders = await headers(); + const email = requestHeaders.get("oai-authenticated-user-email"); + const encodedFullName = requestHeaders.get("oai-authenticated-user-full-name"); + const fullName = + encodedFullName && + requestHeaders.get("oai-authenticated-user-full-name-encoding") === + "percent-encoded-utf-8" + ? decodeURIComponent(encodedFullName) + : null; + + const displayName = fullName ?? email; + // ... +} +``` + +## Optional Dispatch-Owned ChatGPT Sign-In + +Import the ready-to-use helpers from `app/chatgpt-auth.ts` when the site needs +optional or required ChatGPT sign-in: + +- Use `getChatGPTUser()` for optional signed-in UI. +- Use `requireChatGPTUser(returnTo)` for server-rendered pages that should send + anonymous visitors through Sign in with ChatGPT. +- Use `chatGPTSignInPath(returnTo)` and `chatGPTSignOutPath(returnTo)` for + browser links or actions. +- Pass a same-origin relative `returnTo` path for the destination after sign-in + or sign-out. The helper validates and safely encodes it. +- Mark protected pages with `export const dynamic = "force-dynamic"` because + they depend on per-request identity headers. + +Dispatch owns `/signin-with-chatgpt`, `/signout-with-chatgpt`, `/callback`, the +OAuth cookies, and identity header injection. Do not implement app routes for +those reserved paths. Routes that do not import and call the helper remain +anonymous-compatible. + +SIWC establishes identity only; it does not prove workspace membership. Use the +Sites hosting platform's access policy controls for workspace-wide restrictions, +or enforce explicit server-side membership or allowlist checks. + +Use SIWC for account pages, user-specific dashboards, saved records, and write +actions tied to the current ChatGPT user. Leave public content anonymous. + +## Diagnostic Commands + +- `npm run install:ci`: perform the one bounded lockfile install +- `npm run dev`: start the Vite/Vinext development server +- `npm run build`: build and validate the deployable Sites artifact +- `npm run start`: start the built Vinext application +- `npm test`: build, validate, and verify the rendered development-preview metadata +- `npm run validate:artifact`: recheck an existing artifact's manifest and ESM `default.fetch` export +- `npm run db:generate`: generate Drizzle migrations after schema changes + +Use build and validation commands for targeted diagnosis after a remote failure, not as part of the normal checkpoint path. + +The timeout defaults can be overridden for a controlled canary with `SITES_INSTALL_TIMEOUT`, `SITES_INSTALL_KILL_AFTER`, `SITES_BUILD_TIMEOUT`, and `SITES_BUILD_KILL_AFTER`. A timeout fails the command; the helpers never retry an unchanged install or build. + +## Learn More + +- [vinext Documentation](https://github.com/cloudflare/vinext) +- [Drizzle D1 Guide](https://orm.drizzle.team/docs/get-started/d1-new) diff --git a/app/advantages/page.tsx b/app/advantages/page.tsx new file mode 100644 index 0000000..13fb4f3 --- /dev/null +++ b/app/advantages/page.tsx @@ -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
你的影响力不该被
时间与平台限制。} description="我们把 AI 技术、内容运营与粉丝商业化合成一套服务,让创作者专注于真正不可替代的部分:表达、审美与信任。" extra={查看合作流程 }/>
{cards.map(x=>
{x[0]}

{x[1]}

{x[2]}

)}

A BETTER MODEL

把分散工作,变成同一条增长链路

关键环节传统运营AI 创作者合作
{[["内容生产","依赖单次拍摄与个人时间","一次创意,多形态持续延展"],["粉丝互动","容易漏掉重要回应","分层承接评论与私聊关系"],["商业化","以广告和平台分成为主","建立多元、可持续粉丝收入"],["增长复盘","数据分散","围绕粉丝旅程持续优化"]].map(r=>
{r.map((c,i)=>{c})}
)}
} +function Cta(){return

FIND YOUR GROWTH LEVER

先从最适合你的一个增长点开始。

获取合作建议
} diff --git a/app/cases/page.tsx b/app/cases/page.tsx new file mode 100644 index 0000000..6cb81aa --- /dev/null +++ b/app/cases/page.tsx @@ -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
不同起点,
同一件事:放大价值。} description="以下为原型阶段的典型合作场景,用于展示方法与指标结构;正式上线时可替换为已授权案例和可核验数据。"/>
{cases.map(x=>
{x[0]}
{x[1]}
{x[1]}

{x[2]}

合作挑战

{x[3]}

合作方案

{x[4].map(t=>{t})}

重点指标

{x[5].map(t=>↗ {t})}

)}

YOUR CASE STARTS HERE

你的合作路径,从真实资源出发。

聊聊你的情况
} diff --git a/app/chatgpt-auth.ts b/app/chatgpt-auth.ts new file mode 100644 index 0000000..8d1fb35 --- /dev/null +++ b/app/chatgpt-auth.ts @@ -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 { + 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 { + 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; + } +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..38079f0 --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,2 @@ +import { ContactForm } from "../../components/ContactForm";import { PageHero } from "../../components/PageHero";import { SiteShell } from "../../components/SiteShell"; +export default function Contact(){return
下一条增长曲线,
从一次认真沟通开始。} description="留下基本信息与合作目标。我们会先判断最值得验证的场景,再决定是否进入更深入的合作设计。"/>
} diff --git a/app/faq/page.tsx b/app/faq/page.tsx new file mode 100644 index 0000000..6b80bb3 --- /dev/null +++ b/app/faq/page.tsx @@ -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
在开始之前,
先把重要问题说清楚。} description="关于 AI 分身、合作边界、版权与效果衡量,这里整理了创作者最常问的问题。" extra={还有其他问题?联系团队 }/>
{qs.map((x,i)=>
{String(i+1).padStart(2,"0")}{x[0]}

{x[1]}

)}

LET'S TALK

真实情况不同,最好的答案也会不同。

联系合作团队
} diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..cb62260 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,5 @@ +@import "tailwindcss"; +:root{--paper:#f4efe6;--light:#fbf8f2;--ink:#17151b;--muted:#6f6964;--line:rgba(23,21,27,.2);--purple:#6f38e8;--purple2:#9964ff;--night:#16131c}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--light);color:var(--ink);font-family:var(--font-geist-sans),"PingFang SC","Microsoft YaHei",sans-serif}a{text-decoration:none;color:inherit}button,input,select,textarea{font:inherit}.site{overflow:hidden}.shell{width:min(1320px,calc(100% - 96px));margin:auto}.paper{background-color:var(--paper);background-image:radial-gradient(circle,rgba(255,255,255,.75) 0 1px,transparent 1.5px);background-size:9px 9px}header{position:relative;z-index:20;background:rgba(244,239,230,.96);border-bottom:1px solid var(--line);backdrop-filter:blur(12px)}.nav{height:90px;display:flex;align-items:center;justify-content:space-between}.brand{font-size:22px;font-weight:850;letter-spacing:-1px}.brand span{color:var(--purple)}.nav nav{display:flex;align-items:center;gap:clamp(20px,2.5vw,42px);font-size:14px}.nav nav>a:not(.nav-cta){padding:10px 0;position:relative}.nav nav>a:not(.nav-cta):after{content:"";position:absolute;left:0;right:100%;bottom:0;height:2px;background:var(--purple);transition:.25s}.nav nav>a:hover:after,.nav nav>a.active:after{right:0}.nav-cta{border:1px solid;padding:13px 19px}.nav-cta:hover{color:white;background:var(--ink)}.menu{display:none;border:0;background:none;width:40px;height:40px}.menu i{display:block;height:1.5px;background:var(--ink);margin:7px}.hero{min-height:calc(100vh - 90px);padding:70px 0 34px}.hero-grid{min-height:520px;display:grid;grid-template-columns:1.08fr .92fr;gap:50px;align-items:center}.eyebrow,.kicker{margin:0 0 24px;color:var(--purple);font-size:13px;font-weight:700;letter-spacing:.27em}.hero h1,.page-hero h1,.split h2,.title-row h2,.cta h2,.principles h2{font-family:"Songti SC","STSong","Noto Serif SC",Georgia,serif;font-weight:700;letter-spacing:-.055em}.hero h1{margin:0;font-size:clamp(54px,5.9vw,88px);line-height:1.16}.accent{position:relative;color:var(--purple);white-space:nowrap}.accent:after{content:"";position:absolute;left:0;right:-2%;bottom:-.03em;height:.08em;background:var(--purple);transform:rotate(-1.5deg)}.lead{max-width:620px;margin:32px 0 0;color:#504a48;font-size:18px;line-height:1.9}.actions{display:flex;align-items:center;gap:42px;margin-top:38px}.btn{min-height:56px;padding:0 28px;display:inline-flex;align-items:center;justify-content:center;gap:28px;border:0;cursor:pointer;font-weight:650;transition:.25s}.btn:hover{transform:translateY(-3px)}.primary{color:#fff;background:linear-gradient(120deg,#6130d7,#8249f0);box-shadow:0 14px 35px rgba(111,56,232,.22)}.pale{background:white}.small{min-height:48px}.link{display:inline-flex;align-items:center;gap:16px;border:0;background:none;font-weight:650;cursor:pointer}.btn b,.link b{transition:.25s}.btn:hover b,.link:hover b{transform:translateX(4px)}.hero-art{min-height:520px;position:relative}.portrait-card,.twin-card{position:absolute;border:1px solid rgba(23,21,27,.55);overflow:hidden}.portrait-card{inset:22px 56px 14px 20px;padding:28px;background:linear-gradient(155deg,#f4ede2 5%,#d7c3ff 100%);z-index:2}.portrait-card>span,.twin-card>span{font-size:11px;letter-spacing:.2em}.portrait-card strong,.portrait-card small{position:absolute;left:30px;z-index:2}.portrait-card strong{bottom:52px;font:700 34px "Songti SC",serif}.portrait-card small{bottom:28px}.portrait-shape{position:absolute;inset:14% -10% -12% 18%}.portrait-shape i{position:absolute;inset:0;border:1px solid rgba(23,21,27,.5);border-radius:48% 52% 39% 61%/52% 37% 63% 48%;transform:rotate(16deg)}.portrait-shape i:nth-child(2){inset:13%;background:linear-gradient(140deg,rgba(255,255,255,.2),rgba(111,56,232,.55));transform:rotate(-18deg)}.portrait-shape i:nth-child(3){inset:29%;background:var(--ink);border:0;transform:rotate(35deg)}.twin-card{right:-5px;top:65px;width:175px;height:220px;padding:20px;color:white;background:rgba(111,56,232,.88);backdrop-filter:blur(10px);z-index:3}.twin-card strong,.twin-card small{position:absolute;left:20px}.twin-card strong{bottom:48px;font-size:21px}.twin-card small{bottom:24px;font-size:11px}.orbit-label{position:absolute;left:-10px;bottom:48px;z-index:4;padding:13px 16px;background:rgba(255,255,255,.85);border:1px solid var(--line);font-size:12px}.orbit-label i{display:inline-block;width:7px;height:7px;margin-left:8px;background:#4caf7d;border-radius:50%}.proof{display:grid;grid-template-columns:1.4fr repeat(3,1fr);min-height:120px;border:1px solid rgba(23,21,27,.65);background:rgba(251,248,242,.8)}.proof>div{display:flex;align-items:center;justify-content:center;gap:15px;padding:20px;border-left:1px solid var(--line)}.proof>div:first-child{border-left:0;justify-content:flex-start;font-weight:600}.proof>div:first-child i{display:grid;place-items:center;width:40px;height:40px;color:white;background:var(--purple);border-radius:50%}.proof>div:not(:first-child){flex-direction:column;gap:2px}.proof strong{color:var(--purple);font:600 42px Georgia,serif}.proof span{font-size:13px}.section{padding-top:130px;padding-bottom:130px}.split{display:grid;grid-template-columns:1.1fr .9fr;gap:100px;align-items:end;margin-bottom:70px}.split h2,.title-row h2,.cta h2{margin:0;font-size:clamp(42px,4.5vw,66px);line-height:1.17}.split>p{margin:0;color:var(--muted);font-size:18px;line-height:1.9}.service-grid{display:grid;grid-template-columns:repeat(4,1fr);border-block:1px solid var(--line)}.service-grid article{min-height:320px;padding:32px 28px;border-left:1px solid var(--line);transition:.3s}.service-grid article:first-child{border-left:0}.service-grid article:hover{color:white;background:var(--purple);transform:translateY(-7px)}.service-grid article>span{color:var(--purple);font:600 18px Georgia}.service-grid article:hover>span{color:white}.service-grid article>div{width:44px;height:1px;margin:42px 0 55px;background:currentColor;opacity:.35}.service-grid h3{font-size:24px}.service-grid p{color:var(--muted);line-height:1.8}.service-grid article:hover p{color:#eee}.dark{color:white;background:var(--night)}.light .kicker{color:var(--purple2)}.light .btn{justify-self:end}.flow{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;border-top:1px solid rgba(255,255,255,.18);padding-top:48px}.flow article{min-height:180px;padding:25px;display:flex;flex-direction:column;justify-content:space-between;border:1px solid rgba(255,255,255,.2)}.flow span{color:var(--purple2);font-family:Georgia}.flow small{color:#888}.flow .hot{color:var(--ink);background:var(--purple2);border-color:var(--purple2)}.flow .hot span,.flow .hot small{color:var(--ink)}.title-row{display:flex;justify-content:space-between;align-items:end;gap:30px;margin-bottom:58px}.scenario-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}.scenario{min-height:400px;padding:32px;position:relative;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--line)}.scenario:after{content:"";position:absolute;width:220px;height:220px;right:-90px;bottom:-90px;border:1px solid;border-radius:50%;opacity:.2;box-shadow:0 0 0 38px transparent,0 0 0 39px currentColor,0 0 0 78px transparent,0 0 0 79px currentColor}.purple{background:#e9ddff}.coral{background:#ffdfd8}.blue{background:#dce5ff}.scenario>span,.case-copy>small{align-self:flex-start;padding:7px 11px;border:1px solid;font-size:12px}.scenario h3{max-width:320px;margin:auto 0 25px;font:700 30px/1.45 "Songti SC",serif}.scenario p{font-size:12px}.scenario>a{position:absolute;top:28px;right:28px;display:grid;place-items:center;width:42px;height:42px;color:white;background:var(--ink);border-radius:50%;z-index:2}.cta{display:grid;grid-template-columns:1.1fr .9fr;gap:80px;align-items:center;margin-top:20px;margin-bottom:130px;padding:68px 72px;background:var(--paper);border:1px solid rgba(23,21,27,.65)}.cta>div:last-child{display:flex;flex-direction:column;align-items:flex-start;gap:24px}.cta>div:last-child p{margin:0;color:var(--muted);line-height:1.8}.compact{margin-top:0}.compact>.btn{justify-self:end}.page-hero{padding:110px 0 96px;border-bottom:1px solid var(--line)}.page-hero-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:100px;align-items:end}.page-hero h1{margin:0;font-size:clamp(52px,5.4vw,80px);line-height:1.18}.page-hero-grid>div:last-child>p{margin:0 0 28px;color:var(--muted);font-size:18px;line-height:1.9}.adv-grid{display:grid;grid-template-columns:repeat(3,1fr);border-top:1px solid var(--line)}.adv-grid article{min-height:315px;padding:34px;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}.adv-grid article:nth-child(3n){border-right:0}.adv-grid span{color:var(--purple);font:600 18px Georgia}.adv-grid h2{margin:70px 0 18px;font-size:24px}.adv-grid p{color:var(--muted);line-height:1.8}.comparison{background:#eee8df}.table{border:1px solid rgba(23,21,27,.65)}.table>div{display:grid;grid-template-columns:.6fr 1fr 1fr;border-top:1px solid var(--line)}.table>div:first-child{color:white;background:var(--ink);border:0}.table span,.table b{padding:24px 28px;border-left:1px solid var(--line);line-height:1.7}.table span:first-child,.table b:first-child{border-left:0}.positive{color:var(--purple);font-weight:650;background:rgba(255,255,255,.35)}.process-list{padding-top:70px}.process-list article{display:grid;grid-template-columns:70px .65fr 1.2fr .75fr;gap:40px;align-items:center;padding:44px 0;border-bottom:1px solid var(--line)}.process-list article>span{color:var(--purple);font:600 22px Georgia}.process-list h2{font-size:26px}.process-list p{color:var(--muted);line-height:1.8}.process-list strong{justify-self:end;padding:9px 12px;color:var(--purple);border:1px solid rgba(111,56,232,.3);font-size:12px}.principles{display:grid;grid-template-columns:.85fr 1.15fr;gap:110px}.principles h2{margin:0;font-size:clamp(42px,4.4vw,64px);line-height:1.2}.principles>div:last-child article{display:grid;grid-template-columns:50px 180px 1fr;gap:18px;padding:27px 0;border-bottom:1px solid rgba(255,255,255,.16)}.principles article span{color:var(--purple2)}.principles article p{margin:0;color:#888}.case-list{padding-top:75px}.case{display:grid;grid-template-columns:.9fr 1.1fr;min-height:540px;margin-bottom:55px;border:1px solid var(--line)}.case-art{position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:38px;overflow:hidden}.case-art>span{font-size:12px;letter-spacing:.17em}.case-art>strong{z-index:2;max-width:300px;font:700 44px/1.3 "Songti SC",serif}.case-art>div{position:absolute;inset:10% -10% 5% 18%}.case-art i{position:absolute;inset:0;border:1px solid rgba(23,21,27,.35);border-radius:50%;transform:rotate(18deg)}.case-art i:nth-child(2){inset:13%;transform:rotate(-20deg)}.case-art i:nth-child(3){inset:28%;background:rgba(255,255,255,.25);transform:rotate(45deg)}.case-copy{padding:50px 56px;background:#fffdf8}.case-copy h2{margin:36px 0;font:700 37px/1.4 "Songti SC",serif}.case-copy section{display:grid;grid-template-columns:90px 1fr;gap:20px;padding:22px 0;border-top:1px solid var(--line)}.case-copy section p{margin:0;line-height:1.8}.case-copy section b{font-size:13px;color:var(--muted)}.tags,.metrics{display:flex;flex-wrap:wrap;gap:8px 18px}.tags span{padding:7px 10px;background:#f2eee7;border:1px solid var(--line);font-size:12px}.metrics span{color:var(--purple);font-weight:650}.faq{display:grid;grid-template-columns:.7fr 1.3fr;gap:110px;align-items:start}.faq aside{position:sticky;top:35px}.faq aside h2{font-size:34px}.faq aside>p:last-child{color:var(--muted)}.faq details{border-top:1px solid var(--line)}.faq details:last-child{border-bottom:1px solid var(--line)}.faq summary{display:grid;grid-template-columns:50px 1fr 30px;align-items:center;gap:12px;padding:29px 0;list-style:none;cursor:pointer;font-size:19px;font-weight:650}.faq summary::-webkit-details-marker{display:none}.faq summary span{color:var(--purple);font:600 15px Georgia}.faq summary i{font-style:normal;font-weight:400;transition:.25s}.faq details[open] summary i{transform:rotate(45deg)}.faq details>p{margin:-2px 25px 28px 62px;color:var(--muted);line-height:1.9}.contact{display:grid;grid-template-columns:.75fr 1.25fr;gap:90px;align-items:start}.contact aside h2{margin:0 0 40px;font:700 36px/1.4 "Songti SC",serif}.contact ol{list-style:none;margin:0;padding:0}.contact li{display:grid;grid-template-columns:52px 1fr;gap:14px;padding:20px 0;border-top:1px solid var(--line)}.contact li>span{color:var(--purple);font-family:Georgia}.contact li p{margin:7px 0 0;color:var(--muted)}.privacy{margin-top:32px;padding:20px;background:#eee6fb}.privacy p{margin:7px 0 0;color:var(--muted);line-height:1.7}.form{padding:44px;background:white;border:1px solid rgba(23,21,27,.25);box-shadow:0 24px 70px rgba(39,27,55,.08)}.form>label,.form fieldset{display:block;margin-bottom:26px}.form label,.form legend{font-size:14px;font-weight:650}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:26px}.form input,.form select,.form textarea{width:100%;margin-top:9px;padding:13px 0;border:0;border-bottom:1px solid rgba(23,21,27,.35);border-radius:0;background:transparent;outline:none}.form textarea{padding:13px;border:1px solid var(--line);resize:vertical}.form input:focus,.form select:focus,.form textarea:focus{border-color:var(--purple)}.form fieldset{padding:0;border:0}.checks{display:flex;flex-wrap:wrap;gap:8px;margin-top:13px}.checks label{cursor:pointer}.checks input{position:absolute;width:1px;height:1px;opacity:0}.checks span{display:block;padding:10px 12px;color:var(--muted);border:1px solid var(--line);font-weight:400}.checks input:checked+span{color:white;background:var(--purple)}.consent{display:flex!important;gap:9px;color:var(--muted);font-weight:400!important}.consent input{width:16px;height:16px;margin:2px 0}.submit{width:100%}.note{text-align:center;color:var(--muted);font-size:12px}.success{min-height:580px;padding:55px;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;background:#eee6fb;border:1px solid rgba(111,56,232,.25)}.success>i{display:grid;place-items:center;width:52px;height:52px;margin-bottom:28px;color:white;background:var(--purple);border-radius:50%;font-size:23px}.success h2{font:700 40px "Songti SC",serif}.success>p:not(.eyebrow){color:var(--muted);line-height:1.8}.success .link{padding:0;margin-top:18px}footer{color:#bbb;background:#111015}.footer-main{display:grid;grid-template-columns:1fr 1fr;gap:70px;padding-top:75px;padding-bottom:70px}.inverted{color:white}.footer-main>div p{max-width:350px;line-height:1.8}.footer-main nav{display:grid;grid-template-columns:1fr 1fr}.footer-main nav div{display:flex;flex-direction:column;gap:13px}.footer-main nav strong{color:white;margin-bottom:10px}.footer-main a:hover{color:var(--purple2)}.footer-bottom{display:flex;justify-content:space-between;padding:23px 0 27px;border-top:1px solid #333;font-size:12px}.hero-copy{animation:rise .7s ease both}.twin-card{animation:float 4s ease-in-out infinite}@keyframes rise{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:none}}@keyframes float{50%{transform:translateY(-7px)}} +@media(max-width:1040px){.shell{width:min(100% - 56px,960px)}.nav nav{gap:17px}.nav-cta{display:none}.hero-grid{grid-template-columns:1fr .8fr}.proof{grid-template-columns:repeat(3,1fr)}.proof>div:first-child{grid-column:1/-1;justify-content:center;border-bottom:1px solid var(--line)}.service-grid{grid-template-columns:1fr 1fr}.service-grid article:nth-child(3){border-left:0;border-top:1px solid var(--line)}.service-grid article:nth-child(4){border-top:1px solid var(--line)}.scenario-grid{grid-template-columns:1fr 1fr}.scenario:last-child{grid-column:1/-1;min-height:300px}.adv-grid{grid-template-columns:1fr 1fr}.adv-grid article:nth-child(3n){border-right:1px solid var(--line)}.adv-grid article:nth-child(2n){border-right:0}.process-list article{grid-template-columns:55px .6fr 1.2fr}.process-list strong{grid-column:2/-1;justify-self:start}.contact,.faq{gap:55px}} +@media(max-width:760px){.shell{width:calc(100% - 36px)}.nav{height:70px}.menu{display:block}.nav nav{position:absolute;top:70px;left:0;right:0;display:none;flex-direction:column;align-items:stretch;gap:0;padding:10px 18px 20px;background:var(--paper);border-bottom:1px solid var(--line)}.nav nav.open{display:flex}.nav nav a{padding:13px 8px!important}.nav-cta{display:block;text-align:center;margin-top:7px}.hero{min-height:auto;padding:48px 0 24px}.hero-grid{display:flex;flex-direction:column}.hero h1{font-size:clamp(44px,13vw,62px)}.lead{font-size:16px}.actions{flex-direction:column;align-items:flex-start;gap:22px;margin-top:28px}.hero-art{width:100%;min-height:430px}.portrait-card{inset:20px 42px 15px 8px}.twin-card{right:-5px}.proof{grid-template-columns:1fr}.proof>div{border-left:0;border-top:1px solid var(--line);min-height:82px}.proof>div:first-child{grid-column:auto;border-top:0}.proof>div:not(:first-child){flex-direction:row;justify-content:space-between}.proof strong{font-size:34px}.section{padding-top:85px;padding-bottom:85px}.split,.page-hero-grid,.cta,.principles,.case,.faq,.contact{grid-template-columns:1fr;gap:35px}.split{margin-bottom:45px}.split h2,.title-row h2,.cta h2{font-size:41px}.service-grid,.scenario-grid,.adv-grid,.flow{grid-template-columns:1fr}.service-grid article,.service-grid article:nth-child(3),.adv-grid article,.adv-grid article:nth-child(3n){border-left:0;border-right:0;border-top:1px solid var(--line)}.service-grid article:first-child{border-top:0}.flow article{min-height:150px}.scenario:last-child{grid-column:auto}.title-row{display:grid}.cta{width:calc(100% - 36px);padding:42px 25px;margin-bottom:85px}.compact>.btn{justify-self:start}.page-hero{padding:75px 0 68px}.page-hero h1{font-size:47px}.table{overflow:auto}.table>div{min-width:720px}.process-list article{grid-template-columns:45px 1fr;gap:15px;padding:32px 0}.process-list article p,.process-list article strong{grid-column:2}.principles>div:last-child article{grid-template-columns:40px 1fr}.principles article p{grid-column:2}.case-art{min-height:370px}.case-copy{padding:34px 24px}.case-copy h2{font-size:31px}.case-copy section{grid-template-columns:1fr;gap:10px}.faq aside{position:static}.faq summary{grid-template-columns:38px 1fr 22px;font-size:16px}.faq details>p{margin-left:50px}.contact aside{order:2}.form{padding:28px 20px}.form-row{grid-template-columns:1fr}.footer-main{grid-template-columns:1fr}.footer-bottom{flex-direction:column;gap:12px}.success{min-height:470px;padding:34px 24px}} +@media(prefers-reduced-motion:reduce){*{animation-duration:.01ms!important;transition-duration:.01ms!important;scroll-behavior:auto!important}} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..aa42058 --- /dev/null +++ b/app/layout.tsx @@ -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: "COZCREATOR|AI 创作者合作服务", + description: "为创作者与机构提供 AI 分身、内容增长、粉丝关系运营与商业化服务。", + other: { + "codex-preview": "development", + }, + icons: { + icon: "/favicon.svg", + shortcut: "/favicon.svg", + }, +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..ca4f211 --- /dev/null +++ b/app/page.tsx @@ -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
+
+
+
+

AI CREATOR PARTNERSHIP

+

让你的影响力,
拥有第二条增长曲线

+

为成熟创作者与机构打造专属 AI 分身,持续生产内容、经营粉丝关系,让每一次互动都沉淀为长期价值。

+
申请合作 查看合作案例
+
+
+
CREATOR
真实影响力表达 · 审美 · 信任
+
AI TWIN持续放大内容 · 关系 · 商业化
+
AI 分身已连接
+
+
+
一套完整的创作者增长系统
1:1专属合作方案
4核心增长模块
可扩展场景
+
+ +
+

OUR MODEL

不是替代创作者,
而是放大创作者。

你的形象、表达与粉丝信任是核心。AI 负责把这些珍贵资产延展到更多内容、更多互动和更多可持续收入中。

+
{services.map(([no,title,text])=>
{no}

{title}

{text}

)}
+
+ +

PARTNERSHIP VALUE

从“做更多内容”,
到“经营更多价值”。

了解合作优势
{[["01","内容被看见","扩大触达"],["02","互动被回应","建立关系"],["03","信任被沉淀","形成资产"],["04","影响力变现","持续增长"]].map((x,i)=>
{x[0]}{x[1]}{x[2]}
)}
+ +
+

USE CASES

适配不同阶段的合作方式

查看全部案例
+
{[ + ["个人创作者","把个人影响力变成可持续经营的品牌资产","AI 分身 · 多平台内容 · 粉丝私域","purple"], + ["关系型 IP","从内容关注走向更深、更长期的粉丝关系","评论运营 · 私聊体验 · 付费内容","coral"], + ["MCN / Agency","用一套系统承接多个创作者增长与变现","批量上架 · 标准流程 · 数据复盘","blue"], + ].map(([label,title,tags,color])=>
{label}

{title}

{tags}

)}
+
+ +

START A PARTNERSHIP

你带来影响力,
我们把它经营得更远。

告诉我们你的创作者类型、粉丝规模与当前目标,我们会据此设计第一版合作路径。

开始合作
+
; +} diff --git a/app/process/page.tsx b/app/process/page.tsx new file mode 100644 index 0000000..f8a2ff2 --- /dev/null +++ b/app/process/page.tsx @@ -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
从第一次沟通,
到一套长期增长系统。} description="我们从小范围验证开始,让每一步都可看、可控、可复盘。合作范围随真实结果逐步扩展。" extra={开始合作评估 }/>
{steps.map(x=>
{x[0]}

{x[1]}

{x[2]}

输出:{x[3]}
)}

OUR PRINCIPLES

合作过程中,
你始终拥有决定权。

{[["01","先验证,再扩大","用真实反馈决定投入。"],["02","先定边界,再创作","内容与互动在授权范围内运行。"],["03","长期价值优先","不透支粉丝信任。"]].map(x=>
{x[0]}{x[1]}

{x[2]}

)}

READY WHEN YOU ARE

告诉我们你现在最想解决的问题。

提交合作意向
} diff --git a/build/sites-vite-plugin.ts b/build/sites-vite-plugin.ts new file mode 100644 index 0000000..26563fd --- /dev/null +++ b/build/sites-vite-plugin.ts @@ -0,0 +1,45 @@ +import { access, cp, mkdir, rm } from "node:fs/promises"; +import { resolve } from "node:path"; +import type { Plugin } from "vite"; + +async function exists(path: string): Promise { + try { + await access(path); + return true; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return false; + } + throw error; + } +} + +// Packages Sites metadata and migrations after Vite finishes compiling. +export function sites(): Plugin { + let root = process.cwd(); + + return { + name: "sites", + apply: "build", + configResolved(config) { + root = config.root; + }, + async closeBundle() { + const outputDirectory = resolve(root, "dist", ".openai"); + const hostingConfig = resolve(root, ".openai", "hosting.json"); + const drizzleSource = resolve(root, "drizzle"); + + await rm(outputDirectory, { recursive: true, force: true }); + await mkdir(outputDirectory, { recursive: true }); + + if (await exists(hostingConfig)) { + await cp(hostingConfig, resolve(outputDirectory, "hosting.json")); + } + if (await exists(drizzleSource)) { + await cp(drizzleSource, resolve(outputDirectory, "drizzle"), { + recursive: true, + }); + } + }, + }; +} diff --git a/components/ContactForm.tsx b/components/ContactForm.tsx new file mode 100644 index 0000000..fdec9e0 --- /dev/null +++ b/components/ContactForm.tsx @@ -0,0 +1,3 @@ +"use client";import { FormEvent,useState } from "react"; +const interests=["AI 分身","内容增长","评论与私聊运营","粉丝变现","MCN / Agency 合作"]; +export function ContactForm(){const [sent,setSent]=useState(false);function submit(e:FormEvent){e.preventDefault();setSent(true)}if(sent)return

INQUIRY SAVED

合作意向已记录。

这是网站原型的交互演示。正式上线时,可将表单接入邮箱、CRM 或企业协作工具。

;return
感兴趣的合作方向
{interests.map(x=>)}